github.com/sashka/siva@v1.6.0/writer_test.go (about)

     1  package siva
     2  
     3  import (
     4  	"bytes"
     5  	"io/ioutil"
     6  	"time"
     7  
     8  	. "gopkg.in/check.v1"
     9  )
    10  
    11  type WriterSuite struct{}
    12  
    13  var _ = Suite(&WriterSuite{})
    14  
    15  func (s *WriterSuite) TestWriteEmpty(c *C) {
    16  	buf := new(bytes.Buffer)
    17  	w := NewWriter(buf)
    18  	err := w.Close()
    19  	c.Assert(err, Equals, nil)
    20  	c.Assert(buf.Len(), Equals, 0)
    21  }
    22  
    23  func (s *WriterSuite) TestCloseTwice(c *C) {
    24  	buf := new(bytes.Buffer)
    25  	w := NewWriter(buf)
    26  	err := w.Close()
    27  	c.Assert(err, Equals, nil)
    28  
    29  	err = w.Close()
    30  	c.Assert(err, Equals, ErrClosedWriter)
    31  }
    32  
    33  func (s *WriterSuite) TestFlushWithoutHeader(c *C) {
    34  	buf := new(bytes.Buffer)
    35  	w := NewWriter(buf)
    36  	err := w.Flush()
    37  	c.Assert(err, Equals, ErrMissingHeader)
    38  }
    39  
    40  func (s *WriterSuite) TestFlushOnClose(c *C) {
    41  	buf := new(bytes.Buffer)
    42  	w := NewWriter(buf)
    43  	w.Close()
    44  
    45  	err := w.Flush()
    46  	c.Assert(err, Equals, ErrClosedWriter)
    47  }
    48  
    49  func (s *WriterSuite) TestDoubleFlushRegression(c *C) {
    50  	buf := new(bytes.Buffer)
    51  	w := NewWriter(buf)
    52  	const data = "foo"
    53  	c.Assert(w.WriteHeader(&Header{
    54  		Name: "test.txt",
    55  		Mode: 0640,
    56  	}), IsNil)
    57  	_, err := w.Write([]byte(data))
    58  	c.Assert(err, IsNil)
    59  	c.Assert(w.Flush(), IsNil)
    60  	want := *w.(*writer).index[0]
    61  	c.Assert(w.Close(), IsNil)
    62  	got := *w.(*writer).index[0]
    63  	c.Assert(got, Equals, want)
    64  }
    65  
    66  func (s *WriterSuite) TestWriterReaderIdempotent(c *C) {
    67  	buf := new(bytes.Buffer)
    68  	w := NewWriter(buf)
    69  	for _, file := range files {
    70  		s.writeFixture(c, w, file)
    71  	}
    72  
    73  	err := w.Close()
    74  	c.Assert(err, IsNil)
    75  
    76  	r := NewReader(bytes.NewReader(buf.Bytes()))
    77  	index, err := r.Index()
    78  	c.Assert(err, IsNil)
    79  	s.assertIndex(c, r, index)
    80  }
    81  
    82  func (s *WriterSuite) TestWriterReaderIdempotentMultiWrite(c *C) {
    83  	buf := new(bytes.Buffer)
    84  	w := NewWriter(buf)
    85  	for _, file := range files[0:1] {
    86  		s.writeFixture(c, w, file)
    87  	}
    88  
    89  	err := w.Close()
    90  	c.Assert(err, IsNil)
    91  
    92  	w = NewWriter(buf)
    93  	for _, file := range files[1:] {
    94  		s.writeFixture(c, w, file)
    95  	}
    96  
    97  	err = w.Close()
    98  	c.Assert(err, IsNil)
    99  
   100  	r := NewReader(bytes.NewReader(buf.Bytes()))
   101  	index, err := r.Index()
   102  	c.Assert(err, IsNil)
   103  	s.assertIndex(c, r, index)
   104  }
   105  
   106  func (s *WriterSuite) assertIndex(c *C, r Reader, index Index) {
   107  	c.Assert(index, HasLen, 3)
   108  
   109  	for i, e := range index {
   110  		c.Assert(e.Name, Equals, files[i].Name)
   111  
   112  		r, err := r.Get(e)
   113  		c.Assert(err, IsNil)
   114  
   115  		content, err := ioutil.ReadAll(r)
   116  		c.Assert(err, IsNil)
   117  		c.Assert(string(content), Equals, files[i].Body)
   118  	}
   119  }
   120  
   121  func (s *WriterSuite) writeFixture(c *C, w Writer, file fileFixture) {
   122  	hdr := &Header{
   123  		Name:    file.Name,
   124  		Mode:    0600,
   125  		ModTime: time.Now(),
   126  	}
   127  
   128  	err := w.WriteHeader(hdr)
   129  	c.Assert(err, IsNil)
   130  
   131  	n, err := w.Write([]byte(file.Body))
   132  	c.Assert(err, IsNil)
   133  	c.Assert(n, Equals, len(file.Body))
   134  }
   135  
   136  func (s *WriterSuite) TestWriterZeroLength(c *C) {
   137  	buf := new(bytes.Buffer)
   138  	w := NewWriter(buf)
   139  
   140  	s.writeFixture(c, w, files[0])
   141  
   142  	err := w.WriteHeader(&Header{
   143  		Name:    "empty-file",
   144  		Mode:    0600,
   145  		ModTime: time.Now(),
   146  	})
   147  
   148  	c.Assert(err, IsNil)
   149  	s.writeFixture(c, w, files[1])
   150  
   151  	err = w.WriteHeader(&Header{
   152  		Name:    "C:\\some\\path\\file.txt",
   153  		Mode:    0600,
   154  		ModTime: time.Now(),
   155  	})
   156  	c.Assert(err, IsNil)
   157  
   158  	err = w.Close()
   159  	c.Assert(err, IsNil)
   160  
   161  	r := NewReader(bytes.NewReader(buf.Bytes()))
   162  	index, err := r.Index()
   163  	c.Assert(err, IsNil)
   164  
   165  	oi := OrderedIndex(index)
   166  	oi.Sort()
   167  
   168  	c.Assert(index[0].Name, Equals, "empty-file")
   169  	c.Assert(index[0].Size, Equals, uint64(0))
   170  	c.Assert(index[1].Name, Equals, "gopher.txt")
   171  	c.Assert(index[2].Name, Equals, "readme.txt")
   172  	c.Assert(index[3].Name, Equals, "some/path/file.txt")
   173  }