X-Git-Url: http://git.ozlabs.org/?p=petitboot;a=blobdiff_plain;f=test%2Fparser%2Futils.c;h=838250b50dc1708fdd81578e5ac99b50fc1ad89a;hp=33efda80536f8354ebc4e10e6b64fe1299755831;hb=4896183708855fbfd0aa892537fbcc17ed7eb971;hpb=9fbd73a208c9465b4bf9e2c80c7290b72e62ead1 diff --git a/test/parser/utils.c b/test/parser/utils.c index 33efda8..838250b 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" @@ -24,6 +26,10 @@ struct p_item { struct test_file { struct discover_device *dev; + enum { + TEST_FILE, + TEST_DIR, + } type; const char *name; void *data; int size; @@ -111,17 +117,20 @@ void test_fini(struct parser_test *test) } void __test_read_conf_data(struct parser_test *test, + struct discover_device *dev, 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, dev, 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 +142,56 @@ 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->type = 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_add_dir(struct parser_test *test, struct discover_device *dev, + const char *dirname) +{ + struct test_file *file; + + file = talloc_zero(test, struct test_file); + file->type = TEST_DIR; + file->dev = dev; + file->name = dirname; + 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,14 +199,22 @@ 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) continue; if (strcmp(file->name, filename)) continue; + if (file->type != TEST_FILE) + 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; } @@ -186,6 +222,25 @@ int parser_request_file(struct discover_context *ctx, return -1; } +int parser_check_dir(struct discover_context *ctx, + struct discover_device *dev, const char *dirname) +{ + struct parser_test *test = ctx->test_data; + struct test_file *file; + + printf("%s: %s\n", __func__, dirname); + + list_for_each_entry(&test->files, file, list) { + if (file->dev != dev) + continue; + if (strcmp(file->name, dirname)) + continue; + return file->type == TEST_DIR ? 0 : -1; + } + + return -1; +} + int parser_replace_file(struct discover_context *ctx, struct discover_device *dev, const char *filename, char *buf, int len) @@ -208,14 +263,40 @@ 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 (file->dev) + continue; + + if (strcmp(file->name, url->full)) + 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 +305,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); @@ -262,6 +343,21 @@ void test_hotplug_device(struct parser_test *test, struct discover_device *dev) boot_option_resolve(test->handler, opt); } +void test_remove_device(struct parser_test *test, struct discover_device *dev) +{ + struct discover_boot_option *opt, *tmp; + + if (dev == test->ctx->device) { + list_for_each_entry_safe(&test->ctx->boot_options, + opt, tmp, list) { + list_remove(&opt->list); + talloc_free(opt); + } + } + + device_handler_remove(test->handler, dev); +} + struct discover_boot_option *get_boot_option(struct discover_context *ctx, int idx) { @@ -419,3 +515,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); + } +}