// Copyright (c) 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "content/common/gpu/gpu_channel.h" #include "content/common/gpu/gpu_channel_manager.h" #include "content/common/gpu/gpu_channel_test_common.h" #include "content/common/gpu/gpu_messages.h" #include "gpu/command_buffer/common/value_state.h" #include "gpu/command_buffer/service/gl_utils.h" #include "gpu/command_buffer/service/valuebuffer_manager.h" #include "ipc/ipc_test_sink.h" using gpu::gles2::ValuebufferManager; using gpu::ValueState; namespace content { class GpuChannelManagerTest : public GpuChannelTestCommon { public: GpuChannelManagerTest() : GpuChannelTestCommon() {} ~GpuChannelManagerTest() override {} }; TEST_F(GpuChannelManagerTest, EstablishChannel) { const int kClientId = 1; const uint64 kClientTracingId = 1; ASSERT_TRUE(channel_manager()); EXPECT_TRUE(channel_manager()->OnMessageReceived( GpuMsg_EstablishChannel(kClientId, kClientTracingId, false, false))); EXPECT_EQ((size_t)1, sink()->message_count()); const IPC::Message* msg = sink()->GetUniqueMessageMatching(GpuHostMsg_ChannelEstablished::ID); ASSERT_TRUE(msg); base::Tuple handle; ASSERT_TRUE(GpuHostMsg_ChannelEstablished::Read(msg, &handle)); EXPECT_NE("", base::get<0>(handle).name); sink()->ClearMessages(); GpuChannel* channel = channel_manager()->LookupChannel(kClientId); ASSERT_TRUE(channel); EXPECT_EQ(base::get<0>(handle).name, channel->channel_id()); } TEST_F(GpuChannelManagerTest, SecureValueStateForwarding) { const int kClientId1 = 111; const uint64 kClientTracingId1 = 11111; const int kClientId2 = 222; const uint64 kClientTracingId2 = 22222; ValueState value_state1; value_state1.int_value[0] = 1111; value_state1.int_value[1] = 0; value_state1.int_value[2] = 0; value_state1.int_value[3] = 0; ValueState value_state2; value_state2.int_value[0] = 3333; value_state2.int_value[1] = 0; value_state2.int_value[2] = 0; value_state2.int_value[3] = 0; ASSERT_TRUE(channel_manager()); // Initialize gpu channels EXPECT_TRUE(channel_manager()->OnMessageReceived( GpuMsg_EstablishChannel(kClientId1, kClientTracingId1, false, false))); GpuChannel* channel1 = channel_manager()->LookupChannel(kClientId1); ASSERT_TRUE(channel1); EXPECT_TRUE(channel_manager()->OnMessageReceived( GpuMsg_EstablishChannel(kClientId2, kClientTracingId2, false, false))); GpuChannel* channel2 = channel_manager()->LookupChannel(kClientId2); ASSERT_TRUE(channel2); EXPECT_NE(channel1, channel2); // Make sure value states are only accessible by proper channels channel_manager()->OnMessageReceived(GpuMsg_UpdateValueState( kClientId1, GL_MOUSE_POSITION_CHROMIUM, value_state1)); channel_manager()->OnMessageReceived(GpuMsg_UpdateValueState( kClientId2, GL_MOUSE_POSITION_CHROMIUM, value_state2)); const gpu::ValueStateMap* pending_value_buffer_state1 = channel1->pending_valuebuffer_state(); const gpu::ValueStateMap* pending_value_buffer_state2 = channel2->pending_valuebuffer_state(); EXPECT_NE(pending_value_buffer_state1, pending_value_buffer_state2); const ValueState* state1 = pending_value_buffer_state1->GetState(GL_MOUSE_POSITION_CHROMIUM); const ValueState* state2 = pending_value_buffer_state2->GetState(GL_MOUSE_POSITION_CHROMIUM); EXPECT_NE(state1, state2); EXPECT_EQ(state1->int_value[0], value_state1.int_value[0]); EXPECT_EQ(state2->int_value[0], value_state2.int_value[0]); EXPECT_NE(state1->int_value[0], state2->int_value[0]); } } // namespace content