# Copyright 2021 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS-IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Tests for tink.testing.cross_language.util._primitives.""" import datetime from absl.testing import absltest from tink import jwt from util import _primitives from protos import testing_api_pb2 class PrimitivesTest(absltest.TestCase): def test_split_merge_timestamp(self): dt = datetime.datetime.fromtimestamp(1234.5678, datetime.timezone.utc) seconds, nanos = _primitives.split_datetime(dt) self.assertEqual(seconds, 1234) self.assertEqual(nanos, 567800000) self.assertEqual(_primitives.to_datetime(seconds, nanos), dt) def test_raw_jwt_to_proto_to_verified_jwt(self): raw = jwt.new_raw_jwt( type_header='type_header', issuer='issuer', subject='subject', audiences=['audience1', 'audience2'], jwt_id='jwt_id', not_before=datetime.datetime.fromtimestamp(1234567.89, datetime.timezone.utc), issued_at=datetime.datetime.fromtimestamp(2345678.9, datetime.timezone.utc), expiration=datetime.datetime.fromtimestamp(3456789, datetime.timezone.utc), custom_claims={ 'null': None, 'string': 'aString', 'number': 123.456, 'integer': 123, 'bool': True, 'list': [None, True, 'foo', 42, { 'pi': 3.14 }], 'obj': { 'list': [1, 3.14], 'null': None, 'bool': False } }) proto = _primitives.raw_jwt_to_proto(raw) verified = _primitives.proto_to_verified_jwt(proto) self.assertEqual(verified.type_header(), 'type_header') self.assertEqual(verified.issuer(), 'issuer') self.assertEqual(verified.subject(), 'subject') self.assertEqual(verified.audiences(), ['audience1', 'audience2']) self.assertEqual(verified.jwt_id(), 'jwt_id') self.assertEqual( verified.not_before(), datetime.datetime.fromtimestamp(1234567, datetime.timezone.utc)) self.assertEqual( verified.issued_at(), datetime.datetime.fromtimestamp(2345678, datetime.timezone.utc)) self.assertEqual( verified.expiration(), datetime.datetime.fromtimestamp(3456789, datetime.timezone.utc)) self.assertEqual( verified.custom_claim_names(), {'null', 'string', 'number', 'integer', 'bool', 'list', 'obj'}) self.assertIsNone(verified.custom_claim('null')) self.assertEqual(verified.custom_claim('string'), 'aString') self.assertEqual(verified.custom_claim('number'), 123.456) self.assertEqual(verified.custom_claim('integer'), 123) self.assertEqual(verified.custom_claim('bool'), True) self.assertEqual(verified.custom_claim('list'), [None, True, 'foo', 42, {'pi': 3.14}]) self.assertEqual( verified.custom_claim('obj'), {'list': [1, 3.14], 'null': None, 'bool': False}) def test_empty_raw_jwt_to_proto_to_verified_jwt(self): raw = jwt.new_raw_jwt(without_expiration=True) proto = _primitives.raw_jwt_to_proto(raw) verified = _primitives.proto_to_verified_jwt(proto) self.assertFalse(verified.has_type_header()) self.assertFalse(verified.has_issuer()) self.assertFalse(verified.has_subject()) self.assertFalse(verified.has_audiences()) self.assertFalse(verified.has_jwt_id()) self.assertFalse(verified.has_not_before()) self.assertFalse(verified.has_issued_at()) self.assertFalse(verified.has_expiration()) self.assertEmpty(verified.custom_claim_names()) def test_jwt_validator_to_proto(self): now = datetime.datetime.fromtimestamp(1234567.125, datetime.timezone.utc) validator = jwt.new_validator( expected_type_header='type_header', expected_issuer='issuer', expected_audience='audience', clock_skew=datetime.timedelta(seconds=123), fixed_now=now) proto = _primitives.jwt_validator_to_proto(validator) expected = testing_api_pb2.JwtValidator() expected.expected_type_header.value = 'type_header' expected.expected_issuer.value = 'issuer' expected.expected_audience.value = 'audience' expected.clock_skew.seconds = 123 expected.now.seconds = 1234567 expected.now.nanos = 125000000 self.assertEqual(proto, expected) def test_empty_jwt_validator_to_proto(self): validator = jwt.new_validator() proto = _primitives.jwt_validator_to_proto(validator) expected = testing_api_pb2.JwtValidator() expected.clock_skew.seconds = 0 self.assertEqual(proto, expected) if __name__ == '__main__': absltest.main()