1 /**
2 * collectd - src/virt_test.c
3 * Copyright (C) 2016 Francesco Romani <fromani at redhat.com>
4 * Based on
5 * collectd - src/ceph_test.c
6 * Copyright (C) 2015 Florian octo Forster
7 *
8 * This program is free software; you can redistribute it and/or modify it
9 * under the terms of the GNU General Public License as published by the
10 * Free Software Foundation; only version 2 of the License is applicable.
11 *
12 * This program is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License along
18 * with this program; if not, write to the Free Software Foundation, Inc.,
19 * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20 *
21 * Authors:
22 * Florian octo Forster <octo at collectd.org>
23 **/
25 #include "virt.c" /* sic */
26 #include "testing.h"
28 #include <unistd.h>
30 static const char minimal_xml[] =
31 ""
32 "<?xml version=\"1.0\" encoding=\"utf-8\"?>"
33 "<domain type=\"kvm\" xmlns:ovirt=\"http://ovirt.org/vm/tune/1.0\">"
34 " <metadata/>"
35 "</domain>";
37 static const char minimal_metadata_xml[] =
38 ""
39 "<?xml version=\"1.0\" encoding=\"utf-8\"?>"
40 "<domain type=\"kvm\" xmlns:ovirt=\"http://ovirt.org/vm/tune/1.0\">"
41 " <metadata>"
42 " <ovirtmap:tag "
43 "xmlns:ovirtmap=\"http://ovirt.org/ovirtmap/tag/1.0\">virt-0</ovirtmap:tag>"
44 " </metadata>"
45 "</domain>";
47 struct xml_state {
48 xmlDocPtr xml_doc;
49 xmlXPathContextPtr xpath_ctx;
50 xmlXPathObjectPtr xpath_obj;
51 char tag[PARTITION_TAG_MAX_LEN];
52 };
54 static int init_state(struct xml_state *st, const char *xml) {
55 memset(st, 0, sizeof(*st));
57 st->xml_doc = xmlReadDoc((const xmlChar *)xml, NULL, NULL, XML_PARSE_NONET);
58 if (st->xml_doc == NULL) {
59 return -1;
60 }
61 st->xpath_ctx = xmlXPathNewContext(st->xml_doc);
62 if (st->xpath_ctx == NULL) {
63 return -1;
64 }
65 return 0;
66 }
68 static void fini_state(struct xml_state *st) {
69 if (st->xpath_ctx) {
70 xmlXPathFreeContext(st->xpath_ctx);
71 st->xpath_ctx = NULL;
72 }
73 if (st->xml_doc) {
74 xmlFreeDoc(st->xml_doc);
75 st->xml_doc = NULL;
76 }
77 }
79 #define TAG "virt-0"
81 DEF_TEST(lv_domain_get_tag_no_metadata_xml) {
82 int err;
83 struct xml_state st;
84 err = init_state(&st, minimal_xml);
85 EXPECT_EQ_INT(0, err);
87 err = lv_domain_get_tag(st.xpath_ctx, "test", st.tag);
89 EXPECT_EQ_INT(0, err);
90 EXPECT_EQ_STR("", st.tag);
92 fini_state(&st);
93 return 0;
94 }
96 DEF_TEST(lv_domain_get_tag_valid_xml) {
97 int err;
98 struct xml_state st;
99 err = init_state(&st, minimal_metadata_xml);
100 EXPECT_EQ_INT(0, err);
102 err = lv_domain_get_tag(st.xpath_ctx, "test", st.tag);
104 EXPECT_EQ_INT(0, err);
105 EXPECT_EQ_STR(TAG, st.tag);
107 return 0;
108 }
110 DEF_TEST(lv_default_instance_include_domain_without_tag) {
111 struct lv_read_instance *inst = NULL;
112 int ret;
114 ret = lv_init_instance(0, lv_read);
115 inst = &(lv_read_user_data[0].inst);
116 EXPECT_EQ_STR("virt-0", inst->tag);
118 ret = lv_instance_include_domain(inst, "testing", "");
119 EXPECT_EQ_INT(1, ret);
121 lv_fini_instance(0);
122 return 0;
123 }
125 DEF_TEST(lv_regular_instance_skip_domain_without_tag) {
126 struct lv_read_instance *inst = NULL;
127 int ret;
129 ret = lv_init_instance(1, lv_read);
130 inst = &(lv_read_user_data[1].inst);
131 EXPECT_EQ_STR("virt-1", inst->tag);
133 ret = lv_instance_include_domain(inst, "testing", "");
134 EXPECT_EQ_INT(0, ret);
136 lv_fini_instance(0);
137 return 0;
138 }
140 DEF_TEST(lv_include_domain_matching_tags) {
141 struct lv_read_instance *inst = NULL;
142 int ret;
144 ret = lv_init_instance(0, lv_read);
145 inst = &(lv_read_user_data[0].inst);
146 EXPECT_EQ_STR("virt-0", inst->tag);
148 ret = lv_instance_include_domain(inst, "testing", "virt-0");
149 EXPECT_EQ_INT(1, ret);
151 ret = lv_init_instance(1, lv_read);
152 inst = &(lv_read_user_data[1].inst);
153 EXPECT_EQ_STR("virt-1", inst->tag);
155 ret = lv_instance_include_domain(inst, "testing", "virt-1");
156 EXPECT_EQ_INT(1, ret);
158 lv_fini_instance(0);
159 lv_fini_instance(1);
160 return 0;
161 }
163 DEF_TEST(lv_default_instance_include_domain_with_unknown_tag) {
164 struct lv_read_instance *inst = NULL;
165 int ret;
167 ret = lv_init_instance(0, lv_read);
168 inst = &(lv_read_user_data[0].inst);
169 EXPECT_EQ_STR("virt-0", inst->tag);
171 ret = lv_instance_include_domain(inst, "testing", "unknownFormat-tag");
172 EXPECT_EQ_INT(1, ret);
174 lv_fini_instance(0);
175 return 0;
176 }
178 DEF_TEST(lv_regular_instance_skip_domain_with_unknown_tag) {
179 struct lv_read_instance *inst = NULL;
180 int ret;
182 ret = lv_init_instance(1, lv_read);
183 inst = &(lv_read_user_data[1].inst);
184 EXPECT_EQ_STR("virt-1", inst->tag);
186 ret = lv_instance_include_domain(inst, "testing", "unknownFormat-tag");
187 EXPECT_EQ_INT(0, ret);
189 lv_fini_instance(0);
190 return 0;
191 }
192 #undef TAG
194 int main(void) {
195 RUN_TEST(lv_domain_get_tag_no_metadata_xml);
196 RUN_TEST(lv_domain_get_tag_valid_xml);
198 RUN_TEST(lv_default_instance_include_domain_without_tag);
199 RUN_TEST(lv_regular_instance_skip_domain_without_tag);
200 RUN_TEST(lv_include_domain_matching_tags);
201 RUN_TEST(lv_default_instance_include_domain_with_unknown_tag);
202 RUN_TEST(lv_regular_instance_skip_domain_with_unknown_tag);
204 END_TEST;
205 }
207 /* vim: set sw=2 sts=2 et : */