15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "gpu/config/gpu_info.h"
790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "gpu/config/gpu_info_collector.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gl/gl_mock.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::gfx::MockGLInterface;
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Return;
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)namespace gpu {
1690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GPUInfoCollectorTest : public testing::Test {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GPUInfoCollectorTest() {}
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~GPUInfoCollectorTest() { }
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUp() {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gl_.reset(new ::testing::StrictMock< ::gfx::MockGLInterface>());
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ::gfx::MockGLInterface::SetGLInterface(gl_.get());
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const uint32 vendor_id = 0x10de;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const uint32 device_id = 0x0658;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* driver_vendor = "";  // not implemented
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* driver_version = "";
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* shader_version = "1.40";
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* gl_renderer = "Quadro FX 380/PCI/SSE2";
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* gl_vendor = "NVIDIA Corporation";
33010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    const char* gl_version = "3.1.0";
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* gl_shading_language_version = "1.40 NVIDIA via Cg compiler";
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* gl_extensions =
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "GL_OES_packed_depth_stencil GL_EXT_texture_format_BGRA8888 "
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "GL_EXT_read_format_bgra";
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_MACOSX)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const uint32 vendor_id = 0x10de;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const uint32 device_id = 0x0640;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* driver_vendor = "";  // not implemented
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* driver_version = "1.6.18";
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* shader_version = "1.20";
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* gl_renderer = "NVIDIA GeForce GT 120 OpenGL Engine";
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* gl_vendor = "NVIDIA Corporation";
46010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    const char* gl_version = "2.1 NVIDIA-1.6.18";
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* gl_shading_language_version = "1.20 ";
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* gl_extensions =
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "GL_OES_packed_depth_stencil GL_EXT_texture_format_BGRA8888 "
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "GL_EXT_read_format_bgra";
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else  // defined (OS_LINUX)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const uint32 vendor_id = 0x10de;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const uint32 device_id = 0x0658;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* driver_vendor = "NVIDIA";
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* driver_version = "195.36.24";
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* shader_version = "1.50";
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* gl_renderer = "Quadro FX 380/PCI/SSE2";
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* gl_vendor = "NVIDIA Corporation";
59010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    const char* gl_version = "3.2.0 NVIDIA 195.36.24";
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* gl_shading_language_version = "1.50 NVIDIA via Cg compiler";
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* gl_extensions =
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "GL_OES_packed_depth_stencil GL_EXT_texture_format_BGRA8888 "
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "GL_EXT_read_format_bgra";
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_values_.gpu.vendor_id = vendor_id;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_values_.gpu.device_id = device_id;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_values_.driver_vendor = driver_vendor;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_values_.driver_version =driver_version;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_values_.pixel_shader_version = shader_version;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_values_.vertex_shader_version = shader_version;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_values_.gl_renderer = gl_renderer;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_values_.gl_vendor = gl_vendor;
73010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    test_values_.gl_version = gl_version;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_values_.gl_extensions = gl_extensions;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    test_values_.can_lose_context = false;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, GetString(GL_EXTENSIONS))
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .WillRepeatedly(Return(reinterpret_cast<const GLubyte*>(
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            gl_extensions)));
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, GetString(GL_SHADING_LANGUAGE_VERSION))
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .WillRepeatedly(Return(reinterpret_cast<const GLubyte*>(
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            gl_shading_language_version)));
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, GetString(GL_VERSION))
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .WillRepeatedly(Return(reinterpret_cast<const GLubyte*>(
85010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            gl_version)));
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, GetString(GL_VENDOR))
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .WillRepeatedly(Return(reinterpret_cast<const GLubyte*>(
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            gl_vendor)));
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_CALL(*gl_, GetString(GL_RENDERER))
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        .WillRepeatedly(Return(reinterpret_cast<const GLubyte*>(
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            gl_renderer)));
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void TearDown() {
955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ::gfx::MockGLInterface::SetGLInterface(NULL);
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gl_.reset();
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Use StrictMock to make 100% sure we know how GL will be called.
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr< ::testing::StrictMock< ::gfx::MockGLInterface> > gl_;
10290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  GPUInfo test_values_;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(rlp): Test the vendor and device id collection if deemed necessary as
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//            it involves several complicated mocks for each platform.
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(kbr): re-enable these tests; see http://crbug.com/100285 .
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GPUInfoCollectorTest, DISABLED_DriverVendorGL) {
11190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  GPUInfo gpu_info;
11290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  CollectGraphicsInfoGL(&gpu_info);
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(test_values_.driver_vendor,
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            gpu_info.driver_vendor);
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Skip Windows because the driver version is obtained from bot registry.
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_WIN)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GPUInfoCollectorTest, DISABLED_DriverVersionGL) {
12090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  GPUInfo gpu_info;
12190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  CollectGraphicsInfoGL(&gpu_info);
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(test_values_.driver_version,
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            gpu_info.driver_version);
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GPUInfoCollectorTest, DISABLED_PixelShaderVersionGL) {
12890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  GPUInfo gpu_info;
12990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  CollectGraphicsInfoGL(&gpu_info);
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(test_values_.pixel_shader_version,
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            gpu_info.pixel_shader_version);
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GPUInfoCollectorTest, DISABLED_VertexShaderVersionGL) {
13590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  GPUInfo gpu_info;
13690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  CollectGraphicsInfoGL(&gpu_info);
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(test_values_.vertex_shader_version,
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            gpu_info.vertex_shader_version);
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GPUInfoCollectorTest, DISABLED_GLVersionGL) {
14290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  GPUInfo gpu_info;
14390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  CollectGraphicsInfoGL(&gpu_info);
144010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(test_values_.gl_version, gpu_info.gl_version);
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GPUInfoCollectorTest, DISABLED_GLRendererGL) {
14890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  GPUInfo gpu_info;
14990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  CollectGraphicsInfoGL(&gpu_info);
150010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(test_values_.gl_renderer, gpu_info.gl_renderer);
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GPUInfoCollectorTest, DISABLED_GLVendorGL) {
15490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  GPUInfo gpu_info;
15590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  CollectGraphicsInfoGL(&gpu_info);
156010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(test_values_.gl_vendor, gpu_info.gl_vendor);
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GPUInfoCollectorTest, DISABLED_GLExtensionsGL) {
16090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  GPUInfo gpu_info;
16190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  CollectGraphicsInfoGL(&gpu_info);
162010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(test_values_.gl_extensions, gpu_info.gl_extensions);
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
16590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}  // namespace gpu
16690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
167