xref: /openbmc/qemu/tests/unit/test-qgraph.c (revision da668aa15b99150a8595c491aee00d5d2426aaf9)
1*da668aa1SThomas Huth /*
2*da668aa1SThomas Huth  * libqos driver framework
3*da668aa1SThomas Huth  *
4*da668aa1SThomas Huth  * Copyright (c) 2018 Emanuele Giuseppe Esposito <e.emanuelegiuseppe@gmail.com>
5*da668aa1SThomas Huth  *
6*da668aa1SThomas Huth  * This library is free software; you can redistribute it and/or
7*da668aa1SThomas Huth  * modify it under the terms of the GNU Lesser General Public
8*da668aa1SThomas Huth  * License version 2.1 as published by the Free Software Foundation.
9*da668aa1SThomas Huth  *
10*da668aa1SThomas Huth  * This library is distributed in the hope that it will be useful,
11*da668aa1SThomas Huth  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12*da668aa1SThomas Huth  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13*da668aa1SThomas Huth  * Lesser General Public License for more details.
14*da668aa1SThomas Huth  *
15*da668aa1SThomas Huth  * You should have received a copy of the GNU Lesser General Public
16*da668aa1SThomas Huth  * License along with this library; if not, see <http://www.gnu.org/licenses/>
17*da668aa1SThomas Huth  */
18*da668aa1SThomas Huth 
19*da668aa1SThomas Huth #include "qemu/osdep.h"
20*da668aa1SThomas Huth #include "../qtest/libqos/qgraph.h"
21*da668aa1SThomas Huth #include "../qtest/libqos/qgraph_internal.h"
22*da668aa1SThomas Huth 
23*da668aa1SThomas Huth #define MACHINE_PC "x86_64/pc"
24*da668aa1SThomas Huth #define MACHINE_RASPI2 "arm/raspi2"
25*da668aa1SThomas Huth #define I440FX "i440FX-pcihost"
26*da668aa1SThomas Huth #define PCIBUS_PC "pcibus-pc"
27*da668aa1SThomas Huth #define SDHCI "sdhci"
28*da668aa1SThomas Huth #define PCIBUS "pci-bus"
29*da668aa1SThomas Huth #define SDHCI_PCI "sdhci-pci"
30*da668aa1SThomas Huth #define SDHCI_MM "generic-sdhci"
31*da668aa1SThomas Huth #define REGISTER_TEST "register-test"
32*da668aa1SThomas Huth 
33*da668aa1SThomas Huth int npath;
34*da668aa1SThomas Huth 
35*da668aa1SThomas Huth static void *machinefunct(QTestState *qts)
36*da668aa1SThomas Huth {
37*da668aa1SThomas Huth     return NULL;
38*da668aa1SThomas Huth }
39*da668aa1SThomas Huth 
40*da668aa1SThomas Huth static void *driverfunct(void *obj, QGuestAllocator *machine, void *arg)
41*da668aa1SThomas Huth {
42*da668aa1SThomas Huth     return NULL;
43*da668aa1SThomas Huth }
44*da668aa1SThomas Huth 
45*da668aa1SThomas Huth static void testfunct(void *obj, void *arg, QGuestAllocator *alloc)
46*da668aa1SThomas Huth {
47*da668aa1SThomas Huth     return;
48*da668aa1SThomas Huth }
49*da668aa1SThomas Huth 
50*da668aa1SThomas Huth static void check_interface(const char *interface)
51*da668aa1SThomas Huth {
52*da668aa1SThomas Huth     g_assert_cmpint(qos_graph_has_machine(interface), ==, FALSE);
53*da668aa1SThomas Huth     g_assert_nonnull(qos_graph_get_node(interface));
54*da668aa1SThomas Huth     g_assert_cmpint(qos_graph_has_node(interface), ==, TRUE);
55*da668aa1SThomas Huth     g_assert_cmpint(qos_graph_get_node_type(interface), ==, QNODE_INTERFACE);
56*da668aa1SThomas Huth     qos_graph_node_set_availability(interface, TRUE);
57*da668aa1SThomas Huth     g_assert_cmpint(qos_graph_get_node_availability(interface), ==, TRUE);
58*da668aa1SThomas Huth }
59*da668aa1SThomas Huth 
60*da668aa1SThomas Huth static void check_machine(const char *machine)
61*da668aa1SThomas Huth {
62*da668aa1SThomas Huth     qos_node_create_machine(machine, machinefunct);
63*da668aa1SThomas Huth     g_assert_nonnull(qos_graph_get_machine(machine));
64*da668aa1SThomas Huth     g_assert_cmpint(qos_graph_has_machine(machine), ==, TRUE);
65*da668aa1SThomas Huth     g_assert_nonnull(qos_graph_get_node(machine));
66*da668aa1SThomas Huth     g_assert_cmpint(qos_graph_get_node_availability(machine), ==, FALSE);
67*da668aa1SThomas Huth     qos_graph_node_set_availability(machine, TRUE);
68*da668aa1SThomas Huth     g_assert_cmpint(qos_graph_get_node_availability(machine), ==, TRUE);
69*da668aa1SThomas Huth     g_assert_cmpint(qos_graph_has_node(machine), ==, TRUE);
70*da668aa1SThomas Huth     g_assert_cmpint(qos_graph_get_node_type(machine), ==, QNODE_MACHINE);
71*da668aa1SThomas Huth }
72*da668aa1SThomas Huth 
73*da668aa1SThomas Huth static void check_contains(const char *machine, const char *driver)
74*da668aa1SThomas Huth {
75*da668aa1SThomas Huth     QOSGraphEdge *edge;
76*da668aa1SThomas Huth     qos_node_contains(machine, driver, NULL);
77*da668aa1SThomas Huth 
78*da668aa1SThomas Huth     edge = qos_graph_get_edge(machine, driver);
79*da668aa1SThomas Huth     g_assert_nonnull(edge);
80*da668aa1SThomas Huth     g_assert_cmpint(qos_graph_edge_get_type(edge), ==, QEDGE_CONTAINS);
81*da668aa1SThomas Huth     g_assert_cmpint(qos_graph_has_edge(machine, driver), ==, TRUE);
82*da668aa1SThomas Huth }
83*da668aa1SThomas Huth 
84*da668aa1SThomas Huth static void check_produces(const char *machine, const char *interface)
85*da668aa1SThomas Huth {
86*da668aa1SThomas Huth     QOSGraphEdge *edge;
87*da668aa1SThomas Huth 
88*da668aa1SThomas Huth     qos_node_produces(machine, interface);
89*da668aa1SThomas Huth     check_interface(interface);
90*da668aa1SThomas Huth     edge = qos_graph_get_edge(machine, interface);
91*da668aa1SThomas Huth     g_assert_nonnull(edge);
92*da668aa1SThomas Huth     g_assert_cmpint(qos_graph_edge_get_type(edge), ==,
93*da668aa1SThomas Huth                     QEDGE_PRODUCES);
94*da668aa1SThomas Huth     g_assert_cmpint(qos_graph_has_edge(machine, interface), ==, TRUE);
95*da668aa1SThomas Huth }
96*da668aa1SThomas Huth 
97*da668aa1SThomas Huth static void check_consumes(const char *driver, const char *interface)
98*da668aa1SThomas Huth {
99*da668aa1SThomas Huth     QOSGraphEdge *edge;
100*da668aa1SThomas Huth 
101*da668aa1SThomas Huth     qos_node_consumes(driver, interface, NULL);
102*da668aa1SThomas Huth     check_interface(interface);
103*da668aa1SThomas Huth     edge = qos_graph_get_edge(interface, driver);
104*da668aa1SThomas Huth     g_assert_nonnull(edge);
105*da668aa1SThomas Huth     g_assert_cmpint(qos_graph_edge_get_type(edge), ==, QEDGE_CONSUMED_BY);
106*da668aa1SThomas Huth     g_assert_cmpint(qos_graph_has_edge(interface, driver), ==, TRUE);
107*da668aa1SThomas Huth }
108*da668aa1SThomas Huth 
109*da668aa1SThomas Huth static void check_driver(const char *driver)
110*da668aa1SThomas Huth {
111*da668aa1SThomas Huth     qos_node_create_driver(driver, driverfunct);
112*da668aa1SThomas Huth     g_assert_cmpint(qos_graph_has_machine(driver), ==, FALSE);
113*da668aa1SThomas Huth     g_assert_nonnull(qos_graph_get_node(driver));
114*da668aa1SThomas Huth     g_assert_cmpint(qos_graph_has_node(driver), ==, TRUE);
115*da668aa1SThomas Huth     g_assert_cmpint(qos_graph_get_node_type(driver), ==, QNODE_DRIVER);
116*da668aa1SThomas Huth     g_assert_cmpint(qos_graph_get_node_availability(driver), ==, FALSE);
117*da668aa1SThomas Huth     qos_graph_node_set_availability(driver, TRUE);
118*da668aa1SThomas Huth     g_assert_cmpint(qos_graph_get_node_availability(driver), ==, TRUE);
119*da668aa1SThomas Huth }
120*da668aa1SThomas Huth 
121*da668aa1SThomas Huth static void check_test(const char *test, const char *interface)
122*da668aa1SThomas Huth {
123*da668aa1SThomas Huth     QOSGraphEdge *edge;
124*da668aa1SThomas Huth     char *full_name = g_strdup_printf("%s-tests/%s", interface, test);
125*da668aa1SThomas Huth 
126*da668aa1SThomas Huth     qos_add_test(test, interface, testfunct, NULL);
127*da668aa1SThomas Huth     g_assert_cmpint(qos_graph_has_machine(test), ==, FALSE);
128*da668aa1SThomas Huth     g_assert_cmpint(qos_graph_has_machine(full_name), ==, FALSE);
129*da668aa1SThomas Huth     g_assert_nonnull(qos_graph_get_node(full_name));
130*da668aa1SThomas Huth     g_assert_cmpint(qos_graph_has_node(full_name), ==, TRUE);
131*da668aa1SThomas Huth     g_assert_cmpint(qos_graph_get_node_type(full_name), ==, QNODE_TEST);
132*da668aa1SThomas Huth     edge = qos_graph_get_edge(interface, full_name);
133*da668aa1SThomas Huth     g_assert_nonnull(edge);
134*da668aa1SThomas Huth     g_assert_cmpint(qos_graph_edge_get_type(edge), ==,
135*da668aa1SThomas Huth                     QEDGE_CONSUMED_BY);
136*da668aa1SThomas Huth     g_assert_cmpint(qos_graph_has_edge(interface, full_name), ==, TRUE);
137*da668aa1SThomas Huth     g_assert_cmpint(qos_graph_get_node_availability(full_name), ==, TRUE);
138*da668aa1SThomas Huth     qos_graph_node_set_availability(full_name, FALSE);
139*da668aa1SThomas Huth     g_assert_cmpint(qos_graph_get_node_availability(full_name), ==, FALSE);
140*da668aa1SThomas Huth     g_free(full_name);
141*da668aa1SThomas Huth }
142*da668aa1SThomas Huth 
143*da668aa1SThomas Huth static void count_each_test(QOSGraphNode *path, int len)
144*da668aa1SThomas Huth {
145*da668aa1SThomas Huth     npath++;
146*da668aa1SThomas Huth }
147*da668aa1SThomas Huth 
148*da668aa1SThomas Huth static void check_leaf_discovered(int n)
149*da668aa1SThomas Huth {
150*da668aa1SThomas Huth     npath = 0;
151*da668aa1SThomas Huth     qos_graph_foreach_test_path(count_each_test);
152*da668aa1SThomas Huth     g_assert_cmpint(n, ==, npath);
153*da668aa1SThomas Huth }
154*da668aa1SThomas Huth 
155*da668aa1SThomas Huth /* G_Test functions */
156*da668aa1SThomas Huth 
157*da668aa1SThomas Huth static void init_nop(void)
158*da668aa1SThomas Huth {
159*da668aa1SThomas Huth     qos_graph_init();
160*da668aa1SThomas Huth     qos_graph_destroy();
161*da668aa1SThomas Huth }
162*da668aa1SThomas Huth 
163*da668aa1SThomas Huth static void test_machine(void)
164*da668aa1SThomas Huth {
165*da668aa1SThomas Huth     qos_graph_init();
166*da668aa1SThomas Huth     check_machine(MACHINE_PC);
167*da668aa1SThomas Huth     qos_graph_destroy();
168*da668aa1SThomas Huth }
169*da668aa1SThomas Huth 
170*da668aa1SThomas Huth static void test_contains(void)
171*da668aa1SThomas Huth {
172*da668aa1SThomas Huth     qos_graph_init();
173*da668aa1SThomas Huth     check_contains(MACHINE_PC, I440FX);
174*da668aa1SThomas Huth     g_assert_null(qos_graph_get_machine(MACHINE_PC));
175*da668aa1SThomas Huth     g_assert_null(qos_graph_get_machine(I440FX));
176*da668aa1SThomas Huth     g_assert_null(qos_graph_get_node(MACHINE_PC));
177*da668aa1SThomas Huth     g_assert_null(qos_graph_get_node(I440FX));
178*da668aa1SThomas Huth     qos_graph_destroy();
179*da668aa1SThomas Huth }
180*da668aa1SThomas Huth 
181*da668aa1SThomas Huth static void test_multiple_contains(void)
182*da668aa1SThomas Huth {
183*da668aa1SThomas Huth     qos_graph_init();
184*da668aa1SThomas Huth     check_contains(MACHINE_PC, I440FX);
185*da668aa1SThomas Huth     check_contains(MACHINE_PC, PCIBUS_PC);
186*da668aa1SThomas Huth     qos_graph_destroy();
187*da668aa1SThomas Huth }
188*da668aa1SThomas Huth 
189*da668aa1SThomas Huth static void test_produces(void)
190*da668aa1SThomas Huth {
191*da668aa1SThomas Huth     qos_graph_init();
192*da668aa1SThomas Huth     check_produces(MACHINE_PC, I440FX);
193*da668aa1SThomas Huth     g_assert_null(qos_graph_get_machine(MACHINE_PC));
194*da668aa1SThomas Huth     g_assert_null(qos_graph_get_machine(I440FX));
195*da668aa1SThomas Huth     g_assert_null(qos_graph_get_node(MACHINE_PC));
196*da668aa1SThomas Huth     g_assert_nonnull(qos_graph_get_node(I440FX));
197*da668aa1SThomas Huth     qos_graph_destroy();
198*da668aa1SThomas Huth }
199*da668aa1SThomas Huth 
200*da668aa1SThomas Huth static void test_multiple_produces(void)
201*da668aa1SThomas Huth {
202*da668aa1SThomas Huth     qos_graph_init();
203*da668aa1SThomas Huth     check_produces(MACHINE_PC, I440FX);
204*da668aa1SThomas Huth     check_produces(MACHINE_PC, PCIBUS_PC);
205*da668aa1SThomas Huth     qos_graph_destroy();
206*da668aa1SThomas Huth }
207*da668aa1SThomas Huth 
208*da668aa1SThomas Huth static void test_consumes(void)
209*da668aa1SThomas Huth {
210*da668aa1SThomas Huth     qos_graph_init();
211*da668aa1SThomas Huth     check_consumes(I440FX, SDHCI);
212*da668aa1SThomas Huth     g_assert_null(qos_graph_get_machine(I440FX));
213*da668aa1SThomas Huth     g_assert_null(qos_graph_get_machine(SDHCI));
214*da668aa1SThomas Huth     g_assert_null(qos_graph_get_node(I440FX));
215*da668aa1SThomas Huth     g_assert_nonnull(qos_graph_get_node(SDHCI));
216*da668aa1SThomas Huth     qos_graph_destroy();
217*da668aa1SThomas Huth }
218*da668aa1SThomas Huth 
219*da668aa1SThomas Huth static void test_multiple_consumes(void)
220*da668aa1SThomas Huth {
221*da668aa1SThomas Huth     qos_graph_init();
222*da668aa1SThomas Huth     check_consumes(I440FX, SDHCI);
223*da668aa1SThomas Huth     check_consumes(PCIBUS_PC, SDHCI);
224*da668aa1SThomas Huth     qos_graph_destroy();
225*da668aa1SThomas Huth }
226*da668aa1SThomas Huth 
227*da668aa1SThomas Huth static void test_driver(void)
228*da668aa1SThomas Huth {
229*da668aa1SThomas Huth     qos_graph_init();
230*da668aa1SThomas Huth     check_driver(I440FX);
231*da668aa1SThomas Huth     qos_graph_destroy();
232*da668aa1SThomas Huth }
233*da668aa1SThomas Huth 
234*da668aa1SThomas Huth static void test_test(void)
235*da668aa1SThomas Huth {
236*da668aa1SThomas Huth     qos_graph_init();
237*da668aa1SThomas Huth     check_test(REGISTER_TEST, SDHCI);
238*da668aa1SThomas Huth     qos_graph_destroy();
239*da668aa1SThomas Huth }
240*da668aa1SThomas Huth 
241*da668aa1SThomas Huth static void test_machine_contains_driver(void)
242*da668aa1SThomas Huth {
243*da668aa1SThomas Huth     qos_graph_init();
244*da668aa1SThomas Huth     check_machine(MACHINE_PC);
245*da668aa1SThomas Huth     check_driver(I440FX);
246*da668aa1SThomas Huth     check_contains(MACHINE_PC, I440FX);
247*da668aa1SThomas Huth     qos_graph_destroy();
248*da668aa1SThomas Huth }
249*da668aa1SThomas Huth 
250*da668aa1SThomas Huth static void test_driver_contains_driver(void)
251*da668aa1SThomas Huth {
252*da668aa1SThomas Huth     qos_graph_init();
253*da668aa1SThomas Huth     check_driver(PCIBUS_PC);
254*da668aa1SThomas Huth     check_driver(I440FX);
255*da668aa1SThomas Huth     check_contains(PCIBUS_PC, I440FX);
256*da668aa1SThomas Huth     qos_graph_destroy();
257*da668aa1SThomas Huth }
258*da668aa1SThomas Huth 
259*da668aa1SThomas Huth static void test_machine_produces_interface(void)
260*da668aa1SThomas Huth {
261*da668aa1SThomas Huth     qos_graph_init();
262*da668aa1SThomas Huth     check_machine(MACHINE_PC);
263*da668aa1SThomas Huth     check_produces(MACHINE_PC, SDHCI);
264*da668aa1SThomas Huth     qos_graph_destroy();
265*da668aa1SThomas Huth }
266*da668aa1SThomas Huth 
267*da668aa1SThomas Huth static void test_driver_produces_interface(void)
268*da668aa1SThomas Huth {
269*da668aa1SThomas Huth     qos_graph_init();
270*da668aa1SThomas Huth     check_driver(I440FX);
271*da668aa1SThomas Huth     check_produces(I440FX, SDHCI);
272*da668aa1SThomas Huth     qos_graph_destroy();
273*da668aa1SThomas Huth }
274*da668aa1SThomas Huth 
275*da668aa1SThomas Huth static void test_machine_consumes_interface(void)
276*da668aa1SThomas Huth {
277*da668aa1SThomas Huth     qos_graph_init();
278*da668aa1SThomas Huth     check_machine(MACHINE_PC);
279*da668aa1SThomas Huth     check_consumes(MACHINE_PC, SDHCI);
280*da668aa1SThomas Huth     qos_graph_destroy();
281*da668aa1SThomas Huth }
282*da668aa1SThomas Huth 
283*da668aa1SThomas Huth static void test_driver_consumes_interface(void)
284*da668aa1SThomas Huth {
285*da668aa1SThomas Huth     qos_graph_init();
286*da668aa1SThomas Huth     check_driver(I440FX);
287*da668aa1SThomas Huth     check_consumes(I440FX, SDHCI);
288*da668aa1SThomas Huth     qos_graph_destroy();
289*da668aa1SThomas Huth }
290*da668aa1SThomas Huth 
291*da668aa1SThomas Huth static void test_test_consumes_interface(void)
292*da668aa1SThomas Huth {
293*da668aa1SThomas Huth     qos_graph_init();
294*da668aa1SThomas Huth     check_test(REGISTER_TEST, SDHCI);
295*da668aa1SThomas Huth     qos_graph_destroy();
296*da668aa1SThomas Huth }
297*da668aa1SThomas Huth 
298*da668aa1SThomas Huth static void test_full_sample(void)
299*da668aa1SThomas Huth {
300*da668aa1SThomas Huth     qos_graph_init();
301*da668aa1SThomas Huth     check_machine(MACHINE_PC);
302*da668aa1SThomas Huth     check_contains(MACHINE_PC, I440FX);
303*da668aa1SThomas Huth     check_driver(I440FX);
304*da668aa1SThomas Huth     check_driver(PCIBUS_PC);
305*da668aa1SThomas Huth     check_contains(I440FX, PCIBUS_PC);
306*da668aa1SThomas Huth     check_produces(PCIBUS_PC, PCIBUS);
307*da668aa1SThomas Huth     check_driver(SDHCI_PCI);
308*da668aa1SThomas Huth     qos_node_consumes(SDHCI_PCI, PCIBUS, NULL);
309*da668aa1SThomas Huth     check_produces(SDHCI_PCI, SDHCI);
310*da668aa1SThomas Huth     check_driver(SDHCI_MM);
311*da668aa1SThomas Huth     check_produces(SDHCI_MM, SDHCI);
312*da668aa1SThomas Huth     qos_add_test(REGISTER_TEST, SDHCI, testfunct, NULL);
313*da668aa1SThomas Huth     check_leaf_discovered(1);
314*da668aa1SThomas Huth     qos_print_graph();
315*da668aa1SThomas Huth     qos_graph_destroy();
316*da668aa1SThomas Huth }
317*da668aa1SThomas Huth 
318*da668aa1SThomas Huth static void test_full_sample_raspi(void)
319*da668aa1SThomas Huth {
320*da668aa1SThomas Huth     qos_graph_init();
321*da668aa1SThomas Huth     check_machine(MACHINE_PC);
322*da668aa1SThomas Huth     check_contains(MACHINE_PC, I440FX);
323*da668aa1SThomas Huth     check_driver(I440FX);
324*da668aa1SThomas Huth     check_driver(PCIBUS_PC);
325*da668aa1SThomas Huth     check_contains(I440FX, PCIBUS_PC);
326*da668aa1SThomas Huth     check_produces(PCIBUS_PC, PCIBUS);
327*da668aa1SThomas Huth     check_driver(SDHCI_PCI);
328*da668aa1SThomas Huth     qos_node_consumes(SDHCI_PCI, PCIBUS, NULL);
329*da668aa1SThomas Huth     check_produces(SDHCI_PCI, SDHCI);
330*da668aa1SThomas Huth     check_machine(MACHINE_RASPI2);
331*da668aa1SThomas Huth     check_contains(MACHINE_RASPI2, SDHCI_MM);
332*da668aa1SThomas Huth     check_driver(SDHCI_MM);
333*da668aa1SThomas Huth     check_produces(SDHCI_MM, SDHCI);
334*da668aa1SThomas Huth     qos_add_test(REGISTER_TEST, SDHCI, testfunct, NULL);
335*da668aa1SThomas Huth     qos_print_graph();
336*da668aa1SThomas Huth     check_leaf_discovered(2);
337*da668aa1SThomas Huth     qos_graph_destroy();
338*da668aa1SThomas Huth }
339*da668aa1SThomas Huth 
340*da668aa1SThomas Huth static void test_cycle(void)
341*da668aa1SThomas Huth {
342*da668aa1SThomas Huth     qos_graph_init();
343*da668aa1SThomas Huth     check_machine(MACHINE_RASPI2);
344*da668aa1SThomas Huth     check_driver("B");
345*da668aa1SThomas Huth     check_driver("C");
346*da668aa1SThomas Huth     check_driver("D");
347*da668aa1SThomas Huth     check_contains(MACHINE_RASPI2, "B");
348*da668aa1SThomas Huth     check_contains("B", "C");
349*da668aa1SThomas Huth     check_contains("C", "D");
350*da668aa1SThomas Huth     check_contains("D", MACHINE_RASPI2);
351*da668aa1SThomas Huth     check_leaf_discovered(0);
352*da668aa1SThomas Huth     qos_print_graph();
353*da668aa1SThomas Huth     qos_graph_destroy();
354*da668aa1SThomas Huth }
355*da668aa1SThomas Huth 
356*da668aa1SThomas Huth static void test_two_test_same_interface(void)
357*da668aa1SThomas Huth {
358*da668aa1SThomas Huth     qos_graph_init();
359*da668aa1SThomas Huth     check_machine(MACHINE_RASPI2);
360*da668aa1SThomas Huth     check_produces(MACHINE_RASPI2, "B");
361*da668aa1SThomas Huth     qos_add_test("C", "B", testfunct, NULL);
362*da668aa1SThomas Huth     qos_add_test("D", "B", testfunct, NULL);
363*da668aa1SThomas Huth     check_contains(MACHINE_RASPI2, "B");
364*da668aa1SThomas Huth     check_leaf_discovered(4);
365*da668aa1SThomas Huth     qos_print_graph();
366*da668aa1SThomas Huth     qos_graph_destroy();
367*da668aa1SThomas Huth }
368*da668aa1SThomas Huth 
369*da668aa1SThomas Huth static void test_test_in_path(void)
370*da668aa1SThomas Huth {
371*da668aa1SThomas Huth     qos_graph_init();
372*da668aa1SThomas Huth     check_machine(MACHINE_RASPI2);
373*da668aa1SThomas Huth     check_produces(MACHINE_RASPI2, "B");
374*da668aa1SThomas Huth     qos_add_test("C", "B", testfunct, NULL);
375*da668aa1SThomas Huth     check_driver("D");
376*da668aa1SThomas Huth     check_consumes("D", "B");
377*da668aa1SThomas Huth     check_produces("D", "E");
378*da668aa1SThomas Huth     qos_add_test("F", "E", testfunct, NULL);
379*da668aa1SThomas Huth     check_leaf_discovered(2);
380*da668aa1SThomas Huth     qos_print_graph();
381*da668aa1SThomas Huth     qos_graph_destroy();
382*da668aa1SThomas Huth }
383*da668aa1SThomas Huth 
384*da668aa1SThomas Huth static void test_double_edge(void)
385*da668aa1SThomas Huth {
386*da668aa1SThomas Huth     qos_graph_init();
387*da668aa1SThomas Huth     check_machine(MACHINE_RASPI2);
388*da668aa1SThomas Huth     check_produces("B", "C");
389*da668aa1SThomas Huth     qos_node_consumes("C", "B", NULL);
390*da668aa1SThomas Huth     qos_add_test("D", "C", testfunct, NULL);
391*da668aa1SThomas Huth     check_contains(MACHINE_RASPI2, "B");
392*da668aa1SThomas Huth     qos_print_graph();
393*da668aa1SThomas Huth     qos_graph_destroy();
394*da668aa1SThomas Huth }
395*da668aa1SThomas Huth 
396*da668aa1SThomas Huth int main(int argc, char **argv)
397*da668aa1SThomas Huth {
398*da668aa1SThomas Huth     g_test_init(&argc, &argv, NULL);
399*da668aa1SThomas Huth     g_test_add_func("/qgraph/init_nop", init_nop);
400*da668aa1SThomas Huth     g_test_add_func("/qgraph/test_machine", test_machine);
401*da668aa1SThomas Huth     g_test_add_func("/qgraph/test_contains", test_contains);
402*da668aa1SThomas Huth     g_test_add_func("/qgraph/test_multiple_contains", test_multiple_contains);
403*da668aa1SThomas Huth     g_test_add_func("/qgraph/test_produces", test_produces);
404*da668aa1SThomas Huth     g_test_add_func("/qgraph/test_multiple_produces", test_multiple_produces);
405*da668aa1SThomas Huth     g_test_add_func("/qgraph/test_consumes", test_consumes);
406*da668aa1SThomas Huth     g_test_add_func("/qgraph/test_multiple_consumes",
407*da668aa1SThomas Huth                     test_multiple_consumes);
408*da668aa1SThomas Huth     g_test_add_func("/qgraph/test_driver", test_driver);
409*da668aa1SThomas Huth     g_test_add_func("/qgraph/test_test", test_test);
410*da668aa1SThomas Huth     g_test_add_func("/qgraph/test_machine_contains_driver",
411*da668aa1SThomas Huth                     test_machine_contains_driver);
412*da668aa1SThomas Huth     g_test_add_func("/qgraph/test_driver_contains_driver",
413*da668aa1SThomas Huth                     test_driver_contains_driver);
414*da668aa1SThomas Huth     g_test_add_func("/qgraph/test_machine_produces_interface",
415*da668aa1SThomas Huth                     test_machine_produces_interface);
416*da668aa1SThomas Huth     g_test_add_func("/qgraph/test_driver_produces_interface",
417*da668aa1SThomas Huth                     test_driver_produces_interface);
418*da668aa1SThomas Huth     g_test_add_func("/qgraph/test_machine_consumes_interface",
419*da668aa1SThomas Huth                     test_machine_consumes_interface);
420*da668aa1SThomas Huth     g_test_add_func("/qgraph/test_driver_consumes_interface",
421*da668aa1SThomas Huth                     test_driver_consumes_interface);
422*da668aa1SThomas Huth     g_test_add_func("/qgraph/test_test_consumes_interface",
423*da668aa1SThomas Huth                     test_test_consumes_interface);
424*da668aa1SThomas Huth     g_test_add_func("/qgraph/test_full_sample", test_full_sample);
425*da668aa1SThomas Huth     g_test_add_func("/qgraph/test_full_sample_raspi", test_full_sample_raspi);
426*da668aa1SThomas Huth     g_test_add_func("/qgraph/test_cycle", test_cycle);
427*da668aa1SThomas Huth     g_test_add_func("/qgraph/test_two_test_same_interface",
428*da668aa1SThomas Huth                     test_two_test_same_interface);
429*da668aa1SThomas Huth     g_test_add_func("/qgraph/test_test_in_path", test_test_in_path);
430*da668aa1SThomas Huth     g_test_add_func("/qgraph/test_double_edge", test_double_edge);
431*da668aa1SThomas Huth 
432*da668aa1SThomas Huth     g_test_run();
433*da668aa1SThomas Huth     return 0;
434*da668aa1SThomas Huth }
435