merge_session_helper_unittest.cc revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include <algorithm>
6#include <string>
7#include <vector>
8
9#include "base/memory/ref_counted.h"
10#include "base/memory/scoped_ptr.h"
11#include "base/message_loop/message_loop.h"
12#include "base/strings/stringprintf.h"
13#include "google_apis/gaia/fake_oauth2_token_service.h"
14#include "google_apis/gaia/gaia_constants.h"
15#include "google_apis/gaia/merge_session_helper.h"
16#include "net/url_request/test_url_fetcher_factory.h"
17#include "net/url_request/url_request_test_util.h"
18#include "testing/gmock/include/gmock/gmock.h"
19#include "testing/gtest/include/gtest/gtest.h"
20
21namespace {
22
23class MockObserver : public MergeSessionHelper::Observer {
24 public:
25  explicit MockObserver(MergeSessionHelper* helper) : helper_(helper) {
26    helper_->AddObserver(this);
27  }
28
29  ~MockObserver() {
30    helper_->RemoveObserver(this);
31  }
32
33  MOCK_METHOD2(MergeSessionCompleted,
34               void(const std::string&,
35                    const GoogleServiceAuthError& ));
36 private:
37  MergeSessionHelper* helper_;
38
39  DISALLOW_COPY_AND_ASSIGN(MockObserver);
40};
41
42// Counts number of InstrumentedMergeSessionHelper created.
43// We can EXPECT_* to be zero at the end of our unit tests
44// to make sure everything is properly deleted.
45
46int total = 0;
47
48class InstrumentedMergeSessionHelper : public MergeSessionHelper {
49 public:
50  InstrumentedMergeSessionHelper(
51      OAuth2TokenService* token_service,
52      net::URLRequestContextGetter* request_context) :
53    MergeSessionHelper(token_service, request_context, NULL) {
54    total++;
55  }
56
57  virtual ~InstrumentedMergeSessionHelper() {
58    total--;
59  }
60
61  MOCK_METHOD0(StartFetching, void());
62  MOCK_METHOD0(StartLogOutUrlFetch, void());
63
64 private:
65  DISALLOW_COPY_AND_ASSIGN(InstrumentedMergeSessionHelper);
66};
67
68class MergeSessionHelperTest : public testing::Test {
69 public:
70   MergeSessionHelperTest()
71       : no_error_(GoogleServiceAuthError::NONE),
72         error_(GoogleServiceAuthError::SERVICE_ERROR),
73         canceled_(GoogleServiceAuthError::REQUEST_CANCELED),
74         request_context_getter_(new net::TestURLRequestContextGetter(
75             base::MessageLoopProxy::current())) {}
76
77  OAuth2TokenService* token_service() { return &token_service_; }
78  net::URLRequestContextGetter* request_context() {
79    return request_context_getter_;
80  }
81
82  void SimulateUbertokenFailure(UbertokenConsumer* consumer,
83                                const GoogleServiceAuthError& error) {
84    consumer->OnUbertokenFailure(error);
85  }
86
87  void SimulateMergeSessionSuccess(GaiaAuthConsumer* consumer,
88                                   const std::string& data) {
89    consumer->OnMergeSessionSuccess(data);
90  }
91
92  void SimulateMergeSessionFailure(GaiaAuthConsumer* consumer,
93                                   const GoogleServiceAuthError& error) {
94    consumer->OnMergeSessionFailure(error);
95  }
96
97  void SimulateLogoutSuccess(net::URLFetcherDelegate* consumer) {
98    consumer->OnURLFetchComplete(NULL);
99  }
100
101  const GoogleServiceAuthError& no_error() { return no_error_; }
102  const GoogleServiceAuthError& error() { return error_; }
103  const GoogleServiceAuthError& canceled() { return canceled_; }
104
105 private:
106  base::MessageLoop message_loop_;
107  net::TestURLFetcherFactory factory_;
108  FakeOAuth2TokenService token_service_;
109  GoogleServiceAuthError no_error_;
110  GoogleServiceAuthError error_;
111  GoogleServiceAuthError canceled_;
112  scoped_refptr<net::URLRequestContextGetter> request_context_getter_;
113};
114
115} // namespace
116
117using ::testing::_;
118
119TEST_F(MergeSessionHelperTest, Success) {
120  InstrumentedMergeSessionHelper helper(token_service(), request_context());
121  MockObserver observer(&helper);
122
123  EXPECT_CALL(helper, StartFetching());
124  EXPECT_CALL(observer, MergeSessionCompleted("acc1@gmail.com", no_error()));
125
126  helper.LogIn("acc1@gmail.com");
127  SimulateMergeSessionSuccess(&helper, "token");
128}
129
130TEST_F(MergeSessionHelperTest, FailedMergeSession) {
131  InstrumentedMergeSessionHelper helper(token_service(), request_context());
132  MockObserver observer(&helper);
133
134  EXPECT_CALL(helper, StartFetching());
135  EXPECT_CALL(observer, MergeSessionCompleted("acc1@gmail.com", error()));
136
137  helper.LogIn("acc1@gmail.com");
138  SimulateMergeSessionFailure(&helper, error());
139}
140
141TEST_F(MergeSessionHelperTest, FailedUbertoken) {
142  InstrumentedMergeSessionHelper helper(token_service(), request_context());
143  MockObserver observer(&helper);
144
145  EXPECT_CALL(helper, StartFetching());
146  EXPECT_CALL(observer, MergeSessionCompleted("acc1@gmail.com", error()));
147
148  helper.LogIn("acc1@gmail.com");
149  SimulateUbertokenFailure(&helper, error());
150}
151
152TEST_F(MergeSessionHelperTest, ContinueAfterSuccess) {
153  InstrumentedMergeSessionHelper helper(token_service(), request_context());
154  MockObserver observer(&helper);
155
156  EXPECT_CALL(helper, StartFetching()).Times(2);
157  EXPECT_CALL(observer, MergeSessionCompleted("acc1@gmail.com", no_error()));
158  EXPECT_CALL(observer, MergeSessionCompleted("acc2@gmail.com", no_error()));
159
160  helper.LogIn("acc1@gmail.com");
161  helper.LogIn("acc2@gmail.com");
162  SimulateMergeSessionSuccess(&helper, "token1");
163  SimulateMergeSessionSuccess(&helper, "token2");
164}
165
166TEST_F(MergeSessionHelperTest, ContinueAfterFailure1) {
167  InstrumentedMergeSessionHelper helper(token_service(), request_context());
168  MockObserver observer(&helper);
169
170  EXPECT_CALL(helper, StartFetching()).Times(2);
171  EXPECT_CALL(observer, MergeSessionCompleted("acc1@gmail.com", error()));
172  EXPECT_CALL(observer, MergeSessionCompleted("acc2@gmail.com", no_error()));
173
174  helper.LogIn("acc1@gmail.com");
175  helper.LogIn("acc2@gmail.com");
176  SimulateMergeSessionFailure(&helper, error());
177  SimulateMergeSessionSuccess(&helper, "token2");
178}
179
180TEST_F(MergeSessionHelperTest, ContinueAfterFailure2) {
181  InstrumentedMergeSessionHelper helper(token_service(), request_context());
182  MockObserver observer(&helper);
183
184  EXPECT_CALL(helper, StartFetching()).Times(2);
185  EXPECT_CALL(observer, MergeSessionCompleted("acc1@gmail.com", error()));
186  EXPECT_CALL(observer, MergeSessionCompleted("acc2@gmail.com", no_error()));
187
188  helper.LogIn("acc1@gmail.com");
189  helper.LogIn("acc2@gmail.com");
190  SimulateUbertokenFailure(&helper, error());
191  SimulateMergeSessionSuccess(&helper, "token2");
192}
193
194TEST_F(MergeSessionHelperTest, AllRequestsInMultipleGoes) {
195  InstrumentedMergeSessionHelper helper(token_service(), request_context());
196  MockObserver observer(&helper);
197
198  EXPECT_CALL(helper, StartFetching()).Times(4);
199  EXPECT_CALL(observer, MergeSessionCompleted(_, no_error())).Times(4);
200
201  helper.LogIn("acc1@gmail.com");
202  helper.LogIn("acc2@gmail.com");
203
204  SimulateMergeSessionSuccess(&helper, "token1");
205
206  helper.LogIn("acc3@gmail.com");
207
208  SimulateMergeSessionSuccess(&helper, "token2");
209  SimulateMergeSessionSuccess(&helper, "token3");
210
211  helper.LogIn("acc4@gmail.com");
212
213  SimulateMergeSessionSuccess(&helper, "token4");
214}
215
216TEST_F(MergeSessionHelperTest, LogOut) {
217  InstrumentedMergeSessionHelper helper(token_service(), request_context());
218  MockObserver observer(&helper);
219
220  std::vector<std::string> current_accounts;
221  current_accounts.push_back("acc1@gmail.com");
222  current_accounts.push_back("acc2@gmail.com");
223  current_accounts.push_back("acc3@gmail.com");
224
225  EXPECT_CALL(helper, StartLogOutUrlFetch());
226  EXPECT_CALL(helper, StartFetching()).Times(2);
227  EXPECT_CALL(observer, MergeSessionCompleted("acc1@gmail.com", no_error()));
228  EXPECT_CALL(observer, MergeSessionCompleted("acc3@gmail.com", no_error()));
229
230  helper.LogOut("acc2@gmail.com", current_accounts);
231  SimulateLogoutSuccess(&helper);
232  SimulateMergeSessionSuccess(&helper, "token1");
233  SimulateMergeSessionSuccess(&helper, "token3");
234}
235
236TEST_F(MergeSessionHelperTest, PendingSigninThenSignout) {
237  InstrumentedMergeSessionHelper helper(token_service(), request_context());
238  MockObserver observer(&helper);
239
240  std::vector<std::string> current_accounts;
241  current_accounts.push_back("acc2@gmail.com");
242  current_accounts.push_back("acc3@gmail.com");
243
244  // From the first Signin.
245  EXPECT_CALL(observer, MergeSessionCompleted("acc1@gmail.com", no_error()));
246
247  // From the sign out and then re-sign in.
248  EXPECT_CALL(helper, StartLogOutUrlFetch());
249  EXPECT_CALL(observer, MergeSessionCompleted("acc3@gmail.com", no_error()));
250
251  // Total sign in 2 times, not enforcing ordered sequences.
252  EXPECT_CALL(helper, StartFetching()).Times(2);
253
254  helper.LogIn("acc1@gmail.com");
255  helper.LogOut("acc2@gmail.com", current_accounts);
256
257  SimulateMergeSessionSuccess(&helper, "token1");
258  SimulateLogoutSuccess(&helper);
259  SimulateMergeSessionSuccess(&helper, "token3");
260}
261
262TEST_F(MergeSessionHelperTest, CancelSignIn) {
263  InstrumentedMergeSessionHelper helper(token_service(), request_context());
264  MockObserver observer(&helper);
265
266  std::vector<std::string> current_accounts;
267
268  EXPECT_CALL(helper, StartFetching());
269  EXPECT_CALL(observer, MergeSessionCompleted("acc2@gmail.com", canceled()));
270  EXPECT_CALL(observer, MergeSessionCompleted("acc1@gmail.com", no_error()));
271  EXPECT_CALL(helper, StartLogOutUrlFetch());
272
273  helper.LogIn("acc1@gmail.com");
274  helper.LogIn("acc2@gmail.com");
275  helper.LogOut("acc2@gmail.com", current_accounts);
276
277  SimulateMergeSessionSuccess(&helper, "token1");
278  SimulateLogoutSuccess(&helper);
279}
280
281TEST_F(MergeSessionHelperTest, DoubleSignout) {
282  InstrumentedMergeSessionHelper helper(token_service(), request_context());
283  MockObserver observer(&helper);
284
285  std::vector<std::string> current_accounts1;
286  current_accounts1.push_back("acc1@gmail.com");
287  current_accounts1.push_back("acc2@gmail.com");
288  current_accounts1.push_back("acc3@gmail.com");
289
290  std::vector<std::string> current_accounts2;
291  current_accounts2.push_back("acc1@gmail.com");
292  current_accounts2.push_back("acc3@gmail.com");
293
294  EXPECT_CALL(helper, StartFetching()).Times(2);
295  EXPECT_CALL(observer, MergeSessionCompleted("acc3@gmail.com", canceled()));
296  EXPECT_CALL(observer,
297      MergeSessionCompleted("acc1@gmail.com", no_error())).Times(2);
298  EXPECT_CALL(helper, StartLogOutUrlFetch());
299
300  helper.LogIn("acc1@gmail.com");
301  helper.LogOut("acc2@gmail.com", current_accounts1);
302  helper.LogOut("acc3@gmail.com", current_accounts2);
303
304  SimulateMergeSessionSuccess(&helper, "token1");
305  SimulateLogoutSuccess(&helper);
306  SimulateMergeSessionSuccess(&helper, "token1");
307}
308