Commit a667daa5 authored by Joel Hockey's avatar Joel Hockey Committed by Commit Bot

Update terminal startup status to be less verbose

Using mocks as provided by @benwells

Bug: 1016680
Change-Id: I4f94640a6aa60c99ae3c7fb417bc498b7db2dfa9
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2040799
Commit-Queue: Joel Hockey <joelhockey@chromium.org>
Reviewed-by: default avatarJason Lin <lxj@google.com>
Auto-Submit: Joel Hockey <joelhockey@chromium.org>
Cr-Commit-Position: refs/heads/master@{#739291}
parent f58dcb74
......@@ -13,8 +13,6 @@
#include "chrome/browser/chromeos/crostini/crostini_manager.h"
#include "chrome/browser/chromeos/crostini/crostini_simple_types.h"
using crostini::mojom::InstallerState;
namespace extensions {
// Displays startup status to the crostini terminal.
......@@ -26,8 +24,8 @@ class CrostiniStartupStatus
base::OnceClosure callback);
~CrostiniStartupStatus() override;
// Updates the status line every 300ms.
void ShowStatusLineAtInterval();
// Updates the progress spinner every 300ms.
void ShowProgressAtInterval();
// Deletes this object when called.
void OnCrostiniRestarted(crostini::CrostiniResult result);
......@@ -37,37 +35,22 @@ class CrostiniStartupStatus
FRIEND_TEST_ALL_PREFIXES(CrostiniStartupStatusTest, TestVerbose);
// crostini::CrostiniManager::RestartObserver
void OnStageStarted(InstallerState stage) override;
void OnComponentLoaded(crostini::CrostiniResult result) override;
void OnConciergeStarted(bool success) override;
void OnDiskImageCreated(bool success,
vm_tools::concierge::DiskImageStatus status,
int64_t disk_size_available) override;
void OnVmStarted(bool success) override;
void OnStageStarted(crostini::mojom::InstallerState stage) override;
void OnContainerDownloading(int32_t download_percent) override;
void OnContainerCreated(crostini::CrostiniResult result) override;
void OnContainerSetup(bool success) override;
void OnContainerStarted(crostini::CrostiniResult result) override;
void OnSshKeysFetched(bool success) override;
void OnContainerMounted(bool success) override;
void PrintStatusLine();
void Print(const std::string& output);
void PrintWithTimestamp(const std::string& output);
// Moves cursor up and to the right to previous line before status line before
// printing output.
void PrintResult(const std::string& output);
void PrintCrostiniResult(crostini::CrostiniResult result);
void PrintSuccess(bool success);
void PrintProgress();
void PrintStage(const char* color, const std::string& output);
void PrintAfterStage(const char* color, const std::string& output);
base::RepeatingCallback<void(const std::string& output)> print_;
const bool verbose_;
base::OnceClosure callback_;
int spinner_index_ = 0;
int progress_index_ = 0;
// Position of cursor on line above status line.
int cursor_position_ = 0;
InstallerState stage_ = InstallerState::kStart;
int stage_index_ = 0;
int end_of_line_index_ = 0;
crostini::mojom::InstallerState stage_ =
crostini::mojom::InstallerState::kStart;
base::WeakPtrFactory<CrostiniStartupStatus> weak_factory_{this};
};
......
......@@ -11,6 +11,8 @@
#include "chrome/browser/chromeos/crostini/crostini_simple_types.h"
#include "testing/gtest/include/gtest/gtest.h"
using crostini::mojom::InstallerState;
namespace extensions {
class CrostiniStartupStatusTest : public testing::Test {
......@@ -40,45 +42,41 @@ TEST_F(CrostiniStartupStatusTest, TestNotVerbose) {
auto* startup_status = NewStartupStatus(false);
startup_status->OnStageStarted(InstallerState::kStart);
startup_status->OnStageStarted(InstallerState::kInstallImageLoader);
startup_status->OnComponentLoaded(crostini::CrostiniResult::SUCCESS);
startup_status->OnCrostiniRestarted(crostini::CrostiniResult::SUCCESS);
EXPECT_TRUE(done_);
// Hides cursor, shows cursor.
EXPECT_EQ(output_.size(), 2u);
EXPECT_EQ(output_[0], "\x1b[?25l");
EXPECT_EQ(output_[1], "\x1b[?25h");
// Hide cursor, init progress.
EXPECT_EQ(output_[0], "\x1b[?25l\x1b[35m[ ] ");
// CR, delete line, default color, show cursor.
EXPECT_EQ(output_[1], "\r\x1b[K\x1b[0m\x1b[?25h");
}
TEST_F(CrostiniStartupStatusTest, TestVerbose) {
auto* startup_status = NewStartupStatus(true);
startup_status->OnStageStarted(InstallerState::kStart);
startup_status->OnStageStarted(InstallerState::kInstallImageLoader);
startup_status->OnComponentLoaded(crostini::CrostiniResult::SUCCESS);
startup_status->OnCrostiniRestarted(crostini::CrostiniResult::SUCCESS);
EXPECT_TRUE(done_);
// Hides cursor, version, start, status, component, status, done, status,
// ready, shows cursor.
EXPECT_EQ(output_.size(), 10u);
EXPECT_EQ(output_[0], "\x1b[?25l");
EXPECT_EQ(output_[1].find("Chrome OS "), 24u);
EXPECT_EQ(output_[2].substr(24), "Starting... 🤔\r\n");
EXPECT_EQ(output_[3],
"[\x1b[7m \x1b[27m\x1b[35m........\x1b[0m] \x1b[34m|\x1b[0m\r");
EXPECT_EQ(output_[4].substr(24), "Checking cros-termina component...\r\n");
EXPECT_EQ(output_[5],
"[\x1b[7m \x1b[27m\x1b[35m.......\x1b[0m] \x1b[34m|\x1b[0m\r");
std::string expected = "\x1b[A";
for (int i = 0; i < 59; ++i)
expected += "\x1b[C";
expected += "\x1b[32mdone\x1b[0m \xE2\x9C\x94\xEF\xb8\x8F\r\n";
EXPECT_EQ(output_[6], expected);
EXPECT_EQ(output_[7],
"[\x1b[7m \x1b[27m\x1b[35m.......\x1b[0m] \x1b[34m|\x1b[0m\r");
EXPECT_EQ(output_[8].find("Ready"), 24u);
EXPECT_EQ(output_[9], "\x1b[?25h");
EXPECT_EQ(output_.size(), 6u);
// Hide cursor, init progress.
EXPECT_EQ(output_[0], "\x1b[?25l\x1b[35m[ ] ");
// CR, purple, forward 11, yellow, stage.
EXPECT_EQ(output_[1], "\r\x1b[35m[\x1b[11C\x1b[K\x1b[33mInitializing ");
// CR, purple, progress, forward 10, erase, yellow, stage.
EXPECT_EQ(
output_[2],
"\r\x1b[35m[=\x1b[10C\x1b[K\x1b[33mChecking cros-termina component ");
// CR, purple, progress, forward 2, erase, green, done, symbol, CRLF.
EXPECT_EQ(output_[3], "\r\x1b[35m[=========\x1b[2C\x1b[K\x1b[1;32mdone ");
// CR, delete line, default color, show cursor;
EXPECT_EQ(output_[5], "\r\x1b[K\x1b[0m\x1b[?25h");
}
} // namespace extensions
......@@ -240,7 +240,7 @@ TerminalPrivateOpenTerminalProcessFunction::Run() {
api::terminal_private::ToString(
api::terminal_private::OUTPUT_TYPE_STDOUT)),
verbose, std::move(open_process));
observer->ShowStatusLineAtInterval();
observer->ShowProgressAtInterval();
mgr->RestartCrostini(
vm_name, container_name,
base::BindOnce(&CrostiniStartupStatus::OnCrostiniRestarted,
......
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