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 TestAppend(t *testing.T) {
92
buf := new(bytes.Buffer)
95
for _, wt := range writeTests {
99
if err := w.Close(); err != nil {
104
r, err := NewReader(bytes.NewReader(buf.Bytes()), int64(buf.Len()))
109
// append a file to it.
110
abuf := new(bytes.Buffer)
115
Data: []byte("Badgers, canines, weasels, owls, and snakes"),
119
testCreate(t, w, &wt)
121
if err := w.Close(); err != nil {
125
// read the whole thing back.
126
allBytes := append(buf.Bytes(), abuf.Bytes()...)
128
r, err = NewReader(bytes.NewReader(allBytes), int64(len(allBytes)))
133
writeTests := append(writeTests[1:], wt)
134
for i, wt := range writeTests {
135
testReadFile(t, r.File[i], &wt)
139
func TestWriterOffset(t *testing.T) {
140
largeData := make([]byte, 1<<17)
141
for i := range largeData {
142
largeData[i] = byte(rand.Int())
144
writeTests[1].Data = largeData
146
writeTests[1].Data = nil
150
buf := new(bytes.Buffer)
151
existingData := []byte{1, 2, 3, 1, 2, 3, 1, 2, 3}
152
n, _ := buf.Write(existingData)
154
w.SetOffset(int64(n))
156
for _, wt := range writeTests {
157
testCreate(t, w, &wt)
160
if err := w.Close(); err != nil {
165
r, err := NewReader(bytes.NewReader(buf.Bytes()), int64(buf.Len()))
169
for i, wt := range writeTests {
170
testReadFile(t, r.File[i], &wt)
174
func TestWriterFlush(t *testing.T) {
176
w := NewWriter(struct{ io.Writer }{&buf})
177
_, err := w.Create("foo")
182
t.Fatalf("Unexpected %d bytes already in buffer", buf.Len())
184
if err := w.Flush(); err != nil {
188
t.Fatal("No bytes written after Flush")
192
func testCreate(t *testing.T, w *Writer, wt *WriteTest) {
193
header := &FileHeader{
198
header.SetMode(wt.Mode)
200
f, err := w.CreateHeader(header)
204
_, err = f.Write(wt.Data)
210
func testReadFile(t *testing.T, f *File, wt *WriteTest) {
211
if f.Name != wt.Name {
212
t.Fatalf("File name: got %q, want %q", f.Name, wt.Name)
214
testFileMode(t, wt.Name, f, wt.Mode)
217
t.Fatal("opening:", err)
219
b, err := ioutil.ReadAll(rc)
221
t.Fatal("reading:", err)
225
t.Fatal("closing:", err)
227
if !bytes.Equal(b, wt.Data) {
228
t.Errorf("File contents %q, want %q", b, wt.Data)
232
func BenchmarkCompressedZipGarbage(b *testing.B) {
235
bigBuf := bytes.Repeat([]byte("a"), 1<<20)
236
for i := 0; i < b.N; i++ {
238
zw := NewWriter(&buf)
239
for j := 0; j < 3; j++ {
240
w, _ := zw.CreateHeader(&FileHeader{