libamxd  6.4.1
Data Model Manager
test_amxd_action_object_add.c
Go to the documentation of this file.
1 /****************************************************************************
2 **
3 ** SPDX-License-Identifier: BSD-2-Clause-Patent
4 **
5 ** SPDX-FileCopyrightText: Copyright (c) 2023 SoftAtHome
6 **
7 ** Redistribution and use in source and binary forms, with or without modification,
8 ** are permitted provided that the following conditions are met:
9 **
10 ** 1. Redistributions of source code must retain the above copyright notice,
11 ** this list of conditions and the following disclaimer.
12 **
13 ** 2. Redistributions in binary form must reproduce the above copyright notice,
14 ** this list of conditions and the following disclaimer in the documentation
15 ** and/or other materials provided with the distribution.
16 **
17 ** Subject to the terms and conditions of this license, each copyright holder
18 ** and contributor hereby grants to those receiving rights under this license
19 ** a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable
20 ** (except for failure to satisfy the conditions of this license) patent license
21 ** to make, have made, use, offer to sell, sell, import, and otherwise transfer
22 ** this software, where such license applies only to those patent claims, already
23 ** acquired or hereafter acquired, licensable by such copyright holder or contributor
24 ** that are necessarily infringed by:
25 **
26 ** (a) their Contribution(s) (the licensed copyrights of copyright holders and
27 ** non-copyrightable additions of contributors, in source or binary form) alone;
28 ** or
29 **
30 ** (b) combination of their Contribution(s) with the work of authorship to which
31 ** such Contribution(s) was added by such copyright holder or contributor, if,
32 ** at the time the Contribution is added, such addition causes such combination
33 ** to be necessarily infringed. The patent license shall not apply to any other
34 ** combinations which include the Contribution.
35 **
36 ** Except as expressly stated above, no rights or licenses from any copyright
37 ** holder or contributor is granted under this license, whether expressly, by
38 ** implication, estoppel or otherwise.
39 **
40 ** DISCLAIMER
41 **
42 ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
43 ** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
44 ** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
45 ** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
46 ** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
47 ** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
48 ** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
49 ** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
50 ** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
51 ** USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
52 **
53 ****************************************************************************/
54 
55 #include <stdlib.h>
56 #include <stdarg.h>
57 #include <stddef.h>
58 #include <setjmp.h>
59 #include <fcntl.h>
60 #include <unistd.h>
61 #include <signal.h>
62 #include <cmocka.h>
63 
64 #include <amxc/amxc.h>
65 #include <amxp/amxp_signal.h>
66 #include <amxp/amxp_slot.h>
67 
68 #include <amxd/amxd_common.h>
69 #include <amxd/amxd_dm.h>
70 #include <amxd/amxd_object.h>
71 #include <amxd/amxd_parameter.h>
72 #include <amxd/amxd_function.h>
73 #include <amxd/amxd_action.h>
74 #include <amxd/amxd_transaction.h>
75 
77 
78 #include <amxc/amxc_macros.h>
79 static amxd_dm_t dm;
80 
82  amxd_param_t* const param,
83  amxd_action_t reason,
84  UNUSED const amxc_var_t* const args,
85  UNUSED amxc_var_t* const retval,
86  void* priv) {
88  amxc_var_t* data = (amxc_var_t*) priv;
89 
90  if((reason != action_object_destroy) &&
91  ( reason != action_param_destroy)) {
93  goto exit;
94  }
95 
96  // action private data must not be removed when the action is used
97  // on derivced objects.
98  // only remove action data when the action is owned by the object or
99  // parameter on which the action is called.
100  if(reason == action_object_destroy) {
101  if(amxd_object_has_action_cb(object, reason, test_cleanup_data)) {
102  amxc_var_delete(&data);
103  amxd_object_set_action_cb_data(object, reason, test_cleanup_data, NULL);
104  }
105  } else {
106  if(amxd_param_has_action_cb(param, reason, test_cleanup_data)) {
107  amxc_var_delete(&data);
108  amxd_param_set_action_cb_data(param, reason, test_cleanup_data, NULL);
109  }
110  }
111 
112 exit:
113  return status;
114 }
115 
117  amxd_object_t* object = NULL;
118  amxd_object_t* template = NULL;
119  amxd_param_t* param = NULL;
120  amxc_var_t* data = NULL;
121  amxc_var_t* max = NULL;
122  amxc_var_t* max_param = NULL;
123 
124  amxc_var_new(&data);
125  amxc_var_new(&max);
126  amxc_var_new(&max_param);
127  amxc_var_set(int64_t, data, 10);
128  amxc_var_set(int32_t, max, 3);
129  amxc_var_set(cstring_t, max_param, "MyRoot.Max");
130 
131  assert_int_equal(amxd_dm_init(&dm), 0);
132 
133  assert_int_equal(amxd_object_new(&object, amxd_object_singleton, "MyRoot"), 0);
134  assert_int_equal(amxd_param_new(&param, "Max", AMXC_VAR_ID_UINT32), 0);
135  assert_int_equal(amxd_object_add_param(object, param), 0);
136  amxc_var_set(uint32_t, &param->value, 2);
137  assert_int_equal(amxd_dm_add_root_object(&dm, object), 0);
138 
139  assert_int_equal(amxd_object_new(&template, amxd_object_template, "MyTemplate"), 0);
142  assert_int_equal(amxd_object_add_object(object, template), 0);
143  assert_int_equal(amxd_param_new(&param, "param", AMXC_VAR_ID_UINT32), 0);
146  assert_int_equal(amxd_object_add_param(template, param), 0);
147  assert_int_equal(amxd_param_new(&param, "uparam", AMXC_VAR_ID_UINT32), 0);
148  assert_int_equal(amxd_param_set_attr(param, amxd_pattr_unique, true), 0);
149  assert_int_equal(amxd_object_add_param(template, param), 0);
150 
151  assert_int_equal(amxd_object_new(&template, amxd_object_template, "MyTemplate2"), 0);
154  assert_int_equal(amxd_object_add_object(object, template), 0);
155 
156  assert_int_equal(amxd_object_new(&template, amxd_object_template, "parent"), 0);
157  assert_int_equal(amxd_dm_add_root_object(&dm, template), 0);
158  assert_int_equal(amxd_object_new(&object, amxd_object_singleton, "child"), 0);
159  assert_int_equal(amxd_object_add_object(template, object), 0);
160 
161  assert_int_equal(amxd_param_new(&param, "templ_param", AMXC_VAR_ID_CSTRING), 0);
163  assert_int_equal(amxd_object_add_param(template, param), 0);
164  assert_int_equal(amxd_param_new(&param, "inst_param", AMXC_VAR_ID_BOOL), 0);
165  assert_int_equal(amxd_object_add_param(template, param), 0);
166  assert_int_equal(amxd_param_new(&param, "param", AMXC_VAR_ID_UINT32), 0);
169  assert_int_equal(amxd_object_add_param(template, param), 0);
170 
171  assert_int_equal(amxd_param_new(&param, "child_param", AMXC_VAR_ID_CSTRING), 0);
173  assert_int_equal(amxd_object_add_param(object, param), 0);
174  assert_int_equal(amxd_param_new(&param, "child_param2", AMXC_VAR_ID_BOOL), 0);
175  assert_int_equal(amxd_object_add_param(object, param), 0);
176  assert_int_equal(amxd_param_new(&param, "child_param3", AMXC_VAR_ID_UINT64), 0);
177  assert_int_equal(amxd_object_add_param(object, param), 0);
178 
179  return template;
180 }
181 
183  UNUSED amxd_param_t* param,
184  amxd_action_t reason,
185  UNUSED const amxc_var_t* const args,
186  UNUSED amxc_var_t* const retval,
187  UNUSED void* priv) {
188 
190  if(!object) {
191  goto exit;
192  }
193 
194  if(reason != action_object_add_inst) {
196  goto exit;
197  }
198 
200 
201 exit:
202  return status;
203 }
204 
205 void test_amxd_object_add(UNUSED void** state) {
206  amxd_object_t* template = NULL;
207  amxd_object_t* instance = NULL;
208  amxc_var_t retval;
209  amxc_var_t args;
210  amxc_var_t* params = NULL;
211 
212  amxc_var_init(&args);
213  amxc_var_init(&retval);
214 
215  template = test_build_dm();
216 
217  amxc_var_set_type(&args, AMXC_VAR_ID_HTABLE);
218  assert_int_equal(amxd_action_object_add_inst(template, NULL, action_object_add_inst, &args, &retval, NULL), 0);
219  assert_int_equal(amxc_var_type_of(&retval), AMXC_VAR_ID_HTABLE);
220  assert_ptr_not_equal(amxc_var_get_key(&retval, "index", AMXC_VAR_FLAG_DEFAULT), NULL);
221  assert_ptr_not_equal(amxc_var_get_key(&retval, "name", AMXC_VAR_FLAG_DEFAULT), NULL);
222  instance = amxd_object_get_instance(template, NULL, amxc_var_constcast(uint32_t, amxc_var_get_key(&retval, "index", AMXC_VAR_FLAG_DEFAULT)));
223  assert_ptr_not_equal(instance, NULL);
224 
225  amxc_var_clean(&retval);
226  assert_int_equal(amxd_action_object_add_inst(template, NULL, action_object_add_inst, &args, &retval, NULL), 0);
227  instance = amxd_object_get_instance(template, NULL, amxc_var_constcast(uint32_t, amxc_var_get_key(&retval, "index", AMXC_VAR_FLAG_DEFAULT)));
228  assert_ptr_not_equal(instance, NULL);
229 
230  amxc_var_clean(&retval);
231  assert_int_equal(amxd_action_object_add_inst(template, NULL, action_object_add_inst, NULL, &retval, NULL), 0);
232  instance = amxd_object_get_instance(template, NULL, amxc_var_constcast(uint32_t, amxc_var_get_key(&retval, "index", AMXC_VAR_FLAG_DEFAULT)));
233  assert_ptr_not_equal(instance, NULL);
234 
235  assert_int_not_equal(amxd_action_object_add_inst(template, NULL, action_object_add_inst, NULL, NULL, NULL), 0);
236  assert_int_not_equal(amxd_action_object_add_inst(NULL, NULL, action_object_add_inst, NULL, &retval, NULL), 0);
237  assert_int_not_equal(amxd_action_object_add_inst(template, NULL, action_object_read, NULL, &retval, NULL), 0);
238  assert_int_not_equal(amxd_action_object_add_inst(template, NULL, action_object_write, NULL, &retval, NULL), 0);
239 
240  amxc_var_clean(&retval);
241  assert_int_equal(amxd_action_object_add_inst(template, NULL, action_object_add_inst, &args, &retval, NULL), 0);
242  assert_int_equal(amxc_var_type_of(&retval), AMXC_VAR_ID_HTABLE);
243 
244  amxc_var_set_type(&args, AMXC_VAR_ID_HTABLE);
245  params = amxc_var_add_key(amxc_htable_t, &args, "parameters", NULL);
246  amxc_var_add_key(bool, params, "inst_param", true);
247  amxc_var_add_key(uint32_t, params, "param", 666);
248  amxc_var_add_key(uint32_t, &args, "index", 99);
249  amxc_var_add_key(cstring_t, &args, "name", "MyTestInst");
250  amxc_var_add_key(bool, &args, "set_priv", false);
251  amxc_var_clean(&retval);
252  assert_int_equal(amxd_action_object_add_inst(template, NULL, action_object_add_inst, &args, &retval, NULL), 0);
253  instance = amxd_object_get_instance(template, "MyTestInst", 0);
254  assert_ptr_not_equal(instance, NULL);
255  assert_int_equal(amxd_object_get_value(uint32_t, instance, "param", NULL), 666);
256  assert_true(amxd_object_get_value(bool, instance, "inst_param", NULL));
257 
258  amxd_object_set_attr(template, amxd_oattr_read_only, false);
259  amxd_object_set_attr(template, amxd_oattr_private, true);
260  amxc_var_clean(&retval);
261  assert_int_not_equal(amxd_action_object_add_inst(template, NULL, action_object_add_inst, &args, &retval, NULL), 0);
262  assert_int_equal(amxc_var_type_of(&retval), AMXC_VAR_ID_NULL);
263 
264  amxc_var_set_type(&args, AMXC_VAR_ID_HTABLE);
265  params = amxc_var_add_key(amxc_htable_t, &args, "parameters", NULL);
266  amxc_var_add_key(bool, params, "inst_param", true);
267  amxc_var_add_key(uint32_t, params, "param", 666);
268  amxc_var_add_key(uint32_t, &args, "index", 99);
269  amxc_var_add_key(cstring_t, &args, "name", "MyTestInst");
270  amxc_var_add_key(uint32_t, &args, "access", amxd_dm_access_private);
271  amxc_var_clean(&retval);
272  assert_int_not_equal(amxd_action_object_add_inst(template, NULL, action_object_add_inst, &args, &retval, NULL), 0);
273  instance = amxd_object_get_instance(template, "MyTestInst", 0);
274  assert_ptr_not_equal(instance, NULL);
275 
276  amxc_var_set_type(&args, AMXC_VAR_ID_HTABLE);
277  params = amxc_var_add_key(amxc_htable_t, &args, "parameters", NULL);
278  amxc_var_add_key(bool, params, "inst_param", true);
279  amxc_var_add_key(uint32_t, params, "param", 666);
280  amxc_var_add_key(uint32_t, &args, "index", 101);
281  amxc_var_add_key(cstring_t, &args, "name", "MyTestInst2");
282  amxc_var_add_key(uint32_t, &args, "access", amxd_dm_access_private);
283  amxc_var_clean(&retval);
284  assert_int_equal(amxd_action_object_add_inst(template, NULL, action_object_add_inst, &args, &retval, NULL), 0);
285  instance = amxd_object_get_instance(template, "MyTestInst2", 0);
286  assert_ptr_not_equal(instance, NULL);
287 
288  amxc_var_set_type(&args, AMXC_VAR_ID_HTABLE);
289  params = amxc_var_add_key(amxc_htable_t, &args, "parameters", NULL);
290  amxc_var_add_key(cstring_t, params, "inst_param", "text");
291  amxc_var_add_key(uint32_t, params, "param", 666);
292  amxc_var_add_key(uint32_t, &args, "index", 102);
293  amxc_var_add_key(cstring_t, &args, "name", "MyTestInst3");
294  amxc_var_add_key(uint32_t, &args, "access", amxd_dm_access_private);
295  amxc_var_add_key(bool, &args, "set_read_only", false);
296  amxc_var_clean(&retval);
297  assert_int_not_equal(amxd_action_object_add_inst(template, NULL, action_object_add_inst, &args, &retval, NULL), 0);
298  instance = amxd_object_get_instance(template, "MyTestInst3", 0);
299  assert_ptr_equal(instance, NULL);
300 
301  amxc_var_clean(&args);
302  amxc_var_clean(&retval);
303  amxd_dm_clean(&dm);
304 }
305 
307  amxd_object_t* template = NULL;
308  amxd_trans_t transaction;
309 
310  template = test_build_dm();
312 
313  amxd_trans_init(&transaction);
314  amxd_trans_select_object(&transaction, template);
315  amxd_trans_add_inst(&transaction, 0, NULL);
316  assert_int_not_equal(amxd_trans_apply(&transaction, &dm), 0);
317 
318  amxd_trans_clean(&transaction);
319  amxd_dm_clean(&dm);
320 }
321 
323  amxd_trans_t transaction;
324  amxd_object_t* object = NULL;
325 
326  test_build_dm();
327 
328  amxd_trans_init(&transaction);
329  amxd_trans_select_pathf(&transaction, "MyRoot.MyTemplate");
330  amxd_trans_add_inst(&transaction, 0, NULL);
331  amxd_trans_set_value(uint32_t, &transaction, "param", 11);
332  amxd_trans_set_value(uint32_t, &transaction, "uparam", 11);
333  assert_int_equal(amxd_trans_apply(&transaction, &dm), 0);
334  object = amxd_dm_findf(&dm, "MyRoot.MyTemplate.1.");
335  assert_non_null(object);
336  amxd_trans_clean(&transaction);
337 
338  amxd_trans_init(&transaction);
339  amxd_trans_select_pathf(&transaction, "MyRoot.MyTemplate");
340  amxd_trans_add_inst(&transaction, 0, NULL);
341  amxd_trans_set_value(uint32_t, &transaction, "param", 1);
342  amxd_trans_set_value(uint32_t, &transaction, "uparam", 1);
343  assert_int_not_equal(amxd_trans_apply(&transaction, &dm), 0);
344  object = amxd_dm_findf(&dm, "MyRoot.MyTemplate.2.");
345  assert_null(object);
346  amxd_trans_clean(&transaction);
347 
348  amxd_trans_init(&transaction);
349  amxd_trans_select_pathf(&transaction, "MyRoot.MyTemplate");
350  amxd_trans_add_inst(&transaction, 0, NULL);
351  amxd_trans_set_value(uint32_t, &transaction, "param", 20);
352  amxd_trans_set_value(uint32_t, &transaction, "uparam", 1);
353  assert_int_equal(amxd_trans_apply(&transaction, &dm), 0);
354  object = amxd_dm_findf(&dm, "MyRoot.MyTemplate.3.");
355  assert_non_null(object);
356  amxd_trans_clean(&transaction);
357 
358  amxd_trans_init(&transaction);
359  amxd_trans_select_pathf(&transaction, "MyRoot.MyTemplate");
360  amxd_trans_add_inst(&transaction, 0, NULL);
361  amxd_trans_set_value(uint32_t, &transaction, "param", 20);
362  amxd_trans_set_value(uint32_t, &transaction, "uparam", 1);
363  assert_int_not_equal(amxd_trans_apply(&transaction, &dm), 0);
364  object = amxd_dm_findf(&dm, "MyRoot.MyTemplate.4.");
365  assert_null(object);
366 
367  amxd_trans_clean(&transaction);
368  amxd_dm_clean(&dm);
369 }
370 
372  amxd_trans_t transaction;
373 
374  test_build_dm();
375 
376  amxd_trans_init(&transaction);
377  amxd_trans_select_pathf(&transaction, "MyRoot.MyTemplate");
378  amxd_trans_add_inst(&transaction, 0, NULL);
379  amxd_trans_set_value(uint32_t, &transaction, "uparam", 1);
380  amxd_trans_select_pathf(&transaction, ".^");
381  amxd_trans_add_inst(&transaction, 0, NULL);
382  amxd_trans_set_value(uint32_t, &transaction, "uparam", 2);
383  amxd_trans_select_pathf(&transaction, ".^");
384  amxd_trans_add_inst(&transaction, 0, NULL);
385  amxd_trans_set_value(uint32_t, &transaction, "uparam", 3);
386  assert_int_equal(amxd_trans_apply(&transaction, &dm), 0);
387  amxd_trans_clean(&transaction);
388 
389  amxd_trans_init(&transaction);
390  amxd_trans_select_pathf(&transaction, "MyRoot.MyTemplate");
391  amxd_trans_add_inst(&transaction, 0, NULL);
392  amxd_trans_set_value(uint32_t, &transaction, "uparam", 4);
393  assert_int_not_equal(amxd_trans_apply(&transaction, &dm), 0);
394 
395  amxd_trans_clean(&transaction);
396  amxd_dm_clean(&dm);
397 }
398 
400  amxd_trans_t transaction;
401 
402  test_build_dm();
403 
404  amxd_trans_init(&transaction);
405  amxd_trans_select_pathf(&transaction, "MyRoot.MyTemplate2");
406  amxd_trans_add_inst(&transaction, 0, NULL);
407  amxd_trans_select_pathf(&transaction, ".^");
408  amxd_trans_add_inst(&transaction, 0, NULL);
409  assert_int_equal(amxd_trans_apply(&transaction, &dm), 0);
410  amxd_trans_clean(&transaction);
411 
412  amxd_trans_init(&transaction);
413  amxd_trans_select_pathf(&transaction, "MyRoot.MyTemplate2");
414  amxd_trans_add_inst(&transaction, 0, NULL);
415  assert_int_not_equal(amxd_trans_apply(&transaction, &dm), 0);
416 
417  amxd_trans_clean(&transaction);
418  amxd_dm_clean(&dm);
419 }
420 
421 void test_instance_index_overflow(UNUSED void** state) {
422  amxd_trans_t transaction;
423  amxd_object_t* instance = 0;
424 
425  test_build_dm();
426 
427  amxd_trans_init(&transaction);
428  amxd_trans_select_pathf(&transaction, "MyRoot.");
429  amxd_trans_set_value(uint32_t, &transaction, "Max", 5);
430  amxd_trans_select_pathf(&transaction, "MyRoot.MyTemplate2");
431  amxd_trans_add_inst(&transaction, UINT32_MAX, NULL);
432  amxd_trans_select_pathf(&transaction, ".^");
433  amxd_trans_add_inst(&transaction, 0, NULL);
434  assert_int_equal(amxd_trans_apply(&transaction, &dm), 0);
435  amxd_trans_clean(&transaction);
436 
437  instance = amxd_dm_findf(&dm, "MyRoot.MyTemplate2.%u", UINT32_MAX);
438  assert_non_null(instance);
439  instance = amxd_dm_findf(&dm, "MyRoot.MyTemplate2.1");
440  assert_non_null(instance);
441 
442  amxd_trans_init(&transaction);
443  amxd_trans_select_pathf(&transaction, "MyRoot.MyTemplate2");
444  amxd_trans_add_inst(&transaction, UINT32_MAX - 1, NULL);
445  amxd_trans_select_pathf(&transaction, ".^");
446  amxd_trans_add_inst(&transaction, 0, NULL);
447  assert_int_equal(amxd_trans_apply(&transaction, &dm), 0);
448 
449  instance = amxd_dm_findf(&dm, "MyRoot.MyTemplate2.%u", UINT32_MAX - 1);
450  assert_non_null(instance);
451  instance = amxd_dm_findf(&dm, "MyRoot.MyTemplate2.2");
452  assert_non_null(instance);
453 
454  amxd_trans_clean(&transaction);
455  amxd_dm_clean(&dm);
456 }
Ambiorix Data Model Default actions header file.
amxd_status_t amxd_action_object_add_inst(amxd_object_t *const object, amxd_param_t *const param, amxd_action_t reason, const amxc_var_t *const args, amxc_var_t *const retval, void *priv)
Ambiorix Data Model API header file.
amxd_object_t * amxd_dm_findf(amxd_dm_t *const dm, const char *abs_path,...) __attribute__((format(printf
Ambiorix Data Model RPC methods API header file.
Ambiorix Data Model API header file.
bool amxd_object_has_action_cb(amxd_object_t *const object, const amxd_action_t reason, amxd_action_fn_t fn)
amxd_status_t amxd_object_add_action_cb(amxd_object_t *const object, const amxd_action_t reason, amxd_action_fn_t fn, void *priv)
void amxd_object_set_action_cb_data(amxd_object_t *const object, const amxd_action_t reason, amxd_action_fn_t fn, void *data)
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)
bool amxd_param_has_action_cb(amxd_param_t *const param, const amxd_action_t reason, amxd_action_fn_t fn)
void amxd_param_set_action_cb_data(amxd_param_t *const param, const amxd_action_t reason, amxd_action_fn_t fn, void *data)
amxd_status_t amxd_param_add_action_cb(amxd_param_t *const param, const amxd_action_t reason, amxd_action_fn_t fn, void *priv)
Ambiorix Data Model API header file.
@ amxd_pattr_template
Definition: amxd_types.h:355
@ amxd_pattr_private
Definition: amxd_types.h:357
@ amxd_pattr_instance
Definition: amxd_types.h:356
@ amxd_pattr_unique
Definition: amxd_types.h:363
@ action_object_write
Definition: amxd_types.h:118
@ action_object_add_inst
Definition: amxd_types.h:123
@ action_param_destroy
Definition: amxd_types.h:116
@ action_object_read
Definition: amxd_types.h:117
@ action_object_destroy
Definition: amxd_types.h:125
@ action_param_validate
Definition: amxd_types.h:114
enum _amxd_action amxd_action_t
enum _amxd_status amxd_status_t
@ amxd_status_function_not_implemented
Definition: amxd_types.h:83
@ amxd_status_ok
Definition: amxd_types.h:78
@ amxd_status_unknown_error
Definition: amxd_types.h:79
@ amxd_oattr_read_only
Definition: amxd_types.h:199
@ amxd_oattr_private
Definition: amxd_types.h:202
@ amxd_dm_access_private
Definition: amxd_types.h:141
@ amxd_object_template
Definition: amxd_types.h:183
@ amxd_object_singleton
Definition: amxd_types.h:181
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.
Definition: amxd_dm.c:418
amxd_status_t amxd_dm_init(amxd_dm_t *dm)
Initializes a data model structure.
Definition: amxd_dm.c:334
void amxd_dm_clean(amxd_dm_t *dm)
Cleans a data model structure.
Definition: amxd_dm.c:365
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.
Definition: amxd_object.c:207
amxd_object_t * amxd_object_get_instance(const amxd_object_t *object, const char *name, uint32_t index)
Get an instance of the template object.
#define amxd_object_get_value(type, object, name, status)
Helper macro for getting a value.
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_set_attr(amxd_object_t *const object, const amxd_oattr_id_t attr, const bool enable)
Sets or unsets an object attribute.
Definition: amxd_object.c:269
amxd_status_t amxd_object_new(amxd_object_t **object, const amxd_object_type_t type, const char *name)
Data model object constructor function.
Definition: amxd_object.c:185
amxd_status_t amxd_action_param_check_minimum(amxd_object_t *object, amxd_param_t *param, amxd_action_t reason, const amxc_var_t *const args, amxc_var_t *const retval, void *priv)
Default check minimum parameter validate action implementation.
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_status_t amxd_trans_select_object(amxd_trans_t *trans, const amxd_object_t *const object)
Selects an object using an object pointer.
amxd_status_t amxd_trans_init(amxd_trans_t *const trans)
Initializes a transaction object.
amxc_var_t value
Definition: amxd_types.h:390
void test_instance_index_overflow(UNUSED void **state)
void test_instance_add_fails_when_max_instances_reached_with_param_ref(UNUSED void **state)
static amxd_status_t misbehaving_add_instance_action(amxd_object_t *object, UNUSED amxd_param_t *param, amxd_action_t reason, UNUSED const amxc_var_t *const args, UNUSED amxc_var_t *const retval, UNUSED void *priv)
static amxd_dm_t dm
void test_does_not_segfault_when_add_inst_action_is_misbehaving(UNUSED void **state)
static amxd_status_t test_cleanup_data(amxd_object_t *const object, amxd_param_t *const param, amxd_action_t reason, UNUSED const amxc_var_t *const args, UNUSED amxc_var_t *const retval, void *priv)
void test_amxd_object_add(UNUSED void **state)
void test_instance_add_fails_when_max_instances_reached(UNUSED void **state)
void test_instance_add_fails_when_invalid_values_provided(UNUSED void **state)
static amxd_object_t * test_build_dm(void)
static amxd_status_t status