v2 / vlib / x / encoding / asn1 / util_test.v
155 lines · 125 sloc · 3.31 KB · fdc49dc51a0d7e83abd5b383afaaab3f2793f2cf
Raw
1// Copyright (c) 2022, 2024 blackshirt. All rights reserved.
2// Use of this source code is governed by a MIT License
3// that can be found in the LICENSE file.
4module asn1
5
6struct RByteTest {
7 inp []u8
8 pos int
9 result u8
10 end bool
11}
12
13fn test_simple_read_byte() {
14 src := [u8(0x16), 0x06, 0x44, 0x05, 0x09, 0x22]
15 start := 0
16
17 mut val, mut pos := read_byte(src, 0)!
18 assert val == src[start]
19 assert pos == 1
20
21 val, pos = read_byte(src, pos)!
22 assert val == src[1]
23 assert pos == 2
24
25 val, pos = read_byte(src, pos)!
26 assert val == src[2]
27 assert pos == 3
28
29 val, pos = read_byte(src, pos)!
30 assert val == src[3]
31 assert pos == 4
32
33 val, pos = read_byte(src, pos)!
34 assert val == src[4]
35 assert pos == 5
36
37 // this is the last item in the array
38 val, pos = read_byte(src, pos)!
39 assert val == src[5] // the last item, 0x22
40 assert pos == 6
41
42 // read next byte should error
43 val, pos = read_byte(src, pos) or {
44 assert err == error('invalid loc or len')
45 return
46 }
47}
48
49fn test_read_digit_outside_digit_iserror() ! {
50 src := [u8(0xff)]
51 _, _ := read_digit(src, 0) or {
52 assert err == error('not digit byte')
53 return
54 }
55}
56
57fn test_simple_read_digit() ! {
58 // 0x22 is not digit digit byte
59 src := [u8(0x32), 0x33, 0x34, 0x35, 0x39, 0x22]
60 start := 0
61
62 mut val, mut pos := read_digit(src, start)!
63 assert val == 2 // (0x32-0x30)
64 assert pos == 1
65
66 val, pos = read_digit(src, pos)!
67 assert val == 3 // 0x33-0x30
68 assert pos == 2
69
70 val, pos = read_digit(src, pos)!
71 assert val == 4 // 0x34 - 0x30
72 assert pos == 3
73
74 val, pos = read_digit(src, pos)!
75 assert val == 5 // same principe as above
76 assert pos == 4
77
78 val, pos = read_digit(src, pos)!
79 assert val == 9
80 assert pos == 5
81
82 // the last item was not digit
83 val, pos = read_digit(src, pos) or {
84 assert err == error('not digit byte')
85 return
86 }
87}
88
89fn test_read_2_digits_single() ! {
90 src := [u8(0x35)]
91 start := 0
92 read_2_digits(src, start) or {
93 assert err == error('not enough bytes')
94 return
95 }
96}
97
98fn test_read_2_digits_double() ! {
99 src := [u8(0x35), 0x33]
100 start := 0
101 val, pos := read_2_digits(src, start)!
102 assert val == 53 // 5*10+3
103 assert pos == 2
104}
105
106fn test_read_2_digits_simple() ! {
107 // 0x22 is not digit digit byte
108 src := [u8(0x30), 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x22] // 48,49,50,51,52,53,54,55,56,57, "
109 start := 0
110
111 mut val, mut pos := read_2_digits(src, start)!
112 assert val == 1 // 0*10+1
113 assert pos == 2
114
115 val, pos = read_2_digits(src, pos)!
116 assert val == 23 // 2*10+3
117 assert pos == 4
118
119 val, pos = read_2_digits(src, pos)!
120 assert val == 45 // 4*10+5
121 assert pos == 6
122
123 val, pos = read_2_digits(src, pos)!
124 assert val == 67 // 6*10+7
125 assert pos == 8
126
127 val, pos = read_2_digits(src, pos)!
128 assert val == 89 // 8*10+9
129 assert pos == 10
130
131 // last item was 0x22, its not digit and not enough
132 val, pos = read_2_digits(src, pos) or {
133 assert err == error('not enough bytes')
134 return
135 }
136}
137
138fn test_read_4_digits() ! {
139 src := [u8(0x30), 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x35] // 48,49,50,51,52,53,54,55,56,57
140 start := 0
141
142 mut val, mut pos := read_4_digits(src, start)!
143 assert val == 123 // 0*1000 + 1*100 + 2*10 + 3
144 assert pos == 4
145
146 val, pos = read_4_digits(src, pos)!
147 assert val == 4567 // 4*1000 + 5*100 + 6*10 + 7
148 assert pos == 8
149
150 // last read 4 digit was error
151 val, pos = read_4_digits(src, pos) or {
152 assert err == error('not enough bytes')
153 return
154 }
155}
156