diff options
| author | rtm <rtm> | 2007-08-24 12:19:13 +0000 | 
|---|---|---|
| committer | rtm <rtm> | 2007-08-24 12:19:13 +0000 | 
| commit | 3d5f21ee1f1d0521653c54257fe3728fbaa9a556 (patch) | |
| tree | 0b45c8d67e9ba64967f89ba1a6cbfbb11265e6cb | |
| parent | 68ae4cc127af9ba0cea53e009568d660a86af57e (diff) | |
| download | xv6-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.c | 92 | 
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(); | 
