Initial version of asn1c
[com/asn1c.git] / tests / tests-skeletons / check-OER-support.c
diff --git a/tests/tests-skeletons/check-OER-support.c b/tests/tests-skeletons/check-OER-support.c
new file mode 100644 (file)
index 0000000..5433900
--- /dev/null
@@ -0,0 +1,67 @@
+#include <assert.h>
+#include <oer_support.c>
+
+static char buffer[128];
+
+static int fill_buffer(const void *data, size_t size, void *app_key) {
+    size_t *offset = (size_t *)app_key;
+    assert(*offset + size < sizeof(buffer));
+    memcpy(&buffer[*offset], data, size);
+    *offset += size;
+    return 0;
+}
+
+#define CHECK(a, b) check_round_trip(__LINE__, a, b)
+
+static void
+check_round_trip(int lineno, int ok, size_t length) {
+    fprintf(stderr, "%03d: Round-trip for %zu\n", lineno, length);
+
+    /* Serialize */
+    size_t enc_len = 0;
+    ssize_t enc_len_len = oer_serialize_length(length, fill_buffer, &enc_len);
+    assert(enc_len_len > 0);
+    assert(enc_len == (size_t)enc_len_len);
+
+    /* Deserialize */
+    size_t recovered_length = 0;
+    for(size_t part = 0; part < enc_len; part++) {
+        size_t ret = oer_fetch_length(buffer, part, &recovered_length);
+        assert(ret == 0);   /* More data expected. */
+    }
+    ssize_t dec_len = oer_fetch_length(buffer, enc_len, &recovered_length);
+    if(ok) {
+        assert(dec_len > 0);
+        assert((size_t)dec_len == enc_len);
+        if(recovered_length != length) {
+            fprintf(stderr,
+                    "Round-trip failed %zu->%zu (encoded %zd, decoded %zd)\n",
+                    length, recovered_length, enc_len, dec_len);
+            assert(recovered_length == length);
+        }
+    } else {
+        assert(dec_len == -1);
+    }
+}
+
+int main() {
+    int bits64 = sizeof(size_t) > 4;
+
+    CHECK(1, 0);
+    CHECK(1, 1);
+    CHECK(1, 127);
+    CHECK(1, 128);
+    CHECK(1, 129);
+    CHECK(1, 255);
+    CHECK(1, 256);
+    CHECK(1, 65534);
+    CHECK(1, 65535);
+    CHECK(1, 65536);
+    CHECK(1, 65538);
+    CHECK(1, 16000000);
+    CHECK(1, 16777216);
+    CHECK(bits64, 2147483648);
+    CHECK(bits64, 4294967295UL);
+
+}
+