📄 usertests.c
字号:
unlink("lf2"); if(link("lf2", "lf1") >= 0){ printf(1, "link non-existant succeeded! oops\n"); exit(); } if(link(".", "lf1") >= 0){ printf(1, "link . lf1 succeeded! oops\n"); exit(); } printf(1, "linktest ok\n");}// test concurrent create and unlink of the same filevoidconcreate(void){ char file[3]; int i, pid, n, fd; char fa[40]; struct { ushort inum; char name[14]; } de; printf(1, "concreate test\n"); file[0] = 'C'; file[2] = '\0'; for(i = 0; i < 40; i++){ file[1] = '0' + i; unlink(file); pid = fork(); if(pid && (i % 3) == 1){ link("C0", file); } else if(pid == 0 && (i % 5) == 1){ link("C0", file); } else { fd = open(file, O_CREATE | O_RDWR); if(fd < 0){ printf(1, "concreate create %s failed\n", file); exit(); } close(fd); } if(pid == 0) exit(); else wait(); } memset(fa, 0, sizeof(fa)); fd = open(".", 0); n = 0; while(read(fd, &de, sizeof(de)) > 0){ if(de.inum == 0) continue; if(de.name[0] == 'C' && de.name[2] == '\0'){ i = de.name[1] - '0'; if(i < 0 || i >= sizeof(fa)){ printf(1, "concreate weird file %s\n", de.name); exit(); } if(fa[i]){ printf(1, "concreate duplicate file %s\n", de.name); exit(); } fa[i] = 1; n++; } } close(fd); if(n != 40){ printf(1, "concreate not enough files in directory listing\n"); exit(); } for(i = 0; i < 40; i++){ file[1] = '0' + i; 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");}// directory that uses indirect blocksvoidbigdir(void){ int i, fd; char name[10]; printf(1, "bigdir test\n"); unlink("bd"); fd = open("bd", O_CREATE); if(fd < 0){ printf(1, "bigdir create failed\n"); exit(); } close(fd); for(i = 0; i < 500; i++){ name[0] = 'x'; name[1] = '0' + (i / 64); name[2] = '0' + (i % 64); name[3] = '\0'; if(link("bd", name) != 0){ printf(1, "bigdir link failed\n"); exit(); } } unlink("bd"); for(i = 0; i < 500; i++){ name[0] = 'x'; name[1] = '0' + (i / 64); name[2] = '0' + (i % 64); name[3] = '\0'; if(unlink(name) != 0){ printf(1, "bigdir unlink failed"); exit(); } } printf(1, "bigdir ok\n");}voidsubdir(void){ int fd, cc; printf(1, "subdir test\n"); unlink("ff"); if(mkdir("dd") != 0){ printf(1, "subdir mkdir dd failed\n"); exit(); } fd = open("dd/ff", O_CREATE | O_RDWR); if(fd < 0){ printf(1, "create dd/ff failed\n"); exit(); } write(fd, "ff", 2); close(fd); if(unlink("dd") >= 0){ printf(1, "unlink dd (non-empty dir) succeeded!\n"); exit(); } if(mkdir("/dd/dd") != 0){ printf(1, "subdir mkdir dd/dd failed\n"); exit(); } fd = open("dd/dd/ff", O_CREATE | O_RDWR); if(fd < 0){ printf(1, "create dd/dd/ff failed\n"); exit(); } write(fd, "FF", 2); close(fd); fd = open("dd/dd/../ff", 0); if(fd < 0){ printf(1, "open dd/dd/../ff failed\n"); exit(); } cc = read(fd, buf, sizeof(buf)); if(cc != 2 || buf[0] != 'f'){ printf(1, "dd/dd/../ff wrong content\n"); exit(); } close(fd); if(link("dd/dd/ff", "dd/dd/ffff") != 0){ printf(1, "link dd/dd/ff dd/dd/ffff failed\n"); exit(); } if(unlink("dd/dd/ff") != 0){ printf(1, "unlink dd/dd/ff failed\n"); exit(); } if(open("dd/dd/ff", O_RDONLY) >= 0){ printf(1, "open (unlinked) dd/dd/ff succeeded\n"); exit(); } if(chdir("dd") != 0){ printf(1, "chdir dd failed\n"); exit(); } if(chdir("dd/../../dd") != 0){ printf(1, "chdir dd/../../dd failed\n"); exit(); } if(chdir("dd/../../../dd") != 0){ printf(1, "chdir dd/../../dd failed\n"); exit(); } if(chdir("./..") != 0){ printf(1, "chdir ./.. failed\n"); exit(); } fd = open("dd/dd/ffff", 0); if(fd < 0){ printf(1, "open dd/dd/ffff failed\n"); exit(); } if(read(fd, buf, sizeof(buf)) != 2){ printf(1, "read dd/dd/ffff wrong len\n"); exit(); } close(fd); if(open("dd/dd/ff", O_RDONLY) >= 0){ printf(1, "open (unlinked) dd/dd/ff succeeded!\n"); exit(); } if(open("dd/ff/ff", O_CREATE|O_RDWR) >= 0){ printf(1, "create dd/ff/ff succeeded!\n"); exit(); } if(open("dd/xx/ff", O_CREATE|O_RDWR) >= 0){ printf(1, "create dd/xx/ff succeeded!\n"); exit(); } if(open("dd", O_CREATE) >= 0){ printf(1, "create dd succeeded!\n"); exit(); } if(open("dd", O_RDWR) >= 0){ printf(1, "open dd rdwr succeeded!\n"); exit(); } if(open("dd", O_WRONLY) >= 0){ printf(1, "open dd wronly succeeded!\n"); exit(); } if(link("dd/ff/ff", "dd/dd/xx") == 0){ printf(1, "link dd/ff/ff dd/dd/xx succeeded!\n"); exit(); } if(link("dd/xx/ff", "dd/dd/xx") == 0){ printf(1, "link dd/xx/ff dd/dd/xx succeeded!\n"); exit(); } if(link("dd/ff", "dd/dd/ffff") == 0){ printf(1, "link dd/ff dd/dd/ffff succeeded!\n"); exit(); } if(mkdir("dd/ff/ff") == 0){ printf(1, "mkdir dd/ff/ff succeeded!\n"); exit(); } if(mkdir("dd/xx/ff") == 0){ printf(1, "mkdir dd/xx/ff succeeded!\n"); exit(); } if(mkdir("dd/dd/ffff") == 0){ printf(1, "mkdir dd/dd/ffff succeeded!\n"); exit(); } if(unlink("dd/xx/ff") == 0){ printf(1, "unlink dd/xx/ff succeeded!\n"); exit(); } if(unlink("dd/ff/ff") == 0){ printf(1, "unlink dd/ff/ff succeeded!\n"); exit(); } if(chdir("dd/ff") == 0){ printf(1, "chdir dd/ff succeeded!\n"); exit(); } if(chdir("dd/xx") == 0){ printf(1, "chdir dd/xx succeeded!\n"); exit(); } if(unlink("dd/dd/ffff") != 0){ printf(1, "unlink dd/dd/ff failed\n"); exit(); } if(unlink("dd/ff") != 0){ printf(1, "unlink dd/ff failed\n"); exit(); } if(unlink("dd") == 0){ printf(1, "unlink non-empty dd succeeded!\n"); exit(); } if(unlink("dd/dd") < 0){ printf(1, "unlink dd/dd failed\n"); exit(); } if(unlink("dd") < 0){ printf(1, "unlink dd failed\n"); exit(); } printf(1, "subdir ok\n");}voidbigfile(void){ int fd, i, total, cc; printf(1, "bigfile test\n"); unlink("bigfile"); fd = open("bigfile", O_CREATE | O_RDWR); if(fd < 0){ printf(1, "cannot create bigfile"); exit(); } for(i = 0; i < 20; i++){ memset(buf, i, 600); if(write(fd, buf, 600) != 600){ printf(1, "write bigfile failed\n"); exit(); } } close(fd); fd = open("bigfile", 0); if(fd < 0){ printf(1, "cannot open bigfile\n"); exit(); } total = 0; for(i = 0; ; i++){ cc = read(fd, buf, 300); if(cc < 0){ printf(1, "read bigfile failed\n"); exit(); } if(cc == 0) break; if(cc != 300){ printf(1, "short read bigfile\n"); exit(); } if(buf[0] != i/2 || buf[299] != i/2){ printf(1, "read bigfile wrong data\n"); exit(); } total += cc; } close(fd); if(total != 20*600){ printf(1, "read bigfile wrong total\n"); exit(); } unlink("bigfile"); printf(1, "bigfile test ok\n");}voidfourteen(void){ int fd; // DIRSIZ is 14. printf(1, "fourteen test\n"); if(mkdir("12345678901234") != 0){ printf(1, "mkdir 12345678901234 failed\n"); exit(); } if(mkdir("12345678901234/123456789012345") != 0){ printf(1, "mkdir 12345678901234/123456789012345 failed\n"); exit(); } fd = open("123456789012345/123456789012345/123456789012345", O_CREATE); if(fd < 0){ printf(1, "create 123456789012345/123456789012345/123456789012345 failed\n"); exit(); } close(fd); fd = open("12345678901234/12345678901234/12345678901234", 0); if(fd < 0){ printf(1, "open 12345678901234/12345678901234/12345678901234 failed\n"); exit(); } close(fd); if(mkdir("12345678901234/12345678901234") == 0){ printf(1, "mkdir 12345678901234/12345678901234 succeeded!\n"); exit(); } if(mkdir("123456789012345/12345678901234") == 0){ printf(1, "mkdir 12345678901234/123456789012345 succeeded!\n"); exit(); } printf(1, "fourteen ok\n");}voidrmdot(void){ printf(1, "rmdot test\n"); if(mkdir("dots") != 0){ printf(1, "mkdir dots failed\n"); exit(); } if(chdir("dots") != 0){ printf(1, "chdir dots failed\n"); exit(); } if(unlink(".") == 0){ printf(1, "rm . worked!\n"); exit(); } if(unlink("..") == 0){ printf(1, "rm .. worked!\n"); exit(); } if(chdir("/") != 0){ printf(1, "chdir / failed\n"); exit(); } if(unlink("dots/.") == 0){ printf(1, "unlink dots/. worked!\n"); exit(); } if(unlink("dots/..") == 0){ printf(1, "unlink dots/.. worked!\n"); exit(); } if(unlink("dots") != 0){ printf(1, "unlink dots failed!\n"); exit(); } printf(1, "rmdot ok\n");}voiddirfile(void){ int fd; printf(1, "dir vs file\n"); fd = open("dirfile", O_CREATE); if(fd < 0){ printf(1, "create dirfile failed\n"); exit(); } close(fd); if(chdir("dirfile") == 0){ printf(1, "chdir dirfile succeeded!\n"); exit(); } fd = open("dirfile/xx", 0); if(fd >= 0){ printf(1, "create dirfile/xx succeeded!\n"); exit(); } fd = open("dirfile/xx", O_CREATE); if(fd >= 0){ printf(1, "create dirfile/xx succeeded!\n"); exit(); } if(mkdir("dirfile/xx") == 0){ printf(1, "mkdir dirfile/xx succeeded!\n"); exit(); } if(unlink("dirfile/xx") == 0){ printf(1, "unlink dirfile/xx succeeded!\n"); exit(); } if(link("README", "dirfile/xx") == 0){ printf(1, "link to dirfile/xx succeeded!\n"); exit(); } if(unlink("dirfile") != 0){ printf(1, "unlink dirfile failed!\n"); exit(); } fd = open(".", O_RDWR); if(fd >= 0){ printf(1, "open . for writing succeeded!\n"); exit(); } fd = open(".", 0); if(write(fd, "x", 1) > 0){ printf(1, "write . succeeded!\n"); exit(); } close(fd); printf(1, "dir vs file OK\n");}// test that iput() is called at the end of _namei()voidiref(void){ int i, fd; printf(1, "empty file name\n"); // the 50 is NINODE for(i = 0; i < 50 + 1; i++){ if(mkdir("irefd") != 0){ printf(1, "mkdir irefd failed\n"); exit(); } if(chdir("irefd") != 0){ printf(1, "chdir irefd failed\n"); exit(); } mkdir(""); link("README", ""); fd = open("", O_CREATE); if(fd >= 0) close(fd); fd = open("xx", O_CREATE); if(fd >= 0) close(fd); unlink("xx"); } chdir("/"); printf(1, "empty file name OK\n");}// test that fork fails gracefully// the forktest binary also does this, but it runs out of proc entries first.// inside the bigger usertests binary, we run out of memory first.voidforktest(void){ int n, pid; printf(1, "fork test\n"); for(n=0; n<1000; n++){ pid = fork(); if(pid < 0) break; if(pid == 0) exit(); } if(n == 1000){ printf(1, "fork claimed to work 1000 times!\n"); exit(); } for(; n > 0; n--){ if(wait() < 0){ printf(1, "wait stopped early\n"); exit(); } } if(wait() != -1){ printf(1, "wait got too many\n"); exit(); } printf(1, "fork test OK\n");}intmain(int argc, char *argv[]){ printf(1, "usertests starting\n"); if(open("usertests.ran", 0) >= 0){ printf(1, "already ran user tests -- rebuild fs.img\n"); exit(); } close(open("usertests.ran", O_CREATE)); opentest(); writetest(); writetest1(); createtest(); mem(); pipe1(); preempt(); exitwait(); rmdot(); fourteen(); bigfile(); subdir(); concreate(); linktest(); unlinkread(); createdelete(); twofiles(); sharedfd(); dirfile(); iref(); forktest(); bigdir(); // slow exectest(); exit();}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -