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