diff options
author | Joseph Hunkeler <jhunkeler@gmail.com> | 2020-04-09 13:16:04 -0400 |
---|---|---|
committer | Joseph Hunkeler <jhunkeler@gmail.com> | 2020-04-09 13:31:32 -0400 |
commit | 5fab65a9f8c026ccd9e4c58cbe1d2aea06c28305 (patch) | |
tree | c7c207c995fcc69d9f0b0d338120676853ec3a49 /tests | |
parent | 6132127cd75b1265e84daad00f3c1e5dfeef0e2c (diff) | |
download | spmc-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.h | 43 | ||||
-rw-r--r-- | tests/test_fs_get_file_size.c | 30 |
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 |