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,16 +60,17 @@ void FilesOperation::initialize_rootinode() {
} }
void FilesOperation::printDirectory(u_int64_t inode_number) { void FilesOperation::printDirectory(u_int64_t inode_number) {
// limit to first datablock
INode_Data inode; INode_Data inode;
inode.inode_num = inode_number; inode.inode_num = inode_number;
fs->inode_manager->load_inode(&inode); fs->inode_manager->load_inode(&inode);
char buffer[IO_BLOCK_SIZE] = {0}; 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++) {
DirectoryEntry ent; fs->read(&inode, buffer, IO_BLOCK_SIZE, idx*IO_BLOCK_SIZE);
for(int i=0;i<=IO_BLOCK_SIZE-264;i+=264){ DirectoryEntry ent;
ent.deserialize(buffer+i); for(int i=0;i<=IO_BLOCK_SIZE-264;i+=264){
if (ent.inode_number) printf("%s\t%llu;\t", ent.file_name, ent.inode_number); ent.deserialize(buffer+i);
if (ent.inode_number) printf("%s\t%llu;\t", ent.file_name, ent.inode_number);
}
} }
printf("\n"); printf("\n");
} }
@ -298,6 +299,7 @@ void FilesOperation::unlink_inode(u_int64_t inode_number) {
} }
// TODO: This is probably incorrect // TODO: This is probably incorrect
while(inode.metadata.size != 0) { while(inode.metadata.size != 0) {
printf("dealloc, %d\n", inode.metadata.size);
u_int64_t dummy; u_int64_t dummy;
fs->deallocate_datablock(&inode, &dummy); fs->deallocate_datablock(&inode, &dummy);
inode.metadata.size-=IO_BLOCK_SIZE; 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 RawDisk *H; // Use FakeRawDisk here if memory sanitizer complains
Fs *fs; Fs *fs;
FilesOperation *fsop; FilesOperation *fsop;
std::string prefix = "/pressure/No_";
int total_dir_num = 0; int total_dir_num = 0;
int total_file_num = 0; int total_file_num = 0;
@ -62,7 +63,6 @@ TEST(FileOperationTest, MkdirnodTest) {
TEST(FileOperationTest, WriteTest) { TEST(FileOperationTest, WriteTest) {
// write to files (TODO: fischl_write) // write to files (TODO: fischl_write)
// read and write to indirect datablocks are not supported yet
//get inode info from disk //get inode info from disk
char buffer[IO_BLOCK_SIZE] = {0}; char buffer[IO_BLOCK_SIZE] = {0};
INode_Data inode; INode_Data inode;
@ -166,45 +166,43 @@ TEST(FileOperationTest, PressureTest) {
EXPECT_EQ(fsop->fischl_mkdir("/pressure", mode), 0); EXPECT_EQ(fsop->fischl_mkdir("/pressure", mode), 0);
fsop->printDirectory(1); fsop->printDirectory(1);
u_int64_t inode_numbers[700]; for(int i=0;i<100;i++){
std::string prefix = "/pressure/No_";
for(int i=0;i<700;i++){
EXPECT_EQ(fsop->fischl_mkdir((prefix+std::to_string(i)).c_str(), mode), 0); EXPECT_EQ(fsop->fischl_mkdir((prefix+std::to_string(i)).c_str(), mode), 0);
} }
fsop->printDirectory(6); 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())); 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 TEST(FileOperationTest, UnlinkTest) {
// std::string longfilename = std::string(255,'A'); ssize_t file_pressure = fsop->namei("/pressure");
// u_int64_t filelong = fsop.fischl_mknod((std::string("/")+longfilename).c_str(),0); fsop->printDirectory(file_pressure);
// printf("/AAA...AAA is inode %llu, it is a file\n", filelong); 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) { int main(int argc, char **argv) {