#include <u.h>
#include <libc.h>
#include <auth.h>

typedef struct Test Test;

struct Test
{
	char *name;
	int (*server)(Test*, AuthRpc*, int);
	int (*client)(Test*, int);
};

int
ai2status(AuthInfo *ai)
{
	if(ai == nil)
		return -1;
	auth_freeAI(ai);
	return 0;
}

int
proxyserver(Test *t, AuthRpc *rpc, int fd)
{
	char buf[1024];

	sprint(buf, "proto=%q role=server", t->name);
	return ai2status(fauth_proxy(fd, rpc, nil, buf));
}

int
proxyclient(Test *t, int fd)
{
	return ai2status(auth_proxy(fd, auth_getkey, "proto=%q role=client", t->name));
}

Test test[] =
{
	"apop",		proxyserver,		proxyclient,
	"cram",		proxyserver,		proxyclient,
	"p9sk1",		proxyserver,		proxyclient,
	"p9sk2",		proxyserver,		proxyclient,
	"p9any",		proxyserver,		proxyclient,
};

void
usage(void)
{
	fprint(2, "usage: test [name]...\n");
	exits("usage");
}

void
runtest(AuthRpc *srpc, Test *t)
{
	int p[2], bad;
	Waitmsg *w;

	if(pipe(p) < 0)
		sysfatal("pipe: %r");

	print("%s...", t->name);

	switch(fork()){
	case -1:
		sysfatal("fork: %r");

	case 0:
		close(p[0]);
		if((*t->server)(t, srpc, p[1]) < 0){
			print("\n\tserver: %r");
			_exits("oops");
		}
		close(p[1]);
		_exits(nil);
	default:
		close(p[1]);
		if((*t->client)(t, p[0]) < 0){
			print("\n\tclient: %r");
			bad = 1;
		}
		close(p[0]);
		break;
	}
	w = wait();
	if(w->msg[0])
		bad = 1;
	print("\n");
}

void
main(int argc, char **argv)
{
	int i, j;
	int afd;
	AuthRpc *srpc;

	ARGBEGIN{
	default:
		usage();
	}ARGEND

	quotefmtinstall();
	afd = open("/n/kremvax/factotum/rpc", ORDWR);
	if(afd < 0)
		sysfatal("open /n/kremvax/factotum/rpc: %r");
	srpc = auth_allocrpc(afd);
	if(srpc == nil)
		sysfatal("auth_allocrpc: %r");

	if(argc == 0)
		for(i=0; i<nelem(test); i++)
			runtest(srpc, &test[i]);
	else
		for(i=0; i<argc; i++)
			for(j=0; j<nelem(test); j++)
				if(strcmp(argv[i], test[j].name) == 0)
					runtest(srpc, &test[j]);
	exits(nil);
}
