Index: device/geolocation/geolocation_provider_impl_unittest.cc |
diff --git a/device/geolocation/geolocation_provider_impl_unittest.cc b/device/geolocation/geolocation_provider_impl_unittest.cc |
deleted file mode 100644 |
index ded7d2b0c9d3fb775c805198d9d1a5e449c759e8..0000000000000000000000000000000000000000 |
--- a/device/geolocation/geolocation_provider_impl_unittest.cc |
+++ /dev/null |
@@ -1,258 +0,0 @@ |
-// Copyright 2014 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "device/geolocation/geolocation_provider_impl.h" |
- |
-#include <memory> |
- |
-#include "base/bind.h" |
-#include "base/bind_helpers.h" |
-#include "base/location.h" |
-#include "base/macros.h" |
-#include "base/memory/ptr_util.h" |
-#include "base/memory/ref_counted.h" |
-#include "base/run_loop.h" |
-#include "base/single_thread_task_runner.h" |
-#include "base/strings/string16.h" |
-#include "base/time/time.h" |
-#include "device/geolocation/access_token_store.h" |
-#include "device/geolocation/mock_location_arbitrator.h" |
-#include "testing/gmock/include/gmock/gmock.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
- |
-using testing::MakeMatcher; |
-using testing::Matcher; |
-using testing::MatcherInterface; |
-using testing::MatchResultListener; |
- |
-namespace device { |
- |
-class LocationProviderForTestArbitrator : public GeolocationProviderImpl { |
- public: |
- LocationProviderForTestArbitrator() : mock_arbitrator_(NULL) {} |
- ~LocationProviderForTestArbitrator() override {} |
- |
- // Only valid for use on the geolocation thread. |
- MockLocationArbitrator* mock_arbitrator() const { |
- return mock_arbitrator_; |
- } |
- |
- protected: |
- // GeolocationProviderImpl implementation: |
- std::unique_ptr<LocationArbitrator> CreateArbitrator() override; |
- |
- private: |
- // An alias to the arbitrator stored in the super class, where it is owned. |
- MockLocationArbitrator* mock_arbitrator_; |
-}; |
- |
-std::unique_ptr<LocationArbitrator> |
-LocationProviderForTestArbitrator::CreateArbitrator() { |
- DCHECK(mock_arbitrator_ == NULL); |
- mock_arbitrator_ = new MockLocationArbitrator; |
- return base::WrapUnique(mock_arbitrator_); |
-} |
- |
-class GeolocationObserver { |
- public: |
- virtual ~GeolocationObserver() {} |
- virtual void OnLocationUpdate(const Geoposition& position) = 0; |
-}; |
- |
-class MockGeolocationObserver : public GeolocationObserver { |
- public: |
- MOCK_METHOD1(OnLocationUpdate, void(const Geoposition& position)); |
-}; |
- |
-class AsyncMockGeolocationObserver : public MockGeolocationObserver { |
- public: |
- void OnLocationUpdate(const Geoposition& position) override { |
- MockGeolocationObserver::OnLocationUpdate(position); |
- base::MessageLoop::current()->QuitWhenIdle(); |
- } |
-}; |
- |
-class MockGeolocationCallbackWrapper { |
- public: |
- MOCK_METHOD1(Callback, void(const Geoposition& position)); |
-}; |
- |
-class GeopositionEqMatcher |
- : public MatcherInterface<const Geoposition&> { |
- public: |
- explicit GeopositionEqMatcher(const Geoposition& expected) |
- : expected_(expected) {} |
- |
- bool MatchAndExplain(const Geoposition& actual, |
- MatchResultListener* listener) const override { |
- return actual.latitude == expected_.latitude && |
- actual.longitude == expected_.longitude && |
- actual.altitude == expected_.altitude && |
- actual.accuracy == expected_.accuracy && |
- actual.altitude_accuracy == expected_.altitude_accuracy && |
- actual.heading == expected_.heading && |
- actual.speed == expected_.speed && |
- actual.timestamp == expected_.timestamp && |
- actual.error_code == expected_.error_code && |
- actual.error_message == expected_.error_message; |
- } |
- |
- void DescribeTo(::std::ostream* os) const override { |
- *os << "which matches the expected position"; |
- } |
- |
- void DescribeNegationTo(::std::ostream* os) const override { |
- *os << "which does not match the expected position"; |
- } |
- |
- private: |
- Geoposition expected_; |
- |
- DISALLOW_COPY_AND_ASSIGN(GeopositionEqMatcher); |
-}; |
- |
-Matcher<const Geoposition&> GeopositionEq(const Geoposition& expected) { |
- return MakeMatcher(new GeopositionEqMatcher(expected)); |
-} |
- |
-class GeolocationProviderTest : public testing::Test { |
- protected: |
- GeolocationProviderTest() |
- : message_loop_(), |
- provider_(new LocationProviderForTestArbitrator) { |
- } |
- |
- ~GeolocationProviderTest() override {} |
- |
- LocationProviderForTestArbitrator* provider() { return provider_.get(); } |
- |
- // Called on test thread. |
- bool ProvidersStarted(); |
- void SendMockLocation(const Geoposition& position); |
- |
- private: |
- // Called on provider thread. |
- void GetProvidersStarted(bool* started); |
- |
- base::MessageLoopForUI message_loop_; |
- std::unique_ptr<LocationProviderForTestArbitrator> provider_; |
-}; |
- |
- |
-bool GeolocationProviderTest::ProvidersStarted() { |
- DCHECK(provider_->IsRunning()); |
- DCHECK(base::MessageLoop::current() == &message_loop_); |
- bool started; |
- provider_->task_runner()->PostTaskAndReply( |
- FROM_HERE, base::Bind(&GeolocationProviderTest::GetProvidersStarted, |
- base::Unretained(this), &started), |
- base::MessageLoop::QuitWhenIdleClosure()); |
- base::RunLoop().Run(); |
- return started; |
-} |
- |
-void GeolocationProviderTest::GetProvidersStarted(bool* started) { |
- DCHECK(provider_->task_runner()->BelongsToCurrentThread()); |
- *started = provider_->mock_arbitrator()->providers_started(); |
-} |
- |
-void GeolocationProviderTest::SendMockLocation(const Geoposition& position) { |
- DCHECK(provider_->IsRunning()); |
- DCHECK(base::MessageLoop::current() == &message_loop_); |
- provider_->task_runner()->PostTask( |
- FROM_HERE, base::Bind(&GeolocationProviderImpl::OnLocationUpdate, |
- base::Unretained(provider_.get()), position)); |
-} |
- |
-// Regression test for http://crbug.com/59377 |
-TEST_F(GeolocationProviderTest, OnPermissionGrantedWithoutObservers) { |
- EXPECT_FALSE(provider()->user_did_opt_into_location_services_for_testing()); |
- provider()->UserDidOptIntoLocationServices(); |
- EXPECT_TRUE(provider()->user_did_opt_into_location_services_for_testing()); |
-} |
- |
-void DummyFunction(const Geoposition& position) { |
-} |
- |
-TEST_F(GeolocationProviderTest, StartStop) { |
- EXPECT_FALSE(provider()->IsRunning()); |
- GeolocationProviderImpl::LocationUpdateCallback callback = |
- base::Bind(&DummyFunction); |
- std::unique_ptr<GeolocationProvider::Subscription> subscription = |
- provider()->AddLocationUpdateCallback(callback, false); |
- EXPECT_TRUE(provider()->IsRunning()); |
- EXPECT_TRUE(ProvidersStarted()); |
- |
- subscription.reset(); |
- |
- EXPECT_FALSE(ProvidersStarted()); |
- EXPECT_TRUE(provider()->IsRunning()); |
-} |
- |
-TEST_F(GeolocationProviderTest, StalePositionNotSent) { |
- Geoposition first_position; |
- first_position.latitude = 12; |
- first_position.longitude = 34; |
- first_position.accuracy = 56; |
- first_position.timestamp = base::Time::Now(); |
- |
- AsyncMockGeolocationObserver first_observer; |
- GeolocationProviderImpl::LocationUpdateCallback first_callback = base::Bind( |
- &MockGeolocationObserver::OnLocationUpdate, |
- base::Unretained(&first_observer)); |
- EXPECT_CALL(first_observer, OnLocationUpdate(GeopositionEq(first_position))); |
- std::unique_ptr<GeolocationProvider::Subscription> subscription = |
- provider()->AddLocationUpdateCallback(first_callback, false); |
- SendMockLocation(first_position); |
- base::RunLoop().Run(); |
- |
- subscription.reset(); |
- |
- Geoposition second_position; |
- second_position.latitude = 13; |
- second_position.longitude = 34; |
- second_position.accuracy = 56; |
- second_position.timestamp = base::Time::Now(); |
- |
- AsyncMockGeolocationObserver second_observer; |
- |
- // After adding a second observer, check that no unexpected position update |
- // is sent. |
- EXPECT_CALL(second_observer, OnLocationUpdate(testing::_)).Times(0); |
- GeolocationProviderImpl::LocationUpdateCallback second_callback = base::Bind( |
- &MockGeolocationObserver::OnLocationUpdate, |
- base::Unretained(&second_observer)); |
- std::unique_ptr<GeolocationProvider::Subscription> subscription2 = |
- provider()->AddLocationUpdateCallback(second_callback, false); |
- base::RunLoop().RunUntilIdle(); |
- |
- // The second observer should receive the new position now. |
- EXPECT_CALL(second_observer, |
- OnLocationUpdate(GeopositionEq(second_position))); |
- SendMockLocation(second_position); |
- base::RunLoop().Run(); |
- |
- subscription2.reset(); |
- EXPECT_FALSE(ProvidersStarted()); |
-} |
- |
-TEST_F(GeolocationProviderTest, OverrideLocationForTesting) { |
- Geoposition position; |
- position.error_code = Geoposition::ERROR_CODE_POSITION_UNAVAILABLE; |
- provider()->OverrideLocationForTesting(position); |
- // Adding an observer when the location is overridden should synchronously |
- // update the observer with our overridden position. |
- MockGeolocationObserver mock_observer; |
- EXPECT_CALL(mock_observer, OnLocationUpdate(GeopositionEq(position))); |
- GeolocationProviderImpl::LocationUpdateCallback callback = base::Bind( |
- &MockGeolocationObserver::OnLocationUpdate, |
- base::Unretained(&mock_observer)); |
- std::unique_ptr<GeolocationProvider::Subscription> subscription = |
- provider()->AddLocationUpdateCallback(callback, false); |
- subscription.reset(); |
- // Wait for the providers to be stopped now that all clients are gone. |
- EXPECT_FALSE(ProvidersStarted()); |
-} |
- |
-} // namespace device |