1 // Copyright 2009 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.
18 type untarTest struct {
24 var gnuTarTest = &untarTest{
25 file: "testdata/gnu.tar",
33 ModTime: time.Unix(1244428340, 0),
44 ModTime: time.Unix(1244436044, 0),
51 "e38b27eaccb4391bdec553a7f3ae6b2f",
52 "c65bd2e50a56a2138bf1716f2fd56fe9",
56 var untarTests = []*untarTest{
59 file: "testdata/star.tar",
67 ModTime: time.Unix(1244592783, 0),
71 AccessTime: time.Unix(1244592783, 0),
72 ChangeTime: time.Unix(1244592783, 0),
80 ModTime: time.Unix(1244592783, 0),
84 AccessTime: time.Unix(1244592783, 0),
85 ChangeTime: time.Unix(1244592783, 0),
90 file: "testdata/v7.tar",
98 ModTime: time.Unix(1244593104, 0),
107 ModTime: time.Unix(1244593104, 0),
114 func TestReader(t *testing.T) {
116 for i, test := range untarTests {
117 f, err := os.Open(test.file)
119 t.Errorf("test %d: Unexpected error: %v", i, err)
123 for j, header := range test.headers {
124 hdr, err := tr.Next()
125 if err != nil || hdr == nil {
126 t.Errorf("test %d, entry %d: Didn't get entry: %v", i, j, err)
130 if !reflect.DeepEqual(hdr, header) {
131 t.Errorf("test %d, entry %d: Incorrect header:\nhave %+v\nwant %+v",
135 hdr, err := tr.Next()
139 if hdr != nil || err != nil {
140 t.Errorf("test %d: Unexpected entry or error: hdr=%v err=%v", i, hdr, err)
146 func TestPartialRead(t *testing.T) {
147 f, err := os.Open("testdata/gnu.tar")
149 t.Fatalf("Unexpected error: %v", err)
155 // Read the first four bytes; Next() should skip the last byte.
156 hdr, err := tr.Next()
157 if err != nil || hdr == nil {
158 t.Fatalf("Didn't get first file: %v", err)
160 buf := make([]byte, 4)
161 if _, err := io.ReadFull(tr, buf); err != nil {
162 t.Fatalf("Unexpected error: %v", err)
164 if expected := []byte("Kilt"); !bytes.Equal(buf, expected) {
165 t.Errorf("Contents = %v, want %v", buf, expected)
170 if err != nil || hdr == nil {
171 t.Fatalf("Didn't get second file: %v", err)
173 buf = make([]byte, 6)
174 if _, err := io.ReadFull(tr, buf); err != nil {
175 t.Fatalf("Unexpected error: %v", err)
177 if expected := []byte("Google"); !bytes.Equal(buf, expected) {
178 t.Errorf("Contents = %v, want %v", buf, expected)
182 func TestIncrementalRead(t *testing.T) {
184 f, err := os.Open(test.file)
186 t.Fatalf("Unexpected error: %v", err)
192 headers := test.headers
193 cksums := test.cksums
196 // loop over all files
198 hdr, err := tr.Next()
199 if hdr == nil || err == io.EOF {
204 if !reflect.DeepEqual(hdr, headers[nread]) {
205 t.Errorf("Incorrect header:\nhave %+v\nwant %+v",
206 *hdr, headers[nread])
209 // read file contents in little chunks EOF,
210 // checksumming all the way
212 rdbuf := make([]uint8, 8)
214 nr, err := tr.Read(rdbuf)
219 t.Errorf("Read: unexpected error %v\n", err)
225 have := fmt.Sprintf("%x", h.Sum(nil))
226 want := cksums[nread]
228 t.Errorf("Bad checksum on file %s:\nhave %+v\nwant %+v", hdr.Name, have, want)
231 if nread != len(headers) {
232 t.Errorf("Didn't process all files\nexpected: %d\nprocessed %d\n", len(headers), nread)
236 func TestNonSeekable(t *testing.T) {
238 f, err := os.Open(test.file)
240 t.Fatalf("Unexpected error: %v", err)
245 r, w, err := os.Pipe()
247 t.Fatalf("Unexpected error %s", err)
250 rdbuf := make([]uint8, 1<<16)
252 nr, err := f.Read(rdbuf)
265 hdr, err := tr.Next()
266 if hdr == nil || err == io.EOF {
271 if nread != len(test.headers) {
272 t.Errorf("Didn't process all files\nexpected: %d\nprocessed %d\n", len(test.headers), nread)