summaryrefslogtreecommitdiffstats
path: root/chromium/google_apis/gaia/merge_session_helper_unittest.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/google_apis/gaia/merge_session_helper_unittest.cc')
-rw-r--r--chromium/google_apis/gaia/merge_session_helper_unittest.cc307
1 files changed, 307 insertions, 0 deletions
diff --git a/chromium/google_apis/gaia/merge_session_helper_unittest.cc b/chromium/google_apis/gaia/merge_session_helper_unittest.cc
new file mode 100644
index 00000000000..1fbe8a6898a
--- /dev/null
+++ b/chromium/google_apis/gaia/merge_session_helper_unittest.cc
@@ -0,0 +1,307 @@
+// Copyright 2014 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 <algorithm>
+#include <string>
+#include <vector>
+
+#include "base/memory/ref_counted.h"
+#include "base/memory/scoped_ptr.h"
+#include "base/message_loop/message_loop.h"
+#include "base/strings/stringprintf.h"
+#include "google_apis/gaia/fake_oauth2_token_service.h"
+#include "google_apis/gaia/gaia_constants.h"
+#include "google_apis/gaia/merge_session_helper.h"
+#include "net/url_request/test_url_fetcher_factory.h"
+#include "net/url_request/url_request_test_util.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace {
+
+class MockObserver : public MergeSessionHelper::Observer {
+ public:
+ explicit MockObserver(MergeSessionHelper* helper) : helper_(helper) {
+ helper_->AddObserver(this);
+ }
+
+ ~MockObserver() {
+ helper_->RemoveObserver(this);
+ }
+
+ MOCK_METHOD2(MergeSessionCompleted,
+ void(const std::string&,
+ const GoogleServiceAuthError& ));
+ private:
+ MergeSessionHelper* helper_;
+
+ DISALLOW_COPY_AND_ASSIGN(MockObserver);
+};
+
+// Counts number of InstrumentedMergeSessionHelper created.
+// We can EXPECT_* to be zero at the end of our unit tests
+// to make sure everything is properly deleted.
+
+int total = 0;
+
+class InstrumentedMergeSessionHelper : public MergeSessionHelper {
+ public:
+ InstrumentedMergeSessionHelper(
+ OAuth2TokenService* token_service,
+ net::URLRequestContextGetter* request_context) :
+ MergeSessionHelper(token_service, request_context, NULL) {
+ total++;
+ }
+
+ virtual ~InstrumentedMergeSessionHelper() {
+ total--;
+ }
+
+ MOCK_METHOD0(StartFetching, void());
+ MOCK_METHOD0(StartLogOutUrlFetch, void());
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(InstrumentedMergeSessionHelper);
+};
+
+class MergeSessionHelperTest : public testing::Test {
+ public:
+ MergeSessionHelperTest()
+ : no_error_(GoogleServiceAuthError::NONE),
+ error_(GoogleServiceAuthError::SERVICE_ERROR),
+ canceled_(GoogleServiceAuthError::REQUEST_CANCELED),
+ request_context_getter_(new net::TestURLRequestContextGetter(
+ base::MessageLoopProxy::current())) {}
+
+ OAuth2TokenService* token_service() { return &token_service_; }
+ net::URLRequestContextGetter* request_context() {
+ return request_context_getter_;
+ }
+
+ void SimulateUbertokenFailure(UbertokenConsumer* consumer,
+ const GoogleServiceAuthError& error) {
+ consumer->OnUbertokenFailure(error);
+ }
+
+ void SimulateMergeSessionSuccess(GaiaAuthConsumer* consumer,
+ const std::string& data) {
+ consumer->OnMergeSessionSuccess(data);
+ }
+
+ void SimulateMergeSessionFailure(GaiaAuthConsumer* consumer,
+ const GoogleServiceAuthError& error) {
+ consumer->OnMergeSessionFailure(error);
+ }
+
+ void SimulateLogoutSuccess(net::URLFetcherDelegate* consumer) {
+ consumer->OnURLFetchComplete(NULL);
+ }
+
+ const GoogleServiceAuthError& no_error() { return no_error_; }
+ const GoogleServiceAuthError& error() { return error_; }
+ const GoogleServiceAuthError& canceled() { return canceled_; }
+
+ private:
+ base::MessageLoop message_loop_;
+ net::TestURLFetcherFactory factory_;
+ FakeOAuth2TokenService token_service_;
+ GoogleServiceAuthError no_error_;
+ GoogleServiceAuthError error_;
+ GoogleServiceAuthError canceled_;
+ scoped_refptr<net::URLRequestContextGetter> request_context_getter_;
+};
+
+} // namespace
+
+using ::testing::_;
+
+TEST_F(MergeSessionHelperTest, Success) {
+ InstrumentedMergeSessionHelper helper(token_service(), request_context());
+ MockObserver observer(&helper);
+
+ EXPECT_CALL(helper, StartFetching());
+ EXPECT_CALL(observer, MergeSessionCompleted("acc1@gmail.com", no_error()));
+
+ helper.LogIn("acc1@gmail.com");
+ SimulateMergeSessionSuccess(&helper, "token");
+}
+
+TEST_F(MergeSessionHelperTest, FailedMergeSession) {
+ InstrumentedMergeSessionHelper helper(token_service(), request_context());
+ MockObserver observer(&helper);
+
+ EXPECT_CALL(helper, StartFetching());
+ EXPECT_CALL(observer, MergeSessionCompleted("acc1@gmail.com", error()));
+
+ helper.LogIn("acc1@gmail.com");
+ SimulateMergeSessionFailure(&helper, error());
+}
+
+TEST_F(MergeSessionHelperTest, FailedUbertoken) {
+ InstrumentedMergeSessionHelper helper(token_service(), request_context());
+ MockObserver observer(&helper);
+
+ EXPECT_CALL(helper, StartFetching());
+ EXPECT_CALL(observer, MergeSessionCompleted("acc1@gmail.com", error()));
+
+ helper.LogIn("acc1@gmail.com");
+ SimulateUbertokenFailure(&helper, error());
+}
+
+TEST_F(MergeSessionHelperTest, ContinueAfterSuccess) {
+ InstrumentedMergeSessionHelper helper(token_service(), request_context());
+ MockObserver observer(&helper);
+
+ EXPECT_CALL(helper, StartFetching()).Times(2);
+ EXPECT_CALL(observer, MergeSessionCompleted("acc1@gmail.com", no_error()));
+ EXPECT_CALL(observer, MergeSessionCompleted("acc2@gmail.com", no_error()));
+
+ helper.LogIn("acc1@gmail.com");
+ helper.LogIn("acc2@gmail.com");
+ SimulateMergeSessionSuccess(&helper, "token1");
+ SimulateMergeSessionSuccess(&helper, "token2");
+}
+
+TEST_F(MergeSessionHelperTest, ContinueAfterFailure1) {
+ InstrumentedMergeSessionHelper helper(token_service(), request_context());
+ MockObserver observer(&helper);
+
+ EXPECT_CALL(helper, StartFetching()).Times(2);
+ EXPECT_CALL(observer, MergeSessionCompleted("acc1@gmail.com", error()));
+ EXPECT_CALL(observer, MergeSessionCompleted("acc2@gmail.com", no_error()));
+
+ helper.LogIn("acc1@gmail.com");
+ helper.LogIn("acc2@gmail.com");
+ SimulateMergeSessionFailure(&helper, error());
+ SimulateMergeSessionSuccess(&helper, "token2");
+}
+
+TEST_F(MergeSessionHelperTest, ContinueAfterFailure2) {
+ InstrumentedMergeSessionHelper helper(token_service(), request_context());
+ MockObserver observer(&helper);
+
+ EXPECT_CALL(helper, StartFetching()).Times(2);
+ EXPECT_CALL(observer, MergeSessionCompleted("acc1@gmail.com", error()));
+ EXPECT_CALL(observer, MergeSessionCompleted("acc2@gmail.com", no_error()));
+
+ helper.LogIn("acc1@gmail.com");
+ helper.LogIn("acc2@gmail.com");
+ SimulateUbertokenFailure(&helper, error());
+ SimulateMergeSessionSuccess(&helper, "token2");
+}
+
+TEST_F(MergeSessionHelperTest, AllRequestsInMultipleGoes) {
+ InstrumentedMergeSessionHelper helper(token_service(), request_context());
+ MockObserver observer(&helper);
+
+ EXPECT_CALL(helper, StartFetching()).Times(4);
+ EXPECT_CALL(observer, MergeSessionCompleted(_, no_error())).Times(4);
+
+ helper.LogIn("acc1@gmail.com");
+ helper.LogIn("acc2@gmail.com");
+
+ SimulateMergeSessionSuccess(&helper, "token1");
+
+ helper.LogIn("acc3@gmail.com");
+
+ SimulateMergeSessionSuccess(&helper, "token2");
+ SimulateMergeSessionSuccess(&helper, "token3");
+
+ helper.LogIn("acc4@gmail.com");
+
+ SimulateMergeSessionSuccess(&helper, "token4");
+}
+
+TEST_F(MergeSessionHelperTest, LogOut) {
+ InstrumentedMergeSessionHelper helper(token_service(), request_context());
+ MockObserver observer(&helper);
+
+ std::vector<std::string> current_accounts;
+ current_accounts.push_back("acc1@gmail.com");
+ current_accounts.push_back("acc2@gmail.com");
+ current_accounts.push_back("acc3@gmail.com");
+
+ EXPECT_CALL(helper, StartLogOutUrlFetch());
+ EXPECT_CALL(helper, StartFetching()).Times(2);
+ EXPECT_CALL(observer, MergeSessionCompleted("acc1@gmail.com", no_error()));
+ EXPECT_CALL(observer, MergeSessionCompleted("acc3@gmail.com", no_error()));
+
+ helper.LogOut("acc2@gmail.com", current_accounts);
+ SimulateLogoutSuccess(&helper);
+ SimulateMergeSessionSuccess(&helper, "token1");
+ SimulateMergeSessionSuccess(&helper, "token3");
+}
+
+TEST_F(MergeSessionHelperTest, PendingSigninThenSignout) {
+ InstrumentedMergeSessionHelper helper(token_service(), request_context());
+ MockObserver observer(&helper);
+
+ std::vector<std::string> current_accounts;
+ current_accounts.push_back("acc2@gmail.com");
+ current_accounts.push_back("acc3@gmail.com");
+
+ // From the first Signin.
+ EXPECT_CALL(observer, MergeSessionCompleted("acc1@gmail.com", no_error()));
+
+ // From the sign out and then re-sign in.
+ EXPECT_CALL(helper, StartLogOutUrlFetch());
+ EXPECT_CALL(observer, MergeSessionCompleted("acc3@gmail.com", no_error()));
+
+ // Total sign in 2 times, not enforcing ordered sequences.
+ EXPECT_CALL(helper, StartFetching()).Times(2);
+
+ helper.LogIn("acc1@gmail.com");
+ helper.LogOut("acc2@gmail.com", current_accounts);
+
+ SimulateMergeSessionSuccess(&helper, "token1");
+ SimulateLogoutSuccess(&helper);
+ SimulateMergeSessionSuccess(&helper, "token3");
+}
+
+TEST_F(MergeSessionHelperTest, CancelSignIn) {
+ InstrumentedMergeSessionHelper helper(token_service(), request_context());
+ MockObserver observer(&helper);
+
+ std::vector<std::string> current_accounts;
+
+ EXPECT_CALL(helper, StartFetching());
+ EXPECT_CALL(observer, MergeSessionCompleted("acc2@gmail.com", canceled()));
+ EXPECT_CALL(observer, MergeSessionCompleted("acc1@gmail.com", no_error()));
+ EXPECT_CALL(helper, StartLogOutUrlFetch());
+
+ helper.LogIn("acc1@gmail.com");
+ helper.LogIn("acc2@gmail.com");
+ helper.LogOut("acc2@gmail.com", current_accounts);
+
+ SimulateMergeSessionSuccess(&helper, "token1");
+ SimulateLogoutSuccess(&helper);
+}
+
+TEST_F(MergeSessionHelperTest, DoubleSignout) {
+ InstrumentedMergeSessionHelper helper(token_service(), request_context());
+ MockObserver observer(&helper);
+
+ std::vector<std::string> current_accounts1;
+ current_accounts1.push_back("acc1@gmail.com");
+ current_accounts1.push_back("acc2@gmail.com");
+ current_accounts1.push_back("acc3@gmail.com");
+
+ std::vector<std::string> current_accounts2;
+ current_accounts2.push_back("acc1@gmail.com");
+ current_accounts2.push_back("acc3@gmail.com");
+
+ EXPECT_CALL(helper, StartFetching()).Times(2);
+ EXPECT_CALL(observer, MergeSessionCompleted("acc3@gmail.com", canceled()));
+ EXPECT_CALL(observer,
+ MergeSessionCompleted("acc1@gmail.com", no_error())).Times(2);
+ EXPECT_CALL(helper, StartLogOutUrlFetch());
+
+ helper.LogIn("acc1@gmail.com");
+ helper.LogOut("acc2@gmail.com", current_accounts1);
+ helper.LogOut("acc3@gmail.com", current_accounts2);
+
+ SimulateMergeSessionSuccess(&helper, "token1");
+ SimulateLogoutSuccess(&helper);
+ SimulateMergeSessionSuccess(&helper, "token1");
+}