1# coding: utf-8
2from __future__ import unicode_literals, division, absolute_import, print_function
3
4import unittest
5
6from asn1crypto import parser
7
8from ._unittest_compat import patch
9
10patch()
11
12
13class ParserTests(unittest.TestCase):
14
15    def test_parser(self):
16        result = parser.parse(b'\x02\x01\x00')
17        self.assertIsInstance(result, tuple)
18        self.assertEqual(0, result[0])
19        self.assertEqual(0, result[1])
20        self.assertEqual(2, result[2])
21        self.assertEqual(b'\x02\x01', result[3])
22        self.assertEqual(b'\x00', result[4])
23        self.assertEqual(b'', result[5])
24
25    def test_peek(self):
26        self.assertEqual(3, parser.peek(b'\x02\x01\x00\x00'))
27
28    def test_parse_indef_nested(self):
29        data = b'\x24\x80\x24\x80\x24\x80\x04\x00\x00\x00\x00\x00\x00\x00'
30        result = parser.parse(data)
31        self.assertEqual(b'\x24\x80', result[3])
32        self.assertEqual(b'\x24\x80\x24\x80\x04\x00\x00\x00\x00\x00', result[4])
33        self.assertEqual(b'\x00\x00', result[5])
34
35    def test_parser_strict(self):
36        with self.assertRaises(ValueError):
37            parser.parse(b'\x02\x01\x00\x00', strict=True)
38
39    def test_emit(self):
40        self.assertEqual(b'\x02\x01\x00', parser.emit(0, 0, 2, b'\x00'))
41
42    def test_emit_type_errors(self):
43        with self.assertRaises(TypeError):
44            parser.emit('0', 0, 2, b'\x00')
45
46        with self.assertRaises(ValueError):
47            parser.emit(-1, 0, 2, b'\x00')
48
49        with self.assertRaises(TypeError):
50            parser.emit(0, '0', 2, b'\x00')
51
52        with self.assertRaises(ValueError):
53            parser.emit(0, 5, 2, b'\x00')
54
55        with self.assertRaises(TypeError):
56            parser.emit(0, 0, '2', b'\x00')
57
58        with self.assertRaises(ValueError):
59            parser.emit(0, 0, -1, b'\x00')
60
61        with self.assertRaises(TypeError):
62            parser.emit(0, 0, 2, '\x00')
63
64    def test_parser_large_tag(self):
65        # One extra byte
66        result = parser.parse(b'\x7f\x49\x00')
67        self.assertEqual(1, result[0])
68        self.assertEqual(1, result[1])
69        self.assertEqual(73, result[2])
70        self.assertEqual(b'\x7f\x49\x00', result[3])
71        self.assertEqual(b'', result[4])
72        self.assertEqual(b'', result[5])
73
74        # Two extra bytes
75        result = parser.parse(b'\x7f\x81\x49\x00')
76        self.assertEqual(1, result[0])
77        self.assertEqual(1, result[1])
78        self.assertEqual(201, result[2])
79        self.assertEqual(b'\x7f\x81\x49\x00', result[3])
80        self.assertEqual(b'', result[4])
81        self.assertEqual(b'', result[5])
82
83        # Three extra bytes
84        result = parser.parse(b'\x7f\x81\x80\x00\x00')
85        self.assertEqual(1, result[0])
86        self.assertEqual(1, result[1])
87        self.assertEqual(16384, result[2])
88        self.assertEqual(b'\x7f\x81\x80\x00\x00', result[3])
89        self.assertEqual(b'', result[4])
90        self.assertEqual(b'', result[5])
91