X-Git-Url: http://git.ozlabs.org/?a=blobdiff_plain;f=ccan%2Frfc822%2Ftest%2Fhelper.c;h=cc62a6621e4caf4bd94bd09f4374f6935bdae584;hb=HEAD;hp=36a2a065f2607c283be3cdd1c1169494b0121a22;hpb=de28abde1337e9255812ba720ffeef2c83a25dde;p=ccan diff --git a/ccan/rfc822/test/helper.c b/ccan/rfc822/test/helper.c index 36a2a065..cc62a662 100644 --- a/ccan/rfc822/test/helper.c +++ b/ccan/rfc822/test/helper.c @@ -1,7 +1,6 @@ #include #include -#include #include #include @@ -11,6 +10,7 @@ /* failtest limitations mean we need these wrappers to test talloc * failure paths. */ +#ifndef TAL_USE_TALLOC static void *malloc_wrapper(size_t size) { return malloc(size); @@ -25,6 +25,7 @@ static void *realloc_wrapper(void *ptr, size_t size) { return realloc(ptr, size); } +#endif #if 0 static void allocation_failure_exit(const char *s) @@ -50,9 +51,70 @@ void allocation_failure_check(void) } } +#ifdef TAL_USE_TALLOC +#include +#else +#include +#endif + +/* Don't abort on allocation failures! */ +static void noabort_wrapper(const char *why) +{ + return; +} + void failtest_setup(int argc, char *argv[]) { failtest_init(argc, argv); rfc822_set_allocation_failure_handler(allocation_failure_continue); - talloc_set_allocator(malloc_wrapper, free_wrapper, realloc_wrapper); +#ifdef TAL_USE_TALLOC + /* FIXME: we can't inject allocation failures in talloc! */ + tal_set_backend(NULL, NULL, NULL, noabort_wrapper); +#else + tal_set_backend(malloc_wrapper, realloc_wrapper, free_wrapper, + noabort_wrapper); +#endif +} + +void check_header(struct rfc822_msg *msg, + struct rfc822_header *h, + const char *name, const char *val, + enum rfc822_header_errors experr, int crlf) +{ + enum rfc822_header_errors errs; + struct bytestring hname, hvalue, hfull; + size_t namelen = strlen(name); + size_t valuelen = strlen(val); + size_t nln = crlf ? 2 : 1; + size_t fulllen = namelen + valuelen + 1 + nln; + + errs = rfc822_header_errors(msg, h); + ok(errs == experr, "Header errors 0x%x != 0x%x", errs, experr); + allocation_failure_check(); + + hname = rfc822_header_raw_name(msg, h); + allocation_failure_check(); + + ok(hname.ptr && bytestring_eq(hname, bytestring_from_string(name)), + "Header name \"%.*s\"", (int)hname.len, hname.ptr); + + hvalue = rfc822_header_raw_value(msg, h); + allocation_failure_check(); + + ok(hvalue.ptr && ((valuelen + nln) == hvalue.len) + && (memcmp(val, hvalue.ptr, valuelen) == 0) + && (!crlf || (hvalue.ptr[hvalue.len - 2] == '\r')) + && (hvalue.ptr[hvalue.len - 1] == '\n'), + "Header value"); + + hfull = rfc822_header_raw_content(msg, h); + allocation_failure_check(); + + ok(hfull.ptr && (fulllen == hfull.len) + && (memcmp(name, hfull.ptr, namelen) == 0) + && (hfull.ptr[namelen] == ':') + && (memcmp(val, hfull.ptr + namelen + 1, valuelen) == 0) + && (!crlf || (hfull.ptr[fulllen-2] == '\r')) + && (hfull.ptr[fulllen-1] == '\n'), + "Full header"); }