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