From aa7e09948b944c05ae8bdc840ab5b176ae170154 Mon Sep 17 00:00:00 2001 From: "Roger A. Light" Date: Fri, 31 Dec 2021 00:32:04 +0000 Subject: [PATCH] Start of config file parsing error tests. --- test/broker/16-config-parse-errors.py | 106 ++++++++++++++++++++++++++ test/broker/Makefile | 1 + test/broker/test.py | 1 + 3 files changed, 108 insertions(+) create mode 100755 test/broker/16-config-parse-errors.py diff --git a/test/broker/16-config-parse-errors.py b/test/broker/16-config-parse-errors.py new file mode 100755 index 00000000..ba560480 --- /dev/null +++ b/test/broker/16-config-parse-errors.py @@ -0,0 +1,106 @@ +#!/usr/bin/env python3 + +# Test whether config parse errors are handled + +from mosq_test_helper import * + +def start_broker(filename): + if filename is not None: + cmd = ['../../src/mosquitto', '-v', '-c', filename] + else: + cmd = ['../../src/mosquitto', '-h'] + + if os.environ.get('MOSQ_USE_VALGRIND') is not None: + logfile = filename+'.'+str(vg_index)+'.vglog' + if os.environ.get('MOSQ_USE_VALGRIND') == 'callgrind': + cmd = ['valgrind', '-q', '--tool=callgrind', '--log-file='+logfile] + cmd + elif os.environ.get('MOSQ_USE_VALGRIND') == 'massif': + cmd = ['valgrind', '-q', '--tool=massif', '--log-file='+logfile] + cmd + else: + cmd = ['valgrind', '-q', '--trace-children=yes', '--leak-check=full', '--show-leak-kinds=all', '--log-file='+logfile] + cmd + + return subprocess.Popen(cmd, stdout=subprocess.DEVNULL, stderr=subprocess.PIPE) + + +def write_config(filename, port, config_str): + with open(filename, 'w') as f: + f.write(f"{config_str}") + + +def do_test(config_str, rc_expected): + rc = 1 + port = mosq_test.get_port() + + if config_str is not None: + conf_file = os.path.basename(__file__).replace('.py', '.conf') + write_config(conf_file, port, config_str) + else: + conf_file = None + + try: + broker = start_broker(conf_file) + broker.wait(timeout=1) + + if broker.returncode == rc_expected: + rc = 0 + except mosq_test.TestError: + pass + except subprocess.TimeoutExpired: + broker.terminate() + except Exception as e: + print(e) + finally: + if conf_file is not None: + os.remove(conf_file) + (stdo, stde) = broker.communicate() + if rc: + print(stde.decode('utf-8')) + exit(rc) + + +do_test(None, 3) # Print usage + +do_test("unknown_option unknown\n", 3) + +do_test("user\n", 3) # Empty string, no space +do_test("user \n", 3) # Empty string, single space +do_test("user \n", 3) # Empty string, double space +do_test("pid_file /tmp/pid\npid_file /tmp/pid\n", 3) # Duplicate string + +do_test("memory_limit\n", 3) # Empty ssize_t + +do_test("allow_anonymous\n", 3) # Empty bool +do_test("allow_anonymous falst\n", 3) # Invalid bool + +do_test("autosave_interval\n", 3) # Empty int +#do_test("autosave_interval string\n", 3) # Invalid int + +do_test("plugin_opt_inval string\n", 3) # plugin_opt_ without plugin +do_test("plugin c/auth_plugin.so\nplugin_opt_ string\n", 3) # Incomplete plugin_opt_ +do_test("plugin c/auth_plugin.so\nplugin_opt_test\n", 3) # Empty plugin_opt_ + +do_test("bridge_attempt_unsubscribe true\n", 3) # Missing bridge config +do_test("bridge_cafile string\n", 3) # Missing bridge config +do_test("bridge_alpn string\n", 3) # Missing bridge config +do_test("bridge_ciphers string\n", 3) # Missing bridge config +do_test("bridge_ciphers_tls1.3 string\n", 3) # Missing bridge config +do_test("bridge_bind_address string\n", 3) # Missing bridge config +do_test("bridge_capath string\n", 3) # Missing bridge config +do_test("bridge_certfile string\n", 3) # Missing bridge config +do_test("bridge_identity string\n", 3) # Missing bridge config +do_test("bridge_insecure true\n", 3) # Missing bridge config +do_test("bridge_require_oscp true\n", 3) # Missing bridge config +do_test("bridge_max_packet_size 1000\n", 3) # Missing bridge config +do_test("bridge_max_topic_alias 1000\n", 3) # Missing bridge config +do_test("bridge_outgoing_retain false\n", 3) # Missing bridge config +do_test("bridge_keyfile string\n", 3) # Missing bridge config +do_test("bridge_protocol_version string\n", 3) # Missing bridge config +do_test("bridge_psk string\n", 3) # Missing bridge config +do_test("bridge_receive_maximum 10\n", 3) # Missing bridge config +do_test("bridge_reload_type string\n", 3) # Missing bridge config +do_test("bridge_session_expiry_interval 10000\n", 3) # Missing bridge config +do_test("bridge_tcp_keepalive 10000\n", 3) # Missing bridge config +do_test("bridge_tcp_user_timeout 10000\n", 3) # Missing bridge config +do_test("bridge_tls_version string\n", 3) # Missing bridge config + +exit(0) diff --git a/test/broker/Makefile b/test/broker/Makefile index ab4679cd..2cb450c8 100644 --- a/test/broker/Makefile +++ b/test/broker/Makefile @@ -260,3 +260,4 @@ endif 16 : ./16-config-includedir.py + ./16-config-parse-errors.py diff --git a/test/broker/test.py b/test/broker/test.py index 2a6aaadd..b4479ab6 100755 --- a/test/broker/test.py +++ b/test/broker/test.py @@ -219,6 +219,7 @@ tests = [ #(1, './15-persist-subscription-v3-1-1.py'), (1, './16-config-includedir.py'), + (1, './16-config-parse-errors.py'), ] ptest.run_tests(tests)