Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(338)

Side by Side Diff: sync/notifier/gcm_network_channel_unittest.cc

Issue 140513002: Client-to-server messages in GCMNetworkChannel (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix mac build error (for real) Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « sync/notifier/gcm_network_channel_delegate.h ('k') | sync/notifier/non_blocking_invalidator.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/run_loop.h"
6 #include "google_apis/gaia/google_service_auth_error.h"
7 #include "net/url_request/test_url_fetcher_factory.h"
8 #include "net/url_request/url_request_test_util.h"
5 #include "sync/notifier/gcm_network_channel.h" 9 #include "sync/notifier/gcm_network_channel.h"
6
7 #include "base/compiler_specific.h"
8 #include "testing/gtest/include/gtest/gtest.h" 10 #include "testing/gtest/include/gtest/gtest.h"
9 11
10 namespace syncer { 12 namespace syncer {
11 namespace { 13 namespace {
12 14
15 class TestGCMNetworkChannelDelegate : public GCMNetworkChannelDelegate {
16 public:
17 virtual void RequestToken(RequestTokenCallback callback) OVERRIDE {
18 request_token_callback = callback;
19 }
20
21 virtual void InvalidateToken(const std::string& token) OVERRIDE {
22 invalidated_token = token;
23 }
24
25 virtual void Register(RegisterCallback callback) OVERRIDE {
26 register_callback = callback;
27 }
28
29 RequestTokenCallback request_token_callback;
30 std::string invalidated_token;
31 RegisterCallback register_callback;
32 };
33
13 class GCMNetworkChannelTest 34 class GCMNetworkChannelTest
14 : public ::testing::Test, 35 : public ::testing::Test,
15 public SyncNetworkChannel::Observer { 36 public SyncNetworkChannel::Observer {
16 protected: 37 protected:
17 GCMNetworkChannelTest() 38 GCMNetworkChannelTest()
18 : gcm_network_channel_() { 39 : delegate_(NULL),
19 gcm_network_channel_.AddObserver(this); 40 url_fetchers_created_count_(0) {
20 gcm_network_channel_.SetMessageReceiver(
21 invalidation::NewPermanentCallback(
22 this, &GCMNetworkChannelTest::OnIncomingMessage));
23 } 41 }
24 42
25 virtual ~GCMNetworkChannelTest() { 43 virtual ~GCMNetworkChannelTest() {
26 gcm_network_channel_.RemoveObserver(this); 44 }
45
46 virtual void SetUp() {
47 request_context_getter_ = new net::TestURLRequestContextGetter(
48 base::MessageLoopProxy::current());
49 // Ownership of delegate goes to GCNMentworkChannel but test needs pointer
50 // to it.
51 delegate_ = new TestGCMNetworkChannelDelegate();
52 scoped_ptr<GCMNetworkChannelDelegate> delegate(delegate_);
53 gcm_network_channel_.reset(new GCMNetworkChannel(request_context_getter_,
54 delegate.Pass()));
55 gcm_network_channel_->AddObserver(this);
56 gcm_network_channel_->SetMessageReceiver(
57 invalidation::NewPermanentCallback(
58 this, &GCMNetworkChannelTest::OnIncomingMessage));
59 url_fetcher_factory_.reset(new net::FakeURLFetcherFactory(NULL,
60 base::Bind(&GCMNetworkChannelTest::CreateURLFetcher,
61 base::Unretained(this))));
62 }
63
64 virtual void TearDown() {
65 gcm_network_channel_->RemoveObserver(this);
27 } 66 }
28 67
29 virtual void OnNetworkChannelStateChanged( 68 virtual void OnNetworkChannelStateChanged(
30 InvalidatorState invalidator_state) OVERRIDE { 69 InvalidatorState invalidator_state) OVERRIDE {
31 } 70 }
32 71
33 void OnIncomingMessage(std::string incoming_message) { 72 void OnIncomingMessage(std::string incoming_message) {
34 } 73 }
35 74
36 GCMNetworkChannel gcm_network_channel_; 75 GCMNetworkChannel* network_channel() {
76 return gcm_network_channel_.get();
77 }
78
79 TestGCMNetworkChannelDelegate* delegate() {
80 return delegate_;
81 }
82
83 int url_fetchers_created_count() {
84 return url_fetchers_created_count_;
85 }
86
87 net::FakeURLFetcherFactory* url_fetcher_factory() {
88 return url_fetcher_factory_.get();
89 }
90
91 scoped_ptr<net::FakeURLFetcher> CreateURLFetcher(
92 const GURL& url,
93 net::URLFetcherDelegate* delegate,
94 const std::string& response_data,
95 net::HttpStatusCode response_code,
96 net::URLRequestStatus::Status status) {
97 url_fetchers_created_count_++;
98 return scoped_ptr<net::FakeURLFetcher>(new net::FakeURLFetcher(
99 url, delegate, response_data, response_code, status));
100 }
101
102 private:
103 base::MessageLoop message_loop_;
104 TestGCMNetworkChannelDelegate* delegate_;
105 scoped_ptr<GCMNetworkChannel> gcm_network_channel_;
106 scoped_refptr<net::TestURLRequestContextGetter> request_context_getter_;
107 scoped_ptr<net::FakeURLFetcherFactory> url_fetcher_factory_;
108 int url_fetchers_created_count_;
37 }; 109 };
38 110
111 TEST_F(GCMNetworkChannelTest, HappyCase) {
112 GURL url("http://invalid.url.com");
113 url_fetcher_factory()->SetFakeResponse(url, std::string(), net::HTTP_OK,
114 net::URLRequestStatus::SUCCESS);
115
116 // After construction GCMNetworkChannel should have called Register.
117 EXPECT_FALSE(delegate()->register_callback.is_null());
118 // Return valid registration id.
119 delegate()->register_callback.Run("registration.id", gcm::GCMClient::SUCCESS);
120
121 network_channel()->SendMessage("abra.cadabra");
122 // SendMessage should have triggered RequestToken. No HTTP request should be
123 // started yet.
124 EXPECT_FALSE(delegate()->request_token_callback.is_null());
125 EXPECT_EQ(url_fetchers_created_count(), 0);
126 // Return valid access token. This should trigger HTTP request.
127 delegate()->request_token_callback.Run(
128 GoogleServiceAuthError::AuthErrorNone(), "access.token");
129 {
130 base::RunLoop run_loop;
131 run_loop.RunUntilIdle();
132 }
133 EXPECT_EQ(url_fetchers_created_count(), 1);
134
135 // Return another access token. Message should be cleared by now and shouldn't
136 // be sent.
137 delegate()->request_token_callback.Run(
138 GoogleServiceAuthError::AuthErrorNone(), "access.token2");
139 {
140 base::RunLoop run_loop;
141 run_loop.RunUntilIdle();
142 }
143 EXPECT_EQ(url_fetchers_created_count(), 1);
144 }
145
146 TEST_F(GCMNetworkChannelTest, FailedRegister) {
147 // After construction GCMNetworkChannel should have called Register.
148 EXPECT_FALSE(delegate()->register_callback.is_null());
149 // Return error from Register call.
150 delegate()->register_callback.Run("", gcm::GCMClient::SERVER_ERROR);
151
152 network_channel()->SendMessage("abra.cadabra");
153 // SendMessage shouldn't trigger RequestToken.
154 EXPECT_TRUE(delegate()->request_token_callback.is_null());
155 EXPECT_EQ(url_fetchers_created_count(), 0);
156 }
157
158 TEST_F(GCMNetworkChannelTest, RegisterFinishesAfterSendMessage) {
159 GURL url("http://invalid.url.com");
160 url_fetcher_factory()->SetFakeResponse(url, "", net::HTTP_OK,
161 net::URLRequestStatus::SUCCESS);
162
163 // After construction GCMNetworkChannel should have called Register.
164 EXPECT_FALSE(delegate()->register_callback.is_null());
165
166 network_channel()->SendMessage("abra.cadabra");
167 // SendMessage shouldn't trigger RequestToken.
168 EXPECT_TRUE(delegate()->request_token_callback.is_null());
169 EXPECT_EQ(url_fetchers_created_count(), 0);
170
171 // Return valid registration id.
172 delegate()->register_callback.Run("registration.id", gcm::GCMClient::SUCCESS);
173
174 EXPECT_FALSE(delegate()->request_token_callback.is_null());
175 EXPECT_EQ(url_fetchers_created_count(), 0);
176 // Return valid access token. This should trigger HTTP request.
177 delegate()->request_token_callback.Run(
178 GoogleServiceAuthError::AuthErrorNone(), "access.token");
179 {
180 base::RunLoop run_loop;
181 run_loop.RunUntilIdle();
182 }
183 EXPECT_EQ(url_fetchers_created_count(), 1);
184 }
185
186 TEST_F(GCMNetworkChannelTest, RequestTokenFailure) {
187 // After construction GCMNetworkChannel should have called Register.
188 EXPECT_FALSE(delegate()->register_callback.is_null());
189 // Return valid registration id.
190 delegate()->register_callback.Run("registration.id", gcm::GCMClient::SUCCESS);
191
192 network_channel()->SendMessage("abra.cadabra");
193 // SendMessage should have triggered RequestToken. No HTTP request should be
194 // started yet.
195 EXPECT_FALSE(delegate()->request_token_callback.is_null());
196 EXPECT_EQ(url_fetchers_created_count(), 0);
197 // RequestToken returns failure.
198 delegate()->request_token_callback.Run(
199 GoogleServiceAuthError::FromConnectionError(1), "");
200
201 // Should be no HTTP requests.
202 EXPECT_EQ(url_fetchers_created_count(), 0);
203 }
204
205 TEST_F(GCMNetworkChannelTest, AuthErrorFromServer) {
206 // Setup fake response to return AUTH_ERROR.
207 GURL url("http://invalid.url.com");
208 url_fetcher_factory()->SetFakeResponse(url, "", net::HTTP_UNAUTHORIZED,
209 net::URLRequestStatus::SUCCESS);
210
211 // After construction GCMNetworkChannel should have called Register.
212 EXPECT_FALSE(delegate()->register_callback.is_null());
213 // Return valid registration id.
214 delegate()->register_callback.Run("registration.id", gcm::GCMClient::SUCCESS);
215
216 network_channel()->SendMessage("abra.cadabra");
217 // SendMessage should have triggered RequestToken. No HTTP request should be
218 // started yet.
219 EXPECT_FALSE(delegate()->request_token_callback.is_null());
220 EXPECT_EQ(url_fetchers_created_count(), 0);
221 // Return valid access token. This should trigger HTTP request.
222 delegate()->request_token_callback.Run(
223 GoogleServiceAuthError::AuthErrorNone(), "access.token");
224 {
225 base::RunLoop run_loop;
226 run_loop.RunUntilIdle();
227 }
228 EXPECT_EQ(url_fetchers_created_count(), 1);
229 EXPECT_EQ(delegate()->invalidated_token, "access.token");
230 }
231
232 // Following two tests are to check for memory leaks/crashes when Register and
233 // RequestToken don't complete by the teardown.
234 TEST_F(GCMNetworkChannelTest, RegisterNeverCompletes) {
235 network_channel()->SendMessage("abra.cadabra");
236 // Register should be called by now. Let's not complete and see what happens.
237 EXPECT_FALSE(delegate()->register_callback.is_null());
238 }
239
240 TEST_F(GCMNetworkChannelTest, RequestTokenNeverCompletes) {
241 network_channel()->SendMessage("abra.cadabra");
242 // Return valid registration id.
243 delegate()->register_callback.Run("registration.id", gcm::GCMClient::SUCCESS);
244 // RequestToken should be called by now. Let's not complete and see what
245 // happens.
246 EXPECT_FALSE(delegate()->request_token_callback.is_null());
247 }
248
39 } // namespace 249 } // namespace
40 } // namespace syncer 250 } // namespace syncer
OLDNEW
« no previous file with comments | « sync/notifier/gcm_network_channel_delegate.h ('k') | sync/notifier/non_blocking_invalidator.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698