Commit f1ab33e4 authored by Poul-Henning Kamp's avatar Poul-Henning Kamp

Add a toplevel word which examines the sequence returned by

srandom(1) and stops the test if we do not get the same sequence
as we expect.

The Open Group does not define which deterministic sequence srandom(1)
should result in, on that it be deterministic, but I have high hopes
in the general sanity and expect that UNIX people across the board
have realized that for portability the same sequence should be
returned on all platforms.

At the very least FreeBSD and Linux/GLIBC, as seen on projects.linpro.no,
agree.



git-svn-id: http://www.varnish-cache.org/svn/trunk/varnish-cache@3367 d4fa192b-c00b-0410-8231-f00ffab90ce4
parent 2c62eda6
......@@ -46,6 +46,8 @@
const char *vtc_file;
char *vtc_desc;
static int stop;
/**********************************************************************
* Read a file into memory
*/
......@@ -188,6 +190,8 @@ parse_string(char *buf, const struct cmds *cmd, void *priv, struct vtclog *vl)
assert(cp->cmd != NULL);
cp->cmd(token_s, priv, cmd, vl);
if (stop)
break;
}
}
......@@ -284,6 +288,52 @@ cmd_dump(CMD_ARGS)
printf("\t<%s>\n", *av++);
}
/**********************************************************************
* Check random generator
*/
#define NRNDEXPECT 12
static const unsigned long random_expect[NRNDEXPECT] = {
1804289383, 846930886, 1681692777, 1714636915,
1957747793, 424238335, 719885386, 1649760492,
596516649, 1189641421, 1025202362, 1350490027
};
#define RND_NEXT_1K 0x3bdcbe30
static void
cmd_random(CMD_ARGS)
{
unsigned long l;
int i;
(void)cmd;
(void)priv;
if (av == NULL)
return;
srandom(1);
for (i = 0; i < NRNDEXPECT; i++) {
l = random();
if (l == random_expect[i])
continue;
vtc_log(vl, 4, "random[%d] = 0x%x (expect 0x%x)",
i, l, random_expect[i]);
vtc_log(vl, 1, "SKIPPING test: unknown srandom(1) sequence.");
stop = 1;
break;
}
l = 0;
for (i = 0; i < 1000; i++)
l += random();
if (l != RND_NEXT_1K) {
vtc_log(vl, 4, "sum(random[%d...%d]) = 0x%x (expect 0x%x)",
NRNDEXPECT, NRNDEXPECT + 1000,
l, RND_NEXT_1K);
vtc_log(vl, 1, "SKIPPING test: unknown srandom(1) sequence.");
stop = 1;
}
}
/**********************************************************************
* Execute a file
*/
......@@ -296,6 +346,7 @@ static struct cmds cmds[] = {
{ "test", cmd_test },
{ "shell", cmd_shell },
{ "sema", cmd_sema },
{ "random", cmd_random },
{ NULL, NULL }
};
......@@ -304,6 +355,7 @@ exec_file(const char *fn, struct vtclog *vl)
{
char *buf;
stop = 0;
vtc_file = fn;
vtc_desc = NULL;
vtc_log(vl, 1, "TEST %s starting", fn);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment