blob: 539aaf547cb79ca29d4bfdb19a47ffef03a3200a [file] [log] [blame]
// Copyright 2020 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/webui/diagnostics_ui/url_constants.h"
#include "ash/webui/system_apps/public/system_web_app_type.h"
#include "base/test/metrics/histogram_tester.h"
#include "chrome/browser/ash/system_web_apps/test_support/system_web_app_integration_test.h"
#include "chrome/browser/lifetime/application_lifetime_desktop.h"
#include "chrome/browser/ui/ash/system_web_apps/system_web_app_ui_utils.h"
#include "chrome/browser/ui/browser_commands.h"
#include "chrome/test/base/ui_test_utils.h"
#include "content/public/browser/web_contents.h"
#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/base/window_open_disposition.h"
#include "url/gurl.h"
namespace {
// Same as apps::DefaultAppName::kDiagnosticsApp enum.
const size_t kDiagnosticsApp = 42;
const char kDiagnosticsUmaFeatureFullPath[] =
"ChromeOS.FeatureUsage.DiagnosticsUi";
const char kDiagnosticsUmaFeatureUsetimeFullPath[] =
"ChromeOS.FeatureUsage.DiagnosticsUi.Usetime";
const char kDiagnosticsUmaOpenDurationFullPath[] =
"ChromeOS.DiagnosticsUi.OpenDuration";
const char kFromChromeLaunch[] = "Apps.DefaultAppLaunch.FromChromeInternal";
const char kFindDiagnosticsAppScript[] =
R"(document.querySelectorAll('diagnostics-app').length === 1)";
// Same as feature_usage::FeatureUsageMetrics::Event::kUsedWithSuccess enum.
const size_t kUsedWithSuccess = 2;
} // namespace
class DiagnosticsAppIntegrationTest : public ash::SystemWebAppIntegrationTest {
public:
DiagnosticsAppIntegrationTest() = default;
protected:
base::HistogramTester histogram_tester_;
content::WebContents* LaunchDiagnosticsApp(
const std::string override_url = "") {
WaitForTestSystemAppInstall();
auto params = GetAppLaunchParams(override_url);
return LaunchApp(std::move(params));
}
apps::AppLaunchParams GetAppLaunchParams(
const std::string override_url = "") {
auto params = LaunchParamsForApp(ash::SystemWebAppType::DIAGNOSTICS);
// Override starting URL when provided.
if (override_url != "") {
params.override_url = GURL(override_url);
}
return params;
}
};
// Test that the Diagnostics App installs and launches correctly by running some
// spot checks on the manifest.
IN_PROC_BROWSER_TEST_P(DiagnosticsAppIntegrationTest,
DiagnosticsAppInLauncher) {
const GURL url(ash::kChromeUIDiagnosticsAppUrl);
EXPECT_NO_FATAL_FAILURE(ExpectSystemWebAppValid(
ash::SystemWebAppType::DIAGNOSTICS, url, "Diagnostics"));
}
IN_PROC_BROWSER_TEST_P(DiagnosticsAppIntegrationTest, LaunchMetricsTest) {
WaitForTestSystemAppInstall();
ash::LaunchSystemWebAppAsync(profile(), ash::SystemWebAppType::DIAGNOSTICS);
histogram_tester_.ExpectUniqueSample(kFromChromeLaunch, kDiagnosticsApp, 1);
}
IN_PROC_BROWSER_TEST_P(DiagnosticsAppIntegrationTest, UsageMetricsTest) {
WaitForTestSystemAppInstall();
Browser* system_app_browser;
// Launch app and allow UI to load.
LaunchApp(ash::SystemWebAppType::DIAGNOSTICS, &system_app_browser);
// Find system browser for diagnostics and close it to trigger usage metrics.
EXPECT_TRUE(ash::IsSystemWebApp(system_app_browser));
chrome::CloseWindow(system_app_browser);
ui_test_utils::WaitForBrowserToClose();
histogram_tester_.ExpectBucketCount(kDiagnosticsUmaFeatureFullPath,
kUsedWithSuccess, 1);
histogram_tester_.ExpectTotalCount(kDiagnosticsUmaFeatureUsetimeFullPath, 1);
histogram_tester_.ExpectTotalCount(kDiagnosticsUmaOpenDurationFullPath, 1);
}
IN_PROC_BROWSER_TEST_P(DiagnosticsAppIntegrationTest,
DiagnosticsAppRecordsInitialScreen) {
LaunchDiagnosticsApp();
// One maps to the "CrosDiagnosticsNavigationView" system enum.
histogram_tester_.ExpectUniqueSample("ChromeOS.DiagnosticsUi.InitialScreen",
0, 1);
}
IN_PROC_BROWSER_TEST_P(DiagnosticsAppIntegrationTest,
DiagnosticsAppRecordsInitialScreenSystem) {
// Launch Diagnostics at System UI.
LaunchDiagnosticsApp("chrome://diagnostics/?system");
// One maps to the "CrosDiagnosticsNavigationView" system enum.
histogram_tester_.ExpectUniqueSample("ChromeOS.DiagnosticsUi.InitialScreen",
0, 1);
}
IN_PROC_BROWSER_TEST_P(DiagnosticsAppIntegrationTest,
DiagnosticsAppRecordsInitialScreenConnectivity) {
// Launch Diagnostics at Connectivity UI.
LaunchDiagnosticsApp("chrome://diagnostics/?connectivity");
// One maps to the "CrosDiagnosticsNavigationView" connectivity enum.
histogram_tester_.ExpectUniqueSample("ChromeOS.DiagnosticsUi.InitialScreen",
1, 1);
}
IN_PROC_BROWSER_TEST_P(DiagnosticsAppIntegrationTest,
DiagnosticsAppRecordsInitialScreenInput) {
// Launch Diagnostics at Input UI.
LaunchDiagnosticsApp("chrome://diagnostics/?input");
// One maps to the "CrosDiagnosticsNavigationView" input enum.
histogram_tester_.ExpectUniqueSample("ChromeOS.DiagnosticsUi.InitialScreen",
2, 1);
}
IN_PROC_BROWSER_TEST_P(DiagnosticsAppIntegrationTest,
DiagnosticsAppRecordsScreenOpenDuration) {
content::WebContents* web_contents = LaunchDiagnosticsApp();
histogram_tester_.ExpectUniqueSample("ChromeOS.DiagnosticsUi.InitialScreen",
0, 1);
EXPECT_TRUE(content::ExecJs(web_contents,
"chrome.send('recordNavigation', [0, 1]);"));
chrome::CloseAllBrowsers();
histogram_tester_.ExpectTotalCount(
"ChromeOS.DiagnosticsUi.System.OpenDuration", 1);
histogram_tester_.ExpectTotalCount(
"ChromeOS.DiagnosticsUi.Connectivity.OpenDuration", 1);
}
IN_PROC_BROWSER_TEST_P(DiagnosticsAppIntegrationTest,
DiagnosticsAppIgnoresInvalidRecordNavigationCall) {
content::WebContents* web_contents = LaunchDiagnosticsApp();
histogram_tester_.ExpectUniqueSample("ChromeOS.DiagnosticsUi.InitialScreen",
0, 1);
// Simulate sending invalid navigation view value.
EXPECT_TRUE(content::ExecJs(
web_contents, "chrome.send('recordNavigation', [1000, -550]);"));
EXPECT_TRUE(content::ExecJs(
web_contents, "chrome.send('recordNavigation', ['1000', '-550']);"));
EXPECT_TRUE(
content::ExecJs(web_contents, "chrome.send('recordNavigation');"));
EXPECT_TRUE(
content::ExecJs(web_contents, "chrome.send('recordNavigation', []);"));
chrome::CloseAllBrowsers();
histogram_tester_.ExpectTotalCount(
"ChromeOS.DiagnosticsUi.System.OpenDuration", 1);
histogram_tester_.ExpectTotalCount(
"ChromeOS.DiagnosticsUi.Connectivity.OpenDuration", 0);
histogram_tester_.ExpectTotalCount(
"ChromeOS.DiagnosticsUi.Input.OpenDuration", 0);
}
IN_PROC_BROWSER_TEST_P(DiagnosticsAppIntegrationTest,
DiagnosticsAppCapturesNavigation) {
auto* app_web_contents = LaunchDiagnosticsApp();
const auto* app_browser = ash::FindSystemWebAppBrowser(
profile(), ash::SystemWebAppType::DIAGNOSTICS);
EXPECT_TRUE(app_browser);
// DiagnosticsApp launched in its own browser.
EXPECT_NE(browser(), app_browser);
// Attempting to navigate to app URL returns to the existing window with
// DiagnosticsSystemAppDelegate::ShouldCaptureNavigations() set to true.
const GURL url(ash::kChromeUIDiagnosticsAppUrl);
ui_test_utils::NavigateToURLWithDispositionBlockUntilNavigationsComplete(
browser(), url, /*number_of_navigations=*/2,
WindowOpenDisposition::CURRENT_TAB, /*browser_test_flags=*/0);
auto* browser_web_contents =
browser()->tab_strip_model()->GetActiveWebContents();
EXPECT_FALSE(content::EvalJs(browser_web_contents, kFindDiagnosticsAppScript)
.ExtractBool());
EXPECT_TRUE(content::EvalJs(app_web_contents, kFindDiagnosticsAppScript)
.ExtractBool());
}
INSTANTIATE_SYSTEM_WEB_APP_MANAGER_TEST_SUITE_REGULAR_PROFILE_P(
DiagnosticsAppIntegrationTest);