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 |