Source code for dhcpkit.tests.utils.test_domain_name

"""
Test the encoding and parsing of domain names
"""
import unittest

from dhcpkit.utils import encode_domain, encode_domain_list, parse_domain_bytes, parse_domain_list_bytes, \
    validate_domain_label


[docs]class DomainNameTestCase(unittest.TestCase):
[docs] def setUp(self): self.good_domain_bytes = b'\x0510-ww\x08steffann\x02nl\x00' self.good_relative_domain_bytes = b'\x0510-ww\x08steffann\x02nl' self.good_domain_name = '10-ww.steffann.nl.' self.good_relative_domain_name = '10-ww.steffann.nl' self.oversized_label_bytes = b'\x0410ww\x47steffann-steffann-steffann-steffann-' \ b'steffann-steffann-steffann-steffann\x02nl\x00' self.oversized_label_name = '10ww.steffann-steffann-steffann-steffann-steffann-steffann-steffann-steffann.nl' self.oversized_domain_bytes = b'\x0410ww' \ b'\x3esteffann-steffann-steffann-steffann-steffann-steffann-steffann' \ b'\x3esteffann-steffann-steffann-steffann-steffann-steffann-steffann' \ b'\x3esteffann-steffann-steffann-steffann-steffann-steffann-steffann' \ b'\x3esteffann-steffann-steffann-steffann-steffann-steffann-steffann' \ b'\x02nl\x00' self.oversized_relative_domain_bytes = b'\x0410ww' \ b'\x3esteffann-steffann-steffann-steffann-steffann-steffann-steffann' \ b'\x3esteffann-steffann-steffann-steffann-steffann-steffann-steffann' \ b'\x3esteffann-steffann-steffann-steffann-steffann-steffann-steffann' \ b'\x3esteffann-steffann-steffann-steffann-steffann-steffann-steffann' self.oversized_domain_name = '10ww.' \ 'steffann-steffann-steffann-steffann-steffann-steffann-steffann.' \ 'steffann-steffann-steffann-steffann-steffann-steffann-steffann.' \ 'steffann-steffann-steffann-steffann-steffann-steffann-steffann.' \ 'steffann-steffann-steffann-steffann-steffann-steffann-steffann.' \ 'nl' self.idn_domain_bytes = b'\x03www\x07example\x0bxn--j6w193g\x00' self.idn_domain_name = 'www.example.香港.' self.idn_oversized_label_bytes = b'\x0410ww' \ b'\x43stffnn-steffann-steffann-steffann-steffann-steffann-steffann-o8e12a' \ b'\x02nl\x00' self.idn_oversized_label_name = '10ww.' \ 'stéffänn-steffann-steffann-steffann-steffann-steffann-steffann.' \ 'nl' self.buffer_overflow_bytes = b'\x0410ww\x10END' self.unending_bytes = b'\x0410ww\x03END'
[docs] def test_parse_good(self): offset, domain_name = parse_domain_bytes(self.good_domain_bytes) self.assertEqual(offset, len(self.good_domain_bytes)) self.assertEqual(domain_name, self.good_domain_name)
[docs] def test_parse_relative(self): offset, domain_name = parse_domain_bytes(self.good_relative_domain_bytes, allow_relative=True) self.assertEqual(offset, len(self.good_relative_domain_bytes)) self.assertEqual(domain_name, self.good_relative_domain_name)
[docs] def test_encode_good(self): domain_bytes = encode_domain(self.good_domain_name) self.assertEqual(domain_bytes, self.good_domain_bytes)
[docs] def test_encode_relative(self): domain_bytes = encode_domain(self.good_relative_domain_name, allow_relative=True) self.assertEqual(domain_bytes, self.good_relative_domain_bytes) domain_bytes = encode_domain(self.good_domain_name + '.', allow_relative=True) self.assertEqual(domain_bytes, self.good_domain_bytes)
[docs] def test_parse_idn(self): offset, domain_name = parse_domain_bytes(self.idn_domain_bytes) self.assertEqual(offset, len(self.idn_domain_bytes)) self.assertEqual(domain_name, self.idn_domain_name)
[docs] def test_encode_idn(self): domain_bytes = encode_domain(self.idn_domain_name) self.assertEqual(domain_bytes, self.idn_domain_bytes)
[docs] def test_parse_oversized_domain(self): self.assertRaisesRegex(ValueError, 'Domain too long', parse_domain_bytes, self.oversized_domain_bytes)
[docs] def test_parse_oversized_relative_domain(self): self.assertRaisesRegex(ValueError, 'Domain too long', parse_domain_bytes, self.oversized_relative_domain_bytes, allow_relative=True)
[docs] def test_encode_oversized_domain(self): self.assertRaisesRegex(ValueError, 'Domain too long', encode_domain, self.oversized_domain_name)
[docs] def test_parse_idn_oversized_label(self): self.assertRaisesRegex(ValueError, 'Label too long', parse_domain_bytes, self.idn_oversized_label_bytes)
[docs] def test_encode_idn_oversized_label(self): self.assertRaisesRegex(ValueError, 'Label too long', encode_domain, self.idn_oversized_label_name)
[docs] def test_parse_oversized_label(self): self.assertRaisesRegex(ValueError, 'Label too long', parse_domain_bytes, self.oversized_label_bytes)
[docs] def test_encode_oversized_label(self): self.assertRaisesRegex(ValueError, 'Label too long', encode_domain, self.oversized_label_name)
[docs] def test_parse_buffer_overflow(self): self.assertRaisesRegex(ValueError, 'exceeds available buffer', parse_domain_bytes, self.buffer_overflow_bytes)
[docs] def test_parse_unending(self): self.assertRaisesRegex(ValueError, 'must end with a 0-length label', parse_domain_bytes, self.unending_bytes)
[docs]class DomainNameListTestCase(unittest.TestCase):
[docs] def setUp(self): self.good_domains_bytes = b'\x06google\x03com\x00\x0410ww\x08steffann\x02nl\x00' self.good_domains_list = ['google.com.', '10ww.steffann.nl.']
[docs] def test_parse_good(self): offset, domain_names = parse_domain_list_bytes(self.good_domains_bytes) self.assertEqual(offset, len(self.good_domains_bytes)) self.assertListEqual(domain_names, self.good_domains_list)
[docs] def test_encode_good(self): domain_bytes = encode_domain_list(self.good_domains_list) self.assertEqual(domain_bytes, self.good_domains_bytes)
[docs]class ValidateDomainLabelTestCase(unittest.TestCase):
[docs] def test_validate_empty_label(self): with self.assertRaisesRegex(ValueError, 'Invalid label'): validate_domain_label('')
[docs] def test_validate_oversized_label(self): with self.assertRaisesRegex(ValueError, 'Label too long'): validate_domain_label('something-that-is-more-than-63-characters-as-you-can-clearly-see')
[docs] def test_validate_invalid_label(self): with self.assertRaisesRegex(ValueError, 'Invalid label'): validate_domain_label('-bad') with self.assertRaisesRegex(ValueError, 'Invalid label'): validate_domain_label('bad-') with self.assertRaisesRegex(ValueError, 'Invalid label'): validate_domain_label('bad!') with self.assertRaisesRegex(ValueError, 'Invalid label'): validate_domain_label('-bad-bad-bad-')
# noinspection PyMethodMayBeStatic
[docs] def test_validate_correct_labels(self): validate_domain_label('something-that-is-63-characters-long-as-you-can-now-clearly-see') validate_domain_label('good') validate_domain_label('123') validate_domain_label('also-good') validate_domain_label('also--good')
if __name__ == '__main__': # pragma: no cover unittest.main()