afb-export: Manage path of libraries
[src/app-framework-binder.git] / src / tests / apiv3 / test-apiv3.c
1 #include <stdlib.h>
2 #include <stdio.h>
3 #include <stdarg.h>
4 #include <errno.h>
5 #include <string.h>
6
7 #include <check.h>
8
9 #if !defined(ck_assert_ptr_null)
10 # define ck_assert_ptr_null(X)      ck_assert_ptr_eq(X, NULL)
11 # define ck_assert_ptr_nonnull(X)   ck_assert_ptr_ne(X, NULL)
12 #endif
13
14 #define AFB_BINDING_VERSION 0
15 #include <afb/afb-binding.h>
16 #include "afb-api.h"
17 #include "afb-apiset.h"
18 #include "afb-api-v3.h"
19
20 struct inapis {
21         struct afb_binding_v3 desc;
22         struct afb_api_x3 *api;
23         int init;
24 };
25
26 struct inapis inapis[] = {
27         { .desc = {
28                 .api = "ezra",
29                 .provide_class = "e",
30                 .require_class = "c",
31                 .require_api = "armel"
32         }},
33         { .desc = {
34                 .api = "clara",
35                 .provide_class = "c",
36                 .require_class = "a"
37         }},
38         { .desc = {
39                 .api = "amelie",
40                 .provide_class = "a",
41                 .require_api = "albert armel"
42         }},
43         { .desc = {
44                 .api = "chloe",
45                 .provide_class = "c a"
46         }},
47         { .desc = {
48                 .api = "albert",
49                 .provide_class = "a"
50         }},
51         { .desc = {
52                 .api = "armel",
53                 .provide_class = "a",
54                 .require_api = "albert"
55         }},
56         { .desc = { .api = NULL }}
57 };
58
59 int last_in_init;
60
61 int in_init(struct afb_api_x3 *api)
62 {
63         struct inapis *desc = api->userdata;
64
65         ck_assert_str_eq(api->apiname, desc->desc.api);
66         ck_assert_int_eq(desc->init, 0);
67
68         desc->init = ++last_in_init;
69         printf("init %d of %s\n", desc->init, api->apiname);
70         return 0;
71 }
72
73 int in_preinit(void *closure, struct afb_api_x3 *api)
74 {
75         int rc;
76         struct inapis *desc = closure;
77
78         printf("default preinit of %s\n", api->apiname);
79
80         ck_assert_ptr_nonnull(api);
81         ck_assert_ptr_nonnull(desc);
82         ck_assert_ptr_nonnull(api->apiname);
83         ck_assert_ptr_null(api->userdata);
84         ck_assert_str_eq(api->apiname, desc->desc.api);
85         ck_assert_ptr_null(desc->api);
86         ck_assert_int_eq(desc->init, 0);
87
88         rc = afb_api_v3_set_binding_fields(&desc->desc, api);
89         ck_assert_int_eq(rc, 0);
90
91         api->userdata = desc;
92         desc->api = api;
93
94         if (desc->desc.preinit)
95                 desc->desc.preinit(api);
96
97         if (!desc->desc.init) {
98                 rc =  afb_api_x3_on_init(api, in_init);
99                 ck_assert_int_eq(rc, 0);
100         }
101
102         return 0;
103 }
104
105 int out_init(struct afb_api_x3 *api)
106 {
107         return 0;
108 }
109
110 struct afb_apiset *apiset;
111 char out_apiname[] = "out";
112 struct afb_api_v3 *out_v3;
113 struct afb_api_x3 *out_api;
114
115 int out_preinit(void *closure, struct afb_api_x3 *api)
116 {
117         int i;
118         int rc;
119         struct afb_api_x3 *napi;
120
121         ck_assert_ptr_nonnull(api);
122         ck_assert_ptr_eq(closure, out_apiname);
123         ck_assert_ptr_null(api->userdata);
124         ck_assert_str_eq(api->apiname, out_apiname);
125         out_api = api;
126
127         for (i = 0 ; inapis[i].desc.api ; i++) {
128                 ck_assert_ptr_null(inapis[i].api);
129                 napi = afb_api_x3_new_api(
130                                 api,
131                                 inapis[i].desc.api,
132                                 NULL,
133                                 0,
134                                 in_preinit,
135                                 &inapis[i]);
136                 ck_assert_ptr_nonnull(napi);
137                 ck_assert_ptr_nonnull(inapis[i].api);
138                 ck_assert_ptr_eq(inapis[i].api, napi);
139         }
140
141         rc = afb_api_x3_on_init(api, out_init);
142         ck_assert_int_eq(rc, 0);
143
144         return 0;
145 }
146
147 START_TEST (test)
148 {
149         int rc;
150
151         apiset = afb_apiset_create("test-apiv3", 1);
152         ck_assert_ptr_nonnull(apiset);
153
154         out_v3 = afb_api_v3_create(apiset,
155                 apiset,
156                 out_apiname,
157                 NULL,
158                 0,
159                 out_preinit,
160                 out_apiname,
161                 0,
162                 NULL,
163                 NULL);
164         ck_assert_ptr_nonnull(out_v3);
165         ck_assert_ptr_nonnull(out_api);
166
167         /* start all services */
168         rc = afb_apiset_start_all_services(apiset);
169         ck_assert_int_eq(rc, 0);
170 }
171 END_TEST
172
173
174 /*********************************************************************/
175
176 static Suite *suite;
177 static TCase *tcase;
178
179 void mksuite(const char *name) { suite = suite_create(name); }
180 void addtcase(const char *name) { tcase = tcase_create(name); suite_add_tcase(suite, tcase); }
181 void addtest(TFun fun) { tcase_add_test(tcase, fun); }
182 int srun()
183 {
184         int nerr;
185         SRunner *srunner = srunner_create(suite);
186         srunner_run_all(srunner, CK_NORMAL);
187         nerr = srunner_ntests_failed(srunner);
188         srunner_free(srunner);
189         return nerr;
190 }
191
192 int main(int ac, char **av)
193 {
194         mksuite("apiv3");
195                 addtcase("apiv3");
196                         addtest(test);
197         return !!srun();
198 }