libamxd  6.4.1
Data Model Manager
test_amxd_key_parameter.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 #include <unistd.h>
64 #include <signal.h>
65 #include <sys/signalfd.h>
66 #include <string.h>
67 #include <stdio.h>
68 
69 #include <amxc/amxc.h>
70 #include <amxp/amxp_signal.h>
71 #include <amxp/amxp_slot.h>
72 #include <amxp/amxp_expression.h>
73 
74 #include <amxd/amxd_common.h>
75 #include <amxd/amxd_transaction.h>
76 #include <amxd/amxd_dm.h>
77 #include <amxd/amxd_object.h>
79 #include <amxd/amxd_action.h>
80 
82 
83 #include <amxc/amxc_macros.h>
84 static amxd_dm_t dm;
85 
87  amxd_param_t* const param,
88  amxd_action_t reason,
89  UNUSED const amxc_var_t* const args,
90  UNUSED amxc_var_t* const retval,
91  void* priv) {
93  amxc_var_t* data = (amxc_var_t*) priv;
94 
95  if((reason != action_object_destroy) &&
96  ( reason != action_param_destroy)) {
98  goto exit;
99  }
100 
101  // action private data must not be removed when the action is used
102  // on derived objects.
103  // only remove action data when the action is owned by the object or
104  // parameter on which the action is called.
105  if(reason == action_object_destroy) {
107  amxc_var_delete(&data);
109  }
110  } else {
112  amxc_var_delete(&data);
114  }
115  }
116 
117 exit:
118  return status;
119 }
120 
121 
122 static void test_build_dm(void) {
123  amxd_object_t* object = NULL;
124  amxd_object_t* child_object = NULL;
125  amxd_param_t* param = NULL;
126  amxc_var_t value;
127  amxc_var_t* enum_data = NULL;
128 
129  amxc_var_init(&value);
130  amxc_var_set(cstring_t, &value, "TestValue");
131 
132  amxc_var_new(&enum_data);
133  amxc_var_set_type(enum_data, AMXC_VAR_ID_LIST);
134  amxc_var_add(cstring_t, enum_data, "UDP");
135  amxc_var_add(cstring_t, enum_data, "TCP");
136 
137  assert_int_equal(amxd_dm_init(&dm), 0);
138 
139  assert_int_equal(amxd_object_new(&object, amxd_object_singleton, "MyObject"), 0);
140  assert_int_equal(amxd_param_new(&param, "Param1", AMXC_VAR_ID_CSTRING), 0);
141  assert_int_equal(amxd_param_set_value(param, &value), 0);
142  assert_int_equal(amxd_object_add_param(object, param), 0);
143  assert_int_equal(amxd_dm_add_root_object(&dm, object), 0);
144 
145  assert_int_equal(amxd_object_new(&child_object, amxd_object_template, "ChildObject"), 0);
146  assert_int_equal(amxd_object_add_object(object, child_object), 0);
147  assert_int_equal(amxd_param_new(&param, "Param1", AMXC_VAR_ID_CSTRING), 0);
148  assert_int_equal(amxd_param_set_attr(param, amxd_pattr_key, true), 0);
149  assert_int_equal(amxd_object_add_param(child_object, param), 0);
150  assert_int_equal(amxd_param_new(&param, "Param2", AMXC_VAR_ID_BOOL), 0);
151  assert_int_equal(amxd_object_add_param(child_object, param), 0);
152  assert_int_equal(amxd_param_new(&param, "Param3", AMXC_VAR_ID_UINT32), 0);
153  assert_int_equal(amxd_object_add_param(child_object, param), 0);
154 
155  assert_int_equal(amxd_object_new(&child_object, amxd_object_template, "KeyValidateObject"), 0);
156  assert_int_equal(amxd_object_add_object(object, child_object), 0);
157  assert_int_equal(amxd_param_new(&param, "Param1", AMXC_VAR_ID_CSTRING), 0);
158  assert_int_equal(amxd_param_set_attr(param, amxd_pattr_key, true), 0);
159  assert_int_equal(amxd_param_set_attr(param, amxd_pattr_mutable, true), 0);
160  assert_int_equal(amxd_param_add_action_cb(param, action_param_validate, amxd_action_param_check_enum, enum_data), 0);
161  assert_int_equal(amxd_param_add_action_cb(param, action_param_destroy, amxd_param_cleanup_data, enum_data), 0);
162  assert_int_equal(amxd_object_add_param(child_object, param), 0);
163 
164  assert_int_equal(amxd_object_new(&child_object, amxd_object_template, "UKeyObject"), 0);
165  assert_int_equal(amxd_object_add_object(object, child_object), 0);
166  assert_int_equal(amxd_param_new(&param, "UKey1", AMXC_VAR_ID_CSTRING), 0);
167  assert_int_equal(amxd_param_set_attr(param, amxd_pattr_key, true), 0);
168  assert_int_equal(amxd_param_set_attr(param, amxd_pattr_unique, true), 0);
169  assert_int_equal(amxd_object_add_param(child_object, param), 0);
170  assert_int_equal(amxd_param_new(&param, "UKey2", AMXC_VAR_ID_CSTRING), 0);
171  assert_int_equal(amxd_param_set_attr(param, amxd_pattr_key, true), 0);
172  assert_int_equal(amxd_param_set_attr(param, amxd_pattr_unique, true), 0);
173  assert_int_equal(amxd_object_add_param(child_object, param), 0);
174  assert_int_equal(amxd_param_new(&param, "KeyParam1", AMXC_VAR_ID_CSTRING), 0);
175  assert_int_equal(amxd_param_set_attr(param, amxd_pattr_key, true), 0);
176  assert_int_equal(amxd_object_add_param(child_object, param), 0);
177  assert_int_equal(amxd_param_new(&param, "KeyParam2", AMXC_VAR_ID_CSTRING), 0);
178  assert_int_equal(amxd_param_set_attr(param, amxd_pattr_key, true), 0);
179  assert_int_equal(amxd_object_add_param(child_object, param), 0);
180  assert_int_equal(amxd_param_new(&param, "Param1", AMXC_VAR_ID_CSTRING), 0);
181  assert_int_equal(amxd_object_add_param(child_object, param), 0);
182  assert_int_equal(amxd_param_new(&param, "Param2", AMXC_VAR_ID_CSTRING), 0);
183  assert_int_equal(amxd_object_add_param(child_object, param), 0);
184 
185  assert_int_equal(amxd_object_new(&child_object, amxd_object_template, "AliasObject"), 0);
186  assert_int_equal(amxd_object_add_object(object, child_object), 0);
187  assert_int_equal(amxd_param_new(&param, "Alias", AMXC_VAR_ID_CSTRING), 0);
188  assert_int_equal(amxd_param_set_attr(param, amxd_pattr_key, true), 0);
189  assert_int_equal(amxd_param_set_attr(param, amxd_pattr_unique, true), 0);
190  assert_int_equal(amxd_object_add_param(child_object, param), 0);
191  assert_int_equal(amxd_param_new(&param, "Param1", AMXC_VAR_ID_CSTRING), 0);
192  assert_int_equal(amxd_object_add_param(child_object, param), 0);
193 
194  assert_int_equal(amxd_object_new(&child_object, amxd_object_template, "FakeAliasObject"), 0);
195  assert_int_equal(amxd_object_add_object(object, child_object), 0);
196  assert_int_equal(amxd_param_new(&param, "Alias", AMXC_VAR_ID_CSTRING), 0);
197  assert_int_equal(amxd_object_add_param(child_object, param), 0);
198  assert_int_equal(amxd_param_new(&param, "Param1", AMXC_VAR_ID_CSTRING), 0);
199  assert_int_equal(amxd_object_add_param(child_object, param), 0);
200 
201  assert_int_equal(amxd_object_new(&child_object, amxd_object_singleton, "TestSingleton"), 0);
202  assert_int_equal(amxd_param_new(&param, "Param1", AMXC_VAR_ID_CSTRING), 0);
203  assert_int_equal(amxd_object_add_param(child_object, param), 0);
204  assert_int_equal(amxd_object_add_object(object, child_object), 0);
205 
206  assert_int_equal(amxd_object_new(&child_object, amxd_object_mib, "TestMib"), 0);
207  assert_int_equal(amxd_param_new(&param, "Param1", AMXC_VAR_ID_CSTRING), 0);
208  assert_int_equal(amxd_object_add_param(child_object, param), 0);
209  assert_int_equal(amxd_dm_store_mib(&dm, child_object), 0);
210 
211  amxc_var_clean(&value);
212 }
213 
214 int test_key_parameter_setup(UNUSED void** state) {
215  test_build_dm();
216  return 0;
217 }
218 
219 int test_key_parameter_teardown(UNUSED void** state) {
220  amxd_dm_clean(&dm);
221 
222  return 0;
223 }
224 
225 void test_key_flag_is_set(UNUSED void** state) {
226  amxd_object_t* object = amxd_dm_findf(&dm, "MyObject.ChildObject");
227  amxd_param_t* param = amxd_object_get_param_def(object, "Param1");
228 
229  assert_true(amxd_param_is_attr_set(param, amxd_pattr_key));
230 }
231 
233  amxd_object_t* object = NULL;
234  amxd_param_t* param = NULL;
235 
236  object = amxd_dm_findf(&dm, "MyObject.ChildObject");
237  assert_int_equal(amxd_param_new(&param, "ParamExtra", AMXC_VAR_ID_CSTRING), 0);
238  assert_int_equal(amxd_param_set_attr(param, amxd_pattr_key, true), 0);
239  assert_int_equal(amxd_object_add_param(object, param), 0);
240 }
241 
242 void test_key_parameters_must_be_set(UNUSED void** state) {
243  amxd_trans_t transaction;
244  amxd_object_t* object = NULL;
245 
246  amxd_trans_init(&transaction);
247  amxd_trans_select_pathf(&transaction, "MyObject.ChildObject");
248  amxd_trans_add_inst(&transaction, 1, NULL);
249  assert_int_not_equal(amxd_trans_apply(&transaction, &dm), 0);
250  object = amxd_dm_findf(&dm, "MyObject.ChildObject.1");
251  assert_ptr_equal(object, NULL);
252 
253  amxd_trans_clean(&transaction);
254  amxd_trans_select_pathf(&transaction, "MyObject.ChildObject");
255  amxd_trans_add_inst(&transaction, 1, NULL);
256  amxd_trans_set_value(cstring_t, &transaction, "Param1", "TheKeyValue");
257  assert_int_not_equal(amxd_trans_apply(&transaction, &dm), 0);
258  object = amxd_dm_findf(&dm, "MyObject.ChildObject.1");
259  assert_ptr_equal(object, NULL);
260 
261  amxd_trans_clean(&transaction);
262  amxd_trans_select_pathf(&transaction, "MyObject.ChildObject");
263  amxd_trans_add_inst(&transaction, 1, NULL);
264  amxd_trans_set_value(cstring_t, &transaction, "Param1", "TheKeyValue");
265  amxd_trans_set_value(cstring_t, &transaction, "ParamExtra", "TheKeyValue");
266  assert_int_equal(amxd_trans_apply(&transaction, &dm), 0);
267  object = amxd_dm_findf(&dm, "MyObject.ChildObject.1");
268  assert_ptr_not_equal(object, NULL);
269 
270  amxd_trans_clean(&transaction);
271 }
272 
273 void test_key_parameters_must_be_unique(UNUSED void** state) {
274  amxd_trans_t transaction;
275  amxd_object_t* object = NULL;
276 
277  amxd_trans_init(&transaction);
278  amxd_trans_select_pathf(&transaction, "MyObject.ChildObject");
279  amxd_trans_add_inst(&transaction, 2, NULL);
280  amxd_trans_set_value(cstring_t, &transaction, "Param1", "TheKeyValue");
281  amxd_trans_set_value(cstring_t, &transaction, "ParamExtra", "TheKeyValue");
282  assert_int_not_equal(amxd_trans_apply(&transaction, &dm), 0);
283  object = amxd_dm_findf(&dm, "MyObject.ChildObject.2");
284  assert_ptr_equal(object, NULL);
285 
286  amxd_trans_clean(&transaction);
287  amxd_trans_select_pathf(&transaction, "MyObject.ChildObject");
288  amxd_trans_add_inst(&transaction, 2, NULL);
289  amxd_trans_set_value(cstring_t, &transaction, "Param1", "OtherValue");
290  amxd_trans_set_value(cstring_t, &transaction, "ParamExtra", "TheKeyValue");
291  assert_int_equal(amxd_trans_apply(&transaction, &dm), 0);
292  object = amxd_dm_findf(&dm, "MyObject.ChildObject.2");
293  assert_ptr_not_equal(object, NULL);
294 
295  amxd_trans_clean(&transaction);
296 }
297 
299  amxd_object_t* object = NULL;
300  amxd_param_t* param = NULL;
301 
302  object = amxd_dm_findf(&dm, "MyObject.ChildObject");
303  assert_int_equal(amxd_param_new(&param, "ParamExtra2", AMXC_VAR_ID_CSTRING), 0);
304  assert_int_equal(amxd_param_set_attr(param, amxd_pattr_key, true), 0);
305  assert_int_not_equal(amxd_object_add_param(object, param), 0);
306 
307  assert_ptr_equal(amxd_param_get_owner(param), NULL);
308  assert_ptr_equal(amxd_object_get_param_def(object, "ParamExtra2"), NULL);
309 
310  amxd_param_delete(&param);
311 }
312 
313 void test_can_not_unset_key_attr(UNUSED void** state) {
314  amxd_object_t* object = NULL;
315  amxd_param_t* param = NULL;
316 
317  object = amxd_dm_findf(&dm, "MyObject.ChildObject");
318  param = amxd_object_get_param_def(object, "ParamExtra");
319  assert_int_not_equal(amxd_param_set_attr(param, amxd_pattr_key, false), 0);
320 
321  object = amxd_dm_findf(&dm, "MyObject.ChildObject.1");
322  param = amxd_object_get_param_def(object, "ParamExtra");
323  assert_int_not_equal(amxd_param_set_attr(param, amxd_pattr_key, false), 0);
324 }
325 
326 void test_can_not_delete_key_parameter(UNUSED void** state) {
327  amxd_object_t* object = NULL;
328  amxd_param_t* param = NULL;
329 
330  object = amxd_dm_findf(&dm, "MyObject.ChildObject");
331  param = amxd_object_get_param_def(object, "ParamExtra");
332  assert_int_not_equal(amxd_param_delete(&param), 0);
333  param = amxd_object_get_param_def(object, "ParamExtra");
334  assert_ptr_not_equal(param, NULL);
335 
336  object = amxd_dm_findf(&dm, "MyObject.ChildObject.1");
337  param = amxd_object_get_param_def(object, "ParamExtra");
338  assert_int_not_equal(amxd_param_delete(&param), 0);
339  param = amxd_object_get_param_def(object, "ParamExtra");
340  assert_ptr_not_equal(param, NULL);
341 }
342 
343 void test_can_not_add_key_param_to(UNUSED void** state) {
344  amxd_object_t* object = NULL;
345  amxd_param_t* param = NULL;
346 
347  assert_int_equal(amxd_param_new(&param, "TestParam", AMXC_VAR_ID_CSTRING), 0);
348  assert_int_equal(amxd_param_set_attr(param, amxd_pattr_key, true), 0);
349 
350  // singleton
351  object = amxd_dm_findf(&dm, "MyObject.TestSingleton");
352  assert_ptr_not_equal(object, NULL);
353  assert_int_not_equal(amxd_object_add_param(object, param), 0);
354  assert_ptr_equal(amxd_object_get_param_def(object, "TestParam"), NULL);
355  assert_ptr_equal(amxd_param_get_owner(param), NULL);
356 
357  // mib
358  object = amxd_dm_get_mib(&dm, "TestMib");
359  assert_ptr_not_equal(object, NULL);
360  assert_int_not_equal(amxd_object_add_param(object, param), 0);
361  assert_ptr_equal(amxd_object_get_param_def(object, "TestParam"), NULL);
362  assert_ptr_equal(amxd_param_get_owner(param), NULL);
363 
364  // instance
365  object = amxd_dm_findf(&dm, "MyObject.ChildObject.1");
366  assert_ptr_not_equal(object, NULL);
367  assert_int_not_equal(amxd_object_add_param(object, param), 0);
368  assert_ptr_equal(amxd_object_get_param_def(object, "TestParam"), NULL);
369  assert_ptr_equal(amxd_param_get_owner(param), NULL);
370 
371  amxd_param_delete(&param);
372 }
373 
374 void test_can_not_set_key_attr_on_params_of(UNUSED void** state) {
375  amxd_object_t* object = NULL;
376  amxd_param_t* param = NULL;
377 
378  // singleton
379  object = amxd_dm_findf(&dm, "MyObject.TestSingleton");
380  assert_ptr_not_equal(object, NULL);
381  param = amxd_object_get_param_def(object, "Param1");
382  assert_ptr_not_equal(param, NULL);
383  assert_int_not_equal(amxd_param_set_attr(param, amxd_pattr_key, true), 0);
384 
385  // mib
386  object = amxd_dm_get_mib(&dm, "TestMib");
387  assert_ptr_not_equal(object, NULL);
388  param = amxd_object_get_param_def(object, "Param1");
389  assert_ptr_not_equal(param, NULL);
390  assert_int_not_equal(amxd_param_set_attr(param, amxd_pattr_key, true), 0);
391 
392  // instance
393  object = amxd_dm_findf(&dm, "MyObject.ChildObject.1");
394  assert_ptr_not_equal(object, NULL);
395  param = amxd_object_get_param_def(object, "Param2");
396  assert_ptr_not_equal(param, NULL);
397  assert_int_not_equal(amxd_param_set_attr(param, amxd_pattr_key, true), 0);
398 
399  // template with instances
400  object = amxd_dm_findf(&dm, "MyObject.ChildObject");
401  assert_ptr_not_equal(object, NULL);
402  param = amxd_object_get_param_def(object, "Param2");
403  assert_ptr_not_equal(param, NULL);
404  assert_int_not_equal(amxd_param_set_attr(param, amxd_pattr_key, true), 0);
405 }
406 
407 void test_object_has_key_parameters(UNUSED void** state) {
408  amxd_object_t* object = NULL;
409 
410  object = amxd_dm_findf(&dm, "MyObject.TestSingleton");
411  assert_ptr_not_equal(object, NULL);
412  assert_false(amxd_object_has_keys(object));
413 
414  object = amxd_dm_get_mib(&dm, "TestMib");
415  assert_ptr_not_equal(object, NULL);
416  assert_false(amxd_object_has_keys(object));
417 
418  object = amxd_dm_findf(&dm, "MyObject.ChildObject.1");
419  assert_ptr_not_equal(object, NULL);
420  assert_true(amxd_object_has_keys(object));
421 
422  object = amxd_dm_findf(&dm, "MyObject.ChildObject");
423  assert_ptr_not_equal(object, NULL);
424  assert_true(amxd_object_has_keys(object));
425 }
426 
427 void test_key_parameter_values_are_immutable(UNUSED void** state) {
428  amxd_object_t* object = NULL;
429 
430  object = amxd_dm_findf(&dm, "MyObject.ChildObject.1");
431  assert_ptr_not_equal(object, NULL);
432  assert_true(amxd_object_has_keys(object));
433 
434  assert_int_not_equal(amxd_object_set_value(cstring_t, object, "ParamExtra", "MyNewValue"), 0);
435  assert_int_not_equal(amxd_object_set_value(cstring_t, object, "Param1", "MyNewValue"), 0);
436  assert_int_equal(amxd_object_set_value(uint32_t, object, "Param3", 500), 0);
437 }
438 
439 void test_can_build_key_expression(UNUSED void** state) {
440  amxc_var_t key_params;
441  amxp_expr_t* expr = NULL;
442  amxd_object_t* object = NULL;
443 
444  amxc_var_init(&key_params);
445  object = amxd_dm_findf(&dm, "MyObject.ChildObject");
446 
447  amxc_var_set_type(&key_params, AMXC_VAR_ID_HTABLE);
448  amxc_var_add_key(cstring_t, &key_params, "Param1", "test");
449  amxc_var_add_key(cstring_t, &key_params, "ParamExtra", "test");
450  assert_int_equal(amxd_object_new_key_expr(object, &expr, &key_params), 0);
451  assert_ptr_not_equal(expr, NULL);
452  assert_false(amxd_object_has_matching_instances(object, expr));
453 
454  amxp_expr_delete(&expr);
455  amxc_var_clean(&key_params);
456 
457  amxc_var_set_type(&key_params, AMXC_VAR_ID_HTABLE);
458  amxc_var_add_key(cstring_t, &key_params, "Param1", "TheKeyValue");
459  amxc_var_add_key(cstring_t, &key_params, "ParamExtra", "TheKeyValue");
460  assert_int_equal(amxd_object_new_key_expr(object, &expr, &key_params), 0);
461  assert_ptr_not_equal(expr, NULL);
462  assert_true(amxd_object_has_matching_instances(object, expr));
463 
464  amxp_expr_delete(&expr);
465  amxc_var_clean(&key_params);
466 }
467 
469  amxd_object_t* object = NULL;
470  amxd_object_t* instance = NULL;
471  amxc_var_t key_params;
472  amxc_var_t* param1 = NULL;
473  amxc_var_t* paramextra = NULL;
474 
475  amxc_var_init(&key_params);
476  amxc_var_set_type(&key_params, AMXC_VAR_ID_HTABLE);
477  param1 = amxc_var_add_key(cstring_t, &key_params, "Param1", "TheKeyValue");
478  paramextra = amxc_var_add_key(cstring_t, &key_params, "ParamExtra", "TheKeyValue");
479 
480  object = amxd_dm_findf(&dm, "MyObject.ChildObject");
481  assert_int_not_equal(amxd_object_add_instance(&instance, object, NULL, 0, &key_params), 0);
482  assert_ptr_equal(instance, NULL);
483 
484  amxc_var_set(cstring_t, param1, "Unique");
485  assert_int_equal(amxd_object_add_instance(&instance, object, NULL, 0, &key_params), 0);
486  assert_ptr_not_equal(instance, NULL);
487 
488  amxc_var_set(cstring_t, paramextra, "Unique");
489  assert_int_equal(amxd_object_add_instance(NULL, object, NULL, 0, &key_params), 0);
490 
491  amxc_var_clean(&key_params);
492 }
493 
494 void test_can_check_object_has_key_parameters(UNUSED void** state) {
495  amxd_object_t* object = NULL;
496 
497  object = amxd_dm_findf(&dm, "MyObject.ChildObject");
498  assert_true(amxd_object_has_keys(object));
499 
500  object = amxd_dm_findf(&dm, "MyObject.TestSingleton");
501  assert_false(amxd_object_has_keys(object));
502 
503  object = amxd_dm_findf(&dm, "MyObject.ChildObject.1");
504  assert_true(amxd_object_has_keys(object));
505 
506  assert_false(amxd_object_has_keys(NULL));
507 }
508 
509 void test_can_create_instance_with_unique_keys(UNUSED void** state) {
510  amxd_object_t* object = NULL;
511  amxc_var_t key_params;
512  amxd_object_t* instance = NULL;
513  amxc_var_t* uk1 = NULL;
514  amxc_var_t* uk2 = NULL;
515  amxc_var_t* k1 = NULL;
516  amxc_var_t* k2 = NULL;
517  amxc_var_t* p1 = NULL;
518 
519  amxc_var_init(&key_params);
520  amxc_var_set_type(&key_params, AMXC_VAR_ID_HTABLE);
521 
522  object = amxd_dm_findf(&dm, "MyObject.UKeyObject");
523  assert_true(amxd_object_has_keys(object));
524 
525  uk1 = amxc_var_add_key(cstring_t, &key_params, "UKey1", "U1");
526  uk2 = amxc_var_add_key(cstring_t, &key_params, "UKey2", "U2");
527  k1 = amxc_var_add_key(cstring_t, &key_params, "KeyParam1", "U3");
528  k2 = amxc_var_add_key(cstring_t, &key_params, "KeyParam2", "U4");
529  p1 = amxc_var_add_key(cstring_t, &key_params, "Param1", "*");
530  amxc_var_add_key(cstring_t, &key_params, "Param2", "]");
531 
532  assert_int_equal(amxd_object_add_instance(&instance, object, NULL, 0, &key_params), 0);
533  assert_non_null(instance);
534  assert_int_not_equal(amxd_object_add_instance(&instance, object, NULL, 0, &key_params), 0);
535 
536  amxc_var_set(cstring_t, uk1, "U2");
537  amxc_var_set(cstring_t, uk2, "U1");
538  amxc_var_set(cstring_t, k1, "U4");
539  amxc_var_set(cstring_t, k2, "U3");
540  amxc_var_set(cstring_t, p1, "[");
541  assert_int_equal(amxd_object_add_instance(&instance, object, NULL, 0, &key_params), 0);
542  assert_non_null(instance);
543 
544  amxc_var_set(cstring_t, uk1, "U9");
545  amxc_var_set(cstring_t, uk2, "U9");
546  amxc_var_set(cstring_t, k1, "U4");
547  amxc_var_set(cstring_t, k2, "U2");
548  amxc_var_set(cstring_t, p1, "[.*]");
549  assert_int_equal(amxd_object_add_instance(&instance, object, NULL, 0, &key_params), 0);
550  assert_non_null(instance);
551 
552  amxc_var_clean(&key_params);
553 }
554 
555 void test_can_find_object_with_keys(UNUSED void** state) {
556  amxd_object_t* object = amxd_dm_findf(&dm, "MyObject.UKeyObject.[UKey1=='U2']");
557  assert_non_null(object);
558 
559  object = amxd_dm_findf(&dm, "MyObject.UKeyObject.[UKey2=='U2']");
560  assert_non_null(object);
561 
562  object = amxd_dm_findf(&dm, "MyObject.UKeyObject.[KeyParam1=='U3'&&KeyParam2=='U4']");
563  assert_non_null(object);
564 
565  object = amxd_dm_findf(&dm, "MyObject.UKeyObject.[KeyParam1=='U4'&&KeyParam2=='U3']");
566  assert_non_null(object);
567 
568  object = amxd_dm_findf(&dm, "MyObject.UKeyObject.[Param1=='*']");
569  assert_non_null(object);
570 
571  object = amxd_dm_findf(&dm, "MyObject.UKeyObject.[Param1=='[']");
572  assert_non_null(object);
573 
574  object = amxd_dm_findf(&dm, "MyObject.UKeyObject.[Param1=='[.*]']");
575  assert_non_null(object);
576 }
577 
579  amxd_object_t* object = amxd_dm_findf(&dm, "MyObject.UKeyObject.[UKey1!>'U2\']");
580  assert_null(object);
581  assert_int_equal(amxd_dm_get_status(&dm), amxd_status_invalid_path);
582 
583  object = amxd_dm_findf(&dm, "MyObject.UKeyObject.[]");
584  assert_null(object);
585  assert_int_equal(amxd_dm_get_status(&dm), amxd_status_invalid_path);
586 
587  object = amxd_dm_findf(&dm, "MyObject.UKeyObject.*");
588  assert_null(object);
589  assert_int_equal(amxd_dm_get_status(&dm), amxd_status_invalid_path);
590 
591  object = amxd_dm_findf(&dm, "MyObject.UKeyObject.[NotExisiting>400]");
592  assert_null(object);
593  assert_int_equal(amxd_dm_get_status(&dm), amxd_status_invalid_path);
594 
595  object = amxd_dm_findf(&dm, "MyObject.UKeyObject.[UKey2==100");
596  assert_null(object);
597  assert_int_equal(amxd_dm_get_status(&dm), amxd_status_invalid_path);
598 
599  object = amxd_dm_findf(&dm, "MyObject.UKeyObject.[KeyParam1=='U4']");
600  assert_null(object);
601  assert_int_equal(amxd_dm_get_status(&dm), amxd_status_duplicate);
602 
603  object = amxd_dm_findf(&dm, "MyObject.UKeyObject.[UKey1=='Z999']");
604  assert_null(object);
605  assert_int_equal(amxd_dm_get_status(&dm), amxd_status_ok);
606 
607  object = amxd_dm_findf(&dm, "MyObject.UKeyObject.[2A]");
608  assert_null(object);
609  assert_int_equal(amxd_dm_get_status(&dm), amxd_status_invalid_path);
610 
611  object = amxd_dm_findf(&dm, "MyObject.[2A]");
612  assert_null(object);
613  assert_int_equal(amxd_dm_get_status(&dm), amxd_status_invalid_path);
614 
615  object = amxd_dm_findf(&dm, "MyObject.[Param1==\"TestValue\"]");
616  assert_null(object);
617  assert_int_equal(amxd_dm_get_status(&dm), amxd_status_invalid_path);
618 
619  object = amxd_dm_findf(&dm, "MyObject.UKeyObject.[Param2==']']");
620  assert_null(object);
621  assert_int_equal(amxd_dm_get_status(&dm), amxd_status_duplicate);
622 }
623 
624 void test_find_fails_with_wildcard(UNUSED void** state) {
625  amxd_object_t* object = NULL;
626 
627  object = amxd_dm_findf(&dm, "MyObject.UKeyObject.*");
628  assert_null(object);
629  assert_int_equal(amxd_dm_get_status(&dm), amxd_status_invalid_path);
630 }
631 
632 void test_can_create_instance_with_alias(UNUSED void** state) {
633  amxd_object_t* object = NULL;
634  amxd_object_t* instance = NULL;
635  char* text = NULL;
636  amxc_var_t key_params;
637 
638  amxc_var_init(&key_params);
639  amxc_var_set_type(&key_params, AMXC_VAR_ID_HTABLE);
640 
641  object = amxd_dm_findf(&dm, "MyObject.AliasObject");
642  assert_true(amxd_object_has_keys(object));
643 
644  assert_int_equal(amxd_object_new_instance(&instance, object, "SillyName", 0, NULL), 0);
645  assert_non_null(instance);
646  assert_string_equal(amxd_object_get_name(instance, AMXD_OBJECT_NAMED), "SillyName");
647  text = amxd_object_get_value(cstring_t, instance, "Alias", NULL);
648  assert_non_null(text);
649  assert_string_equal(text, "SillyName");
650  free(text);
651 
652  assert_int_equal(amxd_object_new_instance(&instance, object, NULL, 0, NULL), 0);
653  assert_non_null(instance);
654  assert_string_equal(amxd_object_get_name(instance, AMXD_OBJECT_NAMED), "cpe-AliasObject-2");
655  text = amxd_object_get_value(cstring_t, instance, "Alias", NULL);
656  assert_non_null(text);
657  assert_string_equal(text, "cpe-AliasObject-2");
658  free(text);
659 
660  amxc_var_add_key(cstring_t, &key_params, "Alias", "T&T-%CPE");
661  assert_int_equal(amxd_object_add_instance(&instance, object, NULL, 0, &key_params), 0);
662  assert_non_null(instance);
663  assert_string_equal(amxd_object_get_name(instance, AMXD_OBJECT_NAMED), "T&T-%CPE");
664  text = amxd_object_get_value(cstring_t, instance, "Alias", NULL);
665  assert_non_null(text);
666  assert_string_equal(text, "T&T-%CPE");
667  free(text);
668 
669  amxc_var_clean(&key_params);
670 }
671 
673  amxd_object_t* object = NULL;
674  amxd_object_t* instance = NULL;
675  char* text = NULL;
676  amxc_var_t key_params;
677 
678  amxc_var_init(&key_params);
679  amxc_var_set_type(&key_params, AMXC_VAR_ID_HTABLE);
680 
681  object = amxd_dm_findf(&dm, "MyObject.FakeAliasObject");
682  assert_false(amxd_object_has_keys(object));
683 
684  assert_int_equal(amxd_object_new_instance(&instance, object, "SillyName", 0, NULL), 0);
685  assert_non_null(instance);
686  assert_string_equal(amxd_object_get_name(instance, AMXD_OBJECT_NAMED), "SillyName");
687  text = amxd_object_get_value(cstring_t, instance, "Alias", NULL);
688  assert_string_equal(text, "");
689  free(text);
690 
691  assert_int_equal(amxd_object_new_instance(&instance, object, NULL, 0, NULL), 0);
692  assert_non_null(instance);
693  assert_string_equal(amxd_object_get_name(instance, AMXD_OBJECT_NAMED), "2");
694  text = amxd_object_get_value(cstring_t, instance, "Alias", NULL);
695  assert_string_equal(text, "");
696  free(text);
697 
698  amxc_var_add_key(cstring_t, &key_params, "Alias", "SillyName");
699  assert_int_equal(amxd_object_add_instance(&instance, object, NULL, 0, &key_params), 0);
700  assert_non_null(instance);
701  assert_string_equal(amxd_object_get_name(instance, AMXD_OBJECT_NAMED), "3");
702  text = amxd_object_get_value(cstring_t, instance, "Alias", NULL);
703  assert_non_null(text);
704  assert_string_equal(text, "SillyName");
705  free(text);
706 
707  amxc_var_clean(&key_params);
708 }
709 
711  amxd_object_t* object = NULL;
712  amxd_object_t* instance = NULL;
713  amxc_var_t key_params;
714  amxc_var_t* alias = NULL;
715 
716  amxc_var_init(&key_params);
717  amxc_var_set_type(&key_params, AMXC_VAR_ID_HTABLE);
718 
719  object = amxd_dm_findf(&dm, "MyObject.AliasObject");
720  assert_true(amxd_object_has_keys(object));
721 
722  alias = amxc_var_add_key(bool, &key_params, "Alias", true);
723  assert_int_not_equal(amxd_object_add_instance(&instance, object, NULL, 0, &key_params), 0);
724  assert_null(instance);
725 
726  amxc_var_set(ssv_string_t, alias, "YAA");
727  assert_int_equal(amxd_object_add_instance(&instance, object, NULL, 0, &key_params), 0);
728 
729  amxc_var_set(uint32_t, alias, 1024);
730  assert_int_not_equal(amxd_object_add_instance(&instance, object, NULL, 0, &key_params), 0);
731  assert_null(instance);
732 
733  amxc_var_set(csv_string_t, alias, "YAA2");
734  assert_int_equal(amxd_object_add_instance(&instance, object, NULL, 0, &key_params), 0);
735 
736  amxc_var_clean(&key_params);
737 }
738 
740  amxd_object_t* object = NULL;
741  amxd_object_t* instance = NULL;
742 
743  amxc_var_t key_params;
744 
745  amxc_var_init(&key_params);
746  amxc_var_set_type(&key_params, AMXC_VAR_ID_HTABLE);
747 
748  object = amxd_dm_findf(&dm, "MyObject.AliasObject");
749  assert_true(amxd_object_has_keys(object));
750 
751  assert_int_not_equal(amxd_object_new_instance(&instance, object, "2nd-SillyName", 0, NULL), 0);
752  assert_null(instance);
753 
754  amxc_var_add_key(cstring_t, &key_params, "Alias", "3th-SillyName");
755  assert_int_not_equal(amxd_object_add_instance(&instance, object, NULL, 0, &key_params), 0);
756  assert_null(instance);
757 
758  amxc_var_clean(&key_params);
759 }
760 
761 void test_can_find_instances_with_alias(UNUSED void** state) {
762  amxd_object_t* object = NULL;
763  amxd_object_t* instance = NULL;
764  amxd_object_t* finstance = NULL;
765  char* text = NULL;
766 
767  object = amxd_dm_findf(&dm, "MyObject.AliasObject");
768  assert_true(amxd_object_has_keys(object));
769 
770  assert_int_equal(amxd_object_new_instance(&instance, object, "Unique.Alias.Name", 0, NULL), 0);
771  assert_non_null(instance);
772  assert_string_equal(amxd_object_get_name(instance, AMXD_OBJECT_NAMED), "Unique.Alias.Name");
773  text = amxd_object_get_value(cstring_t, instance, "Alias", NULL);
774  assert_non_null(text);
775  assert_string_equal(text, "Unique.Alias.Name");
776  free(text);
777 
778  finstance = amxd_dm_findf(&dm, "MyObject.AliasObject.Unique.Alias.Name");
779  assert_null(finstance);
780 
781  finstance = amxd_dm_findf(&dm, "MyObject.AliasObject.\"Unique.Alias.Name\"");
782  assert_null(finstance);
783 
784  finstance = amxd_dm_findf(&dm, "MyObject.AliasObject.'Unique.Alias.Name'");
785  assert_null(finstance);
786 
787  finstance = amxd_dm_findf(&dm, "MyObject.AliasObject.[Unique.Alias.Name]");
788  assert_non_null(finstance);
789  assert_ptr_equal(finstance, instance);
790 
791  finstance = amxd_dm_findf(&dm, "MyObject.AliasObject.[Alias == 'Unique.Alias.Name']");
792  assert_non_null(finstance);
793  assert_ptr_equal(finstance, instance);
794 }
795 
797  amxd_trans_t transaction;
798  amxd_object_t* object = NULL;
799 
800  amxd_trans_init(&transaction);
801  amxd_trans_select_pathf(&transaction, "MyObject.KeyValidateObject");
802  amxd_trans_add_inst(&transaction, 1, NULL);
803  amxd_trans_set_value(cstring_t, &transaction, "Param1", "UDP");
804  assert_int_equal(amxd_trans_apply(&transaction, &dm), 0);
805  object = amxd_dm_findf(&dm, "MyObject.KeyValidateObject.1");
806  assert_non_null(object);
807 
808  amxd_trans_clean(&transaction);
809 }
810 
811 void test_can_change_mutable_key(UNUSED void** state) {
812  amxd_trans_t transaction;
813  amxd_object_t* object = NULL;
814 
815  amxd_trans_init(&transaction);
816  amxd_trans_select_pathf(&transaction, "MyObject.KeyValidateObject.1.");
817  amxd_trans_set_value(cstring_t, &transaction, "Param1", "TCP");
818  assert_int_equal(amxd_trans_apply(&transaction, &dm), 0);
819  object = amxd_dm_findf(&dm, "MyObject.KeyValidateObject.1");
820  assert_non_null(object);
821 
822  amxd_trans_clean(&transaction);
823 }
824 
825 void test_adding_duplicate_fails(UNUSED void** state) {
826  amxd_trans_t transaction;
827  amxd_object_t* object = NULL;
828 
829  amxd_trans_init(&transaction);
830  amxd_trans_select_pathf(&transaction, "MyObject.KeyValidateObject");
831  amxd_trans_add_inst(&transaction, 2, NULL);
832  amxd_trans_set_value(cstring_t, &transaction, "Param1", "TCP");
833  assert_int_not_equal(amxd_trans_apply(&transaction, &dm), 0);
834  object = amxd_dm_findf(&dm, "MyObject.KeyValidateObject.2.");
835  assert_null(object);
836 
837  amxd_trans_clean(&transaction);
838 }
839 
841  amxd_trans_t transaction;
842  amxd_object_t* object = NULL;
843 
844  amxd_trans_init(&transaction);
845  amxd_trans_select_pathf(&transaction, "MyObject.KeyValidateObject");
846  amxd_trans_add_inst(&transaction, 2, NULL);
847  amxd_trans_set_value(cstring_t, &transaction, "Param1", "UDP");
848  assert_int_equal(amxd_trans_apply(&transaction, &dm), 0);
849  object = amxd_dm_findf(&dm, "MyObject.KeyValidateObject.2.");
850  assert_non_null(object);
851  amxd_trans_clean(&transaction);
852 
853  amxd_trans_init(&transaction);
854  amxd_trans_select_pathf(&transaction, "MyObject.KeyValidateObject.1.");
855  amxd_trans_set_value(cstring_t, &transaction, "Param1", "UDP");
856  assert_int_not_equal(amxd_trans_apply(&transaction, &dm), 0);
857  object = amxd_dm_findf(&dm, "MyObject.KeyValidateObject.1");
858  assert_non_null(object);
859  amxd_trans_clean(&transaction);
860 
861  amxd_trans_init(&transaction);
862  amxd_trans_select_pathf(&transaction, "MyObject.KeyValidateObject.2.");
863  amxd_trans_set_value(cstring_t, &transaction, "Param1", "TCP");
864  assert_int_not_equal(amxd_trans_apply(&transaction, &dm), 0);
865  object = amxd_dm_findf(&dm, "MyObject.KeyValidateObject.2");
866  assert_non_null(object);
867 
868  amxd_trans_clean(&transaction);
869 
870 }
Ambiorix Data Model Default actions header file.
Ambiorix Data Model API header file.
amxd_status_t amxd_dm_store_mib(amxd_dm_t *const dm, amxd_object_t *const object)
Definition: amxd_dm.c:378
amxd_object_t * amxd_dm_get_mib(amxd_dm_t *const dm, const char *name)
Definition: amxd_dm.c:397
amxd_object_t * amxd_dm_findf(amxd_dm_t *const dm, const char *abs_path,...) __attribute__((format(printf
static amxd_status_t amxd_dm_get_status(amxd_dm_t *dm)
Definition: amxd_dm.h:292
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)
void amxd_object_set_action_cb_data(amxd_object_t *const object, const amxd_action_t reason, amxd_action_fn_t fn, void *data)
bool amxd_object_has_keys(amxd_object_t *const instance)
amxd_status_t amxd_object_new_key_expr(amxd_object_t *const templ, amxp_expr_t **expr, const amxc_var_t *const data)
bool amxd_object_has_matching_instances(const amxd_object_t *const templ, amxp_expr_t *expr)
bool amxd_param_is_attr_set(const amxd_param_t *const param, const amxd_pattr_id_t attr)
amxd_status_t amxd_param_new(amxd_param_t **param, const char *name, const uint32_t type)
amxd_status_t amxd_param_set_value(amxd_param_t *const param, const amxc_var_t *const value)
amxd_status_t amxd_param_set_attr(amxd_param_t *param, const amxd_pattr_id_t attr, const bool enable)
amxd_object_t * amxd_param_get_owner(const amxd_param_t *const param)
amxd_status_t amxd_param_delete(amxd_param_t **param)
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_unique
Definition: amxd_types.h:363
@ amxd_pattr_mutable
Definition: amxd_types.h:365
@ amxd_pattr_key
Definition: amxd_types.h:362
@ action_param_destroy
Definition: amxd_types.h:116
@ 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_invalid_path
Definition: amxd_types.h:99
@ amxd_status_ok
Definition: amxd_types.h:78
@ amxd_status_duplicate
Definition: amxd_types.h:91
#define AMXD_OBJECT_NAMED
Name and path format flag - default behavior, use name for instance objects.
Definition: amxd_object.h:164
@ amxd_object_template
Definition: amxd_types.h:183
@ amxd_object_mib
Definition: amxd_types.h:188
@ 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
#define amxd_object_get_value(type, object, name, status)
Helper macro for getting a value.
#define amxd_object_set_value(type, object, name, value)
Helper macro for setting a value.
amxd_param_t * amxd_object_get_param_def(const amxd_object_t *const object, const char *name)
Gets a parameter definition from an object.
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_instance(amxd_object_t **object, amxd_object_t *templ, const char *name, uint32_t index, amxc_var_t *values)
Data model object constructor function.
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_object_add_instance(amxd_object_t **object, amxd_object_t *templ, const char *name, uint32_t index, amxc_var_t *values)
Data model object constructor function.
const char * amxd_object_get_name(const amxd_object_t *const object, const uint32_t flags)
Get the name of the object (or index as a string for instance objects)
Definition: amxd_object.c:239
amxd_status_t amxd_action_param_check_enum(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 enum 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_trans_init(amxd_trans_t *const trans)
Initializes a transaction object.
void test_can_not_add_key_param_to(UNUSED void **state)
void test_creation_fails_when_alias_value_is_wrong_type(UNUSED void **state)
void test_can_check_object_has_key_parameters(UNUSED void **state)
void test_can_not_delete_key_parameter(UNUSED void **state)
void test_find_fails_with_invalid_expression_part(UNUSED void **state)
static amxd_dm_t dm
void test_key_parameters_must_be_set(UNUSED void **state)
void test_can_build_key_expression(UNUSED void **state)
void test_can_find_object_with_keys(UNUSED void **state)
static void test_build_dm(void)
static amxd_status_t amxd_param_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_key_flag_is_set(UNUSED void **state)
void test_can_change_mutable_key(UNUSED void **state)
void test_can_create_instances_with_keys_that_has_validation(UNUSED void **state)
void test_can_not_unset_key_attr(UNUSED void **state)
void test_find_fails_with_wildcard(UNUSED void **state)
void test_creation_fails_when_alias_starts_with_number(UNUSED void **state)
void test_can_create_instance_with_non_key_alias(UNUSED void **state)
void test_can_create_instance_with_alias(UNUSED void **state)
void test_key_parameters_must_be_unique(UNUSED void **state)
void test_adding_duplicate_fails(UNUSED void **state)
int test_key_parameter_setup(UNUSED void **state)
void test_can_not_set_key_attr_on_params_of(UNUSED void **state)
int test_key_parameter_teardown(UNUSED void **state)
void test_can_add_key_param_if_no_instances_exist(UNUSED void **state)
void test_key_parameter_values_are_immutable(UNUSED void **state)
void test_can_not_add_key_params_if_instances_exist(UNUSED void **state)
void test_can_find_instances_with_alias(UNUSED void **state)
void test_amxd_object_add_instance_verifies_keys(UNUSED void **state)
void test_can_create_instance_with_unique_keys(UNUSED void **state)
void test_object_has_key_parameters(UNUSED void **state)
void test_changing_mutable_key_fails_if_duplicate(UNUSED void **state)
static amxd_status_t status