--- /dev/null
+#include <ccan/cdump/cdump_parse.c>
+#include <ccan/tap/tap.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+
+static size_t diffoff(const char *a, const char *b)
+{
+ size_t i;
+
+ for (i = 0; a[i]; i++)
+ if (b[i] != a[i])
+ break;
+ return i;
+}
+
+static char *read_file(const void *ctx, const char *fname)
+{
+ int fd = open(fname, O_RDONLY);
+ off_t len = lseek(fd, 0, SEEK_END);
+ char *ret = talloc_array(ctx, char, len + 1);
+ lseek(fd, 0, SEEK_SET);
+ read(fd, ret, len);
+ ret[len] = '\0';
+ close(fd);
+ return ret;
+}
+
+int main(int argc, char *argv[])
+{
+ char *ret, *decls, *defs;
+ char *toplevel = talloc_strdup(NULL, "toplevel");
+ char *header, *definitions, *declarations;
+
+ plan_tests(5);
+ header = read_file(toplevel, "test/test_header_advanced.h");
+ declarations = read_file(toplevel, "test/example_generated-advanced-decls.h");
+ definitions = read_file(toplevel, "test/example_generated-advanced-defs.h");
+
+ ret = cdump_parse(toplevel, header, &decls, &defs);
+ ok1(ret == NULL);
+ ok(streq(decls, declarations),
+ "Declarations differ at %zu: ...'%.*s' vs ...'%.*s'",
+ diffoff(decls, declarations),
+ 30, decls + diffoff(decls, declarations),
+ 30, declarations + diffoff(decls, declarations));
+ ok(streq(defs, definitions),
+ "Definitions differ at %zu: ...'%.*s' vs ...'%.*s'",
+ diffoff(defs, definitions),
+ 30, defs + diffoff(defs, definitions),
+ 30, definitions + diffoff(defs, definitions));
+
+ ok1(talloc_find_parent_byname(decls, "toplevel") == toplevel);
+ ok1(talloc_find_parent_byname(defs, "toplevel") == toplevel);
+
+ talloc_free(toplevel);
+ return exit_status();
+}