X-Git-Url: https://git.ozlabs.org/?a=blobdiff_plain;f=test%2Fparser%2Futils.c;h=838250b50dc1708fdd81578e5ac99b50fc1ad89a;hb=dea7842fb28ff055b4e0f43a6a1fdaf3c4b5ba89;hp=083d916b082fd4cda6ba3af8a59b370ffa9d5b0c;hpb=1b646fb733ef99b1dc1862276ae3595bdeaf355b;p=petitboot diff --git a/test/parser/utils.c b/test/parser/utils.c index 083d916..838250b 100644 --- a/test/parser/utils.c +++ b/test/parser/utils.c @@ -15,6 +15,7 @@ #include "device-handler.h" #include "parser.h" #include "resource.h" +#include "event.h" #include "parser-test.h" @@ -25,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; @@ -112,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); @@ -134,22 +142,18 @@ 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, @@ -158,6 +162,7 @@ void test_add_file_data(struct parser_test *test, struct discover_device *dev, struct test_file *file; file = talloc_zero(test, struct test_file); + file->type = TEST_FILE; file->dev = dev; file->name = filename; file->data = talloc_memdup(test, data, size); @@ -165,6 +170,28 @@ void test_add_file_data(struct parser_test *test, struct discover_device *dev, 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, @@ -179,6 +206,8 @@ int parser_request_file(struct discover_context *ctx, continue; if (strcmp(file->name, filename)) continue; + if (file->type != TEST_FILE) + continue; /* the read_file() interface always adds a trailing null * for string-safety; do the same here */ @@ -193,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) @@ -221,6 +269,34 @@ int parser_replace_file(struct discover_context *ctx, 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; @@ -229,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); @@ -267,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) {