blob: 147412ef55cbedc043bd9c76b217ab01845ee1a9 [file] [log] [blame]
// 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/ui/views/crostini/crostini_update_component_view.h"
#include "ash/constants/ash_features.h"
#include "base/metrics/histogram_base.h"
#include "base/run_loop.h"
#include "base/test/metrics/histogram_tester.h"
#include "base/test/scoped_feature_list.h"
#include "chrome/browser/ash/crostini/crostini_manager.h"
#include "chrome/browser/ash/crostini/crostini_util.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/views/crostini/crostini_dialogue_browser_test_util.h"
#include "chrome/browser/ui/web_applications/system_web_app_ui_utils.h"
#include "chrome/browser/web_applications/system_web_apps/system_web_app_manager.h"
#include "chrome/browser/web_applications/web_app_provider.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "chromeos/dbus/concierge/fake_concierge_client.h"
#include "chromeos/dbus/dbus_thread_manager.h"
#include "components/crx_file/id_util.h"
#include "content/public/browser/web_contents_observer.h"
#include "content/public/test/browser_test.h"
#include "testing/gtest/include/gtest/gtest.h"
class CrostiniUpdateComponentViewBrowserTest
: public CrostiniDialogBrowserTest {
public:
CrostiniUpdateComponentViewBrowserTest()
: CrostiniDialogBrowserTest(true /*register_termina*/) {
// TODO(crbug/953544) DLC makes this entire feature redundant, so once we're
// committed to it delete all of this.
scoped_feature_list_.InitAndDisableFeature(
chromeos::features::kCrostiniUseDlc);
}
// DialogBrowserTest:
void ShowUi(const std::string& name) override {
ShowCrostiniUpdateComponentView(browser()->profile(),
crostini::CrostiniUISurface::kAppList);
}
CrostiniUpdateComponentView* ActiveView() {
return CrostiniUpdateComponentView::GetActiveViewForTesting();
}
bool HasAcceptButton() { return ActiveView()->GetOkButton() != nullptr; }
bool HasCancelButton() { return ActiveView()->GetCancelButton() != nullptr; }
void WaitForViewDestroyed() {
base::RunLoop().RunUntilIdle();
ExpectNoView();
}
void ExpectView() {
// A new Widget was created in ShowUi() or since the last VerifyUi().
EXPECT_TRUE(VerifyUi());
// There is one view, and it's ours.
EXPECT_NE(nullptr, ActiveView());
}
void ExpectNoView() {
// No new Widget was created in ShowUi() or since the last VerifyUi().
EXPECT_FALSE(VerifyUi());
// Our view has really been deleted.
EXPECT_EQ(nullptr, ActiveView());
}
private:
base::test::ScopedFeatureList scoped_feature_list_;
};
// Test the dialog is actually launched.
IN_PROC_BROWSER_TEST_F(CrostiniUpdateComponentViewBrowserTest,
InvokeUi_default) {
ShowAndVerifyUi();
}
IN_PROC_BROWSER_TEST_F(CrostiniUpdateComponentViewBrowserTest, HitOK) {
base::HistogramTester histogram_tester;
ShowUi("default");
ExpectView();
EXPECT_EQ(ui::DIALOG_BUTTON_OK, ActiveView()->GetDialogButtons());
EXPECT_TRUE(HasAcceptButton());
EXPECT_FALSE(HasCancelButton());
ActiveView()->AcceptDialog();
EXPECT_TRUE(ActiveView()->GetWidget()->IsClosed());
WaitForViewDestroyed();
histogram_tester.ExpectUniqueSample(
"Crostini.UpgradeSource",
static_cast<base::HistogramBase::Sample>(
crostini::CrostiniUISurface::kAppList),
1);
}
IN_PROC_BROWSER_TEST_F(CrostiniUpdateComponentViewBrowserTest,
LaunchAppOnline_UpgradeNeeded) {
base::HistogramTester histogram_tester;
crostini::CrostiniManager::GetForProfile(browser()->profile())
->MaybeUpdateCrostini();
ExpectNoView();
UnregisterTermina();
crostini::LaunchCrostiniApp(browser()->profile(),
crostini::kCrostiniTerminalSystemAppId, 0);
ExpectNoView();
}
IN_PROC_BROWSER_TEST_F(CrostiniUpdateComponentViewBrowserTest,
LaunchAppOffline_UpgradeNeeded) {
// Ensure Terminal System App is installed.
web_app::WebAppProvider::Get(browser()->profile())
->system_web_app_manager()
.InstallSystemAppsForTesting();
base::HistogramTester histogram_tester;
SetConnectionType(network::mojom::ConnectionType::CONNECTION_NONE);
crostini::CrostiniManager::GetForProfile(browser()->profile())
->MaybeUpdateCrostini();
ExpectNoView();
UnregisterTermina();
crostini::LaunchCrostiniApp(browser()->profile(),
crostini::kCrostiniTerminalSystemAppId, 0);
// For Terminal System App, we must wait for browser to load.
Browser* terminal_browser = web_app::FindSystemWebAppBrowser(
browser()->profile(), web_app::SystemAppType::TERMINAL);
CHECK_NE(nullptr, terminal_browser);
WaitForLoadFinished(terminal_browser->tab_strip_model()->GetWebContentsAt(0));
ExpectView();
ActiveView()->AcceptDialog();
EXPECT_TRUE(ActiveView()->GetWidget()->IsClosed());
WaitForViewDestroyed();
histogram_tester.ExpectUniqueSample(
"Crostini.UpgradeSource",
static_cast<base::HistogramBase::Sample>(
crostini::CrostiniUISurface::kAppList),
1);
}