55 #include <sys/resource.h>
56 #include <sys/types.h>
71 #include <amxc/amxc.h>
72 #include <amxp/amxp_signal.h>
73 #include <amxp/amxp_slot.h>
74 #include <amxd/amxd_dm.h>
75 #include <amxd/amxd_object.h>
76 #include <amxd/amxd_parameter.h>
77 #include <amxd/amxd_transaction.h>
88 #include <amxc/amxc_macros.h>
95 const amxc_var_t*
const data,
98 amxc_string_t* fn_name = (amxc_string_t*) priv;
99 assert_non_null(priv);
100 assert_string_equal(amxc_string_get(fn_name, 0),
"print_event");
101 printf(
"Event received %s\n", sig_name);
102 amxc_var_dump(data, STDOUT_FILENO);
107 const amxc_var_t*
const data,
108 UNUSED void*
const priv) {
110 amxc_var_t*
event = NULL;
111 printf(
"Event received %s\n", sig_name);
112 event = amxc_var_add(amxc_htable_t, &
events, NULL);
113 amxc_var_copy(event, data);
114 amxc_var_add_key(cstring_t, event,
"signame", sig_name);
119 const amxc_var_t*
const data,
120 UNUSED void*
const priv) {
122 printf(
"Event received %s\n", sig_name);
123 amxc_var_dump(data, STDOUT_FILENO);
128 const amxc_var_t*
const data,
129 UNUSED void*
const priv) {
131 printf(
"Event received %s\n", sig_name);
132 amxc_var_dump(data, STDOUT_FILENO);
139 amxd_trans_t transaction;
141 const char*
odl =
"%define {"
142 " object Test[] { string text = \"Hallo\"; }"
145 " on event regexp(\".*\") call print_event;"
147 const char* odl_2 =
"%populate {"
148 " on event regexp(\"dm:instance-.*\") of \"Test\" call print_event;"
158 while(amxp_signal_read() == 0) {
166 amxd_trans_init(&transaction);
167 amxd_trans_select_pathf(&transaction,
"Test");
168 amxd_trans_add_inst(&transaction, 0, NULL);
169 amxd_trans_select_pathf(&transaction,
".^");
170 amxd_trans_add_inst(&transaction, 0, NULL);
171 amxd_trans_select_pathf(&transaction,
".^");
172 amxd_trans_add_inst(&transaction, 0, NULL);
173 assert_int_equal(amxd_trans_apply(&transaction, &dm), 0);
174 amxd_trans_clean(&transaction);
177 while(amxp_signal_read() == 0) {
188 amxd_trans_t transaction;
194 " on event '*' call print_event;"
195 " string text = \"Hallo\";"
208 while(amxp_signal_read() == 0) {
212 amxd_trans_init(&transaction);
213 amxd_trans_select_pathf(&transaction,
"Root.Test");
214 amxd_trans_add_inst(&transaction, 0, NULL);
215 amxd_trans_select_pathf(&transaction,
".^");
216 amxd_trans_add_inst(&transaction, 0, NULL);
217 assert_int_equal(amxd_trans_apply(&transaction, &dm), 0);
218 amxd_trans_clean(&transaction);
221 while(amxp_signal_read() == 0) {
225 amxd_trans_init(&transaction);
226 amxd_trans_select_pathf(&transaction,
"Root.Test.1.");
227 amxd_trans_set_value(cstring_t, &transaction,
"text",
"Testing");
228 assert_int_equal(amxd_trans_apply(&transaction, &dm), 0);
229 amxd_trans_clean(&transaction);
232 while(amxp_signal_read() == 0) {
244 amxd_trans_t transaction;
248 " object Test { string text = \"Hallo\"; }\n"
251 " on event regexp(\".*\") call print_event \n"
252 " filter 'object == \"Test.\" && parameters.text.from == \"Hallo\"';\n"
265 while(amxp_signal_read() == 0) {
269 amxd_trans_init(&transaction);
270 amxd_trans_select_pathf(&transaction,
"Test");
271 amxd_trans_set_value(cstring_t, &transaction,
"text",
"Test Text");
272 assert_int_equal(amxd_trans_apply(&transaction, &dm), 0);
274 amxd_trans_clean(&transaction);
275 amxd_trans_select_pathf(&transaction,
"Test");
276 amxd_trans_set_value(cstring_t, &transaction,
"text",
"Test Text2");
277 assert_int_equal(amxd_trans_apply(&transaction, &dm), 0);
279 amxd_trans_clean(&transaction);
280 amxd_trans_select_pathf(&transaction,
"Test");
281 amxd_trans_set_value(cstring_t, &transaction,
"text",
"Hallo");
282 assert_int_equal(amxd_trans_apply(&transaction, &dm), 0);
284 amxd_trans_clean(&transaction);
285 amxd_trans_select_pathf(&transaction,
"Test");
286 amxd_trans_set_value(cstring_t, &transaction,
"text",
"YAT");
287 assert_int_equal(amxd_trans_apply(&transaction, &dm), 0);
288 amxd_trans_clean(&transaction);
291 while(amxp_signal_read() == 0) {
303 const char*
odl =
"%define {"
304 " object Test[] { string text = \"Hallo\"; }"
307 " on event regexp(\".*\") call print_event;"
329 " %unique %key string Alias;"
334 " object Test.MiTest {"
335 " instance add (0,\"welcome\") {"
336 " parameter Text = \"1234\";"
339 " object Test.MiTest.welcome {"
340 " parameter Text = \"ABCD\";"
342 " on event \"*\" call print_event;"
343 " on event \"dm:instance-added\" call instance_added;"
344 " on event \"dm:object-changed\" call object_changed;"
347 const char* odl_dot =
349 " object Test.MiTest {"
350 " instance add (0,\"welcome.again\") {"
351 " parameter Text = \"I like dots in Aliases\";"
367 while(amxp_signal_read() == 0) {
376 while(amxp_signal_read() == 0) {
388 const char* file =
"./odl/greeter.odl";
389 const amxc_llist_t* levents = NULL;
392 {
"Greeter.",
"dm:object-added" },
393 {
"Greeter.History.",
"dm:object-added" },
394 {
"Greeter.History.Info.",
"dm:object-added" },
395 {
"Greeter.",
"dm:object-changed" },
396 {
"Greeter.History.1.",
"dm:object-changed" },
397 {
"Greeter.History.1.",
"dm:object-changed" },
398 {
"Greeter.History.1.",
"dm:object-changed" },
399 {
"Greeter.History.1.",
"dm:object-changed" },
400 {
"Greeter.History.",
"dm:instance-added" },
401 {
"Greeter.History.1.Info.",
"dm:object-added" },
402 {
"Greeter.History.1.Info.",
"dm:instance-added" },
403 {
"Greeter.History.1.Info.",
"dm:instance-added" },
404 {
"Greeter.History.1.Info.",
"dm:instance-added" },
405 {
"Greeter.History.1.Info.",
"dm:instance-added" },
412 amxc_var_set_type(&
events, AMXC_VAR_ID_LIST);
417 while(amxp_signal_read() == 0) {
422 amxc_var_dump(&
events, STDOUT_FILENO);
423 levents = amxc_var_constcast(amxc_llist_t, &
events);
424 assert_int_equal(
sizeof(eevents) /
sizeof(
expected_events_t), amxc_llist_size(levents));
426 amxc_llist_it_t* it = amxc_llist_get_first(levents);
428 amxc_var_t*
event = amxc_var_from_llist_it(it);
430 assert_string_equal(eevents[i].path, GET_CHAR(event,
"path"));
431 assert_string_equal(eevents[i].signame, GET_CHAR(event,
"signame"));
433 amxc_var_delete(&event);
Ambiorix ODL parser header file.
int amxo_parser_parse_string(amxo_parser_t *parser, const char *text, amxd_object_t *object)
Parses a string containing a valid ODL part.
void amxo_parser_clean(amxo_parser_t *parser)
Cleans up the odl parser instance.
int amxo_parser_parse_file(amxo_parser_t *parser, const char *file_path, amxd_object_t *object)
Parses an odl file.
static amxd_status_t amxo_parser_get_status(amxo_parser_t *parser)
Get the status of the odl parser.
int amxo_parser_init(amxo_parser_t *parser)
Initializes a new odl parser instance.
int amxo_resolver_ftab_add(amxo_parser_t *parser, const char *fn_name, amxo_fn_ptr_t fn)
Adds a C function to the function table.
#define AMXO_FUNC(x)
Function ponter caster macro.
The ODL parser structure.
static void _print_event(const char *const sig_name, const amxc_var_t *const data, void *const priv)
static void _object_changed(const char *const sig_name, const amxc_var_t *const data, UNUSED void *const priv)
void test_event_subscription_filter(UNUSED void **state)
void test_event_subscription(UNUSED void **state)
static void _instance_added(const char *const sig_name, const amxc_var_t *const data, UNUSED void *const priv)
void test_event_subscription_in_object_def(UNUSED void **state)
static uint32_t event_counter
static uint32_t instance_add_counter
static uint32_t object_changed_counter
struct _expected_events expected_events_t
void test_events_are_in_correct_order(UNUSED void **state)
static void _check_event(const char *const sig_name, const amxc_var_t *const data, UNUSED void *const priv)
void test_populate_section_generates_events(UNUSED void **state)
void test_subscription_warns_if_function_not_resolved(UNUSED void **state)