Commit d6ce2790 authored by Roman Sorokin's avatar Roman Sorokin Committed by Commit Bot

Migrate LoginUI tests to Views and OobeBaseTests

Also OobeSpokenFeedbackTest

TBR=aleventhal@chromium.org

Bug: 987587
Change-Id: Ib66052b1c52351edb6ba304cc1c6a1b82c8d9245
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2129707
Commit-Queue: Roman Sorokin [CET] <rsorokin@chromium.org>
Reviewed-by: default avatarDenis Kuznetsov [CET] <antrim@chromium.org>
Cr-Commit-Position: refs/heads/master@{#754973}
parent 93eb4290
...@@ -414,6 +414,8 @@ bool LockContentsView::TestApi::RemoveUser(const AccountId& account_id) { ...@@ -414,6 +414,8 @@ bool LockContentsView::TestApi::RemoveUser(const AccountId& account_id) {
LoginBigUserView* big_view = FindUser(account_id); LoginBigUserView* big_view = FindUser(account_id);
if (!big_view) if (!big_view)
return false; return false;
if (!big_view->GetCurrentUser().can_remove)
return false;
LoginBigUserView::TestApi user_api(big_view); LoginBigUserView::TestApi user_api(big_view);
user_api.Remove(); user_api.Remove();
return true; return true;
......
...@@ -22,7 +22,7 @@ ...@@ -22,7 +22,7 @@
#include "base/task/post_task.h" #include "base/task/post_task.h"
#include "chrome/app/chrome_command_ids.h" #include "chrome/app/chrome_command_ids.h"
#include "chrome/browser/chromeos/accessibility/accessibility_manager.h" #include "chrome/browser/chromeos/accessibility/accessibility_manager.h"
#include "chrome/browser/chromeos/login/login_manager_test.h" #include "chrome/browser/chromeos/login/test/oobe_base_test.h"
#include "chrome/browser/ui/ash/launcher/chrome_launcher_controller.h" #include "chrome/browser/ui/ash/launcher/chrome_launcher_controller.h"
#include "chrome/browser/ui/aura/accessibility/automation_manager_aura.h" #include "chrome/browser/ui/aura/accessibility/automation_manager_aura.h"
#include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser.h"
...@@ -800,14 +800,13 @@ IN_PROC_BROWSER_TEST_P(SpokenFeedbackTest, SmartStickyMode) { ...@@ -800,14 +800,13 @@ IN_PROC_BROWSER_TEST_P(SpokenFeedbackTest, SmartStickyMode) {
// Spoken feedback tests of the out-of-box experience. // Spoken feedback tests of the out-of-box experience.
// //
class OobeSpokenFeedbackTest : public LoginManagerTest { class OobeSpokenFeedbackTest : public OobeBaseTest {
protected: protected:
OobeSpokenFeedbackTest() OobeSpokenFeedbackTest() = default;
: LoginManagerTest(false, true /* should_initialize_webui */) {}
~OobeSpokenFeedbackTest() override {} ~OobeSpokenFeedbackTest() override {}
void SetUpCommandLine(base::CommandLine* command_line) override { void SetUpCommandLine(base::CommandLine* command_line) override {
LoginManagerTest::SetUpCommandLine(command_line); OobeBaseTest::SetUpCommandLine(command_line);
// Many bots don't have keyboard/mice which triggers the HID detection // Many bots don't have keyboard/mice which triggers the HID detection
// dialog in the OOBE. Avoid confusing the tests with that. // dialog in the OOBE. Avoid confusing the tests with that.
command_line->AppendSwitch(chromeos::switches::kDisableHIDDetectionOnOOBE); command_line->AppendSwitch(chromeos::switches::kDisableHIDDetectionOnOOBE);
......
...@@ -3,79 +3,24 @@ ...@@ -3,79 +3,24 @@
// found in the LICENSE file. // found in the LICENSE file.
#include "ash/public/cpp/login_screen_test_api.h" #include "ash/public/cpp/login_screen_test_api.h"
#include "base/command_line.h"
#include "base/memory/ptr_util.h"
#include "base/stl_util.h"
#include "chrome/browser/browser_process.h" #include "chrome/browser/browser_process.h"
#include "chrome/browser/chrome_notification_types.h"
#include "chrome/browser/chromeos/login/login_manager_test.h" #include "chrome/browser/chromeos/login/login_manager_test.h"
#include "chrome/browser/chromeos/login/startup_utils.h" #include "chrome/browser/chromeos/login/startup_utils.h"
#include "chrome/browser/chromeos/login/test/device_state_mixin.h" #include "chrome/browser/chromeos/login/test/device_state_mixin.h"
#include "chrome/browser/chromeos/login/test/js_checker.h" #include "chrome/browser/chromeos/login/test/js_checker.h"
#include "chrome/browser/chromeos/login/test/login_manager_mixin.h"
#include "chrome/browser/chromeos/login/test/oobe_base_test.h"
#include "chrome/browser/chromeos/login/test/oobe_screen_waiter.h" #include "chrome/browser/chromeos/login/test/oobe_screen_waiter.h"
#include "chrome/browser/chromeos/settings/scoped_testing_cros_settings.h"
#include "chrome/browser/chromeos/settings/stub_cros_settings_provider.h"
#include "chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h" #include "chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h"
#include "chrome/browser/ui/webui/chromeos/login/welcome_screen_handler.h" #include "chrome/browser/ui/webui/chromeos/login/welcome_screen_handler.h"
#include "chrome/common/pref_names.h" #include "chrome/common/pref_names.h"
#include "components/prefs/pref_service.h" #include "components/prefs/pref_service.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/notification_observer.h"
#include "content/public/browser/notification_registrar.h"
#include "content/public/browser/notification_service.h"
#include "content/public/browser/notification_types.h"
#include "ui/compositor/compositor_switches.h"
namespace chromeos { namespace chromeos {
namespace { IN_PROC_BROWSER_TEST_F(OobeBaseTest, PRE_InterruptedAutoStartEnrollment) {
struct {
const char* email;
const char* gaia_id;
} const kTestUsers[] = {{"test-user1@gmail.com", "1111111111"},
{"test-user2@gmail.com", "2222222222"}};
} // namespace
class LoginUITest : public chromeos::LoginManagerTest {
public:
LoginUITest() : LoginManagerTest(false, true /* should_initialize_webui */) {
for (size_t i = 0; i < base::size(kTestUsers); ++i) {
test_users_.emplace_back(AccountId::FromUserEmailGaiaId(
kTestUsers[i].email, kTestUsers[i].gaia_id));
}
}
~LoginUITest() override {}
protected:
std::vector<AccountId> test_users_;
DISALLOW_COPY_AND_ASSIGN(LoginUITest);
};
IN_PROC_BROWSER_TEST_F(LoginUITest, PRE_LoginUIVisible) {
RegisterUser(test_users_[0]);
RegisterUser(test_users_[1]);
StartupUtils::MarkOobeCompleted();
}
// Verifies basic login UI properties.
IN_PROC_BROWSER_TEST_F(LoginUITest, LoginUIVisible) {
test::OobeJS().ExpectTrue("!!document.querySelector('#account-picker')");
test::OobeJS().ExpectTrue("!!document.querySelector('#pod-row')");
test::OobeJS().ExpectTrue(
"document.querySelectorAll('.pod:not(#user-pod-template)').length == 2");
test::OobeJS().ExpectTrue(
"document.querySelectorAll('.pod:not(#user-pod-template)')[0]"
".user.emailAddress == '" +
test_users_[0].GetUserEmail() + "'");
test::OobeJS().ExpectTrue(
"document.querySelectorAll('.pod:not(#user-pod-template)')[1]"
".user.emailAddress == '" +
test_users_[1].GetUserEmail() + "'");
}
IN_PROC_BROWSER_TEST_F(LoginUITest, PRE_InterruptedAutoStartEnrollment) {
StartupUtils::MarkOobeCompleted(); StartupUtils::MarkOobeCompleted();
PrefService* prefs = g_browser_process->local_state(); PrefService* prefs = g_browser_process->local_state();
prefs->SetBoolean(prefs::kDeviceEnrollmentAutoStart, true); prefs->SetBoolean(prefs::kDeviceEnrollmentAutoStart, true);
...@@ -84,75 +29,100 @@ IN_PROC_BROWSER_TEST_F(LoginUITest, PRE_InterruptedAutoStartEnrollment) { ...@@ -84,75 +29,100 @@ IN_PROC_BROWSER_TEST_F(LoginUITest, PRE_InterruptedAutoStartEnrollment) {
// Tests that the default first screen is the welcome screen after OOBE // Tests that the default first screen is the welcome screen after OOBE
// when auto enrollment is enabled and device is not yet enrolled. // when auto enrollment is enabled and device is not yet enrolled.
IN_PROC_BROWSER_TEST_F(LoginUITest, InterruptedAutoStartEnrollment) { IN_PROC_BROWSER_TEST_F(OobeBaseTest, InterruptedAutoStartEnrollment) {
OobeScreenWaiter(WelcomeView::kScreenId).Wait(); OobeScreenWaiter(WelcomeView::kScreenId).Wait();
} }
IN_PROC_BROWSER_TEST_F(LoginUITest, OobeNoExceptions) { IN_PROC_BROWSER_TEST_F(OobeBaseTest, OobeNoExceptions) {
test::OobeJS().ExpectTrue("cr.ErrorStore.getInstance().length == 0"); OobeScreenWaiter(WelcomeView::kScreenId).Wait();
} OobeBaseTest::CheckJsExceptionErrors(0);
IN_PROC_BROWSER_TEST_F(LoginUITest, PRE_LoginNoExceptions) {
RegisterUser(test_users_[0]);
RegisterUser(test_users_[1]);
StartupUtils::MarkOobeCompleted();
}
IN_PROC_BROWSER_TEST_F(LoginUITest, LoginNoExceptions) {
OobeScreenWaiter(OobeScreen::SCREEN_ACCOUNT_PICKER).Wait();
test::OobeJS().ExpectTrue("cr.ErrorStore.getInstance().length == 0");
} }
IN_PROC_BROWSER_TEST_F(LoginUITest, OobeCatchException) { IN_PROC_BROWSER_TEST_F(OobeBaseTest, OobeCatchException) {
test::OobeJS().ExpectTrue("cr.ErrorStore.getInstance().length == 0"); OobeBaseTest::CheckJsExceptionErrors(0);
test::OobeJS().ExecuteAsync("aelrt('misprint')"); test::OobeJS().ExecuteAsync("aelrt('misprint')");
test::OobeJS().ExpectTrue("cr.ErrorStore.getInstance().length == 1"); OobeBaseTest::CheckJsExceptionErrors(1);
test::OobeJS().ExecuteAsync("consle.error('Some error')"); test::OobeJS().ExecuteAsync("consle.error('Some error')");
test::OobeJS().ExpectTrue("cr.ErrorStore.getInstance().length == 2"); OobeBaseTest::CheckJsExceptionErrors(2);
} }
class LoginViewUITest : public LoginManagerTest { class LoginUITestBase : public LoginManagerTest {
public: public:
LoginViewUITest() LoginUITestBase()
: LoginManagerTest(false, false /* should_initialize_webui */) { : LoginManagerTest(false, false /* should_initialize_webui */) {
set_force_webui_login(false); set_force_webui_login(false);
for (size_t i = 0; i < 10; ++i) {
const std::string email = "a" + base::NumberToString(i) + "@gmail.com";
const std::string gaia_id = base::NumberToString(i) + "111111111";
test_users_.push_back(AccountId::FromUserEmailGaiaId(email, gaia_id));
}
} }
~LoginViewUITest() override = default;
protected: protected:
void AddUsers() { std::vector<LoginManagerMixin::TestUserInfo> test_users_{
for (const auto& user : test_users_) LoginManagerMixin::CreateRegularUsers(10)};
RegisterUser(user); LoginManagerMixin login_manager_mixin_{&mixin_host_, test_users_};
} };
std::vector<AccountId> test_users_;
class LoginUIEnrolledTest : public LoginUITestBase {
public:
LoginUIEnrolledTest() = default;
~LoginUIEnrolledTest() override = default;
protected:
DeviceStateMixin device_state_{ DeviceStateMixin device_state_{
&mixin_host_, DeviceStateMixin::State::OOBE_COMPLETED_CLOUD_ENROLLED}; &mixin_host_, DeviceStateMixin::State::OOBE_COMPLETED_CLOUD_ENROLLED};
}; };
IN_PROC_BROWSER_TEST_F(LoginViewUITest, PRE_UserRemoval) { class LoginUIConsumerTest : public LoginUITestBase {
AddUsers(); public:
LoginUIConsumerTest() = default;
~LoginUIConsumerTest() override = default;
void SetUpOnMainThread() override {
scoped_testing_cros_settings_.device_settings()->Set(
kDeviceOwner, base::Value(owner_.account_id.GetUserEmail()));
LoginUITestBase::SetUpOnMainThread();
}
protected:
LoginManagerMixin::TestUserInfo owner_{test_users_[3]};
DeviceStateMixin device_state_{
&mixin_host_, DeviceStateMixin::State::OOBE_COMPLETED_CONSUMER_OWNED};
ScopedTestingCrosSettings scoped_testing_cros_settings_;
};
// Verifies basic login UI properties.
IN_PROC_BROWSER_TEST_F(LoginUIConsumerTest, LoginUIVisible) {
const int users_count = test_users_.size();
EXPECT_EQ(users_count, ash::LoginScreenTestApi::GetUsersCount());
EXPECT_FALSE(ash::LoginScreenTestApi::IsOobeDialogVisible());
for (int i = 0; i < users_count; ++i) {
EXPECT_TRUE(ash::LoginScreenTestApi::FocusUser(test_users_[i].account_id));
}
for (int i = 0; i < users_count; ++i) {
// Can't remove the owner.
EXPECT_EQ(ash::LoginScreenTestApi::RemoveUser(test_users_[i].account_id),
test_users_[i].account_id != owner_.account_id);
}
EXPECT_EQ(1, ash::LoginScreenTestApi::GetUsersCount());
EXPECT_TRUE(ash::LoginScreenTestApi::FocusUser(owner_.account_id));
EXPECT_FALSE(ash::LoginScreenTestApi::IsOobeDialogVisible());
} }
IN_PROC_BROWSER_TEST_F(LoginViewUITest, UserRemoval) { IN_PROC_BROWSER_TEST_F(LoginUIEnrolledTest, UserRemoval) {
const int users_count = test_users_.size(); const int users_count = test_users_.size();
EXPECT_EQ(users_count, ash::LoginScreenTestApi::GetUsersCount()); EXPECT_EQ(users_count, ash::LoginScreenTestApi::GetUsersCount());
EXPECT_FALSE(ash::LoginScreenTestApi::IsOobeDialogVisible()); EXPECT_FALSE(ash::LoginScreenTestApi::IsOobeDialogVisible());
// Remove the first user. // Remove the first user.
EXPECT_TRUE(ash::LoginScreenTestApi::RemoveUser(test_users_[0])); EXPECT_TRUE(ash::LoginScreenTestApi::RemoveUser(test_users_[0].account_id));
EXPECT_EQ(users_count - 1, ash::LoginScreenTestApi::GetUsersCount()); EXPECT_EQ(users_count - 1, ash::LoginScreenTestApi::GetUsersCount());
// Can not remove twice. // Can not remove twice.
EXPECT_FALSE(ash::LoginScreenTestApi::RemoveUser(test_users_[0])); EXPECT_FALSE(ash::LoginScreenTestApi::RemoveUser(test_users_[0].account_id));
EXPECT_EQ(users_count - 1, ash::LoginScreenTestApi::GetUsersCount()); EXPECT_EQ(users_count - 1, ash::LoginScreenTestApi::GetUsersCount());
for (int i = 1; i < users_count; ++i) { for (int i = 1; i < users_count; ++i) {
EXPECT_TRUE(ash::LoginScreenTestApi::RemoveUser(test_users_[i])); EXPECT_TRUE(ash::LoginScreenTestApi::RemoveUser(test_users_[i].account_id));
EXPECT_EQ(users_count - i - 1, ash::LoginScreenTestApi::GetUsersCount()); EXPECT_EQ(users_count - i - 1, ash::LoginScreenTestApi::GetUsersCount());
} }
...@@ -160,17 +130,13 @@ IN_PROC_BROWSER_TEST_F(LoginViewUITest, UserRemoval) { ...@@ -160,17 +130,13 @@ IN_PROC_BROWSER_TEST_F(LoginViewUITest, UserRemoval) {
EXPECT_TRUE(ash::LoginScreenTestApi::IsOobeDialogVisible()); EXPECT_TRUE(ash::LoginScreenTestApi::IsOobeDialogVisible());
} }
IN_PROC_BROWSER_TEST_F(LoginViewUITest, PRE_UserReverseRemoval) { IN_PROC_BROWSER_TEST_F(LoginUIEnrolledTest, UserReverseRemoval) {
AddUsers();
}
IN_PROC_BROWSER_TEST_F(LoginViewUITest, UserReverseRemoval) {
const int users_count = test_users_.size(); const int users_count = test_users_.size();
EXPECT_EQ(users_count, ash::LoginScreenTestApi::GetUsersCount()); EXPECT_EQ(users_count, ash::LoginScreenTestApi::GetUsersCount());
EXPECT_FALSE(ash::LoginScreenTestApi::IsOobeDialogVisible()); EXPECT_FALSE(ash::LoginScreenTestApi::IsOobeDialogVisible());
for (int i = users_count - 1; i >= 0; --i) { for (int i = users_count - 1; i >= 0; --i) {
EXPECT_TRUE(ash::LoginScreenTestApi::RemoveUser(test_users_[i])); EXPECT_TRUE(ash::LoginScreenTestApi::RemoveUser(test_users_[i].account_id));
EXPECT_EQ(i, ash::LoginScreenTestApi::GetUsersCount()); EXPECT_EQ(i, ash::LoginScreenTestApi::GetUsersCount());
} }
......
...@@ -104,6 +104,19 @@ UserContext LoginManagerMixin::CreateDefaultUserContext( ...@@ -104,6 +104,19 @@ UserContext LoginManagerMixin::CreateDefaultUserContext(
return user_context; return user_context;
} }
std::vector<LoginManagerMixin::TestUserInfo>
LoginManagerMixin::CreateRegularUsers(int n) {
std::vector<LoginManagerMixin::TestUserInfo> users;
for (int i = 0; i < n; ++i) {
const std::string email =
"test_user_" + base::NumberToString(i) + "@gmail.com";
const std::string gaia_id = base::NumberToString(i) + "111111111";
users.push_back(LoginManagerMixin::TestUserInfo(
AccountId::FromUserEmailGaiaId(email, gaia_id)));
}
return users;
}
LoginManagerMixin::LoginManagerMixin( LoginManagerMixin::LoginManagerMixin(
InProcessBrowserTestMixinHost* host, InProcessBrowserTestMixinHost* host,
const std::vector<TestUserInfo>& initial_users) const std::vector<TestUserInfo>& initial_users)
......
...@@ -55,6 +55,8 @@ class LoginManagerMixin : public InProcessBrowserTestMixin { ...@@ -55,6 +55,8 @@ class LoginManagerMixin : public InProcessBrowserTestMixin {
// result can be used with Login* methods below. // result can be used with Login* methods below.
static UserContext CreateDefaultUserContext(const TestUserInfo& account_id); static UserContext CreateDefaultUserContext(const TestUserInfo& account_id);
static std::vector<TestUserInfo> CreateRegularUsers(int n);
LoginManagerMixin(InProcessBrowserTestMixinHost* host, LoginManagerMixin(InProcessBrowserTestMixinHost* host,
const std::vector<TestUserInfo>& initial_users); const std::vector<TestUserInfo>& initial_users);
......
...@@ -178,6 +178,9 @@ void OobeBaseTest::WaitForSigninScreen() { ...@@ -178,6 +178,9 @@ void OobeBaseTest::WaitForSigninScreen() {
MaybeWaitForLoginScreenLoad(); MaybeWaitForLoginScreenLoad();
} }
void OobeBaseTest::CheckJsExceptionErrors(int number) {
test::OobeJS().ExpectEQ("cr.ErrorStore.getInstance().length", number);
}
test::JSChecker OobeBaseTest::SigninFrameJS() { test::JSChecker OobeBaseTest::SigninFrameJS() {
content::RenderFrameHost* frame = signin::GetAuthFrame( content::RenderFrameHost* frame = signin::GetAuthFrame(
......
...@@ -59,6 +59,7 @@ class OobeBaseTest : public MixinBasedInProcessBrowserTest { ...@@ -59,6 +59,7 @@ class OobeBaseTest : public MixinBasedInProcessBrowserTest {
void WaitForGaiaPageBackButtonUpdate(); void WaitForGaiaPageBackButtonUpdate();
void WaitForGaiaPageEvent(const std::string& event); void WaitForGaiaPageEvent(const std::string& event);
void WaitForSigninScreen(); void WaitForSigninScreen();
void CheckJsExceptionErrors(int number);
test::JSChecker SigninFrameJS(); test::JSChecker SigninFrameJS();
// Whether to use background networking. Note this is only effective when it // Whether to use background networking. Note this is only effective when it
......
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