CORD-1389: xproto extension to support policies

Change-Id: I5d6c11107d5bc9cd82e41c4a8e6a378d22d7fb61
diff --git a/lib/xos-genx/tests/policy_test.py b/lib/xos-genx/tests/policy_test.py
new file mode 100644
index 0000000..5f1dca0
--- /dev/null
+++ b/lib/xos-genx/tests/policy_test.py
@@ -0,0 +1,119 @@
+import unittest
+from xosgenx.generator import XOSGenerator
+from helpers import FakeArgs, XProtoTestHelpers
+import pdb
+
+"""
+The tests below convert the policy logic expression
+into Python, set up an appropriate environment and execute the Python.
+"""
+
+class XProtoPolicyTest(unittest.TestCase):
+    def test_constant(self):
+        xproto = \
+"""
+    policy true_policy < True >
+"""
+
+        target = XProtoTestHelpers.write_tmp_target("{{ proto.policies.true_policy }}")
+
+        args = FakeArgs()
+        args.inputs = xproto
+        args.target = target
+
+        output = XOSGenerator.generate(args).replace('t','T')
+        self.assertTrue(eval(output)) 
+
+    def test_equal(self):
+        xproto = \
+"""
+    policy slice_user < slice.user = obj.user >
+"""
+
+        target = XProtoTestHelpers.write_tmp_target("{{ proto.policies.slice_user }}")
+        args = FakeArgs()
+        args.inputs = xproto
+        args.target = target
+
+        output = XOSGenerator.generate(args)
+       
+        slice = FakeArgs()
+        slice.user = 'twin'
+        obj = FakeArgs()
+        obj.user = 'twin'
+
+        (op, operands), = eval(output).items()
+        expr = op.join(operands).replace('=','==')
+
+        self.assertTrue(eval(expr))
+
+    def test_bin(self):
+        xproto = \
+"""
+    policy slice_admin < slice.is_admin | obj.empty >
+"""
+        target = XProtoTestHelpers.write_tmp_target("{{ proto.policies.slice_admin }}")
+        args = FakeArgs()
+        args.inputs = xproto
+        args.target = target
+
+        output = XOSGenerator.generate(args)
+
+        slice = FakeArgs()
+        slice.is_admin = False
+        obj = FakeArgs()
+        obj.empty = []
+
+        (op, operands), = eval(output).items()
+        expr = op.join(operands).replace('|',' or ')
+
+        self.assertFalse(eval(expr))
+
+        
+    def test_exists(self):
+        xproto = \
+"""
+    policy privilege < exists Privilege: Privilege.object_id = obj.id >
+"""
+
+        target = XProtoTestHelpers.write_tmp_target("{{ proto.policies.privilege }} ")
+        args = FakeArgs()
+        args.inputs = xproto
+        args.target = target
+
+        output = XOSGenerator.generate(args)
+        
+        Privilege = FakeArgs()
+        Privilege.object_id = 1
+        obj = FakeArgs()
+        obj.id = 1
+
+        (op, operands), = eval(output).items()
+        (op2, operands2), = operands[1].items()
+        expr = op2.join(operands2).replace('=','==')
+
+        self.assertTrue(eval(expr))
+
+    def test_forall(self):
+        # This one we only parse
+        xproto = \
+"""
+    policy instance < forall Instance: exists Credential: Credential.obj_id = Instance.obj_id >
+"""
+
+        target = XProtoTestHelpers.write_tmp_target("{{ proto.policies.instance }}")
+
+        args = FakeArgs()
+        args.inputs = xproto
+        args.target = target
+
+        output = XOSGenerator.generate(args)
+        (op, operands), = eval(output).items()
+
+        self.assertEqual(op,'forall')
+
+
+if __name__ == '__main__':
+    unittest.main()
+
+