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