Line data Source code
1 : /**
2 : * @file
3 : *
4 : * @brief Tests for the typechecker plugin
5 : *
6 : * @copyright BSD License (see LICENSE.md or https://www.libelektra.org)
7 : *
8 : */
9 :
10 : #include <stdlib.h>
11 : #include <string.h>
12 :
13 : #include <kdbconfig.h>
14 :
15 : #include <tests_plugin.h>
16 :
17 : #define LONG_REGEX \
18 : "-[1-9]|-214748364[0-8]|-?[1-9][0-9]|-?[1-9][0-9][0-9]|-?[1-9][0-9][0-9][0-9]|-?[1-9][0-9][0-9][0-9][0-9]|-?[1-9][0-9][0-9][0-9][" \
19 : "0-9][0-9]|-?[1-9][0-9][0-9][0-9][0-9][0-9][0-9]|-?[1-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]|-?[1-9][0-9][0-9][0-9][0-9][0-9][0-9]" \
20 : "[0-9][0-9]|-?1[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]|-?20[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]|-?21[0-3][0-9][0-9][0-" \
21 : "9][0-9][0-9][0-9][0-9]|-?214[0-6][0-9][0-9][0-9][0-9][0-9][0-9]|-?2147[0-3][0-9][0-9][0-9][0-9][0-9]|-?21474[0-7][0-9][0-9][0-9]" \
22 : "[0-9]|-?214748[0-2][0-9][0-9][0-9]|-?2147483[0-5][0-9][0-9]|-?21474836[0-3][0-9]|[0-9]|214748364[0-7]"
23 : #define PARENT_KEY_NAME "user/tests/typechecker"
24 : #define KEY1_NAME PARENT_KEY_NAME "/key1"
25 : #define KEY2_NAME PARENT_KEY_NAME "/key2"
26 : #define KEY3_NAME PARENT_KEY_NAME "/key3"
27 : #define KEY4_NAME PARENT_KEY_NAME "/key4"
28 :
29 2 : static KeySet * keysetWithStandardFunctions (void)
30 : {
31 2 : KeySet * ks = ksNew (0, KS_END);
32 :
33 2 : ksAppendKey (ks, keyNew (PARENT_KEY_NAME "/elektra/spec/fallback/#", KEY_META, "elektra/spec/order", "10", KEY_META,
34 : "elektra/spec/impl", "fallback a b = link a b", KEY_END));
35 :
36 2 : ksAppendKey (ks, keyNew (PARENT_KEY_NAME "/elektra/spec/override/#", KEY_META, "elektra/spec/order", "10", KEY_META,
37 : "elektra/spec/impl", "override a b = link a b", KEY_END));
38 :
39 2 : ksAppendKey (ks, keyNew (PARENT_KEY_NAME "/elektra/spec/check/validation", KEY_META, "elektra/spec/impl",
40 : "checkvalidation a b = intersect a b", KEY_END));
41 :
42 2 : ksAppendKey (ks, keyNew (PARENT_KEY_NAME "/elektra/spec/check/long", KEY_META, "elektra/spec/impl",
43 : "checklong a = intersect a (Key :: Regex \"" LONG_REGEX "\")", KEY_END));
44 :
45 2 : return ks;
46 : }
47 :
48 1 : static void test_basics (void)
49 : {
50 1 : printf ("test basics\n");
51 :
52 1 : Key * parentKey = keyNew (PARENT_KEY_NAME, KEY_END);
53 1 : KeySet * conf = ksNew (0, KS_END);
54 1 : PLUGIN_OPEN ("typechecker");
55 :
56 1 : KeySet * ks = keysetWithStandardFunctions ();
57 :
58 1 : ksAppendKey (ks, keyNew (KEY1_NAME, KEY_VALUE, "2500", KEY_META, "check/validation",
59 : "[0-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-4][0-9][0-9][0-9]|5000", KEY_END));
60 :
61 1 : ksAppendKey (ks,
62 : keyNew (KEY2_NAME, KEY_VALUE, "500", KEY_META, "fallback/#1", KEY1_NAME, KEY_META, "check/validation",
63 : "-[1-9]|-1[0-9][0-9]|-2[0-4][0-9]|-250|-?[1-9][0-9]|[0-9]|[1-9][0-9][0-9]|[1-6][0-9][0-9][0-9]|7[0-4][0-9][0-"
64 : "9]|7500",
65 : KEY_END));
66 :
67 1 : ksAppendKey (ks, keyNew (KEY3_NAME, KEY_META, "fallback/#1", KEY1_NAME, KEY_META, "fallback/#2", KEY2_NAME, KEY_END));
68 :
69 :
70 1 : ksAppendKey (ks, keyNew (KEY4_NAME, KEY_META, "fallback/#1", KEY1_NAME, KEY_META, "override/#1", KEY2_NAME, KEY_META, "check/long",
71 : "", KEY_END));
72 :
73 1 : succeed_if (plugin->kdbSet (plugin, ks, parentKey) == ELEKTRA_PLUGIN_STATUS_NO_UPDATE, "call to kdbSet was not successful");
74 1 : succeed_if (output_error (parentKey), "error(s) found but none expected");
75 :
76 1 : keyDel (parentKey);
77 1 : ksDel (ks);
78 1 : PLUGIN_CLOSE ();
79 1 : }
80 :
81 1 : static void test_invalid_ranges_override (void)
82 : {
83 1 : printf ("test invalid ranges fallback\n");
84 :
85 1 : Key * parentKey = keyNew (PARENT_KEY_NAME, KEY_END);
86 1 : KeySet * conf = ksNew (0, KS_END);
87 1 : PLUGIN_OPEN ("typechecker");
88 :
89 1 : KeySet * ks = keysetWithStandardFunctions ();
90 :
91 1 : ksAppendKey (ks, keyNew (KEY1_NAME, KEY_VALUE, "2500", KEY_META, "check/validation",
92 : "[0-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-4][0-9][0-9][0-9]|5000", KEY_END));
93 :
94 1 : ksAppendKey (ks, keyNew (KEY2_NAME, KEY_VALUE, "500", KEY_META, "override/#1", KEY1_NAME, KEY_META, "check/validation",
95 : "[7-9][2-9][0-9][0-9]|10000", KEY_END));
96 :
97 1 : succeed_if (plugin->kdbSet (plugin, ks, parentKey) == ELEKTRA_PLUGIN_STATUS_ERROR, "call to kdbSet was not successful");
98 1 : succeed_if (!output_error (parentKey), "no errors found but one is expected");
99 :
100 1 : keyDel (parentKey);
101 1 : ksDel (ks);
102 1 : PLUGIN_CLOSE ();
103 1 : }
104 :
105 1 : int main (int argc, char ** argv)
106 : {
107 1 : printf ("TYPECHECKER TESTS\n");
108 1 : printf ("==================\n\n");
109 :
110 1 : init (argc, argv);
111 :
112 1 : test_basics ();
113 1 : test_invalid_ranges_override ();
114 :
115 1 : print_result ("testmod_typechecker");
116 :
117 1 : return nbError;
118 : }
|