exitcode_test.go 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. // Copyright 2023 The Go Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. //go:build !(windows || js || wasip1)
  5. package main
  6. import (
  7. "regexp"
  8. "strings"
  9. "testing"
  10. )
  11. func TestExitCodeFilter(t *testing.T) {
  12. // Write text to the filter one character at a time.
  13. var out strings.Builder
  14. f, exitStr := newExitCodeFilter(&out)
  15. // Embed a "fake" exit code in the middle to check that we don't get caught on it.
  16. pre := "abc" + exitStr + "123def"
  17. text := pre + exitStr + `1`
  18. for i := 0; i < len(text); i++ {
  19. _, err := f.Write([]byte{text[i]})
  20. if err != nil {
  21. t.Fatal(err)
  22. }
  23. }
  24. // The "pre" output should all have been flushed already.
  25. if want, got := pre, out.String(); want != got {
  26. t.Errorf("filter should have already flushed %q, but flushed %q", want, got)
  27. }
  28. code, err := f.Finish()
  29. if err != nil {
  30. t.Fatal(err)
  31. }
  32. // Nothing more should have been written to out.
  33. if want, got := pre, out.String(); want != got {
  34. t.Errorf("want output %q, got %q", want, got)
  35. }
  36. if want := 1; want != code {
  37. t.Errorf("want exit code %d, got %d", want, code)
  38. }
  39. }
  40. func TestExitCodeMissing(t *testing.T) {
  41. var wantErr *regexp.Regexp
  42. check := func(text string) {
  43. t.Helper()
  44. var out strings.Builder
  45. f, exitStr := newExitCodeFilter(&out)
  46. if want := "exitcode="; want != exitStr {
  47. t.Fatalf("test assumes exitStr will be %q, but got %q", want, exitStr)
  48. }
  49. f.Write([]byte(text))
  50. _, err := f.Finish()
  51. // We should get a no exit code error
  52. if err == nil || !wantErr.MatchString(err.Error()) {
  53. t.Errorf("want error matching %s, got %s", wantErr, err)
  54. }
  55. // And it should flush all output (even if it looks
  56. // like we may be getting an exit code)
  57. if got := out.String(); text != got {
  58. t.Errorf("want full output %q, got %q", text, got)
  59. }
  60. }
  61. wantErr = regexp.MustCompile("^no exit code")
  62. check("abc")
  63. check("exitcode")
  64. check("exitcode=")
  65. check("exitcode=123\n")
  66. wantErr = regexp.MustCompile("^bad exit code: .* value out of range")
  67. check("exitcode=999999999999999999999999")
  68. }