#!/usr/local/bin/perl -w
# $Id: rtest.pl,v 1.3 1999/01/05 01:26:31 kaminsky Exp $

#### Regression test for the UVFS filesystem
# Assume that the filesystem is loaded into the kernel and a
# user-space client daemon is running attached to the appropriate 
# device

use strict;
use Fcntl;

# Unbuffer ouput
$| = 1;

# Run tests for each the UVFS vnode operations

my $UVFSDIR = "/uvfs";
my $GOODFILE = "\"$UVFSDIR/d1\"";
my $GOODDIR = "\"$UVFSDIR/b1\"";
my $GOODSLINK = "\"$UVFSDIR/c1\"";
my $BADFILE = "\"$UVFSDIR/a1\"";

my @vnops = qw(uvfs_vop_default
	       uvfs_reclaim
	       uvfs_readdir
	       uvfs_getattr
	       uvfs_setattr
	       uvfs_access
	       uvfs_lookup
	       uvfs_inactive
	       uvfs_open
	       uvfs_close
	       uvfs_read
	       uvfs_write
	       uvfs_remove
	       uvfs_rmdir
	       uvfs_mkdir
	       uvfs_rename
	       uvfs_create
	       uvfs_readlink
	      );

my ($numfailed, $numpassed, $numtests);

sub TEST_GOOD {
  my ($name, $command) = @_;

  $numtests++;

  print STDERR "Testing $name...";
  if (eval $command) {
    $numpassed++;
    warn "passed\n";
  }
  else {
    $numfailed++;
    warn "FAILED\n";
  }
}

sub TEST_BAD {
  my ($name, $command) = @_;

  $numtests++;

  print STDERR "Testing $name...";
  if (not eval $command) {
    $numpassed++;
    warn "passed\n";
  }
  else {
    $numfailed++;
    warn "FAILED\n";
  }
}

# Initialization
$numpassed = 0;
$numfailed = 0;
$numtests = 0;

# LOOKUP
TEST_GOOD ("VOP_LOOKUP: file exists & lookup", "sysopen (FH, $GOODFILE, O_RDONLY)");
TEST_GOOD ("VOP_LOOKUP: dir exists & lookup", "sysopen (FH, $GOODDIR, O_RDONLY)");
TEST_BAD ("VOP_LOOKUP: not exists & lookup", "sysopen (FH, $BADFILE, O_RDONLY)");

# VOP_GETATTR
TEST_GOOD ("VOP_GETATTR: file", "stat ($GOODFILE)");
TEST_GOOD ("VOP_GETATTR: dir", "stat ($GOODDIR)");
TEST_GOOD ("VOP_GETATTR: symlink", "stat ($GOODDIR)");

# VOP_SETATTR
TEST_GOOD ("VOP_SETATTR: file", "chmod (0000, $GOODFILE); chmod (0644, $GOODFILE)");
TEST_GOOD ("VOP_SETATTR: dir", "chmod (0000, $GOODDIR); chmod (0644, $GOODDIR)");
TEST_GOOD ("VOP_SETATTR: symlink", "chmod (0000, $GOODSLINK); chmod (0644, $GOODSLINK)");

# VOP_READDIR
TEST_GOOD ("VOP_READDIR: dir", "opendir (DH, $GOODDIR); \
my \@dir = readdir (DH); closedir (DH);");
TEST_BAD ("VOP_READDIR: file", "opendir (DH, $GOODFILE); \
my \@dir = readdir (DH); closedir (DH);");

# VOP_READ
TEST_GOOD ("VOP_READ: file", "my \$buf; sysopen (FH, $GOODFILE, O_RDONLY); \
sysread (FH, \$buf, 4096); close (FH);");
TEST_GOOD ("VOP_READ: dir", "my \$buf; sysopen (DH, $GOODDIR, O_RDONLY); \
sysread (DH, \$buf, 4096); close (DH);");

