2004-05-13 Paul Jakma <paul@dishone.st>
* test-buffer.c: Andrew's buffer tester
* test-memory.c: basic memory tester
* Makefile.am: Add new tests
diff --git a/tests/.cvsignore b/tests/.cvsignore
index 9e39876..4c4801e 100644
--- a/tests/.cvsignore
+++ b/tests/.cvsignore
@@ -11,3 +11,6 @@
testsig
.arch-inventory
.arch-ids
+testbuffer
+testmemory
+testsig
diff --git a/tests/Makefile.am b/tests/Makefile.am
index d8c73eb..c3fac7c 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -1,9 +1,12 @@
INCLUDES = @INCLUDES@ -I.. -I$(top_srcdir) -I$(top_srcdir)/lib
DEFS = @DEFS@ $(LOCAL_OPTS) -DSYSCONFDIR=\"$(sysconfdir)/\"
-noinst_PROGRAMS = testsig
+noinst_PROGRAMS = testsig testbuffer testmemory
testsig_SOURCES = test-sig.c
+testbuffer_SOURCES = test-buffer.c
+testmemory_SOURCES = test-memory.c
testsig_LDADD = ../lib/libzebra.la @LIBCAP@
-
+testbuffer_LDADD = ../lib/libzebra.la @LIBCAP@
+testmemory_LDADD = ../lib/libzebra.la @LIBCAP@
diff --git a/tests/test-buffer.c b/tests/test-buffer.c
new file mode 100644
index 0000000..11e3629
--- /dev/null
+++ b/tests/test-buffer.c
@@ -0,0 +1,35 @@
+#include <zebra.h>
+#include <buffer.h>
+
+struct thread_master *master;
+
+int
+main(int argc, char **argv)
+{
+ struct buffer *b1, *b2;
+ int n;
+ char junk[3];
+ char c = 'a';
+
+ if ((argc != 2) || (sscanf(argv[1], "%d%1s", &n, junk) != 1))
+ {
+ fprintf(stderr, "Usage: %s <number of chars to simulate>\n", *argv);
+ return 1;
+ }
+
+ b1 = buffer_new(0);
+ b2 = buffer_new(1024);
+
+ while (n-- > 0)
+ {
+ buffer_put(b1, &c, 1);
+ buffer_put(b2, &c, 1);
+ if (c++ == 'z')
+ c = 'a';
+ buffer_reset(b1);
+ buffer_reset(b2);
+ }
+ buffer_free(b1);
+ buffer_free(b2);
+ return 0;
+}
diff --git a/tests/test-memory.c b/tests/test-memory.c
new file mode 100644
index 0000000..2971160
--- /dev/null
+++ b/tests/test-memory.c
@@ -0,0 +1,103 @@
+#include <zebra.h>
+#include <memory.h>
+
+/* Memory torture tests
+ *
+ * Tests below are generic but comments are focused on interaction with
+ * Paul's proposed memory 'quick' cache, which may never be included in
+ * CVS
+ */
+
+struct thread_master *master;
+
+#if 0 /* set to 1 to use system alloc directly */
+#undef XMALLOC
+#undef XCALLOC
+#undef XREALLOC
+#undef XFREE
+#define XMALLOC(T,S) malloc((S))
+#define XCALLOC(T,S) calloc(1, (S))
+#define XREALLOC(T,P,S) realloc((P),(S))
+#define XFREE(T,P) free((P))
+#endif
+
+#define TIMES 10
+
+int
+main(int argc, char **argv)
+{
+ void *a[10];
+ int i;
+
+ printf ("malloc x, malloc x, free, malloc x, free free\n\n");
+ /* simple case, test cache */
+ for (i = 0; i < TIMES; i++)
+ {
+ a[0] = XMALLOC (MTYPE_VTY, 1024);
+ memset (a[0], 1, 1024);
+ a[1] = XMALLOC (MTYPE_VTY, 1024);
+ memset (a[1], 1, 1024);
+ XFREE(MTYPE_VTY, a[0]); /* should go to cache */
+ a[0] = XMALLOC (MTYPE_VTY, 1024); /* should be satisfied from cache */
+ XFREE(MTYPE_VTY, a[0]);
+ XFREE(MTYPE_VTY, a[1]);
+ }
+
+ printf ("malloc x, malloc y, free x, malloc y, free free\n\n");
+ /* cache should go invalid, valid, invalid, etc.. */
+ for (i = 0; i < TIMES; i++)
+ {
+ a[0] = XMALLOC (MTYPE_VTY, 512);
+ memset (a[0], 1, 512);
+ a[1] = XMALLOC (MTYPE_VTY, 1024); /* invalidate cache */
+ memset (a[1], 1, 1024);
+ XFREE(MTYPE_VTY, a[0]);
+ a[0] = XMALLOC (MTYPE_VTY, 1024);
+ XFREE(MTYPE_VTY, a[0]);
+ XFREE(MTYPE_VTY, a[1]);
+ /* cache should become valid again on next request */
+ }
+
+ printf ("calloc\n\n");
+ /* test calloc */
+ for (i = 0; i < TIMES; i++)
+ {
+ a[0] = XCALLOC (MTYPE_VTY, 1024);
+ memset (a[0], 1, 1024);
+ a[1] = XCALLOC (MTYPE_VTY, 512); /* invalidate cache */
+ memset (a[1], 1, 512);
+ XFREE(MTYPE_VTY, a[1]);
+ XFREE(MTYPE_VTY, a[0]);
+ /* alloc == 0, cache can become valid again on next request */
+ }
+
+ printf ("calloc and realloc\n\n");
+ /* check calloc + realloc */
+ for (i = 0; i < TIMES; i++)
+ {
+ printf ("calloc a0 1024\n");
+ a[0] = XCALLOC (MTYPE_VTY, 1024);
+ memset (a[0], 1, 1024/2);
+
+ printf ("calloc 1 1024\n");
+ a[1] = XCALLOC (MTYPE_VTY, 1024);
+ memset (a[1], 1, 1024/2);
+
+ printf ("realloc 0 1024\n");
+ a[3] = XREALLOC (MTYPE_VTY, a[0], 2048); /* invalidate cache */
+ if (a[3] != NULL)
+ a[0] = a[3];
+ memset (a[0], 1, 1024);
+
+ printf ("calloc 2 512\n");
+ a[2] = XCALLOC (MTYPE_VTY, 512);
+ memset (a[2], 1, 512);
+
+ printf ("free 1 0 2\n");
+ XFREE(MTYPE_VTY, a[1]);
+ XFREE(MTYPE_VTY, a[0]);
+ XFREE(MTYPE_VTY, a[2]);
+ /* alloc == 0, cache valid next request */
+ }
+ return 0;
+}