OLD | NEW |
---|---|
(Empty) | |
1 // Copyright (c) 2013 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 <string> | |
6 | |
7 #include "google_apis/gcm/engine/checkin_request.h" | |
8 #include "google_apis/gcm/protocol/checkin.pb.h" | |
9 #include "net/url_request/test_url_fetcher_factory.h" | |
10 #include "net/url_request/url_request_test_util.h" | |
11 #include "testing/gtest/include/gtest/gtest.h" | |
12 | |
13 namespace gcm { | |
14 | |
15 const uint64 kAndroidId = 42UL; | |
16 const uint64 kBlankAndroidId = 999999UL; | |
17 const uint64 kBlankSecurityToken = 999999UL; | |
18 const char kChromeVersion[] = "Version String"; | |
19 const uint64 kSecurityToken = 77; | |
20 const int64 kUserSerialNumber = 7; | |
21 | |
22 class CheckinRequestTest : public testing::Test { | |
23 public: | |
24 enum MissingValue { | |
25 MISSING_ANDROID_ID, | |
26 MISSING_SECURITY_TOKEN | |
27 }; | |
28 | |
29 CheckinRequestTest(); | |
30 virtual ~CheckinRequestTest(); | |
31 | |
32 checkin_proto::ChromeBuildProto CreateChromeBuildProto(); | |
33 | |
34 void FetcherCallback(uint64 android_id, uint64 security_token); | |
35 | |
36 void SetResponse(net::TestURLFetcher* fetcher, | |
37 uint64 android_id, | |
38 uint64 security_token); | |
39 | |
40 void SetResponseMissingValue(net::TestURLFetcher* fetcher, | |
Nicolas Zea
2014/01/07 00:41:52
Can you just have a single SetResponse(ValueState
fgorski
2014/01/07 23:46:44
I actually dealt without ever storing the fetcher.
| |
41 MissingValue missing_value); | |
42 | |
43 protected: | |
44 uint64 android_id_; | |
45 uint64 security_token_; | |
46 int checkin_device_type_; | |
47 GCMClient::CheckinInfo user_checkin_info_; | |
48 base::MessageLoop message_loop_; | |
49 net::TestURLFetcherFactory url_fetcher_factory_; | |
50 scoped_refptr<net::TestURLRequestContextGetter> url_request_context_getter_; | |
51 }; | |
52 | |
53 CheckinRequestTest::CheckinRequestTest() | |
54 : android_id_(kBlankAndroidId), | |
55 security_token_(kBlankSecurityToken), | |
56 checkin_device_type_(0), | |
57 url_request_context_getter_(new net::TestURLRequestContextGetter( | |
58 message_loop_.message_loop_proxy())) {} | |
59 | |
60 CheckinRequestTest::~CheckinRequestTest() {} | |
61 | |
62 checkin_proto::ChromeBuildProto CheckinRequestTest::CreateChromeBuildProto() { | |
63 checkin_proto::ChromeBuildProto chrome_build_proto; | |
64 chrome_build_proto.set_platform( | |
65 checkin_proto::ChromeBuildProto::PLATFORM_LINUX); | |
66 chrome_build_proto.set_channel( | |
67 checkin_proto::ChromeBuildProto::CHANNEL_CANARY); | |
68 chrome_build_proto.set_chrome_version(kChromeVersion); | |
69 return chrome_build_proto; | |
70 } | |
71 | |
72 void CheckinRequestTest::FetcherCallback(uint64 android_id, | |
73 uint64 security_token) { | |
74 android_id_ = android_id; | |
75 security_token_ = security_token; | |
76 } | |
77 | |
78 void CheckinRequestTest::SetResponse(net::TestURLFetcher* fetcher, | |
79 uint64 android_id, | |
80 uint64 security_token) { | |
81 checkin_proto::AndroidCheckinResponse response; | |
82 response.set_stats_ok(true); | |
83 response.set_android_id(android_id); | |
84 response.set_security_token(security_token); | |
85 | |
86 std::string response_string; | |
87 response.SerializeToString(&response_string); | |
88 fetcher->SetResponseString(response_string); | |
89 } | |
90 | |
91 void CheckinRequestTest::SetResponseMissingValue(net::TestURLFetcher* fetcher, | |
92 MissingValue missing_value) { | |
93 checkin_proto::AndroidCheckinResponse response; | |
94 response.set_stats_ok(true); | |
95 if (missing_value != MISSING_ANDROID_ID) | |
96 response.set_android_id(kAndroidId); | |
97 else | |
98 response.set_security_token(kSecurityToken); | |
99 | |
100 std::string response_string; | |
101 response.SerializeToString(&response_string); | |
102 fetcher->SetResponseString(response_string); | |
103 } | |
104 | |
105 TEST_F(CheckinRequestTest, FetcherData) { | |
106 checkin_proto::ChromeBuildProto chrome_build_proto = CreateChromeBuildProto(); | |
107 user_checkin_info_.android_id = kAndroidId; | |
108 user_checkin_info_.secret = kSecurityToken; | |
109 CheckinRequest request( | |
110 base::Bind(&CheckinRequestTest::FetcherCallback, base::Unretained(this)), | |
111 chrome_build_proto, | |
112 kUserSerialNumber, | |
113 user_checkin_info_, | |
114 url_request_context_getter_.get()); | |
115 request.Start(); | |
116 | |
117 net::TestURLFetcher* fetcher = url_fetcher_factory_.GetFetcherByID(0); | |
118 ASSERT_TRUE(fetcher); | |
119 fetcher->set_response_code(net::HTTP_OK); | |
120 checkin_proto::AndroidCheckinRequest request_proto; | |
121 request_proto.ParseFromString(fetcher->upload_data()); | |
122 EXPECT_EQ(kAndroidId, static_cast<uint64>(request_proto.id())); | |
123 EXPECT_EQ(kSecurityToken, request_proto.security_token()); | |
124 EXPECT_EQ(kUserSerialNumber, request_proto.user_serial_number()); | |
125 EXPECT_EQ(chrome_build_proto.platform(), | |
126 request_proto.checkin().chrome_build().platform()); | |
127 EXPECT_EQ(chrome_build_proto.chrome_version(), | |
128 request_proto.checkin().chrome_build().chrome_version()); | |
129 EXPECT_EQ(chrome_build_proto.channel(), | |
130 request_proto.checkin().chrome_build().channel()); | |
131 | |
132 #if defined(CHROME_OS) | |
133 EXPECT_EQ(checkin_proto::DEVICE_CHROME_OS, request_proto.checkin().type()); | |
134 #else | |
135 EXPECT_EQ(checkin_proto::DEVICE_CHROME_BROWSER, | |
136 request_proto.checkin().type()); | |
137 #endif | |
138 } | |
139 | |
140 TEST_F(CheckinRequestTest, ResponseBodyEmpty) { | |
141 checkin_proto::ChromeBuildProto chrome_build_proto = CreateChromeBuildProto(); | |
142 CheckinRequest request( | |
143 base::Bind(&CheckinRequestTest::FetcherCallback, base::Unretained(this)), | |
144 chrome_build_proto, | |
145 kUserSerialNumber, | |
146 user_checkin_info_, | |
147 url_request_context_getter_.get()); | |
148 request.Start(); | |
149 | |
150 net::TestURLFetcher* fetcher = url_fetcher_factory_.GetFetcherByID(0); | |
151 ASSERT_TRUE(fetcher); | |
152 fetcher->set_response_code(net::HTTP_OK); | |
153 fetcher->SetResponseString(std::string()); | |
154 fetcher->delegate()->OnURLFetchComplete(fetcher); | |
155 EXPECT_EQ(0u, android_id_); | |
156 EXPECT_EQ(0u, security_token_); | |
157 } | |
158 | |
159 TEST_F(CheckinRequestTest, ResponseBodyCorrupted) { | |
160 checkin_proto::ChromeBuildProto chrome_build_proto = CreateChromeBuildProto(); | |
161 CheckinRequest request( | |
162 base::Bind(&CheckinRequestTest::FetcherCallback, base::Unretained(this)), | |
163 chrome_build_proto, | |
164 kUserSerialNumber, | |
165 user_checkin_info_, | |
166 url_request_context_getter_.get()); | |
167 request.Start(); | |
168 | |
169 net::TestURLFetcher* fetcher = url_fetcher_factory_.GetFetcherByID(0); | |
170 ASSERT_TRUE(fetcher); | |
171 fetcher->set_response_code(net::HTTP_OK); | |
172 fetcher->SetResponseString("Corrupted response body"); | |
173 fetcher->delegate()->OnURLFetchComplete(fetcher); | |
174 EXPECT_EQ(0u, android_id_); | |
175 EXPECT_EQ(0u, security_token_); | |
176 } | |
177 | |
178 TEST_F(CheckinRequestTest, ResponseHttpStatusNotOK) { | |
179 checkin_proto::ChromeBuildProto chrome_build_proto = CreateChromeBuildProto(); | |
180 CheckinRequest request( | |
181 base::Bind(&CheckinRequestTest::FetcherCallback, base::Unretained(this)), | |
182 chrome_build_proto, | |
183 kUserSerialNumber, | |
184 user_checkin_info_, | |
185 url_request_context_getter_.get()); | |
186 request.Start(); | |
187 | |
188 net::TestURLFetcher* fetcher = url_fetcher_factory_.GetFetcherByID(0); | |
189 ASSERT_TRUE(fetcher); | |
190 fetcher->set_response_code(net::HTTP_UNAUTHORIZED); | |
191 fetcher->SetResponseString(std::string()); | |
192 fetcher->delegate()->OnURLFetchComplete(fetcher); | |
193 EXPECT_EQ(0u, android_id_); | |
194 EXPECT_EQ(0u, security_token_); | |
195 } | |
196 | |
197 TEST_F(CheckinRequestTest, ResponseMissingAndroidId) { | |
198 checkin_proto::ChromeBuildProto chrome_build_proto = CreateChromeBuildProto(); | |
199 CheckinRequest request( | |
200 base::Bind(&CheckinRequestTest::FetcherCallback, base::Unretained(this)), | |
201 chrome_build_proto, | |
202 kUserSerialNumber, | |
203 user_checkin_info_, | |
204 url_request_context_getter_.get()); | |
205 request.Start(); | |
206 | |
207 net::TestURLFetcher* fetcher = url_fetcher_factory_.GetFetcherByID(0); | |
208 ASSERT_TRUE(fetcher); | |
209 fetcher->set_response_code(net::HTTP_UNAUTHORIZED); | |
210 SetResponseMissingValue(fetcher, MISSING_ANDROID_ID); | |
211 fetcher->delegate()->OnURLFetchComplete(fetcher); | |
212 EXPECT_EQ(0u, android_id_); | |
213 EXPECT_EQ(0u, security_token_); | |
214 } | |
215 | |
216 TEST_F(CheckinRequestTest, ResponseMissingSecurityToken) { | |
217 checkin_proto::ChromeBuildProto chrome_build_proto = CreateChromeBuildProto(); | |
218 CheckinRequest request( | |
219 base::Bind(&CheckinRequestTest::FetcherCallback, base::Unretained(this)), | |
220 chrome_build_proto, | |
221 kUserSerialNumber, | |
222 user_checkin_info_, | |
223 url_request_context_getter_.get()); | |
224 request.Start(); | |
225 | |
226 net::TestURLFetcher* fetcher = url_fetcher_factory_.GetFetcherByID(0); | |
227 ASSERT_TRUE(fetcher); | |
228 fetcher->set_response_code(net::HTTP_UNAUTHORIZED); | |
229 SetResponseMissingValue(fetcher, MISSING_SECURITY_TOKEN); | |
230 fetcher->delegate()->OnURLFetchComplete(fetcher); | |
231 EXPECT_EQ(0u, android_id_); | |
232 EXPECT_EQ(0u, security_token_); | |
233 } | |
234 | |
235 TEST_F(CheckinRequestTest, ResponseValueOfAndroidIdIsZero) { | |
jianli
2014/01/06 23:28:43
nit: ResponseContainingZeroAndroidId
fgorski
2014/01/07 23:46:44
Done.
| |
236 checkin_proto::ChromeBuildProto chrome_build_proto = CreateChromeBuildProto(); | |
237 CheckinRequest request( | |
238 base::Bind(&CheckinRequestTest::FetcherCallback, base::Unretained(this)), | |
239 chrome_build_proto, | |
240 kUserSerialNumber, | |
241 user_checkin_info_, | |
242 url_request_context_getter_.get()); | |
243 request.Start(); | |
244 | |
245 net::TestURLFetcher* fetcher = url_fetcher_factory_.GetFetcherByID(0); | |
246 ASSERT_TRUE(fetcher); | |
247 fetcher->set_response_code(net::HTTP_UNAUTHORIZED); | |
248 SetResponse(fetcher, 0, kSecurityToken); | |
249 fetcher->delegate()->OnURLFetchComplete(fetcher); | |
250 EXPECT_EQ(0u, android_id_); | |
251 EXPECT_EQ(0u, security_token_); | |
252 } | |
253 | |
254 TEST_F(CheckinRequestTest, ResponseValueOfSecurityTokenIsZero) { | |
jianli
2014/01/06 23:28:43
nit: ditto
fgorski
2014/01/07 23:46:44
Done.
| |
255 checkin_proto::ChromeBuildProto chrome_build_proto = CreateChromeBuildProto(); | |
256 CheckinRequest request( | |
257 base::Bind(&CheckinRequestTest::FetcherCallback, base::Unretained(this)), | |
258 chrome_build_proto, | |
259 kUserSerialNumber, | |
260 user_checkin_info_, | |
261 url_request_context_getter_.get()); | |
262 request.Start(); | |
263 | |
264 net::TestURLFetcher* fetcher = url_fetcher_factory_.GetFetcherByID(0); | |
265 ASSERT_TRUE(fetcher); | |
266 fetcher->set_response_code(net::HTTP_UNAUTHORIZED); | |
267 SetResponse(fetcher, kAndroidId, 0); | |
268 fetcher->delegate()->OnURLFetchComplete(fetcher); | |
269 EXPECT_EQ(0u, android_id_); | |
270 EXPECT_EQ(0u, security_token_); | |
271 } | |
272 | |
273 TEST_F(CheckinRequestTest, SuccessfulFirstTimeCheckin) { | |
274 checkin_proto::ChromeBuildProto chrome_build_proto = CreateChromeBuildProto(); | |
275 CheckinRequest request( | |
276 base::Bind(&CheckinRequestTest::FetcherCallback, base::Unretained(this)), | |
277 chrome_build_proto, | |
278 kUserSerialNumber, | |
279 user_checkin_info_, | |
280 url_request_context_getter_.get()); | |
281 request.Start(); | |
282 | |
283 net::TestURLFetcher* fetcher = url_fetcher_factory_.GetFetcherByID(0); | |
284 ASSERT_TRUE(fetcher); | |
285 fetcher->set_response_code(net::HTTP_OK); | |
286 SetResponse(fetcher, kAndroidId, kSecurityToken); | |
287 fetcher->delegate()->OnURLFetchComplete(fetcher); | |
288 EXPECT_EQ(kAndroidId, android_id_); | |
289 EXPECT_EQ(kSecurityToken, security_token_); | |
290 } | |
291 | |
292 TEST_F(CheckinRequestTest, SuccessfulSubsequentCheckin) { | |
293 checkin_proto::ChromeBuildProto chrome_build_proto = CreateChromeBuildProto(); | |
294 // Having non-zero android_id and secret indicate it is a subsequent check in. | |
295 user_checkin_info_.android_id = kAndroidId; | |
296 user_checkin_info_.secret = kSecurityToken; | |
297 CheckinRequest request( | |
298 base::Bind(&CheckinRequestTest::FetcherCallback, base::Unretained(this)), | |
299 chrome_build_proto, | |
300 kUserSerialNumber, | |
301 user_checkin_info_, | |
302 url_request_context_getter_.get()); | |
303 request.Start(); | |
304 | |
305 EXPECT_EQ(kBlankAndroidId, android_id_); | |
306 EXPECT_EQ(kBlankSecurityToken, security_token_); | |
307 net::TestURLFetcher* fetcher = url_fetcher_factory_.GetFetcherByID(0); | |
308 ASSERT_TRUE(fetcher); | |
309 fetcher->set_response_code(net::HTTP_OK); | |
310 SetResponse(fetcher, kAndroidId, kSecurityToken); | |
311 fetcher->delegate()->OnURLFetchComplete(fetcher); | |
312 EXPECT_EQ(kAndroidId, android_id_); | |
313 EXPECT_EQ(kSecurityToken, security_token_); | |
314 } | |
315 | |
316 } // namespace gcm | |
OLD | NEW |