1#######################################################
2#
3# Test peers()
4# Ref:Redmine:4848 (https://cfengine.com/dev/issues/4848)
5#######################################################
6
7### TODO this test is failing, because for example the variable
8### default:this.test#actual_peers_nohosts_2
9### is never VariableTablePut
10### regex:VariableTablePut\([^)]*actual_peers_nohosts_2
11###
12### TODO figure out why actual_peers_nohosts_2 is never Put()
13
14body common control
15{
16      inputs => { "../../default.cf.sub" };
17      bundlesequence  => { default("$(this.promise_filename)") };
18      version => "1.0";
19}
20
21#######################################################
22bundle agent init
23{
24  methods:
25      "nohosts"
26        usebundle => file_empty("$(G.testfile).nohosts"),
27        comment => "Test the behavior when there are no entries in the file.";
28
29      "nopeers"
30        usebundle => file_mustache_jsonstring
31        (
32          "$(this.promise_filename).mustache",
33          '{ "peers": [ "a", "b", "c" ] }',
34          "$(G.testfile).nopeers"
35        ),
36        comment => "Test the behaviour when there are no peers (some hosts, but
37                    when the executing host is not found in the list)";
38
39      "somepeers"
40        usebundle => file_mustache_jsonstring
41        (
42          "$(this.promise_filename).mustache",
43          '{ "peers": [ "a", "b", "c", "$(sys.fqhost)" ] }',
44          "$(G.testfile).somepeers"
45        ),
46        comment => "Test the behaviour when there are some peers.";
47
48
49      "allpeers" usebundle => file_mustache_jsonstring
50      (
51        "$(this.promise_filename).mustache",
52        '{ "peers": [ "$(sys.fqhost)", "$(sys.fqhost)", "$(sys.fqhost)", "$(sys.fqhost)" ] }',
53        "$(G.testfile).allpeers"
54      );
55}
56
57bundle agent test
58{
59  vars:
60      "tests" slist => { "nohosts", "nopeers", "somepeers", "allpeers" };
61      "subtests" ilist => { "0", "1", "2", "3", "4", "5" };
62
63      "peers_$(tests)_$(subtests)" slist => peers("$(G.testfile).$(tests)", "#.*", $(subtests));
64      "peerleaders_$(tests)_$(subtests)" slist => peerleaders("$(G.testfile).$(tests)", "#.*", $(subtests));
65      "actual_peers_$(tests)_$(subtests)" string => format("%S", "peers_$(tests)_$(subtests)");
66      "actual_peerleaders_$(tests)_$(subtests)" string => format("%S", "peerleaders_$(tests)_$(subtests)");
67      "actual_peerleader_$(tests)_$(subtests)" string => peerleader("$(G.testfile).$(tests)", "#.*", $(subtests));
68}
69
70#######################################################
71
72bundle agent check
73{
74  vars:
75      "f" slist => { "peers", "peerleader", "peerleaders" };
76      "tests" slist => { @(test.tests) };
77      "subtests" ilist => { @(test.subtests) };
78
79      "good_cases" slist =>
80      {
81        "peers_nohosts_2", "peers_nohosts_3", "peers_nohosts_4", "peers_nohosts_5",
82        "peers_nopeers_2", "peers_nopeers_3", "peers_nopeers_4", "peers_nopeers_5",
83        "peers_somepeers_2", "peers_somepeers_3", "peers_somepeers_4",  "peers_somepeers_5",
84        "peers_allpeers_2", "peers_allpeers_3", "peers_allpeers_4",  "peers_allpeers_5",
85        "peers_somepeers_2",  "peers_somepeers_4",  "peers_somepeers_5",
86
87        "peerleader_somepeers_2", "peerleader_somepeers_3", "peerleader_somepeers_4",  "peerleader_somepeers_5",
88        "peerleader_allpeers_2", "peerleader_allpeers_3", "peerleader_allpeers_4",  "peerleader_allpeers_5",
89
90        "peerleaders_nohosts_2", "peerleaders_nohosts_3", "peerleaders_nohosts_4", "peerleaders_nohosts_5",
91        "peerleaders_nopeers_2", "peerleaders_nopeers_3", "peerleaders_nopeers_4", "peerleaders_nopeers_5",
92        "peerleaders_somepeers_2", "peerleaders_somepeers_3", "peerleaders_somepeers_4",  "peerleaders_somepeers_5",
93        "peerleaders_allpeers_2", "peerleaders_allpeers_3", "peerleaders_allpeers_4",  "peerleaders_allpeers_5",
94      };
95
96      "bad_cases" slist =>
97      {
98        "peers_nohosts_0", "peers_nohosts_1",
99        "peers_nopeers_0", "peers_nopeers_1",
100        "peers_somepeers_0", "peers_somepeers_1",
101        "peers_allpeers_0", "peers_allpeers_1",
102
103        "peerleader_nohosts_0", "peerleader_nohosts_1", "peerleader_nohosts_2", "peerleader_nohosts_3", "peerleader_nohosts_4", "peerleader_nohosts_5",
104        "peerleader_nopeers_0", "peerleader_nopeers_1", "peerleader_nopeers_2", "peerleader_nopeers_3", "peerleader_nopeers_4", "peerleader_nopeers_5",
105        "peerleader_somepeers_0", "peerleader_somepeers_1",
106        "peerleader_allpeers_0", "peerleader_allpeers_1",
107
108        "peerleaders_nohosts_0", "peerleaders_nohosts_1",
109        "peerleaders_nopeers_0", "peerleaders_nopeers_1",
110        "peerleaders_somepeers_0", "peerleaders_somepeers_1",
111        "peerleaders_allpeers_0", "peerleaders_allpeers_1",
112      };
113
114      "expected_peers_allpeers_$(subtests)" string => '{  }';
115      "expected_peers_nopeers_$(subtests)" string => '{  }';
116      "expected_peers_nohosts_$(subtests)" string => '{  }';
117      "expected_peers_allpeers_$(subtests)" string => '{  }';
118      "expected_peers_nopeers_$(subtests)" string => '{  }';
119      "expected_peers_nohosts_$(subtests)" string => '{  }';
120      "expected_peers_somepeers_2" string => '{ "c" }';
121      "expected_peers_somepeers_3" string => '{  }';
122      "expected_peers_somepeers_4" string => '{ "a", "b", "c" }';
123      "expected_peers_somepeers_5" string => '{ "a", "b", "c" }';
124
125      "expected_peerleader_allpeers_$(subtests)" string => 'localhost';
126      "expected_peerleader_somepeers_2" string => 'c';
127      "expected_peerleader_somepeers_3" string => 'localhost';
128      "expected_peerleader_somepeers_4" string => 'a';
129      "expected_peerleader_somepeers_5" string => 'a';
130
131      "expected_peerleaders_nohosts_$(subtests)" string => '{  }';
132
133      "expected_peerleaders_nopeers_2" string => '{ "a", "c" }';
134      "expected_peerleaders_nopeers_3" string => '{ "a" }';
135      "expected_peerleaders_nopeers_4" string => '{ "a" }';
136      "expected_peerleaders_nopeers_5" string => '{ "a" }';
137
138      "expected_peerleaders_somepeers_2" string => '{ "a", "c" }';
139      "expected_peerleaders_somepeers_3" string => '{ "a", "localhost" }';
140      "expected_peerleaders_somepeers_4" string => '{ "a" }';
141      "expected_peerleaders_somepeers_5" string => '{ "a" }';
142
143      "expected_peerleaders_allpeers_2" string => '{ "localhost", "localhost" }';
144      "expected_peerleaders_allpeers_3" string => '{ "localhost", "localhost" }';
145      "expected_peerleaders_allpeers_4" string => '{ "localhost" }';
146      "expected_peerleaders_allpeers_5" string => '{ "localhost" }';
147
148      "c[$(f)_$(tests)_$(subtests)]" string => "ok_$(f)_$(tests)_$(subtests)";
149      "cases" slist => getvalues(c);
150      "cs" string => join(",", cases);
151
152  classes:
153      "ok_$(bad_cases)" not => isvariable("test.actual_$(bad_cases)");
154      "ok_$(good_cases)" expression => strcmp("$(expected_$(good_cases))",
155                                              "$(test.actual_$(good_cases))");
156
157  methods:
158      "" usebundle => dcs_passif_expected($(cs), "", $(this.promise_filename)),
159      inherit => "true";
160
161  reports:
162    EXTRA::
163      "$(good_cases): as expected, '$(expected_$(good_cases))'"
164      if => "ok_$(good_cases)";
165
166      "$(bad_cases): as expected, no variable"
167      if => "ok_$(bad_cases)";
168
169      #"test.actual_$(good_cases) = '$(test.actual_$(good_cases))'";
170
171    DEBUG::
172      "$(good_cases): NOT as expected, '$(expected_$(good_cases))' != '$(test.actual_$(good_cases))'"
173      if => "!ok_$(good_cases)";
174
175      "$(bad_cases): NOT as expected, has variable '$(test.actual_$(bad_cases))'"
176      if => "!ok_$(bad_cases)";
177}
178