/* * Copyright 2014 (c) Anna Schumaker. */ #include #include #include #include static void test_verify_constructor(struct file *file, gchar *fpath, gchar *ftmp) { g_assert_null(file->f_file); g_assert_cmpuint(file_version(file), ==, 0); g_assert_cmpuint(file->f_mode, ==, OPEN_READ); g_assert_cmpstr_free(file_path(file), ==, fpath); g_assert_cmpstr_free(file_write_path(file), ==, ftmp); } static void test_invalid_file(gconstpointer path) { struct file file; file_init(&file, (gchar *)path, 0, 0); test_verify_constructor(&file, "", ""); g_assert_false(file_open(&file, OPEN_READ)); g_assert_null(file.f_file); g_assert_false(file_open(&file, OPEN_WRITE)); g_assert_null(file.f_file); g_assert_cmpuint(file.f_mode, ==, OPEN_READ); g_assert_false(file_exists(&file)); } static void __test_file_subprocess() { struct file file = FILE_INIT("file.txt", 0, 0); gchar *basepath, *filepath, *realpath; basepath = g_strjoin("/", g_get_user_data_dir(), OCARINA_NAME, NULL); filepath = g_strjoin("/", basepath, "file.txt", NULL); realpath = g_strjoin("/", basepath, ".file.txt.tmp", NULL); test_verify_constructor(&file, filepath, realpath); g_assert_false(file_exists(&file)); g_assert_false(file_open(&file, OPEN_READ)); g_assert_true(file_open(&file, OPEN_WRITE)); g_assert_nonnull(file.f_file); g_assert_cmpuint(file.f_mode, ==, OPEN_WRITE); g_assert_false(file_open(&file, OPEN_WRITE)); g_assert_false(file_exists(&file)); file_close(&file); g_assert_null(file.f_file); g_assert_cmpuint(file.f_mode, ==, OPEN_WRITE); g_assert_true(file_exists(&file)); g_chmod(filepath, 0444); g_assert_false(file_open(&file, OPEN_WRITE)); g_chmod(filepath, 0200); g_assert_false(file_open(&file, OPEN_READ)); g_chmod(filepath, 0644); g_assert_true(file_open(&file, OPEN_READ)); g_assert_nonnull(file.f_file); g_assert_cmpuint(file.f_mode, ==, OPEN_READ); g_assert_false(file_open(&file, OPEN_READ)); g_assert_false(file_remove(&file)); g_assert_true(file_exists(&file)); file_close(&file); g_assert_true(file_remove(&file)); g_assert_false(file_exists(&file)); g_free(filepath); } static void test_file() { if (g_test_subprocess()) { __test_file_subprocess(); return; } g_test_trap_subprocess(NULL, 0, 0); g_test_trap_assert_passed(); g_test_trap_assert_stderr("*file.txt: Permission denied*"); } static void test_io() { struct file fout = FILE_INIT("file.txt", 1, 1); struct file fin = FILE_INIT("file.txt", 2, 1); char *res = NULL; unsigned int i; g_assert_true(file_open(&fout, OPEN_WRITE)); file_writef(&fout, "1 ABCDE\n"); file_writef(&fout, "2 FGHIJ KLMNO\n"); file_writef(&fout, "3 \n"); file_writef(&fout, "4 5 PQRST\n"); file_close(&fout); g_assert_true(file_exists(&fout)); g_assert_true(file_open(&fin, OPEN_READ)); g_assert_cmpuint(file_version(&fin), ==, 1); g_assert_cmpuint(file_readf(&fin, "%u %ms\n", &i, &res), ==, 2); g_assert_cmpuint(i, ==, 1); g_assert_cmpstr_free(res, ==, "ABCDE"); g_assert_cmpuint(file_readf(&fin, "%u %m[^\n]\n", &i, &res), ==, 2); g_assert_cmpuint(i, ==, 2); g_assert_cmpstr_free(res, ==, "FGHIJ KLMNO"); g_assert_cmpuint(file_readf(&fin, "%u", &i), ==, 1); res = file_readl(&fin); g_assert_cmpuint(i, ==, 3); g_assert_cmpstr_free(res, ==, ""); g_assert_cmpuint(file_readf(&fin, "%u %m[^\n]", &i, &res), ==, 2); g_assert_cmpuint(i, ==, 4); g_assert_cmpstr_free(res, ==, "5 PQRST"); file_close(&fin); g_assert_cmpuint(file_version(&fin), ==, 2); } static void __test_versioning_subprocess(unsigned int out, unsigned int in) { struct file fout = FILE_INIT("file.txt", out, out); struct file fin = FILE_INIT("file.txt", in, in); g_assert_true(file_open(&fout, OPEN_WRITE)); file_writef(&fout, "abcdefghijklmnopqrstuvwxyz"); file_close(&fout); g_assert_true(file_exists(&fout)); g_assert_false(file_open(&fin, OPEN_READ)); g_assert_null(fin.f_file); } static void test_versioning_old() { if (g_test_subprocess()) { __test_versioning_subprocess(0, 1); return; }; g_test_trap_subprocess(NULL, 0, 0); g_test_trap_assert_failed(); g_test_trap_assert_stderr("*file.txt: File too old to be upgraded.*"); } static void test_versioning_new() { if (g_test_subprocess()) { __test_versioning_subprocess(1, 0); return; } g_test_trap_subprocess(NULL, 0, 0); g_test_trap_assert_failed(); g_test_trap_assert_stderr("*file.txt: File too new to be opened.*"); } static void test_cache() { struct cache_file file = CACHE_FILE_INIT("dir", "file.txt"); struct cache_file copy = CACHE_FILE_INIT("dir", "copy.txt"); gchar *basepath, *filepath, *writepath; basepath = g_strjoin("/", g_get_user_cache_dir(), OCARINA_NAME, NULL); filepath = g_strjoin("/", basepath, "dir", "file.txt", NULL); writepath = g_strjoin("/", basepath, "dir", ".file.txt.tmp", NULL); g_assert_null(file.cf_file); g_assert_cmpstr(file.cf_name, ==, "file.txt"); g_assert_cmpstr(file.cf_subdir, ==, "dir"); g_assert_cmpstr_free(cache_file_path(&file), ==, filepath); g_assert_cmpstr_free(cache_file_write_path(&file), ==, writepath); /* Test writing data to a cache file. */ g_assert_false(cache_file_exists(&file)); g_assert_false(cache_file_open(&file, OPEN_READ)); g_assert_true(cache_file_open(&file, OPEN_WRITE)); g_assert_nonnull(file.cf_file); g_assert_false(cache_file_open(&file, OPEN_WRITE)); g_assert_false(cache_file_exists(&file)); g_assert_cmpuint(cache_file_write(&file, "abcde", 5), ==, 5); cache_file_close(&file); g_assert_null(file.cf_file); g_assert_true(cache_file_exists(&file)); /* Test importing a file into the cache. */ g_assert_false(cache_file_exists(©)); g_assert_false(cache_file_import(©, filepath)); g_assert_false(cache_file_exists(©)); g_assert_true(cache_file_open(©, OPEN_WRITE)); g_assert_false(cache_file_import(©, NULL)); g_assert_true(cache_file_import(©, filepath)); g_assert_false(cache_file_exists(©)); cache_file_close(©); g_assert_true(cache_file_exists(©)); } int main(int argc, char **argv) { g_test_init(&argc, &argv, NULL); g_test_add_data_func("/Core/File/Path = NULL", NULL, test_invalid_file); g_test_add_data_func("/Core/File/Path = \"\"", "", test_invalid_file); g_test_add_func("/Core/File/Path = \"file.txt\"", test_file); g_test_add_func("/Core/File/IO", test_io); g_test_add_func("/Core/File/Versioning/Too Old", test_versioning_old); g_test_add_func("/Core/File/Versioning/Too New", test_versioning_new); g_test_add_func("/Core/File/Cache", test_cache); return g_test_run(); }