| 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 <string> | 10 #include <string> |
| (...skipping 317 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 328 // Test fixture members were SetUp correctly. | 328 // Test fixture members were SetUp correctly. |
| 329 EXPECT_EQ(&main_message_loop_, base::MessageLoop::current()); | 329 EXPECT_EQ(&main_message_loop_, base::MessageLoop::current()); |
| 330 std::unique_ptr<LocationProvider> provider(CreateProvider(true)); | 330 std::unique_ptr<LocationProvider> provider(CreateProvider(true)); |
| 331 EXPECT_TRUE(provider); | 331 EXPECT_TRUE(provider); |
| 332 provider.reset(); | 332 provider.reset(); |
| 333 SUCCEED(); | 333 SUCCEED(); |
| 334 } | 334 } |
| 335 | 335 |
| 336 TEST_F(GeolocationNetworkProviderTest, StartProvider) { | 336 TEST_F(GeolocationNetworkProviderTest, StartProvider) { |
| 337 std::unique_ptr<LocationProvider> provider(CreateProvider(true)); | 337 std::unique_ptr<LocationProvider> provider(CreateProvider(true)); |
| 338 EXPECT_TRUE(provider->StartProvider(false)); | 338 EXPECT_TRUE(provider->StartProvider(true)); |
| 339 net::TestURLFetcher* fetcher = get_url_fetcher_and_advance_id(); | 339 net::TestURLFetcher* fetcher = get_url_fetcher_and_advance_id(); |
| 340 ASSERT_TRUE(fetcher); | 340 ASSERT_TRUE(fetcher); |
| 341 CheckRequestIsValid(*fetcher, 0, 0, 0, std::string()); | 341 CheckRequestIsValid(*fetcher, 0, 0, 0, std::string()); |
| 342 } | 342 } |
| 343 | 343 |
| 344 TEST_F(GeolocationNetworkProviderTest, StartProviderDefaultUrl) { | 344 TEST_F(GeolocationNetworkProviderTest, StartProviderDefaultUrl) { |
| 345 test_server_url_ = LocationArbitrator::DefaultNetworkProviderURL(); | 345 test_server_url_ = LocationArbitrator::DefaultNetworkProviderURL(); |
| 346 std::unique_ptr<LocationProvider> provider(CreateProvider(true)); | 346 std::unique_ptr<LocationProvider> provider(CreateProvider(true)); |
| 347 EXPECT_TRUE(provider->StartProvider(false)); | 347 EXPECT_TRUE(provider->StartProvider(true)); |
| 348 net::TestURLFetcher* fetcher = get_url_fetcher_and_advance_id(); | 348 net::TestURLFetcher* fetcher = get_url_fetcher_and_advance_id(); |
| 349 ASSERT_TRUE(fetcher); | 349 ASSERT_TRUE(fetcher); |
| 350 CheckRequestIsValid(*fetcher, 0, 0, 0, std::string()); | 350 CheckRequestIsValid(*fetcher, 0, 0, 0, std::string()); |
| 351 } | 351 } |
| 352 | 352 |
| 353 TEST_F(GeolocationNetworkProviderTest, StartProviderLongRequest) { | 353 TEST_F(GeolocationNetworkProviderTest, StartProviderLongRequest) { |
| 354 std::unique_ptr<LocationProvider> provider(CreateProvider(true)); | 354 std::unique_ptr<LocationProvider> provider(CreateProvider(true)); |
| 355 EXPECT_TRUE(provider->StartProvider(false)); | 355 EXPECT_TRUE(provider->StartProvider(true)); |
| 356 const int kFirstScanAps = 20; | 356 const int kFirstScanAps = 20; |
| 357 wifi_data_provider_->SetData(CreateReferenceWifiScanData(kFirstScanAps)); | 357 wifi_data_provider_->SetData(CreateReferenceWifiScanData(kFirstScanAps)); |
| 358 base::RunLoop().RunUntilIdle(); | 358 base::RunLoop().RunUntilIdle(); |
| 359 net::TestURLFetcher* fetcher = get_url_fetcher_and_advance_id(); | 359 net::TestURLFetcher* fetcher = get_url_fetcher_and_advance_id(); |
| 360 ASSERT_TRUE(fetcher); | 360 ASSERT_TRUE(fetcher); |
| 361 // The request url should have been shortened to less than 2048 characters | 361 // The request url should have been shortened to less than 2048 characters |
| 362 // in length by not including access points with the lowest signal strength | 362 // in length by not including access points with the lowest signal strength |
| 363 // in the request. | 363 // in the request. |
| 364 EXPECT_LT(fetcher->GetOriginalURL().spec().size(), size_t(2048)); | 364 EXPECT_LT(fetcher->GetOriginalURL().spec().size(), size_t(2048)); |
| 365 CheckRequestIsValid(*fetcher, 0, 16, 4, std::string()); | 365 CheckRequestIsValid(*fetcher, 0, 16, 4, std::string()); |
| 366 } | 366 } |
| 367 | 367 |
| 368 TEST_F(GeolocationNetworkProviderTest, MultipleWifiScansComplete) { | 368 TEST_F(GeolocationNetworkProviderTest, MultipleWifiScansComplete) { |
| 369 std::unique_ptr<LocationProvider> provider(CreateProvider(true)); | 369 std::unique_ptr<LocationProvider> provider(CreateProvider(true)); |
| 370 EXPECT_TRUE(provider->StartProvider(false)); | 370 EXPECT_TRUE(provider->StartProvider(true)); |
| 371 | 371 |
| 372 net::TestURLFetcher* fetcher = get_url_fetcher_and_advance_id(); | 372 net::TestURLFetcher* fetcher = get_url_fetcher_and_advance_id(); |
| 373 ASSERT_TRUE(fetcher); | 373 ASSERT_TRUE(fetcher); |
| 374 EXPECT_TRUE(IsTestServerUrl(fetcher->GetOriginalURL())); | 374 EXPECT_TRUE(IsTestServerUrl(fetcher->GetOriginalURL())); |
| 375 | 375 |
| 376 // Complete the network request with bad position fix. | 376 // Complete the network request with bad position fix. |
| 377 const char* kNoFixNetworkResponse = | 377 const char* kNoFixNetworkResponse = |
| 378 "{" | 378 "{" |
| 379 " \"status\": \"ZERO_RESULTS\"" | 379 " \"status\": \"ZERO_RESULTS\"" |
| 380 "}"; | 380 "}"; |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 464 position = provider->GetPosition(); | 464 position = provider->GetPosition(); |
| 465 EXPECT_EQ(51.0, position.latitude); | 465 EXPECT_EQ(51.0, position.latitude); |
| 466 EXPECT_EQ(-0.1, position.longitude); | 466 EXPECT_EQ(-0.1, position.longitude); |
| 467 EXPECT_TRUE(position.Validate()); | 467 EXPECT_TRUE(position.Validate()); |
| 468 } | 468 } |
| 469 | 469 |
| 470 TEST_F(GeolocationNetworkProviderTest, NoRequestOnStartupUntilWifiData) { | 470 TEST_F(GeolocationNetworkProviderTest, NoRequestOnStartupUntilWifiData) { |
| 471 MessageLoopQuitListener listener; | 471 MessageLoopQuitListener listener; |
| 472 wifi_data_provider_->set_got_data(false); | 472 wifi_data_provider_->set_got_data(false); |
| 473 std::unique_ptr<LocationProvider> provider(CreateProvider(true)); | 473 std::unique_ptr<LocationProvider> provider(CreateProvider(true)); |
| 474 EXPECT_TRUE(provider->StartProvider(false)); | 474 EXPECT_TRUE(provider->StartProvider(true)); |
| 475 | 475 |
| 476 provider->SetUpdateCallback(base::Bind( | 476 provider->SetUpdateCallback(base::Bind( |
| 477 &MessageLoopQuitListener::OnLocationUpdate, base::Unretained(&listener))); | 477 &MessageLoopQuitListener::OnLocationUpdate, base::Unretained(&listener))); |
| 478 | 478 |
| 479 base::RunLoop().RunUntilIdle(); | 479 base::RunLoop().RunUntilIdle(); |
| 480 EXPECT_FALSE(get_url_fetcher_and_advance_id()) | 480 EXPECT_FALSE(get_url_fetcher_and_advance_id()) |
| 481 << "Network request should not be created right away on startup when " | 481 << "Network request should not be created right away on startup when " |
| 482 "wifi data has not yet arrived"; | 482 "wifi data has not yet arrived"; |
| 483 | 483 |
| 484 wifi_data_provider_->SetData(CreateReferenceWifiScanData(1)); | 484 wifi_data_provider_->SetData(CreateReferenceWifiScanData(1)); |
| 485 base::RunLoop().RunUntilIdle(); | 485 base::RunLoop().RunUntilIdle(); |
| 486 EXPECT_TRUE(get_url_fetcher_and_advance_id()); | 486 EXPECT_TRUE(get_url_fetcher_and_advance_id()); |
| 487 } | 487 } |
| 488 | 488 |
| 489 TEST_F(GeolocationNetworkProviderTest, NewDataReplacesExistingNetworkRequest) { | 489 TEST_F(GeolocationNetworkProviderTest, NewDataReplacesExistingNetworkRequest) { |
| 490 // Send initial request with empty data | 490 // Send initial request with empty data |
| 491 std::unique_ptr<LocationProvider> provider(CreateProvider(true)); | 491 std::unique_ptr<LocationProvider> provider(CreateProvider(true)); |
| 492 EXPECT_TRUE(provider->StartProvider(false)); | 492 EXPECT_TRUE(provider->StartProvider(true)); |
| 493 net::TestURLFetcher* fetcher = get_url_fetcher_and_advance_id(); | 493 net::TestURLFetcher* fetcher = get_url_fetcher_and_advance_id(); |
| 494 EXPECT_TRUE(fetcher); | 494 EXPECT_TRUE(fetcher); |
| 495 | 495 |
| 496 // Now wifi data arrives; new request should be sent. | 496 // Now wifi data arrives; new request should be sent. |
| 497 wifi_data_provider_->SetData(CreateReferenceWifiScanData(4)); | 497 wifi_data_provider_->SetData(CreateReferenceWifiScanData(4)); |
| 498 base::RunLoop().RunUntilIdle(); | 498 base::RunLoop().RunUntilIdle(); |
| 499 fetcher = get_url_fetcher_and_advance_id(); | 499 fetcher = get_url_fetcher_and_advance_id(); |
| 500 EXPECT_TRUE(fetcher); | 500 EXPECT_TRUE(fetcher); |
| 501 } | 501 } |
| 502 | 502 |
| 503 TEST_F(GeolocationNetworkProviderTest, NetworkRequestDeferredForPermission) { | 503 TEST_F(GeolocationNetworkProviderTest, NetworkRequestDeferredForPermission) { |
| 504 std::unique_ptr<LocationProvider> provider(CreateProvider(false)); | 504 std::unique_ptr<LocationProvider> provider(CreateProvider(false)); |
| 505 EXPECT_TRUE(provider->StartProvider(false)); | 505 EXPECT_TRUE(provider->StartProvider(true)); |
| 506 net::TestURLFetcher* fetcher = get_url_fetcher_and_advance_id(); | 506 net::TestURLFetcher* fetcher = get_url_fetcher_and_advance_id(); |
| 507 EXPECT_FALSE(fetcher); | 507 EXPECT_FALSE(fetcher); |
| 508 provider->OnPermissionGranted(); | 508 provider->OnPermissionGranted(); |
| 509 | 509 |
| 510 fetcher = get_url_fetcher_and_advance_id(); | 510 fetcher = get_url_fetcher_and_advance_id(); |
| 511 ASSERT_TRUE(fetcher); | 511 ASSERT_TRUE(fetcher); |
| 512 | 512 |
| 513 EXPECT_TRUE(IsTestServerUrl(fetcher->GetOriginalURL())); | 513 EXPECT_TRUE(IsTestServerUrl(fetcher->GetOriginalURL())); |
| 514 } | 514 } |
| 515 | 515 |
| 516 TEST_F(GeolocationNetworkProviderTest, | 516 TEST_F(GeolocationNetworkProviderTest, |
| 517 NetworkRequestWithWifiDataDeferredForPermission) { | 517 NetworkRequestWithWifiDataDeferredForPermission) { |
| 518 access_token_store_->access_token_map_[test_server_url_] = | 518 access_token_store_->access_token_map_[test_server_url_] = |
| 519 base::UTF8ToUTF16(REFERENCE_ACCESS_TOKEN); | 519 base::UTF8ToUTF16(REFERENCE_ACCESS_TOKEN); |
| 520 std::unique_ptr<LocationProvider> provider(CreateProvider(false)); | 520 std::unique_ptr<LocationProvider> provider(CreateProvider(false)); |
| 521 EXPECT_TRUE(provider->StartProvider(false)); | 521 EXPECT_TRUE(provider->StartProvider(true)); |
| 522 net::TestURLFetcher* fetcher = get_url_fetcher_and_advance_id(); | 522 net::TestURLFetcher* fetcher = get_url_fetcher_and_advance_id(); |
| 523 EXPECT_FALSE(fetcher); | 523 EXPECT_FALSE(fetcher); |
| 524 | 524 |
| 525 static const int kScanCount = 4; | 525 static const int kScanCount = 4; |
| 526 wifi_data_provider_->SetData(CreateReferenceWifiScanData(kScanCount)); | 526 wifi_data_provider_->SetData(CreateReferenceWifiScanData(kScanCount)); |
| 527 base::RunLoop().RunUntilIdle(); | 527 base::RunLoop().RunUntilIdle(); |
| 528 | 528 |
| 529 fetcher = get_url_fetcher_and_advance_id(); | 529 fetcher = get_url_fetcher_and_advance_id(); |
| 530 EXPECT_FALSE(fetcher); | 530 EXPECT_FALSE(fetcher); |
| 531 | 531 |
| (...skipping 22 matching lines...) Expand all Loading... |
| 554 // Nothing should have spilled yet; check oldest item is still there. | 554 // Nothing should have spilled yet; check oldest item is still there. |
| 555 EXPECT_TRUE(cache.FindPosition(CreateReferenceWifiScanData(1))); | 555 EXPECT_TRUE(cache.FindPosition(CreateReferenceWifiScanData(1))); |
| 556 } else { | 556 } else { |
| 557 const int evicted = i - kCacheSize; | 557 const int evicted = i - kCacheSize; |
| 558 EXPECT_FALSE(cache.FindPosition(CreateReferenceWifiScanData(evicted))); | 558 EXPECT_FALSE(cache.FindPosition(CreateReferenceWifiScanData(evicted))); |
| 559 EXPECT_TRUE(cache.FindPosition(CreateReferenceWifiScanData(evicted + 1))); | 559 EXPECT_TRUE(cache.FindPosition(CreateReferenceWifiScanData(evicted + 1))); |
| 560 } | 560 } |
| 561 } | 561 } |
| 562 } | 562 } |
| 563 | 563 |
| 564 TEST_F(GeolocationNetworkProviderTest, RequestLowAccuracyPosition) { |
| 565 std::unique_ptr<LocationProvider> provider(CreateProvider(true)); |
| 566 EXPECT_TRUE(provider->StartProvider(false)); |
| 567 net::TestURLFetcher* fetcher = get_url_fetcher_and_advance_id(); |
| 568 ASSERT_TRUE(fetcher); |
| 569 EXPECT_TRUE(IsTestServerUrl(fetcher->GetOriginalURL())); |
| 570 CheckRequestIsValid(*fetcher, 0, 0, 0, std::string()); |
| 571 |
| 572 // Send a reply with good position fix. |
| 573 const char* kReferenceNetworkResponse = |
| 574 "{" |
| 575 " \"accessToken\": \"" REFERENCE_ACCESS_TOKEN |
| 576 "\"," |
| 577 " \"accuracy\": 1200.4," |
| 578 " \"location\": {" |
| 579 " \"lat\": 51.0," |
| 580 " \"lng\": -0.1" |
| 581 " }" |
| 582 "}"; |
| 583 fetcher->set_url(test_server_url_); |
| 584 fetcher->set_status(net::URLRequestStatus()); |
| 585 fetcher->set_response_code(200); // OK |
| 586 fetcher->SetResponseString(kReferenceNetworkResponse); |
| 587 fetcher->delegate()->OnURLFetchComplete(fetcher); |
| 588 |
| 589 Geoposition position = provider->GetPosition(); |
| 590 EXPECT_EQ(51.0, position.latitude); |
| 591 EXPECT_EQ(-0.1, position.longitude); |
| 592 EXPECT_EQ(1200.4, position.accuracy); |
| 593 EXPECT_FALSE(position.timestamp.is_null()); |
| 594 EXPECT_TRUE(position.Validate()); |
| 595 |
| 596 // Wifi scans should not affect the provider and no new requests should be |
| 597 // made. |
| 598 wifi_data_provider_->SetData(CreateReferenceWifiScanData(5 /* ap_count */)); |
| 599 base::RunLoop().RunUntilIdle(); |
| 600 EXPECT_FALSE(get_url_fetcher_and_advance_id()); // No new request created. |
| 601 } |
| 602 |
| 564 } // namespace device | 603 } // namespace device |
| OLD | NEW |