blob: 36acb04841fbbc41671440c76852b12ff58c1d66 [file] [log] [blame]
// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "base/bind.h"
#include "base/bind_helpers.h"
#include "base/strings/string_util.h"
#include "base/strings/utf_string_conversions.h"
#include "chrome/browser/geolocation/chrome_access_token_store.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "content/public/browser/access_token_store.h"
#include "content/public/test/test_browser_thread.h"
#include "content/public/test/test_utils.h"
using content::AccessTokenStore;
using content::BrowserThread;
namespace {
// The token store factory implementation expects to be used from any well-known
// chrome thread other than UI. We could use any arbitrary thread; IO is
// a good choice as this is the expected usage.
const BrowserThread::ID kExpectedClientThreadId = BrowserThread::IO;
const char* kRefServerUrl1 = "https://test.domain.example/foo?id=bar.bar";
const char* kRefServerUrl2 = "http://another.domain.example/foo?id=bar.bar#2";
const char* kOldDefaultNetworkProviderUrl = "https://www.google.com/loc/json";
class GeolocationAccessTokenStoreTest
: public InProcessBrowserTest {
public:
GeolocationAccessTokenStoreTest()
: token_to_expect_(NULL), token_to_set_(NULL) {}
void DoTestStepAndWaitForResults(
const char* ref_url, const base::string16* token_to_expect,
const base::string16* token_to_set);
void OnAccessTokenStoresLoaded(
AccessTokenStore::AccessTokenSet access_token_set,
net::URLRequestContextGetter* context_getter);
scoped_refptr<AccessTokenStore> token_store_;
GURL ref_url_;
const base::string16* token_to_expect_;
const base::string16* token_to_set_;
};
void StartTestStepFromClientThread(
scoped_refptr<AccessTokenStore>* store,
const AccessTokenStore::LoadAccessTokensCallbackType& callback) {
ASSERT_TRUE(BrowserThread::CurrentlyOn(kExpectedClientThreadId));
if (store->get() == NULL)
(*store) = new ChromeAccessTokenStore();
(*store)->LoadAccessTokens(callback);
}
struct TokenLoadClientForTest {
void NotReachedCallback(AccessTokenStore::AccessTokenSet /*tokens*/,
net::URLRequestContextGetter* /*context_getter*/) {
NOTREACHED() << "This request should have been canceled before callback";
}
};
void GeolocationAccessTokenStoreTest::DoTestStepAndWaitForResults(
const char* ref_url, const base::string16* token_to_expect,
const base::string16* token_to_set) {
ref_url_ = GURL(ref_url);
token_to_expect_ = token_to_expect;
token_to_set_ = token_to_set;
BrowserThread::PostTask(
kExpectedClientThreadId, FROM_HERE,
base::Bind(
&StartTestStepFromClientThread,
&token_store_,
base::Bind(
&GeolocationAccessTokenStoreTest::OnAccessTokenStoresLoaded,
base::Unretained(this))));
content::RunMessageLoop();
}
void GeolocationAccessTokenStoreTest::OnAccessTokenStoresLoaded(
AccessTokenStore::AccessTokenSet access_token_set,
net::URLRequestContextGetter* context_getter) {
ASSERT_TRUE(BrowserThread::CurrentlyOn(kExpectedClientThreadId))
<< "Callback from token factory should be from the same thread as the "
"LoadAccessTokenStores request was made on";
DCHECK(context_getter);
AccessTokenStore::AccessTokenSet::const_iterator item =
access_token_set.find(ref_url_);
if (!token_to_expect_) {
EXPECT_TRUE(item == access_token_set.end());
} else {
EXPECT_FALSE(item == access_token_set.end());
EXPECT_EQ(*token_to_expect_, item->second);
}
if (token_to_set_) {
scoped_refptr<AccessTokenStore> store(new ChromeAccessTokenStore());
store->SaveAccessToken(ref_url_, *token_to_set_);
}
BrowserThread::PostTask(
BrowserThread::UI, FROM_HERE, base::MessageLoop::QuitClosure());
}
IN_PROC_BROWSER_TEST_F(GeolocationAccessTokenStoreTest, SetAcrossInstances) {
const base::string16 ref_token1 = base::ASCIIToUTF16("jksdfo90,'s#\"#1*(");
const base::string16 ref_token2 =
base::ASCIIToUTF16("\1\2\3\4\5\6\7\10\11\12=023");
ASSERT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::UI));
DoTestStepAndWaitForResults(kRefServerUrl1, NULL, &ref_token1);
// Check it was set, and change to new value.
DoTestStepAndWaitForResults(kRefServerUrl1, &ref_token1, &ref_token2);
// And change back.
DoTestStepAndWaitForResults(kRefServerUrl1, &ref_token2, &ref_token1);
DoTestStepAndWaitForResults(kRefServerUrl1, &ref_token1, NULL);
// Set a second server URL
DoTestStepAndWaitForResults(kRefServerUrl2, NULL, &ref_token2);
DoTestStepAndWaitForResults(kRefServerUrl2, &ref_token2, NULL);
DoTestStepAndWaitForResults(kRefServerUrl1, &ref_token1, NULL);
}
IN_PROC_BROWSER_TEST_F(GeolocationAccessTokenStoreTest, OldUrlRemoval) {
const base::string16 ref_token1 = base::ASCIIToUTF16("jksdfo90,'s#\"#1*(");
ASSERT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::UI));
// Set a token for the old default network provider url.
DoTestStepAndWaitForResults(kOldDefaultNetworkProviderUrl,
NULL, &ref_token1);
// Check that the token related to the old default network provider url
// was deleted.
DoTestStepAndWaitForResults(kOldDefaultNetworkProviderUrl,
NULL, NULL);
}
} // namespace