OLD | NEW |
(Empty) | |
| 1 // Copyright (c) 2014 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 ResponseScenario { |
| 25 VALID_RESPONSE, // Both android_id and security_token set in response. |
| 26 MISSING_ANDROID_ID, // android_id is missing. |
| 27 MISSING_SECURITY_TOKEN, // security_token is missing. |
| 28 ANDROID_ID_IS_ZER0, // android_id is 0. |
| 29 SECURITY_TOKEN_IS_ZERO // security_token is 0. |
| 30 }; |
| 31 |
| 32 CheckinRequestTest(); |
| 33 virtual ~CheckinRequestTest(); |
| 34 |
| 35 void FetcherCallback(uint64 android_id, uint64 security_token); |
| 36 |
| 37 void CreateRequest(uint64 android_id, uint64 security_token); |
| 38 |
| 39 void SetResponseStatusAndString( |
| 40 net::HttpStatusCode status_code, |
| 41 const std::string& response_data); |
| 42 |
| 43 void CompleteFetch(); |
| 44 |
| 45 void SetResponse(ResponseScenario response_scenario); |
| 46 |
| 47 protected: |
| 48 uint64 android_id_; |
| 49 uint64 security_token_; |
| 50 int checkin_device_type_; |
| 51 base::MessageLoop message_loop_; |
| 52 net::TestURLFetcherFactory url_fetcher_factory_; |
| 53 scoped_refptr<net::TestURLRequestContextGetter> url_request_context_getter_; |
| 54 checkin_proto::ChromeBuildProto chrome_build_proto_; |
| 55 scoped_ptr<CheckinRequest> request_; |
| 56 }; |
| 57 |
| 58 CheckinRequestTest::CheckinRequestTest() |
| 59 : android_id_(kBlankAndroidId), |
| 60 security_token_(kBlankSecurityToken), |
| 61 checkin_device_type_(0), |
| 62 url_request_context_getter_(new net::TestURLRequestContextGetter( |
| 63 message_loop_.message_loop_proxy())) {} |
| 64 |
| 65 CheckinRequestTest::~CheckinRequestTest() {} |
| 66 |
| 67 void CheckinRequestTest::FetcherCallback(uint64 android_id, |
| 68 uint64 security_token) { |
| 69 android_id_ = android_id; |
| 70 security_token_ = security_token; |
| 71 } |
| 72 |
| 73 void CheckinRequestTest::CreateRequest(uint64 android_id, |
| 74 uint64 security_token) { |
| 75 // First setup a chrome_build protobuf. |
| 76 chrome_build_proto_.set_platform( |
| 77 checkin_proto::ChromeBuildProto::PLATFORM_LINUX); |
| 78 chrome_build_proto_.set_channel( |
| 79 checkin_proto::ChromeBuildProto::CHANNEL_CANARY); |
| 80 chrome_build_proto_.set_chrome_version(kChromeVersion); |
| 81 // Then create a request with that protobuf and specified android_id, |
| 82 // security_token. |
| 83 request_.reset(new CheckinRequest( |
| 84 base::Bind(&CheckinRequestTest::FetcherCallback, |
| 85 base::Unretained(this)), |
| 86 chrome_build_proto_, |
| 87 kUserSerialNumber, |
| 88 android_id, |
| 89 security_token, |
| 90 url_request_context_getter_.get())); |
| 91 |
| 92 // Setting android_id_ and security_token_ to blank value, not used elsewhere |
| 93 // in the tests. |
| 94 android_id_ = kBlankAndroidId; |
| 95 security_token_ = kBlankSecurityToken; |
| 96 } |
| 97 |
| 98 void CheckinRequestTest::SetResponseStatusAndString( |
| 99 net::HttpStatusCode status_code, |
| 100 const std::string& response_data) { |
| 101 net::TestURLFetcher* fetcher = url_fetcher_factory_.GetFetcherByID(0); |
| 102 ASSERT_TRUE(fetcher); |
| 103 fetcher->set_response_code(status_code); |
| 104 fetcher->SetResponseString(response_data); |
| 105 } |
| 106 |
| 107 void CheckinRequestTest::CompleteFetch() { |
| 108 net::TestURLFetcher* fetcher = url_fetcher_factory_.GetFetcherByID(0); |
| 109 ASSERT_TRUE(fetcher); |
| 110 fetcher->delegate()->OnURLFetchComplete(fetcher); |
| 111 } |
| 112 |
| 113 void CheckinRequestTest::SetResponse(ResponseScenario response_scenario) { |
| 114 checkin_proto::AndroidCheckinResponse response; |
| 115 response.set_stats_ok(true); |
| 116 |
| 117 uint64 android_id = response_scenario == ANDROID_ID_IS_ZER0 ? 0 : kAndroidId; |
| 118 uint64 security_token = |
| 119 response_scenario == SECURITY_TOKEN_IS_ZERO ? 0 : kSecurityToken; |
| 120 |
| 121 if (response_scenario != MISSING_ANDROID_ID) |
| 122 response.set_android_id(android_id); |
| 123 |
| 124 if (response_scenario != MISSING_SECURITY_TOKEN) |
| 125 response.set_security_token(security_token); |
| 126 |
| 127 std::string response_string; |
| 128 response.SerializeToString(&response_string); |
| 129 SetResponseStatusAndString(net::HTTP_OK, response_string); |
| 130 } |
| 131 |
| 132 TEST_F(CheckinRequestTest, FetcherData) { |
| 133 CreateRequest(kAndroidId, kSecurityToken); |
| 134 request_->Start(); |
| 135 |
| 136 // Get data sent by request. |
| 137 net::TestURLFetcher* fetcher = url_fetcher_factory_.GetFetcherByID(0); |
| 138 ASSERT_TRUE(fetcher); |
| 139 fetcher->set_response_code(net::HTTP_OK); |
| 140 checkin_proto::AndroidCheckinRequest request_proto; |
| 141 request_proto.ParseFromString(fetcher->upload_data()); |
| 142 |
| 143 EXPECT_EQ(kAndroidId, static_cast<uint64>(request_proto.id())); |
| 144 EXPECT_EQ(kSecurityToken, request_proto.security_token()); |
| 145 EXPECT_EQ(kUserSerialNumber, request_proto.user_serial_number()); |
| 146 EXPECT_EQ(chrome_build_proto_.platform(), |
| 147 request_proto.checkin().chrome_build().platform()); |
| 148 EXPECT_EQ(chrome_build_proto_.chrome_version(), |
| 149 request_proto.checkin().chrome_build().chrome_version()); |
| 150 EXPECT_EQ(chrome_build_proto_.channel(), |
| 151 request_proto.checkin().chrome_build().channel()); |
| 152 |
| 153 #if defined(CHROME_OS) |
| 154 EXPECT_EQ(checkin_proto::DEVICE_CHROME_OS, request_proto.checkin().type()); |
| 155 #else |
| 156 EXPECT_EQ(checkin_proto::DEVICE_CHROME_BROWSER, |
| 157 request_proto.checkin().type()); |
| 158 #endif |
| 159 } |
| 160 |
| 161 TEST_F(CheckinRequestTest, ResponseBodyEmpty) { |
| 162 CreateRequest(0u, 0u); |
| 163 request_->Start(); |
| 164 |
| 165 SetResponseStatusAndString(net::HTTP_OK, std::string()); |
| 166 CompleteFetch(); |
| 167 |
| 168 EXPECT_EQ(0u, android_id_); |
| 169 EXPECT_EQ(0u, security_token_); |
| 170 } |
| 171 |
| 172 TEST_F(CheckinRequestTest, ResponseBodyCorrupted) { |
| 173 CreateRequest(0u, 0u); |
| 174 request_->Start(); |
| 175 |
| 176 SetResponseStatusAndString(net::HTTP_OK, "Corrupted response body"); |
| 177 CompleteFetch(); |
| 178 |
| 179 EXPECT_EQ(0u, android_id_); |
| 180 EXPECT_EQ(0u, security_token_); |
| 181 } |
| 182 |
| 183 TEST_F(CheckinRequestTest, ResponseHttpStatusNotOK) { |
| 184 CreateRequest(0u, 0u); |
| 185 request_->Start(); |
| 186 |
| 187 SetResponseStatusAndString(net::HTTP_UNAUTHORIZED, std::string()); |
| 188 CompleteFetch(); |
| 189 |
| 190 EXPECT_EQ(0u, android_id_); |
| 191 EXPECT_EQ(0u, security_token_); |
| 192 } |
| 193 |
| 194 TEST_F(CheckinRequestTest, ResponseMissingAndroidId) { |
| 195 CreateRequest(0u, 0u); |
| 196 request_->Start(); |
| 197 |
| 198 SetResponse(MISSING_ANDROID_ID); |
| 199 CompleteFetch(); |
| 200 |
| 201 EXPECT_EQ(0u, android_id_); |
| 202 EXPECT_EQ(0u, security_token_); |
| 203 } |
| 204 |
| 205 TEST_F(CheckinRequestTest, ResponseMissingSecurityToken) { |
| 206 CreateRequest(0u, 0u); |
| 207 request_->Start(); |
| 208 |
| 209 SetResponse(MISSING_SECURITY_TOKEN); |
| 210 CompleteFetch(); |
| 211 |
| 212 EXPECT_EQ(0u, android_id_); |
| 213 EXPECT_EQ(0u, security_token_); |
| 214 } |
| 215 |
| 216 TEST_F(CheckinRequestTest, AndroidIdEqualsZeroInResponse) { |
| 217 CreateRequest(0u, 0u); |
| 218 request_->Start(); |
| 219 |
| 220 SetResponse(ANDROID_ID_IS_ZER0); |
| 221 CompleteFetch(); |
| 222 |
| 223 EXPECT_EQ(0u, android_id_); |
| 224 EXPECT_EQ(0u, security_token_); |
| 225 } |
| 226 |
| 227 TEST_F(CheckinRequestTest, SecurityTokenEqualsZeroInResponse) { |
| 228 CreateRequest(0u, 0u); |
| 229 request_->Start(); |
| 230 |
| 231 SetResponse(SECURITY_TOKEN_IS_ZERO); |
| 232 CompleteFetch(); |
| 233 |
| 234 EXPECT_EQ(0u, android_id_); |
| 235 EXPECT_EQ(0u, security_token_); |
| 236 } |
| 237 |
| 238 TEST_F(CheckinRequestTest, SuccessfulFirstTimeCheckin) { |
| 239 CreateRequest(0u, 0u); |
| 240 request_->Start(); |
| 241 |
| 242 SetResponse(VALID_RESPONSE); |
| 243 CompleteFetch(); |
| 244 |
| 245 EXPECT_EQ(kAndroidId, android_id_); |
| 246 EXPECT_EQ(kSecurityToken, security_token_); |
| 247 } |
| 248 |
| 249 TEST_F(CheckinRequestTest, SuccessfulSubsequentCheckin) { |
| 250 CreateRequest(kAndroidId, kSecurityToken); |
| 251 request_->Start(); |
| 252 |
| 253 SetResponse(VALID_RESPONSE); |
| 254 CompleteFetch(); |
| 255 |
| 256 EXPECT_EQ(kAndroidId, android_id_); |
| 257 EXPECT_EQ(kSecurityToken, security_token_); |
| 258 } |
| 259 |
| 260 } // namespace gcm |
OLD | NEW |