Add first test
authorJonathan Dieter <jdieter@gmail.com>
Sat, 21 Apr 2018 11:25:52 +0000 (14:25 +0300)
committerJonathan Dieter <jdieter@gmail.com>
Sat, 21 Apr 2018 11:25:52 +0000 (14:25 +0300)
Signed-off-by: Jonathan Dieter <jdieter@gmail.com>
test/empty.c [new file with mode: 0644]
test/lib/meson.build [new file with mode: 0644]
test/lib/util.c [new file with mode: 0644]
test/lib/util.h [new file with mode: 0644]
test/meson.build

diff --git a/test/empty.c b/test/empty.c
new file mode 100644 (file)
index 0000000..1c6fca6
--- /dev/null
@@ -0,0 +1,94 @@
+/*
+ * Copyright 2018 Jonathan Dieter <jdieter@gmail.com>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ *  1. Redistributions of source code must retain the above copyright notice,
+ *     this list of conditions and the following disclaimer.
+ *
+ *  2. Redistributions in binary form must reproduce the above copyright notice,
+ *     this list of conditions and the following disclaimer in the documentation
+ *     and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <zck.h>
+#include "zck_private.h"
+#include "util.h"
+
+static char *checksum="42590fea6f55aca71e222ebe2d147ed89d17aac951a997fef8b980b2803a0412";
+
+int main (int argc, char *argv[]) {
+    int out = open("empty.zck", O_WRONLY | O_CREAT | O_TRUNC, 0666);
+    if(out < 0) {
+        perror("Unable to open empty.zck for writing");
+        exit(1);
+    }
+    zckCtx *zck = zck_init_write(out);
+    if(zck == NULL)
+        exit(1);
+
+    if(!zck_close(zck))
+        exit(1);
+    close(out);
+    zck_free(&zck);
+    int in = open("empty.zck", O_RDONLY);
+    if(in < 0) {
+        perror("Unable to open empty.zck for reading");
+        exit(1);
+    }
+    /* File should be 101 bytes, but we'll go a bit over */
+    char *data = zmalloc(1000);
+    if(data == NULL) {
+        perror("Unable to allocate 1000 bytes");
+        exit(1);
+    }
+    ssize_t len = read(in, data, 1000);
+    if(len < 0) {
+        perror("Unable to read from empty.zck");
+        exit(1);
+    }
+    char *cksum = get_hash(data, len, ZCK_HASH_SHA256);
+    printf("empty.zck: (SHA-256)%s\n", cksum);
+    if(memcmp(cksum, checksum, strlen(cksum)) != 0) {
+        printf("Expected checksum: (SHA-256)%s\n", checksum);
+        exit(1);
+    }
+    if(lseek(in, 0, SEEK_SET) != 0) {
+        perror("Unable to seek to beginning of empty.zck");
+        exit(1);
+    }
+    zck = zck_init_read(in);
+    if(zck == NULL)
+        exit(1);
+    memset(data, 0, 1000);
+    len = zck_read(zck, data, 1000);
+    if(len > 0) {
+        printf("%li bytes read, but file should be empty\n", len);
+        exit(1);
+    }
+    if(!zck_close(zck))
+        exit(1);
+
+    return 0;
+}
diff --git a/test/lib/meson.build b/test/lib/meson.build
new file mode 100644 (file)
index 0000000..96976c5
--- /dev/null
@@ -0,0 +1,2 @@
+util_sources += lib_sources
+util_sources += files('util.c')
diff --git a/test/lib/util.c b/test/lib/util.c
new file mode 100644 (file)
index 0000000..734cbd0
--- /dev/null
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2018 Jonathan Dieter <jdieter@gmail.com>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ *  1. Redistributions of source code must retain the above copyright notice,
+ *     this list of conditions and the following disclaimer.
+ *
+ *  2. Redistributions in binary form must reproduce the above copyright notice,
+ *     this list of conditions and the following disclaimer in the documentation
+ *     and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <stdlib.h>
+#include <zck.h>
+#include "../../src/lib/zck_private.h"
+
+char *get_hash(char *data, size_t length, int type) {
+    zckHashType hash_type = {0};
+    zckHash hash = {0};
+    if(!zck_hash_setup(&hash_type, type))
+        return NULL;
+    if(!zck_hash_init(&hash, &hash_type))
+        return NULL;
+    if(!zck_hash_update(&hash, data, length))
+        return NULL;
+    char *digest = zck_hash_finalize(&hash);
+    if(digest == NULL)
+        return NULL;
+    return get_digest_string(digest, hash_type.digest_size);
+}
+
diff --git a/test/lib/util.h b/test/lib/util.h
new file mode 100644 (file)
index 0000000..6e52574
--- /dev/null
@@ -0,0 +1,29 @@
+/*
+ * Copyright 2018 Jonathan Dieter <jdieter@gmail.com>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ *  1. Redistributions of source code must retain the above copyright notice,
+ *     this list of conditions and the following disclaimer.
+ *
+ *  2. Redistributions in binary form must reproduce the above copyright notice,
+ *     this list of conditions and the following disclaimer in the documentation
+ *     and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+char *get_hash(char *data, size_t length, int type)
+    __attribute__ ((warn_unused_result));
+
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..c49ad0f88f2d0ef0badc33d34b1526c0a096d953 100644 (file)
@@ -0,0 +1,7 @@
+util_sources = []
+subdir('lib')
+incdir = include_directories(['lib', '../src/lib', '../include'])
+empty = executable('empty', ['empty.c'] + util_sources, include_directories: incdir, dependencies: [zstd_dep, curl_dep])
+file_path = join_paths(meson.source_root(), 'test/files')
+
+test('create and validate empty zchunk file', empty)