Add the start of a test suite for the core razor functionality.
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 +}