[go: nahoru, domu]

blob: b0b954c8ee438d07935549a179274529001cb3e6 [file] [log] [blame]
// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "services/device/geolocation/core_location_provider.h"
#include "base/run_loop.h"
#include "base/test/bind.h"
#include "base/test/task_environment.h"
#include "base/time/time.h"
#include "services/device/public/cpp/geolocation/geoposition.h"
#include "services/device/public/cpp/test/fake_geolocation_manager.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace device {
class CoreLocationProviderTest : public testing::Test {
public:
std::unique_ptr<CoreLocationProvider> provider_;
protected:
CoreLocationProviderTest() {}
void InitializeProvider() {
fake_geolocation_manager_ = std::make_unique<FakeGeolocationManager>();
provider_ = std::make_unique<CoreLocationProvider>(
base::ThreadTaskRunnerHandle::Get(), fake_geolocation_manager_.get());
}
bool IsUpdating() { return fake_geolocation_manager_->watching_position(); }
// updates the position synchronously
void FakeUpdatePosition(const mojom::Geoposition position) {
fake_geolocation_manager_->FakePositionUpdated(position);
}
const mojom::Geoposition& GetLatestPosition() {
return provider_->GetPosition();
}
base::test::TaskEnvironment task_environment_;
const LocationProvider::LocationProviderUpdateCallback callback_;
std::unique_ptr<FakeGeolocationManager> fake_geolocation_manager_;
};
TEST_F(CoreLocationProviderTest, CreateDestroy) {
InitializeProvider();
EXPECT_TRUE(provider_);
provider_.reset();
}
TEST_F(CoreLocationProviderTest, StartAndStopUpdating) {
InitializeProvider();
fake_geolocation_manager_->SetSystemPermission(
LocationSystemPermissionStatus::kAllowed);
base::RunLoop().RunUntilIdle();
provider_->StartProvider(/*high_accuracy=*/true);
EXPECT_TRUE(IsUpdating());
provider_->StopProvider();
EXPECT_FALSE(IsUpdating());
provider_.reset();
}
TEST_F(CoreLocationProviderTest, DontStartUpdatingIfPermissionDenied) {
InitializeProvider();
fake_geolocation_manager_->SetSystemPermission(
LocationSystemPermissionStatus::kDenied);
base::RunLoop().RunUntilIdle();
provider_->StartProvider(/*high_accuracy=*/true);
EXPECT_FALSE(IsUpdating());
provider_.reset();
}
TEST_F(CoreLocationProviderTest, DontStartUpdatingUntilPermissionGranted) {
InitializeProvider();
provider_->StartProvider(/*high_accuracy=*/true);
EXPECT_FALSE(IsUpdating());
fake_geolocation_manager_->SetSystemPermission(
LocationSystemPermissionStatus::kDenied);
base::RunLoop().RunUntilIdle();
EXPECT_FALSE(IsUpdating());
fake_geolocation_manager_->SetSystemPermission(
LocationSystemPermissionStatus::kAllowed);
base::RunLoop().RunUntilIdle();
EXPECT_TRUE(IsUpdating());
provider_.reset();
}
TEST_F(CoreLocationProviderTest, GetPositionUpdates) {
InitializeProvider();
fake_geolocation_manager_->SetSystemPermission(
LocationSystemPermissionStatus::kAllowed);
base::RunLoop().RunUntilIdle();
provider_->StartProvider(/*high_accuracy=*/true);
EXPECT_TRUE(IsUpdating());
// test info
double latitude = 147.147;
double longitude = 101.101;
double altitude = 417.417;
double accuracy = 10.5;
double altitude_accuracy = 15.5;
mojom::Geoposition test_position;
test_position.latitude = latitude;
test_position.longitude = longitude;
test_position.altitude = altitude;
test_position.accuracy = accuracy;
test_position.altitude_accuracy = altitude_accuracy;
test_position.timestamp = base::Time::Now();
base::RunLoop loop;
provider_->SetUpdateCallback(
base::BindLambdaForTesting([&](const LocationProvider* provider,
const mojom::Geoposition& position) {
EXPECT_TRUE(test_position.Equals(position));
loop.Quit();
}));
FakeUpdatePosition(test_position);
loop.Run();
EXPECT_TRUE(GetLatestPosition().Equals(test_position));
provider_->StopProvider();
EXPECT_FALSE(IsUpdating());
provider_.reset();
}
} // namespace device