github.com/sams1990/dockerrepo@v17.12.1-ce-rc2+incompatible/daemon/logger/loggerutils/multireader/multireader_test.go (about) 1 package multireader 2 3 import ( 4 "bytes" 5 "encoding/binary" 6 "fmt" 7 "io" 8 "io/ioutil" 9 "os" 10 "strings" 11 "testing" 12 ) 13 14 func TestMultiReadSeekerReadAll(t *testing.T) { 15 str := "hello world" 16 s1 := strings.NewReader(str + " 1") 17 s2 := strings.NewReader(str + " 2") 18 s3 := strings.NewReader(str + " 3") 19 mr := MultiReadSeeker(s1, s2, s3) 20 21 expectedSize := int64(s1.Len() + s2.Len() + s3.Len()) 22 23 b, err := ioutil.ReadAll(mr) 24 if err != nil { 25 t.Fatal(err) 26 } 27 28 expected := "hello world 1hello world 2hello world 3" 29 if string(b) != expected { 30 t.Fatalf("ReadAll failed, got: %q, expected %q", string(b), expected) 31 } 32 33 size, err := mr.Seek(0, os.SEEK_END) 34 if err != nil { 35 t.Fatal(err) 36 } 37 if size != expectedSize { 38 t.Fatalf("reader size does not match, got %d, expected %d", size, expectedSize) 39 } 40 41 // Reset the position and read again 42 pos, err := mr.Seek(0, os.SEEK_SET) 43 if err != nil { 44 t.Fatal(err) 45 } 46 if pos != 0 { 47 t.Fatalf("expected position to be set to 0, got %d", pos) 48 } 49 50 b, err = ioutil.ReadAll(mr) 51 if err != nil { 52 t.Fatal(err) 53 } 54 55 if string(b) != expected { 56 t.Fatalf("ReadAll failed, got: %q, expected %q", string(b), expected) 57 } 58 59 // The positions of some readers are not 0 60 s1.Seek(0, os.SEEK_SET) 61 s2.Seek(0, os.SEEK_END) 62 s3.Seek(0, os.SEEK_SET) 63 mr = MultiReadSeeker(s1, s2, s3) 64 b, err = ioutil.ReadAll(mr) 65 if err != nil { 66 t.Fatal(err) 67 } 68 69 if string(b) != expected { 70 t.Fatalf("ReadAll failed, got: %q, expected %q", string(b), expected) 71 } 72 } 73 74 func TestMultiReadSeekerReadEach(t *testing.T) { 75 str := "hello world" 76 s1 := strings.NewReader(str + " 1") 77 s2 := strings.NewReader(str + " 2") 78 s3 := strings.NewReader(str + " 3") 79 mr := MultiReadSeeker(s1, s2, s3) 80 81 var totalBytes int64 82 for i, s := range []*strings.Reader{s1, s2, s3} { 83 sLen := int64(s.Len()) 84 buf := make([]byte, s.Len()) 85 expected := []byte(fmt.Sprintf("%s %d", str, i+1)) 86 87 if _, err := mr.Read(buf); err != nil && err != io.EOF { 88 t.Fatal(err) 89 } 90 91 if !bytes.Equal(buf, expected) { 92 t.Fatalf("expected %q to be %q", string(buf), string(expected)) 93 } 94 95 pos, err := mr.Seek(0, os.SEEK_CUR) 96 if err != nil { 97 t.Fatalf("iteration: %d, error: %v", i+1, err) 98 } 99 100 // check that the total bytes read is the current position of the seeker 101 totalBytes += sLen 102 if pos != totalBytes { 103 t.Fatalf("expected current position to be: %d, got: %d, iteration: %d", totalBytes, pos, i+1) 104 } 105 106 // This tests not only that SEEK_SET and SEEK_CUR give the same values, but that the next iteration is in the expected position as well 107 newPos, err := mr.Seek(pos, os.SEEK_SET) 108 if err != nil { 109 t.Fatal(err) 110 } 111 if newPos != pos { 112 t.Fatalf("expected to get same position when calling SEEK_SET with value from SEEK_CUR, cur: %d, set: %d", pos, newPos) 113 } 114 } 115 } 116 117 func TestMultiReadSeekerReadSpanningChunks(t *testing.T) { 118 str := "hello world" 119 s1 := strings.NewReader(str + " 1") 120 s2 := strings.NewReader(str + " 2") 121 s3 := strings.NewReader(str + " 3") 122 mr := MultiReadSeeker(s1, s2, s3) 123 124 buf := make([]byte, s1.Len()+3) 125 _, err := mr.Read(buf) 126 if err != nil { 127 t.Fatal(err) 128 } 129 130 // expected is the contents of s1 + 3 bytes from s2, ie, the `hel` at the end of this string 131 expected := "hello world 1hel" 132 if string(buf) != expected { 133 t.Fatalf("expected %s to be %s", string(buf), expected) 134 } 135 } 136 137 func TestMultiReadSeekerNegativeSeek(t *testing.T) { 138 str := "hello world" 139 s1 := strings.NewReader(str + " 1") 140 s2 := strings.NewReader(str + " 2") 141 s3 := strings.NewReader(str + " 3") 142 mr := MultiReadSeeker(s1, s2, s3) 143 144 s1Len := s1.Len() 145 s2Len := s2.Len() 146 s3Len := s3.Len() 147 148 s, err := mr.Seek(int64(-1*s3.Len()), os.SEEK_END) 149 if err != nil { 150 t.Fatal(err) 151 } 152 if s != int64(s1Len+s2Len) { 153 t.Fatalf("expected %d to be %d", s, s1.Len()+s2.Len()) 154 } 155 156 buf := make([]byte, s3Len) 157 if _, err := mr.Read(buf); err != nil && err != io.EOF { 158 t.Fatal(err) 159 } 160 expected := fmt.Sprintf("%s %d", str, 3) 161 if string(buf) != fmt.Sprintf("%s %d", str, 3) { 162 t.Fatalf("expected %q to be %q", string(buf), expected) 163 } 164 } 165 166 func TestMultiReadSeekerCurAfterSet(t *testing.T) { 167 str := "hello world" 168 s1 := strings.NewReader(str + " 1") 169 s2 := strings.NewReader(str + " 2") 170 s3 := strings.NewReader(str + " 3") 171 mr := MultiReadSeeker(s1, s2, s3) 172 173 mid := int64(s1.Len() + s2.Len()/2) 174 175 size, err := mr.Seek(mid, os.SEEK_SET) 176 if err != nil { 177 t.Fatal(err) 178 } 179 if size != mid { 180 t.Fatalf("reader size does not match, got %d, expected %d", size, mid) 181 } 182 183 size, err = mr.Seek(3, os.SEEK_CUR) 184 if err != nil { 185 t.Fatal(err) 186 } 187 if size != mid+3 { 188 t.Fatalf("reader size does not match, got %d, expected %d", size, mid+3) 189 } 190 size, err = mr.Seek(5, os.SEEK_CUR) 191 if err != nil { 192 t.Fatal(err) 193 } 194 if size != mid+8 { 195 t.Fatalf("reader size does not match, got %d, expected %d", size, mid+8) 196 } 197 198 size, err = mr.Seek(10, os.SEEK_CUR) 199 if err != nil { 200 t.Fatal(err) 201 } 202 if size != mid+18 { 203 t.Fatalf("reader size does not match, got %d, expected %d", size, mid+18) 204 } 205 } 206 207 func TestMultiReadSeekerSmallReads(t *testing.T) { 208 readers := []io.ReadSeeker{} 209 for i := 0; i < 10; i++ { 210 integer := make([]byte, 4) 211 binary.BigEndian.PutUint32(integer, uint32(i)) 212 readers = append(readers, bytes.NewReader(integer)) 213 } 214 215 reader := MultiReadSeeker(readers...) 216 for i := 0; i < 10; i++ { 217 var integer uint32 218 if err := binary.Read(reader, binary.BigEndian, &integer); err != nil { 219 t.Fatalf("Read from NewMultiReadSeeker failed: %v", err) 220 } 221 if uint32(i) != integer { 222 t.Fatalf("Read wrong value from NewMultiReadSeeker: %d != %d", i, integer) 223 } 224 } 225 }