github.com/varialus/godfly@v0.0.0-20130904042352-1934f9f095ab/src/pkg/archive/zip/writer_test.go (about)

     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.
     4  
     5  package zip
     6  
     7  import (
     8  	"bytes"
     9  	"io/ioutil"
    10  	"math/rand"
    11  	"os"
    12  	"testing"
    13  )
    14  
    15  // TODO(adg): a more sophisticated test suite
    16  
    17  type WriteTest struct {
    18  	Name   string
    19  	Data   []byte
    20  	Method uint16
    21  	Mode   os.FileMode
    22  }
    23  
    24  var writeTests = []WriteTest{
    25  	{
    26  		Name:   "foo",
    27  		Data:   []byte("Rabbits, guinea pigs, gophers, marsupial rats, and quolls."),
    28  		Method: Store,
    29  		Mode:   0666,
    30  	},
    31  	{
    32  		Name:   "bar",
    33  		Data:   nil, // large data set in the test
    34  		Method: Deflate,
    35  		Mode:   0644,
    36  	},
    37  	{
    38  		Name:   "setuid",
    39  		Data:   []byte("setuid file"),
    40  		Method: Deflate,
    41  		Mode:   0755 | os.ModeSetuid,
    42  	},
    43  	{
    44  		Name:   "setgid",
    45  		Data:   []byte("setgid file"),
    46  		Method: Deflate,
    47  		Mode:   0755 | os.ModeSetgid,
    48  	},
    49  	{
    50  		Name:   "symlink",
    51  		Data:   []byte("../link/target"),
    52  		Method: Deflate,
    53  		Mode:   0755 | os.ModeSymlink,
    54  	},
    55  }
    56  
    57  func TestWriter(t *testing.T) {
    58  	largeData := make([]byte, 1<<17)
    59  	for i := range largeData {
    60  		largeData[i] = byte(rand.Int())
    61  	}
    62  	writeTests[1].Data = largeData
    63  	defer func() {
    64  		writeTests[1].Data = nil
    65  	}()
    66  
    67  	// write a zip file
    68  	buf := new(bytes.Buffer)
    69  	w := NewWriter(buf)
    70  
    71  	for _, wt := range writeTests {
    72  		testCreate(t, w, &wt)
    73  	}
    74  
    75  	if err := w.Close(); err != nil {
    76  		t.Fatal(err)
    77  	}
    78  
    79  	// read it back
    80  	r, err := NewReader(bytes.NewReader(buf.Bytes()), int64(buf.Len()))
    81  	if err != nil {
    82  		t.Fatal(err)
    83  	}
    84  	for i, wt := range writeTests {
    85  		testReadFile(t, r.File[i], &wt)
    86  	}
    87  }
    88  
    89  func testCreate(t *testing.T, w *Writer, wt *WriteTest) {
    90  	header := &FileHeader{
    91  		Name:   wt.Name,
    92  		Method: wt.Method,
    93  	}
    94  	if wt.Mode != 0 {
    95  		header.SetMode(wt.Mode)
    96  	}
    97  	f, err := w.CreateHeader(header)
    98  	if err != nil {
    99  		t.Fatal(err)
   100  	}
   101  	_, err = f.Write(wt.Data)
   102  	if err != nil {
   103  		t.Fatal(err)
   104  	}
   105  }
   106  
   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)
   110  	}
   111  	testFileMode(t, wt.Name, f, wt.Mode)
   112  	rc, err := f.Open()
   113  	if err != nil {
   114  		t.Fatal("opening:", err)
   115  	}
   116  	b, err := ioutil.ReadAll(rc)
   117  	if err != nil {
   118  		t.Fatal("reading:", err)
   119  	}
   120  	err = rc.Close()
   121  	if err != nil {
   122  		t.Fatal("closing:", err)
   123  	}
   124  	if !bytes.Equal(b, wt.Data) {
   125  		t.Errorf("File contents %q, want %q", b, wt.Data)
   126  	}
   127  }