struct parser *parser;
};
+struct test_file {
+ struct discover_device *dev;
+ const char *name;
+ void *data;
+ int size;
+ struct list_item list;
+};
+
STATIC_LIST(parsers);
void __register_parser(struct parser *parser)
}
static struct discover_device *test_create_device_simple(
- struct discover_context *ctx)
+ struct parser_test *test)
{
static int dev_idx;
char name[10];
sprintf(name, "__test%d", dev_idx++);
- return test_create_device(ctx, name);
+ return test_create_device(test, name);
}
-struct discover_device *test_create_device(struct discover_context *ctx,
+struct discover_device *test_create_device(struct parser_test *test,
const char *name)
{
struct discover_device *dev;
- dev = talloc_zero(ctx, struct discover_device);
- dev->device = talloc_zero(dev, struct device);
-
- list_init(&dev->boot_options);
+ dev = discover_device_create(test->handler, name);
dev->device->id = talloc_strdup(dev, name);
dev->device_path = talloc_asprintf(dev, "/dev/%s", name);
dev->mount_path = talloc_asprintf(dev, "/test/mount/%s", name);
+ dev->mounted = true;
return dev;
}
assert(ctx);
list_init(&ctx->boot_options);
- ctx->device = test_create_device_simple(ctx);
+ ctx->device = test_create_device_simple(test);
+ ctx->test_data = test;
+ device_handler_add_device(test->handler, ctx->device);
return ctx;
}
+extern struct config *test_config_init(struct parser_test *test);
+
struct parser_test *test_init(void)
{
struct parser_test *test;
test = talloc_zero(NULL, struct parser_test);
+ test->config = test_config_init(test);
test->handler = device_handler_init(NULL, NULL, 0);
test->ctx = test_create_context(test);
+ list_init(&test->files);
return test;
}
assert(test->ctx->conf_url);
}
+void test_add_file_data(struct parser_test *test, struct discover_device *dev,
+ const char *filename, 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->size = size;
+ list_add(&test->files, &file->list);
+}
+
+
+int parser_request_file(struct discover_context *ctx,
+ struct discover_device *dev, const char *filename,
+ char **buf, int *len)
+{
+ struct parser_test *test = ctx->test_data;
+ struct test_file *file;
+
+ list_for_each_entry(&test->files, file, list) {
+ if (file->dev != dev)
+ continue;
+ if (strcmp(file->name, filename))
+ continue;
+
+ *buf = talloc_memdup(test, file->data, file->size);
+ *len = file->size;
+ return 0;
+ }
+
+ return -1;
+}
+
+int parser_replace_file(struct discover_context *ctx,
+ struct discover_device *dev, const char *filename,
+ char *buf, int len)
+{
+ struct parser_test *test = ctx->test_data;
+ struct test_file *f, *file;
+
+ list_for_each_entry(&test->files, f, list) {
+ if (f->dev != dev)
+ continue;
+ if (strcmp(f->name, filename))
+ continue;
+
+ file = f;
+ break;
+ }
+
+ if (!file) {
+ file = talloc_zero(test, struct test_file);
+ 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 test_run_parser(struct parser_test *test, const char *parser_name)
{
struct p_item* i;
resource_resolve(handler, opt->source, opt->icon);
}
-extern void device_handler_add_device(struct device_handler *handler,
- struct discover_device *dev);
-
void test_hotplug_device(struct parser_test *test, struct discover_device *dev)
{
struct discover_boot_option *opt;
const char *file, int line)
{
struct discover_boot_option *opt;
- int i = 0;
+ int defaults = 0, i = 0;
- list_for_each_entry(&ctx->boot_options, opt, list)
+ list_for_each_entry(&ctx->boot_options, opt, list) {
i++;
+ if (opt->option->is_default)
+ defaults++;
+ }
+
+ if (defaults > 1) {
+ fprintf(stderr, "%s:%d: parser returned multiple default "
+ "options\n", file, line);
+ exit(EXIT_FAILURE);
+ }
if (i == count)
return;
{
int rc;
+ if (!opt->option->boot_args && !args)
+ return;
+
if (!opt->option->boot_args) {
fprintf(stderr, "%s:%d: arg check failed\n", file, line);
fprintf(stderr, " no arguments parsed\n");