15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/environment.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/file_util.h"
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_number_conversions.h"
9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/sys_info.h"
11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_constants.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_paths.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/env_vars.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/automation/automation_proxy.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/perf/perf_test.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/ui/ui_perf_test.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_util.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::TimeDelta;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ShutdownTest : public UIPerfTest {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShutdownTest() {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    show_window_ = true;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUp() {}
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void TearDown() {}
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum TestSize {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SIMPLE,  // Runs with no command line arguments (loads about:blank).
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TWENTY_TABS,  // Opens 5 copies of 4 different test pages.
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetUpTwentyTabs() {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int window_count;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(automation()->GetBrowserWindowCount(&window_count));
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(1, window_count);
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<BrowserProxy> browser_proxy(
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        automation()->GetBrowserWindow(0));
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(browser_proxy.get());
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath kFastShutdownDir(FILE_PATH_LITERAL("fast_shutdown"));
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath kCurrentDir(base::FilePath::kCurrentDirectory);
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath test_cases[] = {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui_test_utils::GetTestFilePath(kFastShutdownDir,
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          base::FilePath(FILE_PATH_LITERAL("on_before_unloader.html"))),
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui_test_utils::GetTestFilePath(kCurrentDir,
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          base::FilePath(FILE_PATH_LITERAL("animated-gifs.html"))),
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui_test_utils::GetTestFilePath(kCurrentDir,
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          base::FilePath(FILE_PATH_LITERAL("french_page.html"))),
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui_test_utils::GetTestFilePath(kCurrentDir,
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          base::FilePath(FILE_PATH_LITERAL("setcookie.html"))),
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    };
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (size_t i = 0; i < arraysize(test_cases); i++) {
607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      ASSERT_TRUE(base::PathExists(test_cases[i]));
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (size_t j = 0; j < 5; j++) {
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ASSERT_TRUE(browser_proxy->AppendTab(
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            net::FilePathToFileURL(test_cases[i])));
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RunShutdownTest(const char* graph, const char* trace,
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       bool important, TestSize test_size,
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       ProxyLauncher::ShutdownType shutdown_type) {
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(NDEBUG)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const int kNumCyclesMax = 20;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Debug builds are too slow and we can't run that many cycles in a
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // reasonable amount of time.
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const int kNumCyclesMax = 10;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int numCycles = kNumCyclesMax;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<base::Environment> env(base::Environment::Create());
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string numCyclesEnv;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (env->GetVar(env_vars::kStartupTestsNumCycles, &numCyclesEnv) &&
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::StringToInt(numCyclesEnv, &numCycles)) {
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (numCycles <= kNumCyclesMax) {
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        VLOG(1) << env_vars::kStartupTestsNumCycles
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                << " set in environment, so setting numCycles to " << numCycles;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      } else {
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        VLOG(1) << env_vars::kStartupTestsNumCycles
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                << " is higher than the max, setting numCycles to "
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                << kNumCyclesMax;
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        numCycles = kNumCyclesMax;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TimeDelta timings[kNumCyclesMax];
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (int i = 0; i < numCycles; ++i) {
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      UITest::SetUp();
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (test_size == TWENTY_TABS) {
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SetUpTwentyTabs();
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      set_shutdown_type(shutdown_type);
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      UITest::TearDown();
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      timings[i] = browser_quit_time();
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (i == 0) {
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // Re-use the profile data after first run so that the noise from
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // creating databases doesn't impact all the runs.
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        clear_profile_ = false;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // Clear template_user_data_ so we don't try to copy it over each time
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // through.
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        set_template_user_data(base::FilePath());
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string times;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (int i = 0; i < numCycles; ++i)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::StringAppendF(&times, "%.2f,", timings[i].InMillisecondsF());
117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    perf_test::PrintResultList(
118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        graph, std::string(), trace, times, "ms", important);
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ShutdownTest, DISABLED_SimpleWindowClose) {
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunShutdownTest("shutdown", "simple-window-close",
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  true, /* important */ SIMPLE, ProxyLauncher::WINDOW_CLOSE);
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ShutdownTest, SimpleUserQuit) {
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunShutdownTest("shutdown", "simple-user-quit",
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  true, /* important */ SIMPLE, ProxyLauncher::USER_QUIT);
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ShutdownTest, SimpleSessionEnding) {
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunShutdownTest("shutdown", "simple-session-ending",
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  true, /* important */ SIMPLE, ProxyLauncher::SESSION_ENDING);
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/110471
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) && !defined(NDEBUG)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_TwentyTabsWindowClose DISABLED_TwentyTabsWindowClose
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_TwentyTabsUserQuit DISABLED_TwentyTabsUserQuit
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_TwentyTabsWindowClose TwentyTabsWindowClose
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_TwentyTabsUserQuit TwentyTabsUserQuit
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ShutdownTest, MAYBE_TwentyTabsWindowClose) {
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunShutdownTest("shutdown", "twentytabs-window-close",
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  true, /* important */ TWENTY_TABS,
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  ProxyLauncher::WINDOW_CLOSE);
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ShutdownTest, MAYBE_TwentyTabsUserQuit) {
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunShutdownTest("shutdown", "twentytabs-user-quit",
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  true, /* important */ TWENTY_TABS, ProxyLauncher::USER_QUIT);
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/40671
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) && !defined(NDEBUG)
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_TwentyTabsSessionEnding DISABLED_TwentyTabsSessionEnding
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_TwentyTabsSessionEnding TwentyTabsSessionEnding
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ShutdownTest, MAYBE_TwentyTabsSessionEnding) {
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunShutdownTest("shutdown", "twentytabs-session-ending",
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  true, /* important */ TWENTY_TABS,
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  ProxyLauncher::SESSION_ENDING);
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
171