github.com/anth0d/nomad@v0.0.0-20221214183521-ae3a0a2cad06/client/lib/fifo/fifo_test.go (about) 1 package fifo 2 3 import ( 4 "bytes" 5 "io" 6 "path/filepath" 7 "runtime" 8 "sync" 9 "testing" 10 "time" 11 12 "github.com/hashicorp/nomad/helper/uuid" 13 "github.com/stretchr/testify/assert" 14 "github.com/stretchr/testify/require" 15 ) 16 17 // TestFIFO tests basic behavior, and that reader closes when writer closes 18 func TestFIFO(t *testing.T) { 19 require := require.New(t) 20 var path string 21 22 if runtime.GOOS == "windows" { 23 path = "//./pipe/fifo" 24 } else { 25 path = filepath.Join(t.TempDir(), "fifo") 26 } 27 28 readerOpenFn, err := CreateAndRead(path) 29 require.NoError(err) 30 31 var reader io.ReadCloser 32 33 toWrite := [][]byte{ 34 []byte("abc\n"), 35 []byte(""), 36 []byte("def\n"), 37 []byte("nomad"), 38 []byte("\n"), 39 } 40 41 var readBuf bytes.Buffer 42 var wait sync.WaitGroup 43 wait.Add(1) 44 go func() { 45 defer wait.Done() 46 47 var err error 48 reader, err = readerOpenFn() 49 assert.NoError(t, err) 50 if err != nil { 51 return 52 } 53 54 _, err = io.Copy(&readBuf, reader) 55 assert.NoError(t, err) 56 }() 57 58 writer, err := OpenWriter(path) 59 require.NoError(err) 60 for _, b := range toWrite { 61 n, err := writer.Write(b) 62 require.NoError(err) 63 require.Equal(n, len(b)) 64 } 65 require.NoError(writer.Close()) 66 time.Sleep(500 * time.Millisecond) 67 68 wait.Wait() 69 require.NoError(reader.Close()) 70 71 expected := "abc\ndef\nnomad\n" 72 require.Equal(expected, readBuf.String()) 73 74 require.NoError(Remove(path)) 75 } 76 77 // TestWriteClose asserts that when writer closes, subsequent Write() fails 78 func TestWriteClose(t *testing.T) { 79 require := require.New(t) 80 var path string 81 82 if runtime.GOOS == "windows" { 83 path = "//./pipe/" + uuid.Generate()[:4] 84 } else { 85 path = filepath.Join(t.TempDir(), "fifo") 86 } 87 88 readerOpenFn, err := CreateAndRead(path) 89 require.NoError(err) 90 var reader io.ReadCloser 91 92 var readBuf bytes.Buffer 93 var wait sync.WaitGroup 94 wait.Add(1) 95 go func() { 96 defer wait.Done() 97 98 var err error 99 reader, err = readerOpenFn() 100 assert.NoError(t, err) 101 if err != nil { 102 return 103 } 104 105 _, err = io.Copy(&readBuf, reader) 106 assert.NoError(t, err) 107 }() 108 109 writer, err := OpenWriter(path) 110 require.NoError(err) 111 112 var count int 113 wait.Add(1) 114 go func() { 115 defer wait.Done() 116 for count = 0; count < int(^uint16(0)); count++ { 117 _, err := writer.Write([]byte(",")) 118 if err != nil && IsClosedErr(err) { 119 break 120 } 121 require.NoError(err) 122 time.Sleep(5 * time.Millisecond) 123 } 124 }() 125 126 time.Sleep(500 * time.Millisecond) 127 require.NoError(writer.Close()) 128 wait.Wait() 129 130 require.Equal(count, len(readBuf.String())) 131 }