| 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_host_pairing_controller.h" | |
| 6 | |
| 7 #include <map> | |
| 8 #include <vector> | |
| 9 | |
| 10 #include "base/bind.h" | |
| 11 #include "base/logging.h" | |
| 12 #include "base/message_loop/message_loop.h" | |
| 13 #include "base/rand_util.h" | |
| 14 #include "base/strings/string_number_conversions.h" | |
| 15 #include "base/strings/string_split.h" | |
| 16 | |
| 17 namespace { | |
| 18 | |
| 19 const int kUpdateStepsNumber = 10; | |
| 20 const int kDefaultAsyncDurationMs = 3000; | |
| 21 const size_t kCodeLength = 6; | |
| 22 | |
| 23 } // namespace | |
| 24 | |
| 25 namespace chromeos { | |
| 26 | |
| 27 FakeHostPairingController::FakeHostPairingController(const std::string& config) | |
| 28 : current_stage_(STAGE_NONE), | |
| 29 enrollment_should_fail_(false), | |
| 30 start_after_update_(false) { | |
| 31 ApplyConfig(config); | |
| 32 AddObserver(this); | |
| 33 } | |
| 34 | |
| 35 FakeHostPairingController::~FakeHostPairingController() { | |
| 36 RemoveObserver(this); | |
| 37 } | |
| 38 | |
| 39 void FakeHostPairingController::ApplyConfig(const std::string& config) { | |
| 40 typedef std::vector<std::string> Tokens; | |
| 41 | |
| 42 base::StringPairs kv_pairs; | |
| 43 CHECK(base::SplitStringIntoKeyValuePairs(config, ':', ',', &kv_pairs)) | |
| 44 << "Wrong config format."; | |
| 45 std::map<std::string, std::string> dict(kv_pairs.begin(), kv_pairs.end()); | |
| 46 | |
| 47 if (dict.count("async_duration")) { | |
| 48 int ms = 0; | |
| 49 CHECK(base::StringToInt(dict["async_duration"], &ms)) | |
| 50 << "Wrong 'async_duration' format."; | |
| 51 async_duration_ = base::TimeDelta::FromMilliseconds(ms); | |
| 52 } else { | |
| 53 async_duration_ = | |
| 54 base::TimeDelta::FromMilliseconds(kDefaultAsyncDurationMs); | |
| 55 } | |
| 56 | |
| 57 start_after_update_ = dict["start_after_update"] == "1"; | |
| 58 | |
| 59 enrollment_should_fail_ = dict["fail_enrollment"] == "1"; | |
| 60 | |
| 61 if (dict.count("code")) { | |
| 62 confirmation_code_ = dict["code"]; | |
| 63 } else { | |
| 64 confirmation_code_.clear(); | |
| 65 for (size_t i = 0; i < kCodeLength; ++i) | |
| 66 confirmation_code_.push_back(base::RandInt('0', '9')); | |
| 67 } | |
| 68 CHECK(confirmation_code_.length() == kCodeLength && | |
| 69 confirmation_code_.find_first_not_of("0123456789") == std::string::npos) | |
| 70 << "Wrong 'code' format."; | |
| 71 | |
| 72 device_name_ = | |
| 73 dict.count("device_name") ? dict["device_name"] : "Chromebox-01"; | |
| 74 | |
| 75 enrollment_domain_ = dict.count("domain") ? dict["domain"] : "example.com"; | |
| 76 } | |
| 77 | |
| 78 void FakeHostPairingController::ChangeStage(Stage new_stage) { | |
| 79 if (current_stage_ == new_stage) | |
| 80 return; | |
| 81 current_stage_ = new_stage; | |
| 82 FOR_EACH_OBSERVER(Observer, observers_, PairingStageChanged(new_stage)); | |
| 83 } | |
| 84 | |
| 85 void FakeHostPairingController::ChangeStageLater(Stage new_stage) { | |
| 86 base::MessageLoop::current()->PostDelayedTask( | |
| 87 FROM_HERE, | |
| 88 base::Bind(&FakeHostPairingController::ChangeStage, | |
| 89 base::Unretained(this), | |
| 90 new_stage), | |
| 91 async_duration_); | |
| 92 } | |
| 93 | |
| 94 void FakeHostPairingController::SetUpdateProgress(int step) { | |
| 95 UpdateProgress progress; | |
| 96 progress.progress = double(step) / kUpdateStepsNumber; | |
| 97 FOR_EACH_OBSERVER(Observer, observers_, UpdateAdvanced(progress)); | |
| 98 base::Closure task; | |
| 99 if (step >= kUpdateStepsNumber) { | |
| 100 task = base::Bind(&FakeHostPairingController::ChangeStage, | |
| 101 base::Unretained(this), | |
| 102 STAGE_WAITING_FOR_CONTROLLER_AFTER_UPDATE); | |
| 103 } else { | |
| 104 task = base::Bind(&FakeHostPairingController::SetUpdateProgress, | |
| 105 base::Unretained(this), | |
| 106 step + 1); | |
| 107 } | |
| 108 base::MessageLoop::current()->PostDelayedTask( | |
| 109 FROM_HERE, task, async_duration_ / kUpdateStepsNumber); | |
| 110 } | |
| 111 | |
| 112 void FakeHostPairingController::AddObserver(Observer* observer) { | |
| 113 observers_.AddObserver(observer); | |
| 114 } | |
| 115 | |
| 116 void FakeHostPairingController::RemoveObserver(Observer* observer) { | |
| 117 observers_.RemoveObserver(observer); | |
| 118 } | |
| 119 | |
| 120 HostPairingController::Stage FakeHostPairingController::GetCurrentStage() { | |
| 121 return current_stage_; | |
| 122 } | |
| 123 | |
| 124 void FakeHostPairingController::StartPairing() { | |
| 125 CHECK(current_stage_ == STAGE_NONE); | |
| 126 if (start_after_update_) { | |
| 127 ChangeStage(STAGE_WAITING_FOR_CONTROLLER_AFTER_UPDATE); | |
| 128 } else { | |
| 129 ChangeStage(STAGE_WAITING_FOR_CONTROLLER); | |
| 130 } | |
| 131 } | |
| 132 | |
| 133 std::string FakeHostPairingController::GetDeviceName() { | |
| 134 return device_name_; | |
| 135 } | |
| 136 | |
| 137 std::string FakeHostPairingController::GetConfirmationCode() { | |
| 138 CHECK(current_stage_ == STAGE_WAITING_FOR_CODE_CONFIRMATION); | |
| 139 return confirmation_code_; | |
| 140 } | |
| 141 | |
| 142 std::string FakeHostPairingController::GetEnrollmentDomain() { | |
| 143 return enrollment_domain_; | |
| 144 } | |
| 145 | |
| 146 void FakeHostPairingController::PairingStageChanged(Stage new_stage) { | |
| 147 switch (new_stage) { | |
| 148 case STAGE_WAITING_FOR_CONTROLLER: { | |
| 149 ChangeStageLater(STAGE_WAITING_FOR_CODE_CONFIRMATION); | |
| 150 break; | |
| 151 } | |
| 152 case STAGE_WAITING_FOR_CODE_CONFIRMATION: { | |
| 153 ChangeStageLater(STAGE_UPDATING); | |
| 154 break; | |
| 155 } | |
| 156 case STAGE_UPDATING: { | |
| 157 SetUpdateProgress(0); | |
| 158 break; | |
| 159 } | |
| 160 case STAGE_WAITING_FOR_CONTROLLER_AFTER_UPDATE: { | |
| 161 ChangeStageLater(STAGE_WAITING_FOR_CREDENTIALS); | |
| 162 break; | |
| 163 } | |
| 164 case STAGE_WAITING_FOR_CREDENTIALS: { | |
| 165 ChangeStageLater(STAGE_ENROLLING); | |
| 166 break; | |
| 167 } | |
| 168 case STAGE_ENROLLING: { | |
| 169 if (enrollment_should_fail_) { | |
| 170 enrollment_should_fail_ = false; | |
| 171 ChangeStageLater(STAGE_ENROLLMENT_ERROR); | |
| 172 } else { | |
| 173 ChangeStageLater(STAGE_PAIRING_DONE); | |
| 174 } | |
| 175 break; | |
| 176 } | |
| 177 case STAGE_ENROLLMENT_ERROR: { | |
| 178 ChangeStageLater(STAGE_WAITING_FOR_CONTROLLER_AFTER_UPDATE); | |
| 179 break; | |
| 180 } | |
| 181 case STAGE_PAIRING_DONE: { | |
| 182 ChangeStageLater(STAGE_FINISHED); | |
| 183 break; | |
| 184 } | |
| 185 default: { break; } | |
| 186 } | |
| 187 } | |
| 188 | |
| 189 void FakeHostPairingController::UpdateAdvanced(const UpdateProgress& progress) { | |
| 190 } | |
| 191 | |
| 192 } // namespace chromeos | |
| OLD | NEW |