| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "base/memory/scoped_ptr.h" | 5 #include "base/memory/scoped_ptr.h" |
| 6 #include "content/browser/geolocation/arbitrator_dependency_factory.h" | 6 #include "content/browser/geolocation/arbitrator_dependency_factory.h" |
| 7 #include "content/browser/geolocation/fake_access_token_store.h" | 7 #include "content/browser/geolocation/fake_access_token_store.h" |
| 8 #include "content/browser/geolocation/geolocation_observer.h" | 8 #include "content/browser/geolocation/geolocation_observer.h" |
| 9 #include "content/browser/geolocation/location_arbitrator.h" | 9 #include "content/browser/geolocation/location_arbitrator.h" |
| 10 #include "content/browser/geolocation/location_provider.h" | 10 #include "content/browser/geolocation/location_provider.h" |
| 11 #include "content/browser/geolocation/mock_location_provider.h" | 11 #include "content/browser/geolocation/mock_location_provider.h" |
| 12 #include "content/common/geoposition.h" | 12 #include "content/public/common/geoposition.h" |
| 13 #include "testing/gmock/include/gmock/gmock.h" | 13 #include "testing/gmock/include/gmock/gmock.h" |
| 14 #include "testing/gtest/include/gtest/gtest.h" | 14 #include "testing/gtest/include/gtest/gtest.h" |
| 15 | 15 |
| 16 using content::AccessTokenStore; | 16 using content::AccessTokenStore; |
| 17 using content::FakeAccessTokenStore; | 17 using content::FakeAccessTokenStore; |
| 18 using content::Geoposition; |
| 18 using ::testing::NiceMock; | 19 using ::testing::NiceMock; |
| 19 | 20 |
| 20 namespace { | 21 namespace { |
| 21 | 22 |
| 22 class MockLocationObserver : public GeolocationObserver { | 23 class MockLocationObserver : public GeolocationObserver { |
| 23 public: | 24 public: |
| 24 void InvalidateLastPosition() { | 25 void InvalidateLastPosition() { |
| 25 last_position_.latitude = 100; | 26 last_position_.latitude = 100; |
| 26 last_position_.error_code = Geoposition::ERROR_CODE_NONE; | 27 last_position_.error_code = Geoposition::ERROR_CODE_NONE; |
| 27 ASSERT_FALSE(last_position_.IsInitialized()); | 28 ASSERT_FALSE(last_position_.Validate()); |
| 28 } | 29 } |
| 29 // Delegate | 30 // Delegate |
| 30 virtual void OnLocationUpdate(const Geoposition& position) { | 31 virtual void OnLocationUpdate(const Geoposition& position) { |
| 31 last_position_ = position; | 32 last_position_ = position; |
| 32 } | 33 } |
| 33 | 34 |
| 34 Geoposition last_position_; | 35 Geoposition last_position_; |
| 35 }; | 36 }; |
| 36 | 37 |
| 37 double g_fake_time_now_secs = 1; | 38 double g_fake_time_now_secs = 1; |
| 38 | 39 |
| 39 base::Time GetTimeNowForTest() { | 40 base::Time GetTimeNowForTest() { |
| 40 return base::Time::FromDoubleT(g_fake_time_now_secs); | 41 return base::Time::FromDoubleT(g_fake_time_now_secs); |
| 41 } | 42 } |
| 42 | 43 |
| 43 void AdvanceTimeNow(const base::TimeDelta& delta) { | 44 void AdvanceTimeNow(const base::TimeDelta& delta) { |
| 44 g_fake_time_now_secs += delta.InSecondsF(); | 45 g_fake_time_now_secs += delta.InSecondsF(); |
| 45 } | 46 } |
| 46 | 47 |
| 47 void SetPositionFix(MockLocationProvider* provider, | 48 void SetPositionFix(MockLocationProvider* provider, |
| 48 double latitude, | 49 double latitude, |
| 49 double longitude, | 50 double longitude, |
| 50 double accuracy) { | 51 double accuracy) { |
| 51 Geoposition position; | 52 Geoposition position; |
| 52 position.error_code = Geoposition::ERROR_CODE_NONE; | 53 position.error_code = Geoposition::ERROR_CODE_NONE; |
| 53 position.latitude = latitude; | 54 position.latitude = latitude; |
| 54 position.longitude = longitude; | 55 position.longitude = longitude; |
| 55 position.accuracy = accuracy; | 56 position.accuracy = accuracy; |
| 56 position.timestamp = GetTimeNowForTest(); | 57 position.timestamp = GetTimeNowForTest(); |
| 57 ASSERT_TRUE(position.IsInitialized()); | 58 ASSERT_TRUE(position.Validate()); |
| 58 ASSERT_TRUE(position.IsValidFix()); | |
| 59 provider->HandlePositionChanged(position); | 59 provider->HandlePositionChanged(position); |
| 60 } | 60 } |
| 61 | 61 |
| 62 void SetReferencePosition(MockLocationProvider* provider) { | 62 void SetReferencePosition(MockLocationProvider* provider) { |
| 63 SetPositionFix(provider, 51.0, -0.1, 400); | 63 SetPositionFix(provider, 51.0, -0.1, 400); |
| 64 } | 64 } |
| 65 | 65 |
| 66 class MockDependencyFactory : public GeolocationArbitratorDependencyFactory { | 66 class MockDependencyFactory : public GeolocationArbitratorDependencyFactory { |
| 67 public: | 67 public: |
| 68 explicit MockDependencyFactory(AccessTokenStore* access_token_store) | 68 explicit MockDependencyFactory(AccessTokenStore* access_token_store) |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 119 // testing::Test | 119 // testing::Test |
| 120 virtual void TearDown() { | 120 virtual void TearDown() { |
| 121 GeolocationArbitrator::SetDependencyFactoryForTest(NULL); | 121 GeolocationArbitrator::SetDependencyFactoryForTest(NULL); |
| 122 dependency_factory_ = NULL; | 122 dependency_factory_ = NULL; |
| 123 } | 123 } |
| 124 | 124 |
| 125 void CheckLastPositionInfo(double latitude, | 125 void CheckLastPositionInfo(double latitude, |
| 126 double longitude, | 126 double longitude, |
| 127 double accuracy) { | 127 double accuracy) { |
| 128 Geoposition geoposition = observer_->last_position_; | 128 Geoposition geoposition = observer_->last_position_; |
| 129 EXPECT_TRUE(geoposition.IsValidFix()); | 129 EXPECT_TRUE(geoposition.Validate()); |
| 130 EXPECT_DOUBLE_EQ(latitude, geoposition.latitude); | 130 EXPECT_DOUBLE_EQ(latitude, geoposition.latitude); |
| 131 EXPECT_DOUBLE_EQ(longitude, geoposition.longitude); | 131 EXPECT_DOUBLE_EQ(longitude, geoposition.longitude); |
| 132 EXPECT_DOUBLE_EQ(accuracy, geoposition.accuracy); | 132 EXPECT_DOUBLE_EQ(accuracy, geoposition.accuracy); |
| 133 } | 133 } |
| 134 | 134 |
| 135 base::TimeDelta SwitchOnFreshnessCliff() { | 135 base::TimeDelta SwitchOnFreshnessCliff() { |
| 136 // Add 1, to ensure it meets any greater-than test. | 136 // Add 1, to ensure it meets any greater-than test. |
| 137 return base::TimeDelta::FromMilliseconds( | 137 return base::TimeDelta::FromMilliseconds( |
| 138 GeolocationArbitrator::kFixStaleTimeoutMilliseconds + 1); | 138 GeolocationArbitrator::kFixStaleTimeoutMilliseconds + 1); |
| 139 } | 139 } |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 180 | 180 |
| 181 EXPECT_TRUE(access_token_store_->access_token_set_.empty()); | 181 EXPECT_TRUE(access_token_store_->access_token_set_.empty()); |
| 182 EXPECT_TRUE(access_token_store_->access_token_set_.empty()); | 182 EXPECT_TRUE(access_token_store_->access_token_set_.empty()); |
| 183 | 183 |
| 184 access_token_store_->NotifyDelegateTokensLoaded(); | 184 access_token_store_->NotifyDelegateTokensLoaded(); |
| 185 ASSERT_TRUE(cell()); | 185 ASSERT_TRUE(cell()); |
| 186 EXPECT_TRUE(gps()); | 186 EXPECT_TRUE(gps()); |
| 187 EXPECT_TRUE(cell()->has_listeners()); | 187 EXPECT_TRUE(cell()->has_listeners()); |
| 188 EXPECT_EQ(MockLocationProvider::LOW_ACCURACY, cell()->state_); | 188 EXPECT_EQ(MockLocationProvider::LOW_ACCURACY, cell()->state_); |
| 189 EXPECT_EQ(MockLocationProvider::LOW_ACCURACY, gps()->state_); | 189 EXPECT_EQ(MockLocationProvider::LOW_ACCURACY, gps()->state_); |
| 190 EXPECT_FALSE(observer_->last_position_.IsInitialized()); | 190 EXPECT_FALSE(observer_->last_position_.Validate()); |
| 191 EXPECT_EQ(content::Geoposition::ERROR_CODE_NONE, |
| 192 observer_->last_position_.error_code); |
| 191 | 193 |
| 192 SetReferencePosition(cell()); | 194 SetReferencePosition(cell()); |
| 193 | 195 |
| 194 EXPECT_TRUE(observer_->last_position_.IsInitialized()); | 196 EXPECT_TRUE(observer_->last_position_.Validate() || |
| 197 observer_->last_position_.error_code != |
| 198 content::Geoposition::ERROR_CODE_NONE); |
| 195 EXPECT_EQ(cell()->position_.latitude, | 199 EXPECT_EQ(cell()->position_.latitude, |
| 196 observer_->last_position_.latitude); | 200 observer_->last_position_.latitude); |
| 197 | 201 |
| 198 EXPECT_FALSE(cell()->is_permission_granted_); | 202 EXPECT_FALSE(cell()->is_permission_granted_); |
| 199 EXPECT_FALSE(arbitrator_->HasPermissionBeenGranted()); | 203 EXPECT_FALSE(arbitrator_->HasPermissionBeenGranted()); |
| 200 arbitrator_->OnPermissionGranted(); | 204 arbitrator_->OnPermissionGranted(); |
| 201 EXPECT_TRUE(arbitrator_->HasPermissionBeenGranted()); | 205 EXPECT_TRUE(arbitrator_->HasPermissionBeenGranted()); |
| 202 EXPECT_TRUE(cell()->is_permission_granted_); | 206 EXPECT_TRUE(cell()->is_permission_granted_); |
| 203 } | 207 } |
| 204 | 208 |
| (...skipping 14 matching lines...) Expand all Loading... |
| 219 | 223 |
| 220 TEST_F(GeolocationLocationArbitratorTest, Arbitration) { | 224 TEST_F(GeolocationLocationArbitratorTest, Arbitration) { |
| 221 arbitrator_->StartProviders(GeolocationObserverOptions(false)); | 225 arbitrator_->StartProviders(GeolocationObserverOptions(false)); |
| 222 access_token_store_->NotifyDelegateTokensLoaded(); | 226 access_token_store_->NotifyDelegateTokensLoaded(); |
| 223 ASSERT_TRUE(cell()); | 227 ASSERT_TRUE(cell()); |
| 224 ASSERT_TRUE(gps()); | 228 ASSERT_TRUE(gps()); |
| 225 | 229 |
| 226 SetPositionFix(cell(), 1, 2, 150); | 230 SetPositionFix(cell(), 1, 2, 150); |
| 227 | 231 |
| 228 // First position available | 232 // First position available |
| 229 EXPECT_TRUE(observer_->last_position_.IsValidFix()); | 233 EXPECT_TRUE(observer_->last_position_.Validate()); |
| 230 CheckLastPositionInfo(1, 2, 150); | 234 CheckLastPositionInfo(1, 2, 150); |
| 231 | 235 |
| 232 SetPositionFix(gps(), 3, 4, 50); | 236 SetPositionFix(gps(), 3, 4, 50); |
| 233 | 237 |
| 234 // More accurate fix available | 238 // More accurate fix available |
| 235 CheckLastPositionInfo(3, 4, 50); | 239 CheckLastPositionInfo(3, 4, 50); |
| 236 | 240 |
| 237 SetPositionFix(cell(), 5, 6, 150); | 241 SetPositionFix(cell(), 5, 6, 150); |
| 238 | 242 |
| 239 // New fix is available but it's less accurate, older fix should be kept. | 243 // New fix is available but it's less accurate, older fix should be kept. |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 287 CheckLastPositionInfo(3.5657104, 139.690341, 300); | 291 CheckLastPositionInfo(3.5657104, 139.690341, 300); |
| 288 | 292 |
| 289 // 2 minutes later | 293 // 2 minutes later |
| 290 AdvanceTimeNow(base::TimeDelta::FromMinutes(2)); | 294 AdvanceTimeNow(base::TimeDelta::FromMinutes(2)); |
| 291 // Arrive in station. Cell moves but GPS is stale. Switch to fresher cell. | 295 // Arrive in station. Cell moves but GPS is stale. Switch to fresher cell. |
| 292 SetPositionFix(cell(), 3.5658700, 139.069979, 1000); | 296 SetPositionFix(cell(), 3.5658700, 139.069979, 1000); |
| 293 CheckLastPositionInfo(3.5658700, 139.069979, 1000); | 297 CheckLastPositionInfo(3.5658700, 139.069979, 1000); |
| 294 } | 298 } |
| 295 | 299 |
| 296 } // namespace | 300 } // namespace |
| OLD | NEW |