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 "chromeos/components/tether/host_scan_device_prioritizer.h" | 5 #include "chromeos/components/tether/host_scan_device_prioritizer.h" |
6 | 6 |
| 7 #include <memory> |
| 8 |
| 9 #include "base/test/scoped_task_environment.h" |
| 10 #include "chromeos/components/tether/device_id_tether_network_guid_map.h" |
7 #include "chromeos/components/tether/tether_host_response_recorder.h" | 11 #include "chromeos/components/tether/tether_host_response_recorder.h" |
| 12 #include "chromeos/dbus/dbus_thread_manager.h" |
| 13 #include "chromeos/network/network_state.h" |
| 14 #include "chromeos/network/network_state_handler.h" |
| 15 #include "chromeos/network/network_state_test.h" |
8 #include "components/cryptauth/remote_device_test_util.h" | 16 #include "components/cryptauth/remote_device_test_util.h" |
9 #include "components/prefs/testing_pref_service.h" | 17 #include "components/prefs/testing_pref_service.h" |
10 #include "testing/gtest/include/gtest/gtest.h" | 18 #include "testing/gtest/include/gtest/gtest.h" |
11 | 19 |
12 namespace chromeos { | 20 namespace chromeos { |
13 | 21 |
14 namespace tether { | 22 namespace tether { |
15 | 23 |
16 class HostScanDevicePrioritizerTest : public testing::Test { | 24 class HostScanDevicePrioritizerTest : public NetworkStateTest { |
17 protected: | 25 protected: |
18 HostScanDevicePrioritizerTest() | 26 HostScanDevicePrioritizerTest() |
19 : test_devices_(cryptauth::GenerateTestRemoteDevices(10)) {} | 27 : test_devices_(cryptauth::GenerateTestRemoteDevices(10)) {} |
20 | 28 |
21 void SetUp() override { | 29 void SetUp() override { |
| 30 DBusThreadManager::Initialize(); |
| 31 NetworkStateTest::SetUp(); |
| 32 |
| 33 network_state_handler()->SetTetherTechnologyState( |
| 34 NetworkStateHandler::TechnologyState::TECHNOLOGY_ENABLED); |
| 35 |
22 pref_service_ = base::MakeUnique<TestingPrefServiceSimple>(); | 36 pref_service_ = base::MakeUnique<TestingPrefServiceSimple>(); |
23 TetherHostResponseRecorder::RegisterPrefs(pref_service_->registry()); | 37 TetherHostResponseRecorder::RegisterPrefs(pref_service_->registry()); |
24 | 38 |
25 recorder_ = | 39 recorder_ = |
26 base::MakeUnique<TetherHostResponseRecorder>(pref_service_.get()); | 40 base::MakeUnique<TetherHostResponseRecorder>(pref_service_.get()); |
| 41 device_id_tether_network_guid_map_ = |
| 42 base::MakeUnique<DeviceIdTetherNetworkGuidMap>(); |
27 | 43 |
28 prioritizer_ = base::MakeUnique<HostScanDevicePrioritizer>(recorder_.get()); | 44 prioritizer_ = base::MakeUnique<HostScanDevicePrioritizer>( |
| 45 network_state_handler(), recorder_.get(), |
| 46 device_id_tether_network_guid_map_.get()); |
29 } | 47 } |
30 | 48 |
| 49 void TearDown() override { |
| 50 prioritizer_.reset(); |
| 51 ShutdownNetworkState(); |
| 52 NetworkStateTest::TearDown(); |
| 53 DBusThreadManager::Shutdown(); |
| 54 } |
| 55 |
| 56 void VerifyNetworksInExpectedOrder( |
| 57 std::vector<cryptauth::RemoteDevice> expected) { |
| 58 NetworkStateHandler::NetworkStateList network_list; |
| 59 |
| 60 network_state_handler()->GetVisibleNetworkListByType( |
| 61 NetworkTypePattern::Tether(), &network_list); |
| 62 EXPECT_EQ(expected.size(), network_list.size()); |
| 63 |
| 64 for (size_t i = 0; i < expected.size(); i++) { |
| 65 std::string expected_guid = |
| 66 device_id_tether_network_guid_map_->GetTetherNetworkGuidForDeviceId( |
| 67 expected[i].GetDeviceId()); |
| 68 EXPECT_EQ(expected_guid, network_list[i]->guid()); |
| 69 } |
| 70 } |
| 71 |
| 72 void AddNetworkStateForDevice(const cryptauth::RemoteDevice& remote_device) { |
| 73 std::string guid = |
| 74 device_id_tether_network_guid_map_->GetTetherNetworkGuidForDeviceId( |
| 75 remote_device.GetDeviceId()); |
| 76 network_state_handler()->AddTetherNetworkState( |
| 77 guid, "name", "carrier", 100 /* battery_percentage */, |
| 78 100 /* signal_strength */, false /* has_connected_to_host */); |
| 79 } |
| 80 |
| 81 const base::test::ScopedTaskEnvironment scoped_task_environment_; |
31 const std::vector<cryptauth::RemoteDevice> test_devices_; | 82 const std::vector<cryptauth::RemoteDevice> test_devices_; |
32 | 83 |
33 std::unique_ptr<TestingPrefServiceSimple> pref_service_; | 84 std::unique_ptr<TestingPrefServiceSimple> pref_service_; |
34 std::unique_ptr<TetherHostResponseRecorder> recorder_; | 85 std::unique_ptr<TetherHostResponseRecorder> recorder_; |
| 86 // TODO(hansberry): Use a fake for this when a real mapping scheme is created. |
| 87 std::unique_ptr<DeviceIdTetherNetworkGuidMap> |
| 88 device_id_tether_network_guid_map_; |
35 | 89 |
36 std::unique_ptr<HostScanDevicePrioritizer> prioritizer_; | 90 std::unique_ptr<HostScanDevicePrioritizer> prioritizer_; |
37 | 91 |
38 private: | 92 private: |
39 DISALLOW_COPY_AND_ASSIGN(HostScanDevicePrioritizerTest); | 93 DISALLOW_COPY_AND_ASSIGN(HostScanDevicePrioritizerTest); |
40 }; | 94 }; |
41 | 95 |
42 TEST_F(HostScanDevicePrioritizerTest, TestOnlyTetherAvailabilityResponses) { | 96 TEST_F(HostScanDevicePrioritizerTest, |
| 97 TestOnlyTetherAvailabilityResponses_RemoteDevices) { |
43 // Receive TetherAvailabilityResponses from devices 0-4. | 98 // Receive TetherAvailabilityResponses from devices 0-4. |
44 recorder_->RecordSuccessfulTetherAvailabilityResponse(test_devices_[0]); | 99 recorder_->RecordSuccessfulTetherAvailabilityResponse(test_devices_[0]); |
45 recorder_->RecordSuccessfulTetherAvailabilityResponse(test_devices_[1]); | 100 recorder_->RecordSuccessfulTetherAvailabilityResponse(test_devices_[1]); |
46 recorder_->RecordSuccessfulTetherAvailabilityResponse(test_devices_[2]); | 101 recorder_->RecordSuccessfulTetherAvailabilityResponse(test_devices_[2]); |
47 recorder_->RecordSuccessfulTetherAvailabilityResponse(test_devices_[3]); | 102 recorder_->RecordSuccessfulTetherAvailabilityResponse(test_devices_[3]); |
48 recorder_->RecordSuccessfulTetherAvailabilityResponse(test_devices_[4]); | 103 recorder_->RecordSuccessfulTetherAvailabilityResponse(test_devices_[4]); |
49 | 104 |
50 // Do not receive a ConnectTetheringResponse. | 105 // Do not receive a ConnectTetheringResponse. |
51 | 106 |
52 std::vector<cryptauth::RemoteDevice> test_vector = | 107 std::vector<cryptauth::RemoteDevice> test_vector = |
53 std::vector<cryptauth::RemoteDevice>{test_devices_[6], test_devices_[5], | 108 std::vector<cryptauth::RemoteDevice>{test_devices_[6], test_devices_[5], |
54 test_devices_[4], test_devices_[3], | 109 test_devices_[4], test_devices_[3], |
55 test_devices_[2], test_devices_[1], | 110 test_devices_[2], test_devices_[1], |
56 test_devices_[0]}; | 111 test_devices_[0]}; |
57 | 112 |
58 prioritizer_->SortByHostScanOrder(&test_vector); | 113 prioritizer_->SortByHostScanOrder(&test_vector); |
59 EXPECT_EQ((std::vector<cryptauth::RemoteDevice>{ | 114 EXPECT_EQ((std::vector<cryptauth::RemoteDevice>{ |
60 test_devices_[4], test_devices_[3], test_devices_[2], | 115 test_devices_[4], test_devices_[3], test_devices_[2], |
61 test_devices_[1], test_devices_[0], test_devices_[6], | 116 test_devices_[1], test_devices_[0], test_devices_[6], |
62 test_devices_[5]}), | 117 test_devices_[5]}), |
63 test_vector); | 118 test_vector); |
64 } | 119 } |
65 | 120 |
66 TEST_F(HostScanDevicePrioritizerTest, TestBothTypesOfResponses) { | 121 TEST_F(HostScanDevicePrioritizerTest, |
| 122 TestOnlyTetherAvailabilityResponses_NetworkStates) { |
67 // Receive TetherAvailabilityResponses from devices 0-4. | 123 // Receive TetherAvailabilityResponses from devices 0-4. |
68 recorder_->RecordSuccessfulTetherAvailabilityResponse(test_devices_[0]); | 124 recorder_->RecordSuccessfulTetherAvailabilityResponse(test_devices_[0]); |
69 recorder_->RecordSuccessfulTetherAvailabilityResponse(test_devices_[1]); | 125 recorder_->RecordSuccessfulTetherAvailabilityResponse(test_devices_[1]); |
| 126 recorder_->RecordSuccessfulTetherAvailabilityResponse(test_devices_[2]); |
| 127 recorder_->RecordSuccessfulTetherAvailabilityResponse(test_devices_[3]); |
| 128 recorder_->RecordSuccessfulTetherAvailabilityResponse(test_devices_[4]); |
| 129 |
| 130 // Do not receive a ConnectTetheringResponse. |
| 131 |
| 132 AddNetworkStateForDevice(test_devices_[6]); |
| 133 AddNetworkStateForDevice(test_devices_[5]); |
| 134 AddNetworkStateForDevice(test_devices_[4]); |
| 135 AddNetworkStateForDevice(test_devices_[3]); |
| 136 AddNetworkStateForDevice(test_devices_[2]); |
| 137 AddNetworkStateForDevice(test_devices_[1]); |
| 138 AddNetworkStateForDevice(test_devices_[0]); |
| 139 |
| 140 VerifyNetworksInExpectedOrder((std::vector<cryptauth::RemoteDevice>{ |
| 141 test_devices_[4], test_devices_[3], test_devices_[2], test_devices_[1], |
| 142 test_devices_[0], test_devices_[6], test_devices_[5]})); |
| 143 } |
| 144 |
| 145 TEST_F(HostScanDevicePrioritizerTest, TestBothTypesOfResponses_RemoteDevices) { |
| 146 // Receive TetherAvailabilityResponses from devices 0-4. |
| 147 recorder_->RecordSuccessfulTetherAvailabilityResponse(test_devices_[0]); |
| 148 recorder_->RecordSuccessfulTetherAvailabilityResponse(test_devices_[1]); |
70 recorder_->RecordSuccessfulTetherAvailabilityResponse(test_devices_[2]); | 149 recorder_->RecordSuccessfulTetherAvailabilityResponse(test_devices_[2]); |
71 recorder_->RecordSuccessfulTetherAvailabilityResponse(test_devices_[3]); | 150 recorder_->RecordSuccessfulTetherAvailabilityResponse(test_devices_[3]); |
72 recorder_->RecordSuccessfulTetherAvailabilityResponse(test_devices_[4]); | 151 recorder_->RecordSuccessfulTetherAvailabilityResponse(test_devices_[4]); |
73 | 152 |
74 // Receive ConnectTetheringResponse from device 0. | 153 // Receive ConnectTetheringResponse from device 0. |
75 recorder_->RecordSuccessfulConnectTetheringResponse(test_devices_[0]); | 154 recorder_->RecordSuccessfulConnectTetheringResponse(test_devices_[0]); |
76 | 155 |
77 std::vector<cryptauth::RemoteDevice> test_vector = | 156 std::vector<cryptauth::RemoteDevice> test_vector = |
78 std::vector<cryptauth::RemoteDevice>{test_devices_[6], test_devices_[5], | 157 std::vector<cryptauth::RemoteDevice>{test_devices_[6], test_devices_[5], |
79 test_devices_[4], test_devices_[3], | 158 test_devices_[4], test_devices_[3], |
80 test_devices_[2], test_devices_[1], | 159 test_devices_[2], test_devices_[1], |
81 test_devices_[0]}; | 160 test_devices_[0]}; |
82 | 161 |
83 prioritizer_->SortByHostScanOrder(&test_vector); | 162 prioritizer_->SortByHostScanOrder(&test_vector); |
84 EXPECT_EQ((std::vector<cryptauth::RemoteDevice>{ | 163 EXPECT_EQ((std::vector<cryptauth::RemoteDevice>{ |
85 test_devices_[0], test_devices_[4], test_devices_[3], | 164 test_devices_[0], test_devices_[4], test_devices_[3], |
86 test_devices_[2], test_devices_[1], test_devices_[6], | 165 test_devices_[2], test_devices_[1], test_devices_[6], |
87 test_devices_[5]}), | 166 test_devices_[5]}), |
88 test_vector); | 167 test_vector); |
89 } | 168 } |
90 | 169 |
91 TEST_F(HostScanDevicePrioritizerTest, TestBothTypesOfResponses_DifferentOrder) { | 170 TEST_F(HostScanDevicePrioritizerTest, TestBothTypesOfResponses_NetworkStates) { |
| 171 // Receive TetherAvailabilityResponses from devices 0-4. |
| 172 recorder_->RecordSuccessfulTetherAvailabilityResponse(test_devices_[0]); |
| 173 recorder_->RecordSuccessfulTetherAvailabilityResponse(test_devices_[1]); |
| 174 recorder_->RecordSuccessfulTetherAvailabilityResponse(test_devices_[2]); |
| 175 recorder_->RecordSuccessfulTetherAvailabilityResponse(test_devices_[3]); |
| 176 recorder_->RecordSuccessfulTetherAvailabilityResponse(test_devices_[4]); |
| 177 |
| 178 // Receive ConnectTetheringResponse from device 0. |
| 179 recorder_->RecordSuccessfulConnectTetheringResponse(test_devices_[0]); |
| 180 |
| 181 AddNetworkStateForDevice(test_devices_[6]); |
| 182 AddNetworkStateForDevice(test_devices_[5]); |
| 183 AddNetworkStateForDevice(test_devices_[4]); |
| 184 AddNetworkStateForDevice(test_devices_[3]); |
| 185 AddNetworkStateForDevice(test_devices_[2]); |
| 186 AddNetworkStateForDevice(test_devices_[1]); |
| 187 AddNetworkStateForDevice(test_devices_[0]); |
| 188 |
| 189 VerifyNetworksInExpectedOrder((std::vector<cryptauth::RemoteDevice>{ |
| 190 test_devices_[0], test_devices_[4], test_devices_[3], test_devices_[2], |
| 191 test_devices_[1], test_devices_[6], test_devices_[5]})); |
| 192 } |
| 193 |
| 194 TEST_F(HostScanDevicePrioritizerTest, |
| 195 TestBothTypesOfResponses_DifferentOrder_RemoteDevices) { |
92 // Receive different order. | 196 // Receive different order. |
93 recorder_->RecordSuccessfulTetherAvailabilityResponse(test_devices_[0]); | 197 recorder_->RecordSuccessfulTetherAvailabilityResponse(test_devices_[0]); |
94 recorder_->RecordSuccessfulTetherAvailabilityResponse(test_devices_[2]); | 198 recorder_->RecordSuccessfulTetherAvailabilityResponse(test_devices_[2]); |
95 recorder_->RecordSuccessfulTetherAvailabilityResponse(test_devices_[1]); | 199 recorder_->RecordSuccessfulTetherAvailabilityResponse(test_devices_[1]); |
96 recorder_->RecordSuccessfulTetherAvailabilityResponse(test_devices_[4]); | 200 recorder_->RecordSuccessfulTetherAvailabilityResponse(test_devices_[4]); |
97 recorder_->RecordSuccessfulTetherAvailabilityResponse(test_devices_[3]); | 201 recorder_->RecordSuccessfulTetherAvailabilityResponse(test_devices_[3]); |
98 | 202 |
99 // Receive ConnectTetheringResponse from device 1. | 203 // Receive ConnectTetheringResponse from device 1. |
100 recorder_->RecordSuccessfulConnectTetheringResponse(test_devices_[1]); | 204 recorder_->RecordSuccessfulConnectTetheringResponse(test_devices_[1]); |
101 | 205 |
102 std::vector<cryptauth::RemoteDevice> test_vector = | 206 std::vector<cryptauth::RemoteDevice> test_vector = |
103 std::vector<cryptauth::RemoteDevice>{test_devices_[9], test_devices_[8], | 207 std::vector<cryptauth::RemoteDevice>{test_devices_[9], test_devices_[8], |
104 test_devices_[7], test_devices_[6], | 208 test_devices_[7], test_devices_[6], |
105 test_devices_[5], test_devices_[4], | 209 test_devices_[5], test_devices_[4], |
106 test_devices_[3], test_devices_[2], | 210 test_devices_[3], test_devices_[2], |
107 test_devices_[1], test_devices_[0]}; | 211 test_devices_[1], test_devices_[0]}; |
108 | 212 |
109 prioritizer_->SortByHostScanOrder(&test_vector); | 213 prioritizer_->SortByHostScanOrder(&test_vector); |
110 EXPECT_EQ((std::vector<cryptauth::RemoteDevice>{ | 214 EXPECT_EQ((std::vector<cryptauth::RemoteDevice>{ |
111 test_devices_[1], test_devices_[3], test_devices_[4], | 215 test_devices_[1], test_devices_[3], test_devices_[4], |
112 test_devices_[2], test_devices_[0], test_devices_[9], | 216 test_devices_[2], test_devices_[0], test_devices_[9], |
113 test_devices_[8], test_devices_[7], test_devices_[6], | 217 test_devices_[8], test_devices_[7], test_devices_[6], |
114 test_devices_[5]}), | 218 test_devices_[5]}), |
115 test_vector); | 219 test_vector); |
116 } | 220 } |
117 | 221 |
| 222 TEST_F(HostScanDevicePrioritizerTest, |
| 223 TestBothTypesOfResponses_DifferentOrder_NetworkStates) { |
| 224 // Receive different order. |
| 225 recorder_->RecordSuccessfulTetherAvailabilityResponse(test_devices_[0]); |
| 226 recorder_->RecordSuccessfulTetherAvailabilityResponse(test_devices_[2]); |
| 227 recorder_->RecordSuccessfulTetherAvailabilityResponse(test_devices_[1]); |
| 228 recorder_->RecordSuccessfulTetherAvailabilityResponse(test_devices_[4]); |
| 229 recorder_->RecordSuccessfulTetherAvailabilityResponse(test_devices_[3]); |
| 230 |
| 231 // Receive ConnectTetheringResponse from device 1. |
| 232 recorder_->RecordSuccessfulConnectTetheringResponse(test_devices_[1]); |
| 233 |
| 234 AddNetworkStateForDevice(test_devices_[9]); |
| 235 AddNetworkStateForDevice(test_devices_[8]); |
| 236 AddNetworkStateForDevice(test_devices_[7]); |
| 237 AddNetworkStateForDevice(test_devices_[6]); |
| 238 AddNetworkStateForDevice(test_devices_[5]); |
| 239 AddNetworkStateForDevice(test_devices_[4]); |
| 240 AddNetworkStateForDevice(test_devices_[3]); |
| 241 AddNetworkStateForDevice(test_devices_[2]); |
| 242 AddNetworkStateForDevice(test_devices_[1]); |
| 243 AddNetworkStateForDevice(test_devices_[0]); |
| 244 |
| 245 VerifyNetworksInExpectedOrder((std::vector<cryptauth::RemoteDevice>{ |
| 246 test_devices_[1], test_devices_[3], test_devices_[4], test_devices_[2], |
| 247 test_devices_[0], test_devices_[9], test_devices_[8], test_devices_[7], |
| 248 test_devices_[6], test_devices_[5]})); |
| 249 } |
| 250 |
118 } // namespace tether | 251 } // namespace tether |
119 | 252 |
120 } // namespace cryptauth | 253 } // namespace cryptauth |
OLD | NEW |