Chromium Code Reviews| 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 |