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 }