Simple zero block check
authorMathis Rosenhauer <rosenhauer@dkrz.de>
Thu, 20 Sep 2012 17:34:50 +0000 (19:34 +0200)
committerThomas Jahns <jahns@dkrz.de>
Tue, 19 Feb 2013 10:32:59 +0000 (11:32 +0100)
.gitignore
Makefile.am
configure.ac
tests/Makefile.am [new file with mode: 0644]
tests/check_aec.c [new file with mode: 0644]

index cd13857..253a80b 100644 (file)
@@ -1,9 +1,9 @@
 Makefile
 Makefile.in
 aclocal.m4
-config/
-src/.libs/
-src/.deps/
+config
+.libs
+.deps
 src/aec
 src/test_szcomp
 *.o
@@ -13,5 +13,6 @@ config.log
 config.status
 configure
 libtool
-autom4te.cache/
-m4/
+autom4te.cache
+m4
+
index 0a7b929..16e75b5 100644 (file)
@@ -1,2 +1,2 @@
 ACLOCAL_AMFLAGS = -I m4
-SUBDIRS = src
+SUBDIRS = src tests
index cf717c5..2eb9609 100644 (file)
@@ -33,7 +33,8 @@ AC_FUNC_MALLOC
 AC_CHECK_FUNCS([memset strstr])
 
 AC_CONFIG_FILES([Makefile
-                 src/Makefile])
+                 src/Makefile
+                 tests/Makefile])
 AC_OUTPUT
 
 # Checks compilers and preprocessors
diff --git a/tests/Makefile.am b/tests/Makefile.am
new file mode 100644 (file)
index 0000000..3e5f560
--- /dev/null
@@ -0,0 +1,5 @@
+INCLUDES = -I$(top_srcdir)/src
+TESTS = check_aec
+check_PROGRAMS = check_aec
+check_aec_SOURCES = check_aec.c $(top_builddir)/src/libaec.h
+check_aec_LDADD = $(top_builddir)/src/libaec-0.0.la
diff --git a/tests/check_aec.c b/tests/check_aec.c
new file mode 100644 (file)
index 0000000..dab1930
--- /dev/null
@@ -0,0 +1,116 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <inttypes.h>
+#include <string.h>
+#include "libaec.h"
+
+#define BUF_SIZE 1024
+
+int encode_decode(struct aec_stream *strm,
+                  uint8_t *ubuf,
+                  uint8_t *cbuf,
+                  uint8_t *obuf,
+                  size_t n)
+{
+    int status;
+
+    strm->avail_in = n;
+    strm->avail_out = n;
+    strm->next_in = ubuf;
+    strm->next_out = cbuf;
+
+    status = aec_encode_init(strm);
+    if (status != AEC_OK) {
+        printf("Init failed.\n");
+        return 99;
+    }
+
+    status = aec_encode(strm, AEC_FLUSH);
+    if (status != AEC_OK) {
+        printf("Encode failed.\n");
+        return 99;
+    }
+
+    aec_encode_end(strm);
+
+    strm->avail_in = strm->total_out;
+    strm->avail_out = n;
+    strm->next_in = cbuf;
+    strm->next_out = obuf;
+
+    status = aec_decode_init(strm);
+    if (status != AEC_OK) {
+        printf("Init failed.\n");
+        return 99;
+    }
+
+    status = aec_decode(strm, AEC_FLUSH);
+    if (status != AEC_OK) {
+        printf("Decode failed.\n");
+        return 99;
+    }
+
+    if (memcmp(ubuf, obuf, n)) {
+        printf("FAIL: Uncompressed output differs from input.\n");
+        return 99;
+    }
+    aec_decode_end(strm);
+    return 0;
+}
+
+int check_zero(struct aec_stream *strm,
+               uint8_t *ubuf,
+               uint8_t *cbuf,
+               uint8_t *obuf,
+               size_t n)
+{
+    int bs, status;
+
+    for (bs = 8; bs <= 64; bs *= 2) {
+        memset(ubuf, 0x55, n);
+        strm->bit_per_sample = 8;
+        strm->block_size = bs;
+        strm->rsi = n / bs;
+        strm->flags = AEC_DATA_PREPROCESS;
+
+        printf("Checking zero blocks with block size %i ... ", bs);
+
+        status = encode_decode(strm, ubuf, cbuf, obuf, n);
+        if (status)
+            return status;
+
+        if ((cbuf[0] & 0xf0) != 0) {
+            printf("FAIL: Unexpected block created.\n");
+            return 99;
+        }
+        printf ("OK\n");
+    }
+    return 0;
+}
+
+int main (void)
+{
+    int status;
+    uint8_t *ubuf, *cbuf, *obuf;
+    struct aec_stream strm;
+
+    ubuf = (uint8_t *)malloc(BUF_SIZE);
+    cbuf = (uint8_t *)malloc(BUF_SIZE);
+    obuf = (uint8_t *)malloc(BUF_SIZE);
+
+    if (!ubuf || !cbuf || !obuf) {
+        printf("Not enough memory.\n");
+        return 99;
+    }
+
+    status = check_zero(&strm, ubuf, cbuf, obuf, BUF_SIZE);
+    if (status)
+        return status;
+
+    free(ubuf);
+    free(cbuf);
+    free(obuf);
+
+    return 0;
+}