github.com/sashka/siva@v1.6.0/reader_test.go (about) 1 package siva 2 3 import ( 4 "bytes" 5 "io/ioutil" 6 "os" 7 "sort" 8 9 . "gopkg.in/check.v1" 10 ) 11 12 type ReaderSuite struct{} 13 14 var _ = Suite(&ReaderSuite{}) 15 16 func (s *ReaderSuite) TestIndex(c *C) { 17 s.testIndex(c, "fixtures/basic.siva") 18 } 19 20 func (s *ReaderSuite) TestIndexSeveralBlocks(c *C) { 21 s.testIndex(c, "fixtures/blocks.siva") 22 } 23 24 func (s *ReaderSuite) TestIndexOverwrittenFiles(c *C) { 25 s.testIndex(c, "fixtures/overwritten.siva") 26 } 27 28 func (s *ReaderSuite) testIndex(c *C, fixture string) { 29 f, err := os.Open(fixture) 30 c.Assert(err, IsNil) 31 32 r := NewReader(f) 33 i, err := r.Index() 34 i = i.Filter() 35 c.Assert(err, IsNil) 36 c.Assert(i, HasLen, 3) 37 for j, e := range i { 38 c.Assert(e.Name, Equals, files[j].Name) 39 } 40 41 } 42 43 func (s *ReaderSuite) TestGet(c *C) { 44 f, err := os.Open("fixtures/blocks.siva") 45 c.Assert(err, IsNil) 46 47 r := NewReader(f) 48 i, err := r.Index() 49 c.Assert(err, IsNil) 50 c.Assert(i, HasLen, 3) 51 52 for j, e := range i { 53 content, err := r.Get(e) 54 c.Assert(err, IsNil) 55 56 bytes, err := ioutil.ReadAll(content) 57 c.Assert(err, IsNil) 58 59 c.Assert(string(bytes), Equals, files[j].Body) 60 } 61 } 62 63 func (s *ReaderSuite) TestSeekAndRead(c *C) { 64 f, err := os.Open("fixtures/blocks.siva") 65 c.Assert(err, IsNil) 66 67 r := NewReader(f) 68 i, err := r.Index() 69 c.Assert(err, IsNil) 70 c.Assert(i, HasLen, 3) 71 72 for j, e := range i { 73 position, err := r.Seek(e) 74 c.Assert(err, IsNil) 75 c.Assert(uint64(position), Equals, e.absStart) 76 77 bytes, err := ioutil.ReadAll(r) 78 c.Assert(err, IsNil) 79 80 c.Assert(string(bytes), Equals, files[j].Body) 81 } 82 } 83 84 func (s *ReaderSuite) TestIndexGlob(c *C) { 85 s.testIndexGlob(c, "*", []string{ 86 "file.txt", 87 }) 88 s.testIndexGlob(c, "*/*", []string{ 89 "letters/a", 90 "letters/b", 91 "letters/c", 92 "numbers/1", 93 "numbers/2", 94 "numbers/3", 95 }) 96 s.testIndexGlob(c, "letters/*", []string{ 97 "letters/a", 98 "letters/b", 99 "letters/c", 100 }) 101 s.testIndexGlob(c, "numbers\\*", []string{ 102 "numbers/1", 103 "numbers/2", 104 "numbers/3", 105 }) 106 s.testIndexGlob(c, "nonexistent/*", []string{}) 107 } 108 109 func (s *ReaderSuite) testIndexGlob(c *C, pattern string, expected []string) { 110 f, err := os.Open("fixtures/dirs.siva") 111 c.Assert(err, IsNil) 112 113 r := NewReader(f) 114 i, err := r.Index() 115 c.Assert(err, IsNil) 116 c.Assert(i, HasLen, 7) 117 118 matches, err := i.Glob(pattern) 119 c.Assert(err, IsNil) 120 matchNames := []string{} 121 for _, match := range matches { 122 matchNames = append(matchNames, match.Name) 123 } 124 sort.Strings(matchNames) 125 126 c.Assert(matchNames, DeepEquals, expected) 127 128 c.Assert(f.Close(), IsNil) 129 } 130 131 func (s *ReaderSuite) TestOffset(c *C) { 132 data, err := ioutil.ReadFile("fixtures/basic.siva") 133 c.Assert(err, IsNil) 134 135 indexOffset := uint64(len(data)) 136 data = append(data, 0, 0, 0, 0, 0, 0, 0, 0) 137 buf := bytes.NewReader(data) 138 139 r := NewReader(buf) 140 _, err = r.Index() 141 _, ok := err.(*IndexReadError) 142 c.Assert(ok, Equals, true) 143 144 r = NewReaderWithOffset(buf, indexOffset) 145 i, err := r.Index() 146 c.Assert(err, IsNil) 147 148 entry := i.Find("gopher.txt") 149 c.Assert(entry, NotNil) 150 c.Assert(entry.Size, Equals, uint64(35)) 151 }