Add the start of a test suite for the core razor functionality.
11 #define XML_BUFFER_SIZE 4096
14 parse_xml_file(const char *filename,
15 XML_StartElementHandler start,
16 XML_EndElementHandler end,
23 parser = XML_ParserCreate(NULL);
24 XML_SetElementHandler(parser, start, end);
25 XML_SetUserData(parser, data);
27 buffer = XML_GetBuffer(parser, XML_BUFFER_SIZE);
29 fd = open(filename, O_RDONLY);
31 fprintf(stderr, "open: %m\n");
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)));
46 fprintf(stderr, "read: %m\n");
55 struct razor_set *set;
56 struct test_set *next;
60 struct razor_importer *importer;
61 struct test_set *sets;
65 get_atts(const char **atts, ...)
68 const char *name, **ptr;
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)
83 parse_property(struct test_context *ctx, const char **atts,
84 enum razor_property_type type)
86 const char *name = NULL, *version = NULL;
89 for (i = 0; atts[i]; i += 2) {
90 if (strcmp(atts[i], "name") == 0)
92 else if (strcmp(atts[i], "eq") == 0)
93 version = atts[i + 1];
97 fprintf(stderr, "no name specified for property\n");
101 razor_importer_add_property(ctx->importer, name, version, type);
105 start_test_sets_element(void *data, const char *element, const char **atts)
107 struct test_context *ctx = data;
108 struct test_set *set;
109 const char *name, *version;
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;
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);
139 end_test_sets_element (void *data, const char *name)
141 struct test_context *ctx = data;
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);
150 int main(int argc, char *argv[])
152 struct test_context ctx;
153 struct test_set *set;
156 fprintf(stderr, "usage: %s SETS-FILE TESTS-FILE\n", argv[0]);
160 memset(&ctx, 0, sizeof ctx);
161 parse_xml_file(argv[1],
162 start_test_sets_element,
163 end_test_sets_element,
166 for (set = ctx.sets; set != NULL; set = set->next)
167 printf("set %s\n", set->name);