github.com/endophage/docker@v1.4.2-0.20161027011718-242853499895/pkg/ioutils/multireader_test.go (about) 1 package ioutils 2 3 import ( 4 "bytes" 5 "fmt" 6 "io" 7 "io/ioutil" 8 "os" 9 "strings" 10 "testing" 11 ) 12 13 func TestMultiReadSeekerReadAll(t *testing.T) { 14 str := "hello world" 15 s1 := strings.NewReader(str + " 1") 16 s2 := strings.NewReader(str + " 2") 17 s3 := strings.NewReader(str + " 3") 18 mr := MultiReadSeeker(s1, s2, s3) 19 20 expectedSize := int64(s1.Len() + s2.Len() + s3.Len()) 21 22 b, err := ioutil.ReadAll(mr) 23 if err != nil { 24 t.Fatal(err) 25 } 26 27 expected := "hello world 1hello world 2hello world 3" 28 if string(b) != expected { 29 t.Fatalf("ReadAll failed, got: %q, expected %q", string(b), expected) 30 } 31 32 size, err := mr.Seek(0, os.SEEK_END) 33 if err != nil { 34 t.Fatal(err) 35 } 36 if size != expectedSize { 37 t.Fatalf("reader size does not match, got %d, expected %d", size, expectedSize) 38 } 39 40 // Reset the position and read again 41 pos, err := mr.Seek(0, os.SEEK_SET) 42 if err != nil { 43 t.Fatal(err) 44 } 45 if pos != 0 { 46 t.Fatalf("expected position to be set to 0, got %d", pos) 47 } 48 49 b, err = ioutil.ReadAll(mr) 50 if err != nil { 51 t.Fatal(err) 52 } 53 54 if string(b) != expected { 55 t.Fatalf("ReadAll failed, got: %q, expected %q", string(b), expected) 56 } 57 } 58 59 func TestMultiReadSeekerReadEach(t *testing.T) { 60 str := "hello world" 61 s1 := strings.NewReader(str + " 1") 62 s2 := strings.NewReader(str + " 2") 63 s3 := strings.NewReader(str + " 3") 64 mr := MultiReadSeeker(s1, s2, s3) 65 66 var totalBytes int64 67 for i, s := range []*strings.Reader{s1, s2, s3} { 68 sLen := int64(s.Len()) 69 buf := make([]byte, s.Len()) 70 expected := []byte(fmt.Sprintf("%s %d", str, i+1)) 71 72 if _, err := mr.Read(buf); err != nil && err != io.EOF { 73 t.Fatal(err) 74 } 75 76 if !bytes.Equal(buf, expected) { 77 t.Fatalf("expected %q to be %q", string(buf), string(expected)) 78 } 79 80 pos, err := mr.Seek(0, os.SEEK_CUR) 81 if err != nil { 82 t.Fatalf("iteration: %d, error: %v", i+1, err) 83 } 84 85 // check that the total bytes read is the current position of the seeker 86 totalBytes += sLen 87 if pos != totalBytes { 88 t.Fatalf("expected current position to be: %d, got: %d, iteration: %d", totalBytes, pos, i+1) 89 } 90 91 // 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 92 newPos, err := mr.Seek(pos, os.SEEK_SET) 93 if err != nil { 94 t.Fatal(err) 95 } 96 if newPos != pos { 97 t.Fatalf("expected to get same position when calling SEEK_SET with value from SEEK_CUR, cur: %d, set: %d", pos, newPos) 98 } 99 } 100 } 101 102 func TestMultiReadSeekerReadSpanningChunks(t *testing.T) { 103 str := "hello world" 104 s1 := strings.NewReader(str + " 1") 105 s2 := strings.NewReader(str + " 2") 106 s3 := strings.NewReader(str + " 3") 107 mr := MultiReadSeeker(s1, s2, s3) 108 109 buf := make([]byte, s1.Len()+3) 110 _, err := mr.Read(buf) 111 if err != nil { 112 t.Fatal(err) 113 } 114 115 // expected is the contents of s1 + 3 bytes from s2, ie, the `hel` at the end of this string 116 expected := "hello world 1hel" 117 if string(buf) != expected { 118 t.Fatalf("expected %s to be %s", string(buf), expected) 119 } 120 } 121 122 func TestMultiReadSeekerNegativeSeek(t *testing.T) { 123 str := "hello world" 124 s1 := strings.NewReader(str + " 1") 125 s2 := strings.NewReader(str + " 2") 126 s3 := strings.NewReader(str + " 3") 127 mr := MultiReadSeeker(s1, s2, s3) 128 129 s1Len := s1.Len() 130 s2Len := s2.Len() 131 s3Len := s3.Len() 132 133 s, err := mr.Seek(int64(-1*s3.Len()), os.SEEK_END) 134 if err != nil { 135 t.Fatal(err) 136 } 137 if s != int64(s1Len+s2Len) { 138 t.Fatalf("expected %d to be %d", s, s1.Len()+s2.Len()) 139 } 140 141 buf := make([]byte, s3Len) 142 if _, err := mr.Read(buf); err != nil && err != io.EOF { 143 t.Fatal(err) 144 } 145 expected := fmt.Sprintf("%s %d", str, 3) 146 if string(buf) != fmt.Sprintf("%s %d", str, 3) { 147 t.Fatalf("expected %q to be %q", string(buf), expected) 148 } 149 } 150 151 func TestMultiReadSeekerCurAfterSet(t *testing.T) { 152 str := "hello world" 153 s1 := strings.NewReader(str + " 1") 154 s2 := strings.NewReader(str + " 2") 155 s3 := strings.NewReader(str + " 3") 156 mr := MultiReadSeeker(s1, s2, s3) 157 158 mid := int64(s1.Len() + s2.Len()/2) 159 160 size, err := mr.Seek(mid, os.SEEK_SET) 161 if err != nil { 162 t.Fatal(err) 163 } 164 if size != mid { 165 t.Fatalf("reader size does not match, got %d, expected %d", size, mid) 166 } 167 168 size, err = mr.Seek(3, os.SEEK_CUR) 169 if err != nil { 170 t.Fatal(err) 171 } 172 if size != mid+3 { 173 t.Fatalf("reader size does not match, got %d, expected %d", size, mid+3) 174 } 175 size, err = mr.Seek(5, os.SEEK_CUR) 176 if err != nil { 177 t.Fatal(err) 178 } 179 if size != mid+8 { 180 t.Fatalf("reader size does not match, got %d, expected %d", size, mid+8) 181 } 182 183 size, err = mr.Seek(10, os.SEEK_CUR) 184 if err != nil { 185 t.Fatal(err) 186 } 187 if size != mid+18 { 188 t.Fatalf("reader size does not match, got %d, expected %d", size, mid+18) 189 } 190 }