serval-dna/tests/config

301 lines
10 KiB
Bash
Executable File

#!/bin/bash
# Tests for Serval DNA configuration operations.
#
# Copyright 2012 Serval Project, Inc.
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
source "${0%/*}/../testframework.sh"
source "${0%/*}/../testdefs.sh"
setup() {
setup_servald
}
assert_stderr_log() {
local -a warn_patterns=()
local -a error_patterns=()
while [ $# -gt 0 ]; do
case "$1" in
--warn-pattern=*) warn_patterns+=("${1#*=}"); shift;;
--error-pattern=*) error_patterns+=("${1#*=}"); shift;;
*) error "unsupported option: $1"; return;;
esac
done
assertStderrGrep \
--matches=${#error_patterns[*]} \
--message="stderr of ($executed) contains exactly ${#error_patterns[*]} error message(s)" \
'^ERROR:'
local pattern
for pattern in "${warn_patterns[@]}"; do
assertStderrGrep \
--message="stderr of ($executed) contains a warning message matching \"$pattern\"" \
"^WARN:.*$pattern"
done
for pattern in "${error_patterns[@]}"; do
assertStderrGrep \
--message="stderr of ($executed) contains an error message matching \"$pattern\"" \
"^ERROR:.*$pattern"
done
}
doc_GetCreateInstanceDir="Get creates instance directory"
setup_GetCreateInstanceDir() {
setup
assert ! [ -d "$SERVALINSTANCE_PATH" ]
}
test_GetCreateInstanceDir() {
executeOk_servald config get
assert [ -d "$SERVALINSTANCE_PATH" ]
}
doc_SetCreateInstanceDir="Set creates instance directory"
setup_SetCreateInstanceDir() {
setup
assert ! [ -d "$SERVALINSTANCE_PATH" ]
}
test_SetCreateInstanceDir() {
executeOk_servald config set debug.verbose 0
assert [ -d "$SERVALINSTANCE_PATH" ]
}
doc_GetNull="Get an unset config item"
test_GetNull() {
executeOk_servald config get debug.verbose
assertStdoutLineCount '==' 0
}
doc_SetGet="Set and get a single config item"
test_SetGet() {
executeOk_servald config set debug.verbose yes
executeOk_servald config get debug.verbose
assertStdoutLineCount '==' 1
assertStdoutGrep --stdout --stderr --matches=1 '^debug\.verbose=yes$'
}
doc_GetAll="Get all config items"
test_GetAll() {
executeOk_servald config \
set debug.verbose true \
set log.console.show_pid true \
set server.chdir /tmp/nothing \
set rhizome.enable no
executeOk_servald config get
assertStdoutLineCount '==' 4
assertStdoutGrep --stdout --matches=1 '^debug\.verbose=true$'
assertStdoutGrep --stdout --matches=1 '^log\.console\.show_pid=true$'
assertStdoutGrep --stdout --matches=1 '^server\.chdir=/tmp/nothing$'
assertStdoutGrep --stdout --matches=1 '^rhizome\.enable=no$'
}
doc_SetDelMixed="Set and del config items in single command"
test_SetDelMixed() {
executeOk_servald config \
set debug.verbose true \
set log.file.show_pid true \
set server.chdir /tmp/nothing \
set rhizome.enable no
executeOk_servald config \
set debug.verbose false \
del log.file.show_pid \
set log.file.show_time 1 \
del server.chdir \
del rhizome.enable
executeOk_servald config get
assertStdoutLineCount '==' 2
assertStdoutGrep --stdout --matches=1 '^debug\.verbose=false$'
assertStdoutGrep --stdout --matches=1 '^log\.file\.show_time=1$'
}
doc_SetTwice="Set a single config item twice"
test_SetTwice() {
executeOk_servald config set debug.verbose yes
executeOk_servald config get debug.verbose
assertStdoutLineCount '==' 1
assertStdoutGrep --stdout --stderr --matches=1 '^debug\.verbose=yes$'
executeOk_servald config set debug.verbose false
executeOk_servald config get debug.verbose
assertStdoutLineCount '==' 1
assertStdoutGrep --stdout --stderr --matches=1 '^debug\.verbose=false$'
}
doc_DelNull="Delete an unset config item"
test_DelNull() {
executeOk_servald config del debug.verbose
assertStdoutLineCount '==' 0
}
doc_Del="Delete single config item"
test_Del() {
executeOk_servald config set debug.verbose yes set log.console.show_pid true
executeOk_servald config get
assertStdoutLineCount '==' 2
executeOk_servald config del debug.verbose
executeOk_servald config get
assertStdoutLineCount '==' 1
executeOk_servald config del log.show_pid
assertStdoutLineCount '==' 0
}
doc_CaseSensitive="Config item names are case sensitive"
test_CaseSensitive() {
execute $servald config set Debug.verbose yes
assertExitStatus --stderr '!=' 0
}
doc_OptionNames="Config item names must be well formed"
test_OptionNames() {
execute $servald config set debug. yes
assertExitStatus --stderr '!=' 0
execute $servald config set .verbose yes
assertExitStatus --stderr '!=' 0
execute $servald config del debug..verbose
assertExitStatus --stderr '!=' 0
}
doc_DebugFlags="Debug config options affect verbosity"
setup_DebugFlags() {
setup
executeOk_servald config \
set log.console.level debug \
set log.console.show_pid true
}
test_DebugFlags() {
executeOk_servald echo one two three
assertStderrGrep --matches=0 '\<echo:argv\['
executeOk_servald config set debug.verbose true
executeOk_servald echo one two three
assertStderrGrep --matches=3 '\<echo:argv\['
executeOk_servald config set debug.verbose false
executeOk_servald echo one two three
assertStderrGrep --matches=0 '\<echo:argv\['
}
doc_InterfacesLegacyIncludeAll="Legacy 'interfaces' config option include all"
test_InterfacesLegacyIncludeAll() {
executeOk_servald config set interfaces '+'
}
doc_InterfacesLegacyExcludeAll="Legacy 'interfaces' config option exclude all"
test_InterfacesLegacyExcludeAll() {
executeOk_servald config set interfaces '-'
}
doc_InterfacesLegacyMixed="Legacy 'interfaces' config option mixed list"
test_InterfacesLegacyMixed() {
executeOk_servald config set interfaces '+eth,-wifi,+'
}
doc_InterfacesLegacyMixedDetail="Legacy 'interfaces' config option mixed list with details"
test_InterfacesLegacyMixedDetail() {
executeOk_servald config set interfaces '+eth=ethernet:4111:9M, +wifi=wifi:4112:900K, -'
}
doc_InterfacesLegacyInvalidType="Legacy 'interfaces' config option invalid type"
test_InterfacesLegacyInvalidType() {
execute --stderr --core-backtrace --exit-status=2 --executable=$servald \
config set interfaces '+eth=foo:4111:9M'
assert_stderr_log \
--warn-pattern='"interfaces".*invalid' \
--error-pattern='config file.*loaded despite defects.*invalid'
}
doc_InterfacesLegacyInvalidPort="Legacy 'interfaces' config option invalid port"
test_InterfacesLegacyInvalidPort() {
execute --stderr --core-backtrace --exit-status=2 --executable=$servald \
config set interfaces '+eth=ethernet:-1000:9M'
assert_stderr_log \
--warn-pattern='"interfaces".*invalid' \
--error-pattern='config file.*loaded despite defects.*invalid'
}
doc_InterfacesLegacyInvalidSpeed="Legacy 'interfaces' config option invalid speed is ignored"
test_InterfacesLegacyInvalidSpeed() {
# speed option is no longer validated or used
execute --stderr --core-backtrace --exit-status=0 --executable=$servald \
config set interfaces '+eth=ethernet:4111:9Moose'
#assert_stderr_log \
# --warn-pattern='"interfaces".*invalid' \
# --error-pattern='config file.*loaded despite defects.*invalid'
}
doc_InterfacesLegacyIncompatible="Legacy 'interfaces' config option incompatible with modern form"
test_InterfacesLegacyIncompatible() {
executeOk_servald config set interfaces '+'
execute --stderr --core-backtrace --executable=$servald \
config set interfaces.10.match 'eth'
tfw_cat $SERVALINSTANCE_PATH/serval.conf
assertExitStatus '==' 2
assert_stderr_log \
--warn-pattern='"interfaces.*incompatible' \
--error-pattern='config file.*loaded despite defects.*incompatible'
tfw_cat --stderr
}
doc_InterfacesModernMatch="Modern 'interfaces.N.match' config option"
test_InterfacesModernMatch() {
executeOk_servald config set interfaces.0.match 'eth*, wifi*'
}
doc_InterfacesModernDummy="Modern 'interfaces.N.file' config option"
test_InterfacesModernDummy() {
executeOk_servald config set interfaces.0.file dummyname
}
doc_InterfacesModernIncompatible="Config options 'interfaces.match' and 'interfaces.file' are incompatible"
test_InterfacesModernIncompatible() {
executeOk_servald config set interfaces.0.match eth
execute --stderr --core-backtrace --executable=$servald \
config set interfaces.0.file dummy
assertExitStatus '==' 2
assert_stderr_log \
--warn-pattern='"interfaces\.0\..*incompatible' \
--error-pattern='config file.*loaded despite defects.*incompatible'
}
doc_InterfaceDropDgramIncompatible="Config options 'interfaces.drop_packets' and 'interfaces.socket_type=DGRAM' are incompatible"
test_InterfaceDropDgramIncompatible() {
executeOk_servald config \
set interfaces.0.match eth \
set interfaces.0.socket_type dgram
execute --stderr --core-backtrace --executable=$servald \
config set interfaces.0.drop_packets 10
assertExitStatus '==' 2
assert_stderr_log \
--warn-pattern='"interfaces\.0\..*incompatible' \
--error-pattern='config file.*loaded despite defects.*incompatible'
}
#TODO move to another test script?
doc_CmdUsage="Show help usage"
test_CmdUsage() {
executeOk_servald help
tfw_cat --stdout
executeOk_servald help rhizome
tfw_cat --stdout
executeOk_servald help unknown command
tfw_cat --stdout
#TODO assert output?
}
doc_CmdUnknown="Unknown command"
test_CmdUnknown() {
execute $servald unknown command
assertExitStatus '==' 255
tfw_cat --stdout --stderr
}
runTests "$@"