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/file_util.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h" 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/testing_pref_service.h" 8a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "base/run_loop.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_split.h" 10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h" 11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/sequenced_worker_pool.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/app/chrome_command_ids.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_process.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/page_cycler/page_cycler.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/browser.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_list.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_paths.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/url_constants.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/browser_with_test_window_test.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_browser_thread.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_errors.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::_; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Invoke; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::RenderViewHost; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::TestBrowserThread; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContentsObserver; 337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochusing base::ContentsEqual; 347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochusing base::PathExists; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kFrameID = 1; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const bool kIsMainFrame = true; 3990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const GURL kAboutURL = GURL(content::kAboutBlankURL); 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockPageCycler : public PageCycler { 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockPageCycler(Browser* browser, base::FilePath urls_file, 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath errors_file) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : PageCycler(browser, urls_file) { 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_errors_file(errors_file); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockPageCycler(Browser* browser, 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath urls_file, 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath errors_file, 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath stats_file) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : PageCycler(browser, urls_file) { 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_stats_file(stats_file); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_errors_file(errors_file); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD4(DidFinishLoad, void(int64 frame_id, 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& validated_url, 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_main_frame, 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* render_view_host)); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD6(DidFailProvisionalLoad, void(int64 frame_id, 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_main_frame, 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& validated_url, 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int error_code, 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& error_description, 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* render_view_host)); 697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch MOCK_METHOD1(RenderProcessGone, void(base::TerminationStatus status)); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void PageCyclerDidFailProvisionalLoad( 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 frame_id, 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_main_frame, 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& validated_url, 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int error_code, 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& error_description, 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* render_view_host) { 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PageCycler::DidFailProvisionalLoad(frame_id, is_main_frame, 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) validated_url, 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_code, error_description, 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view_host); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void PageCyclerDidFinishLoad(int64 frame_id, 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& validated_url, 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_main_frame, 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* render_view_host) { 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PageCycler::DidFinishLoad( 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame_id, validated_url, is_main_frame, render_view_host); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We need to override Finish() because the calls to exit the browser in a 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // real PageCycler do not work in unittests (they interfere with later tests). 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Finish() OVERRIDE { 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserList::RemoveObserver(this); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Release(); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~MockPageCycler() {}\ 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(MockPageCycler); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PageCyclerTest : public BrowserWithTestWindowTest { 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PageCyclerTest() { 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~PageCyclerTest() { 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() OVERRIDE { 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PathService::Get(chrome::DIR_TEST_DATA, &test_data_dir_); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_data_dir_ = test_data_dir_.AppendASCII("page_cycler"); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserWithTestWindowTest::SetUp(); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddTab(browser(), kAboutURL); 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_FALSE(browser()->tab_strip_model()->GetActiveWebContents() == NULL); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void InitFilePaths(const base::FilePath& temp_path) { 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) errors_file_ = temp_path.AppendASCII("errors_file"); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) stats_file_ = temp_path.AppendASCII("stats_file"); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CHECK(!base::PathExists(errors_file_)); 1277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CHECK(!base::PathExists(stats_file_)); 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void FailProvisionalLoad(int error_code, string16& error_description) { 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER( 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsObserver, 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observers_, 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DidFailProvisionalLoad(kFrameID, kIsMainFrame, kAboutURL, error_code, 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_description, NULL)); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PumpLoop(); 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void FinishLoad() { 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER( 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsObserver, 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observers_, 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DidFinishLoad(kFrameID, kAboutURL, kIsMainFrame, NULL)); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PumpLoop(); 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RunPageCycler() { 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) page_cycler_->Run(); 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PumpLoop(); 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void PumpLoop() { 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::BrowserThread::GetBlockingPool()->FlushForTesting(); 154a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CloseBrowser() { 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DestroyBrowserAndProfile(); 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PumpLoop(); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockPageCycler* page_cycler() { 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return page_cycler_.get(); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_page_cycler(MockPageCycler* page_cycler) { 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) page_cycler_ = page_cycler; 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observers_.AddObserver(page_cycler); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<GURL>* urls_for_test() { 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return page_cycler_->urls_for_test(); 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath stats_file() { 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return stats_file_; 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath errors_file() { 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return errors_file_; 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath urls_file() { 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return test_data_dir_.AppendASCII("about_url"); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath test_data_dir() { 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return test_data_dir_; 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ObserverList<WebContentsObserver> observers_; 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<MockPageCycler> page_cycler_; 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath test_data_dir_; 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath stats_file_; 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath errors_file_; 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath urls_file_; 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PageCyclerTest, FailProvisionalLoads) { 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath errors_expected_file = 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_data_dir().AppendASCII("errors_expected"); 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ScopedTempDir temp; 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(temp.CreateUniqueTempDir()); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitFilePaths(temp.path()); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(PathExists(errors_expected_file)); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(PathExists(urls_file())); 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_page_cycler(new MockPageCycler(browser(), 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) urls_file(), 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) errors_file())); 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunPageCycler(); 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Page cycler expects browser to automatically start loading the first page. 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*page_cycler(), 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DidFinishLoad(kFrameID, kAboutURL, kIsMainFrame, _)) 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(Invoke(page_cycler(), 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &MockPageCycler::PageCyclerDidFinishLoad)); 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FinishLoad(); 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // DNS server fail error message. 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 error_string = 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16(ASCIIToUTF16(net::ErrorToString(net::ERR_DNS_SERVER_FAILED))); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*page_cycler(), 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DidFailProvisionalLoad(kFrameID, kIsMainFrame, _, 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::ERR_DNS_SERVER_FAILED, error_string, 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _)) 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(Invoke(page_cycler(), 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &MockPageCycler::PageCyclerDidFailProvisionalLoad)); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FailProvisionalLoad(net::ERR_DNS_SERVER_FAILED, error_string); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // DNS time-out error message. 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_string = string16( 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASCIIToUTF16(net::ErrorToString(net::ERR_DNS_TIMED_OUT))); 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*page_cycler(), 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DidFailProvisionalLoad(kFrameID, 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kIsMainFrame, _, net::ERR_DNS_TIMED_OUT, 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_string, _)) 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(Invoke(page_cycler(), 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &MockPageCycler::PageCyclerDidFailProvisionalLoad)); 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FailProvisionalLoad(net::ERR_DNS_TIMED_OUT, error_string); 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // DNS time-out error message. 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_string = string16( 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASCIIToUTF16(net::ErrorToString(net::ERR_INVALID_URL))); 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*page_cycler(), 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DidFailProvisionalLoad(kFrameID, kIsMainFrame, _, 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::ERR_INVALID_URL, error_string, _)) 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(Invoke(page_cycler(), 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &MockPageCycler::PageCyclerDidFailProvisionalLoad)); 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FailProvisionalLoad(net::ERR_INVALID_URL, error_string); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PumpLoop(); 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string errors_output; 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string errors_expected; 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(file_util::ReadFileToString(errors_file(), 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &errors_output)); 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(file_util::ReadFileToString(errors_expected_file, 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &errors_expected)); 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(errors_output, errors_expected); 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PageCyclerTest, StatsFile) { 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kNumLoads = 4; 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ScopedTempDir temp; 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(temp.CreateUniqueTempDir()); 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitFilePaths(temp.path()); 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(PathExists(urls_file())); 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_page_cycler(new MockPageCycler(browser(), urls_file(), 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) errors_file())); 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) page_cycler()->set_stats_file(stats_file()); 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunPageCycler(); 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kNumLoads; ++i) { 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*page_cycler(), DidFinishLoad( 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kFrameID, kAboutURL, kIsMainFrame, _)) 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(Invoke(page_cycler(), 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &MockPageCycler::PageCyclerDidFinishLoad)); 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FinishLoad(); 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PumpLoop(); 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(PathExists(errors_file())); 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(PathExists(stats_file())); 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PageCyclerTest, KillBrowserAndAbort) { 2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath errors_expected_file = 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_data_dir().AppendASCII("abort_expected"); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ScopedTempDir temp; 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(temp.CreateUniqueTempDir()); 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitFilePaths(temp.path()); 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(PathExists(errors_expected_file)); 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(PathExists(urls_file())); 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_page_cycler(new MockPageCycler(browser(), 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) urls_file(), 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) errors_file())); 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunPageCycler(); 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*page_cycler(), 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DidFinishLoad(kFrameID, kAboutURL, kIsMainFrame, _)) 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(Invoke(page_cycler(), 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &MockPageCycler::PageCyclerDidFinishLoad)); 314a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::RunLoop().RunUntilIdle(); 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FinishLoad(); 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CloseBrowser(); 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PumpLoop(); 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string errors_output; 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string errors_expected; 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(file_util::ReadFileToString(errors_file(), 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &errors_output)); 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(file_util::ReadFileToString(errors_expected_file, 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &errors_expected)); 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(errors_output, errors_expected); 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PageCyclerTest, MultipleIterations) { 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kNumLoads = 4; 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ScopedTempDir temp; 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(temp.CreateUniqueTempDir()); 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitFilePaths(temp.path()); 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(PathExists(urls_file())); 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_page_cycler(new MockPageCycler(browser(), 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) urls_file(), 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) errors_file())); 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) page_cycler()->set_stats_file(stats_file()); 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunPageCycler(); 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*page_cycler(), 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DidFinishLoad(kFrameID, kAboutURL, kIsMainFrame, _)) 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillRepeatedly(Invoke(page_cycler(), 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &MockPageCycler::PageCyclerDidFinishLoad)); 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kNumLoads; ++i) 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FinishLoad(); 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PumpLoop(); 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(PathExists(errors_file())); 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(PathExists(stats_file())); 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 357