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