Commit 3bcccb0a authored by Aga Wronska's avatar Aga Wronska Committed by Commit Bot

Remove dev screen for choosing online/offline setup and run final

demo mode setup flow.

* Change DemoSetupController delegate into callback passed to Enroll()
* Pass info about enrollment type separately from Enroll() request
* Store DemoSetupController instance in WizardController instead of
  DemoSetupScreen for easier storage and access to demo setup flow status

Change-Id: I43f2f28dfc2daea519849d222ea5a73561522516
Bug: 862445
Test: Run DemoSetupTest, DemoSetupControllerTest and wizard_controller_browsertest.
Reviewed-on: https://chromium-review.googlesource.com/1155152
Commit-Queue: Aga Wronska <agawronska@chromium.org>
Reviewed-by: default avatarMichael Giuffrida <michaelpg@chromium.org>
Reviewed-by: default avatarAlexander Alekseev <alemate@chromium.org>
Cr-Commit-Position: refs/heads/master@{#580937}
parent 85d4d667
......@@ -21,6 +21,7 @@
#include "base/threading/thread_restrictions.h"
#include "chrome/browser/chromeos/arc/arc_session_manager.h"
#include "chrome/browser/chromeos/arc/policy/arc_policy_util.h"
#include "chrome/browser/chromeos/login/demo_mode/demo_setup_controller.h"
#include "chrome/browser/chromeos/login/ui/login_display_host.h"
#include "chrome/browser/chromeos/login/user_flow.h"
#include "chrome/browser/chromeos/login/users/chrome_user_manager.h"
......@@ -553,14 +554,7 @@ bool IsArcStatsReportingEnabled() {
}
bool IsArcDemoModeSetupFlow() {
chromeos::LoginDisplayHost* const host =
chromeos::LoginDisplayHost::default_host();
if (!host)
return false;
const chromeos::WizardController* const wizard_controller =
host->GetWizardController();
return wizard_controller && wizard_controller->is_in_demo_mode_setup_flow();
return chromeos::DemoSetupController::IsOobeDemoSetupFlowInProgress();
}
void UpdateArcFileSystemCompatibilityPrefIfNeeded(
......
// Copyright (c) 2018 The Chromium Authors. All rights reserved.
// Copyright 2018 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 "chrome/browser/chromeos/login/demo_mode/demo_setup_controller.h"
#include <string>
#include <utility>
#include "base/bind.h"
#include "base/files/file_util.h"
......@@ -26,6 +26,11 @@ constexpr char kOfflineDevicePolicyFileName[] = "device_policy";
constexpr char kOfflineDeviceLocalAccountPolicyFileName[] =
"local_account_policy";
// The policy blob data for offline demo-mode is embedded into the filesystem.
// TODO(mukai, agawronska): fix this when switching to dm-verity image.
constexpr const base::FilePath::CharType kOfflineDemoModeDir[] =
FILE_PATH_LITERAL("/usr/share/chromeos-assets/demo_mode_resources/policy");
bool CheckOfflinePolicyFilesExist(const base::FilePath& policy_dir,
std::string* message) {
base::FilePath device_policy_path =
......@@ -93,22 +98,48 @@ constexpr char DemoSetupController::kDemoModeDomain[];
bool DemoSetupController::IsOobeDemoSetupFlowInProgress() {
const WizardController* const wizard_controller =
WizardController::default_controller();
return wizard_controller && wizard_controller->is_in_demo_mode_setup_flow();
return wizard_controller &&
wizard_controller->demo_setup_controller() != nullptr;
}
DemoSetupController::DemoSetupController(Delegate* delegate)
: delegate_(delegate), weak_ptr_factory_(this) {
DCHECK(delegate_);
}
DemoSetupController::DemoSetupController() : weak_ptr_factory_(this) {}
DemoSetupController::~DemoSetupController() {
if (device_local_account_policy_store_)
device_local_account_policy_store_->RemoveObserver(this);
}
void DemoSetupController::EnrollOnline() {
bool DemoSetupController::IsOfflineEnrollment() const {
return enrollment_type_ && *enrollment_type_ == EnrollmentType::kOffline;
}
void DemoSetupController::Enroll(OnSetupSuccess on_setup_success,
OnSetupError on_setup_error) {
DCHECK(enrollment_type_)
<< "Enrollment type needs to be explicitly set before calling Enroll()";
DCHECK_EQ(mode_, policy::EnrollmentConfig::MODE_NONE);
DCHECK(!enrollment_helper_);
on_setup_success_ = std::move(on_setup_success);
on_setup_error_ = std::move(on_setup_error);
switch (*enrollment_type_) {
case EnrollmentType::kOnline:
EnrollOnline();
return;
case EnrollmentType::kOffline: {
const base::FilePath offline_data_dir =
policy_dir_for_tests_.empty() ? base::FilePath(kOfflineDemoModeDir)
: policy_dir_for_tests_;
EnrollOffline(offline_data_dir);
return;
}
default:
NOTREACHED() << "Unknown demo mode enrollment type";
}
}
void DemoSetupController::EnrollOnline() {
policy::BrowserPolicyConnectorChromeOS* connector =
g_browser_process->platform_part()->browser_policy_connector_chromeos();
connector->GetDeviceCloudPolicyManager()->SetDeviceRequisition(
......@@ -124,8 +155,6 @@ void DemoSetupController::EnrollOnline() {
}
void DemoSetupController::EnrollOffline(const base::FilePath& policy_dir) {
DCHECK_EQ(mode_, policy::EnrollmentConfig::MODE_NONE);
DCHECK(!enrollment_helper_);
DCHECK(policy_dir_.empty());
policy_dir_ = policy_dir;
mode_ = policy::EnrollmentConfig::MODE_OFFLINE_DEMO;
......@@ -145,7 +174,7 @@ void DemoSetupController::OnOfflinePolicyFilesExisted(std::string* message,
DCHECK(!policy_dir_.empty());
if (!ok) {
SetupFailed(*message, false);
SetupFailed(*message, DemoSetupError::kRecoverable);
return;
}
......@@ -172,12 +201,13 @@ void DemoSetupController::OnEnrollmentError(policy::EnrollmentStatus status) {
"validation_status: %d lock_status: %d",
status.status(), status.client_status(), status.store_status(),
status.validation_status(), status.lock_status()),
false);
DemoSetupError::kRecoverable);
}
void DemoSetupController::OnOtherError(
EnterpriseEnrollmentHelper::OtherError error) {
SetupFailed(base::StringPrintf("Other error: %d", error), false);
SetupFailed(base::StringPrintf("Other error: %d", error),
DemoSetupError::kRecoverable);
}
void DemoSetupController::OnDeviceEnrolled(
......@@ -200,7 +230,8 @@ void DemoSetupController::OnDeviceEnrolled(
return;
}
Reset();
delegate_->OnSetupSuccess();
if (!on_setup_success_.is_null())
std::move(on_setup_success_).Run();
}
void DemoSetupController::OnMultipleLicensesAvailable(
......@@ -221,18 +252,25 @@ void DemoSetupController::SetDeviceLocalAccountPolicyStoreForTest(
device_local_account_policy_store_ = store;
}
void DemoSetupController::SetOfflineDataDirForTest(
const base::FilePath& offline_dir) {
policy_dir_for_tests_ = offline_dir;
}
void DemoSetupController::OnDeviceLocalAccountPolicyLoaded(
base::Optional<std::string> blob) {
if (!blob.has_value()) {
// This is very unlikely to happen since the file existence is already
// checked as CheckOfflinePolicyFilesExist.
SetupFailed("Policy file for the device local account not found", true);
SetupFailed("Policy file for the device local account not found",
DemoSetupError::kFatal);
return;
}
enterprise_management::PolicyFetchResponse policy;
if (!policy.ParseFromString(blob.value())) {
SetupFailed("Error parsing local account policy blob.", true);
SetupFailed("Error parsing local account policy blob.",
DemoSetupError::kFatal);
return;
}
......@@ -240,7 +278,8 @@ void DemoSetupController::OnDeviceLocalAccountPolicyLoaded(
enterprise_management::PolicyData policy_data;
if (policy.policy_data().empty() ||
!policy_data.ParseFromString(policy.policy_data())) {
SetupFailed("Error parsing local account policy data.", true);
SetupFailed("Error parsing local account policy data.",
DemoSetupError::kFatal);
return;
}
......@@ -252,17 +291,20 @@ void DemoSetupController::OnDeviceLocalAccountPolicyLoaded(
}
if (!device_local_account_policy_store_) {
SetupFailed("Can't find the store for the local account policy.", true);
SetupFailed("Can't find the store for the local account policy.",
DemoSetupError::kFatal);
return;
}
device_local_account_policy_store_->AddObserver(this);
device_local_account_policy_store_->Store(policy);
}
void DemoSetupController::SetupFailed(const std::string& message, bool fatal) {
void DemoSetupController::SetupFailed(const std::string& message,
DemoSetupError error) {
Reset();
LOG(ERROR) << message << " fatal=" << fatal;
delegate_->OnSetupError(fatal);
LOG(ERROR) << message << " fatal=" << (error == DemoSetupError::kFatal);
if (!on_setup_error_.is_null())
std::move(on_setup_error_).Run(error);
}
void DemoSetupController::Reset() {
......@@ -281,12 +323,14 @@ void DemoSetupController::Reset() {
void DemoSetupController::OnStoreLoaded(policy::CloudPolicyStore* store) {
DCHECK_EQ(store, device_local_account_policy_store_);
Reset();
delegate_->OnSetupSuccess();
if (!on_setup_success_.is_null())
std::move(on_setup_success_).Run();
}
void DemoSetupController::OnStoreError(policy::CloudPolicyStore* store) {
DCHECK_EQ(store, device_local_account_policy_store_);
SetupFailed("Failed to store the local account policy", true);
SetupFailed("Failed to store the local account policy",
DemoSetupError::kFatal);
}
} // namespace chromeos
......@@ -5,6 +5,9 @@
#ifndef CHROME_BROWSER_CHROMEOS_LOGIN_DEMO_MODE_DEMO_SETUP_CONTROLLER_H_
#define CHROME_BROWSER_CHROMEOS_LOGIN_DEMO_MODE_DEMO_SETUP_CONTROLLER_H_
#include <string>
#include "base/callback_forward.h"
#include "base/files/file_path.h"
#include "base/macros.h"
#include "base/memory/weak_ptr.h"
......@@ -20,38 +23,54 @@ class DemoSetupController
: public EnterpriseEnrollmentHelper::EnrollmentStatusConsumer,
public policy::CloudPolicyStore::Observer {
public:
// Domain that demo mode devices are enrolled into.
static constexpr char kDemoModeDomain[] = "cros-demo-mode.com";
// Type of demo mode enrollment.
enum class EnrollmentType {
// Online enrollment into demo mode that is established with DMServer.
kOnline,
// Offline enrollment into demo mode that is established locally.
kOffline,
};
// Delegate that will be notified about result of setup flow when it is
// finished.
class Delegate {
public:
virtual ~Delegate() = default;
// Type of demo mode setup error.
enum class DemoSetupError {
// Recoverable or temporary demo mode setup error. Another attempt to setup
// demo mode may succeed.
kRecoverable,
// Fatal demo mode setup error. Device requires powerwash to recover from
// the resulting state.
kFatal,
};
// Called when the setup flow finished with error. |fatal| is true if the
// error isn't recoverable and needs powerwash.
virtual void OnSetupError(bool fatal) = 0;
// Demo mode setup callbacks.
using OnSetupSuccess = base::OnceClosure;
using OnSetupError = base::OnceCallback<void(DemoSetupError)>;
// Called when the setup flow finished successfully.
virtual void OnSetupSuccess() = 0;
};
// Domain that demo mode devices are enrolled into.
static constexpr char kDemoModeDomain[] = "cros-demo-mode.com";
// Returns whether demo mode setup flow is in progress in OOBE.
// Utility method that returns whether demo mode setup flow is in progress in
// OOBE.
static bool IsOobeDemoSetupFlowInProgress();
explicit DemoSetupController(Delegate* delegate);
DemoSetupController();
~DemoSetupController() override;
// Initiates online enrollment that registers and sets up the device in the
// Demo Mode domain.
void EnrollOnline();
// Sets enrollment type that will be used to setup the device. It has to be
// set before calling Enroll().
void set_enrollment_type(EnrollmentType enrollment_type) {
enrollment_type_ = enrollment_type;
}
// Initiates offline enrollment that locks the device and sets up offline
// policies required by Demo Mode. It requires no network connectivity since
// and all setup will be done locally. The policy files will be loaded
// from the |base_path|.
void EnrollOffline(const base::FilePath& base_path);
// Whether offline enrollment is used for setup.
bool IsOfflineEnrollment() const;
// Initiates enrollment that sets up the device in the demo mode domain. The
// |enrollment_type_| determines whether online or offline setup will be
// performed and it should be set with set_enrollment_type() before calling
// Enroll(). |on_setup_success| will be called when enrollment finishes
// successfully. |on_setup_error| will be called when enrollment finishes with
// an error.
void Enroll(OnSetupSuccess on_setup_success, OnSetupError on_setup_error);
// EnterpriseEnrollmentHelper::EnrollmentStatusConsumer:
void OnDeviceEnrolled(const std::string& additional_token) override;
......@@ -64,8 +83,19 @@ class DemoSetupController
const EnrollmentLicenseMap& licenses) override;
void SetDeviceLocalAccountPolicyStoreForTest(policy::CloudPolicyStore* store);
void SetOfflineDataDirForTest(const base::FilePath& offline_dir);
private:
// Initiates online enrollment that registers and sets up the device in the
// demo mode domain.
void EnrollOnline();
// Initiates offline enrollment that locks the device and sets up offline
// policies required by demo mode. It requires no network connectivity since
// all setup will be done locally. The policy files will be loaded from the
// |policy_dir|.
void EnrollOffline(const base::FilePath& policy_dir);
// Called when the checks of policy files for the offline demo mode is done.
void OnOfflinePolicyFilesExisted(std::string* message, bool ok);
......@@ -74,7 +104,7 @@ class DemoSetupController
void OnDeviceLocalAccountPolicyLoaded(base::Optional<std::string> blob);
// Finish the flow with an error message.
void SetupFailed(const std::string& message, bool fatal);
void SetupFailed(const std::string& message, DemoSetupError error);
// Clears the internal state.
void Reset();
......@@ -83,7 +113,15 @@ class DemoSetupController
void OnStoreLoaded(policy::CloudPolicyStore* store) override;
void OnStoreError(policy::CloudPolicyStore* store) override;
Delegate* delegate_ = nullptr;
// Enrollment type that will be performed when Enroll() is called. Should be
// set explicitly.
base::Optional<EnrollmentType> enrollment_type_;
// Callback to call when enrollment finishes with an error.
OnSetupError on_setup_error_;
// Callback to call when enrollment finishes successfully.
OnSetupSuccess on_setup_success_;
// The mode of the current enrollment flow.
policy::EnrollmentConfig::Mode mode_ = policy::EnrollmentConfig::MODE_NONE;
......@@ -93,6 +131,9 @@ class DemoSetupController
// on the online enrollment.
base::FilePath policy_dir_;
// The directory containing policy blob files used for testing.
base::FilePath policy_dir_for_tests_;
// The CloudPolicyStore for the device local account for the offline policy.
policy::CloudPolicyStore* device_local_account_policy_store_ = nullptr;
......
......@@ -4,8 +4,12 @@
#include "chrome/browser/chromeos/login/demo_mode/demo_setup_controller.h"
#include "base/files/file_util.h"
#include <memory>
#include "base/bind.h"
#include "base/files/file_path.h"
#include "base/files/scoped_temp_dir.h"
#include "base/macros.h"
#include "base/optional.h"
#include "base/run_loop.h"
#include "base/test/scoped_task_environment.h"
......@@ -20,26 +24,27 @@
using chromeos::test::DemoModeSetupResult;
using chromeos::test::MockDemoModeOfflineEnrollmentHelperCreator;
using chromeos::test::MockDemoModeOnlineEnrollmentHelperCreator;
using chromeos::test::SetupDummyOfflinePolicyDir;
using testing::_;
namespace chromeos {
namespace {
class MockDemoSetupControllerDelegate : public DemoSetupController::Delegate {
class DemoSetupControllerTestHelper {
public:
MockDemoSetupControllerDelegate()
DemoSetupControllerTestHelper()
: run_loop_(std::make_unique<base::RunLoop>()) {}
~MockDemoSetupControllerDelegate() override = default;
virtual ~DemoSetupControllerTestHelper() = default;
void OnSetupError(bool fatal) override {
void OnSetupError(DemoSetupController::DemoSetupError error) {
EXPECT_FALSE(succeeded_.has_value());
succeeded_ = false;
fatal_ = fatal;
error_ = error;
run_loop_->Quit();
}
void OnSetupSuccess() override {
void OnSetupSuccess() {
EXPECT_FALSE(succeeded_.has_value());
succeeded_ = true;
run_loop_->Quit();
......@@ -54,7 +59,9 @@ class MockDemoSetupControllerDelegate : public DemoSetupController::Delegate {
}
// Returns true if it receives a fatal error.
bool IsErrorFatal() const { return fatal_; }
bool IsErrorFatal() const {
return error_ == DemoSetupController::DemoSetupError::kFatal;
}
void Reset() {
succeeded_.reset();
......@@ -63,45 +70,13 @@ class MockDemoSetupControllerDelegate : public DemoSetupController::Delegate {
private:
base::Optional<bool> succeeded_;
bool fatal_ = false;
DemoSetupController::DemoSetupError error_ =
DemoSetupController::DemoSetupError::kRecoverable;
std::unique_ptr<base::RunLoop> run_loop_;
DISALLOW_COPY_AND_ASSIGN(MockDemoSetupControllerDelegate);
DISALLOW_COPY_AND_ASSIGN(DemoSetupControllerTestHelper);
};
bool SetupDummyOfflineDir(const std::string& account_id,
base::ScopedTempDir* temp_dir) {
if (!temp_dir->CreateUniqueTempDir()) {
LOG(ERROR) << "Failed to create unique tempdir";
return false;
}
if (base::WriteFile(temp_dir->GetPath().AppendASCII("device_policy"), "",
0) != 0) {
LOG(ERROR) << "Failed to create device_policy file";
return false;
}
// We use MockCloudPolicyStore for the device local account policy in the
// tests, thus actual policy content can be empty. account_id is specified
// since it is used by DemoSetupController to look up the store.
std::string policy_blob;
if (!account_id.empty()) {
enterprise_management::PolicyData policy_data;
policy_data.set_username(account_id);
enterprise_management::PolicyFetchResponse policy;
policy.set_policy_data(policy_data.SerializeAsString());
policy_blob = policy.SerializeAsString();
}
if (base::WriteFile(temp_dir->GetPath().AppendASCII("local_account_policy"),
policy_blob.data(), policy_blob.size()) !=
static_cast<int>(policy_blob.size())) {
LOG(ERROR) << "Failed to create local_account_policy file";
return false;
}
return true;
}
} // namespace
class DemoSetupControllerTest : public testing::Test {
......@@ -113,8 +88,8 @@ class DemoSetupControllerTest : public testing::Test {
SystemSaltGetter::Initialize();
DBusThreadManager::Initialize();
DeviceSettingsService::Initialize();
delegate_ = std::make_unique<MockDemoSetupControllerDelegate>();
tested_controller_ = std::make_unique<DemoSetupController>(delegate_.get());
helper_ = std::make_unique<DemoSetupControllerTestHelper>();
tested_controller_ = std::make_unique<DemoSetupController>();
}
void TearDown() override {
......@@ -123,7 +98,7 @@ class DemoSetupControllerTest : public testing::Test {
DeviceSettingsService::Shutdown();
}
std::unique_ptr<MockDemoSetupControllerDelegate> delegate_;
std::unique_ptr<DemoSetupControllerTestHelper> helper_;
std::unique_ptr<DemoSetupController> tested_controller_;
private:
......@@ -134,7 +109,7 @@ class DemoSetupControllerTest : public testing::Test {
TEST_F(DemoSetupControllerTest, OfflineSuccess) {
base::ScopedTempDir temp_dir;
ASSERT_TRUE(SetupDummyOfflineDir("test", &temp_dir));
ASSERT_TRUE(SetupDummyOfflinePolicyDir("test", &temp_dir));
EnterpriseEnrollmentHelper::SetupEnrollmentHelperMock(
&MockDemoModeOfflineEnrollmentHelperCreator<
......@@ -145,8 +120,16 @@ TEST_F(DemoSetupControllerTest, OfflineSuccess) {
&mock_store, &policy::MockCloudPolicyStore::NotifyStoreLoaded));
tested_controller_->SetDeviceLocalAccountPolicyStoreForTest(&mock_store);
tested_controller_->EnrollOffline(temp_dir.GetPath());
EXPECT_TRUE(delegate_->WaitResult(true));
tested_controller_->set_enrollment_type(
DemoSetupController::EnrollmentType::kOffline);
tested_controller_->SetOfflineDataDirForTest(temp_dir.GetPath());
tested_controller_->Enroll(
base::BindOnce(&DemoSetupControllerTestHelper::OnSetupSuccess,
base::Unretained(helper_.get())),
base::BindOnce(&DemoSetupControllerTestHelper::OnSetupError,
base::Unretained(helper_.get())));
EXPECT_TRUE(helper_->WaitResult(true));
}
TEST_F(DemoSetupControllerTest, OfflineDeviceLocalAccountPolicyLoadFailure) {
......@@ -158,15 +141,23 @@ TEST_F(DemoSetupControllerTest, OfflineDeviceLocalAccountPolicyLoadFailure) {
EXPECT_CALL(mock_store, Store(_)).Times(0);
tested_controller_->SetDeviceLocalAccountPolicyStoreForTest(&mock_store);
tested_controller_->EnrollOffline(
tested_controller_->set_enrollment_type(
DemoSetupController::EnrollmentType::kOffline);
tested_controller_->SetOfflineDataDirForTest(
base::FilePath(FILE_PATH_LITERAL("/no/such/path")));
EXPECT_TRUE(delegate_->WaitResult(false));
EXPECT_FALSE(delegate_->IsErrorFatal());
tested_controller_->Enroll(
base::BindOnce(&DemoSetupControllerTestHelper::OnSetupSuccess,
base::Unretained(helper_.get())),
base::BindOnce(&DemoSetupControllerTestHelper::OnSetupError,
base::Unretained(helper_.get())));
EXPECT_TRUE(helper_->WaitResult(false));
EXPECT_FALSE(helper_->IsErrorFatal());
}
TEST_F(DemoSetupControllerTest, OfflineDeviceLocalAccountPolicyStoreFailed) {
base::ScopedTempDir temp_dir;
ASSERT_TRUE(SetupDummyOfflineDir("test", &temp_dir));
ASSERT_TRUE(SetupDummyOfflinePolicyDir("test", &temp_dir));
EnterpriseEnrollmentHelper::SetupEnrollmentHelperMock(
&MockDemoModeOfflineEnrollmentHelperCreator<
......@@ -177,27 +168,43 @@ TEST_F(DemoSetupControllerTest, OfflineDeviceLocalAccountPolicyStoreFailed) {
&mock_store, &policy::MockCloudPolicyStore::NotifyStoreError));
tested_controller_->SetDeviceLocalAccountPolicyStoreForTest(&mock_store);
tested_controller_->EnrollOffline(temp_dir.GetPath());
EXPECT_TRUE(delegate_->WaitResult(false));
EXPECT_TRUE(delegate_->IsErrorFatal());
tested_controller_->set_enrollment_type(
DemoSetupController::EnrollmentType::kOffline);
tested_controller_->SetOfflineDataDirForTest(temp_dir.GetPath());
tested_controller_->Enroll(
base::BindOnce(&DemoSetupControllerTestHelper::OnSetupSuccess,
base::Unretained(helper_.get())),
base::BindOnce(&DemoSetupControllerTestHelper::OnSetupError,
base::Unretained(helper_.get())));
EXPECT_TRUE(helper_->WaitResult(false));
EXPECT_TRUE(helper_->IsErrorFatal());
}
TEST_F(DemoSetupControllerTest, OfflineInvalidDeviceLocalAccountPolicyBlob) {
base::ScopedTempDir temp_dir;
ASSERT_TRUE(SetupDummyOfflineDir("", &temp_dir));
ASSERT_TRUE(SetupDummyOfflinePolicyDir("", &temp_dir));
EnterpriseEnrollmentHelper::SetupEnrollmentHelperMock(
&MockDemoModeOfflineEnrollmentHelperCreator<
DemoModeSetupResult::SUCCESS>);
tested_controller_->EnrollOffline(temp_dir.GetPath());
EXPECT_TRUE(delegate_->WaitResult(false));
EXPECT_TRUE(delegate_->IsErrorFatal());
tested_controller_->set_enrollment_type(
DemoSetupController::EnrollmentType::kOffline);
tested_controller_->SetOfflineDataDirForTest(temp_dir.GetPath());
tested_controller_->Enroll(
base::BindOnce(&DemoSetupControllerTestHelper::OnSetupSuccess,
base::Unretained(helper_.get())),
base::BindOnce(&DemoSetupControllerTestHelper::OnSetupError,
base::Unretained(helper_.get())));
EXPECT_TRUE(helper_->WaitResult(false));
EXPECT_TRUE(helper_->IsErrorFatal());
}
TEST_F(DemoSetupControllerTest, OfflineError) {
base::ScopedTempDir temp_dir;
ASSERT_TRUE(SetupDummyOfflineDir("test", &temp_dir));
ASSERT_TRUE(SetupDummyOfflinePolicyDir("test", &temp_dir));
EnterpriseEnrollmentHelper::SetupEnrollmentHelperMock(
&MockDemoModeOfflineEnrollmentHelperCreator<DemoModeSetupResult::ERROR>);
......@@ -206,43 +213,79 @@ TEST_F(DemoSetupControllerTest, OfflineError) {
EXPECT_CALL(mock_store, Store(_)).Times(0);
tested_controller_->SetDeviceLocalAccountPolicyStoreForTest(&mock_store);
tested_controller_->EnrollOffline(temp_dir.GetPath());
EXPECT_TRUE(delegate_->WaitResult(false));
EXPECT_FALSE(delegate_->IsErrorFatal());
tested_controller_->set_enrollment_type(
DemoSetupController::EnrollmentType::kOffline);
tested_controller_->SetOfflineDataDirForTest(temp_dir.GetPath());
tested_controller_->Enroll(
base::BindOnce(&DemoSetupControllerTestHelper::OnSetupSuccess,
base::Unretained(helper_.get())),
base::BindOnce(&DemoSetupControllerTestHelper::OnSetupError,
base::Unretained(helper_.get())));
EXPECT_TRUE(helper_->WaitResult(false));
EXPECT_FALSE(helper_->IsErrorFatal());
}
TEST_F(DemoSetupControllerTest, OnlineSuccess) {
EnterpriseEnrollmentHelper::SetupEnrollmentHelperMock(
&MockDemoModeOnlineEnrollmentHelperCreator<DemoModeSetupResult::SUCCESS>);
tested_controller_->EnrollOnline();
EXPECT_TRUE(delegate_->WaitResult(true));
tested_controller_->set_enrollment_type(
DemoSetupController::EnrollmentType::kOnline);
tested_controller_->Enroll(
base::BindOnce(&DemoSetupControllerTestHelper::OnSetupSuccess,
base::Unretained(helper_.get())),
base::BindOnce(&DemoSetupControllerTestHelper::OnSetupError,
base::Unretained(helper_.get())));
EXPECT_TRUE(helper_->WaitResult(true));
}
TEST_F(DemoSetupControllerTest, OnlineError) {
EnterpriseEnrollmentHelper::SetupEnrollmentHelperMock(
&MockDemoModeOnlineEnrollmentHelperCreator<DemoModeSetupResult::ERROR>);
tested_controller_->EnrollOnline();
EXPECT_TRUE(delegate_->WaitResult(false));
EXPECT_FALSE(delegate_->IsErrorFatal());
tested_controller_->set_enrollment_type(
DemoSetupController::EnrollmentType::kOnline);
tested_controller_->Enroll(
base::BindOnce(&DemoSetupControllerTestHelper::OnSetupSuccess,
base::Unretained(helper_.get())),
base::BindOnce(&DemoSetupControllerTestHelper::OnSetupError,
base::Unretained(helper_.get())));
EXPECT_TRUE(helper_->WaitResult(false));
EXPECT_FALSE(helper_->IsErrorFatal());
}
TEST_F(DemoSetupControllerTest, EnrollTwice) {
EnterpriseEnrollmentHelper::SetupEnrollmentHelperMock(
&MockDemoModeOnlineEnrollmentHelperCreator<DemoModeSetupResult::ERROR>);
tested_controller_->EnrollOnline();
EXPECT_TRUE(delegate_->WaitResult(false));
EXPECT_FALSE(delegate_->IsErrorFatal());
tested_controller_->set_enrollment_type(
DemoSetupController::EnrollmentType::kOnline);
tested_controller_->Enroll(
base::BindOnce(&DemoSetupControllerTestHelper::OnSetupSuccess,
base::Unretained(helper_.get())),
base::BindOnce(&DemoSetupControllerTestHelper::OnSetupError,
base::Unretained(helper_.get())));
EXPECT_TRUE(helper_->WaitResult(false));
EXPECT_FALSE(helper_->IsErrorFatal());
delegate_->Reset();
helper_->Reset();
EnterpriseEnrollmentHelper::SetupEnrollmentHelperMock(
&MockDemoModeOnlineEnrollmentHelperCreator<DemoModeSetupResult::SUCCESS>);
tested_controller_->EnrollOnline();
EXPECT_TRUE(delegate_->WaitResult(true));
tested_controller_->set_enrollment_type(
DemoSetupController::EnrollmentType::kOnline);
tested_controller_->Enroll(
base::BindOnce(&DemoSetupControllerTestHelper::OnSetupSuccess,
base::Unretained(helper_.get())),
base::BindOnce(&DemoSetupControllerTestHelper::OnSetupError,
base::Unretained(helper_.get())));
EXPECT_TRUE(helper_->WaitResult(true));
}
} // namespace chromeos
......@@ -7,10 +7,14 @@
#include <string>
#include "base/files/file_path.h"
#include "base/files/file_util.h"
#include "base/files/scoped_temp_dir.h"
#include "chrome/browser/chromeos/login/enrollment/enterprise_enrollment_helper.h"
#include "chrome/browser/chromeos/login/enrollment/enterprise_enrollment_helper_mock.h"
#include "chrome/browser/chromeos/policy/enrollment_config.h"
#include "chrome/browser/chromeos/policy/enrollment_status_chromeos.h"
#include "components/policy/proto/device_management_backend.pb.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
......@@ -72,6 +76,40 @@ EnterpriseEnrollmentHelper* MockDemoModeOfflineEnrollmentHelperCreator(
return mock;
}
// Creates fake offline policy directory to be used in tests.
bool SetupDummyOfflinePolicyDir(const std::string& account_id,
base::ScopedTempDir* temp_dir) {
if (!temp_dir->CreateUniqueTempDir()) {
LOG(ERROR) << "Failed to create unique tempdir";
return false;
}
if (base::WriteFile(temp_dir->GetPath().AppendASCII("device_policy"), "",
0) != 0) {
LOG(ERROR) << "Failed to create device_policy file";
return false;
}
// We use MockCloudPolicyStore for the device local account policy in the
// tests, thus actual policy content can be empty. account_id is specified
// since it is used by DemoSetupController to look up the store.
std::string policy_blob;
if (!account_id.empty()) {
enterprise_management::PolicyData policy_data;
policy_data.set_username(account_id);
enterprise_management::PolicyFetchResponse policy;
policy.set_policy_data(policy_data.SerializeAsString());
policy_blob = policy.SerializeAsString();
}
if (base::WriteFile(temp_dir->GetPath().AppendASCII("local_account_policy"),
policy_blob.data(), policy_blob.size()) !=
static_cast<int>(policy_blob.size())) {
LOG(ERROR) << "Failed to create local_account_policy file";
return false;
}
return true;
}
} // namespace test
} // namespace chromeos
......
......@@ -5,10 +5,12 @@
#include <string>
#include "base/command_line.h"
#include "base/files/scoped_temp_dir.h"
#include "base/run_loop.h"
#include "base/strings/strcat.h"
#include "base/timer/timer.h"
#include "base/values.h"
#include "chrome/browser/chromeos/login/demo_mode/demo_setup_controller.h"
#include "chrome/browser/chromeos/login/demo_mode/demo_setup_test_utils.h"
#include "chrome/browser/chromeos/login/login_manager_test.h"
#include "chrome/browser/chromeos/login/mock_network_state_helper.h"
......@@ -16,6 +18,7 @@
#include "chrome/browser/chromeos/login/screens/demo_setup_screen.h"
#include "chrome/browser/chromeos/login/screens/network_screen.h"
#include "chrome/browser/chromeos/login/screens/screen_exit_code.h"
#include "chrome/browser/chromeos/login/startup_utils.h"
#include "chrome/browser/chromeos/login/test/js_checker.h"
#include "chrome/browser/chromeos/login/test/oobe_screen_waiter.h"
#include "chrome/browser/chromeos/login/ui/login_display_host.h"
......@@ -27,6 +30,7 @@
#include "chromeos/network/network_handler.h"
#include "chromeos/network/network_state.h"
#include "chromeos/network/network_state_handler.h"
#include "components/policy/core/common/cloud/mock_cloud_policy_store.h"
#include "content/public/test/browser_test_utils.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "third_party/cros_system_api/dbus/service_constants.h"
......@@ -35,6 +39,7 @@
using chromeos::test::DemoModeSetupResult;
using chromeos::test::MockDemoModeOfflineEnrollmentHelperCreator;
using chromeos::test::MockDemoModeOnlineEnrollmentHelperCreator;
using chromeos::test::SetupDummyOfflinePolicyDir;
namespace chromeos {
......@@ -48,7 +53,7 @@ constexpr char kDefaultNetworkServicePath[] = "/service/eth1";
constexpr char kDefaultNetworkName[] = "eth1";
constexpr base::TimeDelta kJsConditionCheckFrequency =
base::TimeDelta::FromMilliseconds(200);
base::TimeDelta::FromMilliseconds(10);
// How js query is executed.
enum class JSExecution { kSync, kAsync };
......@@ -57,7 +62,7 @@ enum class JSExecution { kSync, kAsync };
enum class OobeButton { kBack, kNext, kText };
// Dialogs that are a part of Demo Mode setup screens.
enum class DemoSetupDialog { kNetwork, kEula, kSettings, kProgress, kError };
enum class DemoSetupDialog { kNetwork, kEula, kProgress, kError };
// Returns js id of the given |button| type.
std::string ButtonToStringId(OobeButton button) {
......@@ -80,8 +85,6 @@ std::string DialogToStringId(DemoSetupDialog dialog) {
return "networkDialog";
case DemoSetupDialog::kEula:
return "eulaDialog";
case DemoSetupDialog::kSettings:
return "demoSetupSettingsDialog";
case DemoSetupDialog::kProgress:
return "demoSetupProgressDialog";
case DemoSetupDialog::kError:
......@@ -316,21 +319,31 @@ class DemoSetupTest : public LoginManagerTest {
JSExecuteAsync(query);
}
void SkipToDialog(DemoSetupDialog dialog) {
InvokeDemoMode();
ClickOkOnConfirmationDialog();
void SkipToErrorDialog() {
// Simulate online setup error.
EnterpriseEnrollmentHelper::SetupEnrollmentHelperMock(
&MockDemoModeOnlineEnrollmentHelperCreator<DemoModeSetupResult::ERROR>);
auto* const wizard_controller = WizardController::default_controller();
wizard_controller->SimulateDemoModeSetupForTesting();
// Enrollment type is set in the part of the flow that is skipped, That is
// why we need to set it here.
wizard_controller->demo_setup_controller()->set_enrollment_type(
DemoSetupController::EnrollmentType::kOnline);
wizard_controller->AdvanceToScreen(OobeScreen::SCREEN_OOBE_DEMO_SETUP);
OobeScreenWaiter(OobeScreen::SCREEN_OOBE_DEMO_SETUP).Wait();
EXPECT_TRUE(IsScreenShown(OobeScreen::SCREEN_OOBE_DEMO_SETUP));
// TODO(agawronska): Progress dialog transition is async - extra work is
// needed to be able to check it reliably.
WaitForScreenDialog(OobeScreen::SCREEN_OOBE_DEMO_SETUP,
DemoSetupDialog::kError);
}
const std::string query = base::StrCat(
{ScreenToContentQuery(OobeScreen::SCREEN_OOBE_DEMO_SETUP),
".showScreenForTesting('", DialogToStringId(dialog), "')"});
EXPECT_TRUE(JSExecute(query));
EXPECT_TRUE(IsDialogShown(OobeScreen::SCREEN_OOBE_DEMO_SETUP, dialog));
void WaitForScreenDialog(OobeScreen screen, DemoSetupDialog dialog) {
const std::string query =
base::StrCat({"!", ScreenToContentQuery(screen), ".$.",
DialogToStringId(dialog), ".hidden"});
JsConditionWaiter(js_checker(), query).Wait();
}
void SkipToScreen(OobeScreen screen) {
......@@ -348,6 +361,22 @@ class DemoSetupTest : public LoginManagerTest {
OobeScreen::SCREEN_OOBE_DEMO_SETUP));
}
void SimulateOfflineEnvironment() {
DemoSetupController* controller =
WizardController::default_controller()->demo_setup_controller();
// Simulate offline data directory.
ASSERT_TRUE(SetupDummyOfflinePolicyDir("test", &fake_policy_dir_));
controller->SetOfflineDataDirForTest(fake_policy_dir_.GetPath());
// Simulate policy store.
EXPECT_CALL(mock_policy_store_, Store(testing::_))
.WillRepeatedly(testing::InvokeWithoutArgs(
&mock_policy_store_,
&policy::MockCloudPolicyStore::NotifyStoreLoaded));
controller->SetDeviceLocalAccountPolicyStoreForTest(&mock_policy_store_);
}
// Simulates device being connected to the network.
void SimulateNetworkConnected() {
ShillServiceClient::TestInterface* service =
......@@ -400,6 +429,10 @@ class DemoSetupTest : public LoginManagerTest {
content::ExecuteScriptAsync(web_contents(), script);
}
// TODO(agawronska): Maybe create a separate test fixture for offline setup.
base::ScopedTempDir fake_policy_dir_;
policy::MockCloudPolicyStore mock_policy_store_;
DISALLOW_COPY_AND_ASSIGN(DemoSetupTest);
};
......@@ -469,16 +502,8 @@ IN_PROC_BROWSER_TEST_F(DemoSetupTest, OnlineSetupFlowSuccess) {
OobeScreenWaiter(OobeScreen::SCREEN_OOBE_UPDATE).Wait();
OobeScreenWaiter(OobeScreen::SCREEN_OOBE_DEMO_SETUP).Wait();
EXPECT_TRUE(IsScreenShown(OobeScreen::SCREEN_OOBE_DEMO_SETUP));
EXPECT_TRUE(IsDialogShown(OobeScreen::SCREEN_OOBE_DEMO_SETUP,
DemoSetupDialog::kSettings));
ClickScreenDialogButton(OobeScreen::SCREEN_OOBE_DEMO_SETUP,
DemoSetupDialog::kSettings, OobeButton::kNext,
JSExecution::kAsync);
EXPECT_TRUE(IsDialogShown(OobeScreen::SCREEN_OOBE_DEMO_SETUP,
DemoSetupDialog::kProgress));
// TODO(agawronska): Progress dialog transition is async - extra work is
// needed to be able to check it reliably.
OobeScreenWaiter(OobeScreen::SCREEN_GAIA_SIGNIN).Wait();
}
......@@ -525,32 +550,57 @@ IN_PROC_BROWSER_TEST_F(DemoSetupTest, OnlineSetupFlowError) {
OobeScreenWaiter(OobeScreen::SCREEN_OOBE_UPDATE).Wait();
OobeScreenWaiter(OobeScreen::SCREEN_OOBE_DEMO_SETUP).Wait();
EXPECT_TRUE(IsScreenShown(OobeScreen::SCREEN_OOBE_DEMO_SETUP));
EXPECT_TRUE(IsDialogShown(OobeScreen::SCREEN_OOBE_DEMO_SETUP,
DemoSetupDialog::kSettings));
// TODO(agawronska): Progress dialog transition is async - extra work is
// needed to be able to check it reliably.
WaitForScreenDialog(OobeScreen::SCREEN_OOBE_DEMO_SETUP,
DemoSetupDialog::kError);
}
ClickScreenDialogButton(OobeScreen::SCREEN_OOBE_DEMO_SETUP,
DemoSetupDialog::kSettings, OobeButton::kNext,
JSExecution::kAsync);
EXPECT_TRUE(IsDialogShown(OobeScreen::SCREEN_OOBE_DEMO_SETUP,
DemoSetupDialog::kProgress));
IN_PROC_BROWSER_TEST_F(DemoSetupTest, OfflineSetupFlowSuccess) {
// Simulate offline setup success.
EnterpriseEnrollmentHelper::SetupEnrollmentHelperMock(
&MockDemoModeOfflineEnrollmentHelperCreator<
DemoModeSetupResult::SUCCESS>);
SimulateNetworkDisconnected();
// Wait for progress dialog to be hidden.
const std::string progress_dialog_hidden_query = base::StrCat(
{"!!", ScreenToContentQuery(OobeScreen::SCREEN_OOBE_DEMO_SETUP), ".$.",
DialogToStringId(DemoSetupDialog::kProgress), ".hidden"});
JsConditionWaiter(js_checker(), progress_dialog_hidden_query).Wait();
InvokeDemoMode();
ClickOkOnConfirmationDialog();
EXPECT_TRUE(IsDialogShown(OobeScreen::SCREEN_OOBE_DEMO_SETUP,
DemoSetupDialog::kError));
// It needs to be done after demo setup controller was created (demo setup
// flow was started).
SimulateOfflineEnvironment();
ClickScreenDialogButton(OobeScreen::SCREEN_OOBE_DEMO_SETUP,
DemoSetupDialog::kError, OobeButton::kBack,
JSExecution::kAsync);
OobeScreenWaiter(OobeScreen::SCREEN_OOBE_WELCOME).Wait();
OobeScreenWaiter(OobeScreen::SCREEN_OOBE_DEMO_PREFERENCES).Wait();
EXPECT_TRUE(IsScreenShown(OobeScreen::SCREEN_OOBE_DEMO_PREFERENCES));
ClickOobeButton(OobeScreen::SCREEN_OOBE_DEMO_PREFERENCES, OobeButton::kText,
JSExecution::kAsync);
OobeScreenWaiter(OobeScreen::SCREEN_OOBE_NETWORK).Wait();
EXPECT_TRUE(IsScreenShown(OobeScreen::SCREEN_OOBE_NETWORK));
EXPECT_FALSE(IsScreenDialogElementEnabled(
OobeScreen::SCREEN_OOBE_NETWORK, DemoSetupDialog::kNetwork,
ButtonToStringId(OobeButton::kNext)));
const std::string offline_setup_item_name =
l10n_util::GetStringUTF8(IDS_NETWORK_OFFLINE_DEMO_SETUP_LIST_ITEM_NAME);
ClickNetworkListElement(offline_setup_item_name);
OobeScreenWaiter(OobeScreen::SCREEN_OOBE_EULA).Wait();
EXPECT_TRUE(IsScreenShown(OobeScreen::SCREEN_OOBE_EULA));
ClickScreenDialogButton(OobeScreen::SCREEN_OOBE_EULA, DemoSetupDialog::kEula,
OobeButton::kText, JSExecution::kSync);
OobeScreenWaiter(OobeScreen::SCREEN_OOBE_DEMO_SETUP).Wait();
// TODO(agawronska): Progress dialog transition is async - extra work is
// needed to be able to check it reliably.
OobeScreenWaiter(OobeScreen::SCREEN_GAIA_SIGNIN).Wait();
}
IN_PROC_BROWSER_TEST_F(DemoSetupTest, OfflineSetupFlowError) {
// Simulate offline setup failure.
EnterpriseEnrollmentHelper::SetupEnrollmentHelperMock(
&MockDemoModeOfflineEnrollmentHelperCreator<DemoModeSetupResult::ERROR>);
SimulateNetworkDisconnected();
......@@ -558,6 +608,10 @@ IN_PROC_BROWSER_TEST_F(DemoSetupTest, OfflineSetupFlowError) {
InvokeDemoMode();
ClickOkOnConfirmationDialog();
// It needs to be done after demo setup controller was created (demo setup
// flow was started).
SimulateOfflineEnvironment();
OobeScreenWaiter(OobeScreen::SCREEN_OOBE_DEMO_PREFERENCES).Wait();
EXPECT_TRUE(IsScreenShown(OobeScreen::SCREEN_OOBE_DEMO_PREFERENCES));
......@@ -578,31 +632,13 @@ IN_PROC_BROWSER_TEST_F(DemoSetupTest, OfflineSetupFlowError) {
EXPECT_TRUE(IsScreenShown(OobeScreen::SCREEN_OOBE_EULA));
ClickScreenDialogButton(OobeScreen::SCREEN_OOBE_EULA, DemoSetupDialog::kEula,
OobeButton::kText, JSExecution::kAsync);
OobeButton::kText, JSExecution::kSync);
OobeScreenWaiter(OobeScreen::SCREEN_OOBE_DEMO_SETUP).Wait();
EXPECT_TRUE(IsScreenShown(OobeScreen::SCREEN_OOBE_DEMO_SETUP));
EXPECT_TRUE(IsDialogShown(OobeScreen::SCREEN_OOBE_DEMO_SETUP,
DemoSetupDialog::kSettings));
ClickScreenDialogButtonWithId(OobeScreen::SCREEN_OOBE_DEMO_SETUP,
DemoSetupDialog::kSettings,
"[name=offlineSetup]", JSExecution::kSync);
ClickScreenDialogButton(OobeScreen::SCREEN_OOBE_DEMO_SETUP,
DemoSetupDialog::kSettings, OobeButton::kNext,
JSExecution::kAsync);
EXPECT_TRUE(IsDialogShown(OobeScreen::SCREEN_OOBE_DEMO_SETUP,
DemoSetupDialog::kProgress));
// Wait for progress dialog to be hidden.
const std::string progress_dialog_hidden_query = base::StrCat(
{"!!", ScreenToContentQuery(OobeScreen::SCREEN_OOBE_DEMO_SETUP), ".$.",
DialogToStringId(DemoSetupDialog::kProgress), ".hidden"});
JsConditionWaiter(js_checker(), progress_dialog_hidden_query).Wait();
EXPECT_TRUE(IsDialogShown(OobeScreen::SCREEN_OOBE_DEMO_SETUP,
DemoSetupDialog::kError));
// TODO(agawronska): Progress dialog transition is async - extra work is
// needed to be able to check it reliably.
WaitForScreenDialog(OobeScreen::SCREEN_OOBE_DEMO_SETUP,
DemoSetupDialog::kError);
}
IN_PROC_BROWSER_TEST_F(DemoSetupTest, NextDisabledOnNetworkScreen) {
......@@ -657,44 +693,44 @@ IN_PROC_BROWSER_TEST_F(DemoSetupTest, BackOnNetworkScreen) {
EXPECT_TRUE(IsScreenShown(OobeScreen::SCREEN_OOBE_DEMO_PREFERENCES));
}
IN_PROC_BROWSER_TEST_F(DemoSetupTest, BackOnSettingsScreen) {
SkipToDialog(DemoSetupDialog::kSettings);
IN_PROC_BROWSER_TEST_F(DemoSetupTest, BackOnArcTermsScreen) {
// User cannot go to ARC ToS screen without accepting eula - simulate that.
StartupUtils::MarkEulaAccepted();
SkipToScreen(OobeScreen::SCREEN_ARC_TERMS_OF_SERVICE);
ClickOobeButton(OobeScreen::SCREEN_ARC_TERMS_OF_SERVICE, OobeButton::kBack,
JSExecution::kSync);
OobeScreenWaiter(OobeScreen::SCREEN_OOBE_NETWORK).Wait();
}
IN_PROC_BROWSER_TEST_F(DemoSetupTest, BackOnErrorScreen) {
SkipToErrorDialog();
ClickScreenDialogButton(OobeScreen::SCREEN_OOBE_DEMO_SETUP,
DemoSetupDialog::kSettings, OobeButton::kBack,
DemoSetupDialog::kError, OobeButton::kBack,
JSExecution::kAsync);
OobeScreenWaiter(OobeScreen::SCREEN_OOBE_WELCOME).Wait();
}
IN_PROC_BROWSER_TEST_F(DemoSetupTest, RetryOnErrorScreen) {
// Simulate successful online setup after retry.
SkipToErrorDialog();
// Simulate successful online setup on retry.
EnterpriseEnrollmentHelper::SetupEnrollmentHelperMock(
&MockDemoModeOnlineEnrollmentHelperCreator<DemoModeSetupResult::SUCCESS>);
SkipToDialog(DemoSetupDialog::kError);
ClickScreenDialogButton(OobeScreen::SCREEN_OOBE_DEMO_SETUP,
DemoSetupDialog::kError, OobeButton::kText,
JSExecution::kAsync);
EXPECT_TRUE(IsDialogShown(OobeScreen::SCREEN_OOBE_DEMO_SETUP,
DemoSetupDialog::kProgress));
// TODO(agawronska): Progress dialog transition is async - extra work is
// needed to be able to check it reliably.
OobeScreenWaiter(OobeScreen::SCREEN_GAIA_SIGNIN).Wait();
}
IN_PROC_BROWSER_TEST_F(DemoSetupTest, ShowOnlineAndOfflineButton) {
SkipToDialog(DemoSetupDialog::kSettings);
OobeScreenWaiter(OobeScreen::SCREEN_OOBE_DEMO_SETUP).Wait();
EXPECT_TRUE(IsScreenDialogElementShown(OobeScreen::SCREEN_OOBE_DEMO_SETUP,
DemoSetupDialog::kSettings,
"[name=onlineSetup]"));
EXPECT_TRUE(IsScreenDialogElementShown(OobeScreen::SCREEN_OOBE_DEMO_SETUP,
DemoSetupDialog::kSettings,
"[name=offlineSetup]"));
}
IN_PROC_BROWSER_TEST_F(DemoSetupTest, ShowOfflineSetupOptionOnNetworkList) {
SkipToScreen(OobeScreen::SCREEN_OOBE_NETWORK);
......@@ -716,18 +752,6 @@ class DemoSetupOfflineDisabledTest : public DemoSetupTest {
DISALLOW_COPY_AND_ASSIGN(DemoSetupOfflineDisabledTest);
};
IN_PROC_BROWSER_TEST_F(DemoSetupOfflineDisabledTest, DoNotShowOfflineButton) {
SkipToDialog(DemoSetupDialog::kSettings);
OobeScreenWaiter(OobeScreen::SCREEN_OOBE_DEMO_SETUP).Wait();
EXPECT_TRUE(IsScreenDialogElementShown(OobeScreen::SCREEN_OOBE_DEMO_SETUP,
DemoSetupDialog::kSettings,
"[name=onlineSetup]"));
EXPECT_FALSE(IsScreenDialogElementShown(OobeScreen::SCREEN_OOBE_DEMO_SETUP,
DemoSetupDialog::kSettings,
"[name=offlineSetup]"));
}
IN_PROC_BROWSER_TEST_F(DemoSetupOfflineDisabledTest,
NoOfflineSetupOptionOnNetworkList) {
SkipToScreen(OobeScreen::SCREEN_OOBE_NETWORK);
......
......@@ -4,24 +4,16 @@
#include "chrome/browser/chromeos/login/screens/demo_setup_screen.h"
#include "base/files/file_path.h"
#include "base/logging.h"
#include "chrome/browser/chromeos/login/screen_manager.h"
#include "base/bind.h"
#include "chrome/browser/chromeos/login/screens/base_screen_delegate.h"
#include "chrome/browser/chromeos/login/screens/demo_setup_screen_view.h"
#include "chrome/browser/chromeos/policy/enrollment_config.h"
#include "chrome/browser/chromeos/login/wizard_controller.h"
namespace {
constexpr char kUserActionOnlineSetup[] = "online-setup";
constexpr char kUserActionOfflineSetup[] = "offline-setup";
constexpr char kUserActionStartSetup[] = "start-setup";
constexpr char kUserActionClose[] = "close-setup";
// The policy blob data for offline demo-mode is embedded into the filesystem.
// TODO(mukai, agawronska): fix this when switching to dm-verity image.
constexpr const base::FilePath::CharType kOfflineDemoModeDir[] =
FILE_PATH_LITERAL("/usr/share/chromeos-assets/demo_mode_resources/policy");
} // namespace
namespace chromeos {
......@@ -29,10 +21,10 @@ namespace chromeos {
DemoSetupScreen::DemoSetupScreen(BaseScreenDelegate* base_screen_delegate,
DemoSetupScreenView* view)
: BaseScreen(base_screen_delegate, OobeScreen::SCREEN_OOBE_DEMO_SETUP),
view_(view) {
view_(view),
weak_ptr_factory_(this) {
DCHECK(view_);
view_->Bind(this);
demo_controller_.reset(new DemoSetupController(this));
}
DemoSetupScreen::~DemoSetupScreen() {
......@@ -51,10 +43,8 @@ void DemoSetupScreen::Hide() {
}
void DemoSetupScreen::OnUserAction(const std::string& action_id) {
if (action_id == kUserActionOnlineSetup) {
demo_controller_->EnrollOnline();
} else if (action_id == kUserActionOfflineSetup) {
demo_controller_->EnrollOffline(base::FilePath(kOfflineDemoModeDir));
if (action_id == kUserActionStartSetup) {
StartEnrollment();
} else if (action_id == kUserActionClose) {
Finish(ScreenExitCode::DEMO_MODE_SETUP_CANCELED);
} else {
......@@ -62,11 +52,22 @@ void DemoSetupScreen::OnUserAction(const std::string& action_id) {
}
}
void DemoSetupScreen::OnSetupError(bool fatal) {
// TODO(mukai): propagate |fatal| information and change the error message.
void DemoSetupScreen::OnSetupError(DemoSetupController::DemoSetupError error) {
// TODO(mukai): propagate |error| information and change the error message.
view_->OnSetupFinished(false, std::string());
}
void DemoSetupScreen::StartEnrollment() {
// Demo setup screen is only shown in OOBE.
DCHECK(DemoSetupController::IsOobeDemoSetupFlowInProgress());
DemoSetupController* demo_controller =
WizardController::default_controller()->demo_setup_controller();
demo_controller->Enroll(base::BindOnce(&DemoSetupScreen::OnSetupSuccess,
weak_ptr_factory_.GetWeakPtr()),
base::BindOnce(&DemoSetupScreen::OnSetupError,
weak_ptr_factory_.GetWeakPtr()));
}
void DemoSetupScreen::OnSetupSuccess() {
Finish(ScreenExitCode::DEMO_MODE_SETUP_FINISHED);
}
......@@ -74,7 +75,6 @@ void DemoSetupScreen::OnSetupSuccess() {
void DemoSetupScreen::OnViewDestroyed(DemoSetupScreenView* view) {
if (view_ == view)
view_ = nullptr;
demo_controller_.reset();
}
} // namespace chromeos
......@@ -5,8 +5,10 @@
#ifndef CHROME_BROWSER_CHROMEOS_LOGIN_SCREENS_DEMO_SETUP_SCREEN_H_
#define CHROME_BROWSER_CHROMEOS_LOGIN_SCREENS_DEMO_SETUP_SCREEN_H_
#include <memory>
#include <string>
#include "base/macros.h"
#include "base/memory/weak_ptr.h"
#include "chrome/browser/chromeos/login/demo_mode/demo_setup_controller.h"
#include "chrome/browser/chromeos/login/screens/base_screen.h"
......@@ -17,8 +19,7 @@ class DemoSetupScreenView;
// Controlls demo mode setup. The screen can be shown during OOBE. It allows
// user to setup retail demo mode on the device.
class DemoSetupScreen : public BaseScreen,
public DemoSetupController::Delegate {
class DemoSetupScreen : public BaseScreen {
public:
DemoSetupScreen(BaseScreenDelegate* base_screen_delegate,
DemoSetupScreenView* view);
......@@ -29,17 +30,22 @@ class DemoSetupScreen : public BaseScreen,
void Hide() override;
void OnUserAction(const std::string& action_id) override;
// DemoSetupManager::Delegate:
void OnSetupError(bool fatal) override;
void OnSetupSuccess() override;
// Called when view is being destroyed. If Screen is destroyed earlier
// then it has to call Bind(nullptr).
void OnViewDestroyed(DemoSetupScreenView* view);
private:
void StartEnrollment();
// Called when the setup flow finished with error.
void OnSetupError(DemoSetupController::DemoSetupError error);
// Called when the setup flow finished successfully.
void OnSetupSuccess();
DemoSetupScreenView* view_;
std::unique_ptr<DemoSetupController> demo_controller_;
base::WeakPtrFactory<DemoSetupScreen> weak_ptr_factory_;
DISALLOW_COPY_AND_ASSIGN(DemoSetupScreen);
};
......
// Copyright (c) 2018 The Chromium Authors. All rights reserved.
// Copyright 2018 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.
......
......@@ -32,6 +32,7 @@
#include "chrome/browser/chromeos/arc/arc_util.h"
#include "chrome/browser/chromeos/arc/voice_interaction/arc_voice_interaction_framework_service.h"
#include "chrome/browser/chromeos/customization/customization_document.h"
#include "chrome/browser/chromeos/login/demo_mode/demo_setup_controller.h"
#include "chrome/browser/chromeos/login/enrollment/auto_enrollment_check_screen.h"
#include "chrome/browser/chromeos/login/enrollment/enrollment_screen.h"
#include "chrome/browser/chromeos/login/existing_user_controller.h"
......@@ -816,7 +817,7 @@ void WizardController::OnWelcomeContinued() {
}
void WizardController::OnNetworkBack() {
if (is_in_demo_setup_flow_) {
if (demo_setup_controller_) {
ShowDemoModePreferencesScreen();
} else {
ShowWelcomeScreen();
......@@ -824,6 +825,11 @@ void WizardController::OnNetworkBack() {
}
void WizardController::OnNetworkConnected() {
if (demo_setup_controller_) {
demo_setup_controller_->set_enrollment_type(
DemoSetupController::EnrollmentType::kOnline);
}
if (is_official_build_) {
if (!StartupUtils::IsEulaAccepted()) {
ShowEulaScreen();
......@@ -842,8 +848,10 @@ void WizardController::OnNetworkConnected() {
}
void WizardController::OnOfflineDemoModeSetup() {
DCHECK(is_in_demo_setup_flow_);
is_offline_demo_setup_ = true;
DCHECK(demo_setup_controller_);
demo_setup_controller_->set_enrollment_type(
DemoSetupController::EnrollmentType::kOffline);
if (is_official_build_) {
if (!StartupUtils::IsEulaAccepted()) {
ShowEulaScreen();
......@@ -865,7 +873,7 @@ void WizardController::OnConnectionFailed() {
}
void WizardController::OnUpdateCompleted() {
if (is_in_demo_setup_flow_) {
if (demo_setup_controller_) {
ShowDemoModeSetupScreen();
return;
}
......@@ -889,8 +897,7 @@ void WizardController::OnEulaAccepted() {
PerformPostEulaActions();
// TODO(crbug.com/857275): Show Play Store ToS when available offline.
if (is_offline_demo_setup_) {
DCHECK(is_in_demo_setup_flow_);
if (demo_setup_controller_ && demo_setup_controller_->IsOfflineEnrollment()) {
ShowDemoModeSetupScreen();
return;
}
......@@ -1031,7 +1038,7 @@ void WizardController::OnArcTermsOfServiceSkipped() {
}
void WizardController::OnArcTermsOfServiceAccepted() {
if (is_in_demo_setup_flow_) {
if (demo_setup_controller_) {
InitiateOOBEUpdate();
return;
}
......@@ -1052,7 +1059,7 @@ void WizardController::OnArcTermsOfServiceAccepted() {
}
void WizardController::OnArcTermsOfServiceBack() {
DCHECK(is_in_demo_setup_flow_);
DCHECK(demo_setup_controller_);
DCHECK(StartupUtils::IsEulaAccepted());
ShowNetworkScreen();
}
......@@ -1102,29 +1109,26 @@ void WizardController::OnAutoEnrollmentCheckCompleted() {
}
void WizardController::OnDemoSetupFinished() {
DCHECK(is_in_demo_setup_flow_);
is_in_demo_setup_flow_ = false;
is_offline_demo_setup_ = false;
DCHECK(demo_setup_controller_);
demo_setup_controller_.reset();
PerformOOBECompletedActions();
ShowLoginScreen(LoginScreenContext());
}
void WizardController::OnDemoSetupCanceled() {
DCHECK(is_in_demo_setup_flow_);
is_in_demo_setup_flow_ = false;
is_offline_demo_setup_ = false;
DCHECK(demo_setup_controller_);
demo_setup_controller_.reset();
ShowWelcomeScreen();
}
void WizardController::OnDemoPreferencesContinued() {
DCHECK(is_in_demo_setup_flow_);
DCHECK(demo_setup_controller_);
ShowNetworkScreen();
}
void WizardController::OnDemoPreferencesCanceled() {
DCHECK(is_in_demo_setup_flow_);
is_in_demo_setup_flow_ = false;
is_offline_demo_setup_ = false;
DCHECK(demo_setup_controller_);
demo_setup_controller_.reset();
ShowWelcomeScreen();
}
......@@ -1427,12 +1431,12 @@ void WizardController::AdvanceToScreen(OobeScreen screen) {
}
void WizardController::StartDemoModeSetup() {
is_in_demo_setup_flow_ = true;
demo_setup_controller_ = std::make_unique<DemoSetupController>();
ShowDemoModePreferencesScreen();
}
void WizardController::SimulateDemoModeSetupForTesting() {
is_in_demo_setup_flow_ = true;
demo_setup_controller_ = std::make_unique<DemoSetupController>();
}
///////////////////////////////////////////////////////////////////////////////
......
......@@ -44,6 +44,7 @@ namespace login {
class NetworkStateHelper;
} // namespace login
class DemoSetupController;
class ErrorScreen;
struct Geoposition;
class LoginDisplayHost;
......@@ -106,7 +107,10 @@ class WizardController : public BaseScreenDelegate,
// Starts Demo Mode setup flow. The flow starts from network screen and reuses
// some of regular OOBE screens. It consists of the following screens:
// chromeos::OobeScreen::SCREEN_OOBE_DEMO_PREFERENCES
// chromeos::OobeScreen::SCREEN_OOBE_NETWORK
// chromeos::OobeScreen::SCREEN_OOBE_EULA
// chromeos::OobeScreen::SCREEN_ARC_TERMS_OF_SERVICE
// chromeos::OobeScreen::SCREEN_OOBE_UPDATE
// chromeos::OobeScreen::SCREEN_OOBE_DEMO_SETUP
void StartDemoModeSetup();
......@@ -127,6 +131,12 @@ class WizardController : public BaseScreenDelegate,
// reworked at hackaton.
void EnableUserImageScreenReturnToPreviousHack();
// Returns current DemoSetupController if demo setup flow is in progress or
// nullptr otherwise.
DemoSetupController* demo_setup_controller() const {
return demo_setup_controller_.get();
}
// Returns a pointer to the current screen or nullptr if there's no such
// screen.
BaseScreen* current_screen() const { return current_screen_; }
......@@ -134,9 +144,6 @@ class WizardController : public BaseScreenDelegate,
// Returns true if the current wizard instance has reached the login screen.
bool login_screen_started() const { return login_screen_started_; }
// Whether demo mode setup OOBE flow is currently in progress.
bool is_in_demo_mode_setup_flow() const { return is_in_demo_setup_flow_; }
// Returns a given screen. Creates it lazily.
BaseScreen* GetScreen(OobeScreen screen);
......@@ -434,16 +441,6 @@ class WizardController : public BaseScreenDelegate,
bool is_in_session_oobe_ = false;
// Whether the currently presented flow is Demo Mode setup.
bool is_in_demo_setup_flow_ = false;
// TODO(agawronska): Refactor |is_in_demo_setup_flow_| and
// |is_offline_demo_setup_| to DemoSetupController and use it here to
// determine demo setup configuration.
// Whether offline demo setup was chosen as a part of
// demo mode setup. Should be check together with |is_in_demo_setup_flow_|.
bool is_offline_demo_setup_ = false;
// Indicates that once image selection screen finishes we should return to
// a previous screen instead of proceeding with usual flow.
bool user_image_screen_return_to_previous_hack_ = false;
......@@ -480,6 +477,10 @@ class WizardController : public BaseScreenDelegate,
// Helper for network realted operations.
std::unique_ptr<login::NetworkStateHelper> network_state_helper_;
// Controller of the demo mode setup. It has the lifetime of the single demo
// mode setup flow.
std::unique_ptr<DemoSetupController> demo_setup_controller_;
// Maps screen names to last time of their shows.
std::map<std::string, base::Time> screen_show_times_;
......
......@@ -17,6 +17,7 @@
#include "chrome/browser/chrome_notification_types.h"
#include "chrome/browser/chromeos/accessibility/accessibility_manager.h"
#include "chrome/browser/chromeos/base/locale_util.h"
#include "chrome/browser/chromeos/login/demo_mode/demo_setup_controller.h"
#include "chrome/browser/chromeos/login/enrollment/auto_enrollment_controller.h"
#include "chrome/browser/chromeos/login/enrollment/enrollment_screen.h"
#include "chrome/browser/chromeos/login/enrollment/enterprise_enrollment_helper.h"
......@@ -2166,10 +2167,6 @@ class WizardControllerDemoSetupTest : public WizardControllerFlowTest {
testing::Mock::VerifyAndClearExpectations(mock_welcome_screen_);
}
bool IsInDemoSetupFlow() const {
return WizardController::default_controller()->is_in_demo_setup_flow_;
}
template <class T, class H>
void SkipToScreen(OobeScreen screen, MockOutShowHide<T, H>* screen_mock) {
EXPECT_CALL(*screen_mock, Show()).Times(1);
......@@ -2185,7 +2182,7 @@ class WizardControllerDemoSetupTest : public WizardControllerFlowTest {
IN_PROC_BROWSER_TEST_F(WizardControllerDemoSetupTest,
OnlineDemoSetupFlowFinished) {
CheckCurrentScreen(OobeScreen::SCREEN_OOBE_WELCOME);
EXPECT_FALSE(IsInDemoSetupFlow());
EXPECT_FALSE(DemoSetupController::IsOobeDemoSetupFlowInProgress());
WaitUntilJSIsReady();
EXPECT_CALL(*mock_welcome_screen_, Hide()).Times(1);
......@@ -2195,7 +2192,7 @@ IN_PROC_BROWSER_TEST_F(WizardControllerDemoSetupTest,
WizardController::default_controller()->StartDemoModeSetup();
CheckCurrentScreen(OobeScreen::SCREEN_OOBE_DEMO_PREFERENCES);
EXPECT_TRUE(IsInDemoSetupFlow());
EXPECT_TRUE(DemoSetupController::IsOobeDemoSetupFlowInProgress());
EXPECT_CALL(*mock_demo_preferences_screen_, Hide()).Times(1);
EXPECT_CALL(*mock_network_screen_, Show()).Times(1);
......@@ -2204,7 +2201,7 @@ IN_PROC_BROWSER_TEST_F(WizardControllerDemoSetupTest,
ScreenExitCode::DEMO_MODE_PREFERENCES_CONTINUED);
CheckCurrentScreen(OobeScreen::SCREEN_OOBE_NETWORK);
EXPECT_TRUE(IsInDemoSetupFlow());
EXPECT_TRUE(DemoSetupController::IsOobeDemoSetupFlowInProgress());
EXPECT_CALL(*mock_network_screen_, Hide()).Times(1);
EXPECT_CALL(*mock_eula_screen_, Show()).Times(1);
......@@ -2212,7 +2209,7 @@ IN_PROC_BROWSER_TEST_F(WizardControllerDemoSetupTest,
OnExit(*mock_network_screen_, ScreenExitCode::NETWORK_CONNECTED);
CheckCurrentScreen(OobeScreen::SCREEN_OOBE_EULA);
EXPECT_TRUE(IsInDemoSetupFlow());
EXPECT_TRUE(DemoSetupController::IsOobeDemoSetupFlowInProgress());
EXPECT_CALL(*mock_eula_screen_, Hide()).Times(1);
EXPECT_CALL(*mock_arc_terms_of_service_screen_, Show()).Times(1);
......@@ -2220,7 +2217,7 @@ IN_PROC_BROWSER_TEST_F(WizardControllerDemoSetupTest,
OnExit(*mock_eula_screen_, ScreenExitCode::EULA_ACCEPTED);
CheckCurrentScreen(OobeScreen::SCREEN_ARC_TERMS_OF_SERVICE);
EXPECT_TRUE(IsInDemoSetupFlow());
EXPECT_TRUE(DemoSetupController::IsOobeDemoSetupFlowInProgress());
EXPECT_CALL(*mock_arc_terms_of_service_screen_, Hide()).Times(1);
EXPECT_CALL(*mock_update_screen_, Show()).Times(1);
......@@ -2231,7 +2228,7 @@ IN_PROC_BROWSER_TEST_F(WizardControllerDemoSetupTest,
base::RunLoop().RunUntilIdle();
CheckCurrentScreen(OobeScreen::SCREEN_OOBE_UPDATE);
EXPECT_TRUE(IsInDemoSetupFlow());
EXPECT_TRUE(DemoSetupController::IsOobeDemoSetupFlowInProgress());
EXPECT_CALL(*mock_update_screen_, Hide()).Times(1);
EXPECT_CALL(*mock_demo_setup_screen_, Show()).Times(1);
......@@ -2239,19 +2236,19 @@ IN_PROC_BROWSER_TEST_F(WizardControllerDemoSetupTest,
OnExit(*mock_arc_terms_of_service_screen_, ScreenExitCode::UPDATE_INSTALLED);
CheckCurrentScreen(OobeScreen::SCREEN_OOBE_DEMO_SETUP);
EXPECT_TRUE(IsInDemoSetupFlow());
EXPECT_TRUE(DemoSetupController::IsOobeDemoSetupFlowInProgress());
OnExit(*mock_demo_setup_screen_, ScreenExitCode::DEMO_MODE_SETUP_FINISHED);
EXPECT_TRUE(StartupUtils::IsOobeCompleted());
EXPECT_TRUE(ExistingUserController::current_controller());
EXPECT_FALSE(IsInDemoSetupFlow());
EXPECT_FALSE(DemoSetupController::IsOobeDemoSetupFlowInProgress());
}
IN_PROC_BROWSER_TEST_F(WizardControllerDemoSetupTest,
OfflineDemoSetupFlowFinished) {
CheckCurrentScreen(OobeScreen::SCREEN_OOBE_WELCOME);
EXPECT_FALSE(IsInDemoSetupFlow());
EXPECT_FALSE(DemoSetupController::IsOobeDemoSetupFlowInProgress());
WaitUntilJSIsReady();
EXPECT_CALL(*mock_welcome_screen_, Hide()).Times(1);
......@@ -2261,7 +2258,7 @@ IN_PROC_BROWSER_TEST_F(WizardControllerDemoSetupTest,
WizardController::default_controller()->StartDemoModeSetup();
CheckCurrentScreen(OobeScreen::SCREEN_OOBE_DEMO_PREFERENCES);
EXPECT_TRUE(IsInDemoSetupFlow());
EXPECT_TRUE(DemoSetupController::IsOobeDemoSetupFlowInProgress());
EXPECT_CALL(*mock_demo_preferences_screen_, Hide()).Times(1);
EXPECT_CALL(*mock_network_screen_, Show()).Times(1);
......@@ -2270,7 +2267,7 @@ IN_PROC_BROWSER_TEST_F(WizardControllerDemoSetupTest,
ScreenExitCode::DEMO_MODE_PREFERENCES_CONTINUED);
CheckCurrentScreen(OobeScreen::SCREEN_OOBE_NETWORK);
EXPECT_TRUE(IsInDemoSetupFlow());
EXPECT_TRUE(DemoSetupController::IsOobeDemoSetupFlowInProgress());
EXPECT_CALL(*mock_network_screen_, Hide()).Times(1);
EXPECT_CALL(*mock_eula_screen_, Show()).Times(1);
......@@ -2278,7 +2275,7 @@ IN_PROC_BROWSER_TEST_F(WizardControllerDemoSetupTest,
OnExit(*mock_network_screen_, ScreenExitCode::NETWORK_OFFLINE_DEMO_SETUP);
CheckCurrentScreen(OobeScreen::SCREEN_OOBE_EULA);
EXPECT_TRUE(IsInDemoSetupFlow());
EXPECT_TRUE(DemoSetupController::IsOobeDemoSetupFlowInProgress());
EXPECT_CALL(*mock_eula_screen_, Hide()).Times(1);
EXPECT_CALL(*mock_demo_setup_screen_, Show()).Times(1);
......@@ -2286,18 +2283,18 @@ IN_PROC_BROWSER_TEST_F(WizardControllerDemoSetupTest,
OnExit(*mock_eula_screen_, ScreenExitCode::EULA_ACCEPTED);
CheckCurrentScreen(OobeScreen::SCREEN_OOBE_DEMO_SETUP);
EXPECT_TRUE(IsInDemoSetupFlow());
EXPECT_TRUE(DemoSetupController::IsOobeDemoSetupFlowInProgress());
OnExit(*mock_demo_setup_screen_, ScreenExitCode::DEMO_MODE_SETUP_FINISHED);
EXPECT_TRUE(StartupUtils::IsOobeCompleted());
EXPECT_TRUE(ExistingUserController::current_controller());
EXPECT_FALSE(IsInDemoSetupFlow());
EXPECT_FALSE(DemoSetupController::IsOobeDemoSetupFlowInProgress());
}
IN_PROC_BROWSER_TEST_F(WizardControllerDemoSetupTest, DemoSetupCanceled) {
CheckCurrentScreen(OobeScreen::SCREEN_OOBE_WELCOME);
EXPECT_FALSE(IsInDemoSetupFlow());
EXPECT_FALSE(DemoSetupController::IsOobeDemoSetupFlowInProgress());
WaitUntilJSIsReady();
EXPECT_CALL(*mock_welcome_screen_, Hide()).Times(1);
......@@ -2307,7 +2304,7 @@ IN_PROC_BROWSER_TEST_F(WizardControllerDemoSetupTest, DemoSetupCanceled) {
WizardController::default_controller()->StartDemoModeSetup();
CheckCurrentScreen(OobeScreen::SCREEN_OOBE_DEMO_PREFERENCES);
EXPECT_TRUE(IsInDemoSetupFlow());
EXPECT_TRUE(DemoSetupController::IsOobeDemoSetupFlowInProgress());
EXPECT_CALL(*mock_demo_preferences_screen_, Hide()).Times(1);
EXPECT_CALL(*mock_network_screen_, Show()).Times(1);
......@@ -2316,7 +2313,7 @@ IN_PROC_BROWSER_TEST_F(WizardControllerDemoSetupTest, DemoSetupCanceled) {
ScreenExitCode::DEMO_MODE_PREFERENCES_CONTINUED);
CheckCurrentScreen(OobeScreen::SCREEN_OOBE_NETWORK);
EXPECT_TRUE(IsInDemoSetupFlow());
EXPECT_TRUE(DemoSetupController::IsOobeDemoSetupFlowInProgress());
EXPECT_CALL(*mock_network_screen_, Hide()).Times(1);
EXPECT_CALL(*mock_eula_screen_, Show()).Times(1);
......@@ -2324,7 +2321,7 @@ IN_PROC_BROWSER_TEST_F(WizardControllerDemoSetupTest, DemoSetupCanceled) {
OnExit(*mock_network_screen_, ScreenExitCode::NETWORK_CONNECTED);
CheckCurrentScreen(OobeScreen::SCREEN_OOBE_EULA);
EXPECT_TRUE(IsInDemoSetupFlow());
EXPECT_TRUE(DemoSetupController::IsOobeDemoSetupFlowInProgress());
EXPECT_CALL(*mock_eula_screen_, Hide()).Times(1);
EXPECT_CALL(*mock_arc_terms_of_service_screen_, Show()).Times(1);
......@@ -2332,7 +2329,7 @@ IN_PROC_BROWSER_TEST_F(WizardControllerDemoSetupTest, DemoSetupCanceled) {
OnExit(*mock_eula_screen_, ScreenExitCode::EULA_ACCEPTED);
CheckCurrentScreen(OobeScreen::SCREEN_ARC_TERMS_OF_SERVICE);
EXPECT_TRUE(IsInDemoSetupFlow());
EXPECT_TRUE(DemoSetupController::IsOobeDemoSetupFlowInProgress());
EXPECT_CALL(*mock_arc_terms_of_service_screen_, Hide()).Times(1);
EXPECT_CALL(*mock_update_screen_, Show()).Times(1);
......@@ -2340,11 +2337,10 @@ IN_PROC_BROWSER_TEST_F(WizardControllerDemoSetupTest, DemoSetupCanceled) {
OnExit(*mock_arc_terms_of_service_screen_,
ScreenExitCode::ARC_TERMS_OF_SERVICE_ACCEPTED);
// Let update screen smooth time process (time = 0ms).
base::RunLoop().RunUntilIdle();
CheckCurrentScreen(OobeScreen::SCREEN_OOBE_UPDATE);
EXPECT_TRUE(IsInDemoSetupFlow());
EXPECT_TRUE(DemoSetupController::IsOobeDemoSetupFlowInProgress());
EXPECT_CALL(*mock_update_screen_, Hide()).Times(1);
EXPECT_CALL(*mock_demo_setup_screen_, Show()).Times(1);
......@@ -2352,7 +2348,7 @@ IN_PROC_BROWSER_TEST_F(WizardControllerDemoSetupTest, DemoSetupCanceled) {
OnExit(*mock_arc_terms_of_service_screen_, ScreenExitCode::UPDATE_INSTALLED);
CheckCurrentScreen(OobeScreen::SCREEN_OOBE_DEMO_SETUP);
EXPECT_TRUE(IsInDemoSetupFlow());
EXPECT_TRUE(DemoSetupController::IsOobeDemoSetupFlowInProgress());
EXPECT_CALL(*mock_demo_setup_screen_, Hide()).Times(1);
EXPECT_CALL(*mock_welcome_screen_, Show()).Times(1);
......@@ -2361,18 +2357,18 @@ IN_PROC_BROWSER_TEST_F(WizardControllerDemoSetupTest, DemoSetupCanceled) {
OnExit(*mock_demo_setup_screen_, ScreenExitCode::DEMO_MODE_SETUP_CANCELED);
CheckCurrentScreen(OobeScreen::SCREEN_OOBE_WELCOME);
EXPECT_FALSE(IsInDemoSetupFlow());
EXPECT_FALSE(DemoSetupController::IsOobeDemoSetupFlowInProgress());
}
IN_PROC_BROWSER_TEST_F(WizardControllerDemoSetupTest, DemoPreferencesCanceled) {
CheckCurrentScreen(OobeScreen::SCREEN_OOBE_WELCOME);
EXPECT_FALSE(IsInDemoSetupFlow());
EXPECT_FALSE(DemoSetupController::IsOobeDemoSetupFlowInProgress());
WaitUntilJSIsReady();
SkipToScreen(OobeScreen::SCREEN_OOBE_DEMO_PREFERENCES,
mock_demo_preferences_screen_);
CheckCurrentScreen(OobeScreen::SCREEN_OOBE_DEMO_PREFERENCES);
EXPECT_TRUE(IsInDemoSetupFlow());
EXPECT_TRUE(DemoSetupController::IsOobeDemoSetupFlowInProgress());
EXPECT_CALL(*mock_demo_preferences_screen_, Hide()).Times(1);
EXPECT_CALL(*mock_welcome_screen_, Show()).Times(1);
......@@ -2381,17 +2377,17 @@ IN_PROC_BROWSER_TEST_F(WizardControllerDemoSetupTest, DemoPreferencesCanceled) {
ScreenExitCode::DEMO_MODE_PREFERENCES_CANCELED);
CheckCurrentScreen(OobeScreen::SCREEN_OOBE_WELCOME);
EXPECT_FALSE(IsInDemoSetupFlow());
EXPECT_FALSE(DemoSetupController::IsOobeDemoSetupFlowInProgress());
}
IN_PROC_BROWSER_TEST_F(WizardControllerDemoSetupTest, NetworkBackPressed) {
CheckCurrentScreen(OobeScreen::SCREEN_OOBE_WELCOME);
EXPECT_FALSE(IsInDemoSetupFlow());
EXPECT_FALSE(DemoSetupController::IsOobeDemoSetupFlowInProgress());
WaitUntilJSIsReady();
SkipToScreen(OobeScreen::SCREEN_OOBE_NETWORK, mock_network_screen_);
CheckCurrentScreen(OobeScreen::SCREEN_OOBE_NETWORK);
EXPECT_TRUE(IsInDemoSetupFlow());
EXPECT_TRUE(DemoSetupController::IsOobeDemoSetupFlowInProgress());
EXPECT_CALL(*mock_network_screen_, Hide()).Times(1);
EXPECT_CALL(*mock_demo_preferences_screen_, Show()).Times(1);
......@@ -2399,17 +2395,17 @@ IN_PROC_BROWSER_TEST_F(WizardControllerDemoSetupTest, NetworkBackPressed) {
OnExit(*mock_eula_screen_, ScreenExitCode::NETWORK_BACK);
CheckCurrentScreen(OobeScreen::SCREEN_OOBE_DEMO_PREFERENCES);
EXPECT_TRUE(IsInDemoSetupFlow());
EXPECT_TRUE(DemoSetupController::IsOobeDemoSetupFlowInProgress());
}
IN_PROC_BROWSER_TEST_F(WizardControllerDemoSetupTest, EulaBackPressed) {
CheckCurrentScreen(OobeScreen::SCREEN_OOBE_WELCOME);
EXPECT_FALSE(IsInDemoSetupFlow());
EXPECT_FALSE(DemoSetupController::IsOobeDemoSetupFlowInProgress());
WaitUntilJSIsReady();
SkipToScreen(OobeScreen::SCREEN_OOBE_EULA, mock_eula_screen_);
CheckCurrentScreen(OobeScreen::SCREEN_OOBE_EULA);
EXPECT_TRUE(IsInDemoSetupFlow());
EXPECT_TRUE(DemoSetupController::IsOobeDemoSetupFlowInProgress());
EXPECT_CALL(*mock_eula_screen_, Hide()).Times(1);
EXPECT_CALL(*mock_network_screen_, Show()).Times(1);
......@@ -2417,12 +2413,12 @@ IN_PROC_BROWSER_TEST_F(WizardControllerDemoSetupTest, EulaBackPressed) {
OnExit(*mock_eula_screen_, ScreenExitCode::EULA_BACK);
CheckCurrentScreen(OobeScreen::SCREEN_OOBE_NETWORK);
EXPECT_TRUE(IsInDemoSetupFlow());
EXPECT_TRUE(DemoSetupController::IsOobeDemoSetupFlowInProgress());
}
IN_PROC_BROWSER_TEST_F(WizardControllerDemoSetupTest, ArcTosBackPressed) {
CheckCurrentScreen(OobeScreen::SCREEN_OOBE_WELCOME);
EXPECT_FALSE(IsInDemoSetupFlow());
EXPECT_FALSE(DemoSetupController::IsOobeDemoSetupFlowInProgress());
WaitUntilJSIsReady();
// User cannot go to ARC ToS screen without accepting eula - simulate that.
......@@ -2431,7 +2427,7 @@ IN_PROC_BROWSER_TEST_F(WizardControllerDemoSetupTest, ArcTosBackPressed) {
mock_arc_terms_of_service_screen_);
CheckCurrentScreen(OobeScreen::SCREEN_ARC_TERMS_OF_SERVICE);
EXPECT_TRUE(IsInDemoSetupFlow());
EXPECT_TRUE(DemoSetupController::IsOobeDemoSetupFlowInProgress());
EXPECT_CALL(*mock_arc_terms_of_service_screen_, Hide()).Times(1);
EXPECT_CALL(*mock_network_screen_, Show()).Times(1);
......@@ -2440,7 +2436,7 @@ IN_PROC_BROWSER_TEST_F(WizardControllerDemoSetupTest, ArcTosBackPressed) {
ScreenExitCode::ARC_TERMS_OF_SERVICE_BACK);
CheckCurrentScreen(OobeScreen::SCREEN_OOBE_NETWORK);
EXPECT_TRUE(IsInDemoSetupFlow());
EXPECT_TRUE(DemoSetupController::IsOobeDemoSetupFlowInProgress());
}
class WizardControllerOobeResumeTest : public WizardControllerTest {
......
......@@ -27,29 +27,6 @@
<link rel="stylesheet" href="demo_setup.css">
<link rel="stylesheet" href="oobe_flex_layout.css">
<oobe-dialog id="demoSetupSettingsDialog" role="dialog" has-buttons>
<h1 slot="title">Choose demo mode settings</h1>
<div slot="footer" class="flex layout vertical">
<paper-radio-group id="setupGroup"
selectable="cr-radio-button" selected="onlineSetup">
<cr-radio-button name="onlineSetup"
class="options-list-item flex layout horizontal center">
<div>Online setup</div>
</cr-radio-button>
<template is="dom-if" if="[[offlineDemoModeEnabled_]]">
<cr-radio-button name="offlineSetup"
class="options-list-item flex layout horizontal center">
<div>Offline setup</div>
</cr-radio-button>
</template>
</paper-radio-group>
</div>
<div slot="bottom-buttons" class="layout horizontal justified">
<oobe-back-button inverse on-tap="onCloseClicked_"></oobe-back-button>
<oobe-next-button inverse on-tap="onNextClicked_"></oobe-next-button>
</div>
</oobe-dialog>
<oobe-dialog id="demoSetupProgressDialog" role="dialog" has-buttons hidden>
<hd-iron-icon slot="oobe-icon"
icon1x="demo-setup-32:computer" icon2x="demo-setup-64:computer">
......@@ -77,7 +54,7 @@
</div>
<div slot="bottom-buttons" class="layout horizontal justified">
<oobe-back-button inverse on-tap="onCloseClicked_"></oobe-back-button>
<oobe-text-button inverse on-tap="startSetup_">
<oobe-text-button inverse on-tap="onRetryClicked_">
<div>
[[i18nDynamic(locale, 'demoSetupErrorScreenRetryButtonLabel')]]
</div>
......
......@@ -13,40 +13,20 @@ Polymer({
behaviors: [I18nBehavior, OobeDialogHostBehavior],
properties: {
/**
* Whether offline demo mode is enabled. If it is disabled offline setup
* option will not be shown in UI.
*/
offlineDemoModeEnabled_: {
type: Boolean,
value: false,
},
/**
* Whether offline demo setup was selected. Available setup types: online
* and offline.
*/
isOfflineSetup_: {
type: Boolean,
value: false,
},
/** Ordered array of screen ids that are a part of demo setup flow. */
screens_: {
type: Array,
readonly: true,
value: function() {
return [
'demoSetupSettingsDialog', 'demoSetupProgressDialog',
'demoSetupErrorDialog'
];
return ['demoSetupProgressDialog', 'demoSetupErrorDialog'];
},
},
},
/** Resets demo setup flow to the initial screen. */
/** Resets demo setup flow to the initial screen and starts setup. */
reset: function() {
this.showScreen_(this.screens_[0]);
this.showScreen_('demoSetupProgressDialog');
chrome.send('login.DemoSetupScreen.userActed', ['start-setup']);
},
/** Called after resources are updated. */
......@@ -74,19 +54,6 @@ Polymer({
this.showScreen_(id);
},
/**
* Shows progress dialog and starts demo setup.
* @private
*/
startSetup_: function() {
this.showScreen_('demoSetupProgressDialog');
if (this.isOfflineSetup_) {
chrome.send('login.DemoSetupScreen.userActed', ['offline-setup']);
} else {
chrome.send('login.DemoSetupScreen.userActed', ['online-setup']);
}
},
/**
* Shows screen with the given id.
* @param {string} id Screen id.
......@@ -113,22 +80,12 @@ Polymer({
}
},
/**
* Next button click handler.
* @private
*/
onNextClicked_: function() {
const selected = this.$.setupGroup.selected;
this.isOfflineSetup_ = (selected == 'offlineSetup');
this.startSetup_();
},
/**
* Retry button click handler.
* @private
*/
onRetryClicked_: function() {
this.startSetup_();
this.reset();
},
/**
......
......@@ -10,26 +10,31 @@ login.createScreen('DemoSetupScreen', 'demo-setup', function() {
return {
EXTERNAL_API: ['onSetupFinished'],
/**
* Demo setup module.
* @private
*/
demoSetupModule_: null,
/** @override */
decorate: function() {
var demoSetupScreen = $('demo-setup-content');
demoSetupScreen.offlineDemoModeEnabled_ =
loadTimeData.getValue('offlineDemoModeEnabled');
this.demoSetupModule_ = $('demo-setup-content');
},
/** Returns a control which should receive an initial focus. */
get defaultControl() {
return $('demo-setup-content');
return this.demoSetupModule_;
},
/** Called after resources are updated. */
updateLocalizedContent: function() {
$('demo-setup-content').updateLocalizedContent();
this.demoSetupModule_.updateLocalizedContent();
},
/** @override */
onBeforeShow: function(data) {
$('demo-setup-content').reset();
onBeforeShow: function() {
this.demoSetupModule_.reset();
},
/**
......@@ -39,7 +44,7 @@ login.createScreen('DemoSetupScreen', 'demo-setup', function() {
* populated if setup finished with an error.
*/
onSetupFinished: function(isSuccess, message) {
$('demo-setup-content').onSetupFinished(isSuccess, message);
this.demoSetupModule_.onSetupFinished(isSuccess, message);
},
};
});
......@@ -4,13 +4,9 @@
#include "chrome/browser/ui/webui/chromeos/login/demo_setup_screen_handler.h"
#include "base/command_line.h"
#include "base/values.h"
#include "chrome/browser/chromeos/login/oobe_screen.h"
#include "chrome/browser/chromeos/login/screens/demo_setup_screen.h"
#include "chrome/browser/chromeos/login/wizard_controller.h"
#include "chrome/grit/generated_resources.h"
#include "chromeos/chromeos_switches.h"
#include "components/login/localized_values_builder.h"
namespace {
......@@ -61,12 +57,4 @@ void DemoSetupScreenHandler::DeclareLocalizedValues(
IDS_OOBE_DEMO_SETUP_ERROR_SCREEN_RETRY_BUTTON_LABEL);
}
void DemoSetupScreenHandler::GetAdditionalParameters(
base::DictionaryValue* dict) {
const bool is_offline_demo_mode_enabled =
base::CommandLine::ForCurrentProcess()->HasSwitch(
switches::kEnableOfflineDemoMode);
dict->SetBoolean("offlineDemoModeEnabled", is_offline_demo_mode_enabled);
}
} // namespace chromeos
......@@ -30,7 +30,6 @@ class DemoSetupScreenHandler : public BaseScreenHandler,
void Initialize() override;
void DeclareLocalizedValues(
::login::LocalizedValuesBuilder* builder) override;
void GetAdditionalParameters(base::DictionaryValue* dict) override;
private:
DemoSetupScreen* screen_ = nullptr;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment