Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1318)

Unified Diff: content/browser/geolocation/geolocation_provider_unittest.cc

Issue 10344004: Add content API for requesting the current geolocation (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: *Argh*, missed another forward declaration of a struct as a class. Created 8 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « content/browser/geolocation/geolocation_provider.cc ('k') | content/public/browser/geolocation.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 ca1e12229a85f61b04c89469598cf0efb3ba1816..9f141a8282bd907c9e7bacbd679d5e8c00e20e7e 100644
--- a/content/browser/geolocation/geolocation_provider_unittest.cc
+++ b/content/browser/geolocation/geolocation_provider_unittest.cc
@@ -2,215 +2,226 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "base/memory/singleton.h"
+#include "base/basictypes.h"
+#include "base/bind.h"
+#include "base/bind_helpers.h"
+#include "base/compiler_specific.h"
+#include "base/memory/ref_counted.h"
+#include "base/memory/scoped_ptr.h"
+#include "base/message_loop.h"
#include "base/synchronization/waitable_event.h"
-#include "content/browser/geolocation/arbitrator_dependency_factories_for_test.h"
+#include "base/time.h"
+#include "content/browser/geolocation/arbitrator_dependency_factory.h"
#include "content/browser/geolocation/fake_access_token_store.h"
+#include "content/browser/geolocation/geolocation_observer.h"
#include "content/browser/geolocation/geolocation_provider.h"
#include "content/browser/geolocation/location_arbitrator.h"
#include "content/browser/geolocation/mock_location_provider.h"
+#include "content/public/browser/browser_thread.h"
+#include "content/test/test_browser_thread.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
-using content::AccessTokenStore;
-using content::FakeAccessTokenStore;
using content::Geoposition;
using testing::_;
using testing::DoAll;
-using testing::DoDefault;
using testing::Invoke;
using testing::InvokeWithoutArgs;
+using testing::MakeMatcher;
+using testing::Matcher;
+using testing::MatcherInterface;
+using testing::MatchResultListener;
namespace {
+class NonSingletonGeolocationProvider : public GeolocationProvider {
+ public:
+ NonSingletonGeolocationProvider() {}
-class GeolocationProviderTest : public testing::Test {
- protected:
- GeolocationProviderTest()
- : provider_(new GeolocationProvider),
- dependency_factory_(
- new GeolocationArbitratorDependencyFactoryWithLocationProvider(
- &NewAutoSuccessMockNetworkLocationProvider))
- {
+ virtual ~NonSingletonGeolocationProvider() {}
+};
+
+class StartStopMockLocationProvider : public MockLocationProvider {
+ public:
+ explicit StartStopMockLocationProvider() : MockLocationProvider(&instance_) {
}
- ~GeolocationProviderTest() {
- DefaultSingletonTraits<GeolocationProvider>::Delete(provider_);
+ virtual ~StartStopMockLocationProvider() {
+ Die();
}
- // testing::Test
- virtual void SetUp() {
- GeolocationArbitrator::SetDependencyFactoryForTest(
- dependency_factory_.get());
+ MOCK_METHOD0(Die, void());
+};
+
+class TestingDependencyFactory
+ : public DefaultGeolocationArbitratorDependencyFactory {
+ public:
+ TestingDependencyFactory(base::WaitableEvent* event) : event_(event) {
}
- // testing::Test
- virtual void TearDown() {
- provider_->Stop();
- GeolocationArbitrator::SetDependencyFactoryForTest(NULL);
+ virtual content::AccessTokenStore* NewAccessTokenStore() OVERRIDE {
+ content::FakeAccessTokenStore* store = new content::FakeAccessTokenStore();
+ EXPECT_CALL(*store, LoadAccessTokens(_))
+ .WillRepeatedly(DoAll(
+ Invoke(store,
+ &content::FakeAccessTokenStore::DefaultLoadAccessTokens),
+ InvokeWithoutArgs(store,
+ &content::FakeAccessTokenStore::
+ NotifyDelegateTokensLoaded),
+ InvokeWithoutArgs(event_, &base::WaitableEvent::Signal)));
+ return store;
}
- // Message loop for main thread, as provider depends on it existing.
- MessageLoop message_loop_;
+ virtual LocationProviderBase* NewNetworkLocationProvider(
+ content::AccessTokenStore* access_token_store,
+ net::URLRequestContextGetter* context,
+ const GURL& url,
+ const string16& access_token) OVERRIDE {
+ StartStopMockLocationProvider* provider =
+ new StartStopMockLocationProvider();
+ EXPECT_CALL(*provider, Die())
+ .Times(1)
+ .WillOnce(InvokeWithoutArgs(event_, &base::WaitableEvent::Signal));
+ return provider;
+ }
- // Object under tests. Owned, but not a scoped_ptr due to specialized
- // destruction protocol.
- GeolocationProvider* provider_;
+ virtual LocationProviderBase* NewSystemLocationProvider() OVERRIDE {
+ return NULL;
+ }
- scoped_refptr<GeolocationArbitratorDependencyFactory> dependency_factory_;
+ private:
+ base::WaitableEvent* event_;
};
-// Regression test for http://crbug.com/59377
-TEST_F(GeolocationProviderTest, OnPermissionGrantedWithoutObservers) {
- EXPECT_FALSE(provider_->HasPermissionBeenGranted());
- provider_->OnPermissionGranted();
- EXPECT_TRUE(provider_->HasPermissionBeenGranted());
-}
-
class NullGeolocationObserver : public GeolocationObserver {
public:
// GeolocationObserver
- virtual void OnLocationUpdate(const Geoposition& position) {}
+ virtual void OnLocationUpdate(const content::Geoposition& position) {}
};
class MockGeolocationObserver : public GeolocationObserver {
public:
// GeolocationObserver
- MOCK_METHOD1(OnLocationUpdate, void(const Geoposition& position));
+ MOCK_METHOD1(OnLocationUpdate, void(const content::Geoposition& position));
};
-class StartStopMockLocationProvider : public MockLocationProvider {
+class MockGeolocationCallbackWrapper {
public:
- explicit StartStopMockLocationProvider(MessageLoop* test_loop)
- : MockLocationProvider(&instance_),
- test_loop_(test_loop) {
- }
+ MOCK_METHOD1(Callback, void(const content::Geoposition& position));
+};
- virtual ~StartStopMockLocationProvider() {
- Die();
+class GeopositionEqMatcher
+ : public MatcherInterface<const content::Geoposition&> {
+ public:
+ explicit GeopositionEqMatcher(const content::Geoposition& expected)
+ : expected_(expected) {}
+
+ virtual bool MatchAndExplain(const content::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;
}
- MOCK_METHOD0(Die, void());
-
- virtual bool StartProvider(bool high_accuracy) {
- bool result = MockLocationProvider::StartProvider(high_accuracy);
- test_loop_->PostTask(FROM_HERE, MessageLoop::QuitClosure());
- return result;
+ virtual void DescribeTo(::std::ostream* os) const OVERRIDE {
+ *os << "which matches the expected position";
}
- virtual void StopProvider() {
- MockLocationProvider::StopProvider();
- test_loop_->PostTask(FROM_HERE, MessageLoop::QuitClosure());
+ virtual void DescribeNegationTo(::std::ostream* os) const OVERRIDE{
+ *os << "which does not match the expected position";
}
private:
- MessageLoop* test_loop_;
-};
-
-class MockDependencyFactory : public GeolocationArbitratorDependencyFactory {
- public:
- MockDependencyFactory(MessageLoop* test_loop_,
- AccessTokenStore* access_token_store)
- : test_loop_(test_loop_),
- access_token_store_(access_token_store) {
- }
+ content::Geoposition expected_;
- virtual net::URLRequestContextGetter* GetContextGetter() {
- return NULL;
- }
-
- virtual GeolocationArbitrator::GetTimeNow GetTimeFunction() {
- return base::Time::Now;
- }
+ DISALLOW_COPY_AND_ASSIGN(GeopositionEqMatcher);
+};
- virtual AccessTokenStore* NewAccessTokenStore() {
- return access_token_store_.get();
- }
+Matcher<const content::Geoposition&> GeopositionEq(
+ const content::Geoposition& expected) {
+ return MakeMatcher(new GeopositionEqMatcher(expected));
+}
- virtual LocationProviderBase* NewNetworkLocationProvider(
- AccessTokenStore* access_token_store,
- net::URLRequestContextGetter* context,
- const GURL& url,
- const string16& access_token) {
- return new StartStopMockLocationProvider(test_loop_);
+class GeolocationProviderTest : public testing::Test {
+ protected:
+ GeolocationProviderTest()
+ : message_loop_(),
+ io_thread_(content::BrowserThread::IO, &message_loop_),
+ event_(false, false),
+ dependency_factory_(new TestingDependencyFactory(&event_)),
+ provider_(new NonSingletonGeolocationProvider) {
+ GeolocationArbitrator::SetDependencyFactoryForTest(
+ dependency_factory_.get());
}
- virtual LocationProviderBase* NewSystemLocationProvider() {
- return NULL;
+ ~GeolocationProviderTest() {
+ GeolocationArbitrator::SetDependencyFactoryForTest(NULL);
}
- private:
- virtual ~MockDependencyFactory() {}
+ MessageLoop message_loop_;
+ content::TestBrowserThread io_thread_;
- MessageLoop* test_loop_;
- scoped_refptr<AccessTokenStore> access_token_store_;
+ base::WaitableEvent event_;
+ scoped_refptr<TestingDependencyFactory> dependency_factory_;
+ scoped_ptr<NonSingletonGeolocationProvider> provider_;
};
-TEST_F(GeolocationProviderTest, StartStop) {
- scoped_refptr<FakeAccessTokenStore> fake_access_token_store =
- new FakeAccessTokenStore;
- scoped_refptr<GeolocationArbitratorDependencyFactory> dependency_factory =
- new MockDependencyFactory(&message_loop_, fake_access_token_store.get());
- base::WaitableEvent event(false, false);
-
- EXPECT_CALL(*(fake_access_token_store.get()), LoadAccessTokens(_))
- .Times(1)
- .WillOnce(DoAll(Invoke(fake_access_token_store.get(),
- &FakeAccessTokenStore::DefaultLoadAccessTokens),
- InvokeWithoutArgs(&event, &base::WaitableEvent::Signal)));
-
- GeolocationArbitrator::SetDependencyFactoryForTest(dependency_factory.get());
+// Regression test for http://crbug.com/59377
+TEST_F(GeolocationProviderTest, OnPermissionGrantedWithoutObservers) {
+ EXPECT_FALSE(provider_->HasPermissionBeenGranted());
+ provider_->OnPermissionGranted();
+ EXPECT_TRUE(provider_->HasPermissionBeenGranted());
+}
+TEST_F(GeolocationProviderTest, StartStop) {
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.
- event.Wait();
- event.Reset();
- // The GeolocationArbitrator won't start the providers until it has
- // finished loading access tokens.
- fake_access_token_store->NotifyDelegateTokensLoaded();
- message_loop_.Run();
+ event_.Wait();
+
+ event_.Reset();
EXPECT_EQ(MockLocationProvider::instance_->state_,
MockLocationProvider::LOW_ACCURACY);
- EXPECT_CALL(*(static_cast<StartStopMockLocationProvider*>(
- MockLocationProvider::instance_)),
- Die())
- .Times(1)
- .WillOnce(InvokeWithoutArgs(&event, &base::WaitableEvent::Signal));
provider_->RemoveObserver(&null_observer);
// Wait for the providers to be stopped.
- event.Wait();
- event.Reset();
+ event_.Wait();
EXPECT_TRUE(provider_->IsRunning());
-
- GeolocationArbitrator::SetDependencyFactoryForTest(NULL);
}
TEST_F(GeolocationProviderTest, OverrideLocationForTesting) {
- scoped_refptr<FakeAccessTokenStore> fake_access_token_store =
- new FakeAccessTokenStore;
- scoped_refptr<GeolocationArbitratorDependencyFactory> dependency_factory =
- new MockDependencyFactory(&message_loop_, fake_access_token_store.get());
+ content::Geoposition position;
+ position.error_code = content::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(*(fake_access_token_store.get()), LoadAccessTokens(_));
-
- GeolocationArbitrator::SetDependencyFactoryForTest(dependency_factory.get());
-
- Geoposition override_position;
- override_position.error_code = Geoposition::ERROR_CODE_POSITION_UNAVAILABLE;
- provider_->OverrideLocationForTesting(override_position);
- // Adding an observer when the location is overriden should synchronously
- // update the observer with our overriden position.
- EXPECT_CALL(mock_observer, OnLocationUpdate(
- testing::Field(
- &Geoposition::error_code,
- testing::Eq(Geoposition::ERROR_CODE_POSITION_UNAVAILABLE))));
+ EXPECT_CALL(mock_observer, OnLocationUpdate(GeopositionEq(position)));
provider_->AddObserver(&mock_observer, GeolocationObserverOptions());
provider_->RemoveObserver(&mock_observer);
+}
- GeolocationArbitrator::SetDependencyFactoryForTest(NULL);
+TEST_F(GeolocationProviderTest, Callback) {
+ MockGeolocationCallbackWrapper callback_wrapper;
+ provider_->RequestCallback(
+ base::Bind(&MockGeolocationCallbackWrapper::Callback,
+ base::Unretained(&callback_wrapper)));
+
+ content::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);
}
} // namespace
« no previous file with comments | « content/browser/geolocation/geolocation_provider.cc ('k') | content/public/browser/geolocation.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698