Skip to content

Commit

Permalink
Add test for password-settings in os-settings test
Browse files Browse the repository at this point in the history
Bug: b:290917006
Change-Id: I8a184299884c3e97785091778918861f3676d8e7
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4692221
Commit-Queue: Martin Bidlingmaier <mbid@google.com>
Reviewed-by: Wes Okuhara <wesokuhara@google.com>
Cr-Commit-Position: refs/heads/main@{#1186464}
  • Loading branch information
mbid authored and Chromium LUCI CQ committed Aug 22, 2023
1 parent b31f45c commit bb2a847
Show file tree
Hide file tree
Showing 7 changed files with 185 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "chrome/browser/ui/webui/ash/settings/test_support/os_settings_lock_screen_browser_test_base.h"
#include "chrome/test/data/webui/settings/chromeos/os_people_page/password_settings_api.test-mojom-test-utils.h"
#include "chrome/test/data/webui/settings/chromeos/test_api.test-mojom-test-utils.h"
#include "content/public/test/browser_test.h"

namespace ash::settings {

class OSSettingsPasswordSetupTest : public OSSettingsLockScreenBrowserTestBase {
using OSSettingsLockScreenBrowserTestBase::
OSSettingsLockScreenBrowserTestBase;

public:
mojom::PasswordSettingsApiAsyncWaiter GoToPasswordSettings(
mojom::LockScreenSettingsAsyncWaiter& lock_screen_settings) {
password_settings_remote_ =
mojo::Remote(lock_screen_settings.GoToPasswordSettings());
return mojom::PasswordSettingsApiAsyncWaiter(
password_settings_remote_.get());
}

private:
mojo::Remote<mojom::PasswordSettingsApi> password_settings_remote_;
};

class OSSettingsPasswordSetupTestWithGaiaPassword
: public OSSettingsPasswordSetupTest {
public:
OSSettingsPasswordSetupTestWithGaiaPassword()
: OSSettingsPasswordSetupTest(PasswordType::kGaia) {}
};
class OSSettingsPasswordSetupTestWithLocalPassword
: public OSSettingsPasswordSetupTest {
public:
OSSettingsPasswordSetupTestWithLocalPassword()
: OSSettingsPasswordSetupTest(PasswordType::kLocal) {}
};

IN_PROC_BROWSER_TEST_F(OSSettingsPasswordSetupTestWithGaiaPassword, NotShown) {
mojom::LockScreenSettingsAsyncWaiter lock_screen_settings =
OpenLockScreenSettingsAndAuthenticate();
lock_screen_settings.AssertPasswordControlVisibility(false);
}

IN_PROC_BROWSER_TEST_F(OSSettingsPasswordSetupTestWithLocalPassword, Selected) {
mojom::LockScreenSettingsAsyncWaiter lock_screen_settings =
OpenLockScreenSettingsAndAuthenticate();
mojom::PasswordSettingsApiAsyncWaiter password_settings =
GoToPasswordSettings(lock_screen_settings);

password_settings.AssertSelectedPasswordType(mojom::PasswordType::kLocal);
}

} // namespace ash::settings
1 change: 1 addition & 0 deletions chrome/test/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -4525,6 +4525,7 @@ if (!is_android) {
"../browser/ui/webui/settings/ash/os_settings_auto_screen_lock_browsertest.cc",
"../browser/ui/webui/settings/ash/os_settings_lock_screen_authentication_browsertest.cc",
"../browser/ui/webui/settings/ash/os_settings_notification_settings_browsertest.cc",
"../browser/ui/webui/settings/ash/os_settings_password_setup_browsertest.cc",
"../browser/ui/webui/settings/ash/os_settings_pin_setup_browsertest.cc",
"../browser/ui/webui/settings/ash/os_settings_recovery_browsertest.cc",
"../browser/ui/webui/signin/ash/inline_login_dialog_browsertest.cc",
Expand Down
3 changes: 3 additions & 0 deletions chrome/test/data/webui/settings/chromeos/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import("//mojo/public/tools/bindings/mojom.gni")
mojom("test_api_mojom") {
testonly = true
sources = [
"os_people_page/password_settings_api.test-mojom",
"os_people_page/pin_settings_api.test-mojom",
"test_api.test-mojom",
]
Expand Down Expand Up @@ -231,6 +232,7 @@ build_webui_tests("build") {
"os_people_page/os_people_page_test.ts",
"os_people_page/os_sync_controls_subpage_test.ts",
"os_people_page/personalization_options_test.ts",
"os_people_page/password_settings_api.ts",
"os_people_page/pin_dialog_api.ts",
"os_people_page/pin_settings_api.ts",
"os_people_page/test_account_manager_browser_proxy.ts",
Expand Down Expand Up @@ -291,6 +293,7 @@ build_webui_tests("build") {

mojo_files = [
"$root_gen_dir/mojom-webui/chrome/test/data/webui/settings/chromeos/test_api.test-mojom-webui.js",
"$root_gen_dir/mojom-webui/chrome/test/data/webui/settings/chromeos/os_people_page/password_settings_api.test-mojom-webui.js",
"$root_gen_dir/mojom-webui/chrome/test/data/webui/settings/chromeos/os_people_page/pin_settings_api.test-mojom-webui.js",
]

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

module ash.settings.mojom;

enum PasswordType {
kGaia,
kLocal,
};

// The test API for the settings-password-settings element.
interface PasswordSettingsApi {
// Verifies that the given password type is selected.
AssertSelectedPasswordType(PasswordType? password_type) => ();
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import {assertTrue} from 'chrome://webui-test/chai_assert.js';

import {PasswordSettingsApiInterface, PasswordSettingsApiReceiver, PasswordSettingsApiRemote, PasswordType} from '../password_settings_api.test-mojom-webui.js';
import {assertAsync, assertForDuration, hasBooleanProperty} from '../utils.js';

// The test API for the settings-password-settings element.
export class PasswordSettingsApi implements PasswordSettingsApiInterface {
private element: HTMLElement;

constructor(element: HTMLElement) {
this.element = element;
assertTrue(this.element.shadowRoot !== null);
}

public newRemote(): PasswordSettingsApiRemote {
const receiver = new PasswordSettingsApiReceiver(this);
return receiver.$.bindNewPipeAndPassRemote();
}

private shadowRoot(): ShadowRoot {
const shadowRoot = this.element.shadowRoot;
assertTrue(shadowRoot !== null);
return shadowRoot;
}

private queryGaiaRadio(): {checked: boolean}&HTMLElement {
const el = this.shadowRoot().querySelector('*[name="gaia"]');
assertTrue(el instanceof HTMLElement);
assertTrue(hasBooleanProperty(el, 'checked'));
return el;
}

private queryLocalRadio(): {checked: boolean}&HTMLElement {
const el = this.shadowRoot().querySelector('*[name="local"]');
assertTrue(el instanceof HTMLElement);
assertTrue(hasBooleanProperty(el, 'checked'));
return el;
}

selectedPasswordType(): PasswordType|null {
const gaiaRadio = this.queryGaiaRadio();
const localRadio = this.queryLocalRadio();

assertTrue(
!(gaiaRadio.checked && localRadio.checked),
'There must be at most one selected password type');

if (gaiaRadio.checked) {
return PasswordType.kGaia;
}
if (localRadio.checked) {
return PasswordType.kLocal;
}

return null;
}

async assertSelectedPasswordType(passwordType: PasswordType|
null): Promise<void> {
const isSelected = () => this.selectedPasswordType() === passwordType;
await assertAsync(isSelected);
await assertForDuration(isSelected);
}
}
9 changes: 9 additions & 0 deletions chrome/test/data/webui/settings/chromeos/test_api.test-mojom
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

module ash.settings.mojom;

import "chrome/test/data/webui/settings/chromeos/os_people_page/password_settings_api.test-mojom";
import "chrome/test/data/webui/settings/chromeos/os_people_page/pin_settings_api.test-mojom";

// This file contains the definition of the mojo service that can be used in
Expand All @@ -29,6 +30,14 @@ interface LockScreenSettings {
// Crashes if authentication succeeds.
AuthenticateIncorrectly(string password) => ();

// Checks whether a control for changing passwords is visible or not.
AssertPasswordControlVisibility(bool is_visible) => ();

// Navigates to password settings. Crashes if no password settings control is
// visible. The return value can be used to interact with password settings.
GoToPasswordSettings() =>
(pending_remote<PasswordSettingsApi> password_settings);

// Checks whether a control for recovery is available or not.
AssertRecoveryControlAvailability(bool is_available) => ();

Expand Down
31 changes: 31 additions & 0 deletions chrome/test/data/webui/settings/chromeos/test_api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,9 @@ import {SettingsRadioGroupElement} from 'chrome://os-settings/lazy_load.js';
import {CrButtonElement, SettingsGoogleDriveSubpageElement, SettingsToggleButtonElement} from 'chrome://os-settings/os_settings.js';
import {assertTrue} from 'chrome://webui-test/chai_assert.js';

import {PasswordSettingsApi} from './os_people_page/password_settings_api.js';
import {PinSettingsApi} from './os_people_page/pin_settings_api.js';
import {PasswordSettingsApiRemote} from './password_settings_api.test-mojom-webui.js';
import {PinSettingsApiRemote} from './pin_settings_api.test-mojom-webui.js';
import {GoogleDriveSettingsInterface, GoogleDriveSettingsReceiver, GoogleDriveSettingsRemote, LockScreenSettings_RecoveryDialogAction as RecoveryDialogAction, LockScreenSettingsInterface, LockScreenSettingsReceiver, LockScreenSettingsRemote, OSSettingsBrowserProcess, OSSettingsDriverInterface, OSSettingsDriverReceiver} from './test_api.test-mojom-webui.js';
import {assertAsync, assertForDuration, hasBooleanProperty, hasProperty, Lazy, querySelectorShadow, retry, retryUntilSome} from './utils.js';
Expand Down Expand Up @@ -128,6 +130,35 @@ export class LockScreenSettings implements LockScreenSettingsInterface {
await this.authenticate(password, false);
}

private queryPasswordSettings(): PasswordSettingsApi|null {
const el = this.shadowRoot().getElementById('passwordSettings');
if (!(el instanceof HTMLElement)) {
return null;
}
if (el.hidden) {
return null;
}

return new PasswordSettingsApi(el);
}

async assertPasswordControlVisibility(isVisible: boolean): Promise<void> {
const property = () => {
const settings = this.queryPasswordSettings();
return (settings !== null) === isVisible;
};

await assertAsync(property);
await assertForDuration(property);
}

public async goToPasswordSettings():
Promise<{passwordSettings: PasswordSettingsApiRemote}> {
const passwordSettings =
await retryUntilSome(() => this.queryPasswordSettings());
return {passwordSettings: passwordSettings.newRemote()};
}

private recoveryToggle(): HTMLElement&{checked: boolean}|null {
const toggle = this.shadowRoot().getElementById('recoveryToggle');
if (toggle === null) {
Expand Down

0 comments on commit bb2a847

Please sign in to comment.