threads / patch / 7610

patch, 2 partssimple random data generator for tests

Subject: [PATCH 1/2] simple random data generator for tests

## tl;dr

4 messages between Apr 11, 2007 and Apr 11, 2007. Diffs are folded; open one to read it.

replies: 3people: 2as markdown or json

Nicolas Pitre· Apr 11, 2007, 17:33 UTC · lore

Reliance on /dev/urandom produces test vectors that are, well, random. This can create 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>
---
 Makefile         |    7 +++++--
 test-genrandom.c |   34 ++++++++++++++++++++++++++++++++++
 2 files changed, 39 insertions(+), 2 deletions(-)
 create mode 100644 test-genrandom.c
Show changes to 2 files +39 −2

Makefile, test-genrandom.c

diff --git a/Makefile b/Makefile
index a77d31d..bd0ba95 100644
--- a/Makefile
+++ b/Makefile
@@ -932,7 +932,7 @@ endif
 
 export NO_SVN_TESTS
 
-test: all test-chmtime$X
+test: all test-chmtime$X test-genrandom$X
 	$(MAKE) -C t/ all
 
 test-date$X: test-date.c date.o ctype.o
@@ -953,6 +953,9 @@ test-match-trees$X: test-match-trees.o $(GITLIBS)
 test-chmtime$X: test-chmtime.c
 	$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $<
 
+test-genrandom$X: test-genrandom.c
+	$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $<
+
 check-sha1:: test-sha1$X
 	./test-sha1.sh
 
@@ -1041,7 +1044,7 @@ dist-doc:
 
 clean:
 	rm -f *.o mozilla-sha1/*.o arm/*.o ppc/*.o compat/*.o xdiff/*.o \
-		test-chmtime$X $(LIB_FILE) $(XDIFF_LIB)
+		test-chmtime$X test-genrandom$X $(LIB_FILE) $(XDIFF_LIB)
 	rm -f $(ALL_PROGRAMS) $(BUILT_INS) git$X
 	rm -f *.spec *.pyc *.pyo */*.pyc */*.pyo common-cmds.h TAGS tags
 	rm -rf autom4te.cache
diff --git a/test-genrandom.c b/test-genrandom.c
new file mode 100644
index 0000000..6cc4650
--- /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;
+}
-- 
1.5.1.777.gd14d3-dirty
Shawn O. Pearce· Apr 11, 2007, 17:42 UTC · re: Nicolas Pitre · lore

Re: [PATCH 1/2] simple random data generator for tests

Nicolas Pitre <nico@cam.org> wrote:
Show 5 quoted lines
> ---
>  Makefile         |    7 +++++--
>  test-genrandom.c |   34 ++++++++++++++++++++++++++++++++++
>  2 files changed, 39 insertions(+), 2 deletions(-)
>  create mode 100644 test-genrandom.c
A change to .gitignore would also be nice.  ;-)
 
> +	unsigned long count, next = 0;

What about wraparound? Could this produce different results on a 32 bit system and a 64 bit system, due to the difference in size of unsigned long?

-- 
Shawn.
Nicolas Pitre· Apr 11, 2007, 17:52 UTC · re: Shawn O. Pearce · lore

Re: [PATCH 1/2] simple random data generator for tests

On Wed, 11 Apr 2007, Shawn O. Pearce wrote:
Show 8 quoted lines
> Nicolas Pitre <nico@cam.org> wrote:
> > ---
> >  Makefile         |    7 +++++--
> >  test-genrandom.c |   34 ++++++++++++++++++++++++++++++++++
> >  2 files changed, 39 insertions(+), 2 deletions(-)
> >  create mode 100644 test-genrandom.c
> 
> A change to .gitignore would also be nice.  ;-)
Gah!
Show 5 quoted lines
> > +	unsigned long count, next = 0;
> 
> What about wraparound?  Could this produce different results on a
> 32 bit system and a 64 bit system, due to the difference in size
> of unsigned long?

No, because the bits we extract are below 32 bits, and the multiply operation will always provide the same results in the low 32 bits regardless.

Nicolas
Nicolas Pitre· Apr 11, 2007, 17:59 UTC · re: Nicolas Pitre · lore

[PATCH 1/2 (with .gitignore)] 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>
---
Show changes to 3 files +40 −2

Makefile, test-genrandom.c, .gitignore

diff --git a/Makefile b/Makefile
index a77d31d..bd0ba95 100644
--- a/Makefile
+++ b/Makefile
@@ -932,7 +932,7 @@ endif
 
 export NO_SVN_TESTS
 
-test: all test-chmtime$X
+test: all test-chmtime$X test-genrandom$X
 	$(MAKE) -C t/ all
 
 test-date$X: test-date.c date.o ctype.o
@@ -953,6 +953,9 @@ test-match-trees$X: test-match-trees.o $(GITLIBS)
 test-chmtime$X: test-chmtime.c
 	$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $<
 
+test-genrandom$X: test-genrandom.c
+	$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $<
+
 check-sha1:: test-sha1$X
 	./test-sha1.sh
 
@@ -1041,7 +1044,7 @@ dist-doc:
 
 clean:
 	rm -f *.o mozilla-sha1/*.o arm/*.o ppc/*.o compat/*.o xdiff/*.o \
-		test-chmtime$X $(LIB_FILE) $(XDIFF_LIB)
+		test-chmtime$X test-genrandom$X $(LIB_FILE) $(XDIFF_LIB)
 	rm -f $(ALL_PROGRAMS) $(BUILT_INS) git$X
 	rm -f *.spec *.pyc *.pyo */*.pyc */*.pyo common-cmds.h TAGS tags
 	rm -rf autom4te.cache
diff --git a/test-genrandom.c b/test-genrandom.c
new file mode 100644
index 0000000..6cc4650
--- /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;
+}
diff --git a/.gitignore b/.gitignore
index 9229e91..fa7ac93 100644
--- a/.gitignore
+++ b/.gitignore
@@ -149,6 +149,7 @@ test-chmtime
 test-date
 test-delta
 test-dump-cache-tree
+test-genrandom
 test-match-trees
 common-cmds.h
 *.tar.gz

← back to recent threads