# VOP_WRITE
TEST_GOOD ("VOP_WRITE: file", "my \$buf = 'test'; \
sysopen (FH, $GOODFILE, O_RDWR); \
syswrite (FH, \$buf, 4); close (FH);");
#TEST_BAD ("VOP_WRITE: dir", "my \$buf = 'test'; \
#sysopen (DH, $GOODDIR, O_RDWR); \
#syswrite (DH, \$buf, 4); close (FH);");

# VOP_REMOVE
TEST_GOOD ("VOP_REMOVE: file", "unlink ($GOODFILE)");
TEST_GOOD ("VOP_REMOVE: dir", "unlink ($GOODDIR)");

# VOP_RMDIR
TEST_BAD ("VOP_RMDIR: file", "rmdir ($GOODFILE)");
TEST_GOOD ("VOP_RMDIR: dir", "rmdir ($GOODDIR)");
TEST_BAD ("VOP_RMDIR: symlink", "rmdir ($GOODSLINK)");

# VOP_MKDIR
TEST_BAD ("VOP_MKDIR: file", "mkdir ($GOODFILE, 755)");
TEST_BAD ("VOP_MKDIR: dir", "mkdir ($GOODDIR, 755)");
TEST_BAD ("VOP_MKDIR: symlink", "mkdir ($GOODSLINK, 755)");
TEST_GOOD ("VOP_MKDIR: new file", "mkdir ($BADFILE, 755)");

# VOP_RENAME
TEST_GOOD ("VOP_RENAME: file", "rename ($GOODFILE, $BADFILE)");
TEST_GOOD ("VOP_RENAME: dir", "rename ($GOODDIR, $BADFILE)");
TEST_GOOD ("VOP_RENAME: symlink", "rename ($GOODSLINK, $BADFILE)");

# VOP_CREATE
TEST_GOOD ("VOP_CREATE: file", "open (FH, \"+>\" . $BADFILE)");

# VOP_READLINK
TEST_BAD ("VOP_READLINK: file", "readlink ($GOODFILE)");
TEST_BAD ("VOP_READLINK: dir", "readlink ($GOODDIR)");
TEST_GOOD ("VOP_READLINK: symlink", "readlink ($GOODSLINK)");

# VOP_OPEN
TEST_GOOD ("VOP_OPEN-file", "sysopen (FH, $GOODFILE, O_RDONLY)");
TEST_GOOD ("VOP_OPEN-dir", "sysopen (FH, $GOODDIR, O_RDONLY)");
TEST_GOOD ("VOP_OPEN-symlink", "sysopen (FH, $GOODSLINK, O_RDONLY)");
# add a test for directories & writing--shouldn't be allowed 

# VOP_CLOSE
TEST_GOOD ("VOP_CLOSE-file", "sysopen (FH, $GOODFILE, O_RDONLY); close (FH);");
TEST_GOOD ("VOP_CLOSE-dir", "sysopen (FH, $GOODDIR, O_RDONLY); close (FH);");
TEST_GOOD ("VOP_CLOSE-symlink", "sysopen (FH, $GOODSLINK, O_RDONLY); close (FH);");

# VOP_FSYNC

# VOP_LINK
TEST_GOOD ("VOP_LINK-file", "link ($GOODFILE, $BADFILE)");

# VOP_SYMLINK
TEST_GOOD ("VOP_SYMLINK-file", "symlink ($GOODFILE, $BADFILE)");
TEST_GOOD ("VOP_SYMLINK-dir", "symlink ($GOODDIR, $BADFILE)");

# VFS_STATFS 

# Print statistics
printf ("\nStatistics:\n");
printf ("\tNumber of tests:\t%d\n", $numtests);
printf ("\tTests passed:\t\t%%%3.2f\n", 100.0 * $numpassed / $numtests);
printf ("\tTests failed:\t\t%%%3.2f\n", 100.0 * $numfailed / $numtests);
