| Index: chrome/browser/net/sqlite_persistent_cookie_store_unittest.cc
 | 
| diff --git a/chrome/browser/net/sqlite_persistent_cookie_store_unittest.cc b/chrome/browser/net/sqlite_persistent_cookie_store_unittest.cc
 | 
| index 4744d759992092ccf8196148012c67346f219df4..7569599413d80d6391b3d03d1bc35963e67596f4 100644
 | 
| --- a/chrome/browser/net/sqlite_persistent_cookie_store_unittest.cc
 | 
| +++ b/chrome/browser/net/sqlite_persistent_cookie_store_unittest.cc
 | 
| @@ -11,14 +11,15 @@
 | 
|  #include "base/files/scoped_temp_dir.h"
 | 
|  #include "base/memory/ref_counted.h"
 | 
|  #include "base/message_loop.h"
 | 
| +#include "base/sequenced_task_runner.h"
 | 
|  #include "base/stl_util.h"
 | 
|  #include "base/synchronization/waitable_event.h"
 | 
| -#include "base/test/thread_test_helper.h"
 | 
| +#include "base/test/sequenced_worker_pool_owner.h"
 | 
| +#include "base/threading/sequenced_worker_pool.h"
 | 
|  #include "base/time.h"
 | 
|  #include "chrome/browser/net/clear_on_exit_policy.h"
 | 
|  #include "chrome/browser/net/sqlite_persistent_cookie_store.h"
 | 
|  #include "chrome/common/chrome_constants.h"
 | 
| -#include "content/public/test/test_browser_thread.h"
 | 
|  #include "googleurl/src/gurl.h"
 | 
|  #include "net/cookies/canonical_cookie.h"
 | 
|  #include "sql/connection.h"
 | 
| @@ -26,16 +27,12 @@
 | 
|  #include "testing/gtest/include/gtest/gtest.h"
 | 
|  #include "webkit/quota/mock_special_storage_policy.h"
 | 
|  
 | 
| -using content::BrowserThread;
 | 
| -
 | 
|  typedef std::vector<net::CanonicalCookie*> CanonicalCookieVector;
 | 
|  
 | 
