diff --git a/usertests.c b/usertests.c index 740b81d..11464f3 100644 --- a/usertests.c +++ b/usertests.c @@ -138,6 +138,76 @@ writetest1(void) printf(stdout, "big files ok\n"); } +void +writetest2(void) +{ + int fd, fd1, n; + + printf(stdout, "files with holes\n"); + + fd = open("hole", O_CREATE|O_RDWR); + if(fd < 0){ + printf(stdout, "error: creat hole failed!\n"); + exit(); + } + + buf[0] = 1; + if(write(fd, buf, 512) != 512) { + printf(stdout, "error: write hole file failed\n"); + exit(); + } + + // now truncate, while fd is still open + fd1 = open("hole", O_CREATE | O_RDWR); + if(fd < 0){ + printf(stdout, "error: 2nd creat hole failed!\n"); + exit(); + } + close(fd1); + + // now write another block, should be 2nd in file + buf[0] = 2; + if(write(fd, buf, 512) != 512) { + printf(stdout, "error: 2nd write hole file failed\n"); + exit(); + } + + close(fd); + + fd = open("hole", O_RDONLY); + if(fd < 0){ + printf(stdout, "error: open hole failed!\n"); + exit(); + } + + n = read(fd, buf, 512); + if(n != 512){ + printf(stdout, "error: 1st hole read failed\n"); + exit(); + } + if(buf[0] != 0){ + printf(stdout, "error: 1st hole block didn't have zeros\n"); + exit(); + } + + n = read(fd, buf, 512); + if(n != 512){ + printf(stdout, "error: 2nd hole read failed\n"); + exit(); + } + if(buf[0] != 1){ + printf(stdout, "error: 2nd hole block wrong content\n"); + exit(); + } + + close(fd); + if(unlink("hole") < 0) { + printf(stdout, "unlink hole failed\n"); + exit(); + } + printf(stdout, "hole files ok\n"); +} + void createtest(void) { @@ -461,7 +531,7 @@ twofiles(void) printf(1, "twofiles ok\n"); } -// two processes create and delete files in same directory +// two processes create and delete different files in same directory void createdelete(void) { @@ -647,7 +717,7 @@ linktest(void) printf(1, "linktest ok\n"); } -// test concurrent create of the same file +// test concurrent create and unlink of the same file void concreate(void) { @@ -713,7 +783,22 @@ concreate(void) for(i = 0; i < 40; i++){ file[1] = '0' + i; - unlink(file); + pid = fork(); + if(pid < 0){ + printf(1, "fork failed\n"); + exit(); + } + if(((i % 3) == 0 && pid == 0) || + ((i % 3) == 1 && pid != 0)){ + fd = open(file, 0); + close(fd); + } else { + unlink(file); + } + if(pid == 0) + exit(); + else + wait(); } printf(1, "concreate ok\n"); @@ -1095,6 +1180,7 @@ main(int argc, char *argv[]) opentest(); writetest(); writetest1(); + writetest2(); createtest(); mem();