add unlink test

This commit is contained in:
Ziao 2023-11-28 16:19:56 -08:00
parent e69527a10b
commit a5dda54e12
2 changed files with 39 additions and 39 deletions

View File

@ -60,17 +60,18 @@ void FilesOperation::initialize_rootinode() {
}
void FilesOperation::printDirectory(u_int64_t inode_number) {
// limit to first datablock
INode_Data inode;
inode.inode_num = inode_number;
fs->inode_manager->load_inode(&inode);
char buffer[IO_BLOCK_SIZE] = {0};
fs->read(&inode, buffer, IO_BLOCK_SIZE, 0);
for (u_int64_t idx=0; idx<inode.metadata.size/IO_BLOCK_SIZE; idx++) {
fs->read(&inode, buffer, IO_BLOCK_SIZE, idx*IO_BLOCK_SIZE);
DirectoryEntry ent;
for(int i=0;i<=IO_BLOCK_SIZE-264;i+=264){
ent.deserialize(buffer+i);
if (ent.inode_number) printf("%s\t%llu;\t", ent.file_name, ent.inode_number);
}
}
printf("\n");
}
@ -298,6 +299,7 @@ void FilesOperation::unlink_inode(u_int64_t inode_number) {
}
// TODO: This is probably incorrect
while(inode.metadata.size != 0) {
printf("dealloc, %d\n", inode.metadata.size);
u_int64_t dummy;
fs->deallocate_datablock(&inode, &dummy);
inode.metadata.size-=IO_BLOCK_SIZE;

View File

@ -30,6 +30,7 @@ dir_test* mock_root = nullptr;
RawDisk *H; // Use FakeRawDisk here if memory sanitizer complains
Fs *fs;
FilesOperation *fsop;
std::string prefix = "/pressure/No_";
int total_dir_num = 0;
int total_file_num = 0;
@ -62,7 +63,6 @@ TEST(FileOperationTest, MkdirnodTest) {
TEST(FileOperationTest, WriteTest) {
// write to files (TODO: fischl_write)
// read and write to indirect datablocks are not supported yet
//get inode info from disk
char buffer[IO_BLOCK_SIZE] = {0};
INode_Data inode;
@ -166,45 +166,43 @@ TEST(FileOperationTest, PressureTest) {
EXPECT_EQ(fsop->fischl_mkdir("/pressure", mode), 0);
fsop->printDirectory(1);
u_int64_t inode_numbers[700];
std::string prefix = "/pressure/No_";
for(int i=0;i<700;i++){
for(int i=0;i<100;i++){
EXPECT_EQ(fsop->fischl_mkdir((prefix+std::to_string(i)).c_str(), mode), 0);
}
fsop->printDirectory(6);
for(int i=0;i<700;i++){
for(int i=0;i<100;i++){
EXPECT_EQ(fsop->namei((prefix+std::to_string(i)).c_str()),fsop->disk_namei((prefix+std::to_string(i)).c_str()));
}
}
// TEST(FileOperationTest, UnlinkTest) {
// printf("=== Part 6: unlink test ===\n");
// fsop.printDirectory(file_pressure);
// for(int i=0;i<700;i+=2){
// assert(!fsop.fischl_unlink((prefix+std::to_string(i)).c_str()));
// }
// for(int i=0;i<4;i+=2){
// assert(fsop.namei((prefix+std::to_string(i)).c_str())==(u_int64_t)(-1));
// }
// for(int i=1;i<700;i+=2){
// u_int64_t inode_number = fsop.namei((prefix+std::to_string(i)).c_str());
// assert(inode_number == inode_numbers[i]);
// }
// fsop.printDirectory(file_pressure);
// std::string newprefix = "/pressure/New";
// for(int i=0;i<700;i+=2){
// inode_numbers[i] = fsop.fischl_mkdir((newprefix+std::to_string(i)).c_str(), 0);
// }
// for(int i=0;i<700;i+=2){
// u_int64_t inode_number = fsop.namei((newprefix+std::to_string(i)).c_str());
// assert(inode_number == inode_numbers[i]);
// }
// fsop.printDirectory(file_pressure);
// // long filename test
// std::string longfilename = std::string(255,'A');
// u_int64_t filelong = fsop.fischl_mknod((std::string("/")+longfilename).c_str(),0);
// printf("/AAA...AAA is inode %llu, it is a file\n", filelong);
// }
TEST(FileOperationTest, UnlinkTest) {
ssize_t file_pressure = fsop->namei("/pressure");
fsop->printDirectory(file_pressure);
for(int i=0;i<100;i+=2){
EXPECT_EQ(fsop->fischl_unlink((prefix+std::to_string(i)).c_str()), 0);
}
for(int i=0;i<4;i+=2){
EXPECT_EQ(fsop->namei((prefix+std::to_string(i)).c_str()), (u_int64_t)(-1));
}
printf("Finished Deallocating\n");
fsop->printDirectory(file_pressure);
std::string newprefix = "/pressure/New";
for(int i=0;i<100;i+=2){
EXPECT_EQ(fsop->fischl_mkdir((newprefix+std::to_string(i)).c_str(), 0), 0);
}
for(int i=0;i<100;i+=2){
u_int64_t inode_number = fsop->namei((newprefix+std::to_string(i)).c_str());
assert(inode_number>0);
}
printf("Finished Reallocating\n");
fsop->printDirectory(file_pressure);
// long filename test
std::string longfilename = std::string(255,'A');
EXPECT_EQ(fsop->fischl_mknod((std::string("/")+longfilename).c_str(),0,0),0);
u_int64_t filelong = fsop->namei((std::string("/")+longfilename).c_str());
printf("/AAA...AAA is inode %llu, it is a file\n", filelong);
}
int main(int argc, char **argv) {