aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorJoseph Hunkeler <jhunkeler@gmail.com>2020-04-09 13:16:04 -0400
committerJoseph Hunkeler <jhunkeler@gmail.com>2020-04-09 13:31:32 -0400
commit5fab65a9f8c026ccd9e4c58cbe1d2aea06c28305 (patch)
treec7c207c995fcc69d9f0b0d338120676853ec3a49 /tests
parent6132127cd75b1265e84daad00f3c1e5dfeef0e2c (diff)
downloadspmc-5fab65a9f8c026ccd9e4c58cbe1d2aea06c28305.tar.gz
Add test_fs_get_file_size
* Add mock_size function to framework.h
Diffstat (limited to 'tests')
-rw-r--r--tests/framework.h43
-rw-r--r--tests/test_fs_get_file_size.c30
2 files changed, 73 insertions, 0 deletions
diff --git a/tests/framework.h b/tests/framework.h
index 7770ed7..c083b8a 100644
--- a/tests/framework.h
+++ b/tests/framework.h
@@ -73,6 +73,49 @@ size_t mock(const char *filename, void *data, size_t size, size_t nelem) {
return written;
}
+/**
+ * Generate a temporary file of `size` in bytes, filled with `fill_byte`s
+ * @param size size of new file in bytes
+ * @param fill_byte byte to write `size` times
+ * @return temporary file path
+ */
+char *mock_size(size_t size, const char *fill_byte) {
+ FILE *fp = NULL;
+ char *buffer = NULL;
+ char filename[PATH_MAX] = {"mock_file_of_size.XXXXXX"};
+
+ if ((buffer = malloc(size)) == NULL) {
+ perror("unable to allocate buffer");
+ exit(errno);
+ }
+
+ if (fill_byte == NULL) {
+ return NULL;
+ }
+
+ if ((mkstemp(filename)) < 0) {
+ perror("mktemp failed to create temporary file");
+ exit(errno);
+ }
+
+ if ((fp = fopen(filename, "w+")) == NULL) {
+ perror(filename);
+ exit(errno);
+ }
+
+ memset(buffer, fill_byte[0], size);
+ size_t bytes = fwrite(buffer, sizeof(char), size, fp);
+ if (bytes == 0 && ferror(fp) != 0) {
+ fprintf(stderr, "%s: read failed\n", filename);
+ exit(1);
+ }
+
+ fclose(fp);
+ free(buffer);
+
+ return strdup(filename);
+}
+
#define myassert(condition, ...) \
do { \
if (!(condition)) { \
diff --git a/tests/test_fs_get_file_size.c b/tests/test_fs_get_file_size.c
new file mode 100644
index 0000000..ce93b13
--- /dev/null
+++ b/tests/test_fs_get_file_size.c
@@ -0,0 +1,30 @@
+#include "spm.h"
+#include "framework.h"
+
+#define KILOBYTE 1024
+
+
+
+const char *testFmt = "returned '%zu', expected '%zu'\n";
+struct TestCase testCase[] = {
+ {.caseValue.unsigned_integer = 0, .truthValue.unsigned_integer = 0},
+ {.caseValue.unsigned_integer = 1, .truthValue.unsigned_integer = 1},
+ {.caseValue.unsigned_integer = KILOBYTE, .truthValue.unsigned_integer = KILOBYTE},
+ {.caseValue.unsigned_integer = KILOBYTE * 1024, .truthValue.unsigned_integer = KILOBYTE * 1024},
+ {.caseValue.unsigned_integer = KILOBYTE * 1024 * 10, .truthValue.unsigned_integer = KILOBYTE * 1024 * 10},
+#if defined(TESTS_EXPENSIVE)
+ {.caseValue.unsigned_integer = KILOBYTE * 1024 * 100, .truthValue.unsigned_integer = KILOBYTE * 1024 * 100},
+#endif
+};
+size_t numCases = sizeof(testCase) / sizeof(struct TestCase);
+
+int main(int argc, char *argv[]) {
+ const char *fill = "$";
+ for (size_t i = 0; i < numCases; i++) {
+ char *filename = mock_size(testCase[i].caseValue.unsigned_integer, fill);
+ size_t result = get_file_size(filename);
+ myassert(result == testCase[i].truthValue.unsigned_integer, testFmt, result, testCase[i].truthValue.unsigned_integer);
+ unlink(filename);
+ }
+ return 0;
+} \ No newline at end of file