1 // Copyright 2011 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.
16 // TODO(adg): a more sophisticated test suite
18 type WriteTest
struct {
25 var writeTests
= []WriteTest
{
28 Data
: []byte("Rabbits, guinea pigs, gophers, marsupial rats, and quolls."),
34 Data
: nil, // large data set in the test
40 Data
: []byte("setuid file"),
42 Mode
: 0755 | os
.ModeSetuid
,
46 Data
: []byte("setgid file"),
48 Mode
: 0755 | os
.ModeSetgid
,
52 Data
: []byte("../link/target"),
54 Mode
: 0755 | os
.ModeSymlink
,
58 func TestWriter(t
*testing
.T
) {
59 largeData
:= make([]byte, 1<<17)
60 for i
:= range largeData
{
61 largeData
[i
] = byte(rand
.Int())
63 writeTests
[1].Data
= largeData
65 writeTests
[1].Data
= nil
69 buf
:= new(bytes
.Buffer
)
72 for _
, wt
:= range writeTests
{
76 if err
:= w
.Close(); err
!= nil {
81 r
, err
:= NewReader(bytes
.NewReader(buf
.Bytes()), int64(buf
.Len()))
85 for i
, wt
:= range writeTests
{
86 testReadFile(t
, r
.File
[i
], &wt
)
90 func TestWriterUTF8(t
*testing
.T
) {
91 var utf8Tests
= []struct {
98 comment
: "in the world",
103 comment
: "in the world",
108 comment
: "in the 世界",
113 comment
: "in the 世界",
119 buf
:= new(bytes
.Buffer
)
122 for _
, test
:= range utf8Tests
{
125 Comment
: test
.comment
,
128 w
, err
:= w
.CreateHeader(h
)
135 if err
:= w
.Close(); err
!= nil {
140 r
, err
:= NewReader(bytes
.NewReader(buf
.Bytes()), int64(buf
.Len()))
144 for i
, test
:= range utf8Tests
{
145 got
:= r
.File
[i
].Flags
146 t
.Logf("name %v, comment %v", test
.name
, test
.comment
)
147 if got
!= test
.expect
{
148 t
.Fatalf("Flags: got %v, want %v", got
, test
.expect
)
153 func TestWriterOffset(t
*testing
.T
) {
154 largeData
:= make([]byte, 1<<17)
155 for i
:= range largeData
{
156 largeData
[i
] = byte(rand
.Int())
158 writeTests
[1].Data
= largeData
160 writeTests
[1].Data
= nil
164 buf
:= new(bytes
.Buffer
)
165 existingData
:= []byte{1, 2, 3, 1, 2, 3, 1, 2, 3}
166 n
, _
:= buf
.Write(existingData
)
168 w
.SetOffset(int64(n
))
170 for _
, wt
:= range writeTests
{
171 testCreate(t
, w
, &wt
)
174 if err
:= w
.Close(); err
!= nil {
179 r
, err
:= NewReader(bytes
.NewReader(buf
.Bytes()), int64(buf
.Len()))
183 for i
, wt
:= range writeTests
{
184 testReadFile(t
, r
.File
[i
], &wt
)
188 func TestWriterFlush(t
*testing
.T
) {
190 w
:= NewWriter(struct{ io
.Writer
}{&buf
})
191 _
, err
:= w
.Create("foo")
196 t
.Fatalf("Unexpected %d bytes already in buffer", buf
.Len())
198 if err
:= w
.Flush(); err
!= nil {
202 t
.Fatal("No bytes written after Flush")
206 func testCreate(t
*testing
.T
, w
*Writer
, wt
*WriteTest
) {
207 header
:= &FileHeader
{
212 header
.SetMode(wt
.Mode
)
214 f
, err
:= w
.CreateHeader(header
)
218 _
, err
= f
.Write(wt
.Data
)
224 func testReadFile(t
*testing
.T
, f
*File
, wt
*WriteTest
) {
225 if f
.Name
!= wt
.Name
{
226 t
.Fatalf("File name: got %q, want %q", f
.Name
, wt
.Name
)
228 testFileMode(t
, wt
.Name
, f
, wt
.Mode
)
231 t
.Fatal("opening:", err
)
233 b
, err
:= ioutil
.ReadAll(rc
)
235 t
.Fatal("reading:", err
)
239 t
.Fatal("closing:", err
)
241 if !bytes
.Equal(b
, wt
.Data
) {
242 t
.Errorf("File contents %q, want %q", b
, wt
.Data
)
246 func BenchmarkCompressedZipGarbage(b
*testing
.B
) {
247 bigBuf
:= bytes
.Repeat([]byte("a"), 1<<20)
249 runOnce
:= func(buf
*bytes
.Buffer
) {
252 for j
:= 0; j
< 3; j
++ {
253 w
, _
:= zw
.CreateHeader(&FileHeader
{
263 // Run once and then reset the timer.
264 // This effectively discards the very large initial flate setup cost,
265 // as well as the initialization of bigBuf.
266 runOnce(&bytes
.Buffer
{})
269 b
.RunParallel(func(pb
*testing
.PB
) {