core_location_provider_unittest.mm 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. // Copyright 2020 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. #include "services/device/geolocation/core_location_provider.h"
  5. #include "base/run_loop.h"
  6. #include "base/test/bind.h"
  7. #include "base/test/task_environment.h"
  8. #include "base/time/time.h"
  9. #include "services/device/public/cpp/geolocation/geoposition.h"
  10. #include "services/device/public/cpp/test/fake_geolocation_manager.h"
  11. #include "testing/gtest/include/gtest/gtest.h"
  12. namespace device {
  13. class CoreLocationProviderTest : public testing::Test {
  14. public:
  15. std::unique_ptr<CoreLocationProvider> provider_;
  16. protected:
  17. CoreLocationProviderTest() {}
  18. void InitializeProvider() {
  19. fake_geolocation_manager_ = std::make_unique<FakeGeolocationManager>();
  20. provider_ = std::make_unique<CoreLocationProvider>(
  21. base::ThreadTaskRunnerHandle::Get(), fake_geolocation_manager_.get());
  22. }
  23. bool IsUpdating() { return fake_geolocation_manager_->watching_position(); }
  24. // updates the position synchronously
  25. void FakeUpdatePosition(const mojom::Geoposition position) {
  26. fake_geolocation_manager_->FakePositionUpdated(position);
  27. }
  28. const mojom::Geoposition& GetLatestPosition() {
  29. return provider_->GetPosition();
  30. }
  31. base::test::TaskEnvironment task_environment_;
  32. const LocationProvider::LocationProviderUpdateCallback callback_;
  33. std::unique_ptr<FakeGeolocationManager> fake_geolocation_manager_;
  34. };
  35. TEST_F(CoreLocationProviderTest, CreateDestroy) {
  36. InitializeProvider();
  37. EXPECT_TRUE(provider_);
  38. provider_.reset();
  39. }
  40. TEST_F(CoreLocationProviderTest, StartAndStopUpdating) {
  41. InitializeProvider();
  42. fake_geolocation_manager_->SetSystemPermission(
  43. LocationSystemPermissionStatus::kAllowed);
  44. base::RunLoop().RunUntilIdle();
  45. provider_->StartProvider(/*high_accuracy=*/true);
  46. EXPECT_TRUE(IsUpdating());
  47. provider_->StopProvider();
  48. EXPECT_FALSE(IsUpdating());
  49. provider_.reset();
  50. }
  51. TEST_F(CoreLocationProviderTest, DontStartUpdatingIfPermissionDenied) {
  52. InitializeProvider();
  53. fake_geolocation_manager_->SetSystemPermission(
  54. LocationSystemPermissionStatus::kDenied);
  55. base::RunLoop().RunUntilIdle();
  56. provider_->StartProvider(/*high_accuracy=*/true);
  57. EXPECT_FALSE(IsUpdating());
  58. provider_.reset();
  59. }
  60. TEST_F(CoreLocationProviderTest, DontStartUpdatingUntilPermissionGranted) {
  61. InitializeProvider();
  62. provider_->StartProvider(/*high_accuracy=*/true);
  63. EXPECT_FALSE(IsUpdating());
  64. fake_geolocation_manager_->SetSystemPermission(
  65. LocationSystemPermissionStatus::kDenied);
  66. base::RunLoop().RunUntilIdle();
  67. EXPECT_FALSE(IsUpdating());
  68. fake_geolocation_manager_->SetSystemPermission(
  69. LocationSystemPermissionStatus::kAllowed);
  70. base::RunLoop().RunUntilIdle();
  71. EXPECT_TRUE(IsUpdating());
  72. provider_.reset();
  73. }
  74. TEST_F(CoreLocationProviderTest, GetPositionUpdates) {
  75. InitializeProvider();
  76. fake_geolocation_manager_->SetSystemPermission(
  77. LocationSystemPermissionStatus::kAllowed);
  78. base::RunLoop().RunUntilIdle();
  79. provider_->StartProvider(/*high_accuracy=*/true);
  80. EXPECT_TRUE(IsUpdating());
  81. // test info
  82. double latitude = 147.147;
  83. double longitude = 101.101;
  84. double altitude = 417.417;
  85. double accuracy = 10.5;
  86. double altitude_accuracy = 15.5;
  87. mojom::Geoposition test_position;
  88. test_position.latitude = latitude;
  89. test_position.longitude = longitude;
  90. test_position.altitude = altitude;
  91. test_position.accuracy = accuracy;
  92. test_position.altitude_accuracy = altitude_accuracy;
  93. test_position.timestamp = base::Time::Now();
  94. base::RunLoop loop;
  95. provider_->SetUpdateCallback(
  96. base::BindLambdaForTesting([&](const LocationProvider* provider,
  97. const mojom::Geoposition& position) {
  98. EXPECT_TRUE(test_position.Equals(position));
  99. loop.Quit();
  100. }));
  101. FakeUpdatePosition(test_position);
  102. loop.Run();
  103. EXPECT_TRUE(GetLatestPosition().Equals(test_position));
  104. provider_->StopProvider();
  105. EXPECT_FALSE(IsUpdating());
  106. provider_.reset();
  107. }
  108. } // namespace device