Commit 884ad169 authored by Joel Hockey's avatar Joel Hockey Committed by Commit Bot

Delay crostini startup status

Delay first progress output for startup status
so that terminal opened when crostini is
already running should expect no display.
Removed emojis.

Bug: 1016680
Change-Id: Iedd177241430980b6232bbd3d08343a1437f0009
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2096060
Auto-Submit: Joel Hockey <joelhockey@chromium.org>
Commit-Queue: Jason Lin <lxj@google.com>
Reviewed-by: default avatarJason Lin <lxj@google.com>
Cr-Commit-Position: refs/heads/master@{#749003}
parent d17bd6e2
...@@ -34,10 +34,6 @@ const char kColor5Purple[] = "\x1b[35m"; ...@@ -34,10 +34,6 @@ const char kColor5Purple[] = "\x1b[35m";
const char kEraseInLine[] = "\x1b[K"; const char kEraseInLine[] = "\x1b[K";
const char kSpinner[] = "|/-\\"; const char kSpinner[] = "|/-\\";
const int kMaxStage = 9; const int kMaxStage = 9;
const char kErrorSymbol[] = "☠️";
const base::NoDestructor<std::vector<std::string>> kSuccessSymbol({"😺", "🐹",
"🐼", "🐸",
"🐶", "🐬"});
std::string MoveForward(int i) { std::string MoveForward(int i) {
return base::StringPrintf("\x1b[%dC", i); return base::StringPrintf("\x1b[%dC", i);
...@@ -49,9 +45,6 @@ CrostiniStartupStatus::CrostiniStartupStatus( ...@@ -49,9 +45,6 @@ CrostiniStartupStatus::CrostiniStartupStatus(
base::RepeatingCallback<void(const std::string&)> print, base::RepeatingCallback<void(const std::string&)> print,
bool verbose) bool verbose)
: print_(std::move(print)), verbose_(verbose) { : print_(std::move(print)), verbose_(verbose) {
// Initialize Progress
Print(base::StringPrintf("%s%s[%s] ", kCursorHide, kColor5Purple,
std::string(kMaxStage, ' ').c_str()));
} }
CrostiniStartupStatus::~CrostiniStartupStatus() = default; CrostiniStartupStatus::~CrostiniStartupStatus() = default;
...@@ -61,13 +54,11 @@ void CrostiniStartupStatus::OnCrostiniRestarted( ...@@ -61,13 +54,11 @@ void CrostiniStartupStatus::OnCrostiniRestarted(
if (result != crostini::CrostiniResult::SUCCESS) { if (result != crostini::CrostiniResult::SUCCESS) {
PrintAfterStage( PrintAfterStage(
kColor1RedBright, kColor1RedBright,
base::StringPrintf("Error starting penguin container: %d %s\r\n", base::StringPrintf("Error starting penguin container: %d\r\n", result));
result, kErrorSymbol));
} else { } else {
if (verbose_) { if (verbose_) {
stage_index_ = kMaxStage + 1; // done. stage_index_ = kMaxStage + 1; // done.
PrintStage(kColor2GreenBright, "done"); PrintStage(kColor2GreenBright, "done\r\n");
Print((*kSuccessSymbol)[rand() % kSuccessSymbol->size()] + "\r\n");
} }
} }
Print( Print(
...@@ -77,8 +68,11 @@ void CrostiniStartupStatus::OnCrostiniRestarted( ...@@ -77,8 +68,11 @@ void CrostiniStartupStatus::OnCrostiniRestarted(
void CrostiniStartupStatus::ShowProgressAtInterval() { void CrostiniStartupStatus::ShowProgressAtInterval() {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI); DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
// Wait one interval before showing progress.
if (spinner_index_ > 0) {
PrintProgress();
}
++spinner_index_; ++spinner_index_;
PrintProgress();
base::PostDelayedTask( base::PostDelayedTask(
FROM_HERE, {content::BrowserThread::UI}, FROM_HERE, {content::BrowserThread::UI},
base::BindOnce(&CrostiniStartupStatus::ShowProgressAtInterval, base::BindOnce(&CrostiniStartupStatus::ShowProgressAtInterval,
...@@ -98,11 +92,13 @@ void CrostiniStartupStatus::OnStageStarted(InstallerState stage) { ...@@ -98,11 +92,13 @@ void CrostiniStartupStatus::OnStageStarted(InstallerState stage) {
kStartStrings({ kStartStrings({
{InstallerState::kStart, "Initializing"}, {InstallerState::kStart, "Initializing"},
{InstallerState::kInstallImageLoader, {InstallerState::kInstallImageLoader,
"Checking cros-termina component"}, "Checking cros-termina component installed"},
{InstallerState::kStartConcierge, "Starting VM controller"}, {InstallerState::kStartConcierge, "Starting VM controller"},
{InstallerState::kCreateDiskImage, "Creating termina VM image"}, {InstallerState::kCreateDiskImage,
"Checking termina VM image installed"},
{InstallerState::kStartTerminaVm, "Starting termina VM"}, {InstallerState::kStartTerminaVm, "Starting termina VM"},
{InstallerState::kCreateContainer, "Creating penguin container"}, {InstallerState::kCreateContainer,
"Checking penguin container installed"},
{InstallerState::kSetupContainer, "Checking penguin container setup"}, {InstallerState::kSetupContainer, "Checking penguin container setup"},
{InstallerState::kStartContainer, "Starting penguin container"}, {InstallerState::kStartContainer, "Starting penguin container"},
{InstallerState::kFetchSshKeys, {InstallerState::kFetchSshKeys,
...@@ -123,7 +119,17 @@ void CrostiniStartupStatus::Print(const std::string& output) { ...@@ -123,7 +119,17 @@ void CrostiniStartupStatus::Print(const std::string& output) {
print_.Run(output); print_.Run(output);
} }
void CrostiniStartupStatus::InitializeProgress() {
if (progress_initialized_) {
return;
}
progress_initialized_ = true;
Print(base::StringPrintf("%s%s[%s] ", kCursorHide, kColor5Purple,
std::string(kMaxStage, ' ').c_str()));
}
void CrostiniStartupStatus::PrintProgress() { void CrostiniStartupStatus::PrintProgress() {
InitializeProgress();
Print(base::StringPrintf("\r%s%s%c", MoveForward(stage_index_).c_str(), Print(base::StringPrintf("\r%s%s%c", MoveForward(stage_index_).c_str(),
kColor5Purple, kSpinner[spinner_index_ & 0x3])); kColor5Purple, kSpinner[spinner_index_ & 0x3]));
} }
...@@ -131,6 +137,7 @@ void CrostiniStartupStatus::PrintProgress() { ...@@ -131,6 +137,7 @@ void CrostiniStartupStatus::PrintProgress() {
void CrostiniStartupStatus::PrintStage(const char* color, void CrostiniStartupStatus::PrintStage(const char* color,
const std::string& output) { const std::string& output) {
DCHECK_GE(stage_index_, 1); DCHECK_GE(stage_index_, 1);
InitializeProgress();
std::string progress(stage_index_ - 1, '='); std::string progress(stage_index_ - 1, '=');
Print(base::StringPrintf("\r%s[%s%s%s%s%s ", kColor5Purple, progress.c_str(), Print(base::StringPrintf("\r%s[%s%s%s%s%s ", kColor5Purple, progress.c_str(),
MoveForward(3 + (kMaxStage - stage_index_)).c_str(), MoveForward(3 + (kMaxStage - stage_index_)).c_str(),
...@@ -140,6 +147,7 @@ void CrostiniStartupStatus::PrintStage(const char* color, ...@@ -140,6 +147,7 @@ void CrostiniStartupStatus::PrintStage(const char* color,
void CrostiniStartupStatus::PrintAfterStage(const char* color, void CrostiniStartupStatus::PrintAfterStage(const char* color,
const std::string& output) { const std::string& output) {
InitializeProgress();
Print(base::StringPrintf("\r%s%s%s", MoveForward(end_of_line_index_).c_str(), Print(base::StringPrintf("\r%s%s%s", MoveForward(end_of_line_index_).c_str(),
color, output.c_str())); color, output.c_str()));
end_of_line_index_ += output.size(); end_of_line_index_ += output.size();
......
...@@ -38,12 +38,14 @@ class CrostiniStartupStatus ...@@ -38,12 +38,14 @@ class CrostiniStartupStatus
void OnContainerDownloading(int32_t download_percent) override; void OnContainerDownloading(int32_t download_percent) override;
void Print(const std::string& output); void Print(const std::string& output);
void InitializeProgress();
void PrintProgress(); void PrintProgress();
void PrintStage(const char* color, const std::string& output); void PrintStage(const char* color, const std::string& output);
void PrintAfterStage(const char* color, const std::string& output); void PrintAfterStage(const char* color, const std::string& output);
base::RepeatingCallback<void(const std::string& output)> print_; base::RepeatingCallback<void(const std::string& output)> print_;
const bool verbose_; const bool verbose_;
bool progress_initialized_ = false;
int spinner_index_ = 0; int spinner_index_ = 0;
int stage_index_ = 0; int stage_index_ = 0;
int end_of_line_index_ = 0; int end_of_line_index_ = 0;
......
...@@ -42,11 +42,9 @@ TEST_F(CrostiniStartupStatusTest, TestNotVerbose) { ...@@ -42,11 +42,9 @@ TEST_F(CrostiniStartupStatusTest, TestNotVerbose) {
startup_status->OnStageStarted(InstallerState::kInstallImageLoader); startup_status->OnStageStarted(InstallerState::kInstallImageLoader);
startup_status->OnCrostiniRestarted(crostini::CrostiniResult::SUCCESS); startup_status->OnCrostiniRestarted(crostini::CrostiniResult::SUCCESS);
EXPECT_EQ(output_.size(), 2u); EXPECT_EQ(output_.size(), 1u);
// Hide cursor, init progress.
EXPECT_EQ(output_[0], "\x1b[?25l\x1b[35m[ ] ");
// CR, delete line, default color, show cursor. // CR, delete line, default color, show cursor.
EXPECT_EQ(output_[1], "\r\x1b[K\x1b[0m\x1b[?25h"); EXPECT_EQ(output_[0], "\r\x1b[K\x1b[0m\x1b[?25h");
} }
TEST_F(CrostiniStartupStatusTest, TestVerbose) { TEST_F(CrostiniStartupStatusTest, TestVerbose) {
...@@ -55,7 +53,7 @@ TEST_F(CrostiniStartupStatusTest, TestVerbose) { ...@@ -55,7 +53,7 @@ TEST_F(CrostiniStartupStatusTest, TestVerbose) {
startup_status->OnStageStarted(InstallerState::kInstallImageLoader); startup_status->OnStageStarted(InstallerState::kInstallImageLoader);
startup_status->OnCrostiniRestarted(crostini::CrostiniResult::SUCCESS); startup_status->OnCrostiniRestarted(crostini::CrostiniResult::SUCCESS);
EXPECT_EQ(output_.size(), 6u); EXPECT_EQ(output_.size(), 5u);
// Hide cursor, init progress. // Hide cursor, init progress.
EXPECT_EQ(output_[0], "\x1b[?25l\x1b[35m[ ] "); EXPECT_EQ(output_[0], "\x1b[?25l\x1b[35m[ ] ");
...@@ -63,15 +61,15 @@ TEST_F(CrostiniStartupStatusTest, TestVerbose) { ...@@ -63,15 +61,15 @@ TEST_F(CrostiniStartupStatusTest, TestVerbose) {
EXPECT_EQ(output_[1], "\r\x1b[35m[\x1b[11C\x1b[K\x1b[33mInitializing "); EXPECT_EQ(output_[1], "\r\x1b[35m[\x1b[11C\x1b[K\x1b[33mInitializing ");
// CR, purple, progress, forward 10, erase, yellow, stage. // CR, purple, progress, forward 10, erase, yellow, stage.
EXPECT_EQ( EXPECT_EQ(output_[2],
output_[2], "\r\x1b[35m[=\x1b[10C\x1b[K\x1b[33mChecking cros-termina component "
"\r\x1b[35m[=\x1b[10C\x1b[K\x1b[33mChecking cros-termina component "); "installed ");
// CR, purple, progress, forward 2, erase, green, done, symbol, CRLF. // CR, purple, progress, forward 2, erase, green, done, symbol, CRLF.
EXPECT_EQ(output_[3], "\r\x1b[35m[=========\x1b[2C\x1b[K\x1b[1;32mdone "); EXPECT_EQ(output_[3], "\r\x1b[35m[=========\x1b[2C\x1b[K\x1b[1;32mdone\r\n ");
// CR, delete line, default color, show cursor; // CR, delete line, default color, show cursor;
EXPECT_EQ(output_[5], "\r\x1b[K\x1b[0m\x1b[?25h"); EXPECT_EQ(output_[4], "\r\x1b[K\x1b[0m\x1b[?25h");
} }
} // namespace extensions } // namespace extensions
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