65 #include <sys/signalfd.h>
69 #include <amxc/amxc.h>
70 #include <amxp/amxp_signal.h>
71 #include <amxp/amxp_slot.h>
72 #include <amxp/amxp_expression.h>
82 #include <amxc/amxc_macros.h>
99 assert_int_equal(
amxd_param_new(¶m,
"Param1", AMXC_VAR_ID_CSTRING), 0);
102 assert_int_equal(
amxd_param_new(¶m,
"Param2", AMXC_VAR_ID_BOOL), 0);
104 assert_int_equal(
amxd_param_new(¶m,
"Param3", AMXC_VAR_ID_UINT32), 0);
106 assert_int_equal(
amxd_param_new(¶m,
"Alias", AMXC_VAR_ID_CSTRING), 0);
113 assert_int_equal(
amxd_param_new(¶m,
"Param1", AMXC_VAR_ID_CSTRING), 0);
115 assert_int_equal(
amxd_param_new(¶m,
"Param3", AMXC_VAR_ID_UINT32), 0);
120 assert_int_equal(
amxd_param_new(¶m,
"Alias", AMXC_VAR_ID_CSTRING), 0);
191 amxc_llist_init(&paths);
194 assert_int_equal(amxc_llist_size(&paths), 1);
195 assert_string_equal(amxc_string_get(amxc_string_from_llist_it(amxc_llist_get_first(&paths)), 0),
"RootObject.TemplateObject.1.");
196 amxc_llist_clean(&paths, amxc_string_list_it_free);
199 assert_int_equal(amxc_llist_size(&paths), 1);
200 assert_string_equal(amxc_string_get(amxc_string_from_llist_it(amxc_llist_get_first(&paths)), 0),
"RootObject.TemplateObject.1.");
201 amxc_llist_clean(&paths, amxc_string_list_it_free);
204 assert_int_equal(amxc_llist_size(&paths), 1);
205 assert_string_equal(amxc_string_get(amxc_string_from_llist_it(amxc_llist_get_first(&paths)), 0),
"RootObject.TemplateObject.1.");
206 amxc_llist_clean(&paths, amxc_string_list_it_free);
209 assert_int_equal(amxc_llist_size(&paths), 1);
210 assert_string_equal(amxc_string_get(amxc_string_from_llist_it(amxc_llist_get_first(&paths)), 0),
"RootObject.TemplateObject.2.");
211 amxc_llist_clean(&paths, amxc_string_list_it_free);
214 assert_int_equal(amxc_llist_size(&paths), 1);
215 assert_string_equal(amxc_string_get(amxc_string_from_llist_it(amxc_llist_get_first(&paths)), 0),
"RootObject.TemplateObject.1.");
216 amxc_llist_clean(&paths, amxc_string_list_it_free);
219 assert_int_equal(amxc_llist_size(&paths), 2);
220 assert_string_equal(amxc_string_get(amxc_string_from_llist_it(amxc_llist_get_first(&paths)), 0),
"RootObject.TemplateObject.4.");
221 amxc_llist_clean(&paths, amxc_string_list_it_free);
224 assert_int_equal(amxc_llist_size(&paths), 5);
225 assert_string_equal(amxc_string_get(amxc_string_from_llist_it(amxc_llist_get_first(&paths)), 0),
"RootObject.TemplateObject.1.");
226 amxc_llist_clean(&paths, amxc_string_list_it_free);
229 assert_non_null(inst_obj);
231 assert_int_equal(amxc_llist_size(&paths), 4);
232 amxc_llist_clean(&paths, amxc_string_list_it_free);
235 assert_non_null(inst_obj);
238 assert_non_null(inst_obj);
240 inst_obj =
amxd_dm_findf(&
dm,
"RootObject.TemplateObject.1.ChildObject.");
241 assert_non_null(inst_obj);
243 assert_int_equal(amxc_llist_size(&paths), 3);
244 amxc_llist_clean(&paths, amxc_string_list_it_free);
250 bool key_path =
false;
251 amxc_llist_init(&paths);
253 assert_int_equal(
amxd_object_resolve_pathf(root_obj, &paths,
"RootObject.TemplateObject.[ChildObject.Param1=='sub-test1']"), 0);
254 assert_int_equal(amxc_llist_size(&paths), 1);
255 assert_string_equal(amxc_string_get(amxc_string_from_llist_it(amxc_llist_get_first(&paths)), 0),
"RootObject.TemplateObject.1.");
256 amxc_llist_clean(&paths, amxc_string_list_it_free);
259 assert_int_equal(amxc_llist_size(&paths), 2);
260 assert_string_equal(amxc_string_get(amxc_string_from_llist_it(amxc_llist_get_first(&paths)), 0),
"RootObject.TemplateObject.4.");
261 amxc_llist_clean(&paths, amxc_string_list_it_free);
264 assert_int_equal(amxc_llist_size(&paths), 2);
265 assert_string_equal(amxc_string_get(amxc_string_from_llist_it(amxc_llist_get_first(&paths)), 0),
"RootObject.TemplateObject.4.");
266 amxc_llist_clean(&paths, amxc_string_list_it_free);
269 assert_int_equal(amxc_llist_size(&paths), 5);
270 assert_string_equal(amxc_string_get(amxc_string_from_llist_it(amxc_llist_get_first(&paths)), 0),
"RootObject.TemplateObject.1.ChildObject.");
271 amxc_llist_clean(&paths, amxc_string_list_it_free);
274 assert_int_equal(amxc_llist_size(&paths), 5);
275 assert_string_equal(amxc_string_get(amxc_string_from_llist_it(amxc_llist_get_first(&paths)), 0),
"RootObject.TemplateObject.1.ChildObject.");
276 amxc_llist_clean(&paths, amxc_string_list_it_free);
278 assert_int_equal(
amxd_dm_resolve_pathf(&
dm, &paths,
"RootObject.TemplateObject.*.ChildObject.TemplateObject.[Alias=='SubAlias']"), 0);
279 assert_int_equal(amxc_llist_size(&paths), 2);
280 assert_string_equal(amxc_string_get(amxc_string_from_llist_it(amxc_llist_get_first(&paths)), 0),
"RootObject.TemplateObject.2.ChildObject.TemplateObject.1.");
281 amxc_llist_clean(&paths, amxc_string_list_it_free);
283 assert_int_equal(
amxd_dm_resolve_pathf_ext(&
dm, &key_path, &paths,
"RootObject.TemplateObject.*.ChildObject.TemplateObject.[Alias=='SubAlias']"), 0);
284 assert_int_equal(amxc_llist_size(&paths), 2);
285 assert_string_equal(amxc_string_get(amxc_string_from_llist_it(amxc_llist_get_first(&paths)), 0),
"RootObject.TemplateObject.2.ChildObject.TemplateObject.1.");
286 amxc_llist_clean(&paths, amxc_string_list_it_free);
288 assert_int_equal(
amxd_object_resolve_pathf(root_obj, &paths,
"RootObject.TemplateObject.Alias5.ChildObject.TemplateObject.[SubAlias2]"), 0);
289 assert_int_equal(amxc_llist_size(&paths), 1);
290 assert_string_equal(amxc_string_get(amxc_string_from_llist_it(amxc_llist_get_first(&paths)), 0),
"RootObject.TemplateObject.5.ChildObject.TemplateObject.1.");
291 amxc_llist_clean(&paths, amxc_string_list_it_free);
293 assert_int_equal(
amxd_object_resolve_pathf(root_obj, &paths,
"RootObject.TemplateObject.[5].ChildObject.TemplateObject.[SubAlias2]"), 0);
294 assert_int_equal(amxc_llist_size(&paths), 1);
295 assert_string_equal(amxc_string_get(amxc_string_from_llist_it(amxc_llist_get_first(&paths)), 0),
"RootObject.TemplateObject.5.ChildObject.TemplateObject.1.");
296 amxc_llist_clean(&paths, amxc_string_list_it_free);
298 assert_int_equal(
amxd_object_resolve_pathf(root_obj, &paths,
"RootObject.TemplateObject.[ChildObject.Param3 == 240].ChildObject.TemplateObject.*"), 0);
299 assert_int_equal(amxc_llist_size(&paths), 1);
300 assert_string_equal(amxc_string_get(amxc_string_from_llist_it(amxc_llist_get_first(&paths)), 0),
"RootObject.TemplateObject.5.ChildObject.TemplateObject.1.");
301 amxc_llist_clean(&paths, amxc_string_list_it_free);
305 assert_int_equal(amxc_llist_size(&paths), 1);
306 assert_string_equal(amxc_string_get(amxc_string_from_llist_it(amxc_llist_get_first(&paths)), 0),
"RootObject.");
307 amxc_llist_clean(&paths, amxc_string_list_it_free);
310 assert_int_equal(amxc_llist_size(&paths), 1);
311 amxc_llist_clean(&paths, amxc_string_list_it_free);
317 amxc_llist_init(&paths);
319 assert_int_not_equal(
amxd_object_resolve_pathf(root_obj, &paths,
"RootObject.TemplateObject.[ChildObject.Param3!>220]"), 0);
320 assert_int_equal(amxc_llist_size(&paths), 0);
326 amxc_llist_init(&paths);
329 assert_int_equal(amxc_llist_size(&paths), 0);
331 assert_int_equal(amxc_llist_size(&paths), 0);
333 assert_int_equal(amxc_llist_size(&paths), 0);
335 assert_int_equal(amxc_llist_size(&paths), 0);
337 assert_int_equal(amxc_llist_size(&paths), 0);
343 amxc_llist_init(&paths);
346 assert_int_equal(amxc_llist_size(&paths), 0);
352 amxc_llist_init(&paths);
355 assert_int_equal(amxc_llist_size(&paths), 0);
357 assert_int_not_equal(
amxd_object_resolve_pathf(root_obj, &paths,
"RootObject.TemplateObject.[Param3>100].NonExisting."), 0);
358 assert_int_equal(amxc_llist_size(&paths), 0);
361 assert_int_equal(amxc_llist_size(&paths), 0);
367 amxc_llist_init(&paths);
369 assert_int_not_equal(
amxd_object_resolve_pathf(root_obj, &paths,
"RootObject.TemplateObject.Param3>100].ChildObject"), 0);
370 assert_int_equal(amxc_llist_size(&paths), 0);
372 assert_int_not_equal(
amxd_object_resolve_pathf(root_obj, &paths,
"RootObject.TemplateObject.[Param3>100.ChildObject"), 0);
373 assert_int_equal(amxc_llist_size(&paths), 0);
375 assert_int_not_equal(
amxd_object_resolve_pathf(root_obj, &paths,
"RootObject.TemplateObject.\"Param3>100\".ChildObject"), 0);
376 assert_int_equal(amxc_llist_size(&paths), 0);
378 assert_int_not_equal(
amxd_object_resolve_pathf(root_obj, &paths,
"RootObject.TemplateObject.`Param3>100\".ChildObject"), 0);
379 assert_int_equal(amxc_llist_size(&paths), 0);
386 amxc_llist_init(&paths);
388 amxc_llist_it_take(&obj->
it);
391 assert_int_equal(
amxd_object_resolve_pathf(obj, &paths,
"TemplateObject.*.ChildObject.TemplateObject.[Alias=='SubAlias']"), 0);
392 assert_int_equal(amxc_llist_size(&paths), 2);
393 assert_string_equal(amxc_string_get(amxc_string_from_llist_it(amxc_llist_get_first(&paths)), 0),
"RootObject.TemplateObject.2.ChildObject.TemplateObject.1.");
394 amxc_llist_clean(&paths, amxc_string_list_it_free);
396 assert_non_null(
amxd_object_findf(obj,
"TemplateObject.[Param1=='test2'].ChildObject.TemplateObject.[Alias=='SubAlias']"));
Ambiorix Data Model API header file.
amxd_object_t * amxd_dm_findf(amxd_dm_t *const dm, const char *abs_path,...) __attribute__((format(printf
amxd_object_t amxd_status_t amxd_status_t amxd_dm_resolve_pathf_ext(amxd_dm_t *const dm, bool *key_path, amxc_llist_t *paths, const char *abs_path,...) __attribute__((format(printf
amxd_object_t * amxd_dm_get_object(amxd_dm_t *const dm, const char *name)
amxd_object_t amxd_status_t amxd_dm_resolve_pathf(amxd_dm_t *const dm, amxc_llist_t *paths, const char *abs_path,...) __attribute__((format(printf
Ambiorix Data Model API header file.
amxd_status_t amxd_param_new(amxd_param_t **param, const char *name, const uint32_t type)
amxd_status_t amxd_param_set_attr(amxd_param_t *param, const amxd_pattr_id_t attr, const bool enable)
Ambiorix Data Model API header file.
amxd_object_t * amxd_dm_get_root(amxd_dm_t *const dm)
Fetches the root object of the data model.
amxd_status_t amxd_dm_add_root_object(amxd_dm_t *const dm, amxd_object_t *const object)
Adds an object to the root of the data model.
amxd_status_t amxd_dm_init(amxd_dm_t *dm)
Initializes a data model structure.
void amxd_dm_clean(amxd_dm_t *dm)
Cleans a data model structure.
amxd_object_t * amxd_object_get_child(const amxd_object_t *object, const char *name)
Get a child of the object.
amxd_object_t * amxd_object_findf(amxd_object_t *object, const char *rel_path,...) __attribute__((format(printf
Find an object in the data model tree, starting from an object.
amxd_object_t amxd_status_t amxd_status_t amxd_object_resolve_pathf_ext(amxd_object_t *object, bool *key_path, amxc_llist_t *paths, const char *rel_path,...) __attribute__((format(printf
Resolves a search path into a list of matching object paths.
amxd_dm_t * amxd_object_get_dm(const amxd_object_t *const object)
Get the data model.
amxd_object_t amxd_status_t amxd_object_resolve_pathf(amxd_object_t *object, amxc_llist_t *paths, const char *rel_path,...) __attribute__((format(printf
Resolves a search path into a list of matching object paths.
amxd_status_t amxd_object_add_object(amxd_object_t *const parent, amxd_object_t *const child)
Adds an object in the data model tree.
amxd_status_t amxd_object_add_param(amxd_object_t *const object, amxd_param_t *const param)
Adds a parameter definition to an object.
amxd_status_t amxd_object_new(amxd_object_t **object, const amxd_object_type_t type, const char *name)
Data model object constructor function.
void amxd_trans_clean(amxd_trans_t *const trans)
Cleans the transaction object.
amxd_status_t amxd_trans_apply(amxd_trans_t *const trans, amxd_dm_t *const dm)
Applies all previously added actions.
#define amxd_trans_set_value(type, trans, name, value)
Helper macro for setting a value.
amxd_status_t amxd_trans_add_inst(amxd_trans_t *const trans, const uint32_t index, const char *name)
Adds an instance add action to a transaction.
amxd_status_t amxd_trans_select_pathf(amxd_trans_t *const trans, const char *path,...) __attribute__((format(printf
Selects an object using a absolute or relative path.
amxd_status_t amxd_trans_init(amxd_trans_t *const trans)
Initializes a transaction object.
void test_search_fails_with_empty_expression(UNUSED void **state)
void test_search_fails_with_invalid_path_syntax(UNUSED void **state)
static void test_build_dm(void)
int test_object_search_setup(UNUSED void **state)
void test_can_use_sub_object_in_expression(UNUSED void **state)
void test_search_fails_with_invalid_expression(UNUSED void **state)
void test_search_list_is_empty_when_no_objects_found(UNUSED void **state)
int test_object_search_teardown(UNUSED void **state)
void test_can_search_on_objects_not_in_dm(UNUSED void **state)
void test_can_search(UNUSED void **state)
void test_search_fails_with_wildcard_or_expression_on_wrong_object(UNUSED void **state)