Rebase.
[official-gcc.git] / libgo / go / archive / zip / writer_test.go
blob4bfa87080906e1d8176de54947a0efea2e701dce
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.
5 package zip
7 import (
8 "bytes"
9 "io/ioutil"
10 "math/rand"
11 "os"
12 "testing"
15 // TODO(adg): a more sophisticated test suite
17 type WriteTest struct {
18 Name string
19 Data []byte
20 Method uint16
21 Mode os.FileMode
24 var writeTests = []WriteTest{
26 Name: "foo",
27 Data: []byte("Rabbits, guinea pigs, gophers, marsupial rats, and quolls."),
28 Method: Store,
29 Mode: 0666,
32 Name: "bar",
33 Data: nil, // large data set in the test
34 Method: Deflate,
35 Mode: 0644,
38 Name: "setuid",
39 Data: []byte("setuid file"),
40 Method: Deflate,
41 Mode: 0755 | os.ModeSetuid,
44 Name: "setgid",
45 Data: []byte("setgid file"),
46 Method: Deflate,
47 Mode: 0755 | os.ModeSetgid,
50 Name: "symlink",
51 Data: []byte("../link/target"),
52 Method: Deflate,
53 Mode: 0755 | os.ModeSymlink,
57 func TestWriter(t *testing.T) {
58 largeData := make([]byte, 1<<17)
59 for i := range largeData {
60 largeData[i] = byte(rand.Int())
62 writeTests[1].Data = largeData
63 defer func() {
64 writeTests[1].Data = nil
65 }()
67 // write a zip file
68 buf := new(bytes.Buffer)
69 w := NewWriter(buf)
71 for _, wt := range writeTests {
72 testCreate(t, w, &wt)
75 if err := w.Close(); err != nil {
76 t.Fatal(err)
79 // read it back
80 r, err := NewReader(bytes.NewReader(buf.Bytes()), int64(buf.Len()))
81 if err != nil {
82 t.Fatal(err)
84 for i, wt := range writeTests {
85 testReadFile(t, r.File[i], &wt)
89 func testCreate(t *testing.T, w *Writer, wt *WriteTest) {
90 header := &FileHeader{
91 Name: wt.Name,
92 Method: wt.Method,
94 if wt.Mode != 0 {
95 header.SetMode(wt.Mode)
97 f, err := w.CreateHeader(header)
98 if err != nil {
99 t.Fatal(err)
101 _, err = f.Write(wt.Data)
102 if err != nil {
103 t.Fatal(err)
107 func testReadFile(t *testing.T, f *File, wt *WriteTest) {
108 if f.Name != wt.Name {
109 t.Fatalf("File name: got %q, want %q", f.Name, wt.Name)
111 testFileMode(t, wt.Name, f, wt.Mode)
112 rc, err := f.Open()
113 if err != nil {
114 t.Fatal("opening:", err)
116 b, err := ioutil.ReadAll(rc)
117 if err != nil {
118 t.Fatal("reading:", err)
120 err = rc.Close()
121 if err != nil {
122 t.Fatal("closing:", err)
124 if !bytes.Equal(b, wt.Data) {
125 t.Errorf("File contents %q, want %q", b, wt.Data)
129 func BenchmarkCompressedZipGarbage(b *testing.B) {
130 b.ReportAllocs()
131 var buf bytes.Buffer
132 bigBuf := bytes.Repeat([]byte("a"), 1<<20)
133 for i := 0; i < b.N; i++ {
134 buf.Reset()
135 zw := NewWriter(&buf)
136 for j := 0; j < 3; j++ {
137 w, _ := zw.CreateHeader(&FileHeader{
138 Name: "foo",
139 Method: Deflate,
141 w.Write(bigBuf)
143 zw.Close()