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