| Index: content/browser/geolocation/geolocation_provider_unittest.cc
|
| diff --git a/content/browser/geolocation/geolocation_provider_unittest.cc b/content/browser/geolocation/geolocation_provider_unittest.cc
|
| index f78bbd83e35ad5e7b128ecd97f553f557bda2aca..99649adc56e4aa54cb18b2c2cc57f1fe1f10412d 100644
|
| --- a/content/browser/geolocation/geolocation_provider_unittest.cc
|
| +++ b/content/browser/geolocation/geolocation_provider_unittest.cc
|
| @@ -8,12 +8,10 @@
|
| #include "base/memory/scoped_ptr.h"
|
| #include "base/message_loop.h"
|
| #include "base/string16.h"
|
| -#include "base/synchronization/waitable_event.h"
|
| #include "base/time.h"
|
| #include "content/browser/geolocation/geolocation_provider.h"
|
| -#include "content/browser/geolocation/location_arbitrator.h"
|
| #include "content/browser/geolocation/location_provider.h"
|
| -#include "content/browser/geolocation/mock_location_provider.h"
|
| +#include "content/browser/geolocation/mock_location_arbitrator.h"
|
| #include "content/public/browser/access_token_store.h"
|
| #include "content/public/browser/browser_thread.h"
|
| #include "content/public/test/test_browser_thread.h"
|
| @@ -30,89 +28,26 @@ namespace content {
|
|
|
| class LocationProviderForTestArbitrator : public GeolocationProvider {
|
| public:
|
| - explicit LocationProviderForTestArbitrator(base::WaitableEvent* event)
|
| - : event_(event) {
|
| - }
|
| -
|
| + LocationProviderForTestArbitrator() : mock_arbitrator_(NULL) {}
|
| virtual ~LocationProviderForTestArbitrator() {}
|
|
|
| - protected:
|
| - // GeolocationProvider implementation:
|
| - virtual GeolocationArbitrator* CreateArbitrator() OVERRIDE;
|
| -
|
| - private:
|
| - base::WaitableEvent* event_;
|
| -};
|
| -
|
| -class StartStopMockLocationProvider : public MockLocationProvider {
|
| - public:
|
| - StartStopMockLocationProvider(base::WaitableEvent* event) :
|
| - MockLocationProvider(&instance_),
|
| - event_(event) {
|
| + // Only valid for use on the geolocation thread.
|
| + MockGeolocationArbitrator* mock_arbitrator() const {
|
| + return mock_arbitrator_;
|
| }
|
|
|
| - virtual ~StartStopMockLocationProvider() {
|
| - event_->Signal();
|
| - }
|
| -
|
| - private:
|
| - base::WaitableEvent* event_;
|
| -};
|
| -
|
| -// The AccessTokenStore will be accessed from the geolocation helper thread. The
|
| -// existing FakeAccessTokenStore class cannot be used here because it is based
|
| -// on gmock and gmock is not thread-safe on Windows.
|
| -// See: http://code.google.com/p/googlemock/issues/detail?id=156
|
| -class TestingAccessTokenStore : public AccessTokenStore {
|
| - public:
|
| - TestingAccessTokenStore(base::WaitableEvent* event) : event_(event) {}
|
| -
|
| - virtual void LoadAccessTokens(const LoadAccessTokensCallbackType& callback)
|
| - OVERRIDE {
|
| - callback.Run(AccessTokenSet(), NULL);
|
| - event_->Signal();
|
| - }
|
| -
|
| - virtual void SaveAccessToken(const GURL& server_url,
|
| - const string16& access_token) OVERRIDE {}
|
| -
|
| protected:
|
| - virtual ~TestingAccessTokenStore() {}
|
| -
|
| - private:
|
| - base::WaitableEvent* event_;
|
| -};
|
| -
|
| -class TestGeolocationArbitrator : public GeolocationArbitrator {
|
| - public:
|
| - TestGeolocationArbitrator(GeolocationObserver* observer,
|
| - base::WaitableEvent* event)
|
| - : GeolocationArbitrator(observer),
|
| - event_(event) {
|
| - }
|
| -
|
| - virtual AccessTokenStore* NewAccessTokenStore() OVERRIDE {
|
| - return new TestingAccessTokenStore(event_);
|
| - }
|
| -
|
| - virtual LocationProviderBase* NewNetworkLocationProvider(
|
| - AccessTokenStore* access_token_store,
|
| - net::URLRequestContextGetter* context,
|
| - const GURL& url,
|
| - const string16& access_token) OVERRIDE {
|
| - return new StartStopMockLocationProvider(event_);
|
| - }
|
| -
|
| - virtual LocationProviderBase* NewSystemLocationProvider() OVERRIDE {
|
| - return NULL;
|
| - }
|
| + // GeolocationProvider implementation:
|
| + virtual GeolocationArbitrator* CreateArbitrator() OVERRIDE;
|
|
|
| private:
|
| - base::WaitableEvent* event_;
|
| + MockGeolocationArbitrator* mock_arbitrator_;
|
| };
|
|
|
| GeolocationArbitrator* LocationProviderForTestArbitrator::CreateArbitrator() {
|
| - return new TestGeolocationArbitrator(this, event_);
|
| + DCHECK(mock_arbitrator_ == NULL);
|
| + mock_arbitrator_ = new MockGeolocationArbitrator;
|
| + return mock_arbitrator_;
|
| }
|
|
|
| class NullGeolocationObserver : public GeolocationObserver {
|
| @@ -175,83 +110,94 @@ class GeolocationProviderTest : public testing::Test {
|
| GeolocationProviderTest()
|
| : message_loop_(),
|
| io_thread_(BrowserThread::IO, &message_loop_),
|
| - event_(false, false),
|
| - provider_(new LocationProviderForTestArbitrator(&event_)) {
|
| + provider_(new LocationProviderForTestArbitrator) {
|
| }
|
|
|
| - ~GeolocationProviderTest() {
|
| - }
|
| + ~GeolocationProviderTest() {}
|
|
|
| - void WaitAndReset() {
|
| - event_.Wait();
|
| - event_.Reset();
|
| - }
|
| + LocationProviderForTestArbitrator* provider() { return provider_.get(); }
|
| +
|
| + // Called on test thread.
|
| + bool ProvidersStarted();
|
| +
|
| + private:
|
| + // Called on provider thread.
|
| + void GetProvidersStarted(bool* started);
|
|
|
| MessageLoop message_loop_;
|
| TestBrowserThread io_thread_;
|
| -
|
| - base::WaitableEvent event_;
|
| scoped_ptr<LocationProviderForTestArbitrator> provider_;
|
| };
|
|
|
| +
|
| +bool GeolocationProviderTest::ProvidersStarted() {
|
| + DCHECK(provider_->IsRunning());
|
| + DCHECK(MessageLoop::current() == &message_loop_);
|
| + bool started;
|
| + provider_->message_loop_proxy()->PostTaskAndReply(
|
| + FROM_HERE,
|
| + base::Bind(&GeolocationProviderTest::GetProvidersStarted,
|
| + base::Unretained(this),
|
| + &started),
|
| + MessageLoop::QuitClosure());
|
| + message_loop_.Run();
|
| + return started;
|
| +}
|
| +
|
| +void GeolocationProviderTest::GetProvidersStarted(bool* started) {
|
| + DCHECK(MessageLoop::current() == provider_->message_loop());
|
| + *started = provider_->mock_arbitrator()->providers_started();
|
| +}
|
| +
|
| +
|
| // Regression test for http://crbug.com/59377
|
| TEST_F(GeolocationProviderTest, OnPermissionGrantedWithoutObservers) {
|
| - EXPECT_FALSE(provider_->HasPermissionBeenGranted());
|
| - provider_->OnPermissionGranted();
|
| - EXPECT_TRUE(provider_->HasPermissionBeenGranted());
|
| + EXPECT_FALSE(provider()->HasPermissionBeenGranted());
|
| + provider()->OnPermissionGranted();
|
| + EXPECT_TRUE(provider()->HasPermissionBeenGranted());
|
| }
|
|
|
| TEST_F(GeolocationProviderTest, StartStop) {
|
| - EXPECT_FALSE(provider_->IsRunning());
|
| + EXPECT_FALSE(provider()->IsRunning());
|
| NullGeolocationObserver null_observer;
|
| GeolocationObserverOptions options;
|
| - provider_->AddObserver(&null_observer, options);
|
| - EXPECT_TRUE(provider_->IsRunning());
|
| - // Wait for token load request from the arbitrator to come through.
|
| - WaitAndReset();
|
| -
|
| - EXPECT_EQ(MockLocationProvider::instance_->state_,
|
| - MockLocationProvider::LOW_ACCURACY);
|
| - provider_->RemoveObserver(&null_observer);
|
| - // Wait for the providers to be stopped now that all clients are gone.
|
| - WaitAndReset();
|
| - EXPECT_TRUE(provider_->IsRunning());
|
| + provider()->AddObserver(&null_observer, options);
|
| + EXPECT_TRUE(provider()->IsRunning());
|
| + EXPECT_TRUE(ProvidersStarted());
|
| +
|
| + provider()->RemoveObserver(&null_observer);
|
| + EXPECT_FALSE(ProvidersStarted());
|
| + EXPECT_TRUE(provider()->IsRunning());
|
| }
|
|
|
| TEST_F(GeolocationProviderTest, OverrideLocationForTesting) {
|
| Geoposition position;
|
| position.error_code = Geoposition::ERROR_CODE_POSITION_UNAVAILABLE;
|
| - provider_->OverrideLocationForTesting(position);
|
| + 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)));
|
| - provider_->AddObserver(&mock_observer, GeolocationObserverOptions());
|
| - // Wait for token load request from the arbitrator to come through.
|
| - WaitAndReset();
|
| -
|
| - provider_->RemoveObserver(&mock_observer);
|
| + provider()->AddObserver(&mock_observer, GeolocationObserverOptions());
|
| + provider()->RemoveObserver(&mock_observer);
|
| // Wait for the providers to be stopped now that all clients are gone.
|
| - WaitAndReset();
|
| + EXPECT_FALSE(ProvidersStarted());
|
| }
|
|
|
| TEST_F(GeolocationProviderTest, Callback) {
|
| MockGeolocationCallbackWrapper callback_wrapper;
|
| - provider_->RequestCallback(
|
| + provider()->RequestCallback(
|
| base::Bind(&MockGeolocationCallbackWrapper::Callback,
|
| base::Unretained(&callback_wrapper)));
|
| - // Wait for token load request from the arbitrator to come through.
|
| - WaitAndReset();
|
| -
|
| Geoposition position;
|
| position.latitude = 12;
|
| position.longitude = 34;
|
| position.accuracy = 56;
|
| position.timestamp = base::Time::Now();
|
| EXPECT_CALL(callback_wrapper, Callback(GeopositionEq(position)));
|
| - provider_->OverrideLocationForTesting(position);
|
| + provider()->OverrideLocationForTesting(position);
|
| // Wait for the providers to be stopped now that all clients are gone.
|
| - WaitAndReset();
|
| + EXPECT_FALSE(ProvidersStarted());
|
| }
|
|
|
| } // namespace content
|
|
|