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.
17 type untarTest
struct {
23 var gnuTarTest
= &untarTest
{
24 file
: "testdata/gnu.tar",
50 "e38b27eaccb4391bdec553a7f3ae6b2f",
51 "c65bd2e50a56a2138bf1716f2fd56fe9",
55 var untarTests
= []*untarTest
{
58 file
: "testdata/star.tar",
89 file
: "testdata/v7.tar",
113 func TestReader(t
*testing
.T
) {
115 for i
, test
:= range untarTests
{
116 f
, err
:= os
.Open(test
.file
, os
.O_RDONLY
, 0444)
118 t
.Errorf("test %d: Unexpected error: %v", i
, err
)
122 for j
, header
:= range test
.headers
{
123 hdr
, err
:= tr
.Next()
124 if err
!= nil || hdr
== nil {
125 t
.Errorf("test %d, entry %d: Didn't get entry: %v", i
, j
, err
)
129 if !reflect
.DeepEqual(hdr
, header
) {
130 t
.Errorf("test %d, entry %d: Incorrect header:\nhave %+v\nwant %+v",
134 hdr
, err
:= tr
.Next()
138 if hdr
!= nil || err
!= nil {
139 t
.Errorf("test %d: Unexpected entry or error: hdr=%v err=%v", i
, err
)
145 func TestPartialRead(t
*testing
.T
) {
146 f
, err
:= os
.Open("testdata/gnu.tar", os
.O_RDONLY
, 0444)
148 t
.Fatalf("Unexpected error: %v", err
)
154 // Read the first four bytes; Next() should skip the last byte.
155 hdr
, err
:= tr
.Next()
156 if err
!= nil || hdr
== nil {
157 t
.Fatalf("Didn't get first file: %v", err
)
159 buf
:= make([]byte, 4)
160 if _
, err
:= io
.ReadFull(tr
, buf
); err
!= nil {
161 t
.Fatalf("Unexpected error: %v", err
)
163 if expected
:= []byte("Kilt"); !bytes
.Equal(buf
, expected
) {
164 t
.Errorf("Contents = %v, want %v", buf
, expected
)
169 if err
!= nil || hdr
== nil {
170 t
.Fatalf("Didn't get second file: %v", err
)
172 buf
= make([]byte, 6)
173 if _
, err
:= io
.ReadFull(tr
, buf
); err
!= nil {
174 t
.Fatalf("Unexpected error: %v", err
)
176 if expected
:= []byte("Google"); !bytes
.Equal(buf
, expected
) {
177 t
.Errorf("Contents = %v, want %v", buf
, expected
)
182 func TestIncrementalRead(t
*testing
.T
) {
184 f
, err
:= os
.Open(test
.file
, os
.O_RDONLY
, 0444)
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
== os
.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())
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
, os
.O_RDONLY
, 0444)
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
== os
.EOF
{
271 if nread
!= len(test
.headers
) {
272 t
.Errorf("Didn't process all files\nexpected: %d\nprocessed %d\n", len(test
.headers
), nread
)