golang.org/x/build@v0.0.0-20240506185731-218518f32b70/livelog/livelog_test.go (about) 1 // Copyright 2015 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 5 package livelog 6 7 import ( 8 "bytes" 9 "io" 10 "sync" 11 "testing" 12 "time" 13 ) 14 15 func TestBuffer(t *testing.T) { 16 var wg sync.WaitGroup 17 testConc := func(prefix string, r io.Reader, want string, wantErr error) { 18 wg.Add(1) 19 go func() { 20 defer wg.Done() 21 testRead(t, prefix, r, want, wantErr) 22 }() 23 } 24 sleep := func() { time.Sleep(time.Millisecond) } 25 26 const w1, w2, w3, w4 = "first", "second", "third", "fourth" 27 28 var buf Buffer 29 30 buf.Write([]byte(w1)) 31 r1 := buf.Reader() 32 testRead(t, "r1, w1", r1, w1, nil) 33 34 testConc("r1, w2", r1, w2, nil) 35 sleep() 36 buf.Write([]byte(w2)) 37 r2 := buf.Reader() 38 testRead(t, "r2, w1+w2", r2, w1+w2, nil) 39 wg.Wait() 40 41 testConc("r1, w3", r1, w3, nil) 42 testConc("r2, w3", r2, w3, nil) 43 sleep() 44 buf.Write([]byte(w3)) 45 wg.Wait() 46 47 r3 := buf.Reader() 48 testRead(t, "r3, w1+w2+w3", r3, w1+w2+w3, nil) 49 50 testConc("r1, w4", r1, w4, nil) 51 testConc("r3, eof", r3, "", io.EOF) 52 sleep() 53 r3.Close() 54 buf.Write([]byte(w4)) 55 testRead(t, "r2, w4", r2, w4, nil) 56 wg.Wait() 57 58 testConc("r1 eof", r1, "", io.EOF) 59 sleep() 60 buf.Close() 61 testRead(t, "r2 eof", r2, "", io.EOF) 62 wg.Wait() 63 64 r4 := buf.Reader() 65 testRead(t, "r4 all", r4, w1+w2+w3+w4, nil) 66 testRead(t, "r4 eof", r4, "", io.EOF) 67 } 68 69 func testRead(t *testing.T, prefix string, r io.Reader, want string, wantErr error) { 70 b := make([]byte, 1024) 71 n, err := r.Read(b) 72 if err != wantErr { 73 t.Errorf("%s: got err %v, want %v", prefix, err, wantErr) 74 return 75 } 76 ok := true 77 if n != len(want) { 78 t.Errorf("%s: got n = %v, want %v", prefix, n, len(want)) 79 ok = false 80 } 81 if s := string(b[:n]); s != want { 82 t.Errorf("%s: read %q, want %q", prefix, s, want) 83 ok = false 84 } 85 if ok { 86 t.Logf("%s: ok", prefix) 87 } 88 } 89 90 func TestTruncation(t *testing.T) { 91 tests := []struct { 92 desc string 93 inputs [][]byte 94 want []byte 95 }{ 96 { 97 desc: "no truncation", 98 inputs: [][]byte{ 99 bytes.Repeat([]byte{'a'}, maxUserSize), 100 }, 101 want: bytes.Repeat([]byte{'a'}, maxUserSize), 102 }, 103 { 104 desc: "one byte overflow", 105 inputs: [][]byte{ 106 bytes.Repeat([]byte{'a'}, maxUserSize), 107 []byte{'b'}, 108 }, 109 want: append(bytes.Repeat([]byte{'a'}, maxUserSize), []byte(truncationMessage)...), 110 }, 111 { 112 desc: "single overflow", 113 inputs: [][]byte{ 114 bytes.Repeat([]byte{'a'}, 2*MaxBufferSize), 115 }, 116 want: append(bytes.Repeat([]byte{'a'}, maxUserSize), []byte(truncationMessage)...), 117 }, 118 { 119 desc: "multiple overflow", 120 inputs: [][]byte{ 121 bytes.Repeat([]byte{'a'}, 2*MaxBufferSize), 122 bytes.Repeat([]byte{'a'}, 2*MaxBufferSize), 123 }, 124 want: append(bytes.Repeat([]byte{'a'}, maxUserSize), []byte(truncationMessage)...), 125 }, 126 { 127 desc: "partial input overflow", 128 inputs: [][]byte{ 129 bytes.Repeat([]byte{'a'}, maxUserSize-2), 130 []byte{'1', '2', '3'}, 131 }, 132 want: append(bytes.Repeat([]byte{'a'}, maxUserSize-2), append([]byte{'1', '2'}, []byte(truncationMessage)...)...), 133 }, 134 } 135 136 for _, test := range tests { 137 t.Run(test.desc, func(t *testing.T) { 138 var buf Buffer 139 for _, input := range test.inputs { 140 buf.Write(input) 141 } 142 143 got := buf.Bytes() 144 if !bytes.Equal(got, test.want) { 145 t.Errorf("buf inputs %v got %v, want %v", test.inputs, got, test.want) 146 } 147 }) 148 } 149 }