static void test_Consolidate(TestBatchRunner *runner) { Folder *folder = S_folder_with_contents(); FileHandle *fh; // Fake up detritus from failed consolidation. fh = Folder_Open_FileHandle(folder, cf_file, FH_CREATE | FH_WRITE_ONLY | FH_EXCLUSIVE); DECREF(fh); fh = Folder_Open_FileHandle(folder, cfmeta_temp, FH_CREATE | FH_WRITE_ONLY | FH_EXCLUSIVE); DECREF(fh); CompoundFileWriter *cf_writer = CFWriter_new(folder); CFWriter_Consolidate(cf_writer); PASS(runner, "Consolidate completes despite leftover files"); DECREF(cf_writer); TEST_TRUE(runner, Folder_Exists(folder, cf_file), "cf.dat file written"); TEST_TRUE(runner, Folder_Exists(folder, cfmeta_file), "cfmeta.json file written"); TEST_FALSE(runner, Folder_Exists(folder, foo), "original file zapped"); TEST_FALSE(runner, Folder_Exists(folder, cfmeta_temp), "detritus from failed consolidation zapped"); DECREF(folder); }
static void test_Open_FileHandle(TestBatch *batch) { Folder *folder = (Folder*)RAMFolder_new(NULL); FileHandle *fh; Folder_MkDir(folder, &foo); fh = Folder_Open_FileHandle(folder, &boffo, FH_CREATE | FH_WRITE_ONLY); TEST_TRUE(batch, fh && FH_Is_A(fh, FILEHANDLE), "Open_FileHandle"); DECREF(fh); fh = Folder_Open_FileHandle(folder, &foo_boffo, FH_CREATE | FH_WRITE_ONLY); TEST_TRUE(batch, fh && FH_Is_A(fh, FILEHANDLE), "Open_FileHandle for nested file"); DECREF(fh); Err_set_error(NULL); fh = Folder_Open_FileHandle(folder, &foo, FH_CREATE | FH_WRITE_ONLY); TEST_TRUE(batch, fh == NULL, "Open_FileHandle on existing dir path fails"); TEST_TRUE(batch, Err_get_error() != NULL, "Open_FileHandle on existing dir name sets Err_error"); Err_set_error(NULL); fh = Folder_Open_FileHandle(folder, &foo_bar_baz_boffo, FH_CREATE | FH_WRITE_ONLY); TEST_TRUE(batch, fh == NULL, "Open_FileHandle for entry within non-existent dir fails"); TEST_TRUE(batch, Err_get_error() != NULL, "Open_FileHandle for entry within non-existent dir sets Err_error"); DECREF(folder); }
static void test_Exists(TestBatch *batch) { Folder *folder = (Folder*)RAMFolder_new(NULL); FileHandle *fh; Folder_MkDir(folder, &foo); Folder_MkDir(folder, &foo_bar); fh = Folder_Open_FileHandle(folder, &boffo, FH_CREATE | FH_WRITE_ONLY); DECREF(fh); fh = Folder_Open_FileHandle(folder, &foo_boffo, FH_CREATE | FH_WRITE_ONLY); DECREF(fh); TEST_TRUE(batch, Folder_Exists(folder, &foo), "Dir exists"); TEST_TRUE(batch, Folder_Exists(folder, &boffo), "File exists"); TEST_TRUE(batch, Folder_Exists(folder, &foo_bar), "Nested dir exists"); TEST_TRUE(batch, Folder_Exists(folder, &foo_boffo), "Nested file exists"); TEST_FALSE(batch, Folder_Exists(folder, &banana), "Non-existent entry"); TEST_FALSE(batch, Folder_Exists(folder, &foo_foo), "Non-existent nested entry"); DECREF(folder); }
static void test_Delete_Tree(TestBatch *batch) { Folder *folder = (Folder*)RAMFolder_new(NULL); FileHandle *fh; bool_t result; // Create tree to be deleted. Folder_MkDir(folder, &foo); Folder_MkDir(folder, &foo_bar); Folder_MkDir(folder, &foo_bar_baz); fh = Folder_Open_FileHandle(folder, &foo_bar_baz_boffo, FH_CREATE | FH_WRITE_ONLY); DECREF(fh); // Create bystanders. Folder_MkDir(folder, &bar); fh = Folder_Open_FileHandle(folder, &baz, FH_CREATE | FH_WRITE_ONLY); DECREF(fh); result = Folder_Delete_Tree(folder, &foo); TEST_TRUE(batch, result, "Delete_Tree() succeeded"); TEST_FALSE(batch, Folder_Exists(folder, &foo), "Tree really gone"); TEST_TRUE(batch, Folder_Exists(folder, &bar), "local dir with same name as nested dir left intact"); TEST_TRUE(batch, Folder_Exists(folder, &baz), "local file with same name as nested dir left intact"); // Kill off the bystanders. result = Folder_Delete_Tree(folder, &bar); TEST_TRUE(batch, result, "Delete_Tree() on empty dir"); result = Folder_Delete_Tree(folder, &baz); TEST_TRUE(batch, result, "Delete_Tree() on file"); // Create new tree to be deleted. Folder_MkDir(folder, &foo); Folder_MkDir(folder, &foo_bar); Folder_MkDir(folder, &foo_bar_baz); fh = Folder_Open_FileHandle(folder, &foo_bar_baz_boffo, FH_CREATE | FH_WRITE_ONLY); DECREF(fh); // Remove tree in subdir. result = Folder_Delete_Tree(folder, &foo_bar); TEST_TRUE(batch, result, "Delete_Tree() of subdir succeeded"); TEST_FALSE(batch, Folder_Exists(folder, &foo_bar), "subdir really gone"); TEST_TRUE(batch, Folder_Exists(folder, &foo), "enclosing dir left intact"); DECREF(folder); }
static void test_Open_In(TestBatch *batch) { Folder *folder = (Folder*)RAMFolder_new(NULL); FileHandle *fh; InStream *instream; Folder_MkDir(folder, &foo); Folder_MkDir(folder, &foo_bar); fh = Folder_Open_FileHandle(folder, &boffo, FH_CREATE | FH_WRITE_ONLY); DECREF(fh); fh = Folder_Open_FileHandle(folder, &foo_boffo, FH_CREATE | FH_WRITE_ONLY); DECREF(fh); instream = Folder_Open_In(folder, &boffo); TEST_TRUE(batch, instream && InStream_Is_A(instream, INSTREAM), "Open_In"); DECREF(instream); instream = Folder_Open_In(folder, &foo_boffo); TEST_TRUE(batch, instream && InStream_Is_A(instream, INSTREAM), "Open_In for nested file"); DECREF(instream); Err_set_error(NULL); instream = Folder_Open_In(folder, &foo); TEST_TRUE(batch, instream == NULL, "Open_InStream on existing dir path fails"); TEST_TRUE(batch, Err_get_error() != NULL, "Open_In on existing dir name sets Err_error"); Err_set_error(NULL); instream = Folder_Open_In(folder, &foo_bar_baz_boffo); TEST_TRUE(batch, instream == NULL, "Open_In for entry within non-existent dir fails"); TEST_TRUE(batch, Err_get_error() != NULL, "Open_In for entry within non-existent dir sets Err_error"); DECREF(folder); }
static void test_List(TestBatch *batch) { Folder *folder = (Folder*)RAMFolder_new(NULL); FileHandle *fh; VArray *list; CharBuf *elem; Folder_MkDir(folder, &foo); Folder_MkDir(folder, &foo_bar); Folder_MkDir(folder, &foo_bar_baz); fh = Folder_Open_FileHandle(folder, &boffo, FH_CREATE | FH_WRITE_ONLY); DECREF(fh); fh = Folder_Open_FileHandle(folder, &banana, FH_CREATE | FH_WRITE_ONLY); DECREF(fh); list = Folder_List(folder, NULL); VA_Sort(list, NULL, NULL); TEST_INT_EQ(batch, VA_Get_Size(list), 3, "List"); elem = (CharBuf*)DOWNCAST(VA_Fetch(list, 0), CHARBUF); TEST_TRUE(batch, elem && CB_Equals(elem, (Obj*)&banana), "List first file"); elem = (CharBuf*)DOWNCAST(VA_Fetch(list, 1), CHARBUF); TEST_TRUE(batch, elem && CB_Equals(elem, (Obj*)&boffo), "List second file"); elem = (CharBuf*)DOWNCAST(VA_Fetch(list, 2), CHARBUF); TEST_TRUE(batch, elem && CB_Equals(elem, (Obj*)&foo), "List dir"); DECREF(list); list = Folder_List(folder, &foo_bar); TEST_INT_EQ(batch, VA_Get_Size(list), 1, "List subdirectory contents"); elem = (CharBuf*)DOWNCAST(VA_Fetch(list, 0), CHARBUF); TEST_TRUE(batch, elem && CB_Equals(elem, (Obj*)&baz), "Just the filename"); DECREF(list); DECREF(folder); }
static void test_Delete(TestBatch *batch) { Folder *folder = (Folder*)RAMFolder_new(NULL); FileHandle *fh; bool_t result; Folder_MkDir(folder, &foo); Folder_MkDir(folder, &foo_bar); fh = Folder_Open_FileHandle(folder, &boffo, FH_CREATE | FH_WRITE_ONLY); DECREF(fh); fh = Folder_Open_FileHandle(folder, &foo_boffo, FH_CREATE | FH_WRITE_ONLY); DECREF(fh); Err_set_error(NULL); result = Folder_Delete(folder, &banana); TEST_FALSE(batch, result, "Delete on non-existent entry returns false"); Err_set_error(NULL); result = Folder_Delete(folder, &foo); TEST_FALSE(batch, result, "Delete on non-empty dir returns false"); TEST_TRUE(batch, Folder_Delete(folder, &foo_boffo), "Delete nested file"); TEST_FALSE(batch, Folder_Exists(folder, &foo_boffo), "File is really gone"); TEST_TRUE(batch, Folder_Delete(folder, &foo_bar), "Delete nested dir"); TEST_FALSE(batch, Folder_Exists(folder, &foo_bar), "Dir is really gone"); TEST_TRUE(batch, Folder_Delete(folder, &foo), "Delete empty dir"); TEST_FALSE(batch, Folder_Exists(folder, &foo), "Dir is really gone"); DECREF(folder); }
static void test_spew_and_slurp(TestBatch *batch) { Obj *dump = S_make_dump(); Folder *folder = (Folder*)RAMFolder_new(NULL); CharBuf *foo = (CharBuf*)ZCB_WRAP_STR("foo", 3); bool_t result = Json_spew_json(dump, folder, foo); TEST_TRUE(batch, result, "spew_json returns true on success"); TEST_TRUE(batch, Folder_Exists(folder, foo), "spew_json wrote file"); Obj *got = Json_slurp_json(folder, foo); TEST_TRUE(batch, got && Obj_Equals(dump, got), "Round trip through spew_json and slurp_json"); DECREF(got); Err_set_error(NULL); result = Json_spew_json(dump, folder, foo); TEST_FALSE(batch, result, "Can't spew_json when file exists"); TEST_TRUE(batch, Err_get_error() != NULL, "Failed spew_json sets Err_error"); Err_set_error(NULL); CharBuf *bar = (CharBuf*)ZCB_WRAP_STR("bar", 3); got = Json_slurp_json(folder, bar); TEST_TRUE(batch, got == NULL, "slurp_json returns NULL when file doesn't exist"); TEST_TRUE(batch, Err_get_error() != NULL, "Failed slurp_json sets Err_error"); CharBuf *boffo = (CharBuf*)ZCB_WRAP_STR("boffo", 5); FileHandle *fh = Folder_Open_FileHandle(folder, boffo, FH_CREATE | FH_WRITE_ONLY); FH_Write(fh, "garbage", 7); DECREF(fh); Err_set_error(NULL); got = Json_slurp_json(folder, boffo); TEST_TRUE(batch, got == NULL, "slurp_json returns NULL when file doesn't contain valid JSON"); TEST_TRUE(batch, Err_get_error() != NULL, "Failed slurp_json sets Err_error"); DECREF(got); DECREF(dump); DECREF(folder); }
OutStream* Folder_open_out(Folder *self, const CharBuf *path) { const uint32_t flags = FH_WRITE_ONLY | FH_CREATE | FH_EXCLUSIVE; FileHandle *fh = Folder_Open_FileHandle(self, path, flags); OutStream *outstream = NULL; if (fh) { outstream = OutStream_open((Obj*)fh); DECREF(fh); if (!outstream) { ERR_ADD_FRAME(Err_get_error()); } } else { ERR_ADD_FRAME(Err_get_error()); } return outstream; }
static void test_MkDir_and_Is_Directory(TestBatch *batch) { Folder *folder = (Folder*)RAMFolder_new(NULL); FileHandle *fh; TEST_FALSE(batch, Folder_Is_Directory(folder, &foo), "Is_Directory() false for non-existent entry"); TEST_TRUE(batch, Folder_MkDir(folder, &foo), "MkDir returns true on success"); TEST_TRUE(batch, Folder_Is_Directory(folder, &foo), "Is_Directory() true for local folder"); TEST_FALSE(batch, Folder_Is_Directory(folder, &foo_bar_baz), "Is_Directory() false for non-existent deeply nested dir"); Err_set_error(NULL); TEST_FALSE(batch, Folder_MkDir(folder, &foo_bar_baz), "MkDir for deeply nested dir fails"); TEST_TRUE(batch, Err_get_error() != NULL, "MkDir for deeply nested dir sets Err_error"); TEST_TRUE(batch, Folder_MkDir(folder, &foo_bar), "MkDir for nested dir"); TEST_TRUE(batch, Folder_Is_Directory(folder, &foo_bar), "Is_Directory() true for nested dir"); Err_set_error(NULL); TEST_FALSE(batch, Folder_MkDir(folder, &foo_bar), "Overwrite dir with MkDir fails"); TEST_TRUE(batch, Err_get_error() != NULL, "Overwrite dir with MkDir sets Err_error"); fh = Folder_Open_FileHandle(folder, &foo_boffo, FH_CREATE | FH_WRITE_ONLY); DECREF(fh); Err_set_error(NULL); TEST_FALSE(batch, Folder_MkDir(folder, &foo_boffo), "Overwrite file with MkDir fails"); TEST_TRUE(batch, Err_get_error() != NULL, "Overwrite file with MkDir sets Err_error"); TEST_FALSE(batch, Folder_Is_Directory(folder, &foo_boffo), "Is_Directory() false for nested file"); DECREF(folder); }
static void test_Slurp_File(TestBatch *batch) { Folder *folder = (Folder*)RAMFolder_new(NULL); FileHandle *fh = Folder_Open_FileHandle(folder, &foo, FH_CREATE | FH_WRITE_ONLY); ByteBuf *contents; FH_Write(fh, "stuff", 5); FH_Close(fh); DECREF(fh); contents = Folder_Slurp_File(folder, &foo); TEST_TRUE(batch, BB_Equals_Bytes(contents, "stuff", 5), "Slurp_File"); DECREF(contents); DECREF(folder); }
static void test_Enclosing_Folder_and_Find_Folder(TestBatch *batch) { Folder *folder = (Folder*)RAMFolder_new(NULL); FileHandle *fh; Folder_MkDir(folder, &foo); Folder_MkDir(folder, &foo_bar); Folder_MkDir(folder, &foo_bar_baz); fh = Folder_Open_FileHandle(folder, &foo_bar_baz_boffo, FH_CREATE | FH_WRITE_ONLY); { Folder *encloser = Folder_Enclosing_Folder(folder, (CharBuf*)&nope); Folder *found = Folder_Find_Folder(folder, (CharBuf*)&nope); TEST_TRUE(batch, encloser == folder, "Enclosing_Folder() - non-existent entry yields parent"); TEST_TRUE(batch, found == NULL, "Find_Folder() - non-existent entry yields NULL"); } { Folder *encloser = Folder_Enclosing_Folder(folder, &foo_bar); Folder *found = Folder_Find_Folder(folder, &foo_bar); TEST_TRUE(batch, encloser && Folder_Is_A(encloser, FOLDER) && CB_Ends_With(Folder_Get_Path(encloser), &foo), "Enclosing_Folder() - find one directory down"); TEST_TRUE(batch, found && Folder_Is_A(found, FOLDER) && CB_Ends_With(Folder_Get_Path(found), &bar), "Find_Folder() - 'foo/bar'"); } { Folder *encloser = Folder_Enclosing_Folder(folder, &foo_bar_baz); Folder *found = Folder_Find_Folder(folder, &foo_bar_baz); TEST_TRUE(batch, encloser && Folder_Is_A(encloser, FOLDER) && CB_Ends_With(Folder_Get_Path(encloser), &bar), "Find two directories down"); TEST_TRUE(batch, found && Folder_Is_A(found, FOLDER) && CB_Ends_With(Folder_Get_Path(found), &baz), "Find_Folder() - 'foo/bar/baz'"); } { Folder *encloser = Folder_Enclosing_Folder(folder, &foo_bar_baz_boffo); Folder *found = Folder_Find_Folder(folder, &foo_bar_baz_boffo); TEST_TRUE(batch, encloser && Folder_Is_A(encloser, FOLDER) && CB_Ends_With(Folder_Get_Path(encloser), &baz), "Recurse to find a directory containing a real file"); TEST_TRUE(batch, found == NULL, "Find_Folder() - file instead of folder yields NULL"); } DECREF(fh); DECREF(folder); }