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  }