1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/test-driver.c Thu Dec 27 15:47:09 2007 -0500
1.3 @@ -0,0 +1,170 @@
1.4 +#include <stdio.h>
1.5 +#include <string.h>
1.6 +#include <stdarg.h>
1.7 +#include <unistd.h>
1.8 +#include <fcntl.h>
1.9 +#include <errno.h>
1.10 +#include <expat.h>
1.11 +
1.12 +#include "razor.h"
1.13 +
1.14 +#define XML_BUFFER_SIZE 4096
1.15 +
1.16 +static void
1.17 +parse_xml_file(const char *filename,
1.18 + XML_StartElementHandler start,
1.19 + XML_EndElementHandler end,
1.20 + void *data)
1.21 +{
1.22 + XML_Parser parser;
1.23 + char *buffer;
1.24 + int fd, len, err;
1.25 +
1.26 + parser = XML_ParserCreate(NULL);
1.27 + XML_SetElementHandler(parser, start, end);
1.28 + XML_SetUserData(parser, data);
1.29 +
1.30 + buffer = XML_GetBuffer(parser, XML_BUFFER_SIZE);
1.31 +
1.32 + fd = open(filename, O_RDONLY);
1.33 + if (fd < 0) {
1.34 + fprintf(stderr, "open: %m\n");
1.35 + exit(-1);
1.36 + }
1.37 +
1.38 + while (len = read(fd, buffer, XML_BUFFER_SIZE), len > 0) {
1.39 + err = XML_ParseBuffer(parser, len, len == 0);
1.40 + if (err == XML_STATUS_ERROR) {
1.41 + fprintf(stderr, "parse error at line %lu:\n%s\n",
1.42 + XML_GetCurrentLineNumber(parser),
1.43 + XML_ErrorString(XML_GetErrorCode(parser)));
1.44 + exit(-1);
1.45 + }
1.46 + }
1.47 +
1.48 + if (fd < 0) {
1.49 + fprintf(stderr, "read: %m\n");
1.50 + exit(-1);
1.51 + }
1.52 +
1.53 + close(fd);
1.54 +}
1.55 +
1.56 +struct test_set {
1.57 + char *name;
1.58 + struct razor_set *set;
1.59 + struct test_set *next;
1.60 +};
1.61 +
1.62 +struct test_context {
1.63 + struct razor_importer *importer;
1.64 + struct test_set *sets;
1.65 +};
1.66 +
1.67 +static void
1.68 +get_atts(const char **atts, ...)
1.69 +{
1.70 + va_list ap;
1.71 + const char *name, **ptr;
1.72 + int i;
1.73 +
1.74 + va_start(ap, atts);
1.75 + while (name = va_arg(ap, const char *), name != NULL) {
1.76 + ptr = va_arg(ap, const char **);
1.77 + for (i = 0; atts[i]; i += 2) {
1.78 + if (strcmp(atts[i], name) == 0)
1.79 + *ptr = atts[i + 1];
1.80 + }
1.81 + }
1.82 + va_end(ap);
1.83 +}
1.84 +
1.85 +static void
1.86 +parse_property(struct test_context *ctx, const char **atts,
1.87 + enum razor_property_type type)
1.88 +{
1.89 + const char *name = NULL, *version = NULL;
1.90 + int i;
1.91 +
1.92 + for (i = 0; atts[i]; i += 2) {
1.93 + if (strcmp(atts[i], "name") == 0)
1.94 + name = atts[i + 1];
1.95 + else if (strcmp(atts[i], "eq") == 0)
1.96 + version = atts[i + 1];
1.97 + }
1.98 +
1.99 + if (name == NULL) {
1.100 + fprintf(stderr, "no name specified for property\n");
1.101 + exit(-1);
1.102 + }
1.103 +
1.104 + razor_importer_add_property(ctx->importer, name, version, type);
1.105 +}
1.106 +
1.107 +static void
1.108 +start_test_sets_element(void *data, const char *element, const char **atts)
1.109 +{
1.110 + struct test_context *ctx = data;
1.111 + struct test_set *set;
1.112 + const char *name, *version;
1.113 +
1.114 + if (strcmp(element, "set") == 0) {
1.115 + get_atts(atts, "name", &name, NULL);
1.116 + ctx->importer = razor_importer_new();
1.117 + set = malloc(sizeof *set);
1.118 + set->name = strdup(name);
1.119 + set->next = ctx->sets;
1.120 + ctx->sets = set;
1.121 + } else if (strcmp(element, "package") == 0) {
1.122 + get_atts(atts, "name", &name, "version", &version, NULL);
1.123 + razor_importer_begin_package(ctx->importer, name, version);
1.124 + } else if (strcmp(element, "requires") == 0) {
1.125 + parse_property(ctx, atts, RAZOR_PROPERTY_REQUIRES);
1.126 + } else if (strcmp(element, "provides") == 0) {
1.127 + parse_property(ctx, atts, RAZOR_PROPERTY_PROVIDES);
1.128 + } else if (strcmp(element, "obsoletes") == 0) {
1.129 + parse_property(ctx, atts, RAZOR_PROPERTY_OBSOLETES);
1.130 + } else if (strcmp(element, "conflicts") == 0) {
1.131 + parse_property(ctx, atts, RAZOR_PROPERTY_CONFLICTS);
1.132 + } else if (strcmp(element, "file") == 0) {
1.133 + get_atts(atts, "name", &name, NULL);
1.134 + razor_importer_add_file(ctx->importer, name);
1.135 + } else if (strcmp(element, "dir") == 0) {
1.136 + get_atts(atts, "name", &name, NULL);
1.137 + razor_importer_add_file(ctx->importer, name);
1.138 + }
1.139 +}
1.140 +
1.141 +static void
1.142 +end_test_sets_element (void *data, const char *name)
1.143 +{
1.144 + struct test_context *ctx = data;
1.145 +
1.146 + if (strcmp(name, "set") == 0) {
1.147 + ctx->sets->set = razor_importer_finish(ctx->importer);
1.148 + } else if (strcmp(name, "package") == 0) {
1.149 + razor_importer_finish_package(ctx->importer);
1.150 + }
1.151 +}
1.152 +
1.153 +int main(int argc, char *argv[])
1.154 +{
1.155 + struct test_context ctx;
1.156 + struct test_set *set;
1.157 +
1.158 + if (argc != 3) {
1.159 + fprintf(stderr, "usage: %s SETS-FILE TESTS-FILE\n", argv[0]);
1.160 + exit(-1);
1.161 + }
1.162 +
1.163 + memset(&ctx, 0, sizeof ctx);
1.164 + parse_xml_file(argv[1],
1.165 + start_test_sets_element,
1.166 + end_test_sets_element,
1.167 + &ctx);
1.168 +
1.169 + for (set = ctx.sets; set != NULL; set = set->next)
1.170 + printf("set %s\n", set->name);
1.171 +
1.172 + return 0;
1.173 +}