Andrew Bettison c8bf8a7733 Refactor JNI out of CLI and server main loop
The CLI and server main loop now have no conditional JNI code.  All JNI
code has been moved into separate source files, which #include the new
"jni_common.h" instead of <jni.h>.  The "cli.h" header no longer
includes <jni.h>, so the rest of the Serval source code is now
unaffected by JNI definitions.

The 'cf_limbo' global variable is now thread-local, so that each thread
has its own independent copy of the loaded configuration.  The JNI
server entry point now calls cf_init() once.  The new 'cf_initialised'
flag prevents clobbering the config state by redundant calls to
cf_init().

The CLI "stop" command now sends SIGHUP to the specific thread in which
the server is running.  This is achieved by writing the PID and TID
(Linux Thread ID) into the pidfile, separated by a space, on systems
that support the Linux gettid() and tgkill() system calls.  The server's
signal handler has been overhauled, and its logging improved.
2016-10-13 16:23:18 +10:30

200 lines
5.6 KiB
Bash
Executable File

#!/bin/bash
# Tests for Serval DNA JNI entry points.
#
# Copyright 2012-2014 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"
source "${0%/*}/../testdefs_java.sh"
setup() {
setup_servald
executeOk_servald config \
set debug.jni 1 \
set debug.verbose 1 \
set log.console.level debug
assert_echo_works
compile_java_classes
setup_servald_so
}
# Make sure that the normal echo command-line works, without JNI.
assert_echo_works() {
executeOk $servald echo -e 'Hello,\ttab' 'world\0!'
assertStdoutIs -e 'Hello,\ttab\nworld\0!\n'
}
doc_Echo="Serval JNI echo Hello world"
test_Echo() {
executeJavaOk org.servalproject.test.CommandLine 'echo' '-e' 'Hello,\ttab' 'world\0!'
tfw_cat --stdout --stderr
assertStdoutIs -e 'Hello,\ttab\nworld\0!\n'
}
doc_Delim="Serval non-JNI output delimiter environment variable"
setup_Delim() {
setup_servald
assert_echo_works
}
test_Delim() {
export SERVALD_OUTPUT_DELIMITER=:::
executeOk $servald echo 'Hello,' 'world!'
assertStdoutIs 'Hello,:::world!:::'
}
doc_Repeat="Serval JNI repeated calls in same process"
test_Repeat() {
executeJavaOk org.servalproject.test.CommandLine --repeat 50 'echo' 'Hello,' 'world!'
assertStdoutLineCount '==' 100
assertStdoutGrep --matches=50 '^Hello,$'
assertStdoutGrep --matches=50 '^world!$'
}
doc_NullArg="Serval JNI null arguments dont throw exception"
test_NullArg() {
executeJavaOk org.servalproject.test.CommandLine 'echo' '(null)'
tfw_cat --stdout --stderr
}
doc_version="Serval JNI returns version text"
test_version() {
executeJavaOk org.servalproject.test.CommandLine 'version'
assertStdoutGrep 'Serval DNA version '
}
doc_PeerList="Serval JNI get peer details"
setup_PeerList() {
configure_servald_server() {
add_servald_interface
}
setup
foreach_instance +A +B create_single_identity
start_servald_instances +A +B
set_instance +A
executeOk_servald 'id' 'peers'
tfw_cat --stdout --stderr
}
test_PeerList() {
executeJavaOk org.servalproject.test.CommandLine 'id' 'peers'
tfw_cat --stdout --stderr
assertStdoutGrep "$SIDB"
}
teardown_PeerList() {
stop_all_servald_servers
kill_all_servald_processes
assert_no_servald_processes
report_all_servald_servers
}
doc_DnaLookup="Serval JNI DNA Lookup"
setup_DnaLookup() {
configure_servald_server() {
add_servald_interface
executeOk_servald config \
set debug.mdprequests on \
set mdp.enable_inet on
}
setup
foreach_instance +A +B create_single_identity
start_servald_instances +A +B
set_instance +A
executeOk_servald dna lookup "$DIDB" 10000
tfw_cat --stdout --stderr
}
test_DnaLookup() {
executeJavaOk --timeout=10 org.servalproject.test.ServalDTests 'lookup'
assertStdoutGrep "$SIDB"
}
teardown_DnaLookup() {
stop_all_servald_servers
kill_all_servald_processes
assert_no_servald_processes
report_all_servald_servers
}
doc_serviceDiscovery="Serval JNI discover network services by name"
listen_service() {
executeOk_servald --timeout=20 msp listen --once --service=test_name 512 <<EOF
Hi!
EOF
tfw_cat --stderr
}
setup_serviceDiscovery() {
configure_servald_server() {
add_servald_interface
executeOk_servald config \
set debug.mdprequests on \
set mdp.enable_inet on \
set log.console.level debug
}
setup
set_instance +A
foreach_instance +A +B create_single_identity
start_servald_instances +A +B
set_instance +B
fork %service listen_service
set_instance +A
}
test_serviceDiscovery() {
executeJavaOk --timeout=10 org.servalproject.test.ServalDTests 'service' 'test_name.*'
assertStdoutGrep "$SIDB"
assertStdoutGrep "\<test_name\.msp\.port=512\>"
tfw_cat --stdout --stderr
executeOk_servald --timeout=20 msp connect $SIDB 512 <<EOF
Hi!
EOF
fork_wait %service
}
teardown_serviceDiscovery() {
stop_all_servald_servers
kill_all_servald_processes
assert_no_servald_processes
report_all_servald_servers
}
doc_servaldThread="Start servald in a JVM thread"
setup_servaldThread() {
setup
set_instance +A
create_single_identity
executeOk_servald config \
set debug.jni 1 \
set debug.verbose 1 \
set log.console.level debug
}
test_servaldThread() {
fork %server executeJavaOk --stdout-file=server_stdout --stderr-file=server_stderr org.servalproject.test.ServalDTests 'server'
wait_until --timeout=10 grep '^Started server' server_stdout
PID=$($SED -n -e '/^Started server/s/.* pid=\([0-9]\+\).*/\1/p' server_stdout)
assert [ -n "$PID" ]
assert kill -0 $PID 2>/dev/null
executeOk_servald status
extract_stdout_keyvalue status 'status' '.*'
extract_stdout_keyvalue pid 'pid' '[0-9]\+'
extract_stdout_keyvalue tid 'tid' '[0-9]\+'
assert [ "$status" = running ]
assert [ "$pid" -eq "$PID" ]
assert [ "$tid" -ne "$PID" ]
sleep 1
executeOk_servald stop
fork_wait %server
tfw_cat server_stdout server_stderr
}
runTests "$@"