package fsnoder
import (
"reflect"
"sort"
"github.com/go-git/go-git/v5/utils/merkletrie/noder"
. "gopkg.in/check.v1"
)
type DirSuite struct{}
var _ = Suite(&DirSuite{})
func (s *DirSuite) TestIsDir(c *C) {
noName, err := newDir("", nil)
c.Assert(err, IsNil)
c.Assert(noName.IsDir(), Equals, true)
empty, err := newDir("empty", nil)
c.Assert(err, IsNil)
c.Assert(empty.IsDir(), Equals, true)
root, err := newDir("foo", []noder.Noder{empty})
c.Assert(err, IsNil)
c.Assert(root.IsDir(), Equals, true)
}
func assertChildren(c *C, n noder.Noder, expected []noder.Noder) {
numChildren, err := n.NumChildren()
c.Assert(err, IsNil)
c.Assert(numChildren, Equals, len(expected))
children, err := n.Children()
c.Assert(err, IsNil)
c.Assert(children, sortedSliceEquals, expected)
}
type sortedSliceEqualsChecker struct {
*CheckerInfo
}
var sortedSliceEquals Checker = &sortedSliceEqualsChecker{
&CheckerInfo{
Name: "sortedSliceEquals",
Params: []string{"obtained", "expected"},
},
}
func (checker *sortedSliceEqualsChecker) Check(
params []interface{}, names []string) (result bool, error string) {
a, ok := params[0].([]noder.Noder)
if !ok {
return false, "first parameter must be a []noder.Noder"
}
b, ok := params[1].([]noder.Noder)
if !ok {
return false, "second parameter must be a []noder.Noder"
}
sort.Sort(byName(a))
sort.Sort(byName(b))
return reflect.DeepEqual(a, b), ""
}
func (s *DirSuite) TestNewDirectoryNoNameAndEmpty(c *C) {
root, err := newDir("", nil)
c.Assert(err, IsNil)
c.Assert(root.Hash(), DeepEquals,
[]byte{0xca, 0x40, 0xf8, 0x67, 0x57, 0x8c, 0x32, 0x1c})
c.Assert(root.Name(), Equals, "")
assertChildren(c, root, noder.NoChildren)
c.Assert(root.String(), Equals, "()")
}
func (s *DirSuite) TestNewDirectoryEmpty(c *C) {
root, err := newDir("root", nil)
c.Assert(err, IsNil)
c.Assert(root.Hash(), DeepEquals,
[]byte{0xca, 0x40, 0xf8, 0x67, 0x57, 0x8c, 0x32, 0x1c})
c.Assert(root.Name(), Equals, "root")
assertChildren(c, root, noder.NoChildren)
c.Assert(root.String(), Equals, "root()")
}
func (s *DirSuite) TestEmptyDirsHaveSameHash(c *C) {
d1, err := newDir("foo", nil)
c.Assert(err, IsNil)
d2, err := newDir("bar", nil)
c.Assert(err, IsNil)
c.Assert(d1.Hash(), DeepEquals, d2.Hash())
}
func (s *DirSuite) TestNewDirWithEmptyDir(c *C) {
empty, err := newDir("empty", nil)
c.Assert(err, IsNil)
root, err := newDir("", []noder.Noder{empty})
c.Assert(err, IsNil)
c.Assert(root.Hash(), DeepEquals,
[]byte{0x39, 0x25, 0xa8, 0x99, 0x16, 0x47, 0x6a, 0x75})
c.Assert(root.Name(), Equals, "")
assertChildren(c, root, []noder.Noder{empty})
c.Assert(root.String(), Equals, "(empty())")
}
func (s *DirSuite) TestNewDirWithOneEmptyFile(c *C) {
empty, err := newFile("name", "")
c.Assert(err, IsNil)
root, err := newDir("", []noder.Noder{empty})
c.Assert(err, IsNil)
c.Assert(root.Hash(), DeepEquals,
[]byte{0xd, 0x4e, 0x23, 0x1d, 0xf5, 0x2e, 0xfa, 0xc2})
c.Assert(root.Name(), Equals, "")
assertChildren(c, root, []noder.Noder{empty})
c.Assert(root.String(), Equals, "(name<>)")
}
func (s *DirSuite) TestNewDirWithOneFile(c *C) {
a, err := newFile("a", "1")
c.Assert(err, IsNil)
root, err := newDir("", []noder.Noder{a})
c.Assert(err, IsNil)
c.Assert(root.Hash(), DeepEquals,
[]byte{0x96, 0xab, 0x29, 0x54, 0x2, 0x9e, 0x89, 0x28})
c.Assert(root.Name(), Equals, "")
assertChildren(c, root, []noder.Noder{a})
c.Assert(root.String(), Equals, "(a<1>)")
}
func (s *DirSuite) TestDirsWithSameFileHaveSameHash(c *C) {
f1, err := newFile("a", "1")
c.Assert(err, IsNil)
r1, err := newDir("", []noder.Noder{f1})
c.Assert(err, IsNil)
f2, err := newFile("a", "1")
c.Assert(err, IsNil)
r2, err := newDir("", []noder.Noder{f2})
c.Assert(err, IsNil)
c.Assert(r1.Hash(), DeepEquals, r2.Hash())
}
func (s *DirSuite) TestDirsWithDifferentFileContentHaveDifferentHash(c *C) {
f1, err := newFile("a", "1")
c.Assert(err, IsNil)
r1, err := newDir("", []noder.Noder{f1})
c.Assert(err, IsNil)
f2, err := newFile("a", "2")
c.Assert(err, IsNil)
r2, err := newDir("", []noder.Noder{f2})
c.Assert(err, IsNil)
c.Assert(r1.Hash(), Not(DeepEquals), r2.Hash())
}
func (s *DirSuite) TestDirsWithDifferentFileNameHaveDifferentHash(c *C) {
f1, err := newFile("a", "1")
c.Assert(err, IsNil)
r1, err := newDir("", []noder.Noder{f1})
c.Assert(err, IsNil)
f2, err := newFile("b", "1")
c.Assert(err, IsNil)
r2, err := newDir("", []noder.Noder{f2})
c.Assert(err, IsNil)
c.Assert(r1.Hash(), Not(DeepEquals), r2.Hash())
}
func (s *DirSuite) TestDirsWithDifferentFileHaveDifferentHash(c *C) {
f1, err := newFile("a", "1")
c.Assert(err, IsNil)
r1, err := newDir("", []noder.Noder{f1})
c.Assert(err, IsNil)
f2, err := newFile("b", "2")
c.Assert(err, IsNil)
r2, err := newDir("", []noder.Noder{f2})
c.Assert(err, IsNil)
c.Assert(r1.Hash(), Not(DeepEquals), r2.Hash())
}
func (s *DirSuite) TestDirWithEmptyDirHasDifferentHashThanEmptyDir(c *C) {
f, err := newFile("a", "")
c.Assert(err, IsNil)
r1, err := newDir("", []noder.Noder{f})
c.Assert(err, IsNil)
d, err := newDir("a", nil)
c.Assert(err, IsNil)
r2, err := newDir("", []noder.Noder{d})
c.Assert(err, IsNil)
c.Assert(r1.Hash(), Not(DeepEquals), r2.Hash())
}
func (s *DirSuite) TestNewDirWithTwoFilesSameContent(c *C) {
a1, err := newFile("a", "1")
c.Assert(err, IsNil)
b1, err := newFile("b", "1")
c.Assert(err, IsNil)
root, err := newDir("", []noder.Noder{a1, b1})
c.Assert(err, IsNil)
c.Assert(root.Hash(), DeepEquals,
[]byte{0xc7, 0xc4, 0xbf, 0x70, 0x33, 0xb9, 0x57, 0xdb})
c.Assert(root.Name(), Equals, "")
assertChildren(c, root, []noder.Noder{b1, a1})
c.Assert(root.String(), Equals, "(a<1> b<1>)")
}
func (s *DirSuite) TestNewDirWithTwoFilesDifferentContent(c *C) {
a1, err := newFile("a", "1")
c.Assert(err, IsNil)
b2, err := newFile("b", "2")
c.Assert(err, IsNil)
root, err := newDir("", []noder.Noder{a1, b2})
c.Assert(err, IsNil)
c.Assert(root.Hash(), DeepEquals,
[]byte{0x94, 0x8a, 0x9d, 0x8f, 0x6d, 0x98, 0x34, 0x55})
c.Assert(root.Name(), Equals, "")
assertChildren(c, root, []noder.Noder{b2, a1})
}
func (s *DirSuite) TestCrazy(c *C) {
// ""
// |
// -------------------------
// | | | | |
// a1 B c1 d2 E
// | |
// ------------- E
// | | | | |
// A B X c1 E
// | |
// a1 e1
e1, err := newFile("e", "1")
c.Assert(err, IsNil)
E, err := newDir("e", []noder.Noder{e1})
c.Assert(err, IsNil)
E, err = newDir("e", []noder.Noder{E})
c.Assert(err, IsNil)
E, err = newDir("e", []noder.Noder{E})
c.Assert(err, IsNil)
A, err := newDir("a", nil)
c.Assert(err, IsNil)
B, err := newDir("b", nil)
c.Assert(err, IsNil)
a1, err := newFile("a", "1")
c.Assert(err, IsNil)
X, err := newDir("x", []noder.Noder{a1})
c.Assert(err, IsNil)
c1, err := newFile("c", "1")
c.Assert(err, IsNil)
B, err = newDir("b", []noder.Noder{c1, B, X, A})
c.Assert(err, IsNil)
a1, err = newFile("a", "1")
c.Assert(err, IsNil)
c1, err = newFile("c", "1")
c.Assert(err, IsNil)
d2, err := newFile("d", "2")
c.Assert(err, IsNil)
root, err := newDir("", []noder.Noder{a1, d2, E, B, c1})
c.Assert(err, IsNil)
c.Assert(root.Hash(), DeepEquals,
[]byte{0xc3, 0x72, 0x9d, 0xf1, 0xcc, 0xec, 0x6d, 0xbb})
c.Assert(root.Name(), Equals, "")
assertChildren(c, root, []noder.Noder{E, c1, B, a1, d2})
c.Assert(root.String(), Equals,
"(a<1> b(a() b() c<1> x(a<1>)) c<1> d<2> e(e(e(e<1>))))")
}
func (s *DirSuite) TestDirCannotHaveDirWithNoName(c *C) {
noName, err := newDir("", nil)
c.Assert(err, IsNil)
_, err = newDir("", []noder.Noder{noName})
c.Assert(err, Not(IsNil))
}
func (s *DirSuite) TestDirCannotHaveDuplicatedFiles(c *C) {
f1, err := newFile("a", "1")
c.Assert(err, IsNil)
f2, err := newFile("a", "1")
c.Assert(err, IsNil)
_, err = newDir("", []noder.Noder{f1, f2})
c.Assert(err, Not(IsNil))
}
func (s *DirSuite) TestDirCannotHaveDuplicatedFileNames(c *C) {
a1, err := newFile("a", "1")
c.Assert(err, IsNil)
a2, err := newFile("a", "2")
c.Assert(err, IsNil)
_, err = newDir("", []noder.Noder{a1, a2})
c.Assert(err, Not(IsNil))
}
func (s *DirSuite) TestDirCannotHaveDuplicatedDirNames(c *C) {
d1, err := newDir("a", nil)
c.Assert(err, IsNil)
d2, err := newDir("a", nil)
c.Assert(err, IsNil)
_, err = newDir("", []noder.Noder{d1, d2})
c.Assert(err, Not(IsNil))
}
func (s *DirSuite) TestDirCannotHaveDirAndFileWithSameName(c *C) {
f, err := newFile("a", "")
c.Assert(err, IsNil)
d, err := newDir("a", nil)
c.Assert(err, IsNil)
_, err = newDir("", []noder.Noder{f, d})
c.Assert(err, Not(IsNil))
}
func (s *DirSuite) TestUnsortedString(c *C) {
b, err := newDir("b", nil)
c.Assert(err, IsNil)
z, err := newDir("z", nil)
c.Assert(err, IsNil)
a1, err := newFile("a", "1")
c.Assert(err, IsNil)
c2, err := newFile("c", "2")
c.Assert(err, IsNil)
d3, err := newFile("d", "3")
c.Assert(err, IsNil)
d, err := newDir("d", []noder.Noder{c2, z, d3, a1, b})
c.Assert(err, IsNil)
c.Assert(d.String(), Equals, "d(a<1> b() c<2> d<3> z())")
}