13551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
23551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
33551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// found in the LICENSE file.
43551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
53551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/basictypes.h"
63551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/command_line.h"
73551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#if defined(OS_MACOSX)
83551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/mac/mac_util.h"
93551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#endif
103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/strings/stringprintf.h"
113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/test/trace_event_analyzer.h"
123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/win/windows_version.h"
133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/browser/extensions/extension_apitest.h"
143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/browser/extensions/extension_service.h"
153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/browser/extensions/tab_helper.h"
163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/browser/ui/fullscreen/fullscreen_controller.h"
183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/common/chrome_switches.h"
193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/common/chrome_version_info.h"
203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/test/base/test_launcher_utils.h"
213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/test/base/test_switches.h"
223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/test/base/tracing.h"
233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "content/public/common/content_switches.h"
24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/feature_switch.h"
25c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "extensions/common/features/base_feature_provider.h"
26c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "extensions/common/features/complex_feature.h"
273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "extensions/common/features/feature.h"
28c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "extensions/common/features/simple_feature.h"
29e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "extensions/common/switches.h"
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/test/extension_test_message_listener.h"
313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
3258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "testing/perf/perf_test.h"
333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "ui/compositor/compositor_switches.h"
343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "ui/gl/gl_switches.h"
353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)namespace {
373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)const char kExtensionId[] = "ddchlicdkolnonkihahngkmmmjnjlkkf";
393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)enum TestFlags {
413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  kUseGpu              = 1 << 0, // Only execute test if --enable-gpu was given
423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                 // on the command line.  This is required for
433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                 // tests that run on GPU.
443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  kForceGpuComposited  = 1 << 1, // Force the test to use the compositor.
453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  kDisableVsync        = 1 << 2, // Do not limit framerate to vertical refresh.
463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                 // when on GPU, nor to 60hz when not on GPU.
473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  kTestThroughWebRTC   = 1 << 3, // Send captured frames through webrtc
483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  kSmallWindow         = 1 << 4, // 1 = 800x600, 0 = 2000x1000
493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  kScaleQualityMask    = 3 << 5, // two bits select which scaling quality
513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  kScaleQualityDefault = 0 << 5, // to use on aura.
523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  kScaleQualityFast    = 1 << 5,
533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  kScaleQualityGood    = 2 << 5,
543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  kScaleQualityBest    = 3 << 5,
553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)};
563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class TabCapturePerformanceTest
583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    : public ExtensionApiTest,
593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      public testing::WithParamInterface<int> {
603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) public:
613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  TabCapturePerformanceTest() {}
623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  bool HasFlag(TestFlags flag) const {
643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return (GetParam() & flag) == flag;
653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  bool IsGpuAvailable() const {
683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return CommandLine::ForCurrentProcess()->HasSwitch("enable-gpu");
693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  std::string ScalingMethod() const {
723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    switch (GetParam() & kScaleQualityMask) {
733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      case kScaleQualityFast:
743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        return "fast";
753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      case kScaleQualityGood:
763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        return "good";
773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      case kScaleQualityBest:
783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        return "best";
793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      default:
803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        return "";
813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    }
823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  std::string GetSuffixForTestFlags() {
853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    std::string suffix;
863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    if (HasFlag(kForceGpuComposited))
873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      suffix += "_comp";
883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    if (HasFlag(kUseGpu))
893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      suffix += "_gpu";
903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    if (HasFlag(kDisableVsync))
913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      suffix += "_novsync";
923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    if (HasFlag(kTestThroughWebRTC))
933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      suffix += "_webrtc";
943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    if (!ScalingMethod().empty())
953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      suffix += "_scale" + ScalingMethod();
963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    if (HasFlag(kSmallWindow))
973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      suffix += "_small";
983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return suffix;
993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
1003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EnablePixelOutput();
1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ExtensionApiTest::SetUp();
1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
1073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    if (!ScalingMethod().empty()) {
1083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      command_line->AppendSwitchASCII(switches::kTabCaptureUpscaleQuality,
1093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                      ScalingMethod());
1103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      command_line->AppendSwitchASCII(switches::kTabCaptureDownscaleQuality,
1113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                      ScalingMethod());
1123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    }
1133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // Some of the tests may launch http requests through JSON or AJAX
1153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // which causes a security error (cross domain request) when the page
1163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // is loaded from the local file system ( file:// ). The following switch
1173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // fixes that error.
1183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    command_line->AppendSwitch(switches::kAllowFileAccessFromFiles);
1193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    if (HasFlag(kSmallWindow)) {
1213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      command_line->AppendSwitchASCII(switches::kWindowSize, "800,600");
1223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    } else {
1233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      command_line->AppendSwitchASCII(switches::kWindowSize, "2000,1500");
1243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    }
1253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    if (!HasFlag(kUseGpu))
1271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      command_line->AppendSwitch(switches::kDisableGpu);
1283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    if (HasFlag(kDisableVsync))
1303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      command_line->AppendSwitch(switches::kDisableGpuVsync);
1313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
132e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    command_line->AppendSwitchASCII(
133e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch        extensions::switches::kWhitelistedExtensionID,
134e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch        kExtensionId);
1353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ExtensionApiTest::SetUpCommandLine(command_line);
1363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
1373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  bool PrintResults(trace_analyzer::TraceAnalyzer *analyzer,
1393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                    const std::string& test_name,
1403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                    const std::string& event_name,
1413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                    const std::string& unit) {
1423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    trace_analyzer::TraceEventVector events;
1433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    trace_analyzer::Query query =
1443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        trace_analyzer::Query::EventNameIs(event_name) &&
1453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        (trace_analyzer::Query::EventPhaseIs(TRACE_EVENT_PHASE_BEGIN) ||
146f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)         trace_analyzer::Query::EventPhaseIs(TRACE_EVENT_PHASE_COMPLETE) ||
1473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)         trace_analyzer::Query::EventPhaseIs(TRACE_EVENT_PHASE_ASYNC_BEGIN) ||
1483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)         trace_analyzer::Query::EventPhaseIs(TRACE_EVENT_PHASE_FLOW_BEGIN) ||
1493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)         trace_analyzer::Query::EventPhaseIs(TRACE_EVENT_PHASE_INSTANT));
1503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    analyzer->FindEvents(query, &events);
1513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    if (events.size() < 20) {
152f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      LOG(ERROR) << "Not enough events of type " << event_name << " found ("
153f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                 << events.size() << ").";
1543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      return false;
1553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    }
1563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // Ignore some events for startup/setup/caching.
1583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    trace_analyzer::TraceEventVector rate_events(events.begin() + 3,
1593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                                 events.end() - 3);
1603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    trace_analyzer::RateStats stats;
1613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    if (!GetRateStats(rate_events, &stats, NULL)) {
1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      LOG(ERROR) << "GetRateStats failed";
1633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      return false;
1643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    }
1653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    double mean_ms = stats.mean_us / 1000.0;
1663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    double std_dev_ms = stats.standard_deviation_us / 1000.0;
1673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    std::string mean_and_error = base::StringPrintf("%f,%f", mean_ms,
1683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                                    std_dev_ms);
1693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    perf_test::PrintResultMeanAndError(test_name,
1703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                       GetSuffixForTestFlags(),
1713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                       event_name,
1723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                       mean_and_error,
1733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                       unit,
1743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                       true);
1753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return true;
1763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
1773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  void RunTest(const std::string& test_name) {
1793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    if (HasFlag(kUseGpu) && !IsGpuAvailable()) {
1803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      LOG(WARNING) <<
1813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          "Test skipped: requires gpu. Pass --enable-gpu on the command "
1823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          "line if use of GPU is desired.";
1833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      return;
1843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    }
1853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    std::string json_events;
187f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    ASSERT_TRUE(tracing::BeginTracing("gpu,mirroring"));
1883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    std::string page = "performance.html";
1893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    page += HasFlag(kTestThroughWebRTC) ? "?WebRTC=1" : "?WebRTC=0";
1903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // Ideally we'd like to run a higher capture rate when vsync is disabled,
1913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // but libjingle currently doesn't allow that.
1923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // page += HasFlag(kDisableVsync) ? "&fps=300" : "&fps=30";
1933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    page += "&fps=30";
1945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ASSERT_TRUE(RunExtensionSubtest("tab_capture", page)) << message_;
1953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ASSERT_TRUE(tracing::EndTracing(&json_events));
1963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    scoped_ptr<trace_analyzer::TraceAnalyzer> analyzer;
1973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    analyzer.reset(trace_analyzer::TraceAnalyzer::Create(json_events));
1983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // The printed result will be the average time between frames in the
2003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // browser window.
201f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    bool gpu_frames = PrintResults(
202f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        analyzer.get(),
203f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        test_name,
204f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        "RenderWidget::didCommitAndDrawCompositorFrame",
205f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        "ms");
206f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    EXPECT_TRUE(gpu_frames);
2073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // This prints out the average time between capture events.
2093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // As the capture frame rate is capped at 30fps, this score
2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // cannot get any better than (lower) 33.33 ms.
2113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    EXPECT_TRUE(PrintResults(analyzer.get(),
2123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                             test_name,
2133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                             "Capture",
2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                             "ms"));
2153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
2163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)};
2173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}  // namespace
2193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
220f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)IN_PROC_BROWSER_TEST_P(TabCapturePerformanceTest, Performance) {
2213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  RunTest("TabCapturePerformance");
2223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
2233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Note: First argument is optional and intentionally left blank.
2253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// (it's a prefix for the generated test cases)
2263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)INSTANTIATE_TEST_CASE_P(
2273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ,
2283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    TabCapturePerformanceTest,
2293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    testing::Values(
2303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        0,
2313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        kUseGpu | kForceGpuComposited,
2323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        kDisableVsync,
2333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        kDisableVsync | kUseGpu | kForceGpuComposited,
2343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        kTestThroughWebRTC,
2353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        kTestThroughWebRTC | kUseGpu | kForceGpuComposited,
2363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        kTestThroughWebRTC | kDisableVsync,
2373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        kTestThroughWebRTC | kDisableVsync | kUseGpu | kForceGpuComposited));
2383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2398bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#if defined(USE_AURA)
2403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// TODO(hubbe):
2413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// These are temporary tests for the purpose of determining what the
2423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// appropriate scaling quality is. Once that has been determined,
2433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// these tests will be removed.
2443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)const int kScalingTestBase =
2463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    kTestThroughWebRTC | kDisableVsync | kUseGpu | kForceGpuComposited;
2473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)INSTANTIATE_TEST_CASE_P(
2493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    ScalingTests,
2503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    TabCapturePerformanceTest,
2513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    testing::Values(
2523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        kScalingTestBase | kScaleQualityFast,
2533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        kScalingTestBase | kScaleQualityGood,
2543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        kScalingTestBase | kScaleQualityBest,
2553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        kScalingTestBase | kScaleQualityFast | kSmallWindow,
2563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        kScalingTestBase | kScaleQualityGood | kSmallWindow,
2573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        kScalingTestBase | kScaleQualityBest | kSmallWindow));
2583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#endif  // USE_AURA
260