// Copyright 2011 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ash/components/arc/test/arc_util_test_support.h"
#include "ash/constants/ash_pref_names.h"
#include "ash/constants/ash_switches.h"
#include "ash/public/cpp/stylus_utils.h"
#include "base/command_line.h"
#include "base/test/scoped_chromeos_version_info.h"
#include "base/values.h"
#include "build/config/chromebox_for_meetings/buildflags.h"
#include "chrome/browser/ash/arc/arc_util.h"
#include "chrome/browser/extensions/extension_apitest.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/browser_window.h"
#include "chrome/common/chrome_switches.h"
#include "chrome/common/pref_names.h"
#include "chromeos/ash/components/install_attributes/stub_install_attributes.h"
#include "chromeos/ash/components/settings/cros_settings_names.h"
#include "chromeos/ash/components/system/fake_statistics_provider.h"
#include "chromeos/ash/components/system/statistics_provider.h"
#include "components/prefs/pref_service.h"
#include "content/public/test/browser_test.h"
#include "ui/aura/window.h"
#include "ui/events/devices/device_data_manager_test_api.h"
#include "ui/events/devices/input_device.h"
#include "ui/events/devices/touchscreen_device.h"
#include "ui/events/test/event_generator.h"
using base::test::ScopedChromeOSVersionInfo;
namespace {
const char kTestAppId[] = "ljoammodoonkhnehlncldjelhidljdpi";
} // namespace
class ChromeOSInfoPrivateTest : public extensions::ExtensionApiTest {
public:
ChromeOSInfoPrivateTest() {}
~ChromeOSInfoPrivateTest() override {}
protected:
void EnableKioskSession() {
base::CommandLine::ForCurrentProcess()->AppendSwitch(
switches::kForceAppMode);
base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(switches::kAppId,
kTestAppId);
}
};
// Flaky crashes. https://crbug.com/1226266
IN_PROC_BROWSER_TEST_F(ChromeOSInfoPrivateTest, DISABLED_TestGetAndSet) {
// Set the initial timezone different from what JS function
// timezoneSetTest() will attempt to set.
profile()->GetPrefs()->SetString(prefs::kUserTimezone, "America/Los_Angeles");
// Check that accessibility settings are set to default values.
PrefService* prefs = profile()->GetPrefs();
ASSERT_FALSE(prefs->GetBoolean(ash::prefs::kAccessibilityLargeCursorEnabled));
ASSERT_FALSE(prefs->GetBoolean(ash::prefs::kAccessibilityStickyKeysEnabled));
ASSERT_FALSE(
prefs->GetBoolean(ash::prefs::kAccessibilitySpokenFeedbackEnabled));
ASSERT_FALSE(
prefs->GetBoolean(ash::prefs::kAccessibilityHighContrastEnabled));
ASSERT_FALSE(prefs->GetBoolean(ash::prefs::kAccessibilityAutoclickEnabled));
ASSERT_FALSE(prefs->GetBoolean(ash::prefs::kAccessibilityCursorColorEnabled));
ASSERT_FALSE(
profile()->GetPrefs()->GetBoolean(ash::prefs::kSendFunctionKeys));
ASSERT_TRUE(RunExtensionTest("chromeos_info_private/basic", {},
{.load_as_component = true}))
<< message_;
// Check that all accessibility settings have been flipped by the test.
ASSERT_TRUE(prefs->GetBoolean(ash::prefs::kAccessibilityLargeCursorEnabled));
ASSERT_TRUE(prefs->GetBoolean(ash::prefs::kAccessibilityStickyKeysEnabled));
ASSERT_TRUE(
prefs->GetBoolean(ash::prefs::kAccessibilitySpokenFeedbackEnabled));
ASSERT_TRUE(prefs->GetBoolean(ash::prefs::kAccessibilityHighContrastEnabled));
ASSERT_TRUE(prefs->GetBoolean(ash::prefs::kAccessibilityAutoclickEnabled));
ASSERT_TRUE(prefs->GetBoolean(ash::prefs::kAccessibilityCursorColorEnabled));
ASSERT_TRUE(prefs->GetBoolean(ash::prefs::kSendFunctionKeys));
}
// docked magnifier and screen magnifier are mutually exclusive. test each of
// them one by one.
IN_PROC_BROWSER_TEST_F(ChromeOSInfoPrivateTest, TestGetAndSetDockedMagnifier) {
PrefService* prefs = profile()->GetPrefs();
ASSERT_FALSE(prefs->GetBoolean(ash::prefs::kDockedMagnifierEnabled));
ASSERT_TRUE(RunExtensionTest("chromeos_info_private/basic",
{.custom_arg = "dockedMagnifier"},
{.load_as_component = true}))
<< message_;
ASSERT_TRUE(prefs->GetBoolean(ash::prefs::kDockedMagnifierEnabled));
}
IN_PROC_BROWSER_TEST_F(ChromeOSInfoPrivateTest, TestGetAndSetScreenMagnifier) {
PrefService* prefs = profile()->GetPrefs();
ASSERT_FALSE(
prefs->GetBoolean(ash::prefs::kAccessibilityScreenMagnifierEnabled));
ASSERT_TRUE(RunExtensionTest("chromeos_info_private/basic",
{.custom_arg = "screenMagnifier"},
{.load_as_component = true}))
<< message_;
ASSERT_TRUE(
prefs->GetBoolean(ash::prefs::kAccessibilityScreenMagnifierEnabled));
}
// TODO(steel): Investigate merging the following tests.
IN_PROC_BROWSER_TEST_F(ChromeOSInfoPrivateTest, Kiosk) {
EnableKioskSession();
ASSERT_TRUE(
RunExtensionTest("chromeos_info_private/extended",
{.custom_arg = "kiosk", .launch_as_platform_app = true}))
<< message_;
}
IN_PROC_BROWSER_TEST_F(ChromeOSInfoPrivateTest, ArcNotAvailable) {
ASSERT_TRUE(RunExtensionTest(
"chromeos_info_private/extended",
{.custom_arg = "arc not-available", .launch_as_platform_app = true}))
<< message_;
}
IN_PROC_BROWSER_TEST_F(ChromeOSInfoPrivateTest, Chromebase) {
ScopedChromeOSVersionInfo version("DEVICETYPE=CHROMEBASE", base::Time::Now());
ASSERT_TRUE(RunExtensionTest(
"chromeos_info_private/extended",
{.custom_arg = "chromebase", .launch_as_platform_app = true}))
<< message_;
}
IN_PROC_BROWSER_TEST_F(ChromeOSInfoPrivateTest, Chromebit) {
ScopedChromeOSVersionInfo version("DEVICETYPE=CHROMEBIT", base::Time::Now());
ASSERT_TRUE(RunExtensionTest(
"chromeos_info_private/extended",
{.custom_arg = "chromebit", .launch_as_platform_app = true}))
<< message_;
}
IN_PROC_BROWSER_TEST_F(ChromeOSInfoPrivateTest, Chromebook) {
ScopedChromeOSVersionInfo version("DEVICETYPE=CHROMEBOOK", base::Time::Now());
ASSERT_TRUE(RunExtensionTest(
"chromeos_info_private/extended",
{.custom_arg = "chromebook", .launch_as_platform_app = true}))
<< message_;
}
IN_PROC_BROWSER_TEST_F(ChromeOSInfoPrivateTest, Chromebox) {
ScopedChromeOSVersionInfo version("DEVICETYPE=CHROMEBOX", base::Time::Now());
ASSERT_TRUE(RunExtensionTest(
"chromeos_info_private/extended",
{.custom_arg = "chromebox", .launch_as_platform_app = true}))
<< message_;
}
IN_PROC_BROWSER_TEST_F(ChromeOSInfoPrivateTest, UnknownDeviceType) {
ScopedChromeOSVersionInfo version("DEVICETYPE=UNKNOWN", base::Time::Now());
ASSERT_TRUE(RunExtensionTest(
"chromeos_info_private/extended",
{.custom_arg = "unknown device type", .launch_as_platform_app = true}))
<< message_;
}
IN_PROC_BROWSER_TEST_F(ChromeOSInfoPrivateTest, AssistantSupported) {
ASSERT_TRUE(RunExtensionTest(
"chromeos_info_private/extended",
{.custom_arg = "assistant supported", .launch_as_platform_app = true}))
<< message_;
}
IN_PROC_BROWSER_TEST_F(ChromeOSInfoPrivateTest, StylusUnsupported) {
ASSERT_TRUE(RunExtensionTest(
"chromeos_info_private/extended",
{.custom_arg = "stylus unsupported", .launch_as_platform_app = true}))
<< message_;
}
IN_PROC_BROWSER_TEST_F(ChromeOSInfoPrivateTest, StylusSupported) {
ui::DeviceDataManagerTestApi test_api;
ui::TouchscreenDevice touchscreen(1,
ui::InputDeviceType::INPUT_DEVICE_INTERNAL,
"Touchscreen", gfx::Size(1024, 768), 0);
touchscreen.has_stylus = true;
test_api.SetTouchscreenDevices({touchscreen});
ASSERT_TRUE(RunExtensionTest(
"chromeos_info_private/extended",
{.custom_arg = "stylus supported", .launch_as_platform_app = true}))
<< message_;
}
// TODO(crbug.com/40564126): Excluded from Mash because pointer events
// aren't seen.
IN_PROC_BROWSER_TEST_F(ChromeOSInfoPrivateTest, StylusSeen) {
ui::DeviceDataManagerTestApi test_api;
ui::TouchscreenDevice touchscreen(1,
ui::InputDeviceType::INPUT_DEVICE_INTERNAL,
"Touchscreen", gfx::Size(1024, 768), 0);
touchscreen.has_stylus = true;
test_api.SetTouchscreenDevices({touchscreen});
ui::test::EventGenerator generator(
browser()->window()->GetNativeWindow()->GetRootWindow());
generator.EnterPenPointerMode();
generator.PressTouch();
generator.ReleaseTouch();
generator.ExitPenPointerMode();
ASSERT_TRUE(RunExtensionTest(
"chromeos_info_private/extended",
{.custom_arg = "stylus seen", .launch_as_platform_app = true}))
<< message_;
}
IN_PROC_BROWSER_TEST_F(ChromeOSInfoPrivateTest, TestGetIsMeetDevice) {
const char* custom_arg =
#if BUILDFLAG(PLATFORM_CFM)
"Is Meet Device - True";
#else
"Is Meet Device - False";
#endif
ASSERT_TRUE(RunExtensionTest(
"chromeos_info_private/extended",
{.custom_arg = custom_arg, .launch_as_platform_app = true}))
<< message_;
}
class ChromeOSInfoPrivateInternalStylusTest : public ChromeOSInfoPrivateTest {
public:
ChromeOSInfoPrivateInternalStylusTest() = default;
ChromeOSInfoPrivateInternalStylusTest(
const ChromeOSInfoPrivateInternalStylusTest&) = delete;
ChromeOSInfoPrivateInternalStylusTest& operator=(
const ChromeOSInfoPrivateInternalStylusTest&) = delete;
~ChromeOSInfoPrivateInternalStylusTest() override = default;
void SetUpCommandLine(base::CommandLine* command_line) override {
ChromeOSInfoPrivateTest::SetUpCommandLine(command_line);
command_line->AppendSwitch(ash::switches::kHasInternalStylus);
}
};
IN_PROC_BROWSER_TEST_F(ChromeOSInfoPrivateInternalStylusTest,
StylusSeenInternal) {
ash::stylus_utils::SetHasStylusInputForTesting();
ASSERT_TRUE(RunExtensionTest(
"chromeos_info_private/extended",
{.custom_arg = "stylus seen", .launch_as_platform_app = true}))
<< message_;
}
class ChromeOSArcInfoPrivateTest : public ChromeOSInfoPrivateTest {
public:
ChromeOSArcInfoPrivateTest() = default;
ChromeOSArcInfoPrivateTest(const ChromeOSArcInfoPrivateTest&) = delete;
ChromeOSArcInfoPrivateTest& operator=(const ChromeOSArcInfoPrivateTest&) =
delete;
~ChromeOSArcInfoPrivateTest() override = default;
void SetUpCommandLine(base::CommandLine* command_line) override {
extensions::ExtensionApiTest::SetUpCommandLine(command_line);
// Make ARC enabled for ArcAvailable/ArcEnabled tests.
arc::SetArcAvailableCommandLineForTesting(command_line);
}
};
IN_PROC_BROWSER_TEST_F(ChromeOSArcInfoPrivateTest, ArcEnabled) {
ASSERT_TRUE(RunExtensionTest(
"chromeos_info_private/extended",
{.custom_arg = "arc enabled", .launch_as_platform_app = true}))
<< message_;
}
IN_PROC_BROWSER_TEST_F(ChromeOSArcInfoPrivateTest, ArcAvailable) {
// Even if ARC is available, ARC may not be able to be enabled. (Please
// see arc::IsArcAllowedForProfile() for details).
// In such cases, we expect "available". However, current testing framework
// does not seem to run with such cases, unfortunately. So, here directly
// control the function.
arc::DisallowArcForTesting();
ASSERT_TRUE(RunExtensionTest(
"chromeos_info_private/extended",
{.custom_arg = "arc available", .launch_as_platform_app = true}))
<< message_;
}
class ChromeOSManagedDeviceInfoPrivateTest : public ChromeOSInfoPrivateTest {
public:
ChromeOSManagedDeviceInfoPrivateTest() = default;
ChromeOSManagedDeviceInfoPrivateTest(
const ChromeOSManagedDeviceInfoPrivateTest&) = delete;
ChromeOSManagedDeviceInfoPrivateTest& operator=(
const ChromeOSManagedDeviceInfoPrivateTest&) = delete;
~ChromeOSManagedDeviceInfoPrivateTest() override = default;
private:
ash::ScopedStubInstallAttributes test_install_attributes_{
ash::StubInstallAttributes::CreateCloudManaged("fake-domain", "fake-id")};
};
IN_PROC_BROWSER_TEST_F(ChromeOSManagedDeviceInfoPrivateTest, Managed) {
ASSERT_TRUE(RunExtensionTest(
"chromeos_info_private/extended",
{.custom_arg = "managed", .launch_as_platform_app = true}))
<< message_;
}
class ChromeOSInfoPrivateDeviceRequisitionTest
: public ChromeOSInfoPrivateTest {
public:
ChromeOSInfoPrivateDeviceRequisitionTest() {
fake_statistics_provider_.SetVpdStatus(
ash::system::StatisticsProvider::VpdStatus::kValid);
}
ChromeOSInfoPrivateDeviceRequisitionTest(
const ChromeOSInfoPrivateDeviceRequisitionTest&) = delete;
ChromeOSInfoPrivateDeviceRequisitionTest& operator=(
const ChromeOSInfoPrivateDeviceRequisitionTest&) = delete;
~ChromeOSInfoPrivateDeviceRequisitionTest() override = default;
protected:
ash::system::ScopedFakeStatisticsProvider fake_statistics_provider_;
};
IN_PROC_BROWSER_TEST_F(ChromeOSInfoPrivateDeviceRequisitionTest,
TestDeviceRequisitionUnset) {
fake_statistics_provider_.ClearMachineStatistic(
ash::system::kOemDeviceRequisitionKey);
ASSERT_TRUE(RunExtensionTest("chromeos_info_private/extended",
{.custom_arg = "Device Requisition - Unset",
.launch_as_platform_app = true}))
<< message_;
}
IN_PROC_BROWSER_TEST_F(ChromeOSInfoPrivateDeviceRequisitionTest,
TestDeviceRequisitionRemora) {
fake_statistics_provider_.SetMachineStatistic(
ash::system::kOemDeviceRequisitionKey, "remora");
ASSERT_TRUE(RunExtensionTest("chromeos_info_private/extended",
{.custom_arg = "Device Requisition - Remora",
.launch_as_platform_app = true}))
<< message_;
}