1eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Copyright 2013 The Chromium Authors. All rights reserved.
2eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// found in the LICENSE file.
4eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
5eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/profile_resetter/profile_resetter.h"
6eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
7eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/bind.h"
8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/profile_resetter/profile_resetter_test_base.h"
9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/profiles/profile.h"
10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/ui/browser.h"
11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/test/base/in_process_browser_test.h"
12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/public/test/test_utils.h"
13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "net/cookies/cookie_store.h"
14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "net/url_request/url_request_context.h"
15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "net/url_request/url_request_context_getter.h"
16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace {
18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochconst char kCookieDefinition[] = "A=1";
20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochconst char kCookieHostname[] = "http://host1";
21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochusing content::BrowserThread;
23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// RemoveCookieTester provides the user with the ability to set and get a
25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// cookie for given profile.
26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass RemoveCookieTester {
27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public:
28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  explicit RemoveCookieTester(Profile* profile);
29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ~RemoveCookieTester();
30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  std::string GetCookie(const std::string& host);
32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void AddCookie(const std::string& host, const std::string& definition);
33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch private:
35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void GetCookieOnIOThread(net::URLRequestContextGetter* context_getter,
36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                           const std::string& host);
37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void SetCookieOnIOThread(net::URLRequestContextGetter* context_getter,
38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                           const std::string& host,
39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                           const std::string& definition);
40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void GetCookieCallback(const std::string& cookies);
41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void SetCookieCallback(bool result);
42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void BlockUntilNotified();
44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void Notify();
45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  std::string last_cookies_;
47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  bool waiting_callback_;
48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  Profile* profile_;
49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_refptr<content::MessageLoopRunner> runner_;
50eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DISALLOW_COPY_AND_ASSIGN(RemoveCookieTester);
52eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch};
53eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochRemoveCookieTester::RemoveCookieTester(Profile* profile)
55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    : waiting_callback_(false),
56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      profile_(profile) {
57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
58eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
59eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochRemoveCookieTester::~RemoveCookieTester() {}
60eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
61eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Returns true, if the given cookie exists in the cookie store.
62eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochstd::string RemoveCookieTester::GetCookie(const std::string& host) {
63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  last_cookies_.clear();
64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DCHECK(!waiting_callback_);
65eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  waiting_callback_ = true;
66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  BrowserThread::PostTask(
67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      BrowserThread::IO, FROM_HERE,
68eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      base::Bind(&RemoveCookieTester::GetCookieOnIOThread,
69eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                 base::Unretained(this),
70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                 base::Unretained(profile_->GetRequestContext()),
71eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                 host));
72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  BlockUntilNotified();
73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return last_cookies_;
74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
76eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid RemoveCookieTester::AddCookie(const std::string& host,
77eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                   const std::string& definition) {
78eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DCHECK(!waiting_callback_);
79eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  waiting_callback_ = true;
80eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  BrowserThread::PostTask(
81eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      BrowserThread::IO, FROM_HERE,
82eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      base::Bind(&RemoveCookieTester::SetCookieOnIOThread,
83eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                 base::Unretained(this),
84eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                 base::Unretained(profile_->GetRequestContext()),
85eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                 host,
86eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                 definition));
87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  BlockUntilNotified();
88eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
89eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
90eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid RemoveCookieTester::GetCookieOnIOThread(
91eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    net::URLRequestContextGetter* context_getter,
92eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const std::string& host) {
93eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
94eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  net::CookieStore* cookie_store = context_getter->
95eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      GetURLRequestContext()->cookie_store();
96eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  cookie_store->GetCookiesWithOptionsAsync(
97eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      GURL(host), net::CookieOptions(),
98eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      base::Bind(&RemoveCookieTester::GetCookieCallback,
99eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                 base::Unretained(this)));
100eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
101eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
102eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid RemoveCookieTester::SetCookieOnIOThread(
103eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    net::URLRequestContextGetter* context_getter,
104eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const std::string& host,
105eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const std::string& definition) {
106eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
107eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  net::CookieStore* cookie_store = context_getter->
108eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      GetURLRequestContext()->cookie_store();
109eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  cookie_store->SetCookieWithOptionsAsync(
110eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      GURL(host), definition, net::CookieOptions(),
111eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      base::Bind(&RemoveCookieTester::SetCookieCallback,
112eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                 base::Unretained(this)));
113eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
114eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
115eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid RemoveCookieTester::GetCookieCallback(const std::string& cookies) {
116eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) {
117eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    BrowserThread::PostTask(
118eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        BrowserThread::UI, FROM_HERE,
119eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        base::Bind(&RemoveCookieTester::GetCookieCallback,
120eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                   base::Unretained(this), cookies));
121eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return;
122eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
123eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  last_cookies_ = cookies;
124eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  Notify();
125eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
126eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
127eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid RemoveCookieTester::SetCookieCallback(bool result) {
128eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) {
129eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    BrowserThread::PostTask(
130eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        BrowserThread::UI, FROM_HERE,
131eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        base::Bind(&RemoveCookieTester::SetCookieCallback,
132eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                   base::Unretained(this), result));
133eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return;
134eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
135eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(result);
136eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  Notify();
137eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
138eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
139eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid RemoveCookieTester::BlockUntilNotified() {
140eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DCHECK(!runner_.get());
141eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (waiting_callback_) {
142eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    runner_ = new content::MessageLoopRunner;
143eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    runner_->Run();
144eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    runner_ = NULL;
145eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
146eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
147eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
148eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid RemoveCookieTester::Notify() {
149eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DCHECK(waiting_callback_);
150eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  waiting_callback_ = false;
151eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (runner_.get())
152eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    runner_->Quit();
153eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
154eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
155eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass ProfileResetTest : public InProcessBrowserTest,
156eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                         public ProfileResetterTestBase {
157eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch protected:
158eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void SetUpOnMainThread() OVERRIDE {
159eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    resetter_.reset(new ProfileResetter(browser()->profile()));
160eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
161eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch};
162eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
163eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
164eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochIN_PROC_BROWSER_TEST_F(ProfileResetTest, ResetCookiesAndSiteData) {
165eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  RemoveCookieTester tester(browser()->profile());
166eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  tester.AddCookie(kCookieHostname, kCookieDefinition);
167eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_EQ(kCookieDefinition, tester.GetCookie(kCookieHostname));
168eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ResetAndWait(ProfileResetter::COOKIES_AND_SITE_DATA);
170eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
171eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ("", tester.GetCookie(kCookieHostname));
172eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
173eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
174eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}  // namespace
175