1a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)// Copyright (c) 2013 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)
5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/command_line.h"
69ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/run_loop.h"
8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
9a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "content/browser/gpu/gpu_data_manager_impl_private.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/gpu_data_manager_observer.h"
11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "gpu/command_buffer/service/gpu_switches.h"
120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "gpu/config/gpu_feature_type.h"
130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "gpu/config/gpu_info.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(OS_WIN)
181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/win/windows_version.h"
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define LONG_STRING_CONST(...) #__VA_ARGS__
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestObserver : public GpuDataManagerObserver {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestObserver()
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : gpu_info_updated_(false),
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        video_memory_usage_stats_updated_(false) {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~TestObserver() { }
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool gpu_info_updated() const { return gpu_info_updated_; }
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool video_memory_usage_stats_updated() const {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return video_memory_usage_stats_updated_;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnGpuInfoUpdate() OVERRIDE {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gpu_info_updated_ = true;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnVideoMemoryUsageStatsUpdate(
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const GPUVideoMemoryUsageStats& stats) OVERRIDE {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    video_memory_usage_stats_updated_ = true;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  void Reset() {
490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    gpu_info_updated_ = false;
500529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    video_memory_usage_stats_updated_ = false;
510529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
520529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool gpu_info_updated_;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool video_memory_usage_stats_updated_;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static base::Time GetTimeForTesting() {
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return base::Time::FromDoubleT(1000);
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static GURL GetDomain1ForTesting() {
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return GURL("http://foo.com/");
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static GURL GetDomain2ForTesting() {
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return GURL("http://bar.com/");
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace anonymous
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
72a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)class GpuDataManagerImplPrivateTest : public testing::Test {
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
74a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  GpuDataManagerImplPrivateTest() { }
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
76a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  virtual ~GpuDataManagerImplPrivateTest() { }
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // scoped_ptr doesn't work with GpuDataManagerImpl because its
80a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // destructor is private. GpuDataManagerImplPrivateTest is however a friend
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // so we can make a little helper class here.
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  class ScopedGpuDataManagerImpl {
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   public:
84a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    ScopedGpuDataManagerImpl() : impl_(new GpuDataManagerImpl()) {
85a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      EXPECT_TRUE(impl_);
86a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      EXPECT_TRUE(impl_->private_.get());
87a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    }
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ~ScopedGpuDataManagerImpl() { delete impl_; }
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GpuDataManagerImpl* get() const { return impl_; }
91a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GpuDataManagerImpl* operator->() const { return impl_; }
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   private:
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GpuDataManagerImpl* impl_;
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DISALLOW_COPY_AND_ASSIGN(ScopedGpuDataManagerImpl);
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
99a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // We want to test the code path where GpuDataManagerImplPrivate is created
100a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // in the GpuDataManagerImpl constructor.
101a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  class ScopedGpuDataManagerImplPrivate {
102a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)   public:
103a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    ScopedGpuDataManagerImplPrivate() : impl_(new GpuDataManagerImpl()) {
104a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      EXPECT_TRUE(impl_);
105a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      EXPECT_TRUE(impl_->private_.get());
106a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    }
107a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    ~ScopedGpuDataManagerImplPrivate() { delete impl_; }
108a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
109a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    GpuDataManagerImplPrivate* get() const {
110a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      return impl_->private_.get();
111a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    }
112a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
113a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    GpuDataManagerImplPrivate* operator->() const {
114a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      return impl_->private_.get();
115a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    }
116a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
117a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)   private:
118a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    GpuDataManagerImpl* impl_;
119a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    DISALLOW_COPY_AND_ASSIGN(ScopedGpuDataManagerImplPrivate);
120a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  };
121a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUp() {
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void TearDown() {
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
128a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  base::Time JustBeforeExpiration(const GpuDataManagerImplPrivate* manager);
129a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  base::Time JustAfterExpiration(const GpuDataManagerImplPrivate* manager);
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void TestBlockingDomainFrom3DAPIs(
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GpuDataManagerImpl::DomainGuilt guilt_level);
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void TestUnblockingDomainFrom3DAPIs(
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GpuDataManagerImpl::DomainGuilt guilt_level);
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::MessageLoop message_loop_;
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We use new method instead of GetInstance() method because we want
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// each test to be independent of each other.
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
141a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(GpuDataManagerImplPrivateTest, GpuSideBlacklisting) {
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If a feature is allowed in preliminary step (browser side), but
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // disabled when GPU process launches and collects full GPU info,
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // it's too late to let renderer know, so we basically block all GPU
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // access, to be on the safe side.
146a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  ScopedGpuDataManagerImplPrivate manager;
147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0u, manager->GetBlacklistedFeatureCount());
148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::string reason;
149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(manager->GpuAccessAllowed(&reason));
150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(reason.empty());
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const std::string blacklist_json = LONG_STRING_CONST(
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      {
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "name": "gpu blacklist",
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "version": "0.1",
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "entries": [
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          {
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            "id": 1,
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            "features": [
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              "webgl"
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            ]
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          },
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          {
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            "id": 2,
1656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)            "gl_renderer": ".*GeForce.*",
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            "features": [
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              "accelerated_2d_canvas"
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            ]
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          }
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ]
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  );
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1740529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  gpu::GPUInfo gpu_info;
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gpu_info.gpu.vendor_id = 0x10de;
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gpu_info.gpu.device_id = 0x0640;
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager->InitializeForTesting(blacklist_json, gpu_info);
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(manager->GpuAccessAllowed(&reason));
180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(reason.empty());
181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(1u, manager->GetBlacklistedFeatureCount());
1820529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_TRUE(manager->IsFeatureBlacklisted(gpu::GPU_FEATURE_TYPE_WEBGL));
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gpu_info.gl_vendor = "NVIDIA";
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gpu_info.gl_renderer = "NVIDIA GeForce GT 120";
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager->UpdateGpuInfo(gpu_info);
187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_FALSE(manager->GpuAccessAllowed(&reason));
188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_FALSE(reason.empty());
189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(2u, manager->GetBlacklistedFeatureCount());
1900529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_TRUE(manager->IsFeatureBlacklisted(gpu::GPU_FEATURE_TYPE_WEBGL));
191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(manager->IsFeatureBlacklisted(
1920529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      gpu::GPU_FEATURE_TYPE_ACCELERATED_2D_CANVAS));
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(GpuDataManagerImplPrivateTest, GpuSideExceptions) {
196a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  ScopedGpuDataManagerImplPrivate manager;
197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0u, manager->GetBlacklistedFeatureCount());
198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(manager->GpuAccessAllowed(NULL));
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const std::string blacklist_json = LONG_STRING_CONST(
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      {
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "name": "gpu blacklist",
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "version": "0.1",
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "entries": [
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          {
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            "id": 1,
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            "exceptions": [
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              {
2096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                "gl_renderer": ".*GeForce.*"
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              }
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            ],
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            "features": [
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              "webgl"
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            ]
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          }
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ]
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  );
2190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  gpu::GPUInfo gpu_info;
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gpu_info.gpu.vendor_id = 0x10de;
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gpu_info.gpu.device_id = 0x0640;
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager->InitializeForTesting(blacklist_json, gpu_info);
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(manager->GpuAccessAllowed(NULL));
225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0u, manager->GetBlacklistedFeatureCount());
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Now assume gpu process launches and full GPU info is collected.
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gpu_info.gl_renderer = "NVIDIA GeForce GT 120";
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager->UpdateGpuInfo(gpu_info);
230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(manager->GpuAccessAllowed(NULL));
231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0u, manager->GetBlacklistedFeatureCount());
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
234a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(GpuDataManagerImplPrivateTest, DisableHardwareAcceleration) {
235a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  ScopedGpuDataManagerImplPrivate manager;
236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0u, manager->GetBlacklistedFeatureCount());
237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::string reason;
238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(manager->GpuAccessAllowed(&reason));
239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(reason.empty());
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager->DisableHardwareAcceleration();
242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_FALSE(manager->GpuAccessAllowed(&reason));
243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_FALSE(reason.empty());
2440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_EQ(static_cast<size_t>(gpu::NUMBER_OF_GPU_FEATURE_TYPES),
245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            manager->GetBlacklistedFeatureCount());
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
248a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(GpuDataManagerImplPrivateTest, SwiftShaderRendering) {
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Blacklist, then register SwiftShader.
250a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  ScopedGpuDataManagerImplPrivate manager;
251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0u, manager->GetBlacklistedFeatureCount());
252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(manager->GpuAccessAllowed(NULL));
253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_FALSE(manager->ShouldUseSwiftShader());
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager->DisableHardwareAcceleration();
256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_FALSE(manager->GpuAccessAllowed(NULL));
257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_FALSE(manager->ShouldUseSwiftShader());
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // If SwiftShader is enabled, even if we blacklist GPU,
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // GPU process is still allowed.
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const base::FilePath test_path(FILE_PATH_LITERAL("AnyPath"));
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager->RegisterSwiftShaderPath(test_path);
263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(manager->ShouldUseSwiftShader());
264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(manager->GpuAccessAllowed(NULL));
265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(1u, manager->GetBlacklistedFeatureCount());
2660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_TRUE(manager->IsFeatureBlacklisted(
2670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      gpu::GPU_FEATURE_TYPE_ACCELERATED_2D_CANVAS));
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
270a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(GpuDataManagerImplPrivateTest, SwiftShaderRendering2) {
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Register SwiftShader, then blacklist.
272a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  ScopedGpuDataManagerImplPrivate manager;
273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0u, manager->GetBlacklistedFeatureCount());
274c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(manager->GpuAccessAllowed(NULL));
275c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_FALSE(manager->ShouldUseSwiftShader());
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const base::FilePath test_path(FILE_PATH_LITERAL("AnyPath"));
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager->RegisterSwiftShaderPath(test_path);
279c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0u, manager->GetBlacklistedFeatureCount());
280c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(manager->GpuAccessAllowed(NULL));
281c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_FALSE(manager->ShouldUseSwiftShader());
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager->DisableHardwareAcceleration();
284c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(manager->GpuAccessAllowed(NULL));
285c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(manager->ShouldUseSwiftShader());
286c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(1u, manager->GetBlacklistedFeatureCount());
2870529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_TRUE(manager->IsFeatureBlacklisted(
2880529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      gpu::GPU_FEATURE_TYPE_ACCELERATED_2D_CANVAS));
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(GpuDataManagerImplPrivateTest, WarpEnabledOverridesSwiftShader) {
2921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // If WARP fallback is enabled on Windows 8 it should not allow SwiftShader
2931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // to be enabled.
2941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(OS_WIN)
2951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (base::win::GetVersion() >= base::win::VERSION_WIN8) {
2961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ScopedGpuDataManagerImplPrivate manager;
2971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    manager->ForceWarpModeForTesting();
2981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const base::FilePath test_path(FILE_PATH_LITERAL("AnyPath"));
2991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    manager->RegisterSwiftShaderPath(test_path);
3001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    manager->DisableHardwareAcceleration();
3011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXPECT_TRUE(manager->ShouldUseWarp());
3021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXPECT_FALSE(manager->ShouldUseSwiftShader());
3031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
3041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
3051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
3061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
307a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(GpuDataManagerImplPrivateTest, GpuInfoUpdate) {
3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedGpuDataManagerImpl manager;
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestObserver observer;
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager->AddObserver(&observer);
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::RunLoop run_loop;
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    run_loop.RunUntilIdle();
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(observer.gpu_info_updated());
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  gpu::GPUInfo gpu_info;
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager->UpdateGpuInfo(gpu_info);
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::RunLoop run_loop;
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    run_loop.RunUntilIdle();
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(observer.gpu_info_updated());
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
328a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(GpuDataManagerImplPrivateTest, NoGpuInfoUpdateWithSwiftShader) {
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedGpuDataManagerImpl manager;
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager->DisableHardwareAcceleration();
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const base::FilePath test_path(FILE_PATH_LITERAL("AnyPath"));
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager->RegisterSwiftShaderPath(test_path);
334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(manager->ShouldUseSwiftShader());
335c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(manager->GpuAccessAllowed(NULL));
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::RunLoop run_loop;
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    run_loop.RunUntilIdle();
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestObserver observer;
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager->AddObserver(&observer);
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::RunLoop run_loop;
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    run_loop.RunUntilIdle();
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(observer.gpu_info_updated());
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3500529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  gpu::GPUInfo gpu_info;
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager->UpdateGpuInfo(gpu_info);
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::RunLoop run_loop;
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    run_loop.RunUntilIdle();
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(observer.gpu_info_updated());
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
359a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(GpuDataManagerImplPrivateTest, GPUVideoMemoryUsageStatsUpdate) {
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScopedGpuDataManagerImpl manager;
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestObserver observer;
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager->AddObserver(&observer);
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::RunLoop run_loop;
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    run_loop.RunUntilIdle();
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(observer.video_memory_usage_stats_updated());
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GPUVideoMemoryUsageStats vram_stats;
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager->UpdateVideoMemoryUsageStats(vram_stats);
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::RunLoop run_loop;
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    run_loop.RunUntilIdle();
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(observer.video_memory_usage_stats_updated());
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
380a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)base::Time GpuDataManagerImplPrivateTest::JustBeforeExpiration(
381a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    const GpuDataManagerImplPrivate* manager) {
3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return GetTimeForTesting() + base::TimeDelta::FromMilliseconds(
3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      manager->GetBlockAllDomainsDurationInMs()) -
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::TimeDelta::FromMilliseconds(3);
3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
387a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)base::Time GpuDataManagerImplPrivateTest::JustAfterExpiration(
388a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    const GpuDataManagerImplPrivate* manager) {
3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return GetTimeForTesting() + base::TimeDelta::FromMilliseconds(
3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      manager->GetBlockAllDomainsDurationInMs()) +
3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::TimeDelta::FromMilliseconds(3);
3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
394a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)void GpuDataManagerImplPrivateTest::TestBlockingDomainFrom3DAPIs(
3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GpuDataManagerImpl::DomainGuilt guilt_level) {
396a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  ScopedGpuDataManagerImplPrivate manager;
3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager->BlockDomainFrom3DAPIsAtTime(GetDomain1ForTesting(),
399a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)                                      guilt_level,
400a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)                                      GetTimeForTesting());
4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // This domain should be blocked no matter what.
4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(GpuDataManagerImpl::DOMAIN_BLOCK_STATUS_BLOCKED,
4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            manager->Are3DAPIsBlockedAtTime(GetDomain1ForTesting(),
405a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)                                           GetTimeForTesting()));
4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(GpuDataManagerImpl::DOMAIN_BLOCK_STATUS_BLOCKED,
407a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)            manager->Are3DAPIsBlockedAtTime(
408a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)                GetDomain1ForTesting(), JustBeforeExpiration(manager.get())));
4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(GpuDataManagerImpl::DOMAIN_BLOCK_STATUS_BLOCKED,
410a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)            manager->Are3DAPIsBlockedAtTime(
411a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)                GetDomain1ForTesting(), JustAfterExpiration(manager.get())));
4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
414a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)void GpuDataManagerImplPrivateTest::TestUnblockingDomainFrom3DAPIs(
4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GpuDataManagerImpl::DomainGuilt guilt_level) {
416a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  ScopedGpuDataManagerImplPrivate manager;
4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager->BlockDomainFrom3DAPIsAtTime(GetDomain1ForTesting(),
4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                       guilt_level,
4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                       GetTimeForTesting());
4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Unblocking the domain should work.
4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager->UnblockDomainFrom3DAPIs(GetDomain1ForTesting());
4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(GpuDataManagerImpl::DOMAIN_BLOCK_STATUS_NOT_BLOCKED,
4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            manager->Are3DAPIsBlockedAtTime(GetDomain1ForTesting(),
4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                            GetTimeForTesting()));
4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(GpuDataManagerImpl::DOMAIN_BLOCK_STATUS_NOT_BLOCKED,
428a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)            manager->Are3DAPIsBlockedAtTime(
429a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)                GetDomain1ForTesting(), JustBeforeExpiration(manager.get())));
4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(GpuDataManagerImpl::DOMAIN_BLOCK_STATUS_NOT_BLOCKED,
431a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)            manager->Are3DAPIsBlockedAtTime(
432a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)                GetDomain1ForTesting(), JustAfterExpiration(manager.get())));
4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
435a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(GpuDataManagerImplPrivateTest, BlockGuiltyDomainFrom3DAPIs) {
4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestBlockingDomainFrom3DAPIs(GpuDataManagerImpl::DOMAIN_GUILT_KNOWN);
4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
439a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(GpuDataManagerImplPrivateTest, BlockDomainOfUnknownGuiltFrom3DAPIs) {
4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestBlockingDomainFrom3DAPIs(GpuDataManagerImpl::DOMAIN_GUILT_UNKNOWN);
4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
443a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(GpuDataManagerImplPrivateTest, BlockAllDomainsFrom3DAPIs) {
444a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  ScopedGpuDataManagerImplPrivate manager;
4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager->BlockDomainFrom3DAPIsAtTime(GetDomain1ForTesting(),
4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                       GpuDataManagerImpl::DOMAIN_GUILT_UNKNOWN,
4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                       GetTimeForTesting());
4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Blocking of other domains should expire.
4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(GpuDataManagerImpl::DOMAIN_BLOCK_STATUS_ALL_DOMAINS_BLOCKED,
452a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)            manager->Are3DAPIsBlockedAtTime(
453a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)                GetDomain2ForTesting(), JustBeforeExpiration(manager.get())));
4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(GpuDataManagerImpl::DOMAIN_BLOCK_STATUS_NOT_BLOCKED,
455a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)            manager->Are3DAPIsBlockedAtTime(
456a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)                GetDomain2ForTesting(), JustAfterExpiration(manager.get())));
4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
459a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(GpuDataManagerImplPrivateTest, UnblockGuiltyDomainFrom3DAPIs) {
4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestUnblockingDomainFrom3DAPIs(GpuDataManagerImpl::DOMAIN_GUILT_KNOWN);
4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
463a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(GpuDataManagerImplPrivateTest, UnblockDomainOfUnknownGuiltFrom3DAPIs) {
4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestUnblockingDomainFrom3DAPIs(GpuDataManagerImpl::DOMAIN_GUILT_UNKNOWN);
4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
467a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(GpuDataManagerImplPrivateTest, UnblockOtherDomainFrom3DAPIs) {
468a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  ScopedGpuDataManagerImplPrivate manager;
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager->BlockDomainFrom3DAPIsAtTime(GetDomain1ForTesting(),
4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                       GpuDataManagerImpl::DOMAIN_GUILT_UNKNOWN,
4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                       GetTimeForTesting());
4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager->UnblockDomainFrom3DAPIs(GetDomain2ForTesting());
4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(GpuDataManagerImpl::DOMAIN_BLOCK_STATUS_NOT_BLOCKED,
477a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)            manager->Are3DAPIsBlockedAtTime(
478a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)                GetDomain2ForTesting(), JustBeforeExpiration(manager.get())));
4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The original domain should still be blocked.
4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(GpuDataManagerImpl::DOMAIN_BLOCK_STATUS_BLOCKED,
482a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)            manager->Are3DAPIsBlockedAtTime(
483a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)                GetDomain1ForTesting(), JustBeforeExpiration(manager.get())));
4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
486a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(GpuDataManagerImplPrivateTest, UnblockThisDomainFrom3DAPIs) {
487a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  ScopedGpuDataManagerImplPrivate manager;
4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager->BlockDomainFrom3DAPIsAtTime(GetDomain1ForTesting(),
4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                       GpuDataManagerImpl::DOMAIN_GUILT_UNKNOWN,
4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                       GetTimeForTesting());
4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager->UnblockDomainFrom3DAPIs(GetDomain1ForTesting());
4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // This behavior is debatable. Perhaps the GPU reset caused by
4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // domain 1 should still cause other domains to be blocked.
4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(GpuDataManagerImpl::DOMAIN_BLOCK_STATUS_NOT_BLOCKED,
498a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)            manager->Are3DAPIsBlockedAtTime(
499a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)                GetDomain2ForTesting(), JustBeforeExpiration(manager.get())));
5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_LINUX)
503a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(GpuDataManagerImplPrivateTest, SetGLStrings) {
5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const char* kGLVendorMesa = "Tungsten Graphics, Inc";
5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const char* kGLRendererMesa = "Mesa DRI Intel(R) G41";
5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const char* kGLVersionMesa801 = "2.1 Mesa 8.0.1-DEVEL";
5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
508a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  ScopedGpuDataManagerImplPrivate manager;
509c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0u, manager->GetBlacklistedFeatureCount());
510c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(manager->GpuAccessAllowed(NULL));
5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const std::string blacklist_json = LONG_STRING_CONST(
5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      {
5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "name": "gpu blacklist",
5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "version": "0.1",
5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "entries": [
5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          {
5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            "id": 1,
5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            "vendor_id": "0x8086",
5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            "exceptions": [
5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              {
5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                "device_id": ["0x0042"],
5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                "driver_version": {
5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  "op": ">=",
5250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                  "value": "8.0.2"
5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                }
5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              }
5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            ],
5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            "features": [
5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              "webgl"
5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            ]
5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          }
5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ]
5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  );
5360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  gpu::GPUInfo gpu_info;
5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gpu_info.gpu.vendor_id = 0x8086;
5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gpu_info.gpu.device_id = 0x0042;
5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager->InitializeForTesting(blacklist_json, gpu_info);
5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Not enough GPUInfo.
542c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(manager->GpuAccessAllowed(NULL));
543c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0u, manager->GetBlacklistedFeatureCount());
5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Now assume browser gets GL strings from local state.
5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The entry applies, blacklist more features than from the preliminary step.
5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // However, GPU process is not blocked because this is all browser side and
5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // happens before renderer launching.
5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager->SetGLStrings(kGLVendorMesa, kGLRendererMesa, kGLVersionMesa801);
550c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(manager->GpuAccessAllowed(NULL));
551c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(1u, manager->GetBlacklistedFeatureCount());
5520529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_TRUE(manager->IsFeatureBlacklisted(gpu::GPU_FEATURE_TYPE_WEBGL));
5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
555a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(GpuDataManagerImplPrivateTest, SetGLStringsNoEffects) {
5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const char* kGLVendorMesa = "Tungsten Graphics, Inc";
5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const char* kGLRendererMesa = "Mesa DRI Intel(R) G41";
5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const char* kGLVersionMesa801 = "2.1 Mesa 8.0.1-DEVEL";
5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const char* kGLVersionMesa802 = "2.1 Mesa 8.0.2-DEVEL";
5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
561a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  ScopedGpuDataManagerImplPrivate manager;
562c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0u, manager->GetBlacklistedFeatureCount());
563c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(manager->GpuAccessAllowed(NULL));
5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const std::string blacklist_json = LONG_STRING_CONST(
5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      {
5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "name": "gpu blacklist",
5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "version": "0.1",
5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "entries": [
5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          {
5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            "id": 1,
5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            "vendor_id": "0x8086",
5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            "exceptions": [
5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              {
5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                "device_id": ["0x0042"],
5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                "driver_version": {
5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  "op": ">=",
5780529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                  "value": "8.0.2"
5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                }
5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              }
5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            ],
5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            "features": [
5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              "webgl"
5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            ]
5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          }
5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ]
5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  );
5890529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  gpu::GPUInfo gpu_info;
5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gpu_info.gpu.vendor_id = 0x8086;
5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gpu_info.gpu.device_id = 0x0042;
5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gpu_info.gl_vendor = kGLVendorMesa;
5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gpu_info.gl_renderer = kGLRendererMesa;
5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gpu_info.gl_version = kGLVersionMesa801;
5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gpu_info.driver_vendor = "Mesa";
5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gpu_info.driver_version = "8.0.1";
5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager->InitializeForTesting(blacklist_json, gpu_info);
5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Full GPUInfo, the entry applies.
600c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(manager->GpuAccessAllowed(NULL));
601c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(1u, manager->GetBlacklistedFeatureCount());
6020529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_TRUE(manager->IsFeatureBlacklisted(gpu::GPU_FEATURE_TYPE_WEBGL));
6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Now assume browser gets GL strings from local state.
6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // SetGLStrings() has no effects because GPUInfo already got these strings.
6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // (Otherwise the entry should not apply.)
6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager->SetGLStrings(kGLVendorMesa, kGLRendererMesa, kGLVersionMesa802);
608c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(manager->GpuAccessAllowed(NULL));
609c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(1u, manager->GetBlacklistedFeatureCount());
6100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_TRUE(manager->IsFeatureBlacklisted(gpu::GPU_FEATURE_TYPE_WEBGL));
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // OS_LINUX
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
614a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(GpuDataManagerImplPrivateTest, GpuDriverBugListSingle) {
615a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  ScopedGpuDataManagerImplPrivate manager;
616c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  manager->gpu_driver_bugs_.insert(5);
617c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
6186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  base::CommandLine command_line(0, NULL);
619c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  manager->AppendGpuCommandLine(&command_line);
620c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
621c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(command_line.HasSwitch(switches::kGpuDriverBugWorkarounds));
622c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::string args = command_line.GetSwitchValueASCII(
623c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      switches::kGpuDriverBugWorkarounds);
624c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_STREQ("5", args.c_str());
625c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
626c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
627a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(GpuDataManagerImplPrivateTest, GpuDriverBugListMultiple) {
628a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  ScopedGpuDataManagerImplPrivate manager;
629c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  manager->gpu_driver_bugs_.insert(5);
630c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  manager->gpu_driver_bugs_.insert(7);
631c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
6326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  base::CommandLine command_line(0, NULL);
633c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  manager->AppendGpuCommandLine(&command_line);
634c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
635c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(command_line.HasSwitch(switches::kGpuDriverBugWorkarounds));
636c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::string args = command_line.GetSwitchValueASCII(
637c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      switches::kGpuDriverBugWorkarounds);
638c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_STREQ("5,7", args.c_str());
639c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
640c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
641a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(GpuDataManagerImplPrivateTest, BlacklistAllFeatures) {
642a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  ScopedGpuDataManagerImplPrivate manager;
643c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0u, manager->GetBlacklistedFeatureCount());
644c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::string reason;
645c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(manager->GpuAccessAllowed(&reason));
646c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(reason.empty());
647c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
648c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const std::string blacklist_json = LONG_STRING_CONST(
649c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      {
650c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "name": "gpu blacklist",
651c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "version": "0.1",
652c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "entries": [
653c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          {
654c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            "id": 1,
655c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            "features": [
656c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              "all"
657c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            ]
658c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          }
659c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        ]
660c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      }
661c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  );
662c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
6630529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  gpu::GPUInfo gpu_info;
664c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gpu_info.gpu.vendor_id = 0x10de;
665c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gpu_info.gpu.device_id = 0x0640;
666c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  manager->InitializeForTesting(blacklist_json, gpu_info);
667c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
6680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_EQ(static_cast<size_t>(gpu::NUMBER_OF_GPU_FEATURE_TYPES),
669c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            manager->GetBlacklistedFeatureCount());
670c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // TODO(zmo): remove the Linux specific behavior once we fix
671c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // crbug.com/238466.
672c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_LINUX)
673c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(manager->GpuAccessAllowed(&reason));
674c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(reason.empty());
675c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#else
676c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_FALSE(manager->GpuAccessAllowed(&reason));
677c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_FALSE(reason.empty());
678c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
679c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
680c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
6810529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochTEST_F(GpuDataManagerImplPrivateTest, UpdateActiveGpu) {
6820529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ScopedGpuDataManagerImpl manager;
6830529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
6840529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  const std::string blacklist_json = LONG_STRING_CONST(
6850529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      {
6860529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        "name": "gpu blacklist",
6870529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        "version": "0.1",
6880529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        "entries": [
6890529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch          {
6900529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch            "id": 1,
6910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch            "vendor_id": "0x8086",
6920529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch            "multi_gpu_category": "active",
6930529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch            "features": [
6940529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch              "webgl"
6950529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch            ]
6960529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch          }
6970529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        ]
6980529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      }
6990529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  );
7000529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
7010529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Two GPUs, the secondary Intel GPU is active.
7020529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  gpu::GPUInfo gpu_info;
7030529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  gpu_info.gpu.vendor_id = 0x10de;
7040529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  gpu_info.gpu.device_id = 0x0640;
7050529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  gpu_info.gpu.active = false;
7060529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  gpu::GPUInfo::GPUDevice intel_gpu;
7070529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  intel_gpu.vendor_id = 0x8086;
7080529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  intel_gpu.device_id = 0x04a1;
7090529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  intel_gpu.active = true;
7100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  gpu_info.secondary_gpus.push_back(intel_gpu);
7110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
7120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  manager->InitializeForTesting(blacklist_json, gpu_info);
7130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  TestObserver observer;
7140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  manager->AddObserver(&observer);
7150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
7160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_EQ(1u, manager->GetBlacklistedFeatureCount());
7170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
7180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Update with the same Intel GPU active.
7190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_FALSE(manager->UpdateActiveGpu(0x8086, 0x04a1));
7200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  {
7210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    base::RunLoop run_loop;
7220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    run_loop.RunUntilIdle();
7230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
7240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_FALSE(observer.gpu_info_updated());
7250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_EQ(1u, manager->GetBlacklistedFeatureCount());
7260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
7270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Set NVIDIA GPU to be active.
7280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_TRUE(manager->UpdateActiveGpu(0x10de, 0x0640));
7290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  {
7300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    base::RunLoop run_loop;
7310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    run_loop.RunUntilIdle();
7320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
7330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_TRUE(observer.gpu_info_updated());
7340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_EQ(0u, manager->GetBlacklistedFeatureCount());
7350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
7360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  observer.Reset();
7370529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_FALSE(observer.gpu_info_updated());
7380529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
7390529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Update with the same NVIDIA GPU active.
7400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_FALSE(manager->UpdateActiveGpu(0x10de, 0x0640));
7410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  {
7420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    base::RunLoop run_loop;
7430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    run_loop.RunUntilIdle();
7440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
7450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_FALSE(observer.gpu_info_updated());
7460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_EQ(0u, manager->GetBlacklistedFeatureCount());
7470529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
7480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Set Intel GPU to be active.
7490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_TRUE(manager->UpdateActiveGpu(0x8086, 0x04a1));
7500529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  {
7510529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    base::RunLoop run_loop;
7520529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    run_loop.RunUntilIdle();
7530529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
7540529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_TRUE(observer.gpu_info_updated());
7550529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_EQ(1u, manager->GetBlacklistedFeatureCount());
7560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
7570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
759