check-OCTET_STRING.c 4.34 KB
Newer Older
Lev Walkin's avatar
Lev Walkin committed
1 2 3
#include <stdio.h>
#include <assert.h>
#include <time.h>
Lev Walkin's avatar
Lev Walkin committed
4 5
#include <sys/time.h>

Lev Walkin's avatar
Lev Walkin committed
6 7 8
#include <OCTET_STRING.h>
#include <BIT_STRING.h>

9
enum encoding_type { HEX, BINARY, UTF8 };
Lev Walkin's avatar
Lev Walkin committed
10

11 12
#define check(t, tag, buf, verify)  check_impl(__LINE__, t, tag, buf, verify)

Lev Walkin's avatar
Lev Walkin committed
13
static void
14
check_impl(int lineno, enum encoding_type type, char *tagname, char *xmlbuf, char *verify) {
Lev Walkin's avatar
Lev Walkin committed
15 16
	size_t xmllen = strlen(xmlbuf);
	size_t verlen = verify ? strlen(verify) : 0;
Lev Walkin's avatar
Lev Walkin committed
17 18
	asn_TYPE_descriptor_t *td = &asn_DEF_OCTET_STRING;
	OCTET_STRING_t *st = 0;
Lev Walkin's avatar
Lev Walkin committed
19
	OCTET_STRING_t **stp = &st;
Lev Walkin's avatar
Lev Walkin committed
20 21 22 23
	asn_dec_rval_t rc;
	xer_type_decoder_f *decoder = 0;

	switch(type) {
24 25 26
	case HEX:
		decoder = OCTET_STRING_decode_xer_hex;
		break;
Lev Walkin's avatar
Lev Walkin committed
27 28
	case BINARY:
		td = &asn_DEF_BIT_STRING;
29 30 31 32 33
		decoder = OCTET_STRING_decode_xer_binary;
		break;
	case UTF8:
		decoder = OCTET_STRING_decode_xer_utf8;
		break;
Lev Walkin's avatar
Lev Walkin committed
34 35
	}

Lev Walkin's avatar
Lev Walkin committed
36
	rc = decoder(0, td, (void **)stp, tagname, xmlbuf, xmllen);
37 38
	printf("%03d: [%s] => [%s]:%zu vs [%s]:%zu, code %d\n",
		lineno, xmlbuf,
Lev Walkin's avatar
Lev Walkin committed
39
		st ? (const char *)st->buf : "", st ? st->size : 0,
Lev Walkin's avatar
oops  
Lev Walkin committed
40
		verify ? verify : "", verlen, rc.code);
Lev Walkin's avatar
Lev Walkin committed
41 42 43 44 45 46 47 48 49 50

	if(verify) {
		assert(rc.code == RC_OK);
		assert(st);
		assert(st->buf);
		assert(st->size == verlen);
		assert(!memcmp(st->buf, verify, verlen));
	} else {
		assert(rc.code != RC_OK);
	}
51 52

	ASN_STRUCT_FREE(*td, st);
Lev Walkin's avatar
Lev Walkin committed
53 54
}

Lev Walkin's avatar
Lev Walkin committed
55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
static char buf[1024];

static int
write_buf(const void *buffer, size_t size, void *key) {
	size_t *off = key;
	assert(*off + size < sizeof(buf));
	memcpy(buf + *off, buffer, size);
	*off += size;
	return 0;
}

static void
encode(char *orig, char *encoded) {
	OCTET_STRING_t os;
	size_t written = 0;
	asn_enc_rval_t er;

	memset(&os, 0, sizeof(os));

	OCTET_STRING_fromString(&os, orig);

	er = OCTET_STRING_encode_xer_utf8(&asn_DEF_OCTET_STRING, &os,
			0, 0, write_buf, &written);
	assert(er.encoded >= 0);
	buf[er.encoded] = '\0';
	printf("Orig: [%s], encoded: [%s], check [%s]\n",
		orig, buf, encoded);
	assert(strcmp(buf, encoded) == 0);
83
	ASN_STRUCT_RESET(asn_DEF_OCTET_STRING, &os);
Lev Walkin's avatar
Lev Walkin committed
84 85
}

