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  }