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/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;
+}