| OLD | NEW |
| 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 <map> | 5 #include <map> |
| 6 #include <string> | 6 #include <string> |
| 7 #include <vector> | 7 #include <vector> |
| 8 | 8 |
| 9 #include "base/strings/string_number_conversions.h" | 9 #include "base/strings/string_number_conversions.h" |
| 10 #include "base/strings/string_tokenizer.h" | 10 #include "base/strings/string_tokenizer.h" |
| 11 #include "google_apis/gcm/engine/registration_request.h" | 11 #include "google_apis/gcm/engine/gcm_registration_request_handler.h" |
| 12 #include "google_apis/gcm/engine/instance_id_get_token_request_handler.h" |
| 12 #include "google_apis/gcm/monitoring/fake_gcm_stats_recorder.h" | 13 #include "google_apis/gcm/monitoring/fake_gcm_stats_recorder.h" |
| 13 #include "net/url_request/test_url_fetcher_factory.h" | 14 #include "net/url_request/test_url_fetcher_factory.h" |
| 14 #include "net/url_request/url_request_status.h" | 15 #include "net/url_request/url_request_status.h" |
| 15 #include "net/url_request/url_request_test_util.h" | 16 #include "net/url_request/url_request_test_util.h" |
| 16 #include "testing/gtest/include/gtest/gtest.h" | 17 #include "testing/gtest/include/gtest/gtest.h" |
| 17 | 18 |
| 18 namespace gcm { | 19 namespace gcm { |
| 19 | 20 |
| 20 namespace { | 21 namespace { |
| 21 const uint64 kAndroidId = 42UL; | 22 const uint64 kAndroidId = 42UL; |
| 22 const char kAppId[] = "TestAppId"; | 23 const char kAppId[] = "TestAppId"; |
| 23 const char kDeveloperId[] = "Project1"; | 24 const char kDeveloperId[] = "Project1"; |
| 24 const char kLoginHeader[] = "AidLogin"; | 25 const char kLoginHeader[] = "AidLogin"; |
| 25 const char kRegistrationURL[] = "http://foo.bar/register"; | 26 const char kRegistrationURL[] = "http://foo.bar/register"; |
| 26 const uint64 kSecurityToken = 77UL; | 27 const uint64 kSecurityToken = 77UL; |
| 28 const int kGCMVersion = 40; |
| 29 const char kInstanceId[] = "IID1"; |
| 30 const char kScope[] = "GCM"; |
| 27 | 31 |
| 28 // Backoff policy for testing registration request. | 32 // Backoff policy for testing registration request. |
| 29 const net::BackoffEntry::Policy kDefaultBackoffPolicy = { | 33 const net::BackoffEntry::Policy kDefaultBackoffPolicy = { |
| 30 // Number of initial errors (in sequence) to ignore before applying | 34 // Number of initial errors (in sequence) to ignore before applying |
| 31 // exponential back-off rules. | 35 // exponential back-off rules. |
| 32 // Explicitly set to 2 to skip the delay on the first retry, as we are not | 36 // Explicitly set to 2 to skip the delay on the first retry, as we are not |
| 33 // trying to test the backoff itself, but rather the fact that retry happens. | 37 // trying to test the backoff itself, but rather the fact that retry happens. |
| 34 2, | 38 2, |
| 35 | 39 |
| 36 // Initial delay for exponential back-off in ms. | 40 // Initial delay for exponential back-off in ms. |
| (...skipping 20 matching lines...) Expand all Loading... |
| 57 } // namespace | 61 } // namespace |
| 58 | 62 |
| 59 class RegistrationRequestTest : public testing::Test { | 63 class RegistrationRequestTest : public testing::Test { |
| 60 public: | 64 public: |
| 61 RegistrationRequestTest(); | 65 RegistrationRequestTest(); |
| 62 ~RegistrationRequestTest() override; | 66 ~RegistrationRequestTest() override; |
| 63 | 67 |
| 64 void RegistrationCallback(RegistrationRequest::Status status, | 68 void RegistrationCallback(RegistrationRequest::Status status, |
| 65 const std::string& registration_id); | 69 const std::string& registration_id); |
| 66 | 70 |
| 67 void CreateRequest(const std::string& sender_ids); | |
| 68 void SetResponseStatusAndString(net::HttpStatusCode status_code, | 71 void SetResponseStatusAndString(net::HttpStatusCode status_code, |
| 69 const std::string& response_body); | 72 const std::string& response_body); |
| 70 void CompleteFetch(); | 73 void CompleteFetch(); |
| 71 void set_max_retry_count(int max_retry_count) { | 74 void set_max_retry_count(int max_retry_count) { |
| 72 max_retry_count_ = max_retry_count; | 75 max_retry_count_ = max_retry_count; |
| 73 } | 76 } |
| 74 | 77 |
| 75 protected: | 78 protected: |
| 76 int max_retry_count_; | 79 int max_retry_count_; |
| 77 RegistrationRequest::Status status_; | 80 RegistrationRequest::Status status_; |
| (...skipping 17 matching lines...) Expand all Loading... |
| 95 RegistrationRequestTest::~RegistrationRequestTest() {} | 98 RegistrationRequestTest::~RegistrationRequestTest() {} |
| 96 | 99 |
| 97 void RegistrationRequestTest::RegistrationCallback( | 100 void RegistrationRequestTest::RegistrationCallback( |
| 98 RegistrationRequest::Status status, | 101 RegistrationRequest::Status status, |
| 99 const std::string& registration_id) { | 102 const std::string& registration_id) { |
| 100 status_ = status; | 103 status_ = status; |
| 101 registration_id_ = registration_id; | 104 registration_id_ = registration_id; |
| 102 callback_called_ = true; | 105 callback_called_ = true; |
| 103 } | 106 } |
| 104 | 107 |
| 105 void RegistrationRequestTest::CreateRequest(const std::string& sender_ids) { | |
| 106 std::vector<std::string> senders; | |
| 107 base::StringTokenizer tokenizer(sender_ids, ","); | |
| 108 while (tokenizer.GetNext()) | |
| 109 senders.push_back(tokenizer.token()); | |
| 110 | |
| 111 request_.reset(new RegistrationRequest( | |
| 112 GURL(kRegistrationURL), | |
| 113 RegistrationRequest::RequestInfo(kAndroidId, | |
| 114 kSecurityToken, | |
| 115 kAppId, | |
| 116 senders), | |
| 117 kDefaultBackoffPolicy, | |
| 118 base::Bind(&RegistrationRequestTest::RegistrationCallback, | |
| 119 base::Unretained(this)), | |
| 120 max_retry_count_, | |
| 121 url_request_context_getter_.get(), | |
| 122 &recorder_)); | |
| 123 } | |
| 124 | |
| 125 void RegistrationRequestTest::SetResponseStatusAndString( | 108 void RegistrationRequestTest::SetResponseStatusAndString( |
| 126 net::HttpStatusCode status_code, | 109 net::HttpStatusCode status_code, |
| 127 const std::string& response_body) { | 110 const std::string& response_body) { |
| 128 net::TestURLFetcher* fetcher = url_fetcher_factory_.GetFetcherByID(0); | 111 net::TestURLFetcher* fetcher = url_fetcher_factory_.GetFetcherByID(0); |
| 129 ASSERT_TRUE(fetcher); | 112 ASSERT_TRUE(fetcher); |
| 130 fetcher->set_response_code(status_code); | 113 fetcher->set_response_code(status_code); |
| 131 fetcher->SetResponseString(response_body); | 114 fetcher->SetResponseString(response_body); |
| 132 } | 115 } |
| 133 | 116 |
| 134 void RegistrationRequestTest::CompleteFetch() { | 117 void RegistrationRequestTest::CompleteFetch() { |
| 135 registration_id_.clear(); | 118 registration_id_.clear(); |
| 136 status_ = RegistrationRequest::SUCCESS; | 119 status_ = RegistrationRequest::SUCCESS; |
| 137 callback_called_ = false; | 120 callback_called_ = false; |
| 138 | 121 |
| 139 net::TestURLFetcher* fetcher = url_fetcher_factory_.GetFetcherByID(0); | 122 net::TestURLFetcher* fetcher = url_fetcher_factory_.GetFetcherByID(0); |
| 140 ASSERT_TRUE(fetcher); | 123 ASSERT_TRUE(fetcher); |
| 141 fetcher->delegate()->OnURLFetchComplete(fetcher); | 124 fetcher->delegate()->OnURLFetchComplete(fetcher); |
| 142 } | 125 } |
| 143 | 126 |
| 144 TEST_F(RegistrationRequestTest, RequestSuccessful) { | 127 class GCMRegistrationRequestTest : public RegistrationRequestTest { |
| 128 public: |
| 129 GCMRegistrationRequestTest(); |
| 130 ~GCMRegistrationRequestTest() override; |
| 131 |
| 132 void CreateRequest(const std::string& sender_ids); |
| 133 }; |
| 134 |
| 135 GCMRegistrationRequestTest::GCMRegistrationRequestTest() { |
| 136 } |
| 137 |
| 138 GCMRegistrationRequestTest::~GCMRegistrationRequestTest() { |
| 139 } |
| 140 |
| 141 void GCMRegistrationRequestTest::CreateRequest(const std::string& sender_ids) { |
| 142 RegistrationRequest::RequestInfo request_info( |
| 143 kAndroidId, kSecurityToken, kAppId); |
| 144 scoped_ptr<GCMRegistrationRequestHandler> request_handler( |
| 145 new GCMRegistrationRequestHandler(sender_ids)); |
| 146 request_.reset(new RegistrationRequest( |
| 147 GURL(kRegistrationURL), |
| 148 request_info, |
| 149 request_handler.Pass(), |
| 150 kDefaultBackoffPolicy, |
| 151 base::Bind(&RegistrationRequestTest::RegistrationCallback, |
| 152 base::Unretained(this)), |
| 153 max_retry_count_, |
| 154 url_request_context_getter_.get(), |
| 155 &recorder_, |
| 156 sender_ids)); |
| 157 } |
| 158 |
| 159 TEST_F(GCMRegistrationRequestTest, RequestSuccessful) { |
| 145 set_max_retry_count(0); | 160 set_max_retry_count(0); |
| 146 CreateRequest("sender1,sender2"); | 161 CreateRequest("sender1,sender2"); |
| 147 request_->Start(); | 162 request_->Start(); |
| 148 | 163 |
| 149 SetResponseStatusAndString(net::HTTP_OK, "token=2501"); | 164 SetResponseStatusAndString(net::HTTP_OK, "token=2501"); |
| 150 CompleteFetch(); | 165 CompleteFetch(); |
| 151 | 166 |
| 152 EXPECT_TRUE(callback_called_); | 167 EXPECT_TRUE(callback_called_); |
| 153 EXPECT_EQ(RegistrationRequest::SUCCESS, status_); | 168 EXPECT_EQ(RegistrationRequest::SUCCESS, status_); |
| 154 EXPECT_EQ("2501", registration_id_); | 169 EXPECT_EQ("2501", registration_id_); |
| 155 } | 170 } |
| 156 | 171 |
| 157 TEST_F(RegistrationRequestTest, RequestDataAndURL) { | 172 TEST_F(GCMRegistrationRequestTest, RequestDataAndURL) { |
| 158 CreateRequest(kDeveloperId); | 173 CreateRequest(kDeveloperId); |
| 159 request_->Start(); | 174 request_->Start(); |
| 160 | 175 |
| 161 // Get data sent by request. | 176 // Get data sent by request. |
| 162 net::TestURLFetcher* fetcher = url_fetcher_factory_.GetFetcherByID(0); | 177 net::TestURLFetcher* fetcher = url_fetcher_factory_.GetFetcherByID(0); |
| 163 ASSERT_TRUE(fetcher); | 178 ASSERT_TRUE(fetcher); |
| 164 | 179 |
| 165 EXPECT_EQ(GURL(kRegistrationURL), fetcher->GetOriginalURL()); | 180 EXPECT_EQ(GURL(kRegistrationURL), fetcher->GetOriginalURL()); |
| 166 | 181 |
| 167 // Verify that authorization header was put together properly. | 182 // Verify that authorization header was put together properly. |
| (...skipping 23 matching lines...) Expand all Loading... |
| 191 ASSERT_TRUE(iter != expected_pairs.end()); | 206 ASSERT_TRUE(iter != expected_pairs.end()); |
| 192 ASSERT_TRUE(data_tokenizer.GetNext()); | 207 ASSERT_TRUE(data_tokenizer.GetNext()); |
| 193 EXPECT_EQ(iter->second, data_tokenizer.token()); | 208 EXPECT_EQ(iter->second, data_tokenizer.token()); |
| 194 // Ensure that none of the keys appears twice. | 209 // Ensure that none of the keys appears twice. |
| 195 expected_pairs.erase(iter); | 210 expected_pairs.erase(iter); |
| 196 } | 211 } |
| 197 | 212 |
| 198 EXPECT_EQ(0UL, expected_pairs.size()); | 213 EXPECT_EQ(0UL, expected_pairs.size()); |
| 199 } | 214 } |
| 200 | 215 |
| 201 TEST_F(RegistrationRequestTest, RequestRegistrationWithMultipleSenderIds) { | 216 TEST_F(GCMRegistrationRequestTest, RequestRegistrationWithMultipleSenderIds) { |
| 202 CreateRequest("sender1,sender2@gmail.com"); | 217 CreateRequest("sender1,sender2@gmail.com"); |
| 203 request_->Start(); | 218 request_->Start(); |
| 204 | 219 |
| 205 net::TestURLFetcher* fetcher = url_fetcher_factory_.GetFetcherByID(0); | 220 net::TestURLFetcher* fetcher = url_fetcher_factory_.GetFetcherByID(0); |
| 206 ASSERT_TRUE(fetcher); | 221 ASSERT_TRUE(fetcher); |
| 207 | 222 |
| 208 // Verify data was formatted properly. | 223 // Verify data was formatted properly. |
| 209 std::string upload_data = fetcher->upload_data(); | 224 std::string upload_data = fetcher->upload_data(); |
| 210 base::StringTokenizer data_tokenizer(upload_data, "&="); | 225 base::StringTokenizer data_tokenizer(upload_data, "&="); |
| 211 | 226 |
| 212 // Skip all tokens until you hit entry for senders. | 227 // Skip all tokens until you hit entry for senders. |
| 213 while (data_tokenizer.GetNext() && data_tokenizer.token() != "sender") | 228 while (data_tokenizer.GetNext() && data_tokenizer.token() != "sender") |
| 214 continue; | 229 continue; |
| 215 | 230 |
| 216 ASSERT_TRUE(data_tokenizer.GetNext()); | 231 ASSERT_TRUE(data_tokenizer.GetNext()); |
| 217 std::string senders(net::UnescapeURLComponent(data_tokenizer.token(), | 232 std::string senders(net::UnescapeURLComponent(data_tokenizer.token(), |
| 218 net::UnescapeRule::URL_SPECIAL_CHARS)); | 233 net::UnescapeRule::URL_SPECIAL_CHARS)); |
| 219 base::StringTokenizer sender_tokenizer(senders, ","); | 234 base::StringTokenizer sender_tokenizer(senders, ","); |
| 220 ASSERT_TRUE(sender_tokenizer.GetNext()); | 235 ASSERT_TRUE(sender_tokenizer.GetNext()); |
| 221 EXPECT_EQ("sender1", sender_tokenizer.token()); | 236 EXPECT_EQ("sender1", sender_tokenizer.token()); |
| 222 ASSERT_TRUE(sender_tokenizer.GetNext()); | 237 ASSERT_TRUE(sender_tokenizer.GetNext()); |
| 223 EXPECT_EQ("sender2@gmail.com", sender_tokenizer.token()); | 238 EXPECT_EQ("sender2@gmail.com", sender_tokenizer.token()); |
| 224 } | 239 } |
| 225 | 240 |
| 226 TEST_F(RegistrationRequestTest, ResponseParsing) { | 241 TEST_F(GCMRegistrationRequestTest, ResponseParsing) { |
| 227 CreateRequest("sender1,sender2"); | 242 CreateRequest("sender1,sender2"); |
| 228 request_->Start(); | 243 request_->Start(); |
| 229 | 244 |
| 230 SetResponseStatusAndString(net::HTTP_OK, "token=2501"); | 245 SetResponseStatusAndString(net::HTTP_OK, "token=2501"); |
| 231 CompleteFetch(); | 246 CompleteFetch(); |
| 232 | 247 |
| 233 EXPECT_TRUE(callback_called_); | 248 EXPECT_TRUE(callback_called_); |
| 234 EXPECT_EQ(RegistrationRequest::SUCCESS, status_); | 249 EXPECT_EQ(RegistrationRequest::SUCCESS, status_); |
| 235 EXPECT_EQ("2501", registration_id_); | 250 EXPECT_EQ("2501", registration_id_); |
| 236 } | 251 } |
| 237 | 252 |
| 238 TEST_F(RegistrationRequestTest, ResponseHttpStatusNotOK) { | 253 TEST_F(GCMRegistrationRequestTest, ResponseHttpStatusNotOK) { |
| 239 CreateRequest("sender1,sender2"); | 254 CreateRequest("sender1,sender2"); |
| 240 request_->Start(); | 255 request_->Start(); |
| 241 | 256 |
| 242 SetResponseStatusAndString(net::HTTP_UNAUTHORIZED, "token=2501"); | 257 SetResponseStatusAndString(net::HTTP_UNAUTHORIZED, "token=2501"); |
| 243 CompleteFetch(); | 258 CompleteFetch(); |
| 244 | 259 |
| 245 EXPECT_FALSE(callback_called_); | 260 EXPECT_FALSE(callback_called_); |
| 246 | 261 |
| 247 SetResponseStatusAndString(net::HTTP_OK, "token=2501"); | 262 SetResponseStatusAndString(net::HTTP_OK, "token=2501"); |
| 248 CompleteFetch(); | 263 CompleteFetch(); |
| 249 | 264 |
| 250 EXPECT_TRUE(callback_called_); | 265 EXPECT_TRUE(callback_called_); |
| 251 EXPECT_EQ(RegistrationRequest::SUCCESS, status_); | 266 EXPECT_EQ(RegistrationRequest::SUCCESS, status_); |
| 252 EXPECT_EQ("2501", registration_id_); | 267 EXPECT_EQ("2501", registration_id_); |
| 253 } | 268 } |
| 254 | 269 |
| 255 TEST_F(RegistrationRequestTest, ResponseMissingRegistrationId) { | 270 TEST_F(GCMRegistrationRequestTest, ResponseMissingRegistrationId) { |
| 256 CreateRequest("sender1,sender2"); | 271 CreateRequest("sender1,sender2"); |
| 257 request_->Start(); | 272 request_->Start(); |
| 258 | 273 |
| 259 SetResponseStatusAndString(net::HTTP_OK, ""); | 274 SetResponseStatusAndString(net::HTTP_OK, ""); |
| 260 CompleteFetch(); | 275 CompleteFetch(); |
| 261 | 276 |
| 262 EXPECT_FALSE(callback_called_); | 277 EXPECT_FALSE(callback_called_); |
| 263 | 278 |
| 264 SetResponseStatusAndString(net::HTTP_OK, "some error in response"); | 279 SetResponseStatusAndString(net::HTTP_OK, "some error in response"); |
| 265 CompleteFetch(); | 280 CompleteFetch(); |
| 266 | 281 |
| 267 EXPECT_FALSE(callback_called_); | 282 EXPECT_FALSE(callback_called_); |
| 268 | 283 |
| 269 // Ensuring a retry happened and succeeds. | 284 // Ensuring a retry happened and succeeds. |
| 270 SetResponseStatusAndString(net::HTTP_OK, "token=2501"); | 285 SetResponseStatusAndString(net::HTTP_OK, "token=2501"); |
| 271 CompleteFetch(); | 286 CompleteFetch(); |
| 272 | 287 |
| 273 EXPECT_TRUE(callback_called_); | 288 EXPECT_TRUE(callback_called_); |
| 274 EXPECT_EQ(RegistrationRequest::SUCCESS, status_); | 289 EXPECT_EQ(RegistrationRequest::SUCCESS, status_); |
| 275 EXPECT_EQ("2501", registration_id_); | 290 EXPECT_EQ("2501", registration_id_); |
| 276 } | 291 } |
| 277 | 292 |
| 278 TEST_F(RegistrationRequestTest, ResponseDeviceRegistrationError) { | 293 TEST_F(GCMRegistrationRequestTest, ResponseDeviceRegistrationError) { |
| 279 CreateRequest("sender1,sender2"); | 294 CreateRequest("sender1,sender2"); |
| 280 request_->Start(); | 295 request_->Start(); |
| 281 | 296 |
| 282 SetResponseStatusAndString(net::HTTP_OK, "Error=PHONE_REGISTRATION_ERROR"); | 297 SetResponseStatusAndString(net::HTTP_OK, "Error=PHONE_REGISTRATION_ERROR"); |
| 283 CompleteFetch(); | 298 CompleteFetch(); |
| 284 | 299 |
| 285 EXPECT_FALSE(callback_called_); | 300 EXPECT_FALSE(callback_called_); |
| 286 | 301 |
| 287 // Ensuring a retry happened and succeeds. | 302 // Ensuring a retry happened and succeeds. |
| 288 SetResponseStatusAndString(net::HTTP_OK, "token=2501"); | 303 SetResponseStatusAndString(net::HTTP_OK, "token=2501"); |
| 289 CompleteFetch(); | 304 CompleteFetch(); |
| 290 | 305 |
| 291 EXPECT_TRUE(callback_called_); | 306 EXPECT_TRUE(callback_called_); |
| 292 EXPECT_EQ(RegistrationRequest::SUCCESS, status_); | 307 EXPECT_EQ(RegistrationRequest::SUCCESS, status_); |
| 293 EXPECT_EQ("2501", registration_id_); | 308 EXPECT_EQ("2501", registration_id_); |
| 294 } | 309 } |
| 295 | 310 |
| 296 TEST_F(RegistrationRequestTest, ResponseAuthenticationError) { | 311 TEST_F(GCMRegistrationRequestTest, ResponseAuthenticationError) { |
| 297 CreateRequest("sender1,sender2"); | 312 CreateRequest("sender1,sender2"); |
| 298 request_->Start(); | 313 request_->Start(); |
| 299 | 314 |
| 300 SetResponseStatusAndString(net::HTTP_UNAUTHORIZED, | 315 SetResponseStatusAndString(net::HTTP_UNAUTHORIZED, |
| 301 "Error=AUTHENTICATION_FAILED"); | 316 "Error=AUTHENTICATION_FAILED"); |
| 302 CompleteFetch(); | 317 CompleteFetch(); |
| 303 | 318 |
| 304 EXPECT_FALSE(callback_called_); | 319 EXPECT_FALSE(callback_called_); |
| 305 | 320 |
| 306 // Ensuring a retry happened and succeeds. | 321 // Ensuring a retry happened and succeeds. |
| 307 SetResponseStatusAndString(net::HTTP_OK, "token=2501"); | 322 SetResponseStatusAndString(net::HTTP_OK, "token=2501"); |
| 308 CompleteFetch(); | 323 CompleteFetch(); |
| 309 | 324 |
| 310 EXPECT_TRUE(callback_called_); | 325 EXPECT_TRUE(callback_called_); |
| 311 EXPECT_EQ(RegistrationRequest::SUCCESS, status_); | 326 EXPECT_EQ(RegistrationRequest::SUCCESS, status_); |
| 312 EXPECT_EQ("2501", registration_id_); | 327 EXPECT_EQ("2501", registration_id_); |
| 313 } | 328 } |
| 314 | 329 |
| 315 TEST_F(RegistrationRequestTest, ResponseInvalidParameters) { | 330 TEST_F(GCMRegistrationRequestTest, ResponseInvalidParameters) { |
| 316 CreateRequest("sender1,sender2"); | 331 CreateRequest("sender1,sender2"); |
| 317 request_->Start(); | 332 request_->Start(); |
| 318 | 333 |
| 319 SetResponseStatusAndString(net::HTTP_OK, "Error=INVALID_PARAMETERS"); | 334 SetResponseStatusAndString(net::HTTP_OK, "Error=INVALID_PARAMETERS"); |
| 320 CompleteFetch(); | 335 CompleteFetch(); |
| 321 | 336 |
| 322 EXPECT_TRUE(callback_called_); | 337 EXPECT_TRUE(callback_called_); |
| 323 EXPECT_EQ(RegistrationRequest::INVALID_PARAMETERS, status_); | 338 EXPECT_EQ(RegistrationRequest::INVALID_PARAMETERS, status_); |
| 324 EXPECT_EQ(std::string(), registration_id_); | 339 EXPECT_EQ(std::string(), registration_id_); |
| 325 } | 340 } |
| 326 | 341 |
| 327 TEST_F(RegistrationRequestTest, ResponseInvalidSender) { | 342 TEST_F(GCMRegistrationRequestTest, ResponseInvalidSender) { |
| 328 CreateRequest("sender1,sender2"); | 343 CreateRequest("sender1,sender2"); |
| 329 request_->Start(); | 344 request_->Start(); |
| 330 | 345 |
| 331 SetResponseStatusAndString(net::HTTP_OK, "Error=INVALID_SENDER"); | 346 SetResponseStatusAndString(net::HTTP_OK, "Error=INVALID_SENDER"); |
| 332 CompleteFetch(); | 347 CompleteFetch(); |
| 333 | 348 |
| 334 EXPECT_TRUE(callback_called_); | 349 EXPECT_TRUE(callback_called_); |
| 335 EXPECT_EQ(RegistrationRequest::INVALID_SENDER, status_); | 350 EXPECT_EQ(RegistrationRequest::INVALID_SENDER, status_); |
| 336 EXPECT_EQ(std::string(), registration_id_); | 351 EXPECT_EQ(std::string(), registration_id_); |
| 337 } | 352 } |
| 338 | 353 |
| 339 TEST_F(RegistrationRequestTest, ResponseInvalidSenderBadRequest) { | 354 TEST_F(GCMRegistrationRequestTest, ResponseInvalidSenderBadRequest) { |
| 340 CreateRequest("sender1"); | 355 CreateRequest("sender1"); |
| 341 request_->Start(); | 356 request_->Start(); |
| 342 | 357 |
| 343 SetResponseStatusAndString(net::HTTP_BAD_REQUEST, "Error=INVALID_SENDER"); | 358 SetResponseStatusAndString(net::HTTP_BAD_REQUEST, "Error=INVALID_SENDER"); |
| 344 CompleteFetch(); | 359 CompleteFetch(); |
| 345 | 360 |
| 346 EXPECT_TRUE(callback_called_); | 361 EXPECT_TRUE(callback_called_); |
| 347 EXPECT_EQ(RegistrationRequest::INVALID_SENDER, status_); | 362 EXPECT_EQ(RegistrationRequest::INVALID_SENDER, status_); |
| 348 EXPECT_EQ(std::string(), registration_id_); | 363 EXPECT_EQ(std::string(), registration_id_); |
| 349 } | 364 } |
| 350 | 365 |
| 351 TEST_F(RegistrationRequestTest, RequestNotSuccessful) { | 366 TEST_F(GCMRegistrationRequestTest, RequestNotSuccessful) { |
| 352 CreateRequest("sender1,sender2"); | 367 CreateRequest("sender1,sender2"); |
| 353 request_->Start(); | 368 request_->Start(); |
| 354 | 369 |
| 355 net::URLRequestStatus request_status(net::URLRequestStatus::FAILED, 1); | 370 net::URLRequestStatus request_status(net::URLRequestStatus::FAILED, 1); |
| 356 SetResponseStatusAndString(net::HTTP_OK, "token=2501"); | 371 SetResponseStatusAndString(net::HTTP_OK, "token=2501"); |
| 357 net::TestURLFetcher* fetcher = url_fetcher_factory_.GetFetcherByID(0); | 372 net::TestURLFetcher* fetcher = url_fetcher_factory_.GetFetcherByID(0); |
| 358 ASSERT_TRUE(fetcher); | 373 ASSERT_TRUE(fetcher); |
| 359 fetcher->set_status(request_status); | 374 fetcher->set_status(request_status); |
| 360 | 375 |
| 361 CompleteFetch(); | 376 CompleteFetch(); |
| 362 | 377 |
| 363 EXPECT_FALSE(callback_called_); | 378 EXPECT_FALSE(callback_called_); |
| 364 | 379 |
| 365 // Ensuring a retry happened and succeeded. | 380 // Ensuring a retry happened and succeeded. |
| 366 SetResponseStatusAndString(net::HTTP_OK, "token=2501"); | 381 SetResponseStatusAndString(net::HTTP_OK, "token=2501"); |
| 367 CompleteFetch(); | 382 CompleteFetch(); |
| 368 | 383 |
| 369 EXPECT_TRUE(callback_called_); | 384 EXPECT_TRUE(callback_called_); |
| 370 EXPECT_EQ(RegistrationRequest::SUCCESS, status_); | 385 EXPECT_EQ(RegistrationRequest::SUCCESS, status_); |
| 371 EXPECT_EQ("2501", registration_id_); | 386 EXPECT_EQ("2501", registration_id_); |
| 372 } | 387 } |
| 373 | 388 |
| 374 TEST_F(RegistrationRequestTest, ResponseHttpNotOk) { | 389 TEST_F(GCMRegistrationRequestTest, ResponseHttpNotOk) { |
| 375 CreateRequest("sender1,sender2"); | 390 CreateRequest("sender1,sender2"); |
| 376 request_->Start(); | 391 request_->Start(); |
| 377 | 392 |
| 378 SetResponseStatusAndString(net::HTTP_GATEWAY_TIMEOUT, "token=2501"); | 393 SetResponseStatusAndString(net::HTTP_GATEWAY_TIMEOUT, "token=2501"); |
| 379 CompleteFetch(); | 394 CompleteFetch(); |
| 380 | 395 |
| 381 EXPECT_FALSE(callback_called_); | 396 EXPECT_FALSE(callback_called_); |
| 382 | 397 |
| 383 // Ensuring a retry happened and succeeded. | 398 // Ensuring a retry happened and succeeded. |
| 384 SetResponseStatusAndString(net::HTTP_OK, "token=2501"); | 399 SetResponseStatusAndString(net::HTTP_OK, "token=2501"); |
| 385 CompleteFetch(); | 400 CompleteFetch(); |
| 386 | 401 |
| 387 EXPECT_TRUE(callback_called_); | 402 EXPECT_TRUE(callback_called_); |
| 388 EXPECT_EQ(RegistrationRequest::SUCCESS, status_); | 403 EXPECT_EQ(RegistrationRequest::SUCCESS, status_); |
| 389 EXPECT_EQ("2501", registration_id_); | 404 EXPECT_EQ("2501", registration_id_); |
| 390 } | 405 } |
| 391 | 406 |
| 392 TEST_F(RegistrationRequestTest, MaximumAttemptsReachedWithZeroRetries) { | 407 TEST_F(GCMRegistrationRequestTest, MaximumAttemptsReachedWithZeroRetries) { |
| 393 set_max_retry_count(0); | 408 set_max_retry_count(0); |
| 394 CreateRequest("sender1,sender2"); | 409 CreateRequest("sender1,sender2"); |
| 395 request_->Start(); | 410 request_->Start(); |
| 396 | 411 |
| 397 SetResponseStatusAndString(net::HTTP_GATEWAY_TIMEOUT, "token=2501"); | 412 SetResponseStatusAndString(net::HTTP_GATEWAY_TIMEOUT, "token=2501"); |
| 398 CompleteFetch(); | 413 CompleteFetch(); |
| 399 | 414 |
| 400 EXPECT_TRUE(callback_called_); | 415 EXPECT_TRUE(callback_called_); |
| 401 EXPECT_EQ(RegistrationRequest::REACHED_MAX_RETRIES, status_); | 416 EXPECT_EQ(RegistrationRequest::REACHED_MAX_RETRIES, status_); |
| 402 EXPECT_EQ(std::string(), registration_id_); | 417 EXPECT_EQ(std::string(), registration_id_); |
| 403 } | 418 } |
| 404 | 419 |
| 405 TEST_F(RegistrationRequestTest, MaximumAttemptsReached) { | 420 TEST_F(GCMRegistrationRequestTest, MaximumAttemptsReached) { |
| 406 CreateRequest("sender1,sender2"); | 421 CreateRequest("sender1,sender2"); |
| 407 request_->Start(); | 422 request_->Start(); |
| 408 | 423 |
| 409 SetResponseStatusAndString(net::HTTP_GATEWAY_TIMEOUT, "token=2501"); | 424 SetResponseStatusAndString(net::HTTP_GATEWAY_TIMEOUT, "token=2501"); |
| 410 CompleteFetch(); | 425 CompleteFetch(); |
| 411 | 426 |
| 412 EXPECT_FALSE(callback_called_); | 427 EXPECT_FALSE(callback_called_); |
| 413 | 428 |
| 414 SetResponseStatusAndString(net::HTTP_GATEWAY_TIMEOUT, "token=2501"); | 429 SetResponseStatusAndString(net::HTTP_GATEWAY_TIMEOUT, "token=2501"); |
| 415 CompleteFetch(); | 430 CompleteFetch(); |
| 416 | 431 |
| 417 EXPECT_FALSE(callback_called_); | 432 EXPECT_FALSE(callback_called_); |
| 418 | 433 |
| 419 SetResponseStatusAndString(net::HTTP_GATEWAY_TIMEOUT, "token=2501"); | 434 SetResponseStatusAndString(net::HTTP_GATEWAY_TIMEOUT, "token=2501"); |
| 420 CompleteFetch(); | 435 CompleteFetch(); |
| 421 | 436 |
| 422 EXPECT_TRUE(callback_called_); | 437 EXPECT_TRUE(callback_called_); |
| 423 EXPECT_EQ(RegistrationRequest::REACHED_MAX_RETRIES, status_); | 438 EXPECT_EQ(RegistrationRequest::REACHED_MAX_RETRIES, status_); |
| 424 EXPECT_EQ(std::string(), registration_id_); | 439 EXPECT_EQ(std::string(), registration_id_); |
| 425 } | 440 } |
| 426 | 441 |
| 442 class InstanceIDGetTokenRequestTest : public RegistrationRequestTest { |
| 443 public: |
| 444 InstanceIDGetTokenRequestTest(); |
| 445 ~InstanceIDGetTokenRequestTest() override; |
| 446 |
| 447 void CreateRequest(const std::string& instance_id, |
| 448 const std::string& authorized_entity, |
| 449 const std::string& scope, |
| 450 const std::map<std::string, std::string>& options); |
| 451 }; |
| 452 |
| 453 InstanceIDGetTokenRequestTest::InstanceIDGetTokenRequestTest() { |
| 454 } |
| 455 |
| 456 InstanceIDGetTokenRequestTest::~InstanceIDGetTokenRequestTest() { |
| 457 } |
| 458 |
| 459 void InstanceIDGetTokenRequestTest::CreateRequest( |
| 460 const std::string& instance_id, |
| 461 const std::string& authorized_entity, |
| 462 const std::string& scope, |
| 463 const std::map<std::string, std::string>& options) { |
| 464 RegistrationRequest::RequestInfo request_info( |
| 465 kAndroidId, kSecurityToken, kAppId); |
| 466 scoped_ptr<InstanceIDGetTokenRequestHandler> request_handler( |
| 467 new InstanceIDGetTokenRequestHandler( |
| 468 instance_id, authorized_entity, scope, kGCMVersion, options)); |
| 469 request_.reset(new RegistrationRequest( |
| 470 GURL(kRegistrationURL), |
| 471 request_info, |
| 472 request_handler.Pass(), |
| 473 kDefaultBackoffPolicy, |
| 474 base::Bind(&RegistrationRequestTest::RegistrationCallback, |
| 475 base::Unretained(this)), |
| 476 max_retry_count_, |
| 477 url_request_context_getter_.get(), |
| 478 &recorder_, |
| 479 authorized_entity)); |
| 480 } |
| 481 |
| 482 TEST_F(InstanceIDGetTokenRequestTest, RequestSuccessful) { |
| 483 std::map<std::string, std::string> options; |
| 484 options["Foo"] = "Bar"; |
| 485 |
| 486 set_max_retry_count(0); |
| 487 CreateRequest(kInstanceId, kDeveloperId, kScope, options); |
| 488 request_->Start(); |
| 489 |
| 490 SetResponseStatusAndString(net::HTTP_OK, "token=2501"); |
| 491 CompleteFetch(); |
| 492 |
| 493 EXPECT_TRUE(callback_called_); |
| 494 EXPECT_EQ(RegistrationRequest::SUCCESS, status_); |
| 495 EXPECT_EQ("2501", registration_id_); |
| 496 } |
| 497 |
| 498 TEST_F(InstanceIDGetTokenRequestTest, RequestDataAndURL) { |
| 499 std::map<std::string, std::string> options; |
| 500 options["Foo"] = "Bar"; |
| 501 CreateRequest(kInstanceId, kDeveloperId, kScope, options); |
| 502 request_->Start(); |
| 503 |
| 504 // Get data sent by request. |
| 505 net::TestURLFetcher* fetcher = url_fetcher_factory_.GetFetcherByID(0); |
| 506 ASSERT_TRUE(fetcher); |
| 507 |
| 508 EXPECT_EQ(GURL(kRegistrationURL), fetcher->GetOriginalURL()); |
| 509 |
| 510 // Verify that authorization header was put together properly. |
| 511 net::HttpRequestHeaders headers; |
| 512 fetcher->GetExtraRequestHeaders(&headers); |
| 513 std::string auth_header; |
| 514 headers.GetHeader(net::HttpRequestHeaders::kAuthorization, &auth_header); |
| 515 base::StringTokenizer auth_tokenizer(auth_header, " :"); |
| 516 ASSERT_TRUE(auth_tokenizer.GetNext()); |
| 517 EXPECT_EQ(kLoginHeader, auth_tokenizer.token()); |
| 518 ASSERT_TRUE(auth_tokenizer.GetNext()); |
| 519 EXPECT_EQ(base::Uint64ToString(kAndroidId), auth_tokenizer.token()); |
| 520 ASSERT_TRUE(auth_tokenizer.GetNext()); |
| 521 EXPECT_EQ(base::Uint64ToString(kSecurityToken), auth_tokenizer.token()); |
| 522 |
| 523 std::map<std::string, std::string> expected_pairs; |
| 524 expected_pairs["gmsv"] = base::IntToString(kGCMVersion); |
| 525 expected_pairs["app"] = kAppId; |
| 526 expected_pairs["sender"] = kDeveloperId; |
| 527 expected_pairs["device"] = base::Uint64ToString(kAndroidId); |
| 528 expected_pairs["appid"] = kInstanceId; |
| 529 expected_pairs["scope"] = kScope; |
| 530 expected_pairs["X-Foo"] = "Bar"; |
| 531 |
| 532 // Verify data was formatted properly. |
| 533 std::string upload_data = fetcher->upload_data(); |
| 534 base::StringTokenizer data_tokenizer(upload_data, "&="); |
| 535 while (data_tokenizer.GetNext()) { |
| 536 std::map<std::string, std::string>::iterator iter = |
| 537 expected_pairs.find(data_tokenizer.token()); |
| 538 ASSERT_TRUE(iter != expected_pairs.end()); |
| 539 ASSERT_TRUE(data_tokenizer.GetNext()); |
| 540 EXPECT_EQ(iter->second, data_tokenizer.token()); |
| 541 // Ensure that none of the keys appears twice. |
| 542 expected_pairs.erase(iter); |
| 543 } |
| 544 |
| 545 EXPECT_EQ(0UL, expected_pairs.size()); |
| 546 } |
| 547 |
| 548 TEST_F(InstanceIDGetTokenRequestTest, ResponseHttpStatusNotOK) { |
| 549 std::map<std::string, std::string> options; |
| 550 CreateRequest(kInstanceId, kDeveloperId, kScope, options); |
| 551 request_->Start(); |
| 552 |
| 553 SetResponseStatusAndString(net::HTTP_UNAUTHORIZED, "token=2501"); |
| 554 CompleteFetch(); |
| 555 |
| 556 EXPECT_FALSE(callback_called_); |
| 557 |
| 558 SetResponseStatusAndString(net::HTTP_OK, "token=2501"); |
| 559 CompleteFetch(); |
| 560 |
| 561 EXPECT_TRUE(callback_called_); |
| 562 EXPECT_EQ(RegistrationRequest::SUCCESS, status_); |
| 563 EXPECT_EQ("2501", registration_id_); |
| 564 } |
| 565 |
| 427 } // namespace gcm | 566 } // namespace gcm |
| OLD | NEW |