diff options
Diffstat (limited to 'user')
| -rw-r--r-- | user/usertests.c | 73 | 
1 files changed, 62 insertions, 11 deletions
| diff --git a/user/usertests.c b/user/usertests.c index d965077..6fd8c29 100644 --- a/user/usertests.c +++ b/user/usertests.c @@ -21,7 +21,6 @@  char buf[BUFSZ];  char name[3]; -char *echoargv[] = { "echo", "ALL", "TESTS", "PASSED", 0 };  // does chdir() call iput(p->cwd) in a transaction?  void @@ -283,10 +282,56 @@ void dirtest(char *s)  void  exectest(char *s)  { -  if(exec("echo", echoargv) < 0){ -    printf("%s: exec echo failed\n", s); +  int fd, xstatus, pid; +  char *echoargv[] = { "echo", "OK", 0 }; +  char buf[3]; + +  unlink("echo-ok"); +  pid = fork(); +  if(pid < 0) { +     printf("%s: fork failed\n", s); +     exit(1); +  } +  if(pid == 0) { +    close(1); +    fd = open("echo-ok", O_CREATE|O_WRONLY); +    if(fd < 0) { +      printf("%s: create failed\n", s); +      exit(1); +    } +    if(fd != 1) { +      printf("%s: wrong fd\n", s); +      exit(1); +    } +    if(exec("echo", echoargv) < 0){ +      printf("%s: exec echo failed\n", s); +      exit(1); +    } +    // won't get to here +  } +  if (wait(&xstatus) != pid) { +    printf("%s: wait failed!\n", s); +  } +  if(xstatus != 0) +    exit(xstatus); + +  fd = open("echo-ok", O_RDONLY); +  if(fd < 0) { +    printf("%s: open failed\n", s); +    exit(1); +  } +  if (read(fd, buf, 2) != 2) { +    printf("%s: read failed\n", s); +    exit(1); +  } +  unlink("echo-ok"); +  if(buf[0] == 'O' && buf[1] == 'K') +    exit(0); +  else { +    printf("%s: wrong output\n", s);      exit(1);    } +  }  // simple fork and pipe read/write @@ -1862,7 +1907,8 @@ stacktest(char *s)      exit(xstatus);  } -void +// 1 if successful +int  run(void f(char *), char *s) {    int pid;    int xstatus; @@ -1876,12 +1922,12 @@ run(void f(char *), char *s) {      exit(0);    } else {      wait(&xstatus); -    if(xstatus != 0) +    if(xstatus != 0)         printf("test %s FAILED\n", s);      else        printf("test %s OK\n", s); +    return xstatus == 0;    } -    }  int @@ -1909,6 +1955,7 @@ main(int argc, char *argv[])      {subdir, "subdir"},      {fourfiles, "fourfiles"},      {sharedfd, "sharedfd"}, +    {exectest, "exectest"},      {bigargtest, "bigargtest"},      {bigwrite, "bigwrite"},      {bsstest, "bsstest"}, @@ -1933,23 +1980,27 @@ main(int argc, char *argv[])      {iref, "iref"},      {forktest, "forktest"},      {bigdir, "bigdir"}, // slow -    {exectest, "exectest"},  // must be last      { 0, 0},    };    printf("usertests starting\n");    if(open("usertests.ran", 0) >= 0){ -    printf("already ran user tests -- rebuild fs.img\n"); +    printf("already ran user tests -- rebuild fs.img (make fs.img)\n");      exit(1);    }    close(open("usertests.ran", O_CREATE)); +  int fail = 0;    for (struct test *t = tests; t->s != 0; t++) {      if((n == 0) || strcmp(t->s, n) == 0) { -      run(t->f, t->s); +      if(!run(t->f, t->s)) +        fail = 1;      }    } - -  exit(0); +  if(!fail) +    printf("ALL TESTS PASSED\n"); +  else +    printf("SOME TESTS FAILED\n"); +  exit(1);   // not reached.  } | 
