Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(6633)

Unified Diff: chromeos/pairing/fake_controller_pairing_flow.cc

Issue 343433003: Implemented fake controller pairing flow. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chromeos/pairing/fake_controller_pairing_flow.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chromeos/pairing/fake_controller_pairing_flow.cc
diff --git a/chromeos/pairing/fake_controller_pairing_flow.cc b/chromeos/pairing/fake_controller_pairing_flow.cc
new file mode 100644
index 0000000000000000000000000000000000000000..7205157f596db8f2f22a602993edbd7732bab646
--- /dev/null
+++ b/chromeos/pairing/fake_controller_pairing_flow.cc
@@ -0,0 +1,251 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chromeos/pairing/fake_controller_pairing_flow.h"
+
+#include "base/bind.h"
+#include "base/logging.h"
+#include "base/message_loop/message_loop.h"
+#include "base/rand_util.h"
+
+namespace chromeos {
+
+const char* FakeControllerPairingFlow::kNotFoundDeviceID = "not_found";
+
+FakeControllerPairingFlow::FakeControllerPairingFlow()
+ : current_stage_(STAGE_NONE),
+ async_duration_(base::TimeDelta::FromSeconds(3)),
+ should_fail_on_connecting_(false),
+ connection_lost_begin_(STAGE_NONE),
+ connection_lost_end_(STAGE_NONE),
+ enrollment_should_fail_(false) {
+ SetDiscoveryScenario(GetDefaultScenario());
+ AddObserver(this);
+}
+
+FakeControllerPairingFlow::~FakeControllerPairingFlow() {
+ RemoveObserver(this);
+}
+
+void FakeControllerPairingFlow::SetShouldFailOnConnecting() {
+ should_fail_on_connecting_ = true;
+}
+
+void FakeControllerPairingFlow::SetShouldLoseConnection(Stage stage_begin,
+ Stage stage_end) {
+ connection_lost_begin_ = stage_begin;
+ connection_lost_end_ = stage_end;
+}
+
+void FakeControllerPairingFlow::SetEnrollmentShouldFail() {
+ enrollment_should_fail_ = true;
+}
+
+void FakeControllerPairingFlow::SetDiscoveryScenario(
+ const DiscoveryScenario& discovery_scenario) {
+ discovery_scenario_ = discovery_scenario;
+ // Check that scenario is valid.
+ std::set<std::string> devices;
+ for (DiscoveryScenario::const_iterator event = discovery_scenario_.begin();
+ event != discovery_scenario_.end();
+ ++event) {
+ if (event->second == kNotFoundDeviceID) {
+ CHECK(devices.empty());
+ CHECK(++event == discovery_scenario_.end());
+ return;
+ } else if (event->first == DEVICE_FOUND) {
+ devices.insert(event->second);
+ } else {
+ CHECK(devices.count(event->second));
+ devices.erase(event->second);
+ }
+ }
+}
+
+void FakeControllerPairingFlow::AddObserver(Observer* observer) {
+ observers_.AddObserver(observer);
+}
+
+void FakeControllerPairingFlow::RemoveObserver(Observer* observer) {
+ observers_.RemoveObserver(observer);
+}
+
+ControllerPairingFlow::Stage FakeControllerPairingFlow::GetCurrentStage() {
+ return current_stage_;
+}
+
+void FakeControllerPairingFlow::StartFlow() {
+ CHECK(current_stage_ == STAGE_NONE);
+ ChangeStage(STAGE_DEVICES_DISCOVERY);
+}
+
+ControllerPairingFlow::DeviceIdList
+FakeControllerPairingFlow::GetDiscoveredDevices() {
+ CHECK(current_stage_ == STAGE_DEVICES_DISCOVERY);
+ return DeviceIdList(discovered_devices_.begin(), discovered_devices_.end());
+}
+
+void FakeControllerPairingFlow::ChooseDeviceForPairing(
+ const std::string& device_id) {
+ CHECK(current_stage_ == STAGE_DEVICES_DISCOVERY);
+ CHECK(discovered_devices_.count(device_id));
+ choosen_device_ = device_id;
+ ChangeStage(STAGE_ESTABLISHING_CONNECTION);
+}
+
+void FakeControllerPairingFlow::RepeatDiscovery() {
+ CHECK(current_stage_ == STAGE_DEVICE_NOT_FOUND ||
+ current_stage_ == STAGE_ESTABLISHING_CONNECTION_ERROR ||
+ current_stage_ == STAGE_HOST_ENROLLMENT_ERROR);
+ ChangeStage(STAGE_DEVICES_DISCOVERY);
+}
+
+std::string FakeControllerPairingFlow::GetConfirmationCode() {
+ CHECK(current_stage_ == STAGE_WAITING_FOR_CODE_CONFIRMATION);
+ if (confirmation_code_.empty())
+ for (int i = 0; i < 6; ++i)
+ 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
+ return confirmation_code_;
+}
+
+void FakeControllerPairingFlow::SetConfirmationCodeIsCorrect(bool correct) {
+ CHECK(current_stage_ == STAGE_WAITING_FOR_CODE_CONFIRMATION);
+ if (correct)
+ ChangeStage(STAGE_HOST_UPDATE_IN_PROGRESS);
+ else
+ ChangeStage(STAGE_DEVICES_DISCOVERY);
+}
+
+void FakeControllerPairingFlow::OnAuthenticationDone(
+ const chromeos::UserContext& user_context,
+ content::BrowserContext* browser_context) {
+ CHECK(current_stage_ == STAGE_WAITING_FOR_CREDENTIALS);
+ ChangeStage(STAGE_HOST_ENROLLMENT_IN_PROGRESS);
+}
+
+void FakeControllerPairingFlow::StartSession() {
+ CHECK(current_stage_ == STAGE_PAIRING_DONE);
+ ChangeStage(STAGE_FINISHED);
+}
+
+void FakeControllerPairingFlow::ChangeStage(Stage new_stage) {
+ if (current_stage_ == new_stage)
+ return;
+ current_stage_ = new_stage;
+ FOR_EACH_OBSERVER(Observer, observers_, PairingStageChanged(new_stage));
+}
+
+void FakeControllerPairingFlow::ChangeStageLater(Stage new_stage) {
+ base::MessageLoop::current()->PostDelayedTask(
+ FROM_HERE,
+ base::Bind(&FakeControllerPairingFlow::ChangeStage,
+ base::Unretained(this),
+ new_stage),
+ async_duration_);
+}
+
+void FakeControllerPairingFlow::ExecuteDiscoveryEvent(size_t event_position) {
+ if (current_stage_ != STAGE_DEVICES_DISCOVERY)
+ return;
+ CHECK(event_position < discovery_scenario_.size());
+ const DiscoveryEvent& event = discovery_scenario_[event_position];
+ if (event.second == kNotFoundDeviceID) {
+ ChangeStage(STAGE_DEVICE_NOT_FOUND);
+ return;
+ } else if (event.first == DEVICE_FOUND) {
+ DeviceFound(event.second);
+ } else {
+ DeviceLost(event.second);
+ }
+ if (++event_position == discovery_scenario_.size()) {
+ return;
+ }
+ base::MessageLoop::current()->PostDelayedTask(
+ FROM_HERE,
+ base::Bind(&FakeControllerPairingFlow::ExecuteDiscoveryEvent,
+ base::Unretained(this),
+ event_position),
+ async_duration_);
+}
+
+void FakeControllerPairingFlow::DeviceFound(const std::string& device_id) {
+ CHECK(current_stage_ == STAGE_DEVICES_DISCOVERY);
+ discovered_devices_.insert(device_id);
+ FOR_EACH_OBSERVER(Observer, observers_, DiscoveredDevicesListChanged());
+}
+
+void FakeControllerPairingFlow::DeviceLost(const std::string& device_id) {
+ CHECK(current_stage_ == STAGE_DEVICES_DISCOVERY);
+ discovered_devices_.erase(device_id);
+ FOR_EACH_OBSERVER(Observer, observers_, DiscoveredDevicesListChanged());
+}
+
+FakeControllerPairingFlow::DiscoveryScenario
+FakeControllerPairingFlow::GetDefaultScenario() const {
+ DiscoveryScenario scenario;
+ scenario.push_back(std::make_pair(DEVICE_FOUND, "Device_1"));
+ scenario.push_back(std::make_pair(DEVICE_FOUND, "Device_5"));
+ scenario.push_back(std::make_pair(DEVICE_FOUND, "Device_3"));
+ scenario.push_back(std::make_pair(DEVICE_LOST, "Device_3"));
+ scenario.push_back(std::make_pair(DEVICE_LOST, "Device_1"));
+ scenario.push_back(std::make_pair(DEVICE_FOUND, "Device_1"));
+ return scenario;
+}
+
+void FakeControllerPairingFlow::PairingStageChanged(Stage new_stage) {
+ Stage next_stage = STAGE_NONE;
+ switch (new_stage) {
+ case STAGE_DEVICES_DISCOVERY: {
+ discovered_devices_.clear();
+ base::MessageLoop::current()->PostDelayedTask(
+ FROM_HERE,
+ base::Bind(&FakeControllerPairingFlow::ExecuteDiscoveryEvent,
+ base::Unretained(this),
+ 0),
+ async_duration_);
+ break;
+ }
+ case STAGE_ESTABLISHING_CONNECTION: {
+ if (should_fail_on_connecting_) {
+ next_stage = STAGE_ESTABLISHING_CONNECTION_ERROR;
+ should_fail_on_connecting_ = false;
+ } else {
+ confirmation_code_.clear();
+ next_stage = STAGE_WAITING_FOR_CODE_CONFIRMATION;
+ }
+ break;
+ }
+ case STAGE_HOST_UPDATE_IN_PROGRESS: {
+ next_stage = STAGE_WAITING_FOR_CREDENTIALS;
+ break;
+ }
+ case STAGE_HOST_ENROLLMENT_IN_PROGRESS: {
+ if (enrollment_should_fail_) {
+ enrollment_should_fail_ = false;
+ next_stage = STAGE_HOST_ENROLLMENT_ERROR;
+ } else {
+ next_stage = STAGE_PAIRING_DONE;
+ }
+ break;
+ }
+ case STAGE_HOST_CONNECTION_LOST: {
+ next_stage = connection_lost_end_;
+ connection_lost_end_ = STAGE_NONE;
+ break;
+ }
+ default:
+ break;
+ }
+ if (new_stage == connection_lost_begin_) {
+ connection_lost_begin_ = STAGE_NONE;
+ next_stage = STAGE_HOST_CONNECTION_LOST;
+ }
+ if (next_stage != STAGE_NONE)
+ ChangeStageLater(next_stage);
+}
+
+void FakeControllerPairingFlow::DiscoveredDevicesListChanged() {
+}
+
+} // namespace chromeos
« no previous file with comments | « chromeos/pairing/fake_controller_pairing_flow.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698