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