X-Git-Url: http://git.ozlabs.org/?p=petitboot;a=blobdiff_plain;f=test%2Fparser%2Futils.c;h=b80e0e102025430f4ebaece59540481d44fb5814;hp=33efda80536f8354ebc4e10e6b64fe1299755831;hb=d67d5beceef94686818ce264b2ca93f82b66e8f4;hpb=9fbd73a208c9465b4bf9e2c80c7290b72e62ead1 diff --git a/test/parser/utils.c b/test/parser/utils.c index 33efda8..b80e0e1 100644 --- a/test/parser/utils.c +++ b/test/parser/utils.c @@ -4,6 +4,7 @@ #include #include #include +#include #include #include @@ -14,6 +15,7 @@ #include "device-handler.h" #include "parser.h" #include "resource.h" +#include "event.h" #include "parser-test.h" @@ -110,18 +112,20 @@ void test_fini(struct parser_test *test) talloc_free(test); } -void __test_read_conf_data(struct parser_test *test, +void __test_read_conf_data(struct parser_test *test, const char *conf_file, const char *buf, size_t len) { - test->conf.size = len; - test->conf.buf = talloc_memdup(test, buf, len); + test_add_file_data(test, test->ctx->device, conf_file, buf, len); } -void test_read_conf_file(struct parser_test *test, const char *filename) +void test_read_conf_file(struct parser_test *test, const char *filename, + const char *conf_file) { struct stat stat; + size_t size; char *path; int fd, rc; + char *buf; path = talloc_asprintf(test, "%s/%s", TEST_CONF_BASE, filename); @@ -133,37 +137,43 @@ void test_read_conf_file(struct parser_test *test, const char *filename) assert(!rc); (void)rc; - test->conf.size = stat.st_size; - test->conf.buf = talloc_array(test, char, test->conf.size + 1); + size = stat.st_size; + buf = talloc_array(test, char, size + 1); - rc = read(fd, test->conf.buf, test->conf.size); - assert(rc == (ssize_t)test->conf.size); + rc = read(fd, buf, size); + assert(rc == (ssize_t)size); - *(char *)(test->conf.buf + test->conf.size) = '\0'; + *(buf + size) = '\0'; close(fd); talloc_free(path); -} -void test_set_conf_source(struct parser_test *test, const char *url) -{ - test->ctx->conf_url = pb_url_parse(test, url); - assert(test->ctx->conf_url); + test_add_file_data(test, test->ctx->device, conf_file, buf, size); } void test_add_file_data(struct parser_test *test, struct discover_device *dev, - const char *filename, void *data, int size) + const char *filename, const void *data, int size) { struct test_file *file; file = talloc_zero(test, struct test_file); file->dev = dev; file->name = filename; - file->data = data; + file->data = talloc_memdup(test, data, size); file->size = size; list_add(&test->files, &file->list); } +void test_set_event_source(struct parser_test *test) +{ + test->ctx->event = talloc_zero(test->ctx, struct event); +} + +void test_set_event_param(struct event *event, const char *name, + const char *value) +{ + event_set_param(event, name, value); +} int parser_request_file(struct discover_context *ctx, struct discover_device *dev, const char *filename, @@ -171,6 +181,7 @@ int parser_request_file(struct discover_context *ctx, { struct parser_test *test = ctx->test_data; struct test_file *file; + char *tmp; list_for_each_entry(&test->files, file, list) { if (file->dev != dev) @@ -178,7 +189,12 @@ int parser_request_file(struct discover_context *ctx, if (strcmp(file->name, filename)) continue; - *buf = talloc_memdup(test, file->data, file->size); + /* the read_file() interface always adds a trailing null + * for string-safety; do the same here */ + tmp = talloc_array(test, char, file->size + 1); + memcpy(tmp, file->data, file->size); + tmp[file->size] = '\0'; + *buf = tmp; *len = file->size; return 0; } @@ -208,14 +224,37 @@ int parser_replace_file(struct discover_context *ctx, file->dev = dev; file->name = filename; list_add(&test->files, &file->list); - } else { - talloc_free(file->data); } file->data = talloc_memdup(test, buf, len); file->size = len; return 0; } + +int parser_request_url(struct discover_context *ctx, struct pb_url *url, + char **buf, int *len) +{ + struct parser_test *test = ctx->test_data; + struct test_file *file; + char *tmp; + + list_for_each_entry(&test->files, file, list) { + if (strcmp(file->name, url->file)) + continue; + + /* the read_file() interface always adds a trailing null + * for string-safety; do the same here */ + tmp = talloc_array(test, char, file->size + 1); + memcpy(tmp, file->data, file->size); + tmp[file->size] = '\0'; + *buf = tmp; + *len = file->size; + return 0; + } + + return -1; +} + int test_run_parser(struct parser_test *test, const char *parser_name) { struct p_item* i; @@ -224,7 +263,7 @@ int test_run_parser(struct parser_test *test, const char *parser_name) if (strcmp(i->parser->name, parser_name)) continue; test->ctx->parser = i->parser; - return i->parser->parse(test->ctx, test->conf.buf, test->conf.size); + return i->parser->parse(test->ctx); } errx(EXIT_FAILURE, "%s: parser '%s' not found", __func__, parser_name); @@ -419,3 +458,62 @@ void __check_not_present_resource(struct resource *res, if (res) errx(EXIT_FAILURE, "%s:%d: Resource present", file, line); } + +static void dump_file_data(const void *buf, int len) +{ + int i, j, hex_len = strlen("00 "); + const int row_len = 16; + + for (i = 0; i < len; i += row_len) { + char hbuf[row_len * hex_len + 1]; + char cbuf[row_len + strlen("|") + 1]; + + for (j = 0; (j < row_len) && ((i+j) < len); j++) { + char c = ((const char *)buf)[i + j]; + + snprintf(hbuf + j * hex_len, hex_len + 1, "%02x ", c); + + if (!isprint(c)) + c = '.'; + + snprintf(cbuf + j, hex_len + 1, "%c", c); + } + + strcat(cbuf, "|"); + + fprintf(stderr, "%08x %*s |%s\n", i, + 0 - (int)sizeof(hbuf) + 1, hbuf, cbuf); + } +} + +void __check_file_contents(struct parser_test *test, + struct discover_device *dev, const char *filename, + const char *buf, int len, + const char *srcfile, int srcline) +{ + struct test_file *f, *file = NULL; + + list_for_each_entry(&test->files, f, list) { + if (f->dev != dev) + continue; + if (strcmp(f->name, filename)) + continue; + + file = f; + break; + } + + if (!file) + errx(EXIT_FAILURE, "%s:%d: File '%s' not found", + srcfile, srcline, filename); + + if (file->size != len || memcmp(file->data, buf, len)) { + fprintf(stderr, "%s:%d: File '%s' data/size mismatch\n", + srcfile, srcline, filename); + fprintf(stderr, "Expected:\n"); + dump_file_data(buf, len); + fprintf(stderr, "Got:\n"); + dump_file_data(file->data, file->size); + exit(EXIT_FAILURE); + } +}