Example #1
0
 def setUp(self):
     self.vs = ValueStore()
     yield self.vs.init()
Example #2
0
class ValueStoreTest(unittest.TestCase):
    """
    Testing value store: store of immutable values (blobs, trees, commits)
    """

    @defer.inlineCallbacks
    def setUp(self):
        self.vs = ValueStore()
        yield self.vs.init()

    def test_ValueObjects(self):
        # Testing all Value Objects
        vref1 = ValueRef("some")
        self.assertEqual(vref1.identity, "some")
        self.assertEqual(vref1.vtype, None)
        vref2 = ValueRef("other", "X")
        self.assertEqual(vref2.vtype, "X")

        # Blob value objects
        vo1 = ValueObject("1")
        self.assertNotEqual(vo1.identity, None)
        self.assertEqual(vo1.vtype, "B")
        print vo1
        print "vo1=", vo1.__dict__

        vo2 = ValueObject(2)
        self.assertNotEqual(vo1.identity, vo2.identity)

        vo3 = ValueObject(("a", "b"))
        self.assertNotEqual(vo1.identity, vo3.identity)
        vo4 = ValueObject(["a", "b"])
        vo5 = ValueObject({"a": "b", "c": (1, 2), "d": {}, "e": {"x": "y"}})
        self.assertNotEqual(vo5.identity, vo4.identity)
        print "vo5=", vo5.__dict__

        # Tree value objects with childrefs
        tv0 = TreeValue()
        self.assertEqual(tv0.vtype, "T")
        tv1 = TreeValue(())
        self.assertEqual(tv0.identity, tv1.identity)

        tv2 = TreeValue(vo1.identity)
        tv3 = TreeValue((vo1.identity,))
        tv4 = TreeValue(vo1)
        tv5 = TreeValue((vo1,))
        self.assertEqual(tv2.identity, tv3.identity)
        self.assertEqual(tv4.identity, tv5.identity)
        self.assertEqual(tv2.identity, tv4.identity)
        self.assertNotEqual(tv0.identity, tv2.identity)

        tv6 = TreeValue((vo2, vo3))
        print "tv6=", tv6.__dict__
        tv7 = TreeValue((vo3, vo2))
        self.assertEqual(tv6.identity, tv7.identity)
        tv8 = TreeValue(tv6)
        tv9 = TreeValue((tv6, tv7, vo5))

        # Check cycle in tree
        tv10 = TreeValue((tv8, tv6))

        # Commit value objects with root tree
        cv0 = CommitValue()
        self.assertEqual(cv0.vtype, "C")
        cv1 = CommitValue(tv2)
        cv2 = CommitValue(tv2.identity)
        self.assertEqual(cv1.identity, cv2.identity)
        self.assertNotEqual(cv0.identity, cv1.identity)

        # Commit value objects with parent commits
        cv5 = CommitValue(None, (cv1, cv0))
        cv6 = CommitValue(None, cv2)
        cv7 = CommitValue(None, (cv0, cv1))
        self.assertNotEqual(cv5.identity, cv7.identity)

        # Composite value objects with childref and base
        cvc1 = CommitValue(tv2, (cv1, cv2))
        print "cvc1=", cvc1.__dict__

        cvc2 = CommitValue(tv2, cvc1, ts=123, committer="mike", author="some")
        self.assertEqual(cvc2.value["committer"], "mike")
        print "cvc2=", cvc2.__dict__

        # Reference values
        rv1 = RefValue("ref1")
        print "rv1=", rv1.__dict__
        self.assertEqual(rv1.vtype, "R")
        rv2 = RefValue("ref2")

        # Test ValueRef generation
        vr1 = cvc1._value_ref()
        self.assertEqual(vr1.identity, cvc1.identity)
        self.assertFalse(vr1 is cvc1)
        self.assertFalse(hasattr(vr1, "value"))
        self.assertEqual(vr1.vtype, "C")

    @defer.inlineCallbacks
    def test_ValueStore(self):
        vo1 = ValueObject("1")
        rvo1 = yield self.vs.put_value(vo1)
        rvo2 = yield self.vs.put_value(vo1)

        # Put in values and trees
        r1 = yield self.vs.put_value("1")
        print "r1=", r1
        self.assertTrue(isinstance(r1, ValueRef))
        self.assertFalse(hasattr(r1, "value"))
        # Check that a value object actually was placed in the values store
        re1 = yield self.vs.exists_value(ValueObject("1").identity)
        self.assertTrue(re1)
        self.assertEqual(rvo1.identity, r1.identity)

        r2 = yield self.vs.put_value("2")
        rt1 = yield self.vs.put_tree((r1, r2))
        r3 = yield self.vs.put_value("3")
        rt2 = yield self.vs.put_tree((r3, rt1))
        r4 = yield self.vs.put_value("4")
        r5 = yield self.vs.put_value("5")
        rt3 = yield self.vs.put_tree((r4, r5))
        rt4 = yield self.vs.put_tree((rt2, rt3))

        # Test gets
        rv1 = yield self.vs.get_value(r1)
        self.assertEqual(rv1.value, "1")
        self.assertEqual(rv1.vtype, "B")
        rvs1 = yield self.vs.get_value(r1.identity)
        self.assertEqual(rv1.identity, rvs1.identity)

        rv2 = yield self.vs.get_value(rt1)
        self.assertEqual(rv2.vtype, "T")
        self.assertEqual(rv2.value["children"][0]["ref"], r1.identity)

        rv3 = yield self.vs.get_value("not_exist")
        self.assertEqual(rv3, None)

        rest1 = yield self.vs.get_tree_entries(rt1)
        print "rest1=", rest1
        self.assertEqual(len(rest1), 2)
        self.assertTrue(rest1[0]["ref"] == r1.identity or rest1[1]["ref"] == r1.identity)
        self.assertTrue(rest1[0]["ref"] == r2.identity or rest1[1]["ref"] == r2.identity)
        rest2 = yield self.vs.get_tree_entries("not_exist")
        self.assertEqual(rest2, None)

        restv1 = yield self.vs.get_tree_entriesvalues(rt1)
        self.assertEqual(len(restv1), 2)
        self.assertEqual(int(restv1[0].value.value) + int(restv1[1].value.value), 3)
        restv2 = yield self.vs.get_tree_entriesvalues("not_exist")
        self.assertEqual(restv2, None)

        # Commits
        rc1 = yield self.vs.put_commit(rt1)
        rc2 = yield self.vs.put_commit(rt2, rc1)
        rc3 = yield self.vs.put_commit(rt2, rc2, committer="me")

        rcg1 = yield self.vs.get_commit(rc1)
        self.assertEqual(rcg1.identity, rc1.identity)
        self.assertEqual(rcg1.value["parents"], [])
        self.assertEqual(rcg1.value["roottree"], rt1.identity)

        rcgv1 = yield self.vs.get_commit_root_entriesvalues(rc1)
        self.assertEqual(len(rcgv1), 2)
        self.assertEqual(int(rcgv1[0].value.value) + int(rcgv1[1].value.value), 3)