| Index: content/browser/geofencing/geofencing_manager_unittest.cc
|
| diff --git a/content/browser/geofencing/geofencing_manager_unittest.cc b/content/browser/geofencing/geofencing_manager_unittest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..78828acc93d67a398a65963ccf30ea1d2111d034
|
| --- /dev/null
|
| +++ b/content/browser/geofencing/geofencing_manager_unittest.cc
|
| @@ -0,0 +1,405 @@
|
| +// 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 "base/callback.h"
|
| +#include "base/message_loop/message_loop.h"
|
| +#include "content/browser/geofencing/geofencing_manager.h"
|
| +#include "content/browser/geofencing/geofencing_provider.h"
|
| +#include "content/public/browser/browser_thread.h"
|
| +#include "content/public/test/test_browser_thread.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"
|
| +#include "url/gurl.h"
|
| +
|
| +using blink::WebCircularGeofencingRegion;
|
| +typedef std::map<std::string, WebCircularGeofencingRegion> RegionMap;
|
| +
|
| +namespace {
|
| +
|
| +static const char* kTestRegionId = "region-id";
|
| +static const int64 kTestServiceWorkerRegistrationId = 123;
|
| +static const int64 kTestServiceWorkerRegistrationId2 = 456;
|
| +
|
| +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 content {
|
| +
|
| +class TestGeofencingProvider : public GeofencingProvider {
|
| + public:
|
| + MOCK_METHOD2(RegisterRegion,
|
| + void(const WebCircularGeofencingRegion& region,
|
| + const RegisterCallback& callback));
|
| + MOCK_METHOD1(UnregisterRegion, void(int registration_id));
|
| +};
|
| +
|
| +ACTION_P2(CallRegisterCallback, status, id) {
|
| + arg1.Run(status, id);
|
| +}
|
| +
|
| +ACTION_P(SaveRegisterCallback, callback) {
|
| + *callback = arg1;
|
| +}
|
| +
|
| +MATCHER_P(WebCircularGeofencingRegionEq, expected, "") {
|
| + return RegionsMatch(expected, arg);
|
| +}
|
| +
|
| +class StatusCatcher {
|
| + public:
|
| + StatusCatcher() : was_called_(false), runner_(new MessageLoopRunner()) {}
|
| +
|
| + void Done(GeofencingStatus status) {
|
| + CHECK(!was_called_);
|
| + result_ = status;
|
| + was_called_ = true;
|
| + runner_->Quit();
|
| + }
|
| +
|
| + GeofencingStatus Wait() {
|
| + runner_->Run();
|
| + CHECK(was_called_);
|
| + return result_;
|
| + }
|
| +
|
| + private:
|
| + bool was_called_;
|
| + GeofencingStatus result_;
|
| + scoped_refptr<MessageLoopRunner> runner_;
|
| +};
|
| +
|
| +class GeofencingManagerTest : public testing::Test {
|
| + public:
|
| + GeofencingManagerTest()
|
| + : message_loop_(),
|
| + io_thread_(BrowserThread::IO, &message_loop_),
|
| + provider_(0),
|
| + manager_(0),
|
| + test_origin_("https://example.com/") {
|
| + test_region_.latitude = 37.421999;
|
| + test_region_.longitude = -122.084015;
|
| + test_region_.radius = 100;
|
| + expected_regions_[kTestRegionId] = test_region_;
|
| + }
|
| +
|
| + virtual void SetUp() { manager_ = new GeofencingManager(); }
|
| +
|
| + virtual void TearDown() { delete manager_; }
|
| +
|
| + void SetProviderForTests() {
|
| + provider_ = new TestGeofencingProvider();
|
| + manager_->SetProviderForTests(scoped_ptr<GeofencingProvider>(provider_));
|
| + }
|
| +
|
| + GeofencingStatus RegisterRegionSync(
|
| + int64 service_worker_registration_id,
|
| + const std::string& id,
|
| + const WebCircularGeofencingRegion& region) {
|
| + StatusCatcher result;
|
| + manager_->RegisterRegion(
|
| + nullptr, /* browser_context */
|
| + service_worker_registration_id,
|
| + test_origin_,
|
| + id,
|
| + region,
|
| + base::Bind(&StatusCatcher::Done, base::Unretained(&result)));
|
| + return result.Wait();
|
| + }
|
| +
|
| + GeofencingStatus RegisterRegionSyncWithProviderResult(
|
| + int64 service_worker_registration_id,
|
| + const std::string& id,
|
| + const WebCircularGeofencingRegion& region,
|
| + GeofencingStatus provider_status,
|
| + int provider_result) {
|
| + StatusCatcher result;
|
| + EXPECT_CALL(
|
| + *provider_,
|
| + RegisterRegion(WebCircularGeofencingRegionEq(region), testing::_))
|
| + .WillOnce(CallRegisterCallback(provider_status, provider_result));
|
| + manager_->RegisterRegion(
|
| + nullptr, /* browser_context */
|
| + service_worker_registration_id,
|
| + test_origin_,
|
| + id,
|
| + region,
|
| + base::Bind(&StatusCatcher::Done, base::Unretained(&result)));
|
| + return result.Wait();
|
| + }
|
| +
|
| + GeofencingStatus UnregisterRegionSync(int64 service_worker_registration_id,
|
| + const std::string& id,
|
| + bool should_call_provider,
|
| + int provider_id = 0) {
|
| + StatusCatcher result;
|
| + if (should_call_provider) {
|
| + EXPECT_CALL(*provider_, UnregisterRegion(provider_id));
|
| + }
|
| + manager_->UnregisterRegion(
|
| + nullptr, /* browser_context */
|
| + service_worker_registration_id,
|
| + test_origin_,
|
| + id,
|
| + base::Bind(&StatusCatcher::Done, base::Unretained(&result)));
|
| + return result.Wait();
|
| + }
|
| +
|
| + void VerifyRegions(int64 service_worker_registration_id,
|
| + const RegionMap& expected_regions) {
|
| + RegionMap regions;
|
| + EXPECT_EQ(GeofencingStatus::GEOFENCING_STATUS_OK,
|
| + manager_->GetRegisteredRegions(nullptr, /* browser_context */
|
| + service_worker_registration_id,
|
| + test_origin_,
|
| + ®ions));
|
| + EXPECT_EQ(expected_regions.size(), regions.size());
|
| + for (RegionMap::const_iterator it = expected_regions.begin();
|
| + it != expected_regions.end();
|
| + ++it) {
|
| + EXPECT_THAT(regions[it->first],
|
| + WebCircularGeofencingRegionEq(it->second));
|
| + }
|
| + }
|
| +
|
| + protected:
|
| + base::MessageLoop message_loop_;
|
| + TestBrowserThread io_thread_;
|
| + TestGeofencingProvider* provider_;
|
| + GeofencingManager* manager_;
|
| +
|
| + WebCircularGeofencingRegion test_region_;
|
| + RegionMap expected_regions_;
|
| + GURL test_origin_;
|
| +};
|
| +
|
| +TEST_F(GeofencingManagerTest, RegisterRegion_NoProvider) {
|
| + EXPECT_EQ(GeofencingStatus::
|
| + GEOFENCING_STATUS_OPERATION_FAILED_SERVICE_NOT_AVAILABLE,
|
| + RegisterRegionSync(
|
| + kTestServiceWorkerRegistrationId, kTestRegionId, test_region_));
|
| +}
|
| +
|
| +TEST_F(GeofencingManagerTest, UnregisterRegion_NoProvider) {
|
| + EXPECT_EQ(GeofencingStatus::
|
| + GEOFENCING_STATUS_OPERATION_FAILED_SERVICE_NOT_AVAILABLE,
|
| + UnregisterRegionSync(
|
| + kTestServiceWorkerRegistrationId, kTestRegionId, false));
|
| +}
|
| +
|
| +TEST_F(GeofencingManagerTest, GetRegisteredRegions_NoProvider) {
|
| + RegionMap regions;
|
| + EXPECT_EQ(GeofencingStatus::
|
| + GEOFENCING_STATUS_OPERATION_FAILED_SERVICE_NOT_AVAILABLE,
|
| + manager_->GetRegisteredRegions(nullptr, /* browser_context */
|
| + kTestServiceWorkerRegistrationId,
|
| + test_origin_,
|
| + ®ions));
|
| + EXPECT_TRUE(regions.empty());
|
| +}
|
| +
|
| +TEST_F(GeofencingManagerTest, RegisterRegion_FailsInProvider) {
|
| + SetProviderForTests();
|
| + EXPECT_EQ(
|
| + GeofencingStatus::GEOFENCING_STATUS_ERROR,
|
| + RegisterRegionSyncWithProviderResult(kTestServiceWorkerRegistrationId,
|
| + kTestRegionId,
|
| + test_region_,
|
| + GEOFENCING_STATUS_ERROR,
|
| + -1));
|
| +}
|
| +
|
| +TEST_F(GeofencingManagerTest, RegisterRegion_SucceedsInProvider) {
|
| + SetProviderForTests();
|
| + EXPECT_EQ(
|
| + GeofencingStatus::GEOFENCING_STATUS_OK,
|
| + RegisterRegionSyncWithProviderResult(kTestServiceWorkerRegistrationId,
|
| + kTestRegionId,
|
| + test_region_,
|
| + GEOFENCING_STATUS_OK,
|
| + 0));
|
| + VerifyRegions(kTestServiceWorkerRegistrationId, expected_regions_);
|
| +}
|
| +
|
| +TEST_F(GeofencingManagerTest, RegisterRegion_AlreadyRegistered) {
|
| + SetProviderForTests();
|
| + EXPECT_EQ(
|
| + GeofencingStatus::GEOFENCING_STATUS_OK,
|
| + RegisterRegionSyncWithProviderResult(kTestServiceWorkerRegistrationId,
|
| + kTestRegionId,
|
| + test_region_,
|
| + GEOFENCING_STATUS_OK,
|
| + 0));
|
| + VerifyRegions(kTestServiceWorkerRegistrationId, expected_regions_);
|
| +
|
| + WebCircularGeofencingRegion region2;
|
| + region2.latitude = 43.2;
|
| + region2.longitude = 1.45;
|
| + region2.radius = 8.5;
|
| + EXPECT_EQ(GeofencingStatus::GEOFENCING_STATUS_ERROR,
|
| + RegisterRegionSync(
|
| + kTestServiceWorkerRegistrationId, kTestRegionId, region2));
|
| + VerifyRegions(kTestServiceWorkerRegistrationId, expected_regions_);
|
| +}
|
| +
|
| +TEST_F(GeofencingManagerTest, UnregisterRegion_NotRegistered) {
|
| + SetProviderForTests();
|
| + EXPECT_EQ(GeofencingStatus::GEOFENCING_STATUS_ERROR,
|
| + UnregisterRegionSync(
|
| + kTestServiceWorkerRegistrationId, kTestRegionId, false));
|
| +}
|
| +
|
| +TEST_F(GeofencingManagerTest, UnregisterRegion_Success) {
|
| + SetProviderForTests();
|
| + int provider_id = 123;
|
| +
|
| + EXPECT_EQ(
|
| + GeofencingStatus::GEOFENCING_STATUS_OK,
|
| + RegisterRegionSyncWithProviderResult(kTestServiceWorkerRegistrationId,
|
| + kTestRegionId,
|
| + test_region_,
|
| + GEOFENCING_STATUS_OK,
|
| + provider_id));
|
| +
|
| + EXPECT_EQ(
|
| + GeofencingStatus::GEOFENCING_STATUS_OK,
|
| + UnregisterRegionSync(
|
| + kTestServiceWorkerRegistrationId, kTestRegionId, true, provider_id));
|
| + VerifyRegions(kTestServiceWorkerRegistrationId, RegionMap());
|
| +}
|
| +
|
| +TEST_F(GeofencingManagerTest, GetRegisteredRegions_RegistrationInProgress) {
|
| + SetProviderForTests();
|
| + StatusCatcher result;
|
| + GeofencingProvider::RegisterCallback callback;
|
| +
|
| + EXPECT_CALL(
|
| + *provider_,
|
| + RegisterRegion(WebCircularGeofencingRegionEq(test_region_), testing::_))
|
| + .WillOnce(SaveRegisterCallback(&callback));
|
| + manager_->RegisterRegion(
|
| + nullptr, /* browser_context */
|
| + kTestServiceWorkerRegistrationId,
|
| + test_origin_,
|
| + kTestRegionId,
|
| + test_region_,
|
| + base::Bind(&StatusCatcher::Done, base::Unretained(&result)));
|
| +
|
| + // At this point the manager should have tried registering the region with
|
| + // the provider, resulting in |callback| being set. Until the callback is
|
| + // called the registration is not complete though.
|
| + EXPECT_FALSE(callback.is_null());
|
| + VerifyRegions(kTestServiceWorkerRegistrationId, RegionMap());
|
| +
|
| + // Now call the callback, and verify the registration completed succesfully.
|
| + callback.Run(GEOFENCING_STATUS_OK, 123);
|
| + EXPECT_EQ(GeofencingStatus::GEOFENCING_STATUS_OK, result.Wait());
|
| + VerifyRegions(kTestServiceWorkerRegistrationId, expected_regions_);
|
| +}
|
| +
|
| +TEST_F(GeofencingManagerTest, UnregisterRegion_RegistrationInProgress) {
|
| + SetProviderForTests();
|
| + StatusCatcher result;
|
| + GeofencingProvider::RegisterCallback callback;
|
| +
|
| + EXPECT_CALL(
|
| + *provider_,
|
| + RegisterRegion(WebCircularGeofencingRegionEq(test_region_), testing::_))
|
| + .WillOnce(SaveRegisterCallback(&callback));
|
| + manager_->RegisterRegion(
|
| + nullptr, /* browser_context */
|
| + kTestServiceWorkerRegistrationId,
|
| + test_origin_,
|
| + kTestRegionId,
|
| + test_region_,
|
| + base::Bind(&StatusCatcher::Done, base::Unretained(&result)));
|
| +
|
| + // At this point the manager should have tried registering the region with
|
| + // the provider, resulting in |callback| being set. Until the callback is
|
| + // called the registration is not complete though.
|
| + EXPECT_FALSE(callback.is_null());
|
| +
|
| + EXPECT_EQ(GeofencingStatus::GEOFENCING_STATUS_ERROR,
|
| + UnregisterRegionSync(
|
| + kTestServiceWorkerRegistrationId, kTestRegionId, false));
|
| +}
|
| +
|
| +TEST_F(GeofencingManagerTest, GetRegisteredRegions_NoRegions) {
|
| + SetProviderForTests();
|
| + VerifyRegions(kTestServiceWorkerRegistrationId, RegionMap());
|
| +}
|
| +
|
| +TEST_F(GeofencingManagerTest, RegisterRegion_SeparateServiceWorkers) {
|
| + SetProviderForTests();
|
| + int provider_id1 = 12;
|
| + int provider_id2 = 34;
|
| +
|
| + EXPECT_EQ(
|
| + GeofencingStatus::GEOFENCING_STATUS_OK,
|
| + RegisterRegionSyncWithProviderResult(kTestServiceWorkerRegistrationId,
|
| + kTestRegionId,
|
| + test_region_,
|
| + GEOFENCING_STATUS_OK,
|
| + provider_id1));
|
| +
|
| + VerifyRegions(kTestServiceWorkerRegistrationId, expected_regions_);
|
| + VerifyRegions(kTestServiceWorkerRegistrationId2, RegionMap());
|
| +
|
| + EXPECT_EQ(
|
| + GeofencingStatus::GEOFENCING_STATUS_OK,
|
| + RegisterRegionSyncWithProviderResult(kTestServiceWorkerRegistrationId2,
|
| + kTestRegionId,
|
| + test_region_,
|
| + GEOFENCING_STATUS_OK,
|
| + provider_id2));
|
| +
|
| + VerifyRegions(kTestServiceWorkerRegistrationId, expected_regions_);
|
| + VerifyRegions(kTestServiceWorkerRegistrationId2, expected_regions_);
|
| +}
|
| +
|
| +TEST_F(GeofencingManagerTest, UnregisterRegion_SeparateServiceWorkers) {
|
| + SetProviderForTests();
|
| + int provider_id1 = 12;
|
| + int provider_id2 = 34;
|
| +
|
| + EXPECT_EQ(
|
| + GeofencingStatus::GEOFENCING_STATUS_OK,
|
| + RegisterRegionSyncWithProviderResult(kTestServiceWorkerRegistrationId,
|
| + kTestRegionId,
|
| + test_region_,
|
| + GEOFENCING_STATUS_OK,
|
| + provider_id1));
|
| + EXPECT_EQ(
|
| + GeofencingStatus::GEOFENCING_STATUS_OK,
|
| + RegisterRegionSyncWithProviderResult(kTestServiceWorkerRegistrationId2,
|
| + kTestRegionId,
|
| + test_region_,
|
| + GEOFENCING_STATUS_OK,
|
| + provider_id2));
|
| +
|
| + EXPECT_EQ(
|
| + GeofencingStatus::GEOFENCING_STATUS_OK,
|
| + UnregisterRegionSync(
|
| + kTestServiceWorkerRegistrationId, kTestRegionId, true, provider_id1));
|
| +
|
| + VerifyRegions(kTestServiceWorkerRegistrationId, RegionMap());
|
| + VerifyRegions(kTestServiceWorkerRegistrationId2, expected_regions_);
|
| +
|
| + EXPECT_EQ(GeofencingStatus::GEOFENCING_STATUS_OK,
|
| + UnregisterRegionSync(kTestServiceWorkerRegistrationId2,
|
| + kTestRegionId,
|
| + true,
|
| + provider_id2));
|
| +
|
| + VerifyRegions(kTestServiceWorkerRegistrationId, RegionMap());
|
| + VerifyRegions(kTestServiceWorkerRegistrationId2, RegionMap());
|
| +}
|
| +
|
| +} // namespace content
|
|
|