// 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 <errno.h>
#include <string>
#include "chrome/browser/chromeos/login/client_login_response_handler.h"
#include "chrome/browser/chromeos/login/cookie_fetcher.h"
#include "chrome/browser/chromeos/login/issue_response_handler.h"
#include "chrome/browser/chromeos/login/mock_auth_response_handler.h"
#include "chrome/common/net/url_fetcher.h"
#include "chrome/test/testing_profile.h"
#include "content/browser/browser_thread.h"
#include "googleurl/src/gurl.h"
#include "net/url_request/url_request_status.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace chromeos {
using ::testing::Return;
using ::testing::Invoke;
using ::testing::Unused;
using ::testing::_;
class CookieFetcherTest : public ::testing::Test {
public:
CookieFetcherTest()
: iat_url_(AuthResponseHandler::kIssueAuthTokenUrl),
ta_url_(AuthResponseHandler::kTokenAuthUrl),
client_login_data_("SID n' LSID"),
token_("auth token"),
ui_thread_(BrowserThread::UI, &message_loop_) {
}
const GURL iat_url_;
const GURL ta_url_;
const std::string client_login_data_;
const std::string token_;
MessageLoopForUI message_loop_;
BrowserThread ui_thread_;
TestingProfile profile_;
};
// Check that successful HTTP responses from both end points results in
// the browser window getting put up.
TEST_F(CookieFetcherTest, SuccessfulFetchTest) {
net::URLRequestStatus status(net::URLRequestStatus::SUCCESS, 0);
MockAuthResponseHandler* cl_handler =
new MockAuthResponseHandler(iat_url_, status, kHttpSuccess, token_);
MockAuthResponseHandler* i_handler =
new MockAuthResponseHandler(ta_url_, status, kHttpSuccess, std::string());
CookieFetcher* cf = new CookieFetcher(NULL, cl_handler, i_handler);
EXPECT_CALL(*cl_handler, Handle(client_login_data_, cf))
.Times(1);
EXPECT_CALL(*i_handler, CanHandle(iat_url_))
.WillOnce(Return(true));
EXPECT_CALL(*i_handler, CanHandle(ta_url_))
.WillOnce(Return(false));
EXPECT_CALL(*i_handler, Handle(token_, cf))
.Times(1);
cf->AttemptFetch(client_login_data_);
message_loop_.RunAllPending();
}
// Check that a network failure when trying IssueAuthToken results in us bailing
// and putting up the browser window.
TEST_F(CookieFetcherTest, IssueAuthTokenNetworkFailureTest) {
net::URLRequestStatus failed(net::URLRequestStatus::FAILED, ECONNRESET);
MockAuthResponseHandler* cl_handler =
new MockAuthResponseHandler(iat_url_, failed, kHttpSuccess, token_);
// I expect nothing in i_handler to get called anyway
MockAuthResponseHandler* i_handler =
new MockAuthResponseHandler(ta_url_, failed, kHttpSuccess, std::string());
CookieFetcher* cf = new CookieFetcher(&profile_,
cl_handler,
i_handler);
EXPECT_CALL(*cl_handler, Handle(client_login_data_, cf))
.Times(1);
cf->AttemptFetch(client_login_data_);
message_loop_.RunAllPending();
}
// Check that a network failure when trying TokenAuth results in us bailing
// and putting up the browser window.
TEST_F(CookieFetcherTest, TokenAuthNetworkFailureTest) {
net::URLRequestStatus success;
net::URLRequestStatus failed(net::URLRequestStatus::FAILED, ECONNRESET);
MockAuthResponseHandler* cl_handler =
new MockAuthResponseHandler(iat_url_, success, kHttpSuccess, token_);
MockAuthResponseHandler* i_handler =
new MockAuthResponseHandler(ta_url_, failed, 0, std::string());
CookieFetcher* cf = new CookieFetcher(&profile_,
cl_handler,
i_handler);
EXPECT_CALL(*cl_handler, Handle(client_login_data_, cf))
.Times(1);
EXPECT_CALL(*i_handler, CanHandle(iat_url_))
.WillOnce(Return(true));
EXPECT_CALL(*i_handler, Handle(token_, cf))
.Times(1);
cf->AttemptFetch(client_login_data_);
message_loop_.RunAllPending();
}
// Check that an unsuccessful HTTP response when trying IssueAuthToken results
// in us bailing and putting up the browser window.
TEST_F(CookieFetcherTest, IssueAuthTokenDeniedTest) {
net::URLRequestStatus success;
MockAuthResponseHandler* cl_handler =
new MockAuthResponseHandler(iat_url_, success, 403, std::string());
// I expect nothing in i_handler to get called anyway.
MockAuthResponseHandler* i_handler =
new MockAuthResponseHandler(ta_url_, success, 0, std::string());
CookieFetcher* cf = new CookieFetcher(&profile_,
cl_handler,
i_handler);
EXPECT_CALL(*cl_handler, Handle(client_login_data_, cf))
.Times(1);
cf->AttemptFetch(client_login_data_);
message_loop_.RunAllPending();
}
// Check that an unsuccessful HTTP response when trying TokenAuth results
// in us bailing and putting up the browser window.
TEST_F(CookieFetcherTest, TokenAuthDeniedTest) {
net::URLRequestStatus success;
MockAuthResponseHandler* cl_handler =
new MockAuthResponseHandler(iat_url_,
success,
kHttpSuccess,
token_);
MockAuthResponseHandler* i_handler =
new MockAuthResponseHandler(ta_url_, success, 403, std::string());
CookieFetcher* cf = new CookieFetcher(&profile_,
cl_handler,
i_handler);
EXPECT_CALL(*cl_handler, Handle(client_login_data_, cf))
.Times(1);
EXPECT_CALL(*i_handler, CanHandle(iat_url_))
.WillOnce(Return(true));
EXPECT_CALL(*i_handler, Handle(token_, cf))
.Times(1);
cf->AttemptFetch(client_login_data_);
message_loop_.RunAllPending();
}
TEST_F(CookieFetcherTest, ClientLoginResponseHandlerTest) {
ClientLoginResponseHandler handler(NULL);
std::string input("a\nb\n");
std::string expected("a&b&");
expected.append(ClientLoginResponseHandler::kService);
scoped_ptr<URLFetcher> fetcher(handler.Handle(input, NULL));
EXPECT_EQ(expected, handler.payload());
}
TEST_F(CookieFetcherTest, IssueResponseHandlerTest) {
IssueResponseHandler handler(NULL);
std::string input("a\n");
std::string expected(IssueResponseHandler::kTokenAuthUrl);
expected.append(input);
scoped_ptr<URLFetcher> fetcher(handler.Handle(input, NULL));
EXPECT_EQ(expected, handler.token_url());
}
} // namespace chromeos