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(×, "%.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