summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrtm <rtm>2007-08-24 12:19:13 +0000
committerrtm <rtm>2007-08-24 12:19:13 +0000
commit3d5f21ee1f1d0521653c54257fe3728fbaa9a556 (patch)
tree0b45c8d67e9ba64967f89ba1a6cbfbb11265e6cb
parent68ae4cc127af9ba0cea53e009568d660a86af57e (diff)
downloadxv6-labs-3d5f21ee1f1d0521653c54257fe3728fbaa9a556.tar.gz
xv6-labs-3d5f21ee1f1d0521653c54257fe3728fbaa9a556.tar.bz2
xv6-labs-3d5f21ee1f1d0521653c54257fe3728fbaa9a556.zip
test concurrent open/unlink of same file (ok)
test files with holes (not ok)
-rw-r--r--usertests.c92
1 files changed, 89 insertions, 3 deletions
diff --git a/usertests.c b/usertests.c
index 740b81d..11464f3 100644
--- a/usertests.c
+++ b/usertests.c
@@ -139,6 +139,76 @@ writetest1(void)
}
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)
{
int i, fd;
@@ -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();