diff options
author | 2023-06-24 15:03:28 -0700 | |
---|---|---|
committer | 2023-06-24 15:13:49 -0700 | |
commit | eadb0fbee0c545711467f8ae3bc54bfb8931866e (patch) | |
tree | 5ae7df92fb7c1a96036e99ba463f148ce88297dc /ui/terminal/status_test.go | |
parent | 2f99c47a87740448a215cb88dfd851f204732899 (diff) |
After a build action fails, stop printing more output.
Often the slow commands (errorprone happens to be particularly bad)
print a lot, so this should make it easier to find the error without
lots of scrolling.
This doesn't attempt to parse the output and re-display errors, so
if a command prints a thousand warnings with one error in the middle,
it'll still be hard to find the error.
Bug: 277114612
Test: cd build/soong/ui/terminal ; go test
Change-Id: I6c8285fc2c6e4fc345de57b2c15bc5e7d46b1d1f
Diffstat (limited to 'ui/terminal/status_test.go')
-rw-r--r-- | ui/terminal/status_test.go | 156 |
1 files changed, 156 insertions, 0 deletions
diff --git a/ui/terminal/status_test.go b/ui/terminal/status_test.go index b9057d298..8dd180967 100644 --- a/ui/terminal/status_test.go +++ b/ui/terminal/status_test.go @@ -295,3 +295,159 @@ func TestSmartStatusOutputWidthChange(t *testing.T) { t.Errorf("want:\n%q\ngot:\n%q", w, g) } } + +func TestSmartStatusDoesntHideAfterSucecss(t *testing.T) { + os.Setenv(tableHeightEnVar, "") + + smart := &fakeSmartTerminal{termWidth: 40} + stat := NewStatusOutput(smart, "", false, false, false) + smartStat := stat.(*smartStatusOutput) + smartStat.sigwinchHandled = make(chan bool) + + runner := newRunner(stat, 2) + + action1 := &status.Action{Description: "action1"} + result1 := status.ActionResult{ + Action: action1, + Output: "Output1", + } + + action2 := &status.Action{Description: "action2"} + result2 := status.ActionResult{ + Action: action2, + Output: "Output2", + } + + runner.startAction(action1) + runner.startAction(action2) + runner.finishAction(result1) + runner.finishAction(result2) + + stat.Flush() + + w := "\r\x1b[1m[ 0% 0/2] action1\x1b[0m\x1b[K\r\x1b[1m[ 0% 0/2] action2\x1b[0m\x1b[K\r\x1b[1m[ 50% 1/2] action1\x1b[0m\x1b[K\nOutput1\n\r\x1b[1m[100% 2/2] action2\x1b[0m\x1b[K\nOutput2\n" + + if g := smart.String(); g != w { + t.Errorf("want:\n%q\ngot:\n%q", w, g) + } +} + +func TestSmartStatusHideAfterFailure(t *testing.T) { + os.Setenv(tableHeightEnVar, "") + + smart := &fakeSmartTerminal{termWidth: 40} + stat := NewStatusOutput(smart, "", false, false, false) + smartStat := stat.(*smartStatusOutput) + smartStat.sigwinchHandled = make(chan bool) + + runner := newRunner(stat, 2) + + action1 := &status.Action{Description: "action1"} + result1 := status.ActionResult{ + Action: action1, + Output: "Output1", + Error: fmt.Errorf("Error1"), + } + + action2 := &status.Action{Description: "action2"} + result2 := status.ActionResult{ + Action: action2, + Output: "Output2", + } + + runner.startAction(action1) + runner.startAction(action2) + runner.finishAction(result1) + runner.finishAction(result2) + + stat.Flush() + + w := "\r\x1b[1m[ 0% 0/2] action1\x1b[0m\x1b[K\r\x1b[1m[ 0% 0/2] action2\x1b[0m\x1b[K\r\x1b[1m[ 50% 1/2] action1\x1b[0m\x1b[K\nFAILED: \nOutput1\n\r\x1b[1m[100% 2/2] action2\x1b[0m\x1b[K\nThere was 1 action that completed after the action that failed. See verbose.log.gz for its output.\n" + + if g := smart.String(); g != w { + t.Errorf("want:\n%q\ngot:\n%q", w, g) + } +} + +func TestSmartStatusHideAfterFailurePlural(t *testing.T) { + os.Setenv(tableHeightEnVar, "") + + smart := &fakeSmartTerminal{termWidth: 40} + stat := NewStatusOutput(smart, "", false, false, false) + smartStat := stat.(*smartStatusOutput) + smartStat.sigwinchHandled = make(chan bool) + + runner := newRunner(stat, 2) + + action1 := &status.Action{Description: "action1"} + result1 := status.ActionResult{ + Action: action1, + Output: "Output1", + Error: fmt.Errorf("Error1"), + } + + action2 := &status.Action{Description: "action2"} + result2 := status.ActionResult{ + Action: action2, + Output: "Output2", + } + + action3 := &status.Action{Description: "action3"} + result3 := status.ActionResult{ + Action: action3, + Output: "Output3", + } + + runner.startAction(action1) + runner.startAction(action2) + runner.startAction(action3) + runner.finishAction(result1) + runner.finishAction(result2) + runner.finishAction(result3) + + stat.Flush() + + w := "\r\x1b[1m[ 0% 0/2] action1\x1b[0m\x1b[K\r\x1b[1m[ 0% 0/2] action2\x1b[0m\x1b[K\r\x1b[1m[ 0% 0/2] action3\x1b[0m\x1b[K\r\x1b[1m[ 50% 1/2] action1\x1b[0m\x1b[K\nFAILED: \nOutput1\n\r\x1b[1m[100% 2/2] action2\x1b[0m\x1b[K\r\x1b[1m[150% 3/2] action3\x1b[0m\x1b[K\nThere were 2 actions that completed after the action that failed. See verbose.log.gz for their output.\n" + + if g := smart.String(); g != w { + t.Errorf("want:\n%q\ngot:\n%q", w, g) + } +} + +func TestSmartStatusDontHideErrorAfterFailure(t *testing.T) { + os.Setenv(tableHeightEnVar, "") + + smart := &fakeSmartTerminal{termWidth: 40} + stat := NewStatusOutput(smart, "", false, false, false) + smartStat := stat.(*smartStatusOutput) + smartStat.sigwinchHandled = make(chan bool) + + runner := newRunner(stat, 2) + + action1 := &status.Action{Description: "action1"} + result1 := status.ActionResult{ + Action: action1, + Output: "Output1", + Error: fmt.Errorf("Error1"), + } + + action2 := &status.Action{Description: "action2"} + result2 := status.ActionResult{ + Action: action2, + Output: "Output2", + Error: fmt.Errorf("Error1"), + } + + runner.startAction(action1) + runner.startAction(action2) + runner.finishAction(result1) + runner.finishAction(result2) + + stat.Flush() + + w := "\r\x1b[1m[ 0% 0/2] action1\x1b[0m\x1b[K\r\x1b[1m[ 0% 0/2] action2\x1b[0m\x1b[K\r\x1b[1m[ 50% 1/2] action1\x1b[0m\x1b[K\nFAILED: \nOutput1\n\r\x1b[1m[100% 2/2] action2\x1b[0m\x1b[K\nFAILED: \nOutput2\n" + + if g := smart.String(); g != w { + t.Errorf("want:\n%q\ngot:\n%q", w, g) + } +} |