summaryrefslogtreecommitdiff
path: root/test-genrandom.c
diff options
context:
space:
mode:
authorNicolas Pitre <nico@cam.org>2007-04-11 17:59:51 (GMT)
committerJunio C Hamano <junkio@cox.net>2007-04-12 02:23:32 (GMT)
commit2dca1af44806924946828e2fdc82ea408353d286 (patch)
treeb9346c6c56721f4ca480463696d45eea969caa16 /test-genrandom.c
parent91ecbeca48e675fef8141451edb2c86577f9d63c (diff)
downloadgit-2dca1af44806924946828e2fdc82ea408353d286.zip
git-2dca1af44806924946828e2fdc82ea408353d286.tar.gz
git-2dca1af44806924946828e2fdc82ea408353d286.tar.bz2
simple random data generator for tests
Reliance on /dev/urandom produces test vectors that are, well, random. This can cause problems impossible to track down when the data is different from one test invokation to another. The goal is not to have random data to test, but rather to have a convenient way to create sets of large files with non compressible and non deltifiable data in a reproducible way. Signed-off-by: Nicolas Pitre <nico@cam.org> Signed-off-by: Junio C Hamano <junkio@cox.net>
Diffstat (limited to 'test-genrandom.c')
-rw-r--r--test-genrandom.c34
1 files changed, 34 insertions, 0 deletions
diff --git a/test-genrandom.c b/test-genrandom.c
new file mode 100644
index 0000000..8cefe6c
--- /dev/null
+++ b/test-genrandom.c
@@ -0,0 +1,34 @@
+/*
+ * Simple random data generator used to create reproducible test files.
+ * This is inspired from POSIX.1-2001 implementation example for rand().
+ * Copyright (C) 2007 by Nicolas Pitre, licensed under the GPL version 2.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+int main(int argc, char *argv[])
+{
+ unsigned long count, next = 0;
+ unsigned char *c;
+
+ if (argc < 2 || argc > 3) {
+ fprintf( stderr, "Usage: %s <seed_string> [<size>]", argv[0]);
+ return 1;
+ }
+
+ c = (unsigned char *) argv[1];
+ do {
+ next = next * 11 + *c;
+ } while (*c++);
+
+ count = (argc == 3) ? strtoul(argv[2], NULL, 0) : -1L;
+
+ while (count--) {
+ next = next * 1103515245 + 12345;
+ if (putchar((next >> 16) & 0xff) == EOF)
+ return -1;
+ }
+
+ return 0;
+}