summaryrefslogtreecommitdiff
path: root/macaroonbakery/tests/test_time.py
diff options
context:
space:
mode:
Diffstat (limited to 'macaroonbakery/tests/test_time.py')
-rw-r--r--macaroonbakery/tests/test_time.py129
1 files changed, 129 insertions, 0 deletions
diff --git a/macaroonbakery/tests/test_time.py b/macaroonbakery/tests/test_time.py
new file mode 100644
index 0000000..38826e1
--- /dev/null
+++ b/macaroonbakery/tests/test_time.py
@@ -0,0 +1,129 @@
+# Copyright 2017 Canonical Ltd.
+# Licensed under the LGPLv3, see LICENCE file for details.
+from datetime import timedelta
+from unittest import TestCase
+from collections import namedtuple
+
+import pyrfc3339
+import pymacaroons
+from pymacaroons import Macaroon
+
+import macaroonbakery.checkers as checkers
+
+t1 = pyrfc3339.parse('2017-10-26T16:19:47.441402074Z')
+t2 = t1 + timedelta(hours=1)
+t3 = t2 + timedelta(hours=1)
+
+
+def fpcaveat(s):
+ return pymacaroons.Caveat(caveat_id=s.encode('utf-8'))
+
+
+class TestExpireTime(TestCase):
+ def test_expire_time(self):
+ ExpireTest = namedtuple('ExpireTest', 'about caveats expectTime')
+ tests = [
+ ExpireTest(
+ about='no caveats',
+ caveats=[],
+ expectTime=None,
+ ),
+ ExpireTest(
+ about='single time-before caveat',
+ caveats=[
+ fpcaveat(checkers.time_before_caveat(t1).condition),
+ ],
+ expectTime=t1,
+ ),
+ ExpireTest(
+ about='multiple time-before caveat',
+ caveats=[
+ fpcaveat(checkers.time_before_caveat(t2).condition),
+ fpcaveat(checkers.time_before_caveat(t1).condition),
+ ],
+ expectTime=t1,
+ ),
+ ExpireTest(
+ about='mixed caveats',
+ caveats=[
+ fpcaveat(checkers.time_before_caveat(t1).condition),
+ fpcaveat('allow bar'),
+ fpcaveat(checkers.time_before_caveat(t2).condition),
+ fpcaveat('deny foo'),
+ ],
+ expectTime=t1,
+ ),
+ ExpireTest(
+ about='mixed caveats',
+ caveats=[
+ fpcaveat(checkers.COND_TIME_BEFORE + ' tomorrow'),
+ ],
+ expectTime=None,
+ ),
+ ]
+ for test in tests:
+ print('test ', test.about)
+ t = checkers.expiry_time(checkers.Namespace(), test.caveats)
+ self.assertEqual(t, test.expectTime)
+
+ def test_macaroons_expire_time(self):
+ ExpireTest = namedtuple('ExpireTest', 'about macaroons expectTime')
+ tests = [
+ ExpireTest(
+ about='no macaroons',
+ macaroons=[newMacaroon()],
+ expectTime=None,
+ ),
+ ExpireTest(
+ about='single macaroon without caveats',
+ macaroons=[newMacaroon()],
+ expectTime=None,
+ ),
+ ExpireTest(
+ about='multiple macaroon without caveats',
+ macaroons=[newMacaroon()],
+ expectTime=None,
+ ),
+ ExpireTest(
+ about='single macaroon with time-before caveat',
+ macaroons=[
+ newMacaroon([checkers.time_before_caveat(t1).condition]),
+ ],
+ expectTime=t1,
+ ),
+ ExpireTest(
+ about='single macaroon with multiple time-before caveats',
+ macaroons=[
+ newMacaroon([
+ checkers.time_before_caveat(t2).condition,
+ checkers.time_before_caveat(t1).condition,
+ ]),
+ ],
+ expectTime=t1,
+ ),
+ ExpireTest(
+ about='multiple macaroons with multiple time-before caveats',
+ macaroons=[
+ newMacaroon([
+ checkers.time_before_caveat(t3).condition,
+ checkers.time_before_caveat(t1).condition,
+ ]),
+ newMacaroon([
+ checkers.time_before_caveat(t3).condition,
+ checkers.time_before_caveat(t1).condition,
+ ]),
+ ],
+ expectTime=t1,
+ ),
+ ]
+ for test in tests:
+ print('test ', test.about)
+ t = checkers.macaroons_expiry_time(checkers.Namespace(), test.macaroons)
+ self.assertEqual(t, test.expectTime)
+
+
+def newMacaroon(conds=[]):
+ m = Macaroon(key='key', version=2)
+ for cond in conds:
+ m.add_first_party_caveat(cond)
+ return m