test-driver.c
changeset 81 7bc11dfb4bbd
child 92 74f19848a71b
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/test-driver.c	Tue Nov 13 01:08:08 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 +}