Add the start of a test suite for the core razor functionality.
authorKristian H?gsberg <krh@redhat.com>
Tue Nov 13 01:07:03 2007 -0500 (2007-11-13)
changeset 8072671f8e5741
parent 79 9f302fa29d83
child 81 7bc11dfb4bbd
Add the start of a test suite for the core razor functionality.
Makefile
sets.xml
test-driver.c
     1.1 --- a/Makefile	Mon Nov 12 00:05:03 2007 -0500
     1.2 +++ b/Makefile	Tue Nov 13 01:07:03 2007 -0500
     1.3 @@ -1,7 +1,14 @@
     1.4  CFLAGS = -Wall -g -O2
     1.5  LDLIBS = -lexpat -lz -g -lrpm -lcurl
     1.6  
     1.7 -razor : razor.o import.o sha1.o main.o rpm.o
     1.8 +all : razor test-driver
     1.9 +
    1.10 +razor : razor.o import.o main.o rpm.o
    1.11 +
    1.12 +test-driver : razor.o test-driver.o
    1.13 +
    1.14 +test : test-driver
    1.15 +	./test-driver sets.xml test.xml
    1.16  
    1.17  clean :
    1.18  	rm -f *.o razor
     2.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     2.2 +++ b/sets.xml	Tue Nov 13 01:07:03 2007 -0500
     2.3 @@ -0,0 +1,11 @@
     2.4 +<test-sets>
     2.5 +  <set name="b">
     2.6 +    <package name="bash" version="3.2-18.fc8">
     2.7 +      <requires name="libc.so.6"/>
     2.8 +      <requires name="config(bash)" eq="3.2-18.fc8"/>
     2.9 +      <provides name="bash" eq="3.2-18.fc8"/>
    2.10 +      <file name="/bin"/>
    2.11 +      <file name="/bin/bash"/>
    2.12 +    </package>
    2.13 +  </set>
    2.14 +</test-sets>
     3.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     3.2 +++ b/test-driver.c	Tue Nov 13 01:07:03 2007 -0500
     3.3 @@ -0,0 +1,170 @@
     3.4 +#include <stdio.h>
     3.5 +#include <string.h>
     3.6 +#include <stdarg.h>
     3.7 +#include <unistd.h>
     3.8 +#include <fcntl.h>
     3.9 +#include <errno.h>
    3.10 +#include <expat.h>
    3.11 +
    3.12 +#include "razor.h"
    3.13 +
    3.14 +#define XML_BUFFER_SIZE 4096
    3.15 +
    3.16 +static void
    3.17 +parse_xml_file(const char *filename,
    3.18 +	       XML_StartElementHandler start,
    3.19 +	       XML_EndElementHandler end,
    3.20 +	       void *data)
    3.21 +{
    3.22 +	XML_Parser parser;
    3.23 +	char *buffer;
    3.24 +	int fd, len, err;
    3.25 +
    3.26 +	parser = XML_ParserCreate(NULL);
    3.27 +	XML_SetElementHandler(parser, start, end);
    3.28 +	XML_SetUserData(parser, data);
    3.29 +
    3.30 +	buffer = XML_GetBuffer(parser, XML_BUFFER_SIZE);
    3.31 +
    3.32 +	fd = open(filename, O_RDONLY);
    3.33 +	if (fd < 0) {
    3.34 +		fprintf(stderr, "open: %m\n");
    3.35 +		exit(-1);
    3.36 +	}
    3.37 +
    3.38 +	while (len = read(fd, buffer, XML_BUFFER_SIZE), len > 0) {
    3.39 +		err = XML_ParseBuffer(parser, len, len == 0);
    3.40 +		if (err == XML_STATUS_ERROR) {
    3.41 +			fprintf(stderr, "parse error at line %lu:\n%s\n",
    3.42 +				XML_GetCurrentLineNumber(parser),
    3.43 +				XML_ErrorString(XML_GetErrorCode(parser)));
    3.44 +			exit(-1);
    3.45 +		}
    3.46 +	}
    3.47 +
    3.48 +	if (fd < 0) {
    3.49 +		fprintf(stderr, "read: %m\n");
    3.50 +		exit(-1);
    3.51 +	}
    3.52 +
    3.53 +	close(fd);
    3.54 +}
    3.55 +
    3.56 +struct test_set {
    3.57 +	char *name;
    3.58 +	struct razor_set *set;
    3.59 +	struct test_set *next;
    3.60 +};
    3.61 +
    3.62 +struct test_context {
    3.63 +	struct razor_importer *importer;
    3.64 +	struct test_set *sets;
    3.65 +};
    3.66 +
    3.67 +static void
    3.68 +get_atts(const char **atts, ...)
    3.69 +{
    3.70 +	va_list ap;
    3.71 +	const char *name, **ptr;
    3.72 +	int i;
    3.73 +
    3.74 +	va_start(ap, atts);
    3.75 +	while (name = va_arg(ap, const char *), name != NULL) {
    3.76 +		ptr = va_arg(ap, const char **);
    3.77 +		for (i = 0; atts[i]; i += 2) {
    3.78 +			if (strcmp(atts[i], name) == 0)
    3.79 +				*ptr = atts[i + 1];
    3.80 +		}
    3.81 +	}
    3.82 +	va_end(ap);
    3.83 +}
    3.84 +
    3.85 +static void
    3.86 +parse_property(struct test_context *ctx, const char **atts,
    3.87 +	       enum razor_property_type type)
    3.88 +{
    3.89 +	const char *name = NULL, *version = NULL;
    3.90 +	int i;
    3.91 +
    3.92 +	for (i = 0; atts[i]; i += 2) {
    3.93 +		if (strcmp(atts[i], "name") == 0)
    3.94 +			name = atts[i + 1];
    3.95 +		else if (strcmp(atts[i], "eq") == 0)
    3.96 +			version = atts[i + 1];
    3.97 +	}
    3.98 +
    3.99 +	if (name == NULL) {
   3.100 +		fprintf(stderr, "no name specified for property\n");
   3.101 +		exit(-1);
   3.102 +	}
   3.103 +	
   3.104 +	razor_importer_add_property(ctx->importer, name, version, type);
   3.105 +}
   3.106 +
   3.107 +static void
   3.108 +start_test_sets_element(void *data, const char *element, const char **atts)
   3.109 +{
   3.110 +	struct test_context *ctx = data;
   3.111 +	struct test_set *set;
   3.112 +	const char *name, *version;
   3.113 +
   3.114 +	if (strcmp(element, "set") == 0) {
   3.115 +		get_atts(atts, "name", &name, NULL);
   3.116 +		ctx->importer = razor_importer_new();	
   3.117 +		set = malloc(sizeof *set);
   3.118 +		set->name = strdup(name);
   3.119 +		set->next = ctx->sets;
   3.120 +		ctx->sets = set;
   3.121 +	} else if (strcmp(element, "package") == 0) {
   3.122 +		get_atts(atts, "name", &name, "version", &version, NULL);
   3.123 +		razor_importer_begin_package(ctx->importer, name, version);
   3.124 +	} else if (strcmp(element, "requires") == 0) {
   3.125 +		parse_property(ctx, atts, RAZOR_PROPERTY_REQUIRES);
   3.126 +	} else if (strcmp(element, "provides") == 0) {
   3.127 +		parse_property(ctx, atts, RAZOR_PROPERTY_PROVIDES);
   3.128 +	} else if (strcmp(element, "obsoletes") == 0) {
   3.129 +		parse_property(ctx, atts, RAZOR_PROPERTY_OBSOLETES);
   3.130 +	} else if (strcmp(element, "conflicts") == 0) {
   3.131 +		parse_property(ctx, atts, RAZOR_PROPERTY_CONFLICTS);
   3.132 +	} else if (strcmp(element, "file") == 0) {
   3.133 +		get_atts(atts, "name", &name, NULL);
   3.134 +		razor_importer_add_file(ctx->importer, name);		
   3.135 +	} else if (strcmp(element, "dir") == 0) {
   3.136 +		get_atts(atts, "name", &name, NULL);
   3.137 +		razor_importer_add_file(ctx->importer, name);		
   3.138 +	}
   3.139 +}
   3.140 +
   3.141 +static void
   3.142 +end_test_sets_element (void *data, const char *name)
   3.143 +{
   3.144 +	struct test_context *ctx = data;
   3.145 +
   3.146 +	if (strcmp(name, "set") == 0) {
   3.147 +		ctx->sets->set = razor_importer_finish(ctx->importer);
   3.148 +	} else if (strcmp(name, "package") == 0) {
   3.149 +		razor_importer_finish_package(ctx->importer);
   3.150 +	}
   3.151 +}
   3.152 +
   3.153 +int main(int argc, char *argv[])
   3.154 +{
   3.155 +	struct test_context ctx;
   3.156 +	struct test_set *set;
   3.157 +
   3.158 +	if (argc != 3) {
   3.159 +		fprintf(stderr, "usage: %s SETS-FILE TESTS-FILE\n", argv[0]);
   3.160 +		exit(-1);			
   3.161 +	}
   3.162 +
   3.163 +	memset(&ctx, 0, sizeof ctx);
   3.164 +	parse_xml_file(argv[1],
   3.165 +		       start_test_sets_element,
   3.166 +		       end_test_sets_element,
   3.167 +		       &ctx);
   3.168 +
   3.169 +	for (set = ctx.sets; set != NULL; set = set->next)
   3.170 +		printf("set %s\n", set->name);
   3.171 +
   3.172 +	return 0;
   3.173 +}