]> git.ozlabs.org Git - petitboot/blobdiff - test/parser/utils.c
Update tests to support changes to pxe_parser
[petitboot] / test / parser / utils.c
index 838250b50dc1708fdd81578e5ac99b50fc1ad89a..5cebc99062ad23a06d6217804cf57ae88a298f74 100644 (file)
@@ -16,6 +16,9 @@
 #include "parser.h"
 #include "resource.h"
 #include "event.h"
+#include "platform.h"
+#include "paths.h"
+#include "parser-conf.h"
 
 #include "parser-test.h"
 
@@ -95,14 +98,26 @@ static struct discover_context *test_create_context(struct parser_test *test)
        return ctx;
 }
 
-extern struct config *test_config_init(struct parser_test *test);
+/* define our own test platform */
+static bool test_platform_probe(struct platform *p __attribute__((unused)),
+               void *ctx __attribute__((unused)))
+{
+       return true;
+}
+
+struct platform test_platform = {
+       .name = "test",
+       .probe = test_platform_probe,
+};
+
+register_platform(test_platform);
 
 struct parser_test *test_init(void)
 {
        struct parser_test *test;
 
        test = talloc_zero(NULL, struct parser_test);
-       test->config = test_config_init(test);
+       platform_init(NULL);
        test->handler = device_handler_init(NULL, NULL, 0);
        test->ctx = test_create_context(test);
        list_init(&test->files);
@@ -114,6 +129,7 @@ void test_fini(struct parser_test *test)
 {
        device_handler_destroy(test->handler);
        talloc_free(test);
+       platform_fini();
 }
 
 void __test_read_conf_data(struct parser_test *test,
@@ -179,6 +195,9 @@ void test_add_dir(struct parser_test *test, struct discover_device *dev,
        file->type = TEST_DIR;
        file->dev = dev;
        file->name = dirname;
+       /* Pick a non-zero size for directories so that "[ -s <dir
+        * path> ]" sees that the file has non-zero size. */
+       file->size = 1;
        list_add(&test->files, &file->list);
 }
 
@@ -193,6 +212,11 @@ void test_set_event_param(struct event *event, const char *name,
         event_set_param(event, name, value);
 }
 
+void test_set_event_device(struct event *event, const char *dev)
+{
+       event->device = talloc_strdup(event, dev);
+}
+
 int parser_request_file(struct discover_context *ctx,
                struct discover_device *dev, const char *filename,
                char **buf, int *len)
@@ -222,20 +246,34 @@ 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)
+int parser_stat_path(struct discover_context *ctx,
+               struct discover_device *dev, const char *path,
+               struct stat *statbuf)
 {
        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))
+               if (strcmp(file->name, path))
                        continue;
-               return file->type == TEST_DIR ? 0 : -1;
+
+               statbuf->st_size = (off_t)file->size;
+               switch (file->type) {
+               case TEST_FILE:
+                       statbuf->st_mode = S_IFREG;
+                       break;
+               case TEST_DIR:
+                       statbuf->st_mode = S_IFDIR;
+                       break;
+               default:
+                       fprintf(stderr, "%s: bad test file mode %d!", __func__,
+                               file->type);
+                       exit(EXIT_FAILURE);
+               }
+
+               return 0;
        }
 
        return -1;
@@ -270,6 +308,61 @@ int parser_replace_file(struct discover_context *ctx,
        return 0;
 }
 
+struct load_url_result *load_url_async(void *ctx, struct pb_url *url,
+               load_url_complete async_cb, void *async_data)
+{
+       struct conf_context *conf = async_data;
+       struct parser_test *test = conf->dc->test_data;
+       struct load_url_result *result;
+       char tmp[] = "/tmp/pb-XXXXXX";
+       ssize_t rc = -1, sz = 0;
+       struct test_file *file;
+       int fd;
+
+       fd = mkstemp(tmp);
+
+       if (fd < 0)
+               return NULL;
+
+       /* Some parsers will expect to need to read a file, so write the
+        * specified file to a temporary file */
+       list_for_each_entry(&test->files, file, list) {
+               if (file->dev)
+                       continue;
+
+               if (strcmp(file->name, url->full))
+                       continue;
+
+               while (sz < file->size) {
+                       rc = write(fd, file->data, file->size);
+                       if (rc < 0) {
+                               fprintf(stderr,
+                                       "Failed to write to tmpfile, %m\n");
+                               break;
+                       }
+                       sz += rc;
+               }
+               break;
+       }
+
+       close(fd);
+
+       result = talloc_zero(ctx, struct load_url_result);
+       if (!result)
+               return NULL;
+
+       result->local = talloc_strdup(result, tmp);
+       if (rc < 0)
+               result->status = LOAD_ERROR;
+       else
+               result->status = result->local ? LOAD_OK : LOAD_ERROR;
+       result->cleanup_local = true;
+
+       async_cb(result, conf);
+
+       return result;
+}
+
 int parser_request_url(struct discover_context *ctx, struct pb_url *url,
                char **buf, int *len)
 {