Initial revision


git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@2 59561ff5-6e30-0410-9f3c-9617f08c8826
diff --git a/skeletons/tests/check-OIDs.c b/skeletons/tests/check-OIDs.c
new file mode 100644
index 0000000..a97a910
--- /dev/null
+++ b/skeletons/tests/check-OIDs.c
@@ -0,0 +1,228 @@
+#include "../RELATIVE-OID.c"
+#include "../OBJECT_IDENTIFIER.c"
+#include "../INTEGER.c"
+#include "../ber_decoder.c"
+#include "../ber_tlv_length.c"
+#include "../ber_tlv_tag.c"
+#include "../der_encoder.c"
+#include "../constraints.c"
+
+static int
+_print(const void *buffer, size_t size, void *app_key) {
+	fwrite(buffer, size, 1, stdout);
+	return 0;
+}
+
+static void
+check_OID(uint8_t *buf, size_t len, int *ck_buf, int ck_len) {
+	OBJECT_IDENTIFIER_t *oid;
+	ber_dec_rval_t rval;
+	unsigned long arcs[10];
+	int alen;
+	int i;
+
+	printf("Checking {");
+	for(i = 0; i < len; i++) { printf("%s%02x", i?" ":"", buf[i]); }
+	printf("} against {");
+	for(i = 0; i < ck_len; i++) { printf("%s%d", i?" ":"", ck_buf[i]); }
+	printf("}\n");
+
+	oid = NULL;
+	rval = ber_decode(&asn1_DEF_OBJECT_IDENTIFIER, (void *)&oid, buf, len);
+	assert(rval.code == RC_OK);
+
+	assert(oid->size == len - 2);
+
+	/*
+	 * Print the contents for visual debugging.
+	 */
+	printf("OBJECT_IDENTIFIER_print() => ");
+	OBJECT_IDENTIFIER_print(&asn1_DEF_OBJECT_IDENTIFIER, oid, 0, _print, 0);
+	printf("\n");
+
+	alen = OBJECT_IDENTIFIER_get_arcs_l(oid,
+		arcs, sizeof(arcs)/sizeof(arcs[0]));
+	assert(alen > 0);
+	assert(alen == ck_len);
+
+	/*
+	 * Make sure they are equivalent.
+	 */
+	printf("OBJECT_IDENTIFIER_get_arcs() => {");
+	for(i = 0; i < alen; i++) {
+		printf(" %lu", arcs[i]);
+		assert(arcs[i] == ck_buf[i]);
+	}
+	printf(" }\n");
+}
+
+static void
+check_ROID(uint8_t *buf, size_t len, int *ck_buf, int ck_len) {
+	RELATIVE_OID_t *oid;
+	ber_dec_rval_t rval;
+	unsigned long arcs[10];
+	int alen;
+	int i;
+
+	printf("Checking {");
+	for(i = 0; i < len; i++) { printf("%s%02x", i?" ":"", buf[i]); }
+	printf("} against {");
+	for(i = 0; i < ck_len; i++) { printf("%s%d", i?" ":"", ck_buf[i]); }
+	printf("}\n");
+
+	oid = NULL;
+	rval = ber_decode(&asn1_DEF_RELATIVE_OID, (void *)&oid, buf, len);
+	assert(rval.code == RC_OK);
+
+	assert(oid->size == len - 2);
+
+	/*
+	 * Print the contents for visual debugging.
+	 */
+	printf("RELATIVE_OID_print() => ");
+	RELATIVE_OID_print(&asn1_DEF_RELATIVE_OID, oid, 0, _print, 0);
+	printf("\n");
+
+	alen = RELATIVE_OID_get_arcs_l(oid,
+		arcs, sizeof(arcs)/sizeof(arcs[0]));
+	assert(alen > 0);
+	assert(alen == ck_len);
+
+	/*
+	 * Make sure they are equivalent.
+	 */
+	printf("RELATIVE_OID_get_arcs() => {");
+	for(i = 0; i < alen; i++) {
+		printf(" %lu", (unsigned long)arcs[i]);
+		assert(arcs[i] == ck_buf[i]);
+	}
+	printf(" }\n");
+}
+
+/*
+ * Encode the specified array of arcs as RELATIVE-OID, decode it and compare.
+ */
+static void
+check_REGEN(int *arcs, int acount) {
+	static RELATIVE_OID_t oid;
+	unsigned long tmp_arcs[10];
+	int tmp_alen = 10;
+	int alen;
+	int ret;
+	int i;
+
+	printf("Encoding {");
+	for(i = 0; i < acount; i++) {
+		printf(" %u", arcs[i]);
+	}
+	printf(" }\n");
+
+	ret = RELATIVE_OID_set_arcs_l(&oid, (unsigned long *)arcs, acount);
+	assert(ret == 0);
+
+	alen = RELATIVE_OID_get_arcs_l(&oid, tmp_arcs, tmp_alen);
+	assert(alen >= 0);
+	assert(alen < tmp_alen);
+
+	printf("Encoded {");
+	for(i = 0; i < alen; i++) {
+		printf(" %lu", tmp_arcs[i]);
+		assert(arcs[i] == tmp_arcs[i]);
+	}
+	printf(" }\n");
+}
+
+/*
+ * Encode the specified array of arcs as OBJECT IDENTIFIER,
+ * decode it and compare.
+ */
+static void
+check_REGEN_OID(int *arcs, int acount) {
+	static OBJECT_IDENTIFIER_t oid;
+	unsigned long tmp_arcs[10];
+	int tmp_alen = 10;
+	int alen;
+	int ret;
+	int i;
+
+	printf("Encoding {");
+	for(i = 0; i < acount; i++) {
+		printf(" %u", arcs[i]);
+	}
+	printf(" }\n");
+
+	ret = OBJECT_IDENTIFIER_set_arcs_l(&oid, (unsigned long *)arcs, acount);
+	assert(ret == 0);
+
+	alen = OBJECT_IDENTIFIER_get_arcs_l(&oid, tmp_arcs, tmp_alen);
+	assert(alen >= 0);
+	assert(alen < tmp_alen);
+
+	printf("Encoded {");
+	for(i = 0; i < alen; i++) {
+		printf(" %lu", tmp_arcs[i]);
+		assert(arcs[i] == tmp_arcs[i]);
+	}
+	printf(" }\n");
+}
+
+#define	CHECK_OID(n)	check_OID(buf ## n, sizeof(buf ## n),		\
+		buf ## n ## _check,					\
+		sizeof(buf ## n ## _check)/sizeof(buf ## n ## _check[0]))
+#define	CHECK_ROID(n)	check_ROID(buf ## n, sizeof(buf ## n),		\
+		buf ## n ## _check,					\
+		sizeof(buf ## n ## _check)/sizeof(buf ## n ## _check[0]))
+#define	CHECK_REGEN(n) check_REGEN(buf ## n ## _check,			\
+		sizeof(buf ## n ## _check)/sizeof(buf ## n ## _check[0]))
+#define	CHECK_REGEN_OID(n) check_REGEN_OID(buf ## n ## _check,		\
+		sizeof(buf ## n ## _check)/sizeof(buf ## n ## _check[0]))
+
+int
+main(int ac, char **av) {
+	/* {joint-iso-itu-t 100 3} */
+	uint8_t buf1[] = {
+		0x06,	/* OBJECT IDENTIFIER */
+		0x03,	/* Length */
+		0x81, 0x34, 0x03
+	};
+	int buf1_check[] = { 2, 100, 3 };
+
+	/* {8571 3 2} */
+	uint8_t buf2[] = {
+		0x0D,	/* RELATIVE-OID */
+		0x04,	/* Length */
+		0xC2, 0x7B, 0x03, 0x02
+	};
+	int buf2_check[] = { 8571, 3, 2 };
+
+	int buf3_check[] = { 0 };
+	int buf4_check[] = { 1 };
+	int buf5_check[] = { 80, 40 };
+	int buf6_check[] = { 127 };
+	int buf7_check[] = { 128 };
+	int buf8_check[] = { 65535, 65536 };
+	int buf9_check[] = { 100000, 0x20000, 1234, 256, 127, 128 };
+	int buf10_check[] = { 0, 0xffffffff, 0xff00ff00, 0 };
+	int buf11_check[] = { 0, 1, 2 };
+	int buf12_check[] = { 1, 38, 3 };
+	int buf13_check[] = { 0, 0, 0xf000 };
+
+
+	CHECK_OID(1);	/* buf1, buf1_check */
+	CHECK_ROID(2);	/* buf2, buf2_check */
+
+	CHECK_REGEN(3);	/* Regenerate RELATIVE-OID */
+	CHECK_REGEN(4);
+	CHECK_REGEN(5);
+	CHECK_REGEN(6);
+	CHECK_REGEN(7);
+	CHECK_REGEN(8);
+	CHECK_REGEN(9);
+	CHECK_REGEN(10);
+	CHECK_REGEN_OID(1);	/* Regenerate OBJECT IDENTIFIER */
+	CHECK_REGEN_OID(11);
+	CHECK_REGEN_OID(12);
+	CHECK_REGEN_OID(13);
+
+	return 0;
+}