OLD | NEW |
(Empty) | |
| 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 |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #include "blimp/engine/feature/geolocation/engine_geolocation_feature.h" |
| 6 |
| 7 #include "base/memory/ptr_util.h" |
| 8 #include "blimp/common/create_blimp_message.h" |
| 9 #include "blimp/common/proto/blimp_message.pb.h" |
| 10 #include "blimp/common/proto/geolocation.pb.h" |
| 11 #include "blimp/net/test_common.h" |
| 12 #include "content/public/browser/location_provider.h" |
| 13 #include "content/public/common/geoposition.h" |
| 14 #include "net/base/test_completion_callback.h" |
| 15 #include "testing/gmock/include/gmock/gmock.h" |
| 16 #include "testing/gtest/include/gtest/gtest.h" |
| 17 |
| 18 using testing::_; |
| 19 |
| 20 namespace blimp { |
| 21 namespace engine { |
| 22 |
| 23 void SendMockLocationMessage(BlimpMessageProcessor* processor, |
| 24 ErrorMessage::ErrorCode error) { |
| 25 GeolocationMessage* geolocation_message; |
| 26 std::unique_ptr<BlimpMessage> message = |
| 27 CreateBlimpMessage(&geolocation_message); |
| 28 if (error == ErrorMessage::ERROR_CODE_NONE) { |
| 29 LocationMessage* location_message = geolocation_message->mutable_location(); |
| 30 location_message->set_latitude(-42.0); |
| 31 location_message->set_longitude(17.3); |
| 32 location_message->set_altitude(123.4); |
| 33 location_message->set_accuracy(73.7); |
| 34 location_message->set_timestamp_millis(87); |
| 35 } else { |
| 36 ErrorMessage* error_message = geolocation_message->mutable_error(); |
| 37 error_message->set_error_code(error); |
| 38 error_message->set_error_message("AN ERROR HAS OCCURRED."); |
| 39 } |
| 40 net::TestCompletionCallback cb; |
| 41 processor->ProcessMessage(std::move(message), cb.callback()); |
| 42 EXPECT_EQ(net::OK, cb.WaitForResult()); |
| 43 } |
| 44 |
| 45 MATCHER_P(EqualsUpdatedListenState, accuracy, "") { |
| 46 return arg.feature_case() == BlimpMessage::kGeolocation && |
| 47 arg.geolocation().type_case() == |
| 48 GeolocationMessage::kUpdateListenState && |
| 49 arg.geolocation().update_listen_state().listen_state() == accuracy; |
| 50 } |
| 51 |
| 52 MATCHER(EqualsStoppedListenState, "") { |
| 53 return arg.feature_case() == BlimpMessage::kGeolocation && |
| 54 arg.geolocation().type_case() == |
| 55 GeolocationMessage::kUpdateListenState && |
| 56 arg.geolocation().update_listen_state().listen_state() == |
| 57 UpdateListenStateMessage::STOPPED; |
| 58 } |
| 59 |
| 60 MATCHER(EqualsRequestRefresh, "") { |
| 61 return arg.feature_case() == BlimpMessage::kGeolocation && |
| 62 arg.geolocation().type_case() == GeolocationMessage::kRequestRefresh; |
| 63 } |
| 64 |
| 65 class EngineGeolocationFeatureTest : public testing::Test { |
| 66 public: |
| 67 EngineGeolocationFeatureTest() |
| 68 : out_processor_(nullptr), |
| 69 mock_callback_( |
| 70 base::Bind(&EngineGeolocationFeatureTest::OnLocationUpdate, |
| 71 base::Unretained(this))) {} |
| 72 |
| 73 void SetUp() override { |
| 74 out_processor_ = new MockBlimpMessageProcessor(); |
| 75 feature_.set_outgoing_message_processor(base::WrapUnique(out_processor_)); |
| 76 feature_.SetUpdateCallback(mock_callback_); |
| 77 received_position = nullptr; |
| 78 } |
| 79 |
| 80 void OnLocationUpdate(const content::Geoposition& geoposition) { |
| 81 received_position = &geoposition; |
| 82 } |
| 83 |
| 84 protected: |
| 85 // This is a raw pointer to a class that is owned by the NavigationFeature. |
| 86 MockBlimpMessageProcessor* out_processor_; |
| 87 |
| 88 EngineGeolocationFeature feature_; |
| 89 base::Callback<void(const content::Geoposition&)> mock_callback_; |
| 90 const content::Geoposition* received_position; |
| 91 }; |
| 92 |
| 93 TEST_F(EngineGeolocationFeatureTest, TestLocationRecieved) { |
| 94 SendMockLocationMessage(&feature_, ErrorMessage::ERROR_CODE_NONE); |
| 95 ASSERT_NE(nullptr, received_position); |
| 96 EXPECT_EQ(content::Geoposition::ERROR_CODE_NONE, |
| 97 received_position->error_code); |
| 98 EXPECT_EQ(-42.0, received_position->latitude); |
| 99 EXPECT_EQ(17.3, received_position->longitude); |
| 100 EXPECT_EQ(123.4, received_position->altitude); |
| 101 EXPECT_EQ(73.7, received_position->accuracy); |
| 102 EXPECT_EQ(base::Time::FromJsTime(87), received_position->timestamp); |
| 103 } |
| 104 |
| 105 TEST_F(EngineGeolocationFeatureTest, TestErrorRecieved) { |
| 106 SendMockLocationMessage(&feature_, |
| 107 ErrorMessage::ERROR_CODE_PERMISSION_DENIED); |
| 108 ASSERT_NE(nullptr, received_position); |
| 109 EXPECT_EQ(content::Geoposition::ERROR_CODE_PERMISSION_DENIED, |
| 110 received_position->error_code); |
| 111 EXPECT_EQ("AN ERROR HAS OCCURRED.", received_position->error_message); |
| 112 |
| 113 SendMockLocationMessage(&feature_, |
| 114 ErrorMessage::ERROR_CODE_POSITION_UNAVAILABLE); |
| 115 EXPECT_EQ(content::Geoposition::ERROR_CODE_POSITION_UNAVAILABLE, |
| 116 received_position->error_code); |
| 117 } |
| 118 |
| 119 TEST_F(EngineGeolocationFeatureTest, TestSendUpdateListenStateMessage) { |
| 120 EXPECT_CALL( |
| 121 *out_processor_, |
| 122 MockableProcessMessage( |
| 123 EqualsUpdatedListenState(UpdateListenStateMessage::ACCURACY_HIGH), _)) |
| 124 .Times(1); |
| 125 EXPECT_CALL( |
| 126 *out_processor_, |
| 127 MockableProcessMessage( |
| 128 EqualsUpdatedListenState(UpdateListenStateMessage::ACCURACY_LOW), _)) |
| 129 .Times(1); |
| 130 feature_.UpdateListenState(true); |
| 131 feature_.UpdateListenState(false); |
| 132 } |
| 133 |
| 134 TEST_F(EngineGeolocationFeatureTest, TestSendStopUpdateListenStateMessage) { |
| 135 EXPECT_CALL(*out_processor_, |
| 136 MockableProcessMessage(EqualsStoppedListenState(), _)) |
| 137 .Times(1); |
| 138 feature_.StopListenState(); |
| 139 } |
| 140 |
| 141 TEST_F(EngineGeolocationFeatureTest, TestSendRequestRefreshMessage) { |
| 142 EXPECT_CALL(*out_processor_, |
| 143 MockableProcessMessage(EqualsRequestRefresh(), _)) |
| 144 .Times(1); |
| 145 feature_.RequestRefresh(); |
| 146 } |
| 147 |
| 148 } // namespace engine |
| 149 } // namespace blimp |
OLD | NEW |