github.com/sashka/siva@v1.6.0/index_test.go (about) 1 package siva 2 3 import ( 4 "bytes" 5 "sort" 6 "time" 7 8 "github.com/google/go-cmp/cmp" 9 "github.com/google/go-cmp/cmp/cmpopts" 10 . "gopkg.in/check.v1" 11 ) 12 13 type IndexSuite struct{} 14 15 var _ = Suite(&IndexSuite{}) 16 17 func (s *IndexSuite) TestIndexWriteToEmpty(c *C) { 18 i := make(Index, 0) 19 err := i.WriteTo(nil) 20 c.Assert(err, Equals, ErrEmptyIndex) 21 } 22 23 func (s *IndexSuite) TestIndexSort(c *C) { 24 i := Index{{absStart: 100}, {absStart: 10}} 25 sort.Sort(i) 26 27 c.Assert(int(i[0].absStart), Equals, 10) 28 c.Assert(int(i[1].absStart), Equals, 100) 29 } 30 31 func (s *IndexSuite) TestIndexFooterIdempotent(c *C) { 32 expected := &IndexFooter{ 33 EntryCount: 2, 34 IndexSize: 42, 35 BlockSize: 84, 36 CRC32: 4242, 37 } 38 39 buf := bytes.NewBuffer(nil) 40 err := expected.WriteTo(buf) 41 c.Assert(err, IsNil) 42 43 footer := &IndexFooter{} 44 err = footer.ReadFrom(buf) 45 c.Assert(err, IsNil) 46 if diff := cmp.Diff(expected, footer, cmpopts.IgnoreUnexported(IndexFooter{})); diff != "" { 47 c.Fatalf("IndexFooter differs:\n%s", diff) 48 } 49 } 50 51 func (s *IndexSuite) TestIndexEntryIdempotent(c *C) { 52 expected := &IndexEntry{} 53 expected.Name = "foo" 54 expected.Mode = 0644 55 expected.ModTime = time.Now() 56 expected.Start = 84 57 expected.Size = 42 58 expected.CRC32 = 4242 59 expected.Flags = FlagDeleted 60 61 buf := bytes.NewBuffer(nil) 62 err := expected.WriteTo(buf) 63 c.Assert(err, IsNil) 64 65 entry := &IndexEntry{} 66 err = entry.ReadFrom(buf) 67 c.Assert(err, IsNil) 68 if diff := cmp.Diff(expected, entry, cmpopts.IgnoreUnexported(IndexEntry{})); diff != "" { 69 c.Fatalf("IndexEntry differs:\n%s", diff) 70 } 71 } 72 73 func (s *IndexSuite) TestFilter(c *C) { 74 i := Index{ 75 {Header: Header{Name: "foo"}, Start: 1}, 76 {Header: Header{Name: "foo"}, Start: 2}, 77 } 78 79 sort.Sort(i) 80 f := i.Filter() 81 c.Assert(f, HasLen, 1) 82 c.Assert(f[0].Start, Equals, uint64(2)) 83 } 84 85 func (s *IndexSuite) TestFilterDeleted(c *C) { 86 i := Index{ 87 {Header: Header{Name: "foo"}, Start: 1}, 88 {Header: Header{Name: "foo", Flags: FlagDeleted}, Start: 2}, 89 } 90 91 sort.Sort(i) 92 f := i.Filter() 93 c.Assert(f, HasLen, 0) 94 } 95 96 func (s *IndexSuite) TestFind(c *C) { 97 i := Index{ 98 {Header: Header{Name: "foo"}, Start: 1}, 99 {Header: Header{Name: "bar"}, Start: 2}, 100 {Header: Header{Name: "dir/file.txt"}, Start: 3}, 101 } 102 103 sort.Sort(i) 104 105 e := i.Find("bar") 106 c.Assert(e, NotNil) 107 c.Assert(e.Start, Equals, uint64(2)) 108 109 e = i.Find("dir\\file.txt") 110 c.Assert(e, NotNil) 111 c.Assert(e.Start, Equals, uint64(3)) 112 } 113 114 func (s *IndexSuite) TestToSafePaths(c *C) { 115 i := Index{ 116 {Header: Header{Name: `C:\foo\bar`}, Start: 1}, 117 {Header: Header{Name: `\\network\share\foo\bar`}, Start: 2}, 118 {Header: Header{Name: `/foo/bar`}, Start: 3}, 119 {Header: Header{Name: `../bar`}, Start: 4}, 120 {Header: Header{Name: `foo/bar/../../baz`}, Start: 5}, 121 } 122 123 f := i.ToSafePaths() 124 expected := Index{ 125 {Header: Header{Name: `foo/bar`}, Start: 1}, 126 {Header: Header{Name: `foo/bar`}, Start: 2}, 127 {Header: Header{Name: `foo/bar`}, Start: 3}, 128 {Header: Header{Name: `bar`}, Start: 4}, 129 {Header: Header{Name: `baz`}, Start: 5}, 130 } 131 c.Assert(f, DeepEquals, expected) 132 }