diff options
Diffstat (limited to 'src/dumm/main.c')
-rw-r--r-- | src/dumm/main.c | 75 |
1 files changed, 69 insertions, 6 deletions
diff --git a/src/dumm/main.c b/src/dumm/main.c index b4c435256..d6e142e24 100644 --- a/src/dumm/main.c +++ b/src/dumm/main.c @@ -21,6 +21,8 @@ #include <library.h> #include <readline/readline.h> #include <readline/history.h> +#include <dlfcn.h> +#include <dirent.h> #include "dumm.h" @@ -469,17 +471,73 @@ static void bridge_list_menu() } } -static void scenario_menu() +static void template_menu() { char *name; - name = get_line("scenario name (or 'none'): "); + name = get_line("template name (or 'none'): "); - dumm->load_scenario(dumm, streq(name, "none") ? NULL : name); + dumm->load_template(dumm, streq(name, "none") ? NULL : name); free(name); } +typedef bool (*uml_test_t)(dumm_t *dumm); + +static void test_menu() +{ + char *name; + void *handle; + struct dirent *ent; + DIR *dir; + uml_test_t test; + + name = get_line("test name: "); + + dir = opendir("tests"); + if (dir) + { + while ((ent = readdir(dir))) + { + char buf[PATH_MAX]; + size_t len; + + len = strlen(ent->d_name); + if (strlen(ent->d_name) < 4 || !streq(ent->d_name + len - 3, ".so")) + { + continue; + } + + snprintf(buf, sizeof(buf), "%s/%s", "tests", ent->d_name); + handle = dlopen(buf, RTLD_LAZY); + if (!handle) + { + printf("failed to open test %s\n", ent->d_name); + continue; + } + test = dlsym(handle, "test"); + if (test && dumm->load_template(dumm, ent->d_name)) + { + printf("running test %s: ", ent->d_name); + if (test(dumm)) + { + printf("success\n"); + } + else + { + printf("failed\n"); + } + } + else + { + printf("failed to open test %s\n", ent->d_name); + } + dlclose(handle); + } + } + free(name); +} + /** * Signal handler */ @@ -552,16 +610,21 @@ int main(int argc, char *argv[]) { bridge_list_menu(); } - else if (streq(line, "scenario")) + else if (streq(line, "template")) + { + template_menu(); + } + else if (streq(line, "test")) { - scenario_menu(); + test_menu(); } else { - printf("quit|guest|bridge|scenario\n"); + printf("quit|guest|bridge|template|test\n"); } free(line); } + dumm->load_template(dumm, NULL); dumm->destroy(dumm); clear_history(); return 0; |