]> git.ozlabs.org Git - ccan/blobdiff - ccan/asprintf/test/run.c
asprintf: new asprintf module.
[ccan] / ccan / asprintf / test / run.c
diff --git a/ccan/asprintf/test/run.c b/ccan/asprintf/test/run.c
new file mode 100644 (file)
index 0000000..64c9990
--- /dev/null
@@ -0,0 +1,73 @@
+#include <ccan/asprintf/asprintf.h>
+/* Include the C files directly. */
+
+/* Override vasprintf for testing. */
+#if HAVE_ASPRINTF
+#define vasprintf my_vasprintf
+static int my_vasprintf(char **strp, const char *fmt, va_list ap);
+#else
+#include <stdio.h>
+#include <stdarg.h>
+#define vsnprintf my_vsnprintf
+static int my_vsnprintf(char *str, size_t size, const char *format, va_list ap);
+#endif
+
+#include <ccan/asprintf/asprintf.c>
+#include <ccan/tap/tap.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdbool.h>
+
+static bool fail;
+
+#if HAVE_ASPRINTF
+#undef vasprintf
+static int my_vasprintf(char **strp, const char *fmt, va_list ap)
+{
+       if (fail) {
+               /* Set strp to crap. */
+               *strp = (char *)(long)1;
+               return -1;
+       }
+       return vasprintf(strp, fmt, ap);
+}
+#else
+#undef vsnprintf
+static int my_vsnprintf(char *str, size_t size, const char *format, va_list ap)
+{
+       if (fail) {
+               return -1;
+       }
+       return vsnprintf(str, size, format, ap);
+}
+#endif
+
+int main(void)
+{
+       char *p, nul = '\0';
+       int ret;
+
+       /* This is how many tests you plan to run */
+       plan_tests(8);
+
+       fail = false;
+       p = afmt("Test %u%cafter-nul", 1, nul);
+       ok1(p);
+       ok1(strlen(p) == strlen("Test 1"));
+       ok1(memcmp(p, "Test 1\0after-nul\0", 17) == 0);
+       free(p);
+
+       ret = asprintf(&p, "Test %u%cafter-nul", 1, nul);
+       ok1(ret == 16);
+       ok1(p);
+       ok1(strlen(p) == strlen("Test 1"));
+       ok1(memcmp(p, "Test 1\0after-nul\0", 17) == 0);
+       free(p);
+
+       fail = true;
+       p = afmt("Test %u%cafter-nul", 1, nul);
+       ok1(p == NULL);
+
+       /* This exits depending on whether all tests passed */
+       return exit_status();
+}