| Index: chrome/browser/net/gaia/token_service_unittest.h
|
| ===================================================================
|
| --- chrome/browser/net/gaia/token_service_unittest.h (revision 0)
|
| +++ chrome/browser/net/gaia/token_service_unittest.h (revision 0)
|
| @@ -0,0 +1,130 @@
|
| +// Copyright (c) 2010 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.
|
| +//
|
| +// This file defines a unit test harness for the profile's token service.
|
| +
|
| +#ifndef CHROME_BROWSER_NET_GAIA_TOKEN_SERVICE_UNITTEST_H_
|
| +#define CHROME_BROWSER_NET_GAIA_TOKEN_SERVICE_UNITTEST_H_
|
| +#pragma once
|
| +
|
| +#include "chrome/browser/net/gaia/token_service.h"
|
| +#include "chrome/browser/password_manager/encryptor.h"
|
| +#include "chrome/browser/webdata/web_data_service.h"
|
| +#include "chrome/common/net/gaia/gaia_auth_consumer.h"
|
| +#include "chrome/test/signaling_task.h"
|
| +#include "chrome/test/test_notification_tracker.h"
|
| +#include "chrome/test/testing_profile.h"
|
| +#include "testing/gtest/include/gtest/gtest.h"
|
| +
|
| +// TestNotificationTracker doesn't do a deep copy on the notification details.
|
| +// We have to in order to read it out, or we have a bad ptr, since the details
|
| +// are a reference on the stack.
|
| +class TokenAvailableTracker : public TestNotificationTracker {
|
| + public:
|
| + const TokenService::TokenAvailableDetails& details() {
|
| + return details_;
|
| + }
|
| +
|
| + private:
|
| + virtual void Observe(NotificationType type,
|
| + const NotificationSource& source,
|
| + const NotificationDetails& details) {
|
| + TestNotificationTracker::Observe(type, source, details);
|
| + if (type == NotificationType::TOKEN_AVAILABLE) {
|
| + Details<const TokenService::TokenAvailableDetails> full = details;
|
| + details_ = *full.ptr();
|
| + }
|
| + }
|
| +
|
| + TokenService::TokenAvailableDetails details_;
|
| +};
|
| +
|
| +class TokenFailedTracker : public TestNotificationTracker {
|
| + public:
|
| + const TokenService::TokenRequestFailedDetails& details() {
|
| + return details_;
|
| + }
|
| +
|
| + private:
|
| + virtual void Observe(NotificationType type,
|
| + const NotificationSource& source,
|
| + const NotificationDetails& details) {
|
| + TestNotificationTracker::Observe(type, source, details);
|
| + if (type == NotificationType::TOKEN_REQUEST_FAILED) {
|
| + Details<const TokenService::TokenRequestFailedDetails> full = details;
|
| + details_ = *full.ptr();
|
| + }
|
| + }
|
| +
|
| + TokenService::TokenRequestFailedDetails details_;
|
| +};
|
| +
|
| +class TokenServiceTestHarness : public testing::Test {
|
| + public:
|
| + TokenServiceTestHarness()
|
| + : ui_thread_(ChromeThread::UI, &message_loop_),
|
| + db_thread_(ChromeThread::DB) {
|
| + }
|
| +
|
| + virtual void SetUp() {
|
| +#if defined(OS_MACOSX)
|
| + Encryptor::UseMockKeychain(true);
|
| +#endif
|
| + credentials_.sid = "sid";
|
| + credentials_.lsid = "lsid";
|
| + credentials_.token = "token";
|
| + credentials_.data = "data";
|
| +
|
| + ASSERT_TRUE(db_thread_.Start());
|
| +
|
| + profile_.reset(new TestingProfile());
|
| + profile_->CreateWebDataService(false);
|
| + WaitForDBLoadCompletion();
|
| +
|
| + success_tracker_.ListenFor(NotificationType::TOKEN_AVAILABLE,
|
| + Source<TokenService>(&service_));
|
| + failure_tracker_.ListenFor(NotificationType::TOKEN_REQUEST_FAILED,
|
| + Source<TokenService>(&service_));
|
| +
|
| + service_.Initialize("test", profile_.get());
|
| +
|
| + URLFetcher::set_factory(NULL);
|
| + }
|
| +
|
| + virtual void TearDown() {
|
| + // You have to destroy the profile before the db_thread_ stops.
|
| + if (profile_.get()) {
|
| + profile_.reset(NULL);
|
| + }
|
| +
|
| + db_thread_.Stop();
|
| + MessageLoop::current()->PostTask(FROM_HERE, new MessageLoop::QuitTask);
|
| + MessageLoop::current()->Run();
|
| + }
|
| +
|
| + void WaitForDBLoadCompletion() {
|
| + // The WebDB does all work on the DB thread. This will add an event
|
| + // to the end of the DB thread, so when we reach this task, all DB
|
| + // operations should be complete.
|
| + WaitableEvent done(false, false);
|
| + ChromeThread::PostTask(
|
| + ChromeThread::DB, FROM_HERE, new SignalingTask(&done));
|
| + done.Wait();
|
| +
|
| + // Notifications should be returned from the DB thread onto the UI thread.
|
| + message_loop_.RunAllPending();
|
| + }
|
| +
|
| + MessageLoopForUI message_loop_;
|
| + ChromeThread ui_thread_; // Mostly so DCHECKS pass.
|
| + ChromeThread db_thread_; // WDS on here
|
| +
|
| + TokenService service_;
|
| + TokenAvailableTracker success_tracker_;
|
| + TokenFailedTracker failure_tracker_;
|
| + GaiaAuthConsumer::ClientLoginResult credentials_;
|
| + scoped_ptr<TestingProfile> profile_;
|
| +};
|
| +
|
| +#endif // CHROME_BROWSER_NET_GAIA_TOKEN_SERVICE_UNITTEST_H_
|
|
|