blob: e0fb72e75994bedc016d87a8cea34201a7a965c0 [file] [log] [blame]
vlm337167e2005-11-26 11:25:14 +00001#include <per_support.c>
2#include <assert.h>
3
vlm18dd82c2006-08-18 01:34:18 +00004static void
5check_per_decoding() {
vlm337167e2005-11-26 11:25:14 +00006 uint8_t buf[] = { 0xB7, 0x19, 0x2F, 0xEE, 0xAD };
7 uint8_t tmpbuf[10];
8 int32_t z;
9 asn_per_data_t pos;
vlm77b2df72007-06-24 08:47:29 +000010 memset(&pos, 0, sizeof(pos));
vlm337167e2005-11-26 11:25:14 +000011
12 pos.buffer = buf;
13 pos.nboff = 0;
14 pos.nbits = sizeof(buf) * 8;
15
16 z = per_get_few_bits(&pos, 32);
17 assert(z == -1);
vlm17af7cc2005-11-28 06:58:11 +000018 assert(pos.nbits == sizeof(buf) * 8);
vlm337167e2005-11-26 11:25:14 +000019
20 z = per_get_few_bits(&pos, 0);
21 assert(z == 0);
22 assert(pos.nboff == 0);
vlm17af7cc2005-11-28 06:58:11 +000023 assert(pos.nbits == sizeof(buf) * 8);
vlm337167e2005-11-26 11:25:14 +000024
25 z = per_get_few_bits(&pos, 1);
26 assert(z == 1);
27 assert(pos.nboff == 1);
vlm17af7cc2005-11-28 06:58:11 +000028 assert(pos.nbits == sizeof(buf) * 8);
vlm337167e2005-11-26 11:25:14 +000029
30 z = per_get_few_bits(&pos, 2);
31 assert(z == 1);
32 assert(pos.nboff == 3);
vlm17af7cc2005-11-28 06:58:11 +000033 assert(pos.nbits == sizeof(buf) * 8);
vlm337167e2005-11-26 11:25:14 +000034
35 z = per_get_few_bits(&pos, 2);
36 assert(z == 2);
37 assert(pos.nboff == 5);
vlm17af7cc2005-11-28 06:58:11 +000038 assert(pos.nbits == sizeof(buf) * 8);
vlm337167e2005-11-26 11:25:14 +000039
40 z = per_get_few_bits(&pos, 3);
41 assert(z == 7);
42 assert(pos.nboff == 8);
43 assert(pos.nbits == sizeof(buf) * 8);
44
45 z = per_get_few_bits(&pos, 8);
46 assert(z == 0x19);
47 assert(pos.nboff == 8);
48 assert(pos.nbits == (sizeof(buf) - 1) * 8);
49
50 z = per_get_few_bits(&pos, 1);
51 assert(z == 0);
52 assert(pos.nboff == 1);
53 assert(pos.nbits == (sizeof(buf) - 2) * 8);
54
55 z = per_get_few_bits(&pos, 3);
56 assert(z == 2);
57 assert(pos.nboff == 4);
58 assert(pos.nbits == (sizeof(buf) - 2) * 8);
59
60 z = per_get_few_bits(&pos, 8);
61 assert(z == 254);
62 assert(pos.nboff == 12);
63
64 pos.buffer = buf;
65 pos.nboff = 2;
66 pos.nbits = sizeof(buf) * 8;
67 z = per_get_few_bits(&pos, 24);
68 assert(z == 14443711);
69
vlm17af7cc2005-11-28 06:58:11 +000070 /* Get full 31-bit range */
71 pos.buffer = buf;
72 pos.nboff = 7;
73 pos.nbits = sizeof(buf) * 8;
74 z = per_get_few_bits(&pos, 31);
75 assert(z == 1179384747);
76
77 /* Get a bit shifted range */
78 pos.buffer = buf;
79 pos.nboff = 6;
80 pos.nbits = sizeof(buf) * 8;
81 z = per_get_few_bits(&pos, 31);
82 assert(z == 1663434197);
83
vlm337167e2005-11-26 11:25:14 +000084 pos.buffer = buf;
85 pos.nboff = 0;
86 pos.nbits = sizeof(buf) * 8;
87 z = per_get_many_bits(&pos, tmpbuf, 0, sizeof(buf) * 8);
88 assert(z == 0);
89 assert(buf[0] == tmpbuf[0]);
90 assert(buf[1] == tmpbuf[1]);
91 assert(buf[2] == tmpbuf[2]);
92 assert(buf[3] == tmpbuf[3]);
93 assert(buf[4] == tmpbuf[4]);
94
95 pos.buffer = buf;
96 pos.nboff = 1;
97 pos.nbits = sizeof(buf) * 8;
98 z = per_get_many_bits(&pos, tmpbuf, 0, sizeof(buf) * 8);
99 assert(z == -1);
100
101 pos.buffer = buf;
102 pos.nboff = 1;
103 pos.nbits = sizeof(buf) * 8;
104 z = per_get_many_bits(&pos, tmpbuf, 0, sizeof(buf) * 8 - 1);
105 assert(z == 0);
106 assert(tmpbuf[0] == 110);
107 assert(tmpbuf[1] == 50);
108 assert(tmpbuf[2] == 95);
109 assert(tmpbuf[3] == 221);
110 assert(tmpbuf[4] == 90);
111
112 pos.buffer = buf;
113 pos.nboff = 1;
114 pos.nbits = sizeof(buf) * 8;
115 z = per_get_many_bits(&pos, tmpbuf, 1, sizeof(buf) * 8 - 1);
116 assert(z == 0);
117 assert(tmpbuf[0] == 55);
118 assert(tmpbuf[0] != buf[0]);
119 assert(tmpbuf[1] == buf[1]);
120 assert(tmpbuf[2] == buf[2]);
121 assert(tmpbuf[3] == buf[3]);
122 assert(tmpbuf[4] == buf[4]);
vlm18dd82c2006-08-18 01:34:18 +0000123}
vlm337167e2005-11-26 11:25:14 +0000124
vlm18dd82c2006-08-18 01:34:18 +0000125static int Ignore(const void *data, size_t size, void *op_key) {
126 return 0;
127}
128
129static void
130check_per_encoding() {
131 asn_per_outp_t po;
vlmc8d90522006-09-18 21:36:30 +0000132 int ret;
133
vlm18dd82c2006-08-18 01:34:18 +0000134 po.buffer = po.tmpspace;
135 po.nboff = 0;
136 po.nbits = 0;
137 po.outper = Ignore;
138 po.op_key = 0;
139 po.tmpspace[0] = 0xff;
vlm18dd82c2006-08-18 01:34:18 +0000140
141 ret = per_put_few_bits(&po, 0, 0);
142 assert(ret == 0);
143 assert(po.nboff == 0);
144 assert(po.buffer == po.tmpspace);
145 assert(po.tmpspace[0] == 0xff);
146
147 ret = per_put_few_bits(&po, 0, 1);
148 assert(ret == 0);
149 assert(po.nboff == 1);
150 assert(po.nbits == 8 * sizeof(po.tmpspace));
151 assert(po.buffer == po.tmpspace);
152 assert(po.tmpspace[0] == 0x00);
153
154 ret = per_put_few_bits(&po, 1, 1);
155 assert(ret == 0);
156 assert(po.nboff == 2);
157 assert(po.nbits == 8 * sizeof(po.tmpspace));
158 assert(po.buffer == po.tmpspace);
159 assert(po.tmpspace[0] == 0x40);
160
161 ret = per_put_few_bits(&po, 1, 1);
162 assert(ret == 0);
163 assert(po.nboff == 3);
164 assert(po.nbits == 8 * sizeof(po.tmpspace));
165 assert(po.buffer == po.tmpspace);
166 assert(po.tmpspace[0] == 0x60);
167
168 ret = per_put_few_bits(&po, 15, 5);
169 assert(ret == 0);
170 assert(po.nboff == 8);
171 assert(po.nbits == 8 * sizeof(po.tmpspace));
172 assert(po.buffer == po.tmpspace);
173 assert(po.tmpspace[0] == 0x6F);
174
175 ret = per_put_few_bits(&po, 0xf0ff, 16);
176 assert(ret == 0);
177 assert(po.nboff == 16);
178 assert(po.nbits == 8 * sizeof(po.tmpspace) - 8);
179 assert(po.buffer == po.tmpspace + 1);
180 assert(po.tmpspace[0] == 0x6F);
181 assert(po.tmpspace[1] == 0xf0);
182 assert(po.tmpspace[2] == 0xff);
183
184 po.nboff--;
185
186 ret = per_put_few_bits(&po, 2, 1);
187 assert(ret == 0);
188 assert(po.nboff == 8);
189 assert(po.nbits == 8 * sizeof(po.tmpspace) - 16);
190 assert(po.buffer == po.tmpspace + 2);
191 assert(po.tmpspace[0] == 0x6F);
192 assert(po.tmpspace[1] == 0xf0);
193 assert(po.tmpspace[2] == 0xfe);
194
195 ret = per_put_few_bits(&po, 2, 32);
196 assert(ret == -1);
197
198 ret = per_put_few_bits(&po, 2, -1);
199 assert(ret == -1);
200
201 ret = per_put_few_bits(&po, -1, 31);
202 assert(ret == 0);
203 assert(po.nboff == 31);
204 assert(po.nbits == 8 * sizeof(po.tmpspace) - 24);
205 assert(po.buffer == po.tmpspace + 3);
206 assert(po.tmpspace[0] == 0x6F);
207 assert(po.tmpspace[1] == 0xf0);
208 assert(po.tmpspace[2] == 0xfe);
209 assert(po.tmpspace[3] == 0xff);
210 assert(po.tmpspace[4] == 0xff);
211 assert(po.tmpspace[5] == 0xff);
212 assert(po.tmpspace[6] == 0xfe);
213
214
215}
216
217int
218main() {
219 check_per_decoding();
220 check_per_encoding();
vlm337167e2005-11-26 11:25:14 +0000221 return 0;
222}