test-driver.c
author Kristian H?gsberg <krh@redhat.com>
Tue Nov 13 01:30:09 2007 -0500 (2007-11-13)
changeset 82 61fef906a84a
child 92 74f19848a71b
permissions -rw-r--r--
Dump a couple of ideas to TODO, prune a few old items.
     1 #include <stdio.h>
     2 #include <string.h>
     3 #include <stdarg.h>
     4 #include <unistd.h>
     5 #include <fcntl.h>
     6 #include <errno.h>
     7 #include <expat.h>
     8 
     9 #include "razor.h"
    10 
    11 #define XML_BUFFER_SIZE 4096
    12 
    13 static void
    14 parse_xml_file(const char *filename,
    15 	       XML_StartElementHandler start,
    16 	       XML_EndElementHandler end,
    17 	       void *data)
    18 {
    19 	XML_Parser parser;
    20 	char *buffer;
    21 	int fd, len, err;
    22 
    23 	parser = XML_ParserCreate(NULL);
    24 	XML_SetElementHandler(parser, start, end);
    25 	XML_SetUserData(parser, data);
    26 
    27 	buffer = XML_GetBuffer(parser, XML_BUFFER_SIZE);
    28 
    29 	fd = open(filename, O_RDONLY);
    30 	if (fd < 0) {
    31 		fprintf(stderr, "open: %m\n");
    32 		exit(-1);
    33 	}
    34 
    35 	while (len = read(fd, buffer, XML_BUFFER_SIZE), len > 0) {
    36 		err = XML_ParseBuffer(parser, len, len == 0);
    37 		if (err == XML_STATUS_ERROR) {
    38 			fprintf(stderr, "parse error at line %lu:\n%s\n",
    39 				XML_GetCurrentLineNumber(parser),
    40 				XML_ErrorString(XML_GetErrorCode(parser)));
    41 			exit(-1);
    42 		}
    43 	}
    44 
    45 	if (fd < 0) {
    46 		fprintf(stderr, "read: %m\n");
    47 		exit(-1);
    48 	}
    49 
    50 	close(fd);
    51 }
    52 
    53 struct test_set {
    54 	char *name;
    55 	struct razor_set *set;
    56 	struct test_set *next;
    57 };
    58 
    59 struct test_context {
    60 	struct razor_importer *importer;
    61 	struct test_set *sets;
    62 };
    63 
    64 static void
    65 get_atts(const char **atts, ...)
    66 {
    67 	va_list ap;
    68 	const char *name, **ptr;
    69 	int i;
    70 
    71 	va_start(ap, atts);
    72 	while (name = va_arg(ap, const char *), name != NULL) {
    73 		ptr = va_arg(ap, const char **);
    74 		for (i = 0; atts[i]; i += 2) {
    75 			if (strcmp(atts[i], name) == 0)
    76 				*ptr = atts[i + 1];
    77 		}
    78 	}
    79 	va_end(ap);
    80 }
    81 
    82 static void
    83 parse_property(struct test_context *ctx, const char **atts,
    84 	       enum razor_property_type type)
    85 {
    86 	const char *name = NULL, *version = NULL;
    87 	int i;
    88 
    89 	for (i = 0; atts[i]; i += 2) {
    90 		if (strcmp(atts[i], "name") == 0)
    91 			name = atts[i + 1];
    92 		else if (strcmp(atts[i], "eq") == 0)
    93 			version = atts[i + 1];
    94 	}
    95 
    96 	if (name == NULL) {
    97 		fprintf(stderr, "no name specified for property\n");
    98 		exit(-1);
    99 	}
   100 	
   101 	razor_importer_add_property(ctx->importer, name, version, type);
   102 }
   103 
   104 static void
   105 start_test_sets_element(void *data, const char *element, const char **atts)
   106 {
   107 	struct test_context *ctx = data;
   108 	struct test_set *set;
   109 	const char *name, *version;
   110 
   111 	if (strcmp(element, "set") == 0) {
   112 		get_atts(atts, "name", &name, NULL);
   113 		ctx->importer = razor_importer_new();	
   114 		set = malloc(sizeof *set);
   115 		set->name = strdup(name);
   116 		set->next = ctx->sets;
   117 		ctx->sets = set;
   118 	} else if (strcmp(element, "package") == 0) {
   119 		get_atts(atts, "name", &name, "version", &version, NULL);
   120 		razor_importer_begin_package(ctx->importer, name, version);
   121 	} else if (strcmp(element, "requires") == 0) {
   122 		parse_property(ctx, atts, RAZOR_PROPERTY_REQUIRES);
   123 	} else if (strcmp(element, "provides") == 0) {
   124 		parse_property(ctx, atts, RAZOR_PROPERTY_PROVIDES);
   125 	} else if (strcmp(element, "obsoletes") == 0) {
   126 		parse_property(ctx, atts, RAZOR_PROPERTY_OBSOLETES);
   127 	} else if (strcmp(element, "conflicts") == 0) {
   128 		parse_property(ctx, atts, RAZOR_PROPERTY_CONFLICTS);
   129 	} else if (strcmp(element, "file") == 0) {
   130 		get_atts(atts, "name", &name, NULL);
   131 		razor_importer_add_file(ctx->importer, name);		
   132 	} else if (strcmp(element, "dir") == 0) {
   133 		get_atts(atts, "name", &name, NULL);
   134 		razor_importer_add_file(ctx->importer, name);		
   135 	}
   136 }
   137 
   138 static void
   139 end_test_sets_element (void *data, const char *name)
   140 {
   141 	struct test_context *ctx = data;
   142 
   143 	if (strcmp(name, "set") == 0) {
   144 		ctx->sets->set = razor_importer_finish(ctx->importer);
   145 	} else if (strcmp(name, "package") == 0) {
   146 		razor_importer_finish_package(ctx->importer);
   147 	}
   148 }
   149 
   150 int main(int argc, char *argv[])
   151 {
   152 	struct test_context ctx;
   153 	struct test_set *set;
   154 
   155 	if (argc != 3) {
   156 		fprintf(stderr, "usage: %s SETS-FILE TESTS-FILE\n", argv[0]);
   157 		exit(-1);			
   158 	}
   159 
   160 	memset(&ctx, 0, sizeof ctx);
   161 	parse_xml_file(argv[1],
   162 		       start_test_sets_element,
   163 		       end_test_sets_element,
   164 		       &ctx);
   165 
   166 	for (set = ctx.sets; set != NULL; set = set->next)
   167 		printf("set %s\n", set->name);
   168 
   169 	return 0;
   170 }