📄 usertests.c
字号:
for(i = 0; i < n; i++){ name[0] = 'p'; name[1] = '0' + i; unlink(name); name[0] = 'c'; unlink(name); } printf(1, "createdelete ok\n");}// can I unlink a file and still read it?voidunlinkread(){ int fd, fd1; printf(1, "unlinkread test\n"); fd = open("unlinkread", O_CREATE | O_RDWR); if(fd < 0){ printf(1, "create unlinkread failed\n"); exit(); } write(fd, "hello", 5); close(fd); fd = open("unlinkread", O_RDWR); if(fd < 0){ printf(1, "open unlinkread failed\n"); exit(); } if(unlink("unlinkread") != 0){ printf(1, "unlink unlinkread failed\n"); exit(); } fd1 = open("unlinkread", O_CREATE | O_RDWR); write(fd1, "yyy", 3); close(fd1); if(read(fd, buf, sizeof(buf)) != 5){ printf(1, "unlinkread read failed"); exit(); } if(buf[0] != 'h'){ printf(1, "unlinkread wrong data\n"); exit(); } if(write(fd, buf, 10) != 10){ printf(1, "unlinkread write failed\n"); exit(); } close(fd); unlink("unlinkread"); printf(1, "unlinkread ok\n");}voidlinktest(){ int fd; printf(1, "linktest\n"); unlink("lf1"); unlink("lf2"); fd = open("lf1", O_CREATE|O_RDWR); if(fd < 0){ printf(1, "create lf1 failed\n"); exit(); } if(write(fd, "hello", 5) != 5){ printf(1, "write lf1 failed\n"); exit(); } close(fd); if(link("lf1", "lf2") < 0){ printf(1, "link lf1 lf2 failed\n"); exit(); } unlink("lf1"); if(open("lf1", 0) >= 0){ printf(1, "unlinked lf1 but it is still there!\n"); exit(); } fd = open("lf2", 0); if(fd < 0){ printf(1, "open lf2 failed\n"); exit(); } if(read(fd, buf, sizeof(buf)) != 5){ printf(1, "read lf2 failed\n"); exit(); } close(fd); if(link("lf2", "lf2") >= 0){ printf(1, "link lf2 lf2 succeeded! oops\n"); exit(); } 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 of the same filevoidconcreate(){ char file[3]; int i, pid, n, fd; char fa[40]; struct { unsigned short 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; unlink(file); } printf(1, "concreate ok\n");}// directory that uses indirect blocksvoidbigdir(){ 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(){ 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(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(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("./..") != 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", 0) >= 0){ printf(1, "open 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(); } // unlink dd/dd // unlink dd printf(1, "subdir ok\n");}voidbigfile(){ 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(){ int fd; 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");}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(); fourteen(); bigfile(); subdir(); bigdir(); // slow concreate(); linktest(); unlinkread(); createdelete(); twofiles(); sharedfd(); exectest(); exit();}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -