Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright 2014 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 "chromeos/pairing/fake_controller_pairing_flow.h" | |
| 6 | |
| 7 #include "base/bind.h" | |
| 8 #include "base/logging.h" | |
| 9 #include "base/message_loop/message_loop.h" | |
| 10 #include "base/rand_util.h" | |
| 11 | |
| 12 namespace chromeos { | |
| 13 | |
| 14 const char* FakeControllerPairingFlow::kNotFoundDeviceID = "not_found"; | |
| 15 | |
| 16 FakeControllerPairingFlow::FakeControllerPairingFlow() | |
| 17 : current_stage_(STAGE_NONE), | |
| 18 async_duration_(base::TimeDelta::FromSeconds(3)), | |
| 19 should_fail_on_connecting_(false), | |
| 20 connection_lost_begin_(STAGE_NONE), | |
| 21 connection_lost_end_(STAGE_NONE), | |
| 22 enrollment_should_fail_(false) { | |
| 23 SetDiscoveryScenario(GetDefaultScenario()); | |
| 24 AddObserver(this); | |
| 25 } | |
| 26 | |
| 27 FakeControllerPairingFlow::~FakeControllerPairingFlow() { | |
| 28 RemoveObserver(this); | |
| 29 } | |
| 30 | |
| 31 void FakeControllerPairingFlow::SetShouldFailOnConnecting() { | |
| 32 should_fail_on_connecting_ = true; | |
| 33 } | |
| 34 | |
| 35 void FakeControllerPairingFlow::SetShouldLoseConnection(Stage stage_begin, | |
| 36 Stage stage_end) { | |
| 37 connection_lost_begin_ = stage_begin; | |
| 38 connection_lost_end_ = stage_end; | |
| 39 } | |
| 40 | |
| 41 void FakeControllerPairingFlow::SetEnrollmentShouldFail() { | |
| 42 enrollment_should_fail_ = true; | |
| 43 } | |
| 44 | |
| 45 void FakeControllerPairingFlow::SetDiscoveryScenario( | |
| 46 const DiscoveryScenario& discovery_scenario) { | |
| 47 discovery_scenario_ = discovery_scenario; | |
| 48 // Check that scenario is valid. | |
| 49 std::set<std::string> devices; | |
| 50 for (DiscoveryScenario::const_iterator event = discovery_scenario_.begin(); | |
| 51 event != discovery_scenario_.end(); | |
| 52 ++event) { | |
| 53 if (event->second == kNotFoundDeviceID) { | |
| 54 CHECK(devices.empty()); | |
| 55 CHECK(++event == discovery_scenario_.end()); | |
| 56 return; | |
| 57 } else if (event->first == DEVICE_FOUND) { | |
| 58 devices.insert(event->second); | |
| 59 } else { | |
| 60 CHECK(devices.count(event->second)); | |
| 61 devices.erase(event->second); | |
| 62 } | |
| 63 } | |
| 64 } | |
| 65 | |
| 66 void FakeControllerPairingFlow::AddObserver(Observer* observer) { | |
| 67 observers_.AddObserver(observer); | |
| 68 } | |
| 69 | |
| 70 void FakeControllerPairingFlow::RemoveObserver(Observer* observer) { | |
| 71 observers_.RemoveObserver(observer); | |
| 72 } | |
| 73 | |
| 74 ControllerPairingFlow::Stage FakeControllerPairingFlow::GetCurrentStage() { | |
| 75 return current_stage_; | |
| 76 } | |
| 77 | |
| 78 void FakeControllerPairingFlow::StartFlow() { | |
| 79 CHECK(current_stage_ == STAGE_NONE); | |
| 80 ChangeStage(STAGE_DEVICES_DISCOVERY); | |
| 81 } | |
| 82 | |
| 83 ControllerPairingFlow::DeviceIdList | |
| 84 FakeControllerPairingFlow::GetDiscoveredDevices() { | |
| 85 CHECK(current_stage_ == STAGE_DEVICES_DISCOVERY); | |
| 86 return DeviceIdList(discovered_devices_.begin(), discovered_devices_.end()); | |
| 87 } | |
| 88 | |
| 89 void FakeControllerPairingFlow::ChooseDeviceForPairing( | |
| 90 const std::string& device_id) { | |
| 91 CHECK(current_stage_ == STAGE_DEVICES_DISCOVERY); | |
| 92 CHECK(discovered_devices_.count(device_id)); | |
| 93 choosen_device_ = device_id; | |
| 94 ChangeStage(STAGE_ESTABLISHING_CONNECTION); | |
| 95 } | |
| 96 | |
| 97 void FakeControllerPairingFlow::RepeatDiscovery() { | |
| 98 CHECK(current_stage_ == STAGE_DEVICE_NOT_FOUND || | |
| 99 current_stage_ == STAGE_ESTABLISHING_CONNECTION_ERROR || | |
| 100 current_stage_ == STAGE_HOST_ENROLLMENT_ERROR); | |
| 101 ChangeStage(STAGE_DEVICES_DISCOVERY); | |
| 102 } | |
| 103 | |
| 104 std::string FakeControllerPairingFlow::GetConfirmationCode() { | |
| 105 CHECK(current_stage_ == STAGE_WAITING_FOR_CODE_CONFIRMATION); | |
| 106 if (confirmation_code_.empty()) | |
| 107 for (int i = 0; i < 6; ++i) | |
| 108 confirmation_code_.push_back(base::RandInt('0', '9')); | |
|
Dmitry Polukhin
2014/06/18 10:46:51
I would avoid randomness in test. I think you can
| |
| 109 return confirmation_code_; | |
| 110 } | |
| 111 | |
| 112 void FakeControllerPairingFlow::SetConfirmationCodeIsCorrect(bool correct) { | |
| 113 CHECK(current_stage_ == STAGE_WAITING_FOR_CODE_CONFIRMATION); | |
| 114 if (correct) | |
| 115 ChangeStage(STAGE_HOST_UPDATE_IN_PROGRESS); | |
| 116 else | |
| 117 ChangeStage(STAGE_DEVICES_DISCOVERY); | |
| 118 } | |
| 119 | |
| 120 void FakeControllerPairingFlow::OnAuthenticationDone( | |
| 121 const chromeos::UserContext& user_context, | |
| 122 content::BrowserContext* browser_context) { | |
| 123 CHECK(current_stage_ == STAGE_WAITING_FOR_CREDENTIALS); | |
| 124 ChangeStage(STAGE_HOST_ENROLLMENT_IN_PROGRESS); | |
| 125 } | |
| 126 | |
| 127 void FakeControllerPairingFlow::StartSession() { | |
| 128 CHECK(current_stage_ == STAGE_PAIRING_DONE); | |
| 129 ChangeStage(STAGE_FINISHED); | |
| 130 } | |
| 131 | |
| 132 void FakeControllerPairingFlow::ChangeStage(Stage new_stage) { | |
| 133 if (current_stage_ == new_stage) | |
| 134 return; | |
| 135 current_stage_ = new_stage; | |
| 136 FOR_EACH_OBSERVER(Observer, observers_, PairingStageChanged(new_stage)); | |
| 137 } | |
| 138 | |
| 139 void FakeControllerPairingFlow::ChangeStageLater(Stage new_stage) { | |
| 140 base::MessageLoop::current()->PostDelayedTask( | |
| 141 FROM_HERE, | |
| 142 base::Bind(&FakeControllerPairingFlow::ChangeStage, | |
| 143 base::Unretained(this), | |
| 144 new_stage), | |
| 145 async_duration_); | |
| 146 } | |
| 147 | |
| 148 void FakeControllerPairingFlow::ExecuteDiscoveryEvent(size_t event_position) { | |
| 149 if (current_stage_ != STAGE_DEVICES_DISCOVERY) | |
| 150 return; | |
| 151 CHECK(event_position < discovery_scenario_.size()); | |
| 152 const DiscoveryEvent& event = discovery_scenario_[event_position]; | |
| 153 if (event.second == kNotFoundDeviceID) { | |
| 154 ChangeStage(STAGE_DEVICE_NOT_FOUND); | |
| 155 return; | |
| 156 } else if (event.first == DEVICE_FOUND) { | |
| 157 DeviceFound(event.second); | |
| 158 } else { | |
| 159 DeviceLost(event.second); | |
| 160 } | |
| 161 if (++event_position == discovery_scenario_.size()) { | |
| 162 return; | |
| 163 } | |
| 164 base::MessageLoop::current()->PostDelayedTask( | |
| 165 FROM_HERE, | |
| 166 base::Bind(&FakeControllerPairingFlow::ExecuteDiscoveryEvent, | |
| 167 base::Unretained(this), | |
| 168 event_position), | |
| 169 async_duration_); | |
| 170 } | |
| 171 | |
| 172 void FakeControllerPairingFlow::DeviceFound(const std::string& device_id) { | |
| 173 CHECK(current_stage_ == STAGE_DEVICES_DISCOVERY); | |
| 174 discovered_devices_.insert(device_id); | |
| 175 FOR_EACH_OBSERVER(Observer, observers_, DiscoveredDevicesListChanged()); | |
| 176 } | |
| 177 | |
| 178 void FakeControllerPairingFlow::DeviceLost(const std::string& device_id) { | |
| 179 CHECK(current_stage_ == STAGE_DEVICES_DISCOVERY); | |
| 180 discovered_devices_.erase(device_id); | |
| 181 FOR_EACH_OBSERVER(Observer, observers_, DiscoveredDevicesListChanged()); | |
| 182 } | |
| 183 | |
| 184 FakeControllerPairingFlow::DiscoveryScenario | |
| 185 FakeControllerPairingFlow::GetDefaultScenario() const { | |
| 186 DiscoveryScenario scenario; | |
| 187 scenario.push_back(std::make_pair(DEVICE_FOUND, "Device_1")); | |
| 188 scenario.push_back(std::make_pair(DEVICE_FOUND, "Device_5")); | |
| 189 scenario.push_back(std::make_pair(DEVICE_FOUND, "Device_3")); | |
| 190 scenario.push_back(std::make_pair(DEVICE_LOST, "Device_3")); | |
| 191 scenario.push_back(std::make_pair(DEVICE_LOST, "Device_1")); | |
| 192 scenario.push_back(std::make_pair(DEVICE_FOUND, "Device_1")); | |
| 193 return scenario; | |
| 194 } | |
| 195 | |
| 196 void FakeControllerPairingFlow::PairingStageChanged(Stage new_stage) { | |
| 197 Stage next_stage = STAGE_NONE; | |
| 198 switch (new_stage) { | |
| 199 case STAGE_DEVICES_DISCOVERY: { | |
| 200 discovered_devices_.clear(); | |
| 201 base::MessageLoop::current()->PostDelayedTask( | |
| 202 FROM_HERE, | |
| 203 base::Bind(&FakeControllerPairingFlow::ExecuteDiscoveryEvent, | |
| 204 base::Unretained(this), | |
| 205 0), | |
| 206 async_duration_); | |
| 207 break; | |
| 208 } | |
| 209 case STAGE_ESTABLISHING_CONNECTION: { | |
| 210 if (should_fail_on_connecting_) { | |
| 211 next_stage = STAGE_ESTABLISHING_CONNECTION_ERROR; | |
| 212 should_fail_on_connecting_ = false; | |
| 213 } else { | |
| 214 confirmation_code_.clear(); | |
| 215 next_stage = STAGE_WAITING_FOR_CODE_CONFIRMATION; | |
| 216 } | |
| 217 break; | |
| 218 } | |
| 219 case STAGE_HOST_UPDATE_IN_PROGRESS: { | |
| 220 next_stage = STAGE_WAITING_FOR_CREDENTIALS; | |
| 221 break; | |
| 222 } | |
| 223 case STAGE_HOST_ENROLLMENT_IN_PROGRESS: { | |
| 224 if (enrollment_should_fail_) { | |
| 225 enrollment_should_fail_ = false; | |
| 226 next_stage = STAGE_HOST_ENROLLMENT_ERROR; | |
| 227 } else { | |
| 228 next_stage = STAGE_PAIRING_DONE; | |
| 229 } | |
| 230 break; | |
| 231 } | |
| 232 case STAGE_HOST_CONNECTION_LOST: { | |
| 233 next_stage = connection_lost_end_; | |
| 234 connection_lost_end_ = STAGE_NONE; | |
| 235 break; | |
| 236 } | |
| 237 default: | |
| 238 break; | |
| 239 } | |
| 240 if (new_stage == connection_lost_begin_) { | |
| 241 connection_lost_begin_ = STAGE_NONE; | |
| 242 next_stage = STAGE_HOST_CONNECTION_LOST; | |
| 243 } | |
| 244 if (next_stage != STAGE_NONE) | |
| 245 ChangeStageLater(next_stage); | |
| 246 } | |
| 247 | |
| 248 void FakeControllerPairingFlow::DiscoveredDevicesListChanged() { | |
| 249 } | |
| 250 | |
| 251 } // namespace chromeos | |
| OLD | NEW |