Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 "blimp/engine/feature/geolocation/blimp_location_provider.h" | 5 #include "blimp/engine/feature/geolocation/blimp_location_provider.h" |
| 6 | 6 |
| 7 #include <memory> | 7 #include <memory> |
| 8 #include <utility> | 8 #include <utility> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| 11 #include "base/memory/ptr_util.h" | 11 #include "base/memory/ptr_util.h" |
| 12 #include "base/message_loop/message_loop.h" | |
| 13 #include "base/run_loop.h" | |
| 14 #include "base/threading/thread_task_runner_handle.h" | |
| 12 #include "blimp/engine/feature/geolocation/mock_blimp_location_provider_delegate .h" | 15 #include "blimp/engine/feature/geolocation/mock_blimp_location_provider_delegate .h" |
| 13 #include "testing/gmock/include/gmock/gmock.h" | 16 #include "testing/gmock/include/gmock/gmock.h" |
| 14 #include "testing/gtest/include/gtest/gtest.h" | 17 #include "testing/gtest/include/gtest/gtest.h" |
| 15 | 18 |
| 19 using testing::SaveArg; | |
| 16 using testing::_; | 20 using testing::_; |
| 17 using testing::SaveArg; | |
| 18 | 21 |
| 19 namespace blimp { | 22 namespace blimp { |
| 20 namespace engine { | 23 namespace engine { |
| 21 | 24 |
| 22 class BlimpLocationProviderTest : public testing::Test { | 25 class BlimpLocationProviderTest : public testing::Test { |
| 23 public: | 26 public: |
| 24 BlimpLocationProviderTest() | 27 BlimpLocationProviderTest() |
| 25 : mock_callback_(base::Bind(&BlimpLocationProviderTest::OnLocationUpdate, | 28 : mock_callback_(base::Bind(&BlimpLocationProviderTest::OnLocationUpdate, |
| 26 base::Unretained(this))), | 29 base::Unretained(this))), |
| 27 delegate_(base::WrapUnique(new MockBlimpLocationProviderDelegate)), | 30 delegate_(base::WrapUnique(new MockBlimpLocationProviderDelegate)), |
| 28 location_provider_(new BlimpLocationProvider(delegate_->GetWeakPtr())) { | 31 location_provider_(base::MakeUnique<BlimpLocationProvider>( |
| 32 delegate_->GetWeakPtr(), | |
| 33 base::ThreadTaskRunnerHandle::Get())) {} | |
| 34 | |
| 35 void SetUp() override { callback_called_ = false; } | |
| 36 | |
| 37 void TearDown() override { | |
| 38 location_provider_.reset(); | |
| 39 base::RunLoop().RunUntilIdle(); | |
| 29 } | 40 } |
| 30 | 41 |
| 31 void SetUp() override {} | 42 void OnLocationUpdate(const device::LocationProvider* provider, |
| 32 | 43 const device::Geoposition& geoposition) { |
| 33 MOCK_METHOD2(OnLocationUpdate, | 44 callback_called_ = true; |
| 34 void(const device::LocationProvider* provider, | 45 } |
| 35 const device::Geoposition& geoposition)); | |
| 36 | 46 |
| 37 protected: | 47 protected: |
| 48 const base::MessageLoop loop_; | |
| 38 device::LocationProvider::LocationProviderUpdateCallback mock_callback_; | 49 device::LocationProvider::LocationProviderUpdateCallback mock_callback_; |
| 39 std::unique_ptr<MockBlimpLocationProviderDelegate> delegate_; | 50 std::unique_ptr<MockBlimpLocationProviderDelegate> delegate_; |
| 40 std::unique_ptr<BlimpLocationProvider> location_provider_; | 51 std::unique_ptr<BlimpLocationProvider> location_provider_; |
| 52 bool callback_called_ = false; | |
|
Wez
2016/10/07 21:42:46
nit: Suggest on_location_update_called_ for clarit
CJ
2016/10/08 00:05:56
Done.
| |
| 41 | 53 |
| 42 private: | 54 private: |
| 43 DISALLOW_COPY_AND_ASSIGN(BlimpLocationProviderTest); | 55 DISALLOW_COPY_AND_ASSIGN(BlimpLocationProviderTest); |
| 44 }; | 56 }; |
| 45 | 57 |
| 46 TEST_F(BlimpLocationProviderTest, StartProviderRunsCorrectly) { | 58 TEST_F(BlimpLocationProviderTest, StartProviderRunsCorrectly) { |
| 47 EXPECT_CALL( | 59 EXPECT_CALL( |
| 48 *delegate_, | 60 *delegate_, |
| 49 RequestAccuracy(GeolocationSetInterestLevelMessage::HIGH_ACCURACY)) | 61 RequestAccuracy(GeolocationSetInterestLevelMessage::HIGH_ACCURACY)) |
| 50 .Times(1); | 62 .Times(1); |
| 51 EXPECT_CALL(*delegate_, | 63 EXPECT_CALL(*delegate_, |
| 52 RequestAccuracy(GeolocationSetInterestLevelMessage::LOW_ACCURACY)) | 64 RequestAccuracy(GeolocationSetInterestLevelMessage::LOW_ACCURACY)) |
| 53 .Times(1); | 65 .Times(1); |
| 54 | 66 |
| 55 // BlimpLocationProvider implicitly stops on teardown, if it was started. | 67 // BlimpLocationProvider implicitly stops on teardown, if it was started. |
| 56 EXPECT_CALL(*delegate_, | 68 EXPECT_CALL(*delegate_, |
| 57 RequestAccuracy(GeolocationSetInterestLevelMessage::NO_INTEREST)) | 69 RequestAccuracy(GeolocationSetInterestLevelMessage::NO_INTEREST)) |
| 58 .Times(1); | 70 .Times(1); |
| 59 | 71 |
| 60 EXPECT_TRUE(location_provider_->StartProvider(true)); | 72 EXPECT_TRUE(location_provider_->StartProvider(true)); |
| 61 EXPECT_TRUE(location_provider_->StartProvider(false)); | 73 EXPECT_TRUE(location_provider_->StartProvider(false)); |
| 74 base::RunLoop().RunUntilIdle(); | |
| 62 } | 75 } |
| 63 | 76 |
| 64 TEST_F(BlimpLocationProviderTest, StartProviderHandlesNullDelegate) { | 77 TEST_F(BlimpLocationProviderTest, StartProviderHandlesNullDelegate) { |
| 65 EXPECT_CALL(*delegate_, RequestAccuracy(_)).Times(0); | 78 EXPECT_CALL(*delegate_, RequestAccuracy(_)).Times(0); |
| 66 | 79 |
| 67 delegate_.reset(); | 80 delegate_.reset(); |
| 68 EXPECT_FALSE(location_provider_->StartProvider(true)); | 81 location_provider_->StartProvider(true); |
| 69 EXPECT_FALSE(location_provider_->StartProvider(false)); | 82 location_provider_->StartProvider(false); |
| 83 base::RunLoop().RunUntilIdle(); | |
| 70 } | 84 } |
| 71 | 85 |
| 72 TEST_F(BlimpLocationProviderTest, StopProviderRunsCorrectly) { | 86 TEST_F(BlimpLocationProviderTest, StopProviderRunsCorrectly) { |
| 73 EXPECT_CALL( | 87 EXPECT_CALL( |
| 74 *delegate_, | 88 *delegate_, |
| 75 RequestAccuracy(GeolocationSetInterestLevelMessage::HIGH_ACCURACY)) | 89 RequestAccuracy(GeolocationSetInterestLevelMessage::HIGH_ACCURACY)) |
| 76 .Times(1); | 90 .Times(1); |
| 77 EXPECT_CALL(*delegate_, | 91 EXPECT_CALL(*delegate_, |
| 78 RequestAccuracy(GeolocationSetInterestLevelMessage::NO_INTEREST)) | 92 RequestAccuracy(GeolocationSetInterestLevelMessage::NO_INTEREST)) |
| 79 .Times(1); | 93 .Times(1); |
| 80 | 94 |
| 81 location_provider_->StartProvider(true); | 95 location_provider_->StartProvider(true); |
| 82 location_provider_->StopProvider(); | 96 location_provider_->StopProvider(); |
| 97 base::RunLoop().RunUntilIdle(); | |
| 83 } | 98 } |
| 84 | 99 |
| 85 TEST_F(BlimpLocationProviderTest, StopProviderHandlesNullDelegate) { | 100 TEST_F(BlimpLocationProviderTest, StopProviderHandlesNullDelegate) { |
| 86 EXPECT_CALL( | 101 EXPECT_CALL( |
| 87 *delegate_, | 102 *delegate_, |
| 88 RequestAccuracy(GeolocationSetInterestLevelMessage::HIGH_ACCURACY)) | 103 RequestAccuracy(GeolocationSetInterestLevelMessage::HIGH_ACCURACY)) |
| 89 .Times(1); | 104 .Times(1); |
| 90 | 105 |
| 91 location_provider_->StartProvider(true); | 106 location_provider_->StartProvider(true); |
| 107 base::RunLoop().RunUntilIdle(); | |
| 92 delegate_.reset(); | 108 delegate_.reset(); |
| 93 location_provider_->StopProvider(); | 109 location_provider_->StopProvider(); |
| 110 base::RunLoop().RunUntilIdle(); | |
| 94 } | 111 } |
| 95 | 112 |
| 96 TEST_F(BlimpLocationProviderTest, LocationProviderDeleted) { | 113 TEST_F(BlimpLocationProviderTest, LocationProviderDeleted) { |
| 97 EXPECT_CALL( | 114 EXPECT_CALL( |
| 98 *delegate_, | 115 *delegate_, |
| 99 RequestAccuracy(GeolocationSetInterestLevelMessage::HIGH_ACCURACY)) | 116 RequestAccuracy(GeolocationSetInterestLevelMessage::HIGH_ACCURACY)) |
| 100 .Times(1); | 117 .Times(1); |
| 101 EXPECT_CALL(*delegate_, | 118 EXPECT_CALL(*delegate_, |
| 102 RequestAccuracy(GeolocationSetInterestLevelMessage::NO_INTEREST)) | 119 RequestAccuracy(GeolocationSetInterestLevelMessage::NO_INTEREST)) |
| 103 .Times(1); | 120 .Times(1); |
| 104 | 121 |
| 105 location_provider_->StartProvider(true); | 122 location_provider_->StartProvider(true); |
| 106 location_provider_.reset(); | 123 location_provider_.reset(); |
| 124 base::RunLoop().RunUntilIdle(); | |
| 107 } | 125 } |
| 108 | 126 |
| 109 TEST_F(BlimpLocationProviderTest, OnPermissionGranted) { | 127 TEST_F(BlimpLocationProviderTest, OnPermissionGranted) { |
| 110 EXPECT_CALL(*delegate_, OnPermissionGranted()).Times(1); | 128 EXPECT_CALL(*delegate_, OnPermissionGranted()).Times(1); |
| 129 EXPECT_CALL( | |
| 130 *delegate_, | |
| 131 RequestAccuracy(GeolocationSetInterestLevelMessage::HIGH_ACCURACY)) | |
| 132 .Times(1); | |
| 133 EXPECT_CALL(*delegate_, | |
| 134 RequestAccuracy(GeolocationSetInterestLevelMessage::NO_INTEREST)) | |
| 135 .Times(1); | |
| 111 | 136 |
| 112 location_provider_->StartProvider(true); | 137 location_provider_->StartProvider(true); |
| 113 location_provider_->OnPermissionGranted(); | 138 location_provider_->OnPermissionGranted(); |
| 139 base::RunLoop().RunUntilIdle(); | |
| 114 } | 140 } |
| 115 | 141 |
| 116 TEST_F(BlimpLocationProviderTest, OnPermissionGrantedHandlesNullDelegate) { | 142 TEST_F(BlimpLocationProviderTest, OnPermissionGrantedHandlesNullDelegate) { |
| 117 EXPECT_CALL(*delegate_, OnPermissionGranted()).Times(0); | 143 EXPECT_CALL( |
| 144 *delegate_, | |
| 145 RequestAccuracy(GeolocationSetInterestLevelMessage::HIGH_ACCURACY)) | |
| 146 .Times(1); | |
| 118 | 147 |
| 119 location_provider_->StartProvider(true); | 148 location_provider_->StartProvider(true); |
| 149 base::RunLoop().RunUntilIdle(); | |
| 120 delegate_.reset(); | 150 delegate_.reset(); |
| 121 location_provider_->OnPermissionGranted(); | 151 location_provider_->OnPermissionGranted(); |
| 152 base::RunLoop().RunUntilIdle(); | |
| 122 } | 153 } |
| 123 | 154 |
| 124 TEST_F(BlimpLocationProviderTest, SetUpdateCallbackPropagatesCallback) { | 155 TEST_F(BlimpLocationProviderTest, SetUpdateCallbackPropagatesCallback) { |
| 156 EXPECT_CALL(*delegate_, SetUpdateCallback(_)); | |
| 157 | |
| 158 location_provider_->SetUpdateCallback(mock_callback_); | |
| 159 base::RunLoop().RunUntilIdle(); | |
| 160 } | |
| 161 | |
| 162 TEST_F(BlimpLocationProviderTest, NoCallbackWhenProviderDeleted) { | |
| 125 base::Callback<void(const device::Geoposition&)> callback; | 163 base::Callback<void(const device::Geoposition&)> callback; |
| 126 EXPECT_CALL(*delegate_, SetUpdateCallback(_)).WillOnce(SaveArg<0>(&callback)); | 164 EXPECT_CALL(*delegate_, SetUpdateCallback(_)).WillOnce(SaveArg<0>(&callback)); |
| 127 EXPECT_CALL(*this, OnLocationUpdate(location_provider_.get(), _)).Times(1); | 165 location_provider_->SetUpdateCallback(mock_callback_); |
| 166 base::RunLoop().RunUntilIdle(); | |
| 128 | 167 |
| 129 location_provider_->SetUpdateCallback(mock_callback_); | 168 location_provider_.reset(); |
| 130 callback.Run(device::Geoposition()); | 169 device::Geoposition position; |
| 170 callback.Run(position); | |
| 171 EXPECT_FALSE(callback_called_); | |
|
Wez
2016/10/07 21:42:46
nit: Do you ever EXPECT_TRUE(callback_called_) in
CJ
2016/10/08 00:05:56
Done.
| |
| 131 } | 172 } |
| 132 | 173 |
| 133 TEST_F(BlimpLocationProviderTest, SetUpdateCallbackHandlesNullDelegate) { | 174 TEST_F(BlimpLocationProviderTest, SetUpdateCallbackHandlesNullDelegate) { |
| 134 EXPECT_CALL(*delegate_, SetUpdateCallback(_)).Times(0); | 175 EXPECT_CALL(*delegate_, SetUpdateCallback(_)).Times(0); |
| 135 | 176 |
| 136 delegate_.reset(); | 177 delegate_.reset(); |
| 137 location_provider_->SetUpdateCallback(mock_callback_); | 178 location_provider_->SetUpdateCallback(mock_callback_); |
| 179 base::RunLoop().RunUntilIdle(); | |
| 138 } | 180 } |
| 139 | 181 |
| 140 } // namespace engine | 182 } // namespace engine |
| 141 } // namespace blimp | 183 } // namespace blimp |
| OLD | NEW |