2016-09-06 22:40:32 +03:00
|
|
|
#!/usr/bin/env python2.7
|
|
|
|
|
2016-09-21 23:51:39 +03:00
|
|
|
import os
|
2016-09-10 01:24:06 +03:00
|
|
|
import random
|
2016-09-21 23:51:39 +03:00
|
|
|
import sys
|
2016-09-06 22:40:32 +03:00
|
|
|
import unittest
|
|
|
|
|
|
|
|
import silenttestrunner
|
|
|
|
|
2016-09-21 23:51:39 +03:00
|
|
|
# Add the repo root to the path so we can find the built ctreemanifest
|
|
|
|
sys.path.insert(0, os.path.dirname(os.path.dirname(__file__)))
|
2016-09-06 22:40:32 +03:00
|
|
|
import ctreemanifest
|
|
|
|
|
|
|
|
class FakeStore(object):
|
2016-09-20 02:28:50 +03:00
|
|
|
def __init__(self):
|
|
|
|
self._data = {}
|
|
|
|
|
|
|
|
def get(self, path, node):
|
|
|
|
return self._data[(path, node)]
|
|
|
|
|
|
|
|
def add(self, path, node, deltabase, value):
|
|
|
|
self._data[(path, node)] = value
|
2016-09-06 22:40:32 +03:00
|
|
|
|
2016-09-18 23:41:51 +03:00
|
|
|
def getvalidflag():
|
|
|
|
# t is reserved as a directory entry, so don't go around setting that as the
|
|
|
|
# flag.
|
|
|
|
while True:
|
|
|
|
r = random.randint(0, 255)
|
|
|
|
if r != ord('t'):
|
|
|
|
return chr(r)
|
|
|
|
|
2016-09-10 01:24:17 +03:00
|
|
|
def hashflags(requireflag=False):
|
2016-09-10 01:24:06 +03:00
|
|
|
h = ''.join([chr(random.randint(0, 255)) for x in range(20)])
|
2016-09-10 01:24:17 +03:00
|
|
|
if random.randint(0, 1) == 0 and requireflag is False:
|
2016-09-10 01:24:06 +03:00
|
|
|
f = ''
|
|
|
|
else:
|
2016-09-18 23:41:51 +03:00
|
|
|
f = getvalidflag()
|
2016-09-18 23:40:59 +03:00
|
|
|
return h, f
|
2016-09-10 01:24:06 +03:00
|
|
|
|
2016-09-06 22:40:32 +03:00
|
|
|
class ctreemanifesttests(unittest.TestCase):
|
2016-09-20 02:28:50 +03:00
|
|
|
def setUp(self):
|
|
|
|
random.seed(0)
|
|
|
|
|
2016-09-06 22:40:32 +03:00
|
|
|
def testInitialization(self):
|
|
|
|
a = ctreemanifest.treemanifest(FakeStore())
|
|
|
|
|
2016-09-18 23:40:14 +03:00
|
|
|
def testEmptyFlag(self):
|
|
|
|
a = ctreemanifest.treemanifest(FakeStore())
|
2016-09-18 23:40:59 +03:00
|
|
|
h, f = hashflags()[0], ''
|
|
|
|
a.set("abc", h, f)
|
|
|
|
out = a.find("abc")
|
|
|
|
self.assertEquals((h, f), out)
|
2016-09-18 23:40:14 +03:00
|
|
|
|
|
|
|
def testNullFlag(self):
|
|
|
|
a = ctreemanifest.treemanifest(FakeStore())
|
2016-09-18 23:40:59 +03:00
|
|
|
h, f = hashflags()[0], '\0'
|
|
|
|
a.set("abc", h, f)
|
|
|
|
out = a.find("abc")
|
|
|
|
self.assertEquals((h, f), out)
|
2016-09-18 23:40:14 +03:00
|
|
|
|
2016-09-10 01:24:06 +03:00
|
|
|
def testSetGet(self):
|
|
|
|
a = ctreemanifest.treemanifest(FakeStore())
|
2016-09-18 23:40:59 +03:00
|
|
|
h, f = hashflags()
|
|
|
|
a.set("abc", h, f)
|
|
|
|
out = a.find("abc")
|
|
|
|
self.assertEquals((h, f), out)
|
2016-09-10 01:24:06 +03:00
|
|
|
|
|
|
|
def testUpdate(self):
|
|
|
|
a = ctreemanifest.treemanifest(FakeStore())
|
2016-09-18 23:40:59 +03:00
|
|
|
h, f = hashflags()
|
|
|
|
a.set("abc", h, f)
|
|
|
|
out = a.find("abc")
|
|
|
|
self.assertEquals((h, f), out)
|
2016-09-10 01:24:06 +03:00
|
|
|
|
2016-09-18 23:40:59 +03:00
|
|
|
h, f = hashflags()
|
|
|
|
a.set("abc", h, f)
|
|
|
|
out = a.find("abc")
|
|
|
|
self.assertEquals((h, f), out)
|
2016-09-10 01:24:06 +03:00
|
|
|
|
2016-09-18 23:44:50 +03:00
|
|
|
def testDirAfterFile(self):
|
2016-09-10 01:24:06 +03:00
|
|
|
a = ctreemanifest.treemanifest(FakeStore())
|
2016-09-18 23:44:50 +03:00
|
|
|
file_h, file_f = hashflags()
|
|
|
|
a.set("abc", file_h, file_f)
|
2016-09-18 23:40:59 +03:00
|
|
|
out = a.find("abc")
|
2016-09-18 23:44:50 +03:00
|
|
|
self.assertEquals((file_h, file_f), out)
|
2016-09-10 01:24:06 +03:00
|
|
|
|
2016-09-18 23:44:50 +03:00
|
|
|
dir_h, dir_f = hashflags()
|
|
|
|
a.set("abc/def", dir_h, dir_f)
|
|
|
|
out = a.find("abc/def")
|
|
|
|
self.assertEquals((dir_h, dir_f), out)
|
|
|
|
|
|
|
|
out = a.find("abc")
|
|
|
|
self.assertEquals((file_h, file_f), out)
|
|
|
|
|
|
|
|
def testFileAfterDir(self):
|
|
|
|
a = ctreemanifest.treemanifest(FakeStore())
|
|
|
|
dir_h, dir_f = hashflags()
|
|
|
|
a.set("abc/def", dir_h, dir_f)
|
|
|
|
out = a.find("abc/def")
|
|
|
|
self.assertEquals((dir_h, dir_f), out)
|
|
|
|
|
|
|
|
file_h, file_f = hashflags()
|
|
|
|
a.set("abc", file_h, file_f)
|
|
|
|
out = a.find("abc")
|
|
|
|
self.assertEquals((file_h, file_f), out)
|
|
|
|
|
|
|
|
out = a.find("abc/def")
|
|
|
|
self.assertEquals((dir_h, dir_f), out)
|
2016-09-10 01:24:06 +03:00
|
|
|
|
2016-09-10 01:24:17 +03:00
|
|
|
def testDeeplyNested(self):
|
|
|
|
a = ctreemanifest.treemanifest(FakeStore())
|
2016-09-18 23:40:59 +03:00
|
|
|
h, f = hashflags()
|
|
|
|
a.set("abc/def/ghi/jkl", h, f)
|
|
|
|
out = a.find("abc/def/ghi/jkl")
|
|
|
|
self.assertEquals((h, f), out)
|
2016-09-10 01:24:17 +03:00
|
|
|
|
2016-09-18 23:40:59 +03:00
|
|
|
h, f = hashflags()
|
|
|
|
a.set("abc/def/ghi/jkl2", h, f)
|
|
|
|
out = a.find("abc/def/ghi/jkl2")
|
|
|
|
self.assertEquals((h, f), out)
|
2016-09-10 01:24:17 +03:00
|
|
|
|
|
|
|
def testDeeplyNested(self):
|
|
|
|
a = ctreemanifest.treemanifest(FakeStore())
|
2016-09-18 23:40:59 +03:00
|
|
|
h, f = hashflags()
|
|
|
|
a.set("abc/def/ghi/jkl", h, f)
|
|
|
|
out = a.find("abc/def/ghi/jkl")
|
|
|
|
self.assertEquals((h, f), out)
|
2016-09-10 01:24:17 +03:00
|
|
|
|
2016-09-18 23:40:59 +03:00
|
|
|
h, f = hashflags()
|
|
|
|
a.set("abc/def/ghi/jkl2", h, f)
|
|
|
|
out = a.find("abc/def/ghi/jkl2")
|
|
|
|
self.assertEquals((h, f), out)
|
2016-09-10 01:24:17 +03:00
|
|
|
|
|
|
|
def testBushyTrees(self):
|
|
|
|
a = ctreemanifest.treemanifest(FakeStore())
|
|
|
|
nodes = {}
|
|
|
|
for ix in range(111):
|
2016-09-18 23:40:59 +03:00
|
|
|
h, f = hashflags()
|
|
|
|
nodes["abc/def/ghi/jkl%d" % ix] = (h, f)
|
2016-09-10 01:24:17 +03:00
|
|
|
|
|
|
|
for fp, (h, f) in nodes.items():
|
|
|
|
a.set(fp, h, f)
|
|
|
|
|
|
|
|
for fp, (h, f) in nodes.items():
|
2016-09-13 10:41:06 +03:00
|
|
|
out = a.find(fp)
|
2016-09-10 01:24:17 +03:00
|
|
|
self.assertEquals((h, f), out)
|
|
|
|
|
|
|
|
def testFlagChanges(self):
|
|
|
|
a = ctreemanifest.treemanifest(FakeStore())
|
|
|
|
|
|
|
|
# go from no flags to with flags, back to no flags.
|
2016-09-18 23:40:59 +03:00
|
|
|
h, f = hashflags(requireflag=True)
|
|
|
|
self.assertEquals(len(f), 1)
|
2016-09-10 01:24:17 +03:00
|
|
|
|
2016-09-18 23:40:59 +03:00
|
|
|
a.set("abc", h, '')
|
|
|
|
out = a.find("abc")
|
|
|
|
self.assertEquals(h, out[0])
|
|
|
|
self.assertEquals('', out[1])
|
2016-09-10 01:24:17 +03:00
|
|
|
|
2016-09-18 23:40:59 +03:00
|
|
|
a.set("abc", h, f)
|
|
|
|
out = a.find("abc")
|
|
|
|
self.assertEquals(h, out[0])
|
|
|
|
self.assertEquals(f, out[1])
|
2016-09-10 01:24:17 +03:00
|
|
|
|
2016-09-18 23:40:59 +03:00
|
|
|
a.set("abc", h, '')
|
|
|
|
out = a.find("abc")
|
|
|
|
self.assertEquals(h, out[0])
|
|
|
|
self.assertEquals('', out[1])
|
2016-09-10 01:24:17 +03:00
|
|
|
|
2016-09-11 02:27:40 +03:00
|
|
|
def testSetRemove(self):
|
|
|
|
a = ctreemanifest.treemanifest(FakeStore())
|
2016-09-18 23:40:59 +03:00
|
|
|
h, f = hashflags()
|
|
|
|
a.set("abc", h, f)
|
|
|
|
out = a.find("abc")
|
|
|
|
self.assertEquals((h, f), out)
|
2016-09-11 02:27:40 +03:00
|
|
|
|
2016-09-18 23:40:59 +03:00
|
|
|
a.set("abc", None, None)
|
|
|
|
out = a.find("abc")
|
|
|
|
self.assertEquals((None, None), out)
|
2016-09-11 02:27:40 +03:00
|
|
|
|
2016-09-18 23:40:28 +03:00
|
|
|
def testCleanupAfterRemove(self):
|
|
|
|
a = ctreemanifest.treemanifest(FakeStore())
|
2016-09-18 23:40:59 +03:00
|
|
|
h, f = hashflags()
|
|
|
|
a.set("abc/def/ghi", h, f)
|
|
|
|
out = a.find("abc/def/ghi")
|
|
|
|
self.assertEquals((h, f), out)
|
2016-09-18 23:40:28 +03:00
|
|
|
|
|
|
|
a.set("abc/def/ghi", None, None)
|
|
|
|
|
2016-09-18 23:40:59 +03:00
|
|
|
h, f = hashflags()
|
|
|
|
a.set("abc", h, f)
|
|
|
|
out = a.find("abc")
|
|
|
|
self.assertEquals((h, f), out)
|
2016-09-18 23:40:28 +03:00
|
|
|
|
2016-09-18 23:44:17 +03:00
|
|
|
def testIterOrder(self):
|
|
|
|
a = ctreemanifest.treemanifest(FakeStore())
|
|
|
|
h, f = hashflags()
|
|
|
|
a.set("abc/def/ghi", h, f)
|
|
|
|
a.set("abc/def.ghi", h, f)
|
|
|
|
|
|
|
|
results = [fp for fp in a]
|
|
|
|
self.assertEquals(results[0], "abc/def.ghi")
|
|
|
|
self.assertEquals(results[1], "abc/def/ghi")
|
|
|
|
|
2016-09-18 23:46:47 +03:00
|
|
|
def testIterOrderSigned(self):
|
|
|
|
a = ctreemanifest.treemanifest(FakeStore())
|
|
|
|
h, f = hashflags()
|
|
|
|
a.set("abc/def/\xe6\xe9", h, f)
|
|
|
|
a.set("abc/def/gh", h, f)
|
|
|
|
|
|
|
|
results = [fp for fp in a]
|
|
|
|
self.assertEquals(results[0], "abc/def/gh")
|
|
|
|
self.assertEquals(results[1], "abc/def/\xe6\xe9")
|
|
|
|
|
2016-09-20 02:28:50 +03:00
|
|
|
def testWrite(self):
|
|
|
|
a = ctreemanifest.treemanifest(FakeStore())
|
|
|
|
a.set("abc/def/x", *hashflags())
|
|
|
|
a.set("abc/def/y", *hashflags())
|
|
|
|
a.set("abc/z", *hashflags())
|
|
|
|
|
|
|
|
store = FakeStore()
|
|
|
|
anode = a.write(store)
|
|
|
|
|
|
|
|
a2 = ctreemanifest.treemanifest(store, anode)
|
|
|
|
self.assertEquals(list(a.iterentries()), list(a2.iterentries()))
|
|
|
|
|
|
|
|
b = a2.copy()
|
|
|
|
b.set("lmn/v", *hashflags())
|
|
|
|
b.set("abc/z", *hashflags())
|
|
|
|
|
|
|
|
bnode = b.write(store)
|
|
|
|
|
|
|
|
b2 = ctreemanifest.treemanifest(store, bnode)
|
|
|
|
self.assertEquals(list(b.iterentries()), list(b2.iterentries()))
|
|
|
|
|
2016-09-06 22:40:32 +03:00
|
|
|
if __name__ == '__main__':
|
|
|
|
silenttestrunner.main(__name__)
|