blob: 1a5ee3769c1ff5b678042fc8e1ef24ab9202169a [file] [log] [blame]
# 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 proto 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()