static void test_Write_File_and_Read_File(TestBatch *batch) { RAMFolder *folder = RAMFolder_new(NULL); Segment *segment = Seg_new(100); Segment *got = Seg_new(100); CharBuf *meta; CharBuf *flotsam = (CharBuf*)ZCB_WRAP_STR("flotsam", 7); CharBuf *jetsam = (CharBuf*)ZCB_WRAP_STR("jetsam", 6); Seg_Set_Count(segment, 111); Seg_Store_Metadata_Str(segment, "foo", 3, (Obj*)CB_newf("bar")); Seg_Add_Field(segment, flotsam); Seg_Add_Field(segment, jetsam); RAMFolder_MkDir(folder, Seg_Get_Name(segment)); Seg_Write_File(segment, (Folder*)folder); Seg_Read_File(got, (Folder*)folder); TEST_TRUE(batch, Seg_Get_Count(got) == Seg_Get_Count(segment), "Round-trip count through file"); TEST_TRUE(batch, Seg_Field_Num(got, jetsam) == Seg_Field_Num(segment, jetsam), "Round trip field names through file"); meta = (CharBuf*)Seg_Fetch_Metadata_Str(got, "foo", 3); TEST_TRUE(batch, meta && CB_Is_A(meta, CHARBUF) && CB_Equals_Str(meta, "bar", 3), "Round trip metadata through file"); DECREF(got); DECREF(segment); DECREF(folder); }
static void test_Write_File_and_Read_File(TestBatchRunner *runner) { RAMFolder *folder = RAMFolder_new(NULL); Segment *segment = Seg_new(100); Segment *got = Seg_new(100); String *meta; String *flotsam = (String*)SSTR_WRAP_UTF8("flotsam", 7); String *jetsam = (String*)SSTR_WRAP_UTF8("jetsam", 6); Seg_Set_Count(segment, 111); Seg_Store_Metadata_Utf8(segment, "foo", 3, (Obj*)Str_newf("bar")); Seg_Add_Field(segment, flotsam); Seg_Add_Field(segment, jetsam); RAMFolder_MkDir(folder, Seg_Get_Name(segment)); Seg_Write_File(segment, (Folder*)folder); Seg_Read_File(got, (Folder*)folder); TEST_TRUE(runner, Seg_Get_Count(got) == Seg_Get_Count(segment), "Round-trip count through file"); TEST_TRUE(runner, Seg_Field_Num(got, jetsam) == Seg_Field_Num(segment, jetsam), "Round trip field names through file"); meta = (String*)Seg_Fetch_Metadata_Utf8(got, "foo", 3); TEST_TRUE(runner, meta && Str_Is_A(meta, STRING) && Str_Equals_Utf8(meta, "bar", 3), "Round trip metadata through file"); DECREF(got); DECREF(segment); DECREF(folder); }
static void test_Local_Find_Folder(TestBatchRunner *runner) { RAMFolder *folder = RAMFolder_new(NULL); RAMFolder *local; FileHandle *fh; RAMFolder_MkDir(folder, foo); RAMFolder_MkDir(folder, foo_bar); fh = RAMFolder_Open_FileHandle(folder, boffo, FH_CREATE | FH_WRITE_ONLY); DECREF(fh); fh = RAMFolder_Open_FileHandle(folder, foo_boffo, FH_CREATE | FH_WRITE_ONLY); DECREF(fh); local = (RAMFolder*)RAMFolder_Local_Find_Folder(folder, nope); TEST_TRUE(runner, local == NULL, "Non-existent entry yields NULL"); ZombieCharBuf *empty = ZCB_BLANK(); local = (RAMFolder*)RAMFolder_Local_Find_Folder(folder, (CharBuf*)empty); TEST_TRUE(runner, local == NULL, "Empty string yields NULL"); local = (RAMFolder*)RAMFolder_Local_Find_Folder(folder, foo_bar); TEST_TRUE(runner, local == NULL, "nested folder yields NULL"); local = (RAMFolder*)RAMFolder_Local_Find_Folder(folder, foo_boffo); TEST_TRUE(runner, local == NULL, "nested file yields NULL"); local = (RAMFolder*)RAMFolder_Local_Find_Folder(folder, boffo); TEST_TRUE(runner, local == NULL, "local file yields NULL"); local = (RAMFolder*)RAMFolder_Local_Find_Folder(folder, bar); TEST_TRUE(runner, local == NULL, "name of nested folder yields NULL"); local = (RAMFolder*)RAMFolder_Local_Find_Folder(folder, foo); TEST_TRUE(runner, local && RAMFolder_Is_A(local, RAMFOLDER) && CB_Equals_Str(RAMFolder_Get_Path(local), "foo", 3), "Find local directory"); DECREF(folder); }
static void test_all(TestBatchRunner *runner) { RAMFolder *folder = RAMFolder_new(NULL); String *foo = SSTR_WRAP_C("foo"); String *boffo = SSTR_WRAP_C("boffo"); String *foo_boffo = SSTR_WRAP_C("foo/boffo"); bool saw_foo = false; bool saw_boffo = false; bool foo_was_dir = false; bool boffo_was_dir = false; int count = 0; // Set up folder contents. RAMFolder_MkDir(folder, foo); FileHandle *fh = RAMFolder_Open_FileHandle(folder, boffo, FH_CREATE | FH_WRITE_ONLY); DECREF(fh); fh = RAMFolder_Open_FileHandle(folder, foo_boffo, FH_CREATE | FH_WRITE_ONLY); DECREF(fh); RAMDirHandle *dh = RAMDH_new(folder); while (RAMDH_Next(dh)) { count++; String *entry = RAMDH_Get_Entry(dh); if (Str_Equals(entry, (Obj*)foo)) { saw_foo = true; foo_was_dir = RAMDH_Entry_Is_Dir(dh); } else if (Str_Equals(entry, (Obj*)boffo)) { saw_boffo = true; boffo_was_dir = RAMDH_Entry_Is_Dir(dh); } DECREF(entry); } TEST_INT_EQ(runner, 2, count, "correct number of entries"); TEST_TRUE(runner, saw_foo, "Directory was iterated over"); TEST_TRUE(runner, foo_was_dir, "Dir correctly identified by Entry_Is_Dir"); TEST_TRUE(runner, saw_boffo, "File was iterated over"); TEST_FALSE(runner, boffo_was_dir, "File correctly identified by Entry_Is_Dir"); uint32_t refcount = REFCOUNT_NN(folder); RAMDH_Close(dh); TEST_INT_EQ(runner, REFCOUNT_NN(folder), refcount - 1, "Folder reference released by Close()"); DECREF(dh); DECREF(folder); }
static void test_Hard_Link(TestBatchRunner *runner) { RAMFolder *folder = RAMFolder_new(NULL); FileHandle *fh; bool result; RAMFolder_MkDir(folder, foo); RAMFolder_MkDir(folder, foo_bar); fh = RAMFolder_Open_FileHandle(folder, boffo, FH_CREATE | FH_WRITE_ONLY); DECREF(fh); // Link files. result = RAMFolder_Hard_Link(folder, boffo, banana); TEST_TRUE(runner, result, "Hard_Link succeeds and returns true"); TEST_TRUE(runner, RAMFolder_Exists(folder, banana), "File exists at new path"); TEST_TRUE(runner, RAMFolder_Exists(folder, boffo), "File still exists at old path"); RAMFolder_Delete(folder, boffo); result = RAMFolder_Hard_Link(folder, banana, foo_bar_boffo); TEST_TRUE(runner, result, "Hard_Link to target within nested dir"); TEST_TRUE(runner, RAMFolder_Exists(folder, foo_bar_boffo), "File exists at new path"); TEST_TRUE(runner, RAMFolder_Exists(folder, banana), "File still exists at old path"); RAMFolder_Delete(folder, banana); result = RAMFolder_Hard_Link(folder, foo_bar_boffo, foo_boffo); TEST_TRUE(runner, result, "Hard_Link from file in nested dir"); TEST_TRUE(runner, RAMFolder_Exists(folder, foo_boffo), "File exists at new path"); TEST_TRUE(runner, RAMFolder_Exists(folder, foo_bar_boffo), "File still exists at old path"); RAMFolder_Delete(folder, foo_bar_boffo); // Invalid clobbers. fh = RAMFolder_Open_FileHandle(folder, boffo, FH_CREATE | FH_WRITE_ONLY); DECREF(fh); result = RAMFolder_Hard_Link(folder, foo_boffo, boffo); TEST_FALSE(runner, result, "Clobber of file fails"); TEST_TRUE(runner, RAMFolder_Exists(folder, boffo), "File still exists at new path"); TEST_TRUE(runner, RAMFolder_Exists(folder, foo_boffo), "File still exists at old path"); RAMFolder_Delete(folder, boffo); RAMFolder_MkDir(folder, baz); result = RAMFolder_Hard_Link(folder, foo_boffo, baz); TEST_FALSE(runner, result, "Clobber of dir fails"); TEST_TRUE(runner, RAMFolder_Exists(folder, baz), "Dir still exists at new path"); TEST_TRUE(runner, RAMFolder_Exists(folder, foo_boffo), "File still exists at old path"); RAMFolder_Delete(folder, baz); // Invalid Hard_Link of dir. RAMFolder_MkDir(folder, baz); result = RAMFolder_Hard_Link(folder, baz, banana); TEST_FALSE(runner, result, "Hard_Link dir fails"); TEST_FALSE(runner, RAMFolder_Exists(folder, banana), "Nothing at new path"); TEST_TRUE(runner, RAMFolder_Exists(folder, baz), "Folder still exists at old path"); RAMFolder_Delete(folder, baz); // Test that linking to yourself fails. result = RAMFolder_Hard_Link(folder, foo_boffo, foo_boffo); TEST_FALSE(runner, result, "Hard_Link file to itself fails"); TEST_TRUE(runner, RAMFolder_Exists(folder, foo_boffo), "File still exists"); // Invalid filepaths. Err_set_error(NULL); result = RAMFolder_Rename(folder, foo_boffo, nope_nyet); TEST_FALSE(runner, result, "Hard_Link into non-existent subdir fails"); TEST_TRUE(runner, Err_get_error() != NULL, "Hard_Link into non-existent subdir sets Err_error"); TEST_TRUE(runner, RAMFolder_Exists(folder, foo_boffo), "Entry still exists at old path"); Err_set_error(NULL); result = RAMFolder_Rename(folder, nope_nyet, boffo); TEST_FALSE(runner, result, "Hard_Link non-existent source file fails"); TEST_TRUE(runner, Err_get_error() != NULL, "Hard_Link non-existent source file sets Err_error"); DECREF(folder); }
static void test_Rename(TestBatchRunner *runner) { RAMFolder *folder = RAMFolder_new(NULL); FileHandle *fh; bool result; RAMFolder_MkDir(folder, foo); RAMFolder_MkDir(folder, foo_bar); fh = RAMFolder_Open_FileHandle(folder, boffo, FH_CREATE | FH_WRITE_ONLY); DECREF(fh); // Move files. result = RAMFolder_Rename(folder, boffo, banana); TEST_TRUE(runner, result, "Rename succeeds and returns true"); TEST_TRUE(runner, RAMFolder_Exists(folder, banana), "File exists at new path"); TEST_FALSE(runner, RAMFolder_Exists(folder, boffo), "File no longer exists at old path"); result = RAMFolder_Rename(folder, banana, foo_bar_boffo); TEST_TRUE(runner, result, "Rename to file in nested dir"); TEST_TRUE(runner, RAMFolder_Exists(folder, foo_bar_boffo), "File exists at new path"); TEST_FALSE(runner, RAMFolder_Exists(folder, banana), "File no longer exists at old path"); result = RAMFolder_Rename(folder, foo_bar_boffo, boffo); TEST_TRUE(runner, result, "Rename from file in nested dir"); TEST_TRUE(runner, RAMFolder_Exists(folder, boffo), "File exists at new path"); TEST_FALSE(runner, RAMFolder_Exists(folder, foo_bar_boffo), "File no longer exists at old path"); fh = RAMFolder_Open_FileHandle(folder, foo_boffo, FH_CREATE | FH_WRITE_ONLY); DECREF(fh); result = RAMFolder_Rename(folder, boffo, foo_boffo); TEST_TRUE(runner, result, "Clobber"); TEST_TRUE(runner, RAMFolder_Exists(folder, foo_boffo), "File exists at new path"); TEST_FALSE(runner, RAMFolder_Exists(folder, boffo), "File no longer exists at old path"); // Move Dirs. RAMFolder_MkDir(folder, baz); result = RAMFolder_Rename(folder, baz, boffo); TEST_TRUE(runner, result, "Rename dir"); TEST_TRUE(runner, RAMFolder_Exists(folder, boffo), "Folder exists at new path"); TEST_FALSE(runner, RAMFolder_Exists(folder, baz), "Folder no longer exists at old path"); result = RAMFolder_Rename(folder, boffo, foo_foo); TEST_TRUE(runner, result, "Rename dir into nested subdir"); TEST_TRUE(runner, RAMFolder_Exists(folder, foo_foo), "Folder exists at new path"); TEST_FALSE(runner, RAMFolder_Exists(folder, boffo), "Folder no longer exists at old path"); result = RAMFolder_Rename(folder, foo_foo, foo_bar_baz); TEST_TRUE(runner, result, "Rename dir from nested subdir"); TEST_TRUE(runner, RAMFolder_Exists(folder, foo_bar_baz), "Folder exists at new path"); TEST_FALSE(runner, RAMFolder_Exists(folder, foo_foo), "Folder no longer exists at old path"); // Test failed clobbers. Err_set_error(NULL); result = RAMFolder_Rename(folder, foo_boffo, foo_bar); TEST_FALSE(runner, result, "Rename file clobbering dir fails"); TEST_TRUE(runner, Err_get_error() != NULL, "Failed rename sets Err_error"); TEST_TRUE(runner, RAMFolder_Exists(folder, foo_boffo), "File still exists at old path"); TEST_TRUE(runner, RAMFolder_Exists(folder, foo_bar), "Dir still exists after failed clobber"); Err_set_error(NULL); result = RAMFolder_Rename(folder, foo_bar, foo_boffo); TEST_FALSE(runner, result, "Rename dir clobbering file fails"); TEST_TRUE(runner, Err_get_error() != NULL, "Failed rename sets Err_error"); TEST_TRUE(runner, RAMFolder_Exists(folder, foo_bar), "Dir still exists at old path"); TEST_TRUE(runner, RAMFolder_Exists(folder, foo_boffo), "File still exists after failed clobber"); // Test that "renaming" succeeds where to and from are the same. result = RAMFolder_Rename(folder, foo_boffo, foo_boffo); TEST_TRUE(runner, result, "Renaming file to itself succeeds"); TEST_TRUE(runner, RAMFolder_Exists(folder, foo_boffo), "File still exists"); result = RAMFolder_Rename(folder, foo_bar, foo_bar); TEST_TRUE(runner, result, "Renaming dir to itself succeeds"); TEST_TRUE(runner, RAMFolder_Exists(folder, foo_bar), "Dir still exists"); // Invalid filepaths. Err_set_error(NULL); result = RAMFolder_Rename(folder, foo_boffo, nope_nyet); TEST_FALSE(runner, result, "Rename into non-existent subdir fails"); TEST_TRUE(runner, Err_get_error() != NULL, "Renaming into non-existent subdir sets Err_error"); TEST_TRUE(runner, RAMFolder_Exists(folder, foo_boffo), "Entry still exists at old path"); Err_set_error(NULL); result = RAMFolder_Rename(folder, nope_nyet, boffo); TEST_FALSE(runner, result, "Rename non-existent file fails"); TEST_TRUE(runner, Err_get_error() != NULL, "Renaming non-existent source file sets Err_error"); DECREF(folder); }