Index: content/browser/geofencing/geofencing_service_unittest.cc |
diff --git a/content/browser/geofencing/geofencing_service_unittest.cc b/content/browser/geofencing/geofencing_service_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..329fcaf7159606360f6124e392e5908645667bbd |
--- /dev/null |
+++ b/content/browser/geofencing/geofencing_service_unittest.cc |
@@ -0,0 +1,191 @@ |
+// 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 "content/browser/geofencing/geofencing_provider.h" |
+#include "content/browser/geofencing/geofencing_registration_delegate.h" |
+#include "content/browser/geofencing/geofencing_service.h" |
+#include "content/public/test/test_browser_thread_bundle.h" |
+#include "content/public/test/test_utils.h" |
+#include "testing/gmock/include/gmock/gmock.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+#include "third_party/WebKit/public/platform/WebCircularGeofencingRegion.h" |
+ |
+using blink::WebCircularGeofencingRegion; |
+ |
+namespace { |
+ |
+bool RegionsMatch(const WebCircularGeofencingRegion& expected, |
+ const WebCircularGeofencingRegion& arg) { |
+ return testing::Matches(expected.latitude)(arg.latitude) && |
+ testing::Matches(expected.longitude)(arg.longitude) && |
+ testing::Matches(expected.radius)(arg.radius); |
+} |
+ |
+} // namespace |
+ |
+namespace content { |
+ |
+class MockGeofencingRegistrationDelegate |
+ : public GeofencingRegistrationDelegate { |
+ public: |
+ MOCK_METHOD2(RegistrationFinished, |
+ void(int64 geofencing_registration_id, GeofencingStatus status)); |
+}; |
+ |
+class MockGeofencingProvider : public GeofencingProvider { |
+ public: |
+ MOCK_METHOD3(RegisterRegion, |
+ void(int64 geofencing_registration_id, |
+ const blink::WebCircularGeofencingRegion& region, |
+ const StatusCallback& callback)); |
+ MOCK_METHOD1(UnregisterRegion, void(int64 geofencing_registration_id)); |
+}; |
+ |
+ACTION_P(QuitRunner, runner) { |
+ runner->Quit(); |
+} |
+ |
+ACTION_P(SaveRegistrationId, geofencing_registration_id) { |
+ *geofencing_registration_id = arg0; |
+} |
+ |
+ACTION_P(SaveStatusCallback, callback) { |
+ *callback = arg2; |
+} |
+ |
+MATCHER_P(WebCircularGeofencingRegionEq, expected, "") { |
+ return RegionsMatch(expected, arg); |
+} |
+ |
+class GeofencingServiceTest : public testing::Test { |
+ public: |
+ GeofencingServiceTest() : service_(nullptr) { |
+ test_region_.latitude = 37.421999; |
+ test_region_.longitude = -122.084015; |
+ test_region_.radius = 100; |
+ } |
+ |
+ virtual void SetUp() { service_ = new GeofencingServiceImpl(); } |
+ |
+ virtual void TearDown() { delete service_; } |
+ |
+ void SetProviderForTests() { |
+ provider_ = new MockGeofencingProvider(); |
+ service_->SetProviderForTesting(make_scoped_ptr(provider_)); |
+ } |
+ |
+ int RegistrationCount() { return service_->RegistrationCountForTesting(); } |
+ |
+ int64 RegisterRegionSync(const WebCircularGeofencingRegion& region, |
+ GeofencingStatus provider_status) { |
+ scoped_refptr<MessageLoopRunner> runner(new MessageLoopRunner()); |
+ |
+ // The registration ID that is passed to the provider. |
+ int64 provider_registration_id = -1; |
+ // The callback that is passed to the provider. |
+ GeofencingProvider::StatusCallback callback; |
+ |
+ EXPECT_CALL( |
+ *provider_, |
+ RegisterRegion( |
+ testing::_, WebCircularGeofencingRegionEq(region), testing::_)) |
+ .WillOnce(testing::DoAll(SaveRegistrationId(&provider_registration_id), |
+ SaveStatusCallback(&callback))); |
+ |
+ int64 geofencing_registration_id = |
+ service_->RegisterRegion(region, &delegate_); |
+ |
+ // Service should have synchronously called the provider. |
+ CHECK(!callback.is_null()); |
+ CHECK(provider_registration_id == geofencing_registration_id); |
+ |
+ // Finish up registration by calling the callback and waiting for the |
+ // delegate to be called. |
+ EXPECT_CALL( |
+ delegate_, |
+ RegistrationFinished(geofencing_registration_id, provider_status)) |
+ .WillOnce(QuitRunner(runner)); |
+ callback.Run(provider_status); |
+ runner->Run(); |
+ return geofencing_registration_id; |
+ } |
+ |
+ protected: |
+ TestBrowserThreadBundle threads_; |
+ GeofencingServiceImpl* service_; |
+ MockGeofencingProvider* provider_; |
+ MockGeofencingRegistrationDelegate delegate_; |
+ |
+ WebCircularGeofencingRegion test_region_; |
+}; |
+ |
+TEST_F(GeofencingServiceTest, RegisterRegion_NoProvider) { |
+ scoped_refptr<MessageLoopRunner> runner(new MessageLoopRunner()); |
+ int64 geofencing_registration_id = |
+ service_->RegisterRegion(test_region_, &delegate_); |
+ EXPECT_CALL(delegate_, |
+ RegistrationFinished( |
+ geofencing_registration_id, |
+ GEOFENCING_STATUS_OPERATION_FAILED_SERVICE_NOT_AVAILABLE)) |
+ .WillOnce(QuitRunner(runner)); |
+ runner->Run(); |
+ EXPECT_EQ(0, RegistrationCount()); |
+} |
+ |
+TEST_F(GeofencingServiceTest, RegisterRegion_FailsInProvider) { |
+ SetProviderForTests(); |
+ RegisterRegionSync(test_region_, GEOFENCING_STATUS_ERROR); |
+ EXPECT_EQ(0, RegistrationCount()); |
+} |
+ |
+TEST_F(GeofencingServiceTest, RegisterRegion_SucceedsInProvider) { |
+ SetProviderForTests(); |
+ RegisterRegionSync(test_region_, GEOFENCING_STATUS_OK); |
+ EXPECT_EQ(1, RegistrationCount()); |
+} |
+ |
+TEST_F(GeofencingServiceTest, UnregisterRegion_AfterRegistration) { |
+ SetProviderForTests(); |
+ int geofencing_registration_id = |
+ RegisterRegionSync(test_region_, GEOFENCING_STATUS_OK); |
+ EXPECT_EQ(1, RegistrationCount()); |
+ |
+ EXPECT_CALL(*provider_, UnregisterRegion(geofencing_registration_id)); |
+ service_->UnregisterRegion(geofencing_registration_id); |
+ EXPECT_EQ(0, RegistrationCount()); |
+} |
+ |
+TEST_F(GeofencingServiceTest, UnregisterRegion_DuringSuccesfullRegistration) { |
+ SetProviderForTests(); |
+ scoped_refptr<MessageLoopRunner> runner(new MessageLoopRunner()); |
+ |
+ // The callback that is passed to the provider. |
+ GeofencingProvider::StatusCallback callback; |
+ |
+ EXPECT_CALL( |
+ *provider_, |
+ RegisterRegion( |
+ testing::_, WebCircularGeofencingRegionEq(test_region_), testing::_)) |
+ .WillOnce(SaveStatusCallback(&callback)); |
+ |
+ int64 geofencing_registration_id = |
+ service_->RegisterRegion(test_region_, &delegate_); |
+ |
+ // Service should have synchronously called the provider. |
+ CHECK(!callback.is_null()); |
+ |
+ // Call unregister before registration is finished. |
+ service_->UnregisterRegion(geofencing_registration_id); |
+ |
+ // Finish up registration by calling the callback and waiting for the |
+ // provider to be called. The delegate should not be called in this case. |
+ EXPECT_CALL(delegate_, RegistrationFinished(testing::_, testing::_)).Times(0); |
+ EXPECT_CALL(*provider_, UnregisterRegion(geofencing_registration_id)) |
+ .WillOnce(QuitRunner(runner)); |
+ callback.Run(GEOFENCING_STATUS_OK); |
+ runner->Run(); |
+ EXPECT_EQ(0, RegistrationCount()); |
+} |
+ |
+} // namespace content |