diff options
Diffstat (limited to 'src/tests/apiv3/test-apiv3.c')
-rw-r--r-- | src/tests/apiv3/test-apiv3.c | 198 |
1 files changed, 198 insertions, 0 deletions
diff --git a/src/tests/apiv3/test-apiv3.c b/src/tests/apiv3/test-apiv3.c new file mode 100644 index 00000000..dec1af97 --- /dev/null +++ b/src/tests/apiv3/test-apiv3.c @@ -0,0 +1,198 @@ +#include <stdlib.h> +#include <stdio.h> +#include <stdarg.h> +#include <errno.h> +#include <string.h> + +#include <check.h> + +#if !defined(ck_assert_ptr_null) +# define ck_assert_ptr_null(X) ck_assert_ptr_eq(X, NULL) +# define ck_assert_ptr_nonnull(X) ck_assert_ptr_ne(X, NULL) +#endif + +#define AFB_BINDING_VERSION 0 +#include <afb/afb-binding.h> +#include "afb-api.h" +#include "afb-apiset.h" +#include "afb-api-v3.h" + +struct inapis { + struct afb_binding_v3 desc; + struct afb_api_x3 *api; + int init; +}; + +struct inapis inapis[] = { + { .desc = { + .api = "ezra", + .provide_class = "e", + .require_class = "c", + .require_api = "armel" + }}, + { .desc = { + .api = "clara", + .provide_class = "c", + .require_class = "a" + }}, + { .desc = { + .api = "amelie", + .provide_class = "a", + .require_api = "albert armel" + }}, + { .desc = { + .api = "chloe", + .provide_class = "c a" + }}, + { .desc = { + .api = "albert", + .provide_class = "a" + }}, + { .desc = { + .api = "armel", + .provide_class = "a", + .require_api = "albert" + }}, + { .desc = { .api = NULL }} +}; + +int last_in_init; + +int in_init(struct afb_api_x3 *api) +{ + struct inapis *desc = api->userdata; + + ck_assert_str_eq(api->apiname, desc->desc.api); + ck_assert_int_eq(desc->init, 0); + + desc->init = ++last_in_init; + printf("init %d of %s\n", desc->init, api->apiname); + return 0; +} + +int in_preinit(void *closure, struct afb_api_x3 *api) +{ + int rc; + struct inapis *desc = closure; + + printf("default preinit of %s\n", api->apiname); + + ck_assert_ptr_nonnull(api); + ck_assert_ptr_nonnull(desc); + ck_assert_ptr_nonnull(api->apiname); + ck_assert_ptr_null(api->userdata); + ck_assert_str_eq(api->apiname, desc->desc.api); + ck_assert_ptr_null(desc->api); + ck_assert_int_eq(desc->init, 0); + + rc = afb_api_v3_set_binding_fields(&desc->desc, api); + ck_assert_int_eq(rc, 0); + + api->userdata = desc; + desc->api = api; + + if (desc->desc.preinit) + desc->desc.preinit(api); + + if (!desc->desc.init) { + rc = afb_api_x3_on_init(api, in_init); + ck_assert_int_eq(rc, 0); + } + + return 0; +} + +int out_init(struct afb_api_x3 *api) +{ + return 0; +} + +struct afb_apiset *apiset; +char out_apiname[] = "out"; +struct afb_api_v3 *out_v3; +struct afb_api_x3 *out_api; + +int out_preinit(void *closure, struct afb_api_x3 *api) +{ + int i; + int rc; + struct afb_api_x3 *napi; + + ck_assert_ptr_nonnull(api); + ck_assert_ptr_eq(closure, out_apiname); + ck_assert_ptr_null(api->userdata); + ck_assert_str_eq(api->apiname, out_apiname); + out_api = api; + + for (i = 0 ; inapis[i].desc.api ; i++) { + ck_assert_ptr_null(inapis[i].api); + napi = afb_api_x3_new_api( + api, + inapis[i].desc.api, + NULL, + 0, + in_preinit, + &inapis[i]); + ck_assert_ptr_nonnull(napi); + ck_assert_ptr_nonnull(inapis[i].api); + ck_assert_ptr_eq(inapis[i].api, napi); + } + + rc = afb_api_x3_on_init(api, out_init); + ck_assert_int_eq(rc, 0); + + return 0; +} + +START_TEST (test) +{ + int rc; + + apiset = afb_apiset_create("test-apiv3", 1); + ck_assert_ptr_nonnull(apiset); + + out_v3 = afb_api_v3_create( + apiset, + apiset, + out_apiname, + NULL, + 0, + out_preinit, + out_apiname, + 0 + ); + ck_assert_ptr_nonnull(out_v3); + ck_assert_ptr_nonnull(out_api); + + /* start all services */ + rc = afb_apiset_start_all_services(apiset, 1); + ck_assert_int_eq(rc, 0); +} +END_TEST + + +/*********************************************************************/ + +static Suite *suite; +static TCase *tcase; + +void mksuite(const char *name) { suite = suite_create(name); } +void addtcase(const char *name) { tcase = tcase_create(name); suite_add_tcase(suite, tcase); } +void addtest(TFun fun) { tcase_add_test(tcase, fun); } +int srun() +{ + int nerr; + SRunner *srunner = srunner_create(suite); + srunner_run_all(srunner, CK_NORMAL); + nerr = srunner_ntests_failed(srunner); + srunner_free(srunner); + return nerr; +} + +int main(int ac, char **av) +{ + mksuite("apiv3"); + addtcase("apiv3"); + addtest(test); + return !!srun(); +} |