| // Copyright 2023 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| //go:build !(windows || js || wasip1) |
| |
| package main |
| |
| import ( |
| "regexp" |
| "strings" |
| "testing" |
| ) |
| |
| func TestExitCodeFilter(t *testing.T) { |
| // Write text to the filter one character at a time. |
| var out strings.Builder |
| f, exitStr := newExitCodeFilter(&out) |
| // Embed a "fake" exit code in the middle to check that we don't get caught on it. |
| pre := "abc" + exitStr + "123def" |
| text := pre + exitStr + `1` |
| for i := 0; i < len(text); i++ { |
| _, err := f.Write([]byte{text[i]}) |
| if err != nil { |
| t.Fatal(err) |
| } |
| } |
| |
| // The "pre" output should all have been flushed already. |
| if want, got := pre, out.String(); want != got { |
| t.Errorf("filter should have already flushed %q, but flushed %q", want, got) |
| } |
| |
| code, err := f.Finish() |
| if err != nil { |
| t.Fatal(err) |
| } |
| |
| // Nothing more should have been written to out. |
| if want, got := pre, out.String(); want != got { |
| t.Errorf("want output %q, got %q", want, got) |
| } |
| if want := 1; want != code { |
| t.Errorf("want exit code %d, got %d", want, code) |
| } |
| } |
| |
| func TestExitCodeMissing(t *testing.T) { |
| var wantErr *regexp.Regexp |
| check := func(text string) { |
| t.Helper() |
| var out strings.Builder |
| f, exitStr := newExitCodeFilter(&out) |
| if want := "exitcode="; want != exitStr { |
| t.Fatalf("test assumes exitStr will be %q, but got %q", want, exitStr) |
| } |
| f.Write([]byte(text)) |
| _, err := f.Finish() |
| // We should get a no exit code error |
| if err == nil || !wantErr.MatchString(err.Error()) { |
| t.Errorf("want error matching %s, got %s", wantErr, err) |
| } |
| // And it should flush all output (even if it looks |
| // like we may be getting an exit code) |
| if got := out.String(); text != got { |
| t.Errorf("want full output %q, got %q", text, got) |
| } |
| } |
| wantErr = regexp.MustCompile("^no exit code") |
| check("abc") |
| check("exitcode") |
| check("exitcode=") |
| check("exitcode=123\n") |
| wantErr = regexp.MustCompile("^bad exit code: .* value out of range") |
| check("exitcode=999999999999999999999999") |
| } |