autofill_sync_perf_test.cc revision 868fa2fe829687343ffae624259930155e16dbd8
1// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "base/strings/stringprintf.h" 6#include "base/strings/utf_string_conversions.h" 7#include "chrome/browser/sync/profile_sync_service_harness.h" 8#include "chrome/browser/sync/test/integration/autofill_helper.h" 9#include "chrome/browser/sync/test/integration/bookmarks_helper.h" 10#include "chrome/browser/sync/test/integration/performance/sync_timing_helper.h" 11#include "chrome/browser/sync/test/integration/sync_test.h" 12#include "components/autofill/browser/autofill_common_test.h" 13#include "components/autofill/browser/autofill_profile.h" 14#include "components/autofill/browser/webdata/autofill_entry.h" 15 16using autofill::AutofillFieldType; 17using autofill::AutofillKey; 18using autofill::AutofillProfile; 19 20using autofill_helper::AllProfilesMatch; 21using autofill_helper::GetAllKeys; 22using autofill_helper::GetAllProfiles; 23using autofill_helper::GetKeyCount; 24using autofill_helper::GetProfileCount; 25using autofill_helper::RemoveKeys; 26using autofill_helper::SetProfiles; 27 28// See comments in typed_urls_sync_perf_test.cc for reasons for these 29// magic numbers. 30// 31// TODO(akalin): If this works, decomp the magic number calculation 32// into a macro and have all the perf tests use it. 33static const int kNumKeys = 163; 34static const int kNumProfiles = 163; 35 36class AutofillSyncPerfTest : public SyncTest { 37 public: 38 AutofillSyncPerfTest() 39 : SyncTest(TWO_CLIENT), 40 guid_number_(0), 41 name_number_(0), 42 value_number_(0) {} 43 44 // Adds |num_profiles| new autofill profiles to the sync profile |profile|. 45 void AddProfiles(int profile, int num_profiles); 46 47 // Updates all autofill profiles for the sync profile |profile|. 48 void UpdateProfiles(int profile); 49 50 // Removes all autofill profiles from |profile|. 51 void RemoveProfiles(int profile); 52 53 // Adds |num_keys| new autofill keys to the sync profile |profile|. 54 void AddKeys(int profile, int num_keys); 55 56 private: 57 // Returns a new unique autofill profile. 58 const AutofillProfile NextAutofillProfile(); 59 60 // Returns a new unique autofill key. 61 const AutofillKey NextAutofillKey(); 62 63 // Returns an unused unique guid. 64 const std::string NextGUID(); 65 66 // Returns a unique guid based on the input integer |n|. 67 const std::string IntToGUID(int n); 68 69 // Returns a new unused unique name. 70 const std::string NextName(); 71 72 // Returns a unique name based on the input integer |n|. 73 const std::string IntToName(int n); 74 75 // Returns a new unused unique value for autofill entries. 76 const std::string NextValue(); 77 78 // Returnes a unique value based on the input integer |n|. 79 const std::string IntToValue(int n); 80 81 int guid_number_; 82 int name_number_; 83 int value_number_; 84 DISALLOW_COPY_AND_ASSIGN(AutofillSyncPerfTest); 85}; 86 87void AutofillSyncPerfTest::AddProfiles(int profile, int num_profiles) { 88 const std::vector<AutofillProfile*>& all_profiles = 89 GetAllProfiles(profile); 90 std::vector<AutofillProfile> autofill_profiles; 91 for (size_t i = 0; i < all_profiles.size(); ++i) { 92 autofill_profiles.push_back(*all_profiles[i]); 93 } 94 for (int i = 0; i < num_profiles; ++i) { 95 autofill_profiles.push_back(NextAutofillProfile()); 96 } 97 SetProfiles(profile, &autofill_profiles); 98} 99 100void AutofillSyncPerfTest::UpdateProfiles(int profile) { 101 const std::vector<AutofillProfile*>& all_profiles = 102 GetAllProfiles(profile); 103 std::vector<AutofillProfile> autofill_profiles; 104 for (size_t i = 0; i < all_profiles.size(); ++i) { 105 autofill_profiles.push_back(*all_profiles[i]); 106 autofill_profiles.back().SetRawInfo(AutofillFieldType(autofill::NAME_FIRST), 107 UTF8ToUTF16(NextName())); 108 } 109 SetProfiles(profile, &autofill_profiles); 110} 111 112void AutofillSyncPerfTest::RemoveProfiles(int profile) { 113 std::vector<AutofillProfile> empty; 114 SetProfiles(profile, &empty); 115} 116 117void AutofillSyncPerfTest::AddKeys(int profile, int num_keys) { 118 std::set<AutofillKey> keys; 119 for (int i = 0; i < num_keys; ++i) { 120 keys.insert(NextAutofillKey()); 121 } 122 autofill_helper::AddKeys(profile, keys); 123} 124 125const AutofillProfile AutofillSyncPerfTest::NextAutofillProfile() { 126 AutofillProfile profile; 127 autofill::test::SetProfileInfoWithGuid(&profile, NextGUID().c_str(), 128 NextName().c_str(), "", "", "", "", "", 129 "", "", "", "", "", ""); 130 return profile; 131} 132 133const AutofillKey AutofillSyncPerfTest::NextAutofillKey() { 134 return AutofillKey(NextName().c_str(), NextName().c_str()); 135} 136 137const std::string AutofillSyncPerfTest::NextGUID() { 138 return IntToGUID(guid_number_++); 139} 140 141const std::string AutofillSyncPerfTest::IntToGUID(int n) { 142 return base::StringPrintf("00000000-0000-0000-0000-%012X", n); 143} 144 145const std::string AutofillSyncPerfTest::NextName() { 146 return IntToName(name_number_++); 147} 148 149const std::string AutofillSyncPerfTest::IntToName(int n) { 150 return base::StringPrintf("Name%d", n); 151} 152 153const std::string AutofillSyncPerfTest::NextValue() { 154 return IntToValue(value_number_++); 155} 156 157const std::string AutofillSyncPerfTest::IntToValue(int n) { 158 return base::StringPrintf("Value%d", n); 159} 160 161void ForceSync(int profile) { 162 static int id = 0; 163 ++id; 164 EXPECT_TRUE( 165 bookmarks_helper::AddURL(profile, 0, 166 bookmarks_helper::IndexedURLTitle(id), 167 GURL(bookmarks_helper::IndexedURL(id))) != NULL); 168} 169 170IN_PROC_BROWSER_TEST_F(AutofillSyncPerfTest, AutofillProfiles_P0) { 171 ASSERT_TRUE(SetupSync()) << "SetupSync() failed."; 172 173 // TCM ID - 7557873. 174 AddProfiles(0, kNumProfiles); 175 base::TimeDelta dt = 176 SyncTimingHelper::TimeMutualSyncCycle(GetClient(0), GetClient(1)); 177 ASSERT_EQ(kNumProfiles, GetProfileCount(1)); 178 SyncTimingHelper::PrintResult("autofill", "add_autofill_profiles", dt); 179 180 // TCM ID - 7549835. 181 UpdateProfiles(0); 182 dt = SyncTimingHelper::TimeMutualSyncCycle(GetClient(0), GetClient(1)); 183 ASSERT_EQ(kNumProfiles, GetProfileCount(1)); 184 SyncTimingHelper::PrintResult("autofill", "update_autofill_profiles", dt); 185 186 // TCM ID - 7553678. 187 RemoveProfiles(0); 188 dt = SyncTimingHelper::TimeMutualSyncCycle(GetClient(0), GetClient(1)); 189 ASSERT_EQ(0, GetProfileCount(1)); 190 SyncTimingHelper::PrintResult("autofill", "delete_autofill_profiles", dt); 191} 192 193IN_PROC_BROWSER_TEST_F(AutofillSyncPerfTest, Autofill_P0) { 194 ASSERT_TRUE(SetupSync()) << "SetupSync() failed."; 195 196 AddKeys(0, kNumKeys); 197 // TODO(lipalani): fix this. The following line is added to force sync. 198 ForceSync(0); 199 base::TimeDelta dt = 200 SyncTimingHelper::TimeMutualSyncCycle(GetClient(0), GetClient(1)); 201 ASSERT_EQ(kNumKeys, GetKeyCount(1)); 202 SyncTimingHelper::PrintResult("autofill", "add_autofill_keys", dt); 203 204 RemoveKeys(0); 205 // TODO(lipalani): fix this. The following line is added to force sync. 206 ForceSync(0); 207 dt = SyncTimingHelper::TimeMutualSyncCycle(GetClient(0), GetClient(1)); 208 ASSERT_EQ(0, GetKeyCount(1)); 209 SyncTimingHelper::PrintResult("autofill", "delete_autofill_keys", dt); 210} 211