| 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 "device/geolocation/network_location_provider.h" | 5 #include "device/geolocation/network_location_provider.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <memory> | 9 #include <memory> |
| 10 #include <utility> | 10 #include <utility> |
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 138 // TODO(joth): Really these should be in SetUp, not here, but they take no | 138 // TODO(joth): Really these should be in SetUp, not here, but they take no |
| 139 // effect on Mac OS Release builds if done there. I kid not. Figure out why. | 139 // effect on Mac OS Release builds if done there. I kid not. Figure out why. |
| 140 WifiDataProviderManager::SetFactoryForTesting( | 140 WifiDataProviderManager::SetFactoryForTesting( |
| 141 MockWifiDataProvider::GetInstance); | 141 MockWifiDataProvider::GetInstance); |
| 142 } | 142 } |
| 143 | 143 |
| 144 // Returns the current url fetcher (if any) and advances the id ready for the | 144 // Returns the current url fetcher (if any) and advances the id ready for the |
| 145 // next test step. | 145 // next test step. |
| 146 net::TestURLFetcher* get_url_fetcher_and_advance_id() { | 146 net::TestURLFetcher* get_url_fetcher_and_advance_id() { |
| 147 net::TestURLFetcher* fetcher = url_fetcher_factory_.GetFetcherByID( | 147 net::TestURLFetcher* fetcher = url_fetcher_factory_.GetFetcherByID( |
| 148 NetworkLocationRequest::url_fetcher_id_for_tests); | 148 NetworkLocationRequest::url_fetcher_id_for_tests); |
| 149 if (fetcher) | 149 if (fetcher) |
| 150 ++NetworkLocationRequest::url_fetcher_id_for_tests; | 150 ++NetworkLocationRequest::url_fetcher_id_for_tests; |
| 151 return fetcher; | 151 return fetcher; |
| 152 } | 152 } |
| 153 | 153 |
| 154 static int IndexToChannel(int index) { return index + 4; } | 154 static int IndexToChannel(int index) { return index + 4; } |
| 155 | 155 |
| 156 // Creates wifi data containing the specified number of access points, with | 156 // Creates wifi data containing the specified number of access points, with |
| 157 // some differentiating charactistics in each. | 157 // some differentiating charactistics in each. |
| 158 static WifiData CreateReferenceWifiScanData(int ap_count) { | 158 static WifiData CreateReferenceWifiScanData(int ap_count) { |
| 159 WifiData data; | 159 WifiData data; |
| 160 for (int i = 0; i < ap_count; ++i) { | 160 for (int i = 0; i < ap_count; ++i) { |
| 161 AccessPointData ap; | 161 AccessPointData ap; |
| 162 ap.mac_address = | 162 ap.mac_address = |
| 163 base::ASCIIToUTF16(base::StringPrintf("%02d-34-56-78-54-32", i)); | 163 base::ASCIIToUTF16(base::StringPrintf("%02d-34-56-78-54-32", i)); |
| 164 ap.radio_signal_strength = ap_count - i; | 164 ap.radio_signal_strength = ap_count - i; |
| 165 ap.channel = IndexToChannel(i); | 165 ap.channel = IndexToChannel(i); |
| 166 ap.signal_to_noise = i + 42; | 166 ap.signal_to_noise = i + 42; |
| 167 ap.ssid = base::ASCIIToUTF16("Some nice+network|name\\"); | 167 ap.ssid = base::ASCIIToUTF16("Some nice+network|name\\"); |
| 168 data.access_point_data.insert(ap); | 168 data.access_point_data.insert(ap); |
| 169 } | 169 } |
| 170 return data; | 170 return data; |
| 171 } | 171 } |
| 172 | 172 |
| 173 static void CreateReferenceWifiScanDataJson( | 173 static void CreateReferenceWifiScanDataJson( |
| 174 int ap_count, int start_index, base::ListValue* wifi_access_point_list) { | 174 int ap_count, |
| 175 int start_index, |
| 176 base::ListValue* wifi_access_point_list) { |
| 175 std::vector<std::string> wifi_data; | 177 std::vector<std::string> wifi_data; |
| 176 for (int i = 0; i < ap_count; ++i) { | 178 for (int i = 0; i < ap_count; ++i) { |
| 177 std::unique_ptr<base::DictionaryValue> ap(new base::DictionaryValue()); | 179 std::unique_ptr<base::DictionaryValue> ap(new base::DictionaryValue()); |
| 178 ap->SetString("macAddress", base::StringPrintf("%02d-34-56-78-54-32", i)); | 180 ap->SetString("macAddress", base::StringPrintf("%02d-34-56-78-54-32", i)); |
| 179 ap->SetInteger("signalStrength", start_index + ap_count - i); | 181 ap->SetInteger("signalStrength", start_index + ap_count - i); |
| 180 ap->SetInteger("age", 0); | 182 ap->SetInteger("age", 0); |
| 181 ap->SetInteger("channel", IndexToChannel(i)); | 183 ap->SetInteger("channel", IndexToChannel(i)); |
| 182 ap->SetInteger("signalToNoiseRatio", i + 42); | 184 ap->SetInteger("signalToNoiseRatio", i + 42); |
| 183 wifi_access_point_list->Append(std::move(ap)); | 185 wifi_access_point_list->Append(std::move(ap)); |
| 184 } | 186 } |
| (...skipping 25 matching lines...) Expand all Loading... |
| 210 return testing::AssertionSuccess(); | 212 return testing::AssertionSuccess(); |
| 211 } | 213 } |
| 212 | 214 |
| 213 static testing::AssertionResult JsonFieldEquals( | 215 static testing::AssertionResult JsonFieldEquals( |
| 214 const std::string& field, | 216 const std::string& field, |
| 215 const base::DictionaryValue& expected, | 217 const base::DictionaryValue& expected, |
| 216 const base::DictionaryValue& actual) { | 218 const base::DictionaryValue& actual) { |
| 217 const base::Value* expected_value; | 219 const base::Value* expected_value; |
| 218 const base::Value* actual_value; | 220 const base::Value* actual_value; |
| 219 if (!expected.Get(field, &expected_value)) | 221 if (!expected.Get(field, &expected_value)) |
| 220 return testing::AssertionFailure() | 222 return testing::AssertionFailure() << "Expected dictionary " |
| 221 << "Expected dictionary " << PrettyJson(expected) | 223 << PrettyJson(expected) |
| 222 << " is missing field " << field; | 224 << " is missing field " << field; |
| 223 if (!expected.Get(field, &actual_value)) | 225 if (!expected.Get(field, &actual_value)) |
| 224 return testing::AssertionFailure() | 226 return testing::AssertionFailure() << "Actual dictionary " |
| 225 << "Actual dictionary " << PrettyJson(actual) | 227 << PrettyJson(actual) |
| 226 << " is missing field " << field; | 228 << " is missing field " << field; |
| 227 if (!expected_value->Equals(actual_value)) | 229 if (!expected_value->Equals(actual_value)) |
| 228 return testing::AssertionFailure() | 230 return testing::AssertionFailure() |
| 229 << "Field " << field << " mismatch: " << PrettyJson(*expected_value) | 231 << "Field " << field |
| 230 << " != " << PrettyJson(*actual_value); | 232 << " mismatch: " << PrettyJson(*expected_value) |
| 233 << " != " << PrettyJson(*actual_value); |
| 231 return testing::AssertionSuccess(); | 234 return testing::AssertionSuccess(); |
| 232 } | 235 } |
| 233 | 236 |
| 234 static GURL UrlWithoutQuery(const GURL& url) { | 237 static GURL UrlWithoutQuery(const GURL& url) { |
| 235 url::Replacements<char> replacements; | 238 url::Replacements<char> replacements; |
| 236 replacements.ClearQuery(); | 239 replacements.ClearQuery(); |
| 237 return url.ReplaceComponents(replacements); | 240 return url.ReplaceComponents(replacements); |
| 238 } | 241 } |
| 239 | 242 |
| 240 testing::AssertionResult IsTestServerUrl(const GURL& request_url) { | 243 testing::AssertionResult IsTestServerUrl(const GURL& request_url) { |
| 241 const GURL a(UrlWithoutQuery(test_server_url_)); | 244 const GURL a(UrlWithoutQuery(test_server_url_)); |
| 242 const GURL b(UrlWithoutQuery(request_url)); | 245 const GURL b(UrlWithoutQuery(request_url)); |
| 243 if (a == b) | 246 if (a == b) |
| 244 return testing::AssertionSuccess(); | 247 return testing::AssertionSuccess(); |
| 245 return testing::AssertionFailure() << a << " != " << b; | 248 return testing::AssertionFailure() << a << " != " << b; |
| 246 } | 249 } |
| 247 | 250 |
| 248 void CheckRequestIsValid(const net::TestURLFetcher& request, | 251 void CheckRequestIsValid(const net::TestURLFetcher& request, |
| 249 int expected_routers, | 252 int expected_routers, |
| 250 int expected_wifi_aps, | 253 int expected_wifi_aps, |
| 251 int wifi_start_index, | 254 int wifi_start_index, |
| 252 const std::string& expected_access_token) { | 255 const std::string& expected_access_token) { |
| 253 const GURL& request_url = request.GetOriginalURL(); | 256 const GURL& request_url = request.GetOriginalURL(); |
| 254 | 257 |
| 255 EXPECT_TRUE(IsTestServerUrl(request_url)); | 258 EXPECT_TRUE(IsTestServerUrl(request_url)); |
| 256 | 259 |
| 257 // Check to see that the api key is being appended for the default | 260 // Check to see that the api key is being appended for the default |
| 258 // network provider url. | 261 // network provider url. |
| 259 bool is_default_url = UrlWithoutQuery(request_url) == | 262 bool is_default_url = |
| 263 UrlWithoutQuery(request_url) == |
| 260 UrlWithoutQuery(LocationArbitratorImpl::DefaultNetworkProviderURL()); | 264 UrlWithoutQuery(LocationArbitratorImpl::DefaultNetworkProviderURL()); |
| 261 EXPECT_EQ(is_default_url, !request_url.query().empty()); | 265 EXPECT_EQ(is_default_url, !request_url.query().empty()); |
| 262 | 266 |
| 263 const std::string& upload_data = request.upload_data(); | 267 const std::string& upload_data = request.upload_data(); |
| 264 ASSERT_FALSE(upload_data.empty()); | 268 ASSERT_FALSE(upload_data.empty()); |
| 265 std::string json_parse_error_msg; | 269 std::string json_parse_error_msg; |
| 266 std::unique_ptr<base::Value> parsed_json = | 270 std::unique_ptr<base::Value> parsed_json = |
| 267 base::JSONReader::ReadAndReturnError(upload_data, base::JSON_PARSE_RFC, | 271 base::JSONReader::ReadAndReturnError(upload_data, base::JSON_PARSE_RFC, |
| 268 nullptr, &json_parse_error_msg); | 272 nullptr, &json_parse_error_msg); |
| 269 EXPECT_TRUE(json_parse_error_msg.empty()); | 273 EXPECT_TRUE(json_parse_error_msg.empty()); |
| 270 ASSERT_TRUE(parsed_json); | 274 ASSERT_TRUE(parsed_json); |
| 271 | 275 |
| 272 const base::DictionaryValue* request_json; | 276 const base::DictionaryValue* request_json; |
| 273 ASSERT_TRUE(parsed_json->GetAsDictionary(&request_json)); | 277 ASSERT_TRUE(parsed_json->GetAsDictionary(&request_json)); |
| 274 | 278 |
| 275 if (!is_default_url) { | 279 if (!is_default_url) { |
| 276 if (expected_access_token.empty()) | 280 if (expected_access_token.empty()) |
| 277 ASSERT_FALSE(request_json->HasKey(kAccessTokenString)); | 281 ASSERT_FALSE(request_json->HasKey(kAccessTokenString)); |
| 278 else { | 282 else { |
| 279 std::string access_token; | 283 std::string access_token; |
| 280 EXPECT_TRUE(request_json->GetString(kAccessTokenString, &access_token)); | 284 EXPECT_TRUE(request_json->GetString(kAccessTokenString, &access_token)); |
| 281 EXPECT_EQ(expected_access_token, access_token); | 285 EXPECT_EQ(expected_access_token, access_token); |
| 282 } | 286 } |
| 283 } | 287 } |
| 284 | 288 |
| 285 if (expected_wifi_aps) { | 289 if (expected_wifi_aps) { |
| 286 base::ListValue expected_wifi_aps_json; | 290 base::ListValue expected_wifi_aps_json; |
| 287 CreateReferenceWifiScanDataJson( | 291 CreateReferenceWifiScanDataJson(expected_wifi_aps, wifi_start_index, |
| 288 expected_wifi_aps, | 292 &expected_wifi_aps_json); |
| 289 wifi_start_index, | |
| 290 &expected_wifi_aps_json); | |
| 291 EXPECT_EQ(size_t(expected_wifi_aps), expected_wifi_aps_json.GetSize()); | 293 EXPECT_EQ(size_t(expected_wifi_aps), expected_wifi_aps_json.GetSize()); |
| 292 | 294 |
| 293 const base::ListValue* wifi_aps_json; | 295 const base::ListValue* wifi_aps_json; |
| 294 ASSERT_TRUE(JsonGetList("wifiAccessPoints", *request_json, | 296 ASSERT_TRUE( |
| 295 &wifi_aps_json)); | 297 JsonGetList("wifiAccessPoints", *request_json, &wifi_aps_json)); |
| 296 for (size_t i = 0; i < expected_wifi_aps_json.GetSize(); ++i ) { | 298 for (size_t i = 0; i < expected_wifi_aps_json.GetSize(); ++i) { |
| 297 const base::DictionaryValue* expected_json; | 299 const base::DictionaryValue* expected_json; |
| 298 ASSERT_TRUE(expected_wifi_aps_json.GetDictionary(i, &expected_json)); | 300 ASSERT_TRUE(expected_wifi_aps_json.GetDictionary(i, &expected_json)); |
| 299 const base::DictionaryValue* actual_json; | 301 const base::DictionaryValue* actual_json; |
| 300 ASSERT_TRUE(wifi_aps_json->GetDictionary(i, &actual_json)); | 302 ASSERT_TRUE(wifi_aps_json->GetDictionary(i, &actual_json)); |
| 301 ASSERT_TRUE(JsonFieldEquals("macAddress", *expected_json, | 303 ASSERT_TRUE( |
| 302 *actual_json)); | 304 JsonFieldEquals("macAddress", *expected_json, *actual_json)); |
| 303 ASSERT_TRUE(JsonFieldEquals("signalStrength", *expected_json, | 305 ASSERT_TRUE( |
| 304 *actual_json)); | 306 JsonFieldEquals("signalStrength", *expected_json, *actual_json)); |
| 305 ASSERT_TRUE(JsonFieldEquals("channel", *expected_json, *actual_json)); | 307 ASSERT_TRUE(JsonFieldEquals("channel", *expected_json, *actual_json)); |
| 306 ASSERT_TRUE(JsonFieldEquals("signalToNoiseRatio", *expected_json, | 308 ASSERT_TRUE(JsonFieldEquals("signalToNoiseRatio", *expected_json, |
| 307 *actual_json)); | 309 *actual_json)); |
| 308 } | 310 } |
| 309 } else { | 311 } else { |
| 310 ASSERT_FALSE(request_json->HasKey("wifiAccessPoints")); | 312 ASSERT_FALSE(request_json->HasKey("wifiAccessPoints")); |
| 311 } | 313 } |
| 312 EXPECT_TRUE(request_url.is_valid()); | 314 EXPECT_TRUE(request_url.is_valid()); |
| 313 } | 315 } |
| 314 | 316 |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 388 wifi_data_provider_->SetData(CreateReferenceWifiScanData(kFirstScanAps)); | 390 wifi_data_provider_->SetData(CreateReferenceWifiScanData(kFirstScanAps)); |
| 389 base::RunLoop().RunUntilIdle(); | 391 base::RunLoop().RunUntilIdle(); |
| 390 fetcher = get_url_fetcher_and_advance_id(); | 392 fetcher = get_url_fetcher_and_advance_id(); |
| 391 ASSERT_TRUE(fetcher); | 393 ASSERT_TRUE(fetcher); |
| 392 // The request should have the wifi data. | 394 // The request should have the wifi data. |
| 393 CheckRequestIsValid(*fetcher, 0, kFirstScanAps, 0, std::string()); | 395 CheckRequestIsValid(*fetcher, 0, kFirstScanAps, 0, std::string()); |
| 394 | 396 |
| 395 // Send a reply with good position fix. | 397 // Send a reply with good position fix. |
| 396 const char* kReferenceNetworkResponse = | 398 const char* kReferenceNetworkResponse = |
| 397 "{" | 399 "{" |
| 398 " \"accessToken\": \"" REFERENCE_ACCESS_TOKEN "\"," | 400 " \"accessToken\": \"" REFERENCE_ACCESS_TOKEN |
| 401 "\"," |
| 399 " \"accuracy\": 1200.4," | 402 " \"accuracy\": 1200.4," |
| 400 " \"location\": {" | 403 " \"location\": {" |
| 401 " \"lat\": 51.0," | 404 " \"lat\": 51.0," |
| 402 " \"lng\": -0.1" | 405 " \"lng\": -0.1" |
| 403 " }" | 406 " }" |
| 404 "}"; | 407 "}"; |
| 405 fetcher->set_url(test_server_url_); | 408 fetcher->set_url(test_server_url_); |
| 406 fetcher->set_status(net::URLRequestStatus()); | 409 fetcher->set_status(net::URLRequestStatus()); |
| 407 fetcher->set_response_code(200); // OK | 410 fetcher->set_response_code(200); // OK |
| 408 fetcher->SetResponseString(kReferenceNetworkResponse); | 411 fetcher->SetResponseString(kReferenceNetworkResponse); |
| (...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 532 CheckRequestIsValid(*fetcher, 0, kScanCount, 0, REFERENCE_ACCESS_TOKEN); | 535 CheckRequestIsValid(*fetcher, 0, kScanCount, 0, REFERENCE_ACCESS_TOKEN); |
| 533 } | 536 } |
| 534 | 537 |
| 535 TEST_F(GeolocationNetworkProviderTest, NetworkPositionCache) { | 538 TEST_F(GeolocationNetworkProviderTest, NetworkPositionCache) { |
| 536 NetworkLocationProvider::PositionCache cache; | 539 NetworkLocationProvider::PositionCache cache; |
| 537 | 540 |
| 538 const int kCacheSize = NetworkLocationProvider::PositionCache::kMaximumSize; | 541 const int kCacheSize = NetworkLocationProvider::PositionCache::kMaximumSize; |
| 539 for (int i = 1; i < kCacheSize * 2 + 1; ++i) { | 542 for (int i = 1; i < kCacheSize * 2 + 1; ++i) { |
| 540 Geoposition pos = CreateReferencePosition(i); | 543 Geoposition pos = CreateReferencePosition(i); |
| 541 bool ret = cache.CachePosition(CreateReferenceWifiScanData(i), pos); | 544 bool ret = cache.CachePosition(CreateReferenceWifiScanData(i), pos); |
| 542 EXPECT_TRUE(ret) << i; | 545 EXPECT_TRUE(ret) << i; |
| 543 const Geoposition* item = | 546 const Geoposition* item = |
| 544 cache.FindPosition(CreateReferenceWifiScanData(i)); | 547 cache.FindPosition(CreateReferenceWifiScanData(i)); |
| 545 ASSERT_TRUE(item) << i; | 548 ASSERT_TRUE(item) << i; |
| 546 EXPECT_EQ(pos.latitude, item->latitude) << i; | 549 EXPECT_EQ(pos.latitude, item->latitude) << i; |
| 547 EXPECT_EQ(pos.longitude, item->longitude) << i; | 550 EXPECT_EQ(pos.longitude, item->longitude) << i; |
| 548 if (i <= kCacheSize) { | 551 if (i <= kCacheSize) { |
| 549 // Nothing should have spilled yet; check oldest item is still there. | 552 // Nothing should have spilled yet; check oldest item is still there. |
| 550 EXPECT_TRUE(cache.FindPosition(CreateReferenceWifiScanData(1))); | 553 EXPECT_TRUE(cache.FindPosition(CreateReferenceWifiScanData(1))); |
| 551 } else { | 554 } else { |
| 552 const int evicted = i - kCacheSize; | 555 const int evicted = i - kCacheSize; |
| 553 EXPECT_FALSE(cache.FindPosition(CreateReferenceWifiScanData(evicted))); | 556 EXPECT_FALSE(cache.FindPosition(CreateReferenceWifiScanData(evicted))); |
| 554 EXPECT_TRUE(cache.FindPosition(CreateReferenceWifiScanData(evicted + 1))); | 557 EXPECT_TRUE(cache.FindPosition(CreateReferenceWifiScanData(evicted + 1))); |
| 555 } | 558 } |
| 556 } | 559 } |
| 557 } | 560 } |
| 558 | 561 |
| 559 } // namespace device | 562 } // namespace device |
| OLD | NEW |