generate_profile.cc revision 7dbb3d5cf0c15f500944d211057644d6a2f37371
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) 5a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "chrome/test/perf/generate_profile.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/at_exit.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/file_util.h" 10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/files/file_enumerator.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/i18n/icu_util.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/logging.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/message_loop.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/process_util.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_number_conversions.h" 18868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/history/history_service.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/history_service_factory.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/top_sites.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_paths.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/thumbnail_score.h" 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/test/base/testing_browser_process.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_profile.h" 27a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "chrome/tools/profiles/thumbnail-inl.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h" 30a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "content/public/test/test_browser_thread.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/core/SkBitmap.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/ui_base_paths.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/codec/jpeg_codec.h" 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::Time; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)namespace { 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// RAII for initializing and shutting down the TestBrowserProcess 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class InitBrowserProcess { 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InitBrowserProcess() { 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!g_browser_process); 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) g_browser_process = new TestingBrowserProcess; 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ~InitBrowserProcess() { 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(g_browser_process); 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delete g_browser_process; 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) g_browser_process = NULL; 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Probabilities of different word lengths, as measured from Darin's profile. 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// kWordLengthProbabilities[n-1] = P(word of length n) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const float kWordLengthProbabilities[] = { 0.069f, 0.132f, 0.199f, 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0.137f, 0.088f, 0.115f, 0.081f, 0.055f, 0.034f, 0.021f, 0.019f, 0.018f, 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0.007f, 0.007f, 0.005f, 0.004f, 0.003f, 0.003f, 0.003f }; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Return a float uniformly in [0,1]. 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Useful for making probabilistic decisions. 64a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)inline float RandomFloat() { 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return rand() / static_cast<float>(RAND_MAX); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Return an integer uniformly in [min,max). 69a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)inline int RandomInt(int min, int max) { 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return min + (rand() % (max-min)); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Return a string of |count| lowercase random characters. 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)string16 RandomChars(int count) { 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) string16 str; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < count; ++i) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) str += L'a' + rand() % 26; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return str; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)string16 RandomWord() { 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(evanm): should we instead use the markov chain based 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // version of this that I already wrote? 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sample a word length from kWordLengthProbabilities. 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float sample = RandomFloat(); 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t i; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < arraysize(kWordLengthProbabilities); ++i) { 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sample -= kWordLengthProbabilities[i]; 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (sample < 0) break; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int word_length = i + 1; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return RandomChars(word_length); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Return a string of |count| random words. 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)string16 RandomWords(int count) { 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) string16 str; 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < count; ++i) { 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!str.empty()) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) str += L' '; 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) str += RandomWord(); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return str; 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Return a random URL-looking string. 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GURL ConstructRandomURL() { 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return GURL(ASCIIToUTF16("http://") + RandomChars(3) + ASCIIToUTF16(".com/") + 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RandomChars(RandomInt(5, 20))); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Return a random page title-looking string. 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)string16 ConstructRandomTitle() { 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return RandomWords(RandomInt(3, 15)); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Return a random string that could function as page contents. 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)string16 ConstructRandomPage() { 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return RandomWords(RandomInt(10, 4000)); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Insert a batch of |batch_size| URLs, starting at pageid |page_id|. 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void InsertURLBatch(Profile* profile, 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int page_id, 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int batch_size, 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int types) { 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HistoryService* history_service = 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HistoryServiceFactory::GetForProfile(profile, Profile::EXPLICIT_ACCESS); 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Probability of following a link on the current "page" 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (vs randomly jumping to a new page). 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const float kFollowLinkProbability = 0.85f; 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Probability of visiting a page we've visited before. 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const float kRevisitLinkProbability = 0.1f; 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Probability of a URL being "good enough" to revisit. 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const float kRevisitableURLProbability = 0.05f; 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Probability of a URL being the end of a redirect chain. 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const float kRedirectProbability = 0.05f; 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A list of URLs that we sometimes revisit. 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<GURL> revisit_urls; 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Scoping value for page IDs (required by the history service). 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* id_scope = reinterpret_cast<void*>(1); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 147a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) scoped_refptr<base::RefCountedMemory> google_bitmap( 148a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) new base::RefCountedStaticMemory(kGoogleThumbnail, 149a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) sizeof(kGoogleThumbnail))); 150a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) scoped_refptr<base::RefCountedMemory> weewar_bitmap( 151a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) new base::RefCountedStaticMemory(kWeewarThumbnail, 152a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) sizeof(kWeewarThumbnail))); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf("Inserting %d URLs...\n", batch_size); 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL previous_url; 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::PageTransition transition = content::PAGE_TRANSITION_TYPED; 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int end_page_id = page_id + batch_size; 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::TopSites* top_sites = profile->GetTopSites(); 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (; page_id < end_page_id; ++page_id) { 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Randomly decide whether this new URL simulates following a link or 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // whether it's a jump to a new URL. 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!previous_url.is_empty() && RandomFloat() < kFollowLinkProbability) { 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transition = content::PAGE_TRANSITION_LINK; 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) previous_url = GURL(); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transition = content::PAGE_TRANSITION_TYPED; 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Pick a URL, either newly at random or from our list of previously 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // visited URLs. 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url; 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!revisit_urls.empty() && RandomFloat() < kRevisitLinkProbability) { 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Draw a URL from revisit_urls at random. 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url = revisit_urls[RandomInt(0, static_cast<int>(revisit_urls.size()))]; 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) url = ConstructRandomURL(); 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Randomly construct a redirect chain. 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::RedirectList redirects; 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (RandomFloat() < kRedirectProbability) { 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int redir_count = RandomInt(1, 4); 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < redir_count; ++i) 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) redirects.push_back(ConstructRandomURL()); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) redirects.push_back(url); 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add all of this information to the history service. 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history_service->AddPage(url, base::Time::Now(), 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) id_scope, page_id, 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) previous_url, redirects, 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transition, history::SOURCE_BROWSED, true); 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThumbnailScore score(0.75, false, false); 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history_service->SetPageTitle(url, ConstructRandomTitle()); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (types & FULL_TEXT) 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history_service->SetPageContents(url, ConstructRandomPage()); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (types & TOP_SITES && top_sites) { 198a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) top_sites->SetPageThumbnailToJPEGBytes( 199a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) url, 200a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) (RandomInt(0, 2) == 0) ? google_bitmap.get() : weewar_bitmap.get(), 201a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) score); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) previous_url = url; 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (revisit_urls.empty() || RandomFloat() < kRevisitableURLProbability) 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) revisit_urls.push_back(url); 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 211a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} // namespace 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 213a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)bool GenerateProfile(GenerateProfileTypes types, 214a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) int url_count, 215a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) const base::FilePath& dst_dir) { 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!file_util::CreateDirectory(dst_dir)) { 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PLOG(ERROR) << "Unable to create directory " << dst_dir.value().c_str(); 218a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) return false; 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 221a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // We want this profile to be as deterministic as possible, so seed the 222a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // random number generator with the number of urls we're generating. 223a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) srand(static_cast<unsigned int>(url_count)); 224a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 225a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) printf("Creating profiles for testing...\n"); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InitBrowserProcess initialize_browser_process; 228a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) base::MessageLoopForUI message_loop; 229a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) content::TestBrowserThread ui_thread(BrowserThread::UI, &message_loop); 230a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) content::TestBrowserThread db_thread(BrowserThread::DB, &message_loop); 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestingProfile profile; 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile.CreateHistoryService(false, false); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (types & TOP_SITES) { 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile.CreateTopSites(); 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile.BlockUntilTopSitesLoaded(); 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The maximum number of URLs to insert into history in one batch. 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kBatchSize = 2000; 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int page_id = 0; 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (page_id < url_count) { 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int batch_size = std::min(kBatchSize, url_count - page_id); 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InsertURLBatch(&profile, page_id, batch_size, types); 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Run all pending messages to give TopSites a chance to catch up. 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) message_loop.RunUntilIdle(); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) page_id += batch_size; 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile.DestroyTopSites(); 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile.DestroyHistoryService(); 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) message_loop.RunUntilIdle(); 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 254868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::FileEnumerator file_iterator(profile.GetPath(), false, 255868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::FileEnumerator::FILES); 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath path = file_iterator.Next(); 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (!path.empty()) { 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath dst_file = dst_dir.Append(path.BaseName()); 2597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::DeleteFile(dst_file, false); 2607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!base::CopyFile(path, dst_file)) { 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PLOG(ERROR) << "Copying file failed"; 262a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) return false; 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) path = file_iterator.Next(); 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 267a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) printf("Finished creating profiles for testing.\n"); 268a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 269a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // Restore the random seed. 270a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) srand(static_cast<unsigned int>(Time::Now().ToInternalValue())); 271a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 272a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) return true; 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 274