iloveos/test/layer2_API.cpp

76 lines
3.1 KiB
C++

#include <stdio.h>
#include <string.h>
#include <assert.h>
#include "files.h"
int main(int argc, char *argv[]) {
const char* d = (argc < 2) ? "/dev/vdc" : argv[1];
RawDisk *H = new RawDisk(d);
printf("test files\n");
FilesOperation fsop(*H);
fsop.initialize_rootinode();
// create multiple files using mkdir or mknod
// directories that contain more than 64 files use more than one datablocks, it is not supported yet
printf("=== Part 1: create files by path ===\n");
u_int64_t file1 = fsop.fischl_mknod("/test",0); // mode here is not used yet
printf("/test is inode %llu, it is a file\n", file1);
u_int64_t file2 = fsop.fischl_mkdir("/foo",0);
printf("/foo is inode %llu, it is a directory\n", file2);
u_int64_t file3 = fsop.fischl_mkdir("/foo/bar",0);
printf("/foo/bar is inode %llu, it is a directory\n", file3);
u_int64_t file4 = fsop.fischl_mknod("/foo/bar/baz",0);
printf("/foo/bar/baz is inode %llu, it is a file\n", file4);
// the following three testcases will fail
u_int64_t f1 = fsop.fischl_mkdir("foo/bar",0);
u_int64_t f2 = fsop.fischl_mkdir("/doesnt_exist/bar",0);
u_int64_t f3 = fsop.fischl_mkdir("/test/bar",0);
// TODO: guard against creating an existing file or diretory, such as fsop.fischl_mkdir("/test",0)
// write to files (TODO: fischl_write)
// read and write to indirect datablocks are not supported yet
printf("=== Part 2: write to files ===\n");
char buffer[IO_BLOCK_SIZE] = {0};
INode inode;
inode.inode_construct(file1, *H);
buffer[0] = '1';
fsop.write_datablock(inode, 0, buffer);
inode.inode_save(*H);
inode.inode_construct(file4, *H);
buffer[0] = '4';
fsop.write_datablock(inode, 3, buffer);
buffer[0] = '5';
fsop.write_datablock(inode, 101, buffer);
inode.inode_save(*H);
// TODO: guard against overwriting directory datablocks
// retrieve inode-number by path
printf("=== Part 3: retrieve inode number using path (namei) ===\n");
u_int64_t file_test = fsop.namei("/test");
printf("inode number for \"/test\" is %llu\n", file_test);
assert(file_test == file1);
u_int64_t file_baz = fsop.namei("/foo/bar/baz");
printf("inode number for \"/foo/bar/baz\" is %llu\n", file_baz);
assert(file_baz == file4);
u_int64_t file_foo = fsop.namei("/foo/bar/..");
printf("inode number for \"/foo/bar/..\" is %llu\n", file_foo);
assert(file_foo == file2);
u_int64_t file_bar = fsop.namei("/foo/bar/.");
printf("inode number for \"/foo/bar/.\" is %llu\n", file_bar);
assert(file_bar == file3);
// read files (TODO: fischl_read)
printf("=== Part 4: read from files ===\n");
char read_buffer[IO_BLOCK_SIZE] = {0};
INode inode_read;
inode_read.inode_construct(file_test, *H);
fsop.read_datablock(inode_read, 0, read_buffer);
assert(read_buffer[0] == '1');
inode_read.inode_construct(file_baz, *H);
fsop.read_datablock(inode_read, 3, read_buffer);
assert(read_buffer[0] == '4');
fsop.read_datablock(inode_read, 101, read_buffer);
assert(read_buffer[0] == '5');
}