// 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/message_loop/message_loop.h"
#include "chrome/browser/local_discovery/privet_confirm_api_flow.h"
-#include "content/public/test/test_browser_thread.h"
-#include "google_apis/gaia/fake_oauth2_token_service.h"
-#include "google_apis/gaia/google_service_auth_error.h"
-#include "net/base/host_port_pair.h"
-#include "net/base/net_errors.h"
-#include "net/http/http_request_headers.h"
-#include "net/url_request/test_url_fetcher_factory.h"
-#include "net/url_request/url_request_test_util.h"
+
+#include <set>
+
+#include "base/json/json_reader.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
-using testing::NiceMock;
+using testing::StrictMock;
+using testing::_;
namespace local_discovery {
" \"success\": false"
"}";
-const char kFailedConfirmResponseBadJson[] = "["
- " \"success\""
- "]";
-
-const char kGCDConfirmResponse[] =
- "{"
- " \"kind\": \"clouddevices#registrationTicket\""
- "}";
-
-const char kAccountId[] = "account_id";
-
-class MockableConfirmCallback {
- public:
- MOCK_METHOD1(ConfirmCallback, void(GCDBaseApiFlow::Status));
-
- PrivetConfirmApiCallFlow::ResponseCallback callback() {
- return base::Bind(&MockableConfirmCallback::ConfirmCallback,
- base::Unretained(this));
- }
-};
+TEST(PrivetConfirmApiFlowTest, Params) {
+ PrivetConfirmApiCallFlow confirmation(
+ "123", PrivetConfirmApiCallFlow::ResponseCallback());
+ EXPECT_EQ(GURL("https://www.google.com/cloudprint/confirm?token=123"),
+ confirmation.GetURL());
+ EXPECT_EQ("https://www.googleapis.com/auth/cloudprint",
+ confirmation.GetOAuthScope());
+ EXPECT_EQ(net::URLFetcher::GET, confirmation.GetRequestType());
+ EXPECT_FALSE(confirmation.GetExtraRequestHeaders().empty());
+}
-class PrivetConfirmApiFlowTest : public testing::Test {
+class MockDelegate {
public:
- PrivetConfirmApiFlowTest()
- : ui_thread_(content::BrowserThread::UI,
- &loop_),
- request_context_(new net::TestURLRequestContextGetter(
- base::MessageLoopProxy::current())),
- account_id_(kAccountId) {
- token_service_.set_request_context(request_context_.get());
- token_service_.AddAccount(account_id_);
- ui_thread_.Stop(); // HACK: Fake being on the UI thread
- }
-
- virtual ~PrivetConfirmApiFlowTest() {
- }
-
- protected:
- base::MessageLoopForUI loop_;
- content::TestBrowserThread ui_thread_;
- scoped_refptr<net::TestURLRequestContextGetter> request_context_;
- net::TestURLFetcherFactory fetcher_factory_;
- FakeOAuth2TokenService token_service_;
- MockableConfirmCallback callback_;
- std::string account_id_;
+ MOCK_METHOD1(Callback, void(GCDApiFlow::Status));
};
-TEST_F(PrivetConfirmApiFlowTest, SuccessOAuth2) {
- PrivetConfirmApiCallFlow confirm_flow(request_context_.get(),
- &token_service_,
- account_id_,
- true,
- "SomeToken",
- callback_.callback());
- GCDBaseApiFlow* cloudprint_flow = confirm_flow.GetBaseApiFlowForTests();
-
- confirm_flow.Start();
-
- cloudprint_flow->OnGetTokenSuccess(NULL, "SomeToken", base::Time());
- net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0);
-
- EXPECT_EQ(GURL("https://www.google.com/cloudprint/confirm?token=SomeToken"),
- fetcher->GetOriginalURL());
-
- net::HttpRequestHeaders headers;
- fetcher->GetExtraRequestHeaders(&headers);
- std::string oauth_header;
- std::string proxy;
- EXPECT_TRUE(headers.GetHeader("Authorization", &oauth_header));
- EXPECT_EQ("Bearer SomeToken", oauth_header);
- EXPECT_TRUE(headers.GetHeader("X-Cloudprint-Proxy", &proxy));
- EXPECT_EQ("Chrome", proxy);
-
- fetcher->SetResponseString(kSampleConfirmResponse);
- fetcher->set_status(net::URLRequestStatus(net::URLRequestStatus::SUCCESS,
- net::OK));
- fetcher->set_response_code(200);
-
- EXPECT_CALL(callback_, ConfirmCallback(GCDBaseApiFlow::SUCCESS));
-
- fetcher->delegate()->OnURLFetchComplete(fetcher);
-}
-
-TEST_F(PrivetConfirmApiFlowTest, BadToken) {
- PrivetConfirmApiCallFlow confirm_flow(request_context_.get(),
- &token_service_,
- account_id_,
- true,
- "SomeCloudprintToken",
- callback_.callback());
-
- confirm_flow.Start();
-
- GCDBaseApiFlow* cloudprint_flow = confirm_flow.GetBaseApiFlowForTests();
-
- EXPECT_CALL(callback_, ConfirmCallback(GCDBaseApiFlow::ERROR_TOKEN));
- cloudprint_flow->OnGetTokenFailure(NULL, GoogleServiceAuthError(
- GoogleServiceAuthError::USER_NOT_SIGNED_UP));
-}
-
-TEST_F(PrivetConfirmApiFlowTest, ServerFailure) {
- PrivetConfirmApiCallFlow confirm_flow(request_context_.get(),
- &token_service_,
- account_id_,
- true,
- "SomeToken",
- callback_.callback());
-
- confirm_flow.Start();
-
- GCDBaseApiFlow* cloudprint_flow = confirm_flow.GetBaseApiFlowForTests();
-
- cloudprint_flow->OnGetTokenSuccess(NULL, "SomeToken", base::Time());
- net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0);
-
- EXPECT_EQ(GURL("https://www.google.com/cloudprint/confirm?token=SomeToken"),
- fetcher->GetOriginalURL());
-
- fetcher->SetResponseString(kFailedConfirmResponse);
- fetcher->set_status(net::URLRequestStatus(net::URLRequestStatus::SUCCESS,
- net::OK));
- fetcher->set_response_code(200);
-
- EXPECT_CALL(callback_, ConfirmCallback(GCDBaseApiFlow::ERROR_FROM_SERVER));
-
- fetcher->delegate()->OnURLFetchComplete(fetcher);
-}
-
-TEST_F(PrivetConfirmApiFlowTest, BadJson) {
- PrivetConfirmApiCallFlow confirm_flow(request_context_.get(),
- &token_service_,
- account_id_,
- true,
- "SomeToken",
- callback_.callback());
-
- confirm_flow.Start();
-
- GCDBaseApiFlow* cloudprint_flow = confirm_flow.GetBaseApiFlowForTests();
-
- cloudprint_flow->OnGetTokenSuccess(NULL, "SomeToken", base::Time());
- net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0);
-
- EXPECT_EQ(GURL("https://www.google.com/cloudprint/confirm?token=SomeToken"),
- fetcher->GetOriginalURL());
-
- fetcher->SetResponseString(kFailedConfirmResponseBadJson);
- fetcher->set_status(net::URLRequestStatus(
- net::URLRequestStatus::SUCCESS,
- net::OK));
- fetcher->set_response_code(200);
-
- EXPECT_CALL(callback_,
- ConfirmCallback(GCDBaseApiFlow::ERROR_MALFORMED_RESPONSE));
-
- fetcher->delegate()->OnURLFetchComplete(fetcher);
-}
-
-TEST_F(PrivetConfirmApiFlowTest, SuccessGCD) {
- PrivetConfirmApiCallFlow confirm_flow(request_context_.get(),
- &token_service_,
- account_id_,
- false,
- "SomeGcdToken",
- callback_.callback());
- GCDBaseApiFlow* gcd_flow = confirm_flow.GetBaseApiFlowForTests();
-
- confirm_flow.Start();
-
- gcd_flow->OnGetTokenSuccess(NULL, "SomeToken", base::Time());
- net::TestURLFetcher* fetcher = fetcher_factory_.GetFetcherByID(0);
-
- EXPECT_EQ(GURL("https://www.googleapis.com/clouddevices/v1/"
- "registrationTickets/SomeGcdToken"),
- fetcher->GetOriginalURL());
-
- EXPECT_EQ("{ \"userEmail\": \"me\" }", fetcher->upload_data());
-
- net::HttpRequestHeaders headers;
- fetcher->GetExtraRequestHeaders(&headers);
- std::string oauth_header;
- std::string proxy;
- EXPECT_TRUE(headers.GetHeader("Authorization", &oauth_header));
- EXPECT_EQ("Bearer SomeToken", oauth_header);
- EXPECT_FALSE(headers.GetHeader("X-Cloudprint-Proxy", &proxy));
+TEST(PrivetConfirmApiFlowTest, Parsing) {
+ StrictMock<MockDelegate> delegate;
+ PrivetConfirmApiCallFlow confirmation(
+ "123", base::Bind(&MockDelegate::Callback, base::Unretained(&delegate)));
+ EXPECT_CALL(delegate, Callback(GCDApiFlow::SUCCESS)).Times(1);
- fetcher->SetResponseString(kGCDConfirmResponse);
- fetcher->set_status(
- net::URLRequestStatus(net::URLRequestStatus::SUCCESS, net::OK));
- fetcher->set_response_code(200);
+ scoped_ptr<base::Value> value(base::JSONReader::Read(kSampleConfirmResponse));
+ const base::DictionaryValue* dictionary = NULL;
+ ASSERT_TRUE(value->GetAsDictionary(&dictionary));
+ confirmation.OnGCDAPIFlowComplete(*dictionary);
- EXPECT_CALL(callback_, ConfirmCallback(GCDBaseApiFlow::SUCCESS));
+ EXPECT_CALL(delegate, Callback(GCDApiFlow::ERROR_FROM_SERVER)).Times(1);
- fetcher->delegate()->OnURLFetchComplete(fetcher);
+ value.reset(base::JSONReader::Read(kFailedConfirmResponse));
+ ASSERT_TRUE(value->GetAsDictionary(&dictionary));
+ confirmation.OnGCDAPIFlowComplete(*dictionary);
}
} // namespace