File: xml_test.c

package info (click to toggle)
fort-validator 1.6.7-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 3,064 kB
  • sloc: ansic: 33,015; makefile: 239; sh: 47; javascript: 30; xml: 15
file content (104 lines) | stat: -rw-r--r-- 2,138 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#include <check.h>
#include <errno.h>
#include <stdlib.h>
#include <libxml/xmlreader.h>

#include "mock.c"
#include "xml/relax_ng.c"

struct reader_ctx {
	unsigned int delta_count;
	unsigned int snapshot_count;
	char *serial;
};

static int
reader_cb(xmlTextReaderPtr reader, void *arg)
{
	struct reader_ctx *ctx = arg;
	xmlReaderTypes type;
	xmlChar const *name;
	xmlChar *tmp_char;
	char *tmp;

	name = xmlTextReaderConstLocalName(reader);
	type = xmlTextReaderNodeType(reader);
	switch (type) {
	case XML_READER_TYPE_ELEMENT:
		if (xmlStrEqual(name, BAD_CAST "delta")) {
			ctx->delta_count++;
		} else if (xmlStrEqual(name, BAD_CAST "snapshot")) {
			ctx->snapshot_count++;
		} else if (xmlStrEqual(name, BAD_CAST "notification")) {
			tmp_char = xmlTextReaderGetAttribute(reader,
			    BAD_CAST "serial");
			if (tmp_char == NULL)
				return -EINVAL;
			tmp = malloc(xmlStrlen(tmp_char) + 1);
			if (tmp == NULL) {
				xmlFree(tmp_char);
				return -ENOMEM;
			}

			memcpy(tmp, tmp_char, xmlStrlen(tmp_char));
			tmp[xmlStrlen(tmp_char)] = '\0';
			xmlFree(tmp_char);
			ctx->serial = tmp;
		} else {
			return -EINVAL;
		}
		break;
	default:
		return 0;
	}

	return 0;
}

START_TEST(relax_ng_valid)
{
	struct reader_ctx ctx;
	char const *url = "xml/notification.xml";

	ctx.delta_count = 0;
	ctx.snapshot_count = 0;
	ctx.serial = NULL;
	relax_ng_init();
	ck_assert_int_eq(relax_ng_parse(url, reader_cb, &ctx), 0);
	ck_assert_int_eq(ctx.snapshot_count, 1);
	ck_assert_int_eq(ctx.delta_count, 5);
	ck_assert_str_eq(ctx.serial, "1510");
	free(ctx.serial);
	relax_ng_cleanup();
}
END_TEST

static Suite *xml_load_suite(void)
{
	Suite *suite;
	TCase *validate;

	validate = tcase_create("Validate");
	tcase_add_test(validate, relax_ng_valid);

	suite = suite_create("xml_test()");
	suite_add_tcase(suite, validate);

	return suite;
}

int main(void)
{
	Suite *suite;
	SRunner *runner;
	int tests_failed;

	suite = xml_load_suite();

	runner = srunner_create(suite);
	srunner_run_all(runner, CK_NORMAL);
	tests_failed = srunner_ntests_failed(runner);
	srunner_free(runner);

	return (tests_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
}