OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "base/json/json_reader.h" | 5 #include "base/json/json_reader.h" |
| 6 #include "base/json/json_writer.h" |
6 #include "base/memory/scoped_ptr.h" | 7 #include "base/memory/scoped_ptr.h" |
7 #include "base/string_number_conversions.h" | 8 #include "base/string_number_conversions.h" |
8 #include "base/string_util.h" | 9 #include "base/string_util.h" |
9 #include "base/stringprintf.h" | 10 #include "base/stringprintf.h" |
10 #include "base/utf_string_conversions.h" | 11 #include "base/utf_string_conversions.h" |
11 #include "base/values.h" | 12 #include "base/values.h" |
12 #include "content/browser/geolocation/fake_access_token_store.h" | 13 #include "content/browser/geolocation/fake_access_token_store.h" |
| 14 #include "content/browser/geolocation/location_arbitrator.h" |
13 #include "content/browser/geolocation/network_location_provider.h" | 15 #include "content/browser/geolocation/network_location_provider.h" |
14 #include "net/url_request/test_url_fetcher_factory.h" | 16 #include "net/url_request/test_url_fetcher_factory.h" |
15 #include "net/url_request/url_request_status.h" | 17 #include "net/url_request/url_request_status.h" |
16 #include "testing/gtest/include/gtest/gtest.h" | 18 #include "testing/gtest/include/gtest/gtest.h" |
17 | 19 |
18 using content::FakeAccessTokenStore; | 20 using content::FakeAccessTokenStore; |
19 using content::Geoposition; | 21 using content::Geoposition; |
20 | 22 |
21 namespace { | 23 namespace { |
22 | 24 |
23 // Constants used in multiple tests. | 25 // Constants used in multiple tests. |
24 const char kTestServerUrl[] = "https://www.geolocation.test/service"; | 26 const char kTestServerUrl[] = "https://www.geolocation.test/service"; |
| 27 const char kAccessTokenString[] = "accessToken"; |
25 | 28 |
26 #if defined(GOOGLE_CHROME_BUILD) | |
27 const char kTestJson[] = "?browser=googlechrome&sensor=true"; | |
28 const char kTestBrowser[] = "browser=googlechrome"; | |
29 #else | |
30 const char kTestJson[] = "?browser=chromium&sensor=true"; | |
31 const char kTestBrowser[] = "browser=chromium"; | |
32 #endif | |
33 | |
34 const char kTestSensor[] = "sensor=true"; | |
35 // Using #define so we can easily paste this into various other strings. | 29 // Using #define so we can easily paste this into various other strings. |
36 #define REFERENCE_ACCESS_TOKEN "2:k7j3G6LaL6u_lafw:4iXOeOpTh1glSXe" | 30 #define REFERENCE_ACCESS_TOKEN "2:k7j3G6LaL6u_lafw:4iXOeOpTh1glSXe" |
37 | 31 |
38 // Stops the specified (nested) message loop when the listener is called back. | 32 // Stops the specified (nested) message loop when the listener is called back. |
39 class MessageLoopQuitListener | 33 class MessageLoopQuitListener |
40 : public LocationProviderBase::ListenerInterface { | 34 : public LocationProviderBase::ListenerInterface { |
41 public: | 35 public: |
42 MessageLoopQuitListener() | 36 MessageLoopQuitListener() |
43 : client_message_loop_(MessageLoop::current()), | 37 : client_message_loop_(MessageLoop::current()), |
44 updated_provider_(NULL), | 38 updated_provider_(NULL), |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
121 }; | 115 }; |
122 | 116 |
123 template<typename DataType> | 117 template<typename DataType> |
124 MockDeviceDataProviderImpl<DataType>* | 118 MockDeviceDataProviderImpl<DataType>* |
125 MockDeviceDataProviderImpl<DataType>::instance_ = NULL; | 119 MockDeviceDataProviderImpl<DataType>::instance_ = NULL; |
126 | 120 |
127 // Main test fixture | 121 // Main test fixture |
128 class GeolocationNetworkProviderTest : public testing::Test { | 122 class GeolocationNetworkProviderTest : public testing::Test { |
129 public: | 123 public: |
130 virtual void SetUp() { | 124 virtual void SetUp() { |
| 125 test_server_url_ = GURL(kTestServerUrl); |
131 access_token_store_ = new FakeAccessTokenStore; | 126 access_token_store_ = new FakeAccessTokenStore; |
132 wifi_data_provider_ = | 127 wifi_data_provider_ = |
133 MockDeviceDataProviderImpl<WifiData>::CreateInstance(); | 128 MockDeviceDataProviderImpl<WifiData>::CreateInstance(); |
134 } | 129 } |
135 | 130 |
136 virtual void TearDown() { | 131 virtual void TearDown() { |
137 WifiDataProvider::ResetFactory(); | 132 WifiDataProvider::ResetFactory(); |
138 } | 133 } |
139 | 134 |
140 LocationProviderBase* CreateProvider(bool set_permission_granted) { | 135 LocationProviderBase* CreateProvider(bool set_permission_granted) { |
141 LocationProviderBase* provider = NewNetworkLocationProvider( | 136 LocationProviderBase* provider = NewNetworkLocationProvider( |
142 access_token_store_.get(), | 137 access_token_store_.get(), |
143 NULL, // No URLContextGetter needed, as using test urlfecther factory. | 138 NULL, // No URLContextGetter needed, as using test urlfecther factory. |
144 test_server_url_, | 139 test_server_url_, |
145 access_token_store_->access_token_set_[test_server_url_]); | 140 access_token_store_->access_token_set_[test_server_url_]); |
146 if (set_permission_granted) | 141 if (set_permission_granted) |
147 provider->OnPermissionGranted(); | 142 provider->OnPermissionGranted(); |
148 return provider; | 143 return provider; |
149 } | 144 } |
150 | 145 |
151 protected: | 146 protected: |
152 GeolocationNetworkProviderTest() : test_server_url_(kTestServerUrl) { | 147 GeolocationNetworkProviderTest() { |
153 // TODO(joth): Really these should be in SetUp, not here, but they take no | 148 // TODO(joth): Really these should be in SetUp, not here, but they take no |
154 // effect on Mac OS Release builds if done there. I kid not. Figure out why. | 149 // effect on Mac OS Release builds if done there. I kid not. Figure out why. |
155 WifiDataProvider::SetFactory( | 150 WifiDataProvider::SetFactory( |
156 MockDeviceDataProviderImpl<WifiData>::GetInstance); | 151 MockDeviceDataProviderImpl<WifiData>::GetInstance); |
157 } | 152 } |
158 | 153 |
159 // Returns the current url fetcher (if any) and advances the id ready for the | 154 // Returns the current url fetcher (if any) and advances the id ready for the |
160 // next test step. | 155 // next test step. |
161 net::TestURLFetcher* get_url_fetcher_and_advance_id() { | 156 net::TestURLFetcher* get_url_fetcher_and_advance_id() { |
162 net::TestURLFetcher* fetcher = url_fetcher_factory_.GetFetcherByID( | 157 net::TestURLFetcher* fetcher = url_fetcher_factory_.GetFetcherByID( |
(...skipping 15 matching lines...) Expand all Loading... |
178 ASCIIToUTF16(base::StringPrintf("%02d-34-56-78-54-32", i)); | 173 ASCIIToUTF16(base::StringPrintf("%02d-34-56-78-54-32", i)); |
179 ap.radio_signal_strength = ap_count - i; | 174 ap.radio_signal_strength = ap_count - i; |
180 ap.channel = IndexToChannel(i); | 175 ap.channel = IndexToChannel(i); |
181 ap.signal_to_noise = i + 42; | 176 ap.signal_to_noise = i + 42; |
182 ap.ssid = ASCIIToUTF16("Some nice+network|name\\"); | 177 ap.ssid = ASCIIToUTF16("Some nice+network|name\\"); |
183 data.access_point_data.insert(ap); | 178 data.access_point_data.insert(ap); |
184 } | 179 } |
185 return data; | 180 return data; |
186 } | 181 } |
187 | 182 |
188 static std::vector<std::string> CreateReferenceWifiScanDataJson( | 183 static void CreateReferenceWifiScanDataJson( |
189 int ap_count, int start_index) { | 184 int ap_count, int start_index, base::ListValue* wifi_access_point_list) { |
190 std::vector<std::string> wifi_data; | 185 std::vector<std::string> wifi_data; |
191 for (int i = 0; i < ap_count; ++i) { | 186 for (int i = 0; i < ap_count; ++i) { |
192 std::string wifi_part; | 187 base::DictionaryValue* ap = new base::DictionaryValue(); |
193 wifi_part += "wifi="; | 188 ap->SetString("macAddress", base::StringPrintf("%02d-34-56-78-54-32", i)); |
194 wifi_part += "mac%3A" + base::StringPrintf("%02d-34-56-78-54-32", i); | 189 ap->SetInteger("signalStrength", start_index + ap_count - i); |
195 wifi_part += "%7Css%3A" + base::IntToString(start_index + ap_count - i); | 190 ap->SetInteger("age", 0); |
196 wifi_part += "%7Cage%3A0"; | 191 ap->SetInteger("channel", IndexToChannel(i)); |
197 wifi_part += "%7Cchan%3A" + base::IntToString(IndexToChannel(i)); | 192 ap->SetInteger("signalToNoiseRatio", i + 42); |
198 wifi_part += "%7Csnr%3A" + base::IntToString(i + 42); | 193 wifi_access_point_list->Append(ap); |
199 wifi_part += "%7Cssid%3ASome%20nice%2Bnetwork%5C%7Cname%5C%5C"; | |
200 wifi_data.push_back(wifi_part); | |
201 } | 194 } |
202 return wifi_data; | |
203 } | 195 } |
204 | 196 |
205 static Geoposition CreateReferencePosition(int id) { | 197 static Geoposition CreateReferencePosition(int id) { |
206 Geoposition pos; | 198 Geoposition pos; |
207 pos.latitude = id; | 199 pos.latitude = id; |
208 pos.longitude = -(id + 1); | 200 pos.longitude = -(id + 1); |
209 pos.altitude = 2 * id; | 201 pos.altitude = 2 * id; |
210 pos.timestamp = base::Time::Now(); | 202 pos.timestamp = base::Time::Now(); |
211 return pos; | 203 return pos; |
212 } | 204 } |
213 | 205 |
214 static void CheckRequestIsValid(const std::string& request_url, | 206 static std::string PrettyJson(const base::Value& value) { |
215 int expected_routers, | 207 std::string pretty; |
216 int expected_wifi_aps, | 208 base::JSONWriter::WriteWithOptions( |
217 int wifi_start_index, | 209 &value, base::JSONWriter::OPTIONS_PRETTY_PRINT, &pretty); |
218 const std::string& expected_access_token) { | 210 return pretty; |
219 std::vector<std::string> url_tokens; | |
220 EXPECT_EQ(size_t(2), Tokenize(request_url, "?", &url_tokens)); | |
221 EXPECT_EQ(kTestServerUrl, url_tokens[0]); | |
222 | |
223 std::vector<std::string> json_tokens; | |
224 size_t expected_info_tokens = expected_access_token.empty() ? 2 : 3; | |
225 EXPECT_EQ(expected_info_tokens + expected_wifi_aps, | |
226 Tokenize(url_tokens[1], "&", &json_tokens)); | |
227 EXPECT_EQ(kTestBrowser, json_tokens[0]); | |
228 EXPECT_EQ(kTestSensor, json_tokens[1]); | |
229 if (!expected_access_token.empty()) | |
230 EXPECT_EQ("token=" + expected_access_token, json_tokens[2]); | |
231 | |
232 std::vector<std::string> expected_json_tokens = | |
233 CreateReferenceWifiScanDataJson(expected_wifi_aps, wifi_start_index); | |
234 EXPECT_EQ(size_t(expected_wifi_aps), expected_json_tokens.size()); | |
235 for (size_t i = 0; i < expected_json_tokens.size(); ++i ) { | |
236 std::vector<std::string> actual_wifi_tokens; | |
237 std::vector<std::string> expected_wifi_tokens; | |
238 ReplaceSubstringsAfterOffset(&json_tokens[i + expected_info_tokens], | |
239 0, "%7C", "|"); | |
240 ReplaceSubstringsAfterOffset(&expected_json_tokens[i], | |
241 0, "%7C", "|"); | |
242 Tokenize(json_tokens[i + expected_info_tokens], | |
243 "|", &actual_wifi_tokens); | |
244 Tokenize(expected_json_tokens[i], "|", &expected_wifi_tokens); | |
245 | |
246 // MAC address. | |
247 EXPECT_EQ(expected_wifi_tokens[0], actual_wifi_tokens[0]); | |
248 // Signal Strength. | |
249 EXPECT_EQ(expected_wifi_tokens[1], actual_wifi_tokens[1]); | |
250 int age; | |
251 base::StringToInt(actual_wifi_tokens[2].substr( | |
252 4, actual_wifi_tokens[2].size() - 4), | |
253 &age); | |
254 // Age. | |
255 EXPECT_LT(age, 20 * 1000); // Should not take longer than 20 seconds. | |
256 // Channel. | |
257 EXPECT_EQ(expected_wifi_tokens[3], actual_wifi_tokens[3]); | |
258 // Signal to noise ratio. | |
259 EXPECT_EQ(expected_wifi_tokens[4], actual_wifi_tokens[4]); | |
260 // SSID. | |
261 EXPECT_EQ(expected_wifi_tokens[5], actual_wifi_tokens[5]); | |
262 EXPECT_EQ(expected_wifi_tokens[6], actual_wifi_tokens[6]); | |
263 } | |
264 EXPECT_TRUE(GURL(request_url).is_valid()); | |
265 } | 211 } |
266 | 212 |
267 const GURL test_server_url_; | 213 static testing::AssertionResult JsonGetList( |
| 214 const std::string& field, |
| 215 const base::DictionaryValue& dict, |
| 216 const base::ListValue** output_list) { |
| 217 if (!dict.GetList(field, output_list)) |
| 218 return testing::AssertionFailure() << "Dictionary " << PrettyJson(dict) |
| 219 << " is missing list field " << field; |
| 220 return testing::AssertionSuccess(); |
| 221 } |
| 222 |
| 223 static testing::AssertionResult JsonFieldEquals( |
| 224 const std::string& field, |
| 225 const base::DictionaryValue& expected, |
| 226 const base::DictionaryValue& actual) { |
| 227 const base::Value* expected_value; |
| 228 const base::Value* actual_value; |
| 229 if (!expected.Get(field, &expected_value)) |
| 230 return testing::AssertionFailure() |
| 231 << "Expected dictionary " << PrettyJson(expected) |
| 232 << " is missing field " << field; |
| 233 if (!expected.Get(field, &actual_value)) |
| 234 return testing::AssertionFailure() |
| 235 << "Actual dictionary " << PrettyJson(actual) |
| 236 << " is missing field " << field; |
| 237 if (!expected_value->Equals(actual_value)) |
| 238 return testing::AssertionFailure() |
| 239 << "Field " << field << " mismatch: " << PrettyJson(*expected_value) |
| 240 << " != " << PrettyJson(*actual_value); |
| 241 return testing::AssertionSuccess(); |
| 242 } |
| 243 |
| 244 static GURL UrlWithoutQuery(const GURL& url) { |
| 245 url_canon::Replacements<char> replacements; |
| 246 replacements.ClearQuery(); |
| 247 return url.ReplaceComponents(replacements); |
| 248 } |
| 249 |
| 250 testing::AssertionResult IsTestServerUrl(const GURL& request_url) { |
| 251 const GURL a(UrlWithoutQuery(test_server_url_)); |
| 252 const GURL b(UrlWithoutQuery(request_url)); |
| 253 if (a == b) |
| 254 return testing::AssertionSuccess(); |
| 255 return testing::AssertionFailure() << a << " != " << b; |
| 256 } |
| 257 |
| 258 void CheckRequestIsValid(const net::TestURLFetcher& request, |
| 259 int expected_routers, |
| 260 int expected_wifi_aps, |
| 261 int wifi_start_index, |
| 262 const std::string& expected_access_token) { |
| 263 const GURL& request_url = request.GetOriginalURL(); |
| 264 |
| 265 EXPECT_TRUE(IsTestServerUrl(request_url)); |
| 266 |
| 267 // Check to see that the api key is being appended for the default |
| 268 // network provider url. |
| 269 bool is_default_url = UrlWithoutQuery(request_url) == |
| 270 UrlWithoutQuery(GeolocationArbitrator::DefaultNetworkProviderURL()); |
| 271 EXPECT_EQ(is_default_url, !request_url.query().empty()); |
| 272 |
| 273 const std::string& upload_data = request.upload_data(); |
| 274 ASSERT_FALSE(upload_data.empty()); |
| 275 std::string json_parse_error_msg; |
| 276 scoped_ptr<base::Value> parsed_json( |
| 277 base::JSONReader::ReadAndReturnError( |
| 278 upload_data, |
| 279 base::JSON_PARSE_RFC, |
| 280 NULL, |
| 281 &json_parse_error_msg)); |
| 282 EXPECT_TRUE(json_parse_error_msg.empty()); |
| 283 ASSERT_TRUE(parsed_json.get() != NULL); |
| 284 |
| 285 const base::DictionaryValue* request_json; |
| 286 ASSERT_TRUE(parsed_json->GetAsDictionary(&request_json)); |
| 287 |
| 288 if (!is_default_url) { |
| 289 if (expected_access_token.empty()) |
| 290 ASSERT_FALSE(request_json->HasKey(kAccessTokenString)); |
| 291 else { |
| 292 std::string access_token; |
| 293 EXPECT_TRUE(request_json->GetString(kAccessTokenString, &access_token)); |
| 294 EXPECT_EQ(expected_access_token, access_token); |
| 295 } |
| 296 } |
| 297 |
| 298 if (expected_wifi_aps) { |
| 299 base::ListValue expected_wifi_aps_json; |
| 300 CreateReferenceWifiScanDataJson( |
| 301 expected_wifi_aps, |
| 302 wifi_start_index, |
| 303 &expected_wifi_aps_json); |
| 304 EXPECT_EQ(size_t(expected_wifi_aps), expected_wifi_aps_json.GetSize()); |
| 305 |
| 306 const base::ListValue* wifi_aps_json; |
| 307 ASSERT_TRUE(JsonGetList("wifiAccessPoints", *request_json, |
| 308 &wifi_aps_json)); |
| 309 for (size_t i = 0; i < expected_wifi_aps_json.GetSize(); ++i ) { |
| 310 const base::DictionaryValue* expected_json; |
| 311 ASSERT_TRUE(expected_wifi_aps_json.GetDictionary(i, &expected_json)); |
| 312 const base::DictionaryValue* actual_json; |
| 313 ASSERT_TRUE(wifi_aps_json->GetDictionary(i, &actual_json)); |
| 314 ASSERT_TRUE(JsonFieldEquals("macAddress", *expected_json, |
| 315 *actual_json)); |
| 316 ASSERT_TRUE(JsonFieldEquals("signalStrength", *expected_json, |
| 317 *actual_json)); |
| 318 ASSERT_TRUE(JsonFieldEquals("channel", *expected_json, *actual_json)); |
| 319 ASSERT_TRUE(JsonFieldEquals("signalToNoiseRatio", *expected_json, |
| 320 *actual_json)); |
| 321 } |
| 322 } else { |
| 323 ASSERT_FALSE(request_json->HasKey("wifiAccessPoints")); |
| 324 } |
| 325 EXPECT_TRUE(request_url.is_valid()); |
| 326 } |
| 327 |
| 328 GURL test_server_url_; |
268 MessageLoop main_message_loop_; | 329 MessageLoop main_message_loop_; |
269 scoped_refptr<FakeAccessTokenStore> access_token_store_; | 330 scoped_refptr<FakeAccessTokenStore> access_token_store_; |
270 net::TestURLFetcherFactory url_fetcher_factory_; | 331 net::TestURLFetcherFactory url_fetcher_factory_; |
271 scoped_refptr<MockDeviceDataProviderImpl<WifiData> > wifi_data_provider_; | 332 scoped_refptr<MockDeviceDataProviderImpl<WifiData> > wifi_data_provider_; |
272 }; | 333 }; |
273 | 334 |
274 | |
275 TEST_F(GeolocationNetworkProviderTest, CreateDestroy) { | 335 TEST_F(GeolocationNetworkProviderTest, CreateDestroy) { |
276 // Test fixture members were SetUp correctly. | 336 // Test fixture members were SetUp correctly. |
277 EXPECT_EQ(&main_message_loop_, MessageLoop::current()); | 337 EXPECT_EQ(&main_message_loop_, MessageLoop::current()); |
278 scoped_ptr<LocationProviderBase> provider(CreateProvider(true)); | 338 scoped_ptr<LocationProviderBase> provider(CreateProvider(true)); |
279 EXPECT_TRUE(NULL != provider.get()); | 339 EXPECT_TRUE(NULL != provider.get()); |
280 provider.reset(); | 340 provider.reset(); |
281 SUCCEED(); | 341 SUCCEED(); |
282 } | 342 } |
283 | 343 |
284 TEST_F(GeolocationNetworkProviderTest, StartProvider) { | 344 TEST_F(GeolocationNetworkProviderTest, StartProvider) { |
285 scoped_ptr<LocationProviderBase> provider(CreateProvider(true)); | 345 scoped_ptr<LocationProviderBase> provider(CreateProvider(true)); |
286 EXPECT_TRUE(provider->StartProvider(false)); | 346 EXPECT_TRUE(provider->StartProvider(false)); |
287 net::TestURLFetcher* fetcher = get_url_fetcher_and_advance_id(); | 347 net::TestURLFetcher* fetcher = get_url_fetcher_and_advance_id(); |
288 ASSERT_TRUE(fetcher != NULL); | 348 ASSERT_TRUE(fetcher != NULL); |
| 349 CheckRequestIsValid(*fetcher, 0, 0, 0, ""); |
| 350 } |
289 | 351 |
290 EXPECT_EQ(test_server_url_.spec() + kTestJson, | 352 TEST_F(GeolocationNetworkProviderTest, StartProviderDefaultUrl) { |
291 fetcher->GetOriginalURL().spec()); | 353 test_server_url_ = GeolocationArbitrator::DefaultNetworkProviderURL(); |
| 354 scoped_ptr<LocationProviderBase> provider(CreateProvider(true)); |
| 355 EXPECT_TRUE(provider->StartProvider(false)); |
| 356 net::TestURLFetcher* fetcher = get_url_fetcher_and_advance_id(); |
| 357 ASSERT_TRUE(fetcher != NULL); |
| 358 CheckRequestIsValid(*fetcher, 0, 0, 0, ""); |
| 359 } |
292 | 360 |
293 CheckRequestIsValid(fetcher->GetOriginalURL().spec(), 0, 0, 0, ""); | |
294 } | |
295 | 361 |
296 TEST_F(GeolocationNetworkProviderTest, StartProviderLongRequest) { | 362 TEST_F(GeolocationNetworkProviderTest, StartProviderLongRequest) { |
297 scoped_ptr<LocationProviderBase> provider(CreateProvider(true)); | 363 scoped_ptr<LocationProviderBase> provider(CreateProvider(true)); |
298 EXPECT_TRUE(provider->StartProvider(false)); | 364 EXPECT_TRUE(provider->StartProvider(false)); |
299 const int kFirstScanAps = 20; | 365 const int kFirstScanAps = 20; |
300 wifi_data_provider_->SetData(CreateReferenceWifiScanData(kFirstScanAps)); | 366 wifi_data_provider_->SetData(CreateReferenceWifiScanData(kFirstScanAps)); |
301 main_message_loop_.RunAllPending(); | 367 main_message_loop_.RunAllPending(); |
302 net::TestURLFetcher* fetcher = get_url_fetcher_and_advance_id(); | 368 net::TestURLFetcher* fetcher = get_url_fetcher_and_advance_id(); |
303 ASSERT_TRUE(fetcher != NULL); | 369 ASSERT_TRUE(fetcher != NULL); |
304 // The request url should have been shortened to less than 2048 characters | 370 // The request url should have been shortened to less than 2048 characters |
305 // in length by not including access points with the lowest signal strength | 371 // in length by not including access points with the lowest signal strength |
306 // in the request. | 372 // in the request. |
307 EXPECT_LT(fetcher->GetOriginalURL().spec().size(), size_t(2048)); | 373 EXPECT_LT(fetcher->GetOriginalURL().spec().size(), size_t(2048)); |
308 CheckRequestIsValid(fetcher->GetOriginalURL().spec(), 0, 16, 4, ""); | 374 CheckRequestIsValid(*fetcher, 0, 16, 4, ""); |
309 } | 375 } |
310 | 376 |
311 TEST_F(GeolocationNetworkProviderTest, MultiRegistrations) { | 377 TEST_F(GeolocationNetworkProviderTest, MultiRegistrations) { |
312 // TODO(joth): Strictly belongs in a base-class unit test file. | 378 // TODO(joth): Strictly belongs in a base-class unit test file. |
313 MessageLoopQuitListener listener; | 379 MessageLoopQuitListener listener; |
314 scoped_ptr<LocationProviderBase> provider(CreateProvider(true)); | 380 scoped_ptr<LocationProviderBase> provider(CreateProvider(true)); |
315 EXPECT_FALSE(provider->has_listeners()); | 381 EXPECT_FALSE(provider->has_listeners()); |
316 provider->RegisterListener(&listener); | 382 provider->RegisterListener(&listener); |
317 EXPECT_TRUE(provider->has_listeners()); | 383 EXPECT_TRUE(provider->has_listeners()); |
318 provider->RegisterListener(&listener); | 384 provider->RegisterListener(&listener); |
319 EXPECT_TRUE(provider->has_listeners()); | 385 EXPECT_TRUE(provider->has_listeners()); |
320 | 386 |
321 provider->UnregisterListener(&listener); | 387 provider->UnregisterListener(&listener); |
322 EXPECT_TRUE(provider->has_listeners()); | 388 EXPECT_TRUE(provider->has_listeners()); |
323 provider->UnregisterListener(&listener); | 389 provider->UnregisterListener(&listener); |
324 EXPECT_FALSE(provider->has_listeners()); | 390 EXPECT_FALSE(provider->has_listeners()); |
325 } | 391 } |
326 | 392 |
327 TEST_F(GeolocationNetworkProviderTest, MultipleWifiScansComplete) { | 393 TEST_F(GeolocationNetworkProviderTest, MultipleWifiScansComplete) { |
328 scoped_ptr<LocationProviderBase> provider(CreateProvider(true)); | 394 scoped_ptr<LocationProviderBase> provider(CreateProvider(true)); |
329 EXPECT_TRUE(provider->StartProvider(false)); | 395 EXPECT_TRUE(provider->StartProvider(false)); |
330 | 396 |
331 net::TestURLFetcher* fetcher = get_url_fetcher_and_advance_id(); | 397 net::TestURLFetcher* fetcher = get_url_fetcher_and_advance_id(); |
332 ASSERT_TRUE(fetcher != NULL); | 398 ASSERT_TRUE(fetcher != NULL); |
333 EXPECT_EQ(test_server_url_.spec() + kTestJson, | 399 EXPECT_TRUE(IsTestServerUrl(fetcher->GetOriginalURL())); |
334 fetcher->GetOriginalURL().spec()); | |
335 | 400 |
336 // Complete the network request with bad position fix. | 401 // Complete the network request with bad position fix. |
337 const char* kNoFixNetworkResponse = | 402 const char* kNoFixNetworkResponse = |
338 "{" | 403 "{" |
339 " \"status\": \"ZERO_RESULTS\"" | 404 " \"status\": \"ZERO_RESULTS\"" |
340 "}"; | 405 "}"; |
341 fetcher->set_url(test_server_url_); | 406 fetcher->set_url(test_server_url_); |
342 fetcher->set_status(net::URLRequestStatus()); | 407 fetcher->set_status(net::URLRequestStatus()); |
343 fetcher->set_response_code(200); // OK | 408 fetcher->set_response_code(200); // OK |
344 fetcher->SetResponseString(kNoFixNetworkResponse); | 409 fetcher->SetResponseString(kNoFixNetworkResponse); |
345 fetcher->delegate()->OnURLFetchComplete(fetcher); | 410 fetcher->delegate()->OnURLFetchComplete(fetcher); |
346 | 411 |
347 Geoposition position; | 412 Geoposition position; |
348 provider->GetPosition(&position); | 413 provider->GetPosition(&position); |
349 EXPECT_FALSE(position.Validate()); | 414 EXPECT_FALSE(position.Validate()); |
350 | 415 |
351 // Now wifi data arrives -- SetData will notify listeners. | 416 // Now wifi data arrives -- SetData will notify listeners. |
352 const int kFirstScanAps = 6; | 417 const int kFirstScanAps = 6; |
353 wifi_data_provider_->SetData(CreateReferenceWifiScanData(kFirstScanAps)); | 418 wifi_data_provider_->SetData(CreateReferenceWifiScanData(kFirstScanAps)); |
354 main_message_loop_.RunAllPending(); | 419 main_message_loop_.RunAllPending(); |
355 fetcher = get_url_fetcher_and_advance_id(); | 420 fetcher = get_url_fetcher_and_advance_id(); |
356 ASSERT_TRUE(fetcher != NULL); | 421 ASSERT_TRUE(fetcher != NULL); |
357 // The request should have the wifi data. | 422 // The request should have the wifi data. |
358 CheckRequestIsValid( | 423 CheckRequestIsValid(*fetcher, 0, kFirstScanAps, 0, ""); |
359 fetcher->GetOriginalURL().spec(), 0, kFirstScanAps, 0, ""); | |
360 | 424 |
361 // Send a reply with good position fix. | 425 // Send a reply with good position fix. |
362 const char* kReferenceNetworkResponse = | 426 const char* kReferenceNetworkResponse = |
363 "{" | 427 "{" |
364 " \"status\": \"OK\"," | 428 " \"accessToken\": \"" REFERENCE_ACCESS_TOKEN "\"," |
365 " \"access_token\": \"" REFERENCE_ACCESS_TOKEN "\"," | |
366 " \"accuracy\": 1200.4," | 429 " \"accuracy\": 1200.4," |
367 " \"location\": {" | 430 " \"location\": {" |
368 " \"lat\": 51.0," | 431 " \"lat\": 51.0," |
369 " \"lng\": -0.1" | 432 " \"lng\": -0.1" |
370 " }" | 433 " }" |
371 "}"; | 434 "}"; |
372 fetcher->set_url(test_server_url_); | 435 fetcher->set_url(test_server_url_); |
373 fetcher->set_status(net::URLRequestStatus()); | 436 fetcher->set_status(net::URLRequestStatus()); |
374 fetcher->set_response_code(200); // OK | 437 fetcher->set_response_code(200); // OK |
375 fetcher->SetResponseString(kReferenceNetworkResponse); | 438 fetcher->SetResponseString(kReferenceNetworkResponse); |
(...skipping 22 matching lines...) Expand all Loading... |
398 EXPECT_EQ(51.0, position.latitude); | 461 EXPECT_EQ(51.0, position.latitude); |
399 EXPECT_EQ(-0.1, position.longitude); | 462 EXPECT_EQ(-0.1, position.longitude); |
400 EXPECT_TRUE(position.Validate()); | 463 EXPECT_TRUE(position.Validate()); |
401 | 464 |
402 // Now a third scan with more than twice the original amount -> new request. | 465 // Now a third scan with more than twice the original amount -> new request. |
403 const int kThirdScanAps = kFirstScanAps * 2 + 1; | 466 const int kThirdScanAps = kFirstScanAps * 2 + 1; |
404 wifi_data_provider_->SetData(CreateReferenceWifiScanData(kThirdScanAps)); | 467 wifi_data_provider_->SetData(CreateReferenceWifiScanData(kThirdScanAps)); |
405 main_message_loop_.RunAllPending(); | 468 main_message_loop_.RunAllPending(); |
406 fetcher = get_url_fetcher_and_advance_id(); | 469 fetcher = get_url_fetcher_and_advance_id(); |
407 EXPECT_TRUE(fetcher); | 470 EXPECT_TRUE(fetcher); |
408 CheckRequestIsValid(fetcher->GetOriginalURL().spec(), 0, | 471 CheckRequestIsValid(*fetcher, 0, kThirdScanAps, 0, REFERENCE_ACCESS_TOKEN); |
409 kThirdScanAps, 0, | |
410 REFERENCE_ACCESS_TOKEN); | |
411 // ...reply with a network error. | 472 // ...reply with a network error. |
412 | 473 |
413 fetcher->set_url(test_server_url_); | 474 fetcher->set_url(test_server_url_); |
414 fetcher->set_status(net::URLRequestStatus(net::URLRequestStatus::FAILED, -1)); | 475 fetcher->set_status(net::URLRequestStatus(net::URLRequestStatus::FAILED, -1)); |
415 fetcher->set_response_code(200); // should be ignored | 476 fetcher->set_response_code(200); // should be ignored |
416 fetcher->SetResponseString(""); | 477 fetcher->SetResponseString(""); |
417 fetcher->delegate()->OnURLFetchComplete(fetcher); | 478 fetcher->delegate()->OnURLFetchComplete(fetcher); |
418 | 479 |
419 // Error means we now no longer have a fix. | 480 // Error means we now no longer have a fix. |
420 provider->GetPosition(&position); | 481 provider->GetPosition(&position); |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
465 TEST_F(GeolocationNetworkProviderTest, NetworkRequestDeferredForPermission) { | 526 TEST_F(GeolocationNetworkProviderTest, NetworkRequestDeferredForPermission) { |
466 scoped_ptr<LocationProviderBase> provider(CreateProvider(false)); | 527 scoped_ptr<LocationProviderBase> provider(CreateProvider(false)); |
467 EXPECT_TRUE(provider->StartProvider(false)); | 528 EXPECT_TRUE(provider->StartProvider(false)); |
468 net::TestURLFetcher* fetcher = get_url_fetcher_and_advance_id(); | 529 net::TestURLFetcher* fetcher = get_url_fetcher_and_advance_id(); |
469 EXPECT_FALSE(fetcher); | 530 EXPECT_FALSE(fetcher); |
470 provider->OnPermissionGranted(); | 531 provider->OnPermissionGranted(); |
471 | 532 |
472 fetcher = get_url_fetcher_and_advance_id(); | 533 fetcher = get_url_fetcher_and_advance_id(); |
473 ASSERT_TRUE(fetcher != NULL); | 534 ASSERT_TRUE(fetcher != NULL); |
474 | 535 |
475 EXPECT_EQ(test_server_url_.spec() + kTestJson, | 536 EXPECT_TRUE(IsTestServerUrl(fetcher->GetOriginalURL())); |
476 fetcher->GetOriginalURL().spec()); | |
477 } | 537 } |
478 | 538 |
479 TEST_F(GeolocationNetworkProviderTest, | 539 TEST_F(GeolocationNetworkProviderTest, |
480 NetworkRequestWithWifiDataDeferredForPermission) { | 540 NetworkRequestWithWifiDataDeferredForPermission) { |
481 access_token_store_->access_token_set_[test_server_url_] = | 541 access_token_store_->access_token_set_[test_server_url_] = |
482 UTF8ToUTF16(REFERENCE_ACCESS_TOKEN); | 542 UTF8ToUTF16(REFERENCE_ACCESS_TOKEN); |
483 scoped_ptr<LocationProviderBase> provider(CreateProvider(false)); | 543 scoped_ptr<LocationProviderBase> provider(CreateProvider(false)); |
484 EXPECT_TRUE(provider->StartProvider(false)); | 544 EXPECT_TRUE(provider->StartProvider(false)); |
485 net::TestURLFetcher* fetcher = get_url_fetcher_and_advance_id(); | 545 net::TestURLFetcher* fetcher = get_url_fetcher_and_advance_id(); |
486 EXPECT_FALSE(fetcher); | 546 EXPECT_FALSE(fetcher); |
487 | 547 |
488 static const int kScanCount = 4; | 548 static const int kScanCount = 4; |
489 wifi_data_provider_->SetData(CreateReferenceWifiScanData(kScanCount)); | 549 wifi_data_provider_->SetData(CreateReferenceWifiScanData(kScanCount)); |
490 main_message_loop_.RunAllPending(); | 550 main_message_loop_.RunAllPending(); |
491 | 551 |
492 fetcher = get_url_fetcher_and_advance_id(); | 552 fetcher = get_url_fetcher_and_advance_id(); |
493 EXPECT_FALSE(fetcher); | 553 EXPECT_FALSE(fetcher); |
494 | 554 |
495 provider->OnPermissionGranted(); | 555 provider->OnPermissionGranted(); |
496 | 556 |
497 fetcher = get_url_fetcher_and_advance_id(); | 557 fetcher = get_url_fetcher_and_advance_id(); |
498 ASSERT_TRUE(fetcher != NULL); | 558 ASSERT_TRUE(fetcher != NULL); |
499 | 559 |
500 CheckRequestIsValid(fetcher->GetOriginalURL().spec(), 0, | 560 CheckRequestIsValid(*fetcher, 0, kScanCount, 0, REFERENCE_ACCESS_TOKEN); |
501 kScanCount, 0, REFERENCE_ACCESS_TOKEN); | |
502 } | 561 } |
503 | 562 |
504 TEST_F(GeolocationNetworkProviderTest, NetworkPositionCache) { | 563 TEST_F(GeolocationNetworkProviderTest, NetworkPositionCache) { |
505 NetworkLocationProvider::PositionCache cache; | 564 NetworkLocationProvider::PositionCache cache; |
506 | 565 |
507 const int kCacheSize = NetworkLocationProvider::PositionCache::kMaximumSize; | 566 const int kCacheSize = NetworkLocationProvider::PositionCache::kMaximumSize; |
508 for (int i = 1; i < kCacheSize * 2 + 1; ++i) { | 567 for (int i = 1; i < kCacheSize * 2 + 1; ++i) { |
509 Geoposition pos = CreateReferencePosition(i); | 568 Geoposition pos = CreateReferencePosition(i); |
510 bool ret = cache.CachePosition(CreateReferenceWifiScanData(i), pos); | 569 bool ret = cache.CachePosition(CreateReferenceWifiScanData(i), pos); |
511 EXPECT_TRUE(ret) << i; | 570 EXPECT_TRUE(ret) << i; |
512 const Geoposition* item = | 571 const Geoposition* item = |
513 cache.FindPosition(CreateReferenceWifiScanData(i)); | 572 cache.FindPosition(CreateReferenceWifiScanData(i)); |
514 ASSERT_TRUE(item) << i; | 573 ASSERT_TRUE(item) << i; |
515 EXPECT_EQ(pos.latitude, item->latitude) << i; | 574 EXPECT_EQ(pos.latitude, item->latitude) << i; |
516 EXPECT_EQ(pos.longitude, item->longitude) << i; | 575 EXPECT_EQ(pos.longitude, item->longitude) << i; |
517 if (i <= kCacheSize) { | 576 if (i <= kCacheSize) { |
518 // Nothing should have spilled yet; check oldest item is still there. | 577 // Nothing should have spilled yet; check oldest item is still there. |
519 EXPECT_TRUE(cache.FindPosition(CreateReferenceWifiScanData(1))); | 578 EXPECT_TRUE(cache.FindPosition(CreateReferenceWifiScanData(1))); |
520 } else { | 579 } else { |
521 const int evicted = i - kCacheSize; | 580 const int evicted = i - kCacheSize; |
522 EXPECT_FALSE(cache.FindPosition(CreateReferenceWifiScanData(evicted))); | 581 EXPECT_FALSE(cache.FindPosition(CreateReferenceWifiScanData(evicted))); |
523 EXPECT_TRUE(cache.FindPosition(CreateReferenceWifiScanData(evicted + 1))); | 582 EXPECT_TRUE(cache.FindPosition(CreateReferenceWifiScanData(evicted + 1))); |
524 } | 583 } |
525 } | 584 } |
526 } | 585 } |
527 | 586 |
528 } // namespace | 587 } // namespace |
OLD | NEW |