Lev Walkin's avatar
Lev Walkin committed
86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
int
main() {

	check(HEX, 0, "<OCTET_STRING>41424</OCTET_STRING>",
		"AB@");

	check(HEX, 0, "<!--comment--><OCTET_STRING>\n"
		"<!--comment-->41424</OCTET_STRING>",
		"AB@");

	check(HEX, 0, "<OCTET_STRING blah blah> 4 1 4 2 4 5 44 </OCTET_STRING>",
		"ABED");

	/* Some hard cases */
	check(HEX, "z", "<z><!-- < -->40</z>", "@");
	check(HEX, "z", "<z><!-- <-->40</z>", "@");
	check(HEX, "z", "<z><!-- -->>40</z>", 0);
	check(HEX, "z", "<z><!-- <some <sometag>-->40</z>", "@");
	check(HEX, "z", "<z><!-- <some <sometag-->>40</z>", 0);

Lev Walkin's avatar
Lev Walkin committed
106 107
	check(HEX, "z", "ignored<z>40</z>stuff", "@");

Lev Walkin's avatar
Lev Walkin committed
108
	check(HEX, "tag", "<tag>4</tag>", "@");
109 110 111 112 113
	check(HEX, "a-z", "<a-z>7 375 73 6c6 9<!--/-->6 b</a-z>", "suslik");

	/* This one has a comment in a not-yet-supported place */ 
	/* check(HEX, "a-z", "<a-z>73 75 73 6c 6<!--/-->9 6b</a-z>",
		"suslik"); */
Lev Walkin's avatar
Lev Walkin committed
114 115 116 117 118 119 120 121 122

	check(BINARY, "tag", "<tag/>", "");
	check(BINARY, "tag", "<tag>blah</tag>", 0);
	check(BINARY, "tag", "<tag>01000001</tag>", "A");
	check(BINARY, "tag", "<tag>01000<!--blah--> 00 101 00001</tag>", "AB");

	check(UTF8, 0, "<OCTET_STRING>one, two, three</OCTET_STRING>",
		"one, two, three");

Lev Walkin's avatar
Lev Walkin committed
123
	check(UTF8, "z", "<z></z>", "");
Lev Walkin's avatar
Lev Walkin committed
124 125 126 127 128 129 130
	check(UTF8, "z", "<z z z>&lt;&amp;&gt;</z z z>", "<&>");
	check(UTF8, "z", "<z z z>a&lt;b&amp;c&gt;d</z z z>", "a<b&c>d");
	check(UTF8, "z", "<z z z>a&lt</z z z>", "a&lt");
	check(UTF8, "z", "<z z z>a&sdfsdfsdf;b</z z z>", "a&sdfsdfsdf;b");
	check(UTF8, "z", "<z z z>a&#x20;b</z z z>", "a b");
	check(UTF8, "z", "<z z z>a&#32;b</z z z>", "a b");
	check(UTF8, "z", "<z>a&#32323;b</z>", "a\347\271\203b");
131 132 133 134 135 136 137
	check(UTF8, "z", "<z>a&#x4fc4;|</z>", "a\xe4\xbf\x84|");
    /* Last unicode point */
	check(UTF8, "z", "<z>a&#x10ffff;|</z>", "a\xf4\x8f\xbf\xbf|");
	check(UTF8, "z", "<z>a&#1114111;|</z>", "a\xf4\x8f\xbf\xbf|");
    /* One past the last unicode point */
	check(UTF8, "z", "<z>a&#x110000;|</z>", "a&#x110000;|");
	check(UTF8, "z", "<z>a&#1114112;|</z>", "a&#1114112;|");
Lev Walkin's avatar
Lev Walkin committed
138
	check(UTF8, "z", "<z>a&#3000000000;b</z>", "a&#3000000000;b");
Lev Walkin's avatar
Lev Walkin committed
139
	check(UTF8, "z", "<z>a&#5000000000;b</z>", "a&#5000000000;b");
Lev Walkin's avatar
Lev Walkin committed
140 141 142 143 144 145
	check(UTF8, "z", "<z>a&#300</z>", "a&#300");
	check(UTF8, "z", "<z>a&#-300;</z>", "a&#-300;");
	check(UTF8, "z", "<z>a<ff/>b</z>", "a\014b");
	check(UTF8, "z", "<z>a<soh/>b</z>", "a\001b");
	check(UTF8, "z", "<z>a<bel/></z>", "a\007");

Lev Walkin's avatar
Lev Walkin committed
146 147 148 149 150 151
	encode("", "");
	encode("a", "a");
	encode("a\nb", "a\nb");
	encode("a\bc", "a<bs/>c");
	encode("ab\01c\ndef\r\n", "ab<soh/>c\ndef\r\n");

Lev Walkin's avatar
Lev Walkin committed
152 153 154
	return 0;
}