2 The software in this package is distributed under the GNU General
3 Public License version 2 (with a special exception described below).
5 A copy of GNU General Public License (GPL) is included in this distribution,
6 in the file COPYING.GPL.
8 As a special exception, if other files instantiate templates or use macros
9 or inline functions from this file, or you compile this file and link it
10 with other works to produce a work based on this file, this file
11 does not by itself cause the resulting work to be covered
12 by the GNU General Public License.
14 However the source code for this file must still be made available
15 in accordance with section (3) of the GNU General Public License.
17 This exception does not invalidate any other reasons why a work based
18 on this file might be covered by the GNU General Public License.
21 #define BOOST_TEST_MAIN
22 #define BOOST_TEST_DYN_LINK
26 #include <boost/program_options.hpp>
27 #include <boost/shared_ptr.hpp>
28 #include <boost/test/unit_test.hpp>
30 #include "host/loglevel.h"
31 #include "host/logoutput.h"
32 #include "host/pingprotocol.h"
33 #include "config/configurationoptions.h"
35 //------------------------------------------------------------------------------
37 typedef boost::shared_ptr<boost::program_options::option_description> option_description_item;
40 const std::vector< option_description_item > &options,
41 const std::string &option_to_find
44 const std::string &key,
45 const boost::any &value,
46 boost::program_options::variables_map &vm
48 void option_clear_and_insert(
49 const std::string &key,
50 const boost::any &value,
51 boost::program_options::variables_map &vm
54 //------------------------------------------------------------------------------
57 const std::vector< option_description_item > &options,
58 const std::string &option_to_find
61 std::vector< option_description_item >::const_iterator first = options.begin();
62 std::vector< option_description_item >::const_iterator last = options.end();
64 while ( first != last )
66 if ( (*first)->long_name() == option_to_find ) {
75 const std::string &key,
76 const boost::any &value,
77 boost::program_options::variables_map &vm
80 boost::program_options::variable_value var_value( value, true );
82 vm.insert( std::pair<std::string, boost::program_options::variable_value>( key, var_value ) );
85 void option_clear_and_insert(
86 const std::string &key,
87 const boost::any &value,
88 boost::program_options::variables_map &vm
93 option_insert( key, value, vm );
96 //------------------------------------------------------------------------------
98 BOOST_AUTO_TEST_SUITE( TestConfigurationOptions )
100 BOOST_AUTO_TEST_CASE( get_generic_options )
102 ConfigurationOptions config_options;
103 std::vector< option_description_item > options = config_options.get_generic_options().options();
105 // if this assert fails, you must add or remove one of the options in the
107 BOOST_CHECK_EQUAL( options.size(), 7 );
108 // help, version, daemon, config-file, log-level, log-output, log-file
110 BOOST_CHECK_EQUAL( option_present( options, "help" ), true );
111 BOOST_CHECK_EQUAL( option_present( options, "config-file" ), true );
112 BOOST_CHECK_EQUAL( option_present( options, "daemon" ), true );
113 BOOST_CHECK_EQUAL( option_present( options, "version" ), true );
114 BOOST_CHECK_EQUAL( option_present( options, "log-level" ), true );
115 BOOST_CHECK_EQUAL( option_present( options, "log-output" ), true );
116 BOOST_CHECK_EQUAL( option_present( options, "log-file" ), true );
119 BOOST_AUTO_TEST_CASE( get_configuration_options )
121 ConfigurationOptions config_options;
122 std::vector< option_description_item > options = config_options.get_configuration_options().options();
124 // if this assert fails, you must add or remove one of the options in the
125 // test below. Will probably find them all in
126 // src/config/configurationoptions.cpp constructor
127 BOOST_CHECK_EQUAL( options.size(), 18 );
129 BOOST_CHECK_EQUAL( option_present( options, "hosts-down-limit" ), true );
130 BOOST_CHECK_EQUAL( option_present( options, "link-down-interval" ), true );
131 BOOST_CHECK_EQUAL( option_present( options, "link-up-interval" ), true );
132 BOOST_CHECK_EQUAL( option_present( options, "nameserver" ), true );
133 BOOST_CHECK_EQUAL( option_present( options, "ping-fail-limit" ), true );
134 BOOST_CHECK_EQUAL( option_present( options, "default-source-network-interface" ), true );
135 BOOST_CHECK_EQUAL( option_present( options, "status-notifier-cmd" ), true );
136 BOOST_CHECK_EQUAL( option_present( options, "ping-reply-timeout" ), true );
137 BOOST_CHECK_EQUAL( option_present( options, "max-address-resolution-attempts" ), true );
138 BOOST_CHECK_EQUAL( option_present( options, "resolved-ip-ttl-threshold" ), true );
139 BOOST_CHECK_EQUAL( option_present( options, "min-time-between-resolves" ), true );
140 BOOST_CHECK_EQUAL( option_present( options, "dns-cache-file" ), true );
141 BOOST_CHECK_EQUAL( option_present( options, "ratio-random-hosts" ), true );
142 BOOST_CHECK_EQUAL( option_present( options, "host.name" ), true );
143 BOOST_CHECK_EQUAL( option_present( options, "host.port" ), true );
144 BOOST_CHECK_EQUAL( option_present( options, "host.source-network-interface" ), true );
145 BOOST_CHECK_EQUAL( option_present( options, "host.ping-protocol" ), true );
146 BOOST_CHECK_EQUAL( option_present( options, "host.interval" ), true );
149 BOOST_AUTO_TEST_CASE( parse_generic_options )
151 boost::program_options::variables_map vm;
153 option_insert( "config-file", boost::any( std::string("pingcheck.conf") ), vm );
154 option_insert( "daemon", boost::any(), vm );
155 option_insert( "log-level", boost::any( std::string("EMERGENCY") ), vm );
156 option_insert( "log-output", boost::any( std::string("TERMINAL") ), vm );
157 option_insert( "log-file", boost::any( std::string("pingcheck_test.log") ), vm );
159 ConfigurationOptions config_options;
160 Configuration configuration;
161 config_options.parse_generic_options( vm, &configuration );
163 BOOST_CHECK_EQUAL( configuration.get_config_file_name(), "pingcheck.conf" );
164 BOOST_CHECK_EQUAL( configuration.get_daemon(), true );
165 BOOST_CHECK_EQUAL( static_cast<int>(configuration.get_log_level()), static_cast<int>(I2n::Logger::LogLevel::Emergency) );
166 BOOST_CHECK_EQUAL( static_cast<int>(configuration.get_log_output()), static_cast<int>(LogOutput_TERMINAL) );
167 BOOST_CHECK_EQUAL( configuration.get_log_file(), "pingcheck_test.log" );
170 BOOST_AUTO_TEST_CASE( parse_configuration_options )
172 boost::program_options::variables_map vm;
174 option_insert( "hosts-down-limit", boost::any( 0 ), vm );
175 option_insert( "link-down-interval", boost::any( 30 ), vm );
176 option_insert( "link-up-interval", boost::any( 40 ), vm );
177 option_insert( "nameserver", boost::any( std::string("localhost") ), vm );
178 option_insert( "ping-fail-limit", boost::any( 50 ), vm );
179 option_insert( "default-source-network-interface", boost::any( std::string("wlan1") ), vm );
180 option_insert( "status-notifier-cmd", boost::any( std::string("/tmp/command.sh") ), vm );
182 ConfigurationOptions config_options;
183 Configuration configuration;
184 config_options.parse_configuration_options( vm, &configuration );
186 BOOST_CHECK_EQUAL( configuration.get_hosts_down_limit(), 0 );
187 BOOST_CHECK_EQUAL( configuration.get_link_down_interval_in_min(), 30 );
188 BOOST_CHECK_EQUAL( configuration.get_link_up_interval_in_min(), 40 );
189 BOOST_CHECK_EQUAL( configuration.get_nameserver(), "localhost" );
190 BOOST_CHECK_EQUAL( configuration.get_ping_fail_limit(), 50 );
191 BOOST_CHECK_EQUAL( configuration.get_source_network_interface(), "wlan1" );
192 BOOST_CHECK_EQUAL( configuration.get_status_notifier_cmd(), "/tmp/command.sh" );
195 BOOST_AUTO_TEST_CASE( parse_hosts_options )
197 std::vector<std::string> hosts_names;
198 std::vector<int> hosts_ports;
199 std::vector<std::string> hosts_source_interfaces;
200 std::vector<std::string> hosts_ping_protocols;
201 std::vector<std::string> hosts_intervals;
203 hosts_names.push_back( "www.fazenda.gov.br" );
204 hosts_ports.push_back( 61 );
205 hosts_source_interfaces.push_back( "eth1" );
206 hosts_ping_protocols.push_back( "TCP" );
207 hosts_intervals.push_back( "71" );
209 hosts_names.push_back( "www.intra2net.de" );
210 hosts_ports.push_back( 62 );
211 hosts_source_interfaces.push_back( "eth2" );
212 hosts_ping_protocols.push_back( "ICMP" );
213 hosts_intervals.push_back( "72" );
215 hosts_names.push_back( "www.ufsc.br" );
216 hosts_ports.push_back( 63 );
217 hosts_source_interfaces.push_back( "eth3" );
218 hosts_ping_protocols.push_back( "ICMPv6" );
219 hosts_intervals.push_back( "73" );
221 hosts_names.push_back( "www.google.com" );
222 hosts_ports.push_back( 64 );
223 hosts_source_interfaces.push_back( "eth4" );
224 hosts_ping_protocols.push_back( "TCP_IPv6" );
225 hosts_intervals.push_back( "74" );
227 hosts_names.push_back( "www.kernel.org" );
228 hosts_ports.push_back( 64 );
229 hosts_source_interfaces.push_back( "eth5" );
230 hosts_ping_protocols.push_back( "TCP_IPv4,ICMPv4" );
231 hosts_intervals.push_back( "75" );
233 hosts_names.push_back( "www.linux.com" );
234 hosts_ports.push_back( 64 );
235 hosts_source_interfaces.push_back( "eth6" );
236 hosts_ping_protocols.push_back( "ICMPv6,TCP_IPv6" );
237 hosts_intervals.push_back( "76" );
239 ConfigurationOptions config_options;
240 Configuration configuration;
241 boost::program_options::variables_map vm;
242 option_insert( "host.name", boost::any( hosts_names ), vm );
243 option_insert( "host.port", boost::any( hosts_ports ), vm );
244 option_insert( "host.ping-protocol", boost::any( hosts_ping_protocols ), vm );
245 option_insert( "host.source-network-interface", boost::any( hosts_source_interfaces ), vm );
246 option_insert( "host.interval", boost::any( hosts_intervals ), vm );
248 config_options.parse_configuration_options( vm, &configuration );
251 HostItem host1 = configuration.get_hosts().at(0);
252 BOOST_CHECK_EQUAL( host1->get_address(), "www.fazenda.gov.br" );
253 BOOST_CHECK_EQUAL( host1->get_port(), 61 );
254 BOOST_CHECK_EQUAL( host1->get_source_network_interface(), "eth1" );
255 BOOST_CHECK_EQUAL( host1->get_ping_protocol_list().front(), PingProtocol_TCP );
256 BOOST_CHECK_EQUAL( host1->get_interval_in_sec(), 71 );
258 HostItem host2 = configuration.get_hosts().at(1);
259 BOOST_CHECK_EQUAL( host2->get_address(), "www.intra2net.de" );
260 BOOST_CHECK_EQUAL( host2->get_port(), 62 );
261 BOOST_CHECK_EQUAL( host2->get_source_network_interface(), "eth2" );
262 BOOST_CHECK_EQUAL( host2->get_ping_protocol_list().front(), PingProtocol_ICMP );
263 BOOST_CHECK_EQUAL( host2->get_interval_in_sec(), 72 );
265 HostItem host3 = configuration.get_hosts().at(2);
266 BOOST_CHECK_EQUAL( host3->get_address(), "www.ufsc.br" );
267 BOOST_CHECK_EQUAL( host3->get_port(), 63 );
268 BOOST_CHECK_EQUAL( host3->get_source_network_interface(), "eth3" );
269 BOOST_CHECK_EQUAL( host3->get_ping_protocol_list().front(), PingProtocol_ICMPv6 );
270 BOOST_CHECK_EQUAL( host3->get_interval_in_sec(), 73 );
272 HostItem host4 = configuration.get_hosts().at(3);
273 BOOST_CHECK_EQUAL( host4->get_address(), "www.google.com" );
274 BOOST_CHECK_EQUAL( host4->get_port(), 64 );
275 BOOST_CHECK_EQUAL( host4->get_source_network_interface(), "eth4" );
276 BOOST_CHECK_EQUAL( host4->get_ping_protocol_list().front(), PingProtocol_TCP_IPv6 );
277 BOOST_CHECK_EQUAL( host4->get_interval_in_sec(), 74 );
279 HostItem host5 = configuration.get_hosts().at(4);
280 BOOST_CHECK_EQUAL( host5->get_address(), "www.kernel.org" );
281 BOOST_CHECK_EQUAL( host5->get_port(), 64 );
282 BOOST_CHECK_EQUAL( host5->get_source_network_interface(), "eth5" );
283 BOOST_CHECK_EQUAL( host5->get_ping_protocol_list().size(), 2 );
284 BOOST_CHECK_EQUAL( host5->get_ping_protocol_list().front(), PingProtocol_TCP );
285 BOOST_CHECK_EQUAL( host5->get_ping_protocol_list().back(), PingProtocol_ICMP );
286 BOOST_CHECK_EQUAL( host5->get_interval_in_sec(), 75 );
288 HostItem host6 = configuration.get_hosts().at(5);
289 BOOST_CHECK_EQUAL( host6->get_address(), "www.linux.com" );
290 BOOST_CHECK_EQUAL( host6->get_port(), 64 );
291 BOOST_CHECK_EQUAL( host6->get_source_network_interface(), "eth6" );
292 BOOST_CHECK_EQUAL( host6->get_ping_protocol_list().size(), 2 );
293 BOOST_CHECK_EQUAL( host6->get_ping_protocol_list().front(), PingProtocol_ICMPv6 );
294 BOOST_CHECK_EQUAL( host6->get_ping_protocol_list().back(), PingProtocol_TCP_IPv6 );
295 BOOST_CHECK_EQUAL( host6->get_interval_in_sec(), 76 );
298 BOOST_AUTO_TEST_CASE( halt_on_generic_options )
300 ConfigurationOptions config_options;
301 boost::program_options::variables_map vm;
304 option_clear_and_insert( "config-file", value, vm );
305 BOOST_CHECK_EQUAL( config_options.halt_on_generic_options( vm ), false );
307 option_clear_and_insert( "daemon", value, vm );
308 BOOST_CHECK_EQUAL( config_options.halt_on_generic_options( vm ), false );
310 option_clear_and_insert( "help", value, vm );
311 BOOST_CHECK_EQUAL( config_options.halt_on_generic_options( vm ), true );
313 option_clear_and_insert( "version", value, vm );
314 BOOST_CHECK_EQUAL( config_options.halt_on_generic_options( vm ), true );
316 option_clear_and_insert( "log-level", value, vm );
317 BOOST_CHECK_EQUAL( config_options.halt_on_generic_options( vm ), false );
319 option_clear_and_insert( "log-output", value, vm );
320 BOOST_CHECK_EQUAL( config_options.halt_on_generic_options( vm ), false );
322 option_clear_and_insert( "log-file", value, vm );
323 BOOST_CHECK_EQUAL( config_options.halt_on_generic_options( vm ), false );
325 option_clear_and_insert( "hosts-down-limit", value, vm );
326 BOOST_CHECK_EQUAL( config_options.halt_on_generic_options( vm ), false );
328 option_clear_and_insert( "link-down-interval", value, vm );
329 BOOST_CHECK_EQUAL( config_options.halt_on_generic_options( vm ), false );
331 option_clear_and_insert( "link-up-interval", value, vm );
332 BOOST_CHECK_EQUAL( config_options.halt_on_generic_options( vm ), false );
334 option_clear_and_insert( "nameserver", value, vm );
335 BOOST_CHECK_EQUAL( config_options.halt_on_generic_options( vm ), false );
337 option_clear_and_insert( "ping-fail-limit", value, vm );
338 BOOST_CHECK_EQUAL( config_options.halt_on_generic_options( vm ), false );
340 option_clear_and_insert( "default-source-network-interface", value, vm );
341 BOOST_CHECK_EQUAL( config_options.halt_on_generic_options( vm ), false );
343 option_clear_and_insert( "status-notifier-cmd", value, vm );
344 BOOST_CHECK_EQUAL( config_options.halt_on_generic_options( vm ), false );
346 option_clear_and_insert( "host.name", value, vm );
347 BOOST_CHECK_EQUAL( config_options.halt_on_generic_options( vm ), false );
349 option_clear_and_insert( "host.port", value, vm );
350 BOOST_CHECK_EQUAL( config_options.halt_on_generic_options( vm ), false );
352 option_clear_and_insert( "host.source-network-interface", value, vm );
353 BOOST_CHECK_EQUAL( config_options.halt_on_generic_options( vm ), false );
355 option_clear_and_insert( "host.ping-protocol", value, vm );
356 BOOST_CHECK_EQUAL( config_options.halt_on_generic_options( vm ), false );
358 option_clear_and_insert( "host.interval", value, vm );
359 BOOST_CHECK_EQUAL( config_options.halt_on_generic_options( vm ), false );
362 BOOST_AUTO_TEST_SUITE_END()