diff options
Diffstat (limited to 'macaroonbakery/tests/test_time.py')
-rw-r--r-- | macaroonbakery/tests/test_time.py | 129 |
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 |