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/basictypes.h" 6868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h" 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/test/integration/performance/sync_timing_helper.h" 8d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)#include "chrome/browser/sync/test/integration/profile_sync_service_harness.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/test/integration/sync_test.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/test/integration/typed_urls_helper.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/sessions/sync_session_context.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using typed_urls_helper::AddUrlToHistory; 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using typed_urls_helper::AssertAllProfilesHaveSameURLsAsVerifier; 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using typed_urls_helper::DeleteUrlsFromHistory; 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using typed_urls_helper::GetTypedUrlsFromClient; 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This number should be as far away from a multiple of 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// kDefaultMaxCommitBatchSize as possible, so that sync cycle counts 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// for batch operations stay the same even if some batches end up not 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// being completely full. 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const int kNumUrls = 163; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This compile assert basically asserts that kNumUrls is right in the 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// middle between two multiples of kDefaultMaxCommitBatchSize. 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT( 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ((kNumUrls % syncer::kDefaultMaxCommitBatchSize) >= 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (syncer::kDefaultMaxCommitBatchSize / 2)) && 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ((kNumUrls % syncer::kDefaultMaxCommitBatchSize) <= 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ((syncer::kDefaultMaxCommitBatchSize + 1) / 2)), 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kNumUrlsShouldBeBetweenTwoMultiplesOfkDefaultMaxCommitBatchSize); 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TypedUrlsSyncPerfTest : public SyncTest { 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TypedUrlsSyncPerfTest() 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : SyncTest(TWO_CLIENT), 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url_number_(0) {} 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Adds |num_urls| new unique typed urls to |profile|. 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddURLs(int profile, int num_urls); 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Update all typed urls in |profile| by visiting them once again. 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void UpdateURLs(int profile); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Removes all typed urls for |profile|. 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RemoveURLs(int profile); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the number of typed urls stored in |profile|. 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int GetURLCount(int profile); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns a new unique typed URL. 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL NextURL(); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns a unique URL according to the integer |n|. 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL IntToURL(int n); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int url_number_; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TypedUrlsSyncPerfTest); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TypedUrlsSyncPerfTest::AddURLs(int profile, int num_urls) { 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < num_urls; ++i) { 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddUrlToHistory(profile, NextURL()); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TypedUrlsSyncPerfTest::UpdateURLs(int profile) { 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::URLRows urls = GetTypedUrlsFromClient(profile); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (history::URLRows::const_iterator it = urls.begin(); it != urls.end(); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++it) { 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddUrlToHistory(profile, it->url()); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TypedUrlsSyncPerfTest::RemoveURLs(int profile) { 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const history::URLRows& urls = GetTypedUrlsFromClient(profile); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<GURL> gurls; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (history::URLRows::const_iterator it = urls.begin(); it != urls.end(); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++it) { 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gurls.push_back(it->url()); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DeleteUrlsFromHistory(profile, gurls); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int TypedUrlsSyncPerfTest::GetURLCount(int profile) { 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetTypedUrlsFromClient(profile).size(); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GURL TypedUrlsSyncPerfTest::NextURL() { 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return IntToURL(url_number_++); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GURL TypedUrlsSyncPerfTest::IntToURL(int n) { 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return GURL(base::StringPrintf("http://history%d.google.com/", n)); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(TypedUrlsSyncPerfTest, P0) { 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(SetupSync()) << "SetupSync() failed."; 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TCM ID - 7985716. 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddURLs(0, kNumUrls); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta dt = 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SyncTimingHelper::TimeMutualSyncCycle(GetClient(0), GetClient(1)); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(kNumUrls, GetURLCount(1)); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SyncTimingHelper::PrintResult("typed_urls", "add_typed_urls", dt); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TCM ID - 7981755. 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateURLs(0); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dt = SyncTimingHelper::TimeMutualSyncCycle(GetClient(0), GetClient(1)); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(kNumUrls, GetURLCount(1)); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SyncTimingHelper::PrintResult("typed_urls", "update_typed_urls", dt); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TCM ID - 7651271. 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RemoveURLs(0); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dt = SyncTimingHelper::TimeMutualSyncCycle(GetClient(0), GetClient(1)); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(0, GetURLCount(1)); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SyncTimingHelper::PrintResult("typed_urls", "delete_typed_urls", dt); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 119