|  class SQLitePersistentCookieStoreTest : public testing::Test {
 | 
|   public:
 | 
|    SQLitePersistentCookieStoreTest()
 | 
| -      : ui_thread_(BrowserThread::UI),
 | 
| -        db_thread_(BrowserThread::DB),
 | 
| -        io_thread_(BrowserThread::IO),
 | 
| +      : pool_owner_(new base::SequencedWorkerPoolOwner(3, "Background Pool")),
 | 
|          loaded_event_(false, false),
 | 
|          key_loaded_event_(false, false),
 | 
|          db_thread_event_(false, false) {
 | 
| @@ -52,26 +49,46 @@ class SQLitePersistentCookieStoreTest : public testing::Test {
 | 
|    }
 | 
|  
 | 
|    void Load(CanonicalCookieVector* cookies) {
 | 
| +    EXPECT_FALSE(loaded_event_.IsSignaled());
 | 
|      store_->Load(base::Bind(&SQLitePersistentCookieStoreTest::OnLoaded,
 | 
|                              base::Unretained(this)));
 | 
|      loaded_event_.Wait();
 | 
|      *cookies = cookies_;
 | 
|    }
 | 
|  
 | 
| +  void Flush() {
 | 
| +    base::WaitableEvent event(false, false);
 | 
| +    store_->Flush(base::Bind(&base::WaitableEvent::Signal,
 | 
| +                             base::Unretained(&event)));
 | 
| +    event.Wait();
 | 
| +  }
 | 
| +
 | 
| +  scoped_refptr<base::SequencedTaskRunner> background_task_runner() {
 | 
| +    return pool_owner_->pool()->GetSequencedTaskRunner(
 | 
| +        pool_owner_->pool()->GetNamedSequenceToken("background"));
 | 
| +  }
 | 
| +
 | 
| +  scoped_refptr<base::SequencedTaskRunner> client_task_runner() {
 | 
| +    return pool_owner_->pool()->GetSequencedTaskRunner(
 | 
| +        pool_owner_->pool()->GetNamedSequenceToken("client"));
 | 
| +  }
 | 
| +
 | 
|    void DestroyStore() {
 | 
|      store_ = NULL;
 | 
| -    // Make sure we wait until the destructor has run by waiting for all pending
 | 
| -    // tasks on the DB thread to run.
 | 
| -    scoped_refptr<base::ThreadTestHelper> helper(
 | 
| -        new base::ThreadTestHelper(
 | 
| -            BrowserThread::GetMessageLoopProxyForThread(BrowserThread::DB)));
 | 
| -    ASSERT_TRUE(helper->Run());
 | 
| +    // Make sure we wait until the destructor has run by shutting down the pool
 | 
| +    // resetting the owner (whose destructor blocks on the pool completion).
 | 
| +    pool_owner_->pool()->Shutdown();
 | 
| +    // Create a new pool for the few tests that create multiple stores. In other
 | 
| +    // cases this is wasted but harmless.
 | 
| +    pool_owner_.reset(new base::SequencedWorkerPoolOwner(3, "Background Pool"));
 | 
|    }
 | 
|  
 | 
|    void CreateAndLoad(bool restore_old_session_cookies,
 | 
|                       CanonicalCookieVector* cookies) {
 | 
|      store_ = new SQLitePersistentCookieStore(
 | 
|          temp_dir_.path().Append(chrome::kCookieFilename),
 | 
| +        client_task_runner(),
 | 
| +        background_task_runner(),
 | 
|          restore_old_session_cookies,
 | 
|          NULL);
 | 
|      Load(cookies);
 | 
| @@ -80,7 +97,7 @@ class SQLitePersistentCookieStoreTest : public testing::Test {
 | 
|    void InitializeStore(bool restore_old_session_cookies) {
 | 
|      CanonicalCookieVector cookies;
 | 
|      CreateAndLoad(restore_old_session_cookies, &cookies);
 | 
| -    ASSERT_EQ(0U, cookies.size());
 | 
| +    EXPECT_EQ(0U, cookies.size());
 | 
|    }
 | 
|  
 | 
|    // We have to create this method to wrap WaitableEvent::Wait, since we cannot
 | 
| @@ -101,17 +118,18 @@ class SQLitePersistentCookieStoreTest : public testing::Test {
 | 
|                               false));
 | 
|    }
 | 
|  
 | 
| -  virtual void SetUp() {
 | 
| -    ui_thread_.Start();
 | 
| -    db_thread_.Start();
 | 
| -    io_thread_.Start();
 | 
| +  virtual void SetUp() OVERRIDE {
 | 
|      ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
 | 
|    }
 | 
|  
 | 
| +  virtual void TearDown() OVERRIDE {
 | 
| +    DestroyStore();
 | 
| +    pool_owner_->pool()->Shutdown();
 | 
| +  }
 | 
| +
 | 
|   protected:
 | 
| -  content::TestBrowserThread ui_thread_;
 | 
| -  content::TestBrowserThread db_thread_;
 | 
| -  content::TestBrowserThread io_thread_;
 | 
| +  MessageLoop main_loop_;
 | 
| +  scoped_ptr<base::SequencedWorkerPoolOwner> pool_owner_;
 | 
|    base::WaitableEvent loaded_event_;
 | 
|    base::WaitableEvent key_loaded_event_;
 | 
|    base::WaitableEvent db_thread_event_;
 | 
| @@ -201,11 +219,14 @@ TEST_F(SQLitePersistentCookieStoreTest, TestLoadCookiesForKey) {
 | 
|    DestroyStore();
 | 
|  
 | 
|    store_ = new SQLitePersistentCookieStore(
 | 
| -      temp_dir_.path().Append(chrome::kCookieFilename), false, NULL);
 | 
| +      temp_dir_.path().Append(chrome::kCookieFilename),
 | 
| +      client_task_runner(),
 | 
| +      background_task_runner(),
 | 
| +      false, NULL);
 | 
|    // Posting a blocking task to db_thread_ makes sure that the DB thread waits
 | 
|    // until both Load and LoadCookiesForKey have been posted to its task queue.
 | 
| -  BrowserThread::PostTask(
 | 
| -      BrowserThread::DB, FROM_HERE,
 | 
| +  background_task_runner()->PostTask(
 | 
| +      FROM_HERE,
 | 
|        base::Bind(&SQLitePersistentCookieStoreTest::WaitOnDBEvent,
 | 
|                   base::Unretained(this)));
 | 
|    store_->Load(base::Bind(&SQLitePersistentCookieStoreTest::OnLoaded,
 | 
| @@ -213,8 +234,8 @@ TEST_F(SQLitePersistentCookieStoreTest, TestLoadCookiesForKey) {
 | 
|    store_->LoadCookiesForKey("aaa.com",
 | 
|      base::Bind(&SQLitePersistentCookieStoreTest::OnKeyLoaded,
 | 
|                 base::Unretained(this)));
 | 
| -  BrowserThread::PostTask(
 | 
| -      BrowserThread::DB, FROM_HERE,
 | 
| +  background_task_runner()->PostTask(
 | 
| +      FROM_HERE,
 | 
|        base::Bind(&SQLitePersistentCookieStoreTest::WaitOnDBEvent,
 | 
|                   base::Unretained(this)));
 | 
|  
 | 
| @@ -273,59 +294,13 @@ TEST_F(SQLitePersistentCookieStoreTest, TestFlush) {
 | 
|      AddCookie(name, value, "foo.bar", "/", t);
 | 
|    }
 | 
|  
 | 
| -  // Call Flush() and wait until the DB thread is idle.
 | 
| -  store_->Flush(base::Closure());
 | 
| -  scoped_refptr<base::ThreadTestHelper> helper(
 | 
| -      new base::ThreadTestHelper(
 | 
| -          BrowserThread::GetMessageLoopProxyForThread(BrowserThread::DB)));
 | 
| -  ASSERT_TRUE(helper->Run());
 | 
| +  Flush();
 | 
|  
 | 
|    // We forced a write, so now the file will be bigger.
 | 
|    ASSERT_TRUE(file_util::GetFileInfo(path, &info));
 | 
|    ASSERT_GT(info.size, base_size);
 | 
|  }
 | 
|  
 | 
| -// Counts the number of times Callback() has been run.
 | 
| -class CallbackCounter : public base::RefCountedThreadSafe<CallbackCounter> {
 | 
| - public:
 | 
| -  CallbackCounter() : callback_count_(0) {}
 | 
| -
 | 
| -  void Callback() {
 | 
| -    ++callback_count_;
 | 
| -  }
 | 
| -
 | 
| -  int callback_count() {
 | 
| -    return callback_count_;
 | 
| -  }
 | 
| -
 | 
| - private:
 | 
| -  friend class base::RefCountedThreadSafe<CallbackCounter>;
 | 
| -  ~CallbackCounter() {}
 | 
| -
 | 
| -  volatile int callback_count_;
 | 
| -};
 | 
| -
 | 
| -// Test that we can get a completion callback after a Flush().
 | 
| -TEST_F(SQLitePersistentCookieStoreTest, TestFlushCompletionCallback) {
 | 
| -  InitializeStore(false);
 | 
| -  // Put some data - any data - on disk, so that Flush is not a no-op.
 | 
| -  AddCookie("A", "B", "foo.bar", "/", base::Time::Now());
 | 
| -
 | 
| -  scoped_refptr<CallbackCounter> counter(new CallbackCounter());
 | 
| -
 | 
| -  // Callback shouldn't be invoked until we call Flush().
 | 
| -  ASSERT_EQ(0, counter->callback_count());
 | 
| -
 | 
| -  store_->Flush(base::Bind(&CallbackCounter::Callback, counter.get()));
 | 
| -
 | 
| -  scoped_refptr<base::ThreadTestHelper> helper(
 | 
| -      new base::ThreadTestHelper(
 | 
| -          BrowserThread::GetMessageLoopProxyForThread(BrowserThread::DB)));
 | 
| -  ASSERT_TRUE(helper->Run());
 | 
| -
 | 
| -  ASSERT_EQ(1, counter->callback_count());
 | 
| -}
 | 
| -
 | 
|  // Test loading old session cookies from the disk.
 | 
|  TEST_F(SQLitePersistentCookieStoreTest, TestLoadOldSessionCookies) {
 | 
|    InitializeStore(true);
 | 
| 
 |