summaryrefslogtreecommitdiff
path: root/test/network_tests/offer_tests
diff options
context:
space:
mode:
Diffstat (limited to 'test/network_tests/offer_tests')
-rw-r--r--test/network_tests/offer_tests/conf/offer_test_big_sd_msg_master.json.in31
-rwxr-xr-xtest/network_tests/offer_tests/conf/offer_test_big_sd_msg_master_starter.sh.in79
-rw-r--r--test/network_tests/offer_tests/conf/offer_test_big_sd_msg_slave.json.in334
-rw-r--r--test/network_tests/offer_tests/conf/offer_test_external_master.json.in36
-rwxr-xr-xtest/network_tests/offer_tests/conf/offer_test_external_master_starter.sh.in158
-rw-r--r--test/network_tests/offer_tests/conf/offer_test_external_slave.json.in36
-rw-r--r--test/network_tests/offer_tests/offer_test_big_sd_msg_client.cpp238
-rw-r--r--test/network_tests/offer_tests/offer_test_big_sd_msg_service.cpp172
-rwxr-xr-xtest/network_tests/offer_tests/offer_test_big_sd_msg_slave_starter.sh45
-rw-r--r--test/network_tests/offer_tests/offer_test_client.cpp288
-rw-r--r--test/network_tests/offer_tests/offer_test_external_sd_msg_sender.cpp78
-rwxr-xr-xtest/network_tests/offer_tests/offer_test_external_slave_starter.sh45
-rw-r--r--test/network_tests/offer_tests/offer_test_globals.hpp29
-rw-r--r--test/network_tests/offer_tests/offer_test_local.json20
-rwxr-xr-xtest/network_tests/offer_tests/offer_test_local_starter.sh298
-rw-r--r--test/network_tests/offer_tests/offer_test_service.cpp171
-rw-r--r--test/network_tests/offer_tests/offer_test_service_external.cpp155
17 files changed, 2213 insertions, 0 deletions
diff --git a/test/network_tests/offer_tests/conf/offer_test_big_sd_msg_master.json.in b/test/network_tests/offer_tests/conf/offer_test_big_sd_msg_master.json.in
new file mode 100644
index 0000000..06609f6
--- /dev/null
+++ b/test/network_tests/offer_tests/conf/offer_test_big_sd_msg_master.json.in
@@ -0,0 +1,31 @@
+{
+ "unicast":"@TEST_IP_MASTER@",
+ "logging":
+ {
+ "level":"warning",
+ "console":"true",
+ "file":
+ {
+ "enable":"false",
+ "path":"/tmp/vsomeip.log"
+ },
+ "dlt":"false"
+ },
+ "applications" :
+ [
+ {
+ "name" : "offer_test_big_sd_msg_client",
+ "id" : "0x6666"
+ }
+ ],
+ "routing":"routingmanagerd",
+ "service-discovery":
+ {
+ "enable":"true",
+ "ttl" : "3",
+ "multicast":"224.0.11.1",
+ "port":"30490",
+ "protocol":"udp",
+ "cyclic_offer_delay" : "1000"
+ }
+} \ No newline at end of file
diff --git a/test/network_tests/offer_tests/conf/offer_test_big_sd_msg_master_starter.sh.in b/test/network_tests/offer_tests/conf/offer_test_big_sd_msg_master_starter.sh.in
new file mode 100755
index 0000000..9ef5163
--- /dev/null
+++ b/test/network_tests/offer_tests/conf/offer_test_big_sd_msg_master_starter.sh.in
@@ -0,0 +1,79 @@
+#!/bin/bash
+# Copyright (C) 2015-2017 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+# Purpose: This script is needed to start the services with
+# one command. This is necessary as ctest - which is used to run the
+# tests - isn't able to start multiple binaries for one testcase. Therefore
+# the testcase simply executes this script. This script then runs the services
+# and checks that all exit successfully.
+
+FAIL=0
+
+export VSOMEIP_CONFIGURATION=offer_test_big_sd_msg_master.json
+# start daemon
+../../examples/routingmanagerd/./routingmanagerd &
+PID_VSOMEIPD=$!
+
+./offer_test_big_sd_msg_client &
+CLIENT_PID=$!
+
+
+sleep 1
+
+if [ ! -z "$USE_LXC_TEST" ]; then
+ echo "Waiting for 5s"
+ sleep 5
+ echo "starting offer test on slave LXC offer_test_big_sd_msg_slave_starter.sh"
+ ssh -tt -i $SANDBOX_ROOT_DIR/commonapi_main/lxc-config/.ssh/mgc_lxc/rsa_key_file.pub -o StrictHostKeyChecking=no root@$LXC_TEST_SLAVE_IP "bash -ci \"set -m; cd \\\$SANDBOX_TARGET_DIR/vsomeip_lib/test/network_tests; ./offer_test_big_sd_msg_slave_starter.sh\"" &
+ echo "remote ssh pid: $!"
+elif [ ! -z "$USE_DOCKER" ]; then
+ echo "Waiting for 5s"
+ sleep 5
+ docker exec $DOCKER_IMAGE sh -c "cd $DOCKER_TESTS && sleep 10; ./offer_test_big_sd_msg_slave_starter.sh" &
+else
+cat <<End-of-message
+*******************************************************************************
+*******************************************************************************
+** Please now run:
+** offer_test_big_sd_msg_slave_starter.sh
+** from an external host to successfully complete this test.
+**
+** You probably will need to adapt the 'unicast' settings in
+** offer_test_big_sd_msg_master.json and
+** offer_test_big_sd_msg_slave.json to your personal setup.
+*******************************************************************************
+*******************************************************************************
+End-of-message
+fi
+
+# Wait until all clients and services are finished
+for job in $CLIENT_PID
+do
+ # Fail gets incremented if a client exits with a non-zero exit code
+ echo "waiting for $job"
+ wait $job || FAIL=$(($FAIL+1))
+done
+
+# kill the services
+kill $PID_VSOMEIPD
+sleep 1
+
+# wait for slave to finish
+for job in $(jobs -p)
+do
+ # Fail gets incremented if either client or service exit
+ # with a non-zero exit code
+ echo "[Master] waiting for job $job"
+ wait $job || ((FAIL+=1))
+done
+
+# Check if everything went well
+if [ $FAIL -eq 0 ]
+then
+ exit 0
+else
+ exit 1
+fi
diff --git a/test/network_tests/offer_tests/conf/offer_test_big_sd_msg_slave.json.in b/test/network_tests/offer_tests/conf/offer_test_big_sd_msg_slave.json.in
new file mode 100644
index 0000000..0c8427d
--- /dev/null
+++ b/test/network_tests/offer_tests/conf/offer_test_big_sd_msg_slave.json.in
@@ -0,0 +1,334 @@
+{
+ "unicast":"@TEST_IP_SLAVE@",
+ "logging":
+ {
+ "level":"warning",
+ "console":"true",
+ "file":
+ {
+ "enable":"false",
+ "path":"/tmp/vsomeip.log"
+ },
+ "dlt":"false"
+ },
+ "applications" :
+ [
+ {
+ "name" : "offer_test_big_sd_msg_service",
+ "id" : "0x7777"
+ }
+ ],
+ "services":
+ [
+ {"service":"0x1","instance":"0x1","unreliable":"30001","reliable":{"port":"30001","enable-magic-cookies":"false"}},
+ {"service":"0x2","instance":"0x1","unreliable":"30002","reliable":{"port":"30002","enable-magic-cookies":"false"}},
+ {"service":"0x3","instance":"0x1","unreliable":"30003","reliable":{"port":"30003","enable-magic-cookies":"false"}},
+ {"service":"0x4","instance":"0x1","unreliable":"30004","reliable":{"port":"30004","enable-magic-cookies":"false"}},
+ {"service":"0x5","instance":"0x1","unreliable":"30005","reliable":{"port":"30005","enable-magic-cookies":"false"}},
+ {"service":"0x6","instance":"0x1","unreliable":"30006","reliable":{"port":"30006","enable-magic-cookies":"false"}},
+ {"service":"0x7","instance":"0x1","unreliable":"30007","reliable":{"port":"60000","enable-magic-cookies":"false"}},
+ {"service":"0x8","instance":"0x1","unreliable":"30008","reliable":{"port":"30008","enable-magic-cookies":"false"}},
+ {"service":"0x9","instance":"0x1","unreliable":"60000","reliable":{"port":"30009","enable-magic-cookies":"false"}},
+ {"service":"0xA","instance":"0x1","unreliable":"30010","reliable":{"port":"30010","enable-magic-cookies":"false"}},
+ {"service":"0xB","instance":"0x1","unreliable":"30011","reliable":{"port":"30011","enable-magic-cookies":"false"}},
+ {"service":"0xC","instance":"0x1","unreliable":"30012","reliable":{"port":"30012","enable-magic-cookies":"false"}},
+ {"service":"0xD","instance":"0x1","unreliable":"30013","reliable":{"port":"30013","enable-magic-cookies":"false"}},
+ {"service":"0xE","instance":"0x1","unreliable":"30014","reliable":{"port":"60000","enable-magic-cookies":"false"}},
+ {"service":"0xF","instance":"0x1","unreliable":"30015","reliable":{"port":"30015","enable-magic-cookies":"false"}},
+ {"service":"0x10","instance":"0x1","unreliable":"30016","reliable":{"port":"30016","enable-magic-cookies":"false"}},
+ {"service":"0x11","instance":"0x1","unreliable":"30017","reliable":{"port":"30017","enable-magic-cookies":"false"}},
+ {"service":"0x12","instance":"0x1","unreliable":"60000","reliable":{"port":"30018","enable-magic-cookies":"false"}},
+ {"service":"0x13","instance":"0x1","unreliable":"30019","reliable":{"port":"30019","enable-magic-cookies":"false"}},
+ {"service":"0x14","instance":"0x1","unreliable":"30020","reliable":{"port":"30020","enable-magic-cookies":"false"}},
+ {"service":"0x15","instance":"0x1","unreliable":"30021","reliable":{"port":"60000","enable-magic-cookies":"false"}},
+ {"service":"0x16","instance":"0x1","unreliable":"30022","reliable":{"port":"30022","enable-magic-cookies":"false"}},
+ {"service":"0x17","instance":"0x1","unreliable":"30023","reliable":{"port":"30023","enable-magic-cookies":"false"}},
+ {"service":"0x18","instance":"0x1","unreliable":"30024","reliable":{"port":"30024","enable-magic-cookies":"false"}},
+ {"service":"0x19","instance":"0x1","unreliable":"30025","reliable":{"port":"30025","enable-magic-cookies":"false"}},
+ {"service":"0x1A","instance":"0x1","unreliable":"30026","reliable":{"port":"30026","enable-magic-cookies":"false"}},
+ {"service":"0x1B","instance":"0x1","unreliable":"60000","reliable":{"port":"30027","enable-magic-cookies":"false"}},
+ {"service":"0x1C","instance":"0x1","unreliable":"30028","reliable":{"port":"60000","enable-magic-cookies":"false"}},
+ {"service":"0x1D","instance":"0x1","unreliable":"30029","reliable":{"port":"30029","enable-magic-cookies":"false"}},
+ {"service":"0x1E","instance":"0x1","unreliable":"30030","reliable":{"port":"30030","enable-magic-cookies":"false"}},
+ {"service":"0x1F","instance":"0x1","unreliable":"30031","reliable":{"port":"30031","enable-magic-cookies":"false"}},
+ {"service":"0x20","instance":"0x1","unreliable":"30032","reliable":{"port":"30032","enable-magic-cookies":"false"}},
+ {"service":"0x21","instance":"0x1","unreliable":"30033","reliable":{"port":"30033","enable-magic-cookies":"false"}},
+ {"service":"0x22","instance":"0x1","unreliable":"30034","reliable":{"port":"30034","enable-magic-cookies":"false"}},
+ {"service":"0x23","instance":"0x1","unreliable":"30035","reliable":{"port":"60000","enable-magic-cookies":"false"}},
+ {"service":"0x24","instance":"0x1","unreliable":"60000","reliable":{"port":"30036","enable-magic-cookies":"false"}},
+ {"service":"0x25","instance":"0x1","unreliable":"30037","reliable":{"port":"30037","enable-magic-cookies":"false"}},
+ {"service":"0x26","instance":"0x1","unreliable":"30038","reliable":{"port":"30038","enable-magic-cookies":"false"}},
+ {"service":"0x27","instance":"0x1","unreliable":"30039","reliable":{"port":"30039","enable-magic-cookies":"false"}},
+ {"service":"0x28","instance":"0x1","unreliable":"30040","reliable":{"port":"30040","enable-magic-cookies":"false"}},
+ {"service":"0x29","instance":"0x1","unreliable":"30041","reliable":{"port":"30041","enable-magic-cookies":"false"}},
+ {"service":"0x2A","instance":"0x1","unreliable":"30042","reliable":{"port":"60000","enable-magic-cookies":"false"}},
+ {"service":"0x2B","instance":"0x1","unreliable":"30043","reliable":{"port":"30043","enable-magic-cookies":"false"}},
+ {"service":"0x2C","instance":"0x1","unreliable":"30044","reliable":{"port":"30044","enable-magic-cookies":"false"}},
+ {"service":"0x2D","instance":"0x1","unreliable":"60000","reliable":{"port":"30045","enable-magic-cookies":"false"}},
+ {"service":"0x2E","instance":"0x1","unreliable":"30046","reliable":{"port":"30046","enable-magic-cookies":"false"}},
+ {"service":"0x2F","instance":"0x1","unreliable":"30047","reliable":{"port":"30047","enable-magic-cookies":"false"}},
+ {"service":"0x30","instance":"0x1","unreliable":"30048","reliable":{"port":"30048","enable-magic-cookies":"false"}},
+ {"service":"0x31","instance":"0x1","unreliable":"30049","reliable":{"port":"60000","enable-magic-cookies":"false"}},
+ {"service":"0x32","instance":"0x1","unreliable":"30050","reliable":{"port":"30050","enable-magic-cookies":"false"}},
+ {"service":"0x33","instance":"0x1","unreliable":"30051","reliable":{"port":"30051","enable-magic-cookies":"false"}},
+ {"service":"0x34","instance":"0x1","unreliable":"30052","reliable":{"port":"30052","enable-magic-cookies":"false"}},
+ {"service":"0x35","instance":"0x1","unreliable":"30053","reliable":{"port":"30053","enable-magic-cookies":"false"}},
+ {"service":"0x36","instance":"0x1","unreliable":"60000","reliable":{"port":"30054","enable-magic-cookies":"false"}},
+ {"service":"0x37","instance":"0x1","unreliable":"30055","reliable":{"port":"30055","enable-magic-cookies":"false"}},
+ {"service":"0x38","instance":"0x1","unreliable":"30056","reliable":{"port":"60000","enable-magic-cookies":"false"}},
+ {"service":"0x39","instance":"0x1","unreliable":"30057","reliable":{"port":"30057","enable-magic-cookies":"false"}},
+ {"service":"0x3A","instance":"0x1","unreliable":"30058","reliable":{"port":"30058","enable-magic-cookies":"false"}},
+ {"service":"0x3B","instance":"0x1","unreliable":"30059","reliable":{"port":"30059","enable-magic-cookies":"false"}},
+ {"service":"0x3C","instance":"0x1","unreliable":"30060","reliable":{"port":"30060","enable-magic-cookies":"false"}},
+ {"service":"0x3D","instance":"0x1","unreliable":"30061","reliable":{"port":"30061","enable-magic-cookies":"false"}},
+ {"service":"0x3E","instance":"0x1","unreliable":"30062","reliable":{"port":"30062","enable-magic-cookies":"false"}},
+ {"service":"0x3F","instance":"0x1","unreliable":"60000","reliable":{"port":"60000","enable-magic-cookies":"false"}},
+ {"service":"0x40","instance":"0x1","unreliable":"30064","reliable":{"port":"30064","enable-magic-cookies":"false"}},
+ {"service":"0x41","instance":"0x1","unreliable":"30065","reliable":{"port":"30065","enable-magic-cookies":"false"}},
+ {"service":"0x42","instance":"0x1","unreliable":"30066","reliable":{"port":"30066","enable-magic-cookies":"false"}},
+ {"service":"0x43","instance":"0x1","unreliable":"30067","reliable":{"port":"30067","enable-magic-cookies":"false"}},
+ {"service":"0x44","instance":"0x1","unreliable":"30068","reliable":{"port":"30068","enable-magic-cookies":"false"}},
+ {"service":"0x45","instance":"0x1","unreliable":"30069","reliable":{"port":"30069","enable-magic-cookies":"false"}},
+ {"service":"0x46","instance":"0x1","unreliable":"30070","reliable":{"port":"60000","enable-magic-cookies":"false"}},
+ {"service":"0x47","instance":"0x1","unreliable":"30071","reliable":{"port":"30071","enable-magic-cookies":"false"}},
+ {"service":"0x48","instance":"0x1","unreliable":"60000","reliable":{"port":"30072","enable-magic-cookies":"false"}},
+ {"service":"0x49","instance":"0x1","unreliable":"30073","reliable":{"port":"30073","enable-magic-cookies":"false"}},
+ {"service":"0x4A","instance":"0x1","unreliable":"30074","reliable":{"port":"30074","enable-magic-cookies":"false"}},
+ {"service":"0x4B","instance":"0x1","unreliable":"30075","reliable":{"port":"30075","enable-magic-cookies":"false"}},
+ {"service":"0x4C","instance":"0x1","unreliable":"30076","reliable":{"port":"30076","enable-magic-cookies":"false"}},
+ {"service":"0x4D","instance":"0x1","unreliable":"30077","reliable":{"port":"60000","enable-magic-cookies":"false"}},
+ {"service":"0x4E","instance":"0x1","unreliable":"30078","reliable":{"port":"30078","enable-magic-cookies":"false"}},
+ {"service":"0x4F","instance":"0x1","unreliable":"30079","reliable":{"port":"30079","enable-magic-cookies":"false"}},
+ {"service":"0x50","instance":"0x1","unreliable":"30080","reliable":{"port":"30080","enable-magic-cookies":"false"}},
+ {"service":"0x51","instance":"0x1","unreliable":"60000","reliable":{"port":"30081","enable-magic-cookies":"false"}},
+ {"service":"0x52","instance":"0x1","unreliable":"30082","reliable":{"port":"30082","enable-magic-cookies":"false"}},
+ {"service":"0x53","instance":"0x1","unreliable":"30083","reliable":{"port":"30083","enable-magic-cookies":"false"}},
+ {"service":"0x54","instance":"0x1","unreliable":"30084","reliable":{"port":"60000","enable-magic-cookies":"false"}},
+ {"service":"0x55","instance":"0x1","unreliable":"30085","reliable":{"port":"30085","enable-magic-cookies":"false"}},
+ {"service":"0x56","instance":"0x1","unreliable":"30086","reliable":{"port":"30086","enable-magic-cookies":"false"}},
+ {"service":"0x57","instance":"0x1","unreliable":"30087","reliable":{"port":"30087","enable-magic-cookies":"false"}},
+ {"service":"0x58","instance":"0x1","unreliable":"30088","reliable":{"port":"30088","enable-magic-cookies":"false"}},
+ {"service":"0x59","instance":"0x1","unreliable":"30089","reliable":{"port":"30089","enable-magic-cookies":"false"}},
+ {"service":"0x5A","instance":"0x1","unreliable":"60000","reliable":{"port":"30090","enable-magic-cookies":"false"}},
+ {"service":"0x5B","instance":"0x1","unreliable":"30091","reliable":{"port":"60000","enable-magic-cookies":"false"}},
+ {"service":"0x5C","instance":"0x1","unreliable":"30092","reliable":{"port":"30092","enable-magic-cookies":"false"}},
+ {"service":"0x5D","instance":"0x1","unreliable":"30093","reliable":{"port":"30093","enable-magic-cookies":"false"}},
+ {"service":"0x5E","instance":"0x1","unreliable":"30094","reliable":{"port":"30094","enable-magic-cookies":"false"}},
+ {"service":"0x5F","instance":"0x1","unreliable":"30095","reliable":{"port":"30095","enable-magic-cookies":"false"}},
+ {"service":"0x60","instance":"0x1","unreliable":"30096","reliable":{"port":"30096","enable-magic-cookies":"false"}},
+ {"service":"0x61","instance":"0x1","unreliable":"30097","reliable":{"port":"30097","enable-magic-cookies":"false"}},
+ {"service":"0x62","instance":"0x1","unreliable":"30098","reliable":{"port":"60000","enable-magic-cookies":"false"}},
+ {"service":"0x63","instance":"0x1","unreliable":"60000","reliable":{"port":"30099","enable-magic-cookies":"false"}},
+ {"service":"0x64","instance":"0x1","unreliable":"30100","reliable":{"port":"30100","enable-magic-cookies":"false"}},
+ {"service":"0x65","instance":"0x1","unreliable":"30101","reliable":{"port":"30101","enable-magic-cookies":"false"}},
+ {"service":"0x66","instance":"0x1","unreliable":"30102","reliable":{"port":"30102","enable-magic-cookies":"false"}},
+ {"service":"0x67","instance":"0x1","unreliable":"30103","reliable":{"port":"30103","enable-magic-cookies":"false"}},
+ {"service":"0x68","instance":"0x1","unreliable":"30104","reliable":{"port":"30104","enable-magic-cookies":"false"}},
+ {"service":"0x69","instance":"0x1","unreliable":"30105","reliable":{"port":"60000","enable-magic-cookies":"false"}},
+ {"service":"0x6A","instance":"0x1","unreliable":"30106","reliable":{"port":"30106","enable-magic-cookies":"false"}},
+ {"service":"0x6B","instance":"0x1","unreliable":"30107","reliable":{"port":"30107","enable-magic-cookies":"false"}},
+ {"service":"0x6C","instance":"0x1","unreliable":"60000","reliable":{"port":"30108","enable-magic-cookies":"false"}},
+ {"service":"0x6D","instance":"0x1","unreliable":"30109","reliable":{"port":"30109","enable-magic-cookies":"false"}},
+ {"service":"0x6E","instance":"0x1","unreliable":"30110","reliable":{"port":"30110","enable-magic-cookies":"false"}},
+ {"service":"0x6F","instance":"0x1","unreliable":"30111","reliable":{"port":"30111","enable-magic-cookies":"false"}},
+ {"service":"0x70","instance":"0x1","unreliable":"30112","reliable":{"port":"60000","enable-magic-cookies":"false"}},
+ {"service":"0x71","instance":"0x1","unreliable":"30113","reliable":{"port":"30113","enable-magic-cookies":"false"}},
+ {"service":"0x72","instance":"0x1","unreliable":"30114","reliable":{"port":"30114","enable-magic-cookies":"false"}},
+ {"service":"0x73","instance":"0x1","unreliable":"30115","reliable":{"port":"30115","enable-magic-cookies":"false"}},
+ {"service":"0x74","instance":"0x1","unreliable":"30116","reliable":{"port":"30116","enable-magic-cookies":"false"}},
+ {"service":"0x75","instance":"0x1","unreliable":"60000","reliable":{"port":"30117","enable-magic-cookies":"false"}},
+ {"service":"0x76","instance":"0x1","unreliable":"30118","reliable":{"port":"30118","enable-magic-cookies":"false"}},
+ {"service":"0x77","instance":"0x1","unreliable":"30119","reliable":{"port":"60000","enable-magic-cookies":"false"}},
+ {"service":"0x78","instance":"0x1","unreliable":"30120","reliable":{"port":"30120","enable-magic-cookies":"false"}},
+ {"service":"0x79","instance":"0x1","unreliable":"30121","reliable":{"port":"30121","enable-magic-cookies":"false"}},
+ {"service":"0x7A","instance":"0x1","unreliable":"30122","reliable":{"port":"30122","enable-magic-cookies":"false"}},
+ {"service":"0x7B","instance":"0x1","unreliable":"30123","reliable":{"port":"30123","enable-magic-cookies":"false"}},
+ {"service":"0x7C","instance":"0x1","unreliable":"30124","reliable":{"port":"30124","enable-magic-cookies":"false"}},
+ {"service":"0x7D","instance":"0x1","unreliable":"30125","reliable":{"port":"30125","enable-magic-cookies":"false"}},
+ {"service":"0x7E","instance":"0x1","unreliable":"60000","reliable":{"port":"60000","enable-magic-cookies":"false"}},
+ {"service":"0x7F","instance":"0x1","unreliable":"30127","reliable":{"port":"30127","enable-magic-cookies":"false"}},
+ {"service":"0x80","instance":"0x1","unreliable":"30128","reliable":{"port":"30128","enable-magic-cookies":"false"}},
+ {"service":"0x81","instance":"0x1","unreliable":"30129","reliable":{"port":"30129","enable-magic-cookies":"false"}},
+ {"service":"0x82","instance":"0x1","unreliable":"30130","reliable":{"port":"30130","enable-magic-cookies":"false"}},
+ {"service":"0x83","instance":"0x1","unreliable":"30131","reliable":{"port":"30131","enable-magic-cookies":"false"}},
+ {"service":"0x84","instance":"0x1","unreliable":"30132","reliable":{"port":"30132","enable-magic-cookies":"false"}},
+ {"service":"0x85","instance":"0x1","unreliable":"30133","reliable":{"port":"60000","enable-magic-cookies":"false"}},
+ {"service":"0x86","instance":"0x1","unreliable":"30134","reliable":{"port":"30134","enable-magic-cookies":"false"}},
+ {"service":"0x87","instance":"0x1","unreliable":"60000","reliable":{"port":"30135","enable-magic-cookies":"false"}},
+ {"service":"0x88","instance":"0x1","unreliable":"30136","reliable":{"port":"30136","enable-magic-cookies":"false"}},
+ {"service":"0x89","instance":"0x1","unreliable":"30137","reliable":{"port":"30137","enable-magic-cookies":"false"}},
+ {"service":"0x8A","instance":"0x1","unreliable":"30138","reliable":{"port":"30138","enable-magic-cookies":"false"}},
+ {"service":"0x8B","instance":"0x1","unreliable":"30139","reliable":{"port":"30139","enable-magic-cookies":"false"}},
+ {"service":"0x8C","instance":"0x1","unreliable":"30140","reliable":{"port":"60000","enable-magic-cookies":"false"}},
+ {"service":"0x8D","instance":"0x1","unreliable":"30141","reliable":{"port":"30141","enable-magic-cookies":"false"}},
+ {"service":"0x8E","instance":"0x1","unreliable":"30142","reliable":{"port":"30142","enable-magic-cookies":"false"}},
+ {"service":"0x8F","instance":"0x1","unreliable":"30143","reliable":{"port":"30143","enable-magic-cookies":"false"}},
+ {"service":"0x90","instance":"0x1","unreliable":"60000","reliable":{"port":"30144","enable-magic-cookies":"false"}},
+ {"service":"0x91","instance":"0x1","unreliable":"30145","reliable":{"port":"30145","enable-magic-cookies":"false"}},
+ {"service":"0x92","instance":"0x1","unreliable":"30146","reliable":{"port":"30146","enable-magic-cookies":"false"}},
+ {"service":"0x93","instance":"0x1","unreliable":"30147","reliable":{"port":"60000","enable-magic-cookies":"false"}},
+ {"service":"0x94","instance":"0x1","unreliable":"30148","reliable":{"port":"30148","enable-magic-cookies":"false"}},
+ {"service":"0x95","instance":"0x1","unreliable":"30149","reliable":{"port":"30149","enable-magic-cookies":"false"}},
+ {"service":"0x96","instance":"0x1","unreliable":"30150","reliable":{"port":"30150","enable-magic-cookies":"false"}},
+ {"service":"0x97","instance":"0x1","unreliable":"30151","reliable":{"port":"30151","enable-magic-cookies":"false"}},
+ {"service":"0x98","instance":"0x1","unreliable":"30152","reliable":{"port":"30152","enable-magic-cookies":"false"}},
+ {"service":"0x99","instance":"0x1","unreliable":"60000","reliable":{"port":"30153","enable-magic-cookies":"false"}},
+ {"service":"0x9A","instance":"0x1","unreliable":"30154","reliable":{"port":"60000","enable-magic-cookies":"false"}},
+ {"service":"0x9B","instance":"0x1","unreliable":"30155","reliable":{"port":"30155","enable-magic-cookies":"false"}},
+ {"service":"0x9C","instance":"0x1","unreliable":"30156","reliable":{"port":"30156","enable-magic-cookies":"false"}},
+ {"service":"0x9D","instance":"0x1","unreliable":"30157","reliable":{"port":"30157","enable-magic-cookies":"false"}},
+ {"service":"0x9E","instance":"0x1","unreliable":"30158","reliable":{"port":"30158","enable-magic-cookies":"false"}},
+ {"service":"0x9F","instance":"0x1","unreliable":"30159","reliable":{"port":"30159","enable-magic-cookies":"false"}},
+ {"service":"0xA0","instance":"0x1","unreliable":"30160","reliable":{"port":"30160","enable-magic-cookies":"false"}},
+ {"service":"0xA1","instance":"0x1","unreliable":"30161","reliable":{"port":"60000","enable-magic-cookies":"false"}},
+ {"service":"0xA2","instance":"0x1","unreliable":"60000","reliable":{"port":"30162","enable-magic-cookies":"false"}},
+ {"service":"0xA3","instance":"0x1","unreliable":"30163","reliable":{"port":"30163","enable-magic-cookies":"false"}},
+ {"service":"0xA4","instance":"0x1","unreliable":"30164","reliable":{"port":"30164","enable-magic-cookies":"false"}},
+ {"service":"0xA5","instance":"0x1","unreliable":"30165","reliable":{"port":"30165","enable-magic-cookies":"false"}},
+ {"service":"0xA6","instance":"0x1","unreliable":"30166","reliable":{"port":"30166","enable-magic-cookies":"false"}},
+ {"service":"0xA7","instance":"0x1","unreliable":"30167","reliable":{"port":"30167","enable-magic-cookies":"false"}},
+ {"service":"0xA8","instance":"0x1","unreliable":"30168","reliable":{"port":"60000","enable-magic-cookies":"false"}},
+ {"service":"0xA9","instance":"0x1","unreliable":"30169","reliable":{"port":"30169","enable-magic-cookies":"false"}},
+ {"service":"0xAA","instance":"0x1","unreliable":"30170","reliable":{"port":"30170","enable-magic-cookies":"false"}},
+ {"service":"0xAB","instance":"0x1","unreliable":"60000","reliable":{"port":"30171","enable-magic-cookies":"false"}},
+ {"service":"0xAC","instance":"0x1","unreliable":"30172","reliable":{"port":"30172","enable-magic-cookies":"false"}},
+ {"service":"0xAD","instance":"0x1","unreliable":"30173","reliable":{"port":"30173","enable-magic-cookies":"false"}},
+ {"service":"0xAE","instance":"0x1","unreliable":"30174","reliable":{"port":"30174","enable-magic-cookies":"false"}},
+ {"service":"0xAF","instance":"0x1","unreliable":"30175","reliable":{"port":"60000","enable-magic-cookies":"false"}},
+ {"service":"0xB0","instance":"0x1","unreliable":"30176","reliable":{"port":"30176","enable-magic-cookies":"false"}},
+ {"service":"0xB1","instance":"0x1","unreliable":"30177","reliable":{"port":"30177","enable-magic-cookies":"false"}},
+ {"service":"0xB2","instance":"0x1","unreliable":"30178","reliable":{"port":"30178","enable-magic-cookies":"false"}},
+ {"service":"0xB3","instance":"0x1","unreliable":"30179","reliable":{"port":"30179","enable-magic-cookies":"false"}},
+ {"service":"0xB4","instance":"0x1","unreliable":"60000","reliable":{"port":"30180","enable-magic-cookies":"false"}},
+ {"service":"0xB5","instance":"0x1","unreliable":"30181","reliable":{"port":"30181","enable-magic-cookies":"false"}},
+ {"service":"0xB6","instance":"0x1","unreliable":"30182","reliable":{"port":"60000","enable-magic-cookies":"false"}},
+ {"service":"0xB7","instance":"0x1","unreliable":"30183","reliable":{"port":"30183","enable-magic-cookies":"false"}},
+ {"service":"0xB8","instance":"0x1","unreliable":"30184","reliable":{"port":"30184","enable-magic-cookies":"false"}},
+ {"service":"0xB9","instance":"0x1","unreliable":"30185","reliable":{"port":"30185","enable-magic-cookies":"false"}},
+ {"service":"0xBA","instance":"0x1","unreliable":"30186","reliable":{"port":"30186","enable-magic-cookies":"false"}},
+ {"service":"0xBB","instance":"0x1","unreliable":"30187","reliable":{"port":"30187","enable-magic-cookies":"false"}},
+ {"service":"0xBC","instance":"0x1","unreliable":"30188","reliable":{"port":"30188","enable-magic-cookies":"false"}},
+ {"service":"0xBD","instance":"0x1","unreliable":"60000","reliable":{"port":"60000","enable-magic-cookies":"false"}},
+ {"service":"0xBE","instance":"0x1","unreliable":"30190","reliable":{"port":"30190","enable-magic-cookies":"false"}},
+ {"service":"0xBF","instance":"0x1","unreliable":"30191","reliable":{"port":"30191","enable-magic-cookies":"false"}},
+ {"service":"0xC0","instance":"0x1","unreliable":"30192","reliable":{"port":"30192","enable-magic-cookies":"false"}},
+ {"service":"0xC1","instance":"0x1","unreliable":"30193","reliable":{"port":"30193","enable-magic-cookies":"false"}},
+ {"service":"0xC2","instance":"0x1","unreliable":"30194","reliable":{"port":"30194","enable-magic-cookies":"false"}},
+ {"service":"0xC3","instance":"0x1","unreliable":"30195","reliable":{"port":"30195","enable-magic-cookies":"false"}},
+ {"service":"0xC4","instance":"0x1","unreliable":"30196","reliable":{"port":"60000","enable-magic-cookies":"false"}},
+ {"service":"0xC5","instance":"0x1","unreliable":"30197","reliable":{"port":"30197","enable-magic-cookies":"false"}},
+ {"service":"0xC6","instance":"0x1","unreliable":"60000","reliable":{"port":"30198","enable-magic-cookies":"false"}},
+ {"service":"0xC7","instance":"0x1","unreliable":"30199","reliable":{"port":"30199","enable-magic-cookies":"false"}},
+ {"service":"0xC8","instance":"0x1","unreliable":"30200","reliable":{"port":"30200","enable-magic-cookies":"false"}},
+ {"service":"0xC9","instance":"0x1","unreliable":"30201","reliable":{"port":"30201","enable-magic-cookies":"false"}},
+ {"service":"0xCA","instance":"0x1","unreliable":"30202","reliable":{"port":"30202","enable-magic-cookies":"false"}},
+ {"service":"0xCB","instance":"0x1","unreliable":"30203","reliable":{"port":"60000","enable-magic-cookies":"false"}},
+ {"service":"0xCC","instance":"0x1","unreliable":"30204","reliable":{"port":"30204","enable-magic-cookies":"false"}},
+ {"service":"0xCD","instance":"0x1","unreliable":"30205","reliable":{"port":"30205","enable-magic-cookies":"false"}},
+ {"service":"0xCE","instance":"0x1","unreliable":"30206","reliable":{"port":"30206","enable-magic-cookies":"false"}},
+ {"service":"0xCF","instance":"0x1","unreliable":"60000","reliable":{"port":"30207","enable-magic-cookies":"false"}},
+ {"service":"0xD0","instance":"0x1","unreliable":"30208","reliable":{"port":"30208","enable-magic-cookies":"false"}},
+ {"service":"0xD1","instance":"0x1","unreliable":"30209","reliable":{"port":"30209","enable-magic-cookies":"false"}},
+ {"service":"0xD2","instance":"0x1","unreliable":"30210","reliable":{"port":"60000","enable-magic-cookies":"false"}},
+ {"service":"0xD3","instance":"0x1","unreliable":"30211","reliable":{"port":"30211","enable-magic-cookies":"false"}},
+ {"service":"0xD4","instance":"0x1","unreliable":"30212","reliable":{"port":"30212","enable-magic-cookies":"false"}},
+ {"service":"0xD5","instance":"0x1","unreliable":"30213","reliable":{"port":"30213","enable-magic-cookies":"false"}},
+ {"service":"0xD6","instance":"0x1","unreliable":"30214","reliable":{"port":"30214","enable-magic-cookies":"false"}},
+ {"service":"0xD7","instance":"0x1","unreliable":"30215","reliable":{"port":"30215","enable-magic-cookies":"false"}},
+ {"service":"0xD8","instance":"0x1","unreliable":"60000","reliable":{"port":"30216","enable-magic-cookies":"false"}},
+ {"service":"0xD9","instance":"0x1","unreliable":"30217","reliable":{"port":"60000","enable-magic-cookies":"false"}},
+ {"service":"0xDA","instance":"0x1","unreliable":"30218","reliable":{"port":"30218","enable-magic-cookies":"false"}},
+ {"service":"0xDB","instance":"0x1","unreliable":"30219","reliable":{"port":"30219","enable-magic-cookies":"false"}},
+ {"service":"0xDC","instance":"0x1","unreliable":"30220","reliable":{"port":"30220","enable-magic-cookies":"false"}},
+ {"service":"0xDD","instance":"0x1","unreliable":"30221","reliable":{"port":"30221","enable-magic-cookies":"false"}},
+ {"service":"0xDE","instance":"0x1","unreliable":"30222","reliable":{"port":"30222","enable-magic-cookies":"false"}},
+ {"service":"0xDF","instance":"0x1","unreliable":"30223","reliable":{"port":"30223","enable-magic-cookies":"false"}},
+ {"service":"0xE0","instance":"0x1","unreliable":"30224","reliable":{"port":"60000","enable-magic-cookies":"false"}},
+ {"service":"0xE1","instance":"0x1","unreliable":"60000","reliable":{"port":"30225","enable-magic-cookies":"false"}},
+ {"service":"0xE2","instance":"0x1","unreliable":"30226","reliable":{"port":"30226","enable-magic-cookies":"false"}},
+ {"service":"0xE3","instance":"0x1","unreliable":"30227","reliable":{"port":"30227","enable-magic-cookies":"false"}},
+ {"service":"0xE4","instance":"0x1","unreliable":"30228","reliable":{"port":"30228","enable-magic-cookies":"false"}},
+ {"service":"0xE5","instance":"0x1","unreliable":"30229","reliable":{"port":"30229","enable-magic-cookies":"false"}},
+ {"service":"0xE6","instance":"0x1","unreliable":"30230","reliable":{"port":"30230","enable-magic-cookies":"false"}},
+ {"service":"0xE7","instance":"0x1","unreliable":"30231","reliable":{"port":"60000","enable-magic-cookies":"false"}},
+ {"service":"0xE8","instance":"0x1","unreliable":"30232","reliable":{"port":"30232","enable-magic-cookies":"false"}},
+ {"service":"0xE9","instance":"0x1","unreliable":"30233","reliable":{"port":"30233","enable-magic-cookies":"false"}},
+ {"service":"0xEA","instance":"0x1","unreliable":"60000","reliable":{"port":"30234","enable-magic-cookies":"false"}},
+ {"service":"0xEB","instance":"0x1","unreliable":"30235","reliable":{"port":"30235","enable-magic-cookies":"false"}},
+ {"service":"0xEC","instance":"0x1","unreliable":"30236","reliable":{"port":"30236","enable-magic-cookies":"false"}},
+ {"service":"0xED","instance":"0x1","unreliable":"30237","reliable":{"port":"30237","enable-magic-cookies":"false"}},
+ {"service":"0xEE","instance":"0x1","unreliable":"30238","reliable":{"port":"60000","enable-magic-cookies":"false"}},
+ {"service":"0xEF","instance":"0x1","unreliable":"30239","reliable":{"port":"30239","enable-magic-cookies":"false"}},
+ {"service":"0xF0","instance":"0x1","unreliable":"30240","reliable":{"port":"30240","enable-magic-cookies":"false"}},
+ {"service":"0xF1","instance":"0x1","unreliable":"30241","reliable":{"port":"30241","enable-magic-cookies":"false"}},
+ {"service":"0xF2","instance":"0x1","unreliable":"30242","reliable":{"port":"30242","enable-magic-cookies":"false"}},
+ {"service":"0xF3","instance":"0x1","unreliable":"60000","reliable":{"port":"30243","enable-magic-cookies":"false"}},
+ {"service":"0xF4","instance":"0x1","unreliable":"30244","reliable":{"port":"30244","enable-magic-cookies":"false"}},
+ {"service":"0xF5","instance":"0x1","unreliable":"30245","reliable":{"port":"60000","enable-magic-cookies":"false"}},
+ {"service":"0xF6","instance":"0x1","unreliable":"30246","reliable":{"port":"30246","enable-magic-cookies":"false"}},
+ {"service":"0xF7","instance":"0x1","unreliable":"30247","reliable":{"port":"30247","enable-magic-cookies":"false"}},
+ {"service":"0xF8","instance":"0x1","unreliable":"30248","reliable":{"port":"30248","enable-magic-cookies":"false"}},
+ {"service":"0xF9","instance":"0x1","unreliable":"30249","reliable":{"port":"30249","enable-magic-cookies":"false"}},
+ {"service":"0xFA","instance":"0x1","unreliable":"30250","reliable":{"port":"30250","enable-magic-cookies":"false"}},
+ {"service":"0xFB","instance":"0x1","unreliable":"30251","reliable":{"port":"30251","enable-magic-cookies":"false"}},
+ {"service":"0xFC","instance":"0x1","unreliable":"60000","reliable":{"port":"60000","enable-magic-cookies":"false"}},
+ {"service":"0xFD","instance":"0x1","unreliable":"30253","reliable":{"port":"30253","enable-magic-cookies":"false"}},
+ {"service":"0xFE","instance":"0x1","unreliable":"30254","reliable":{"port":"30254","enable-magic-cookies":"false"}},
+ {"service":"0xFF","instance":"0x1","unreliable":"30255","reliable":{"port":"30255","enable-magic-cookies":"false"}},
+ {"service":"0x100","instance":"0x1","unreliable":"30256","reliable":{"port":"30256","enable-magic-cookies":"false"}},
+ {"service":"0x101","instance":"0x1","unreliable":"30257","reliable":{"port":"30257","enable-magic-cookies":"false"}},
+ {"service":"0x102","instance":"0x1","unreliable":"30258","reliable":{"port":"30258","enable-magic-cookies":"false"}},
+ {"service":"0x103","instance":"0x1","unreliable":"30259","reliable":{"port":"60000","enable-magic-cookies":"false"}},
+ {"service":"0x104","instance":"0x1","unreliable":"30260","reliable":{"port":"30260","enable-magic-cookies":"false"}},
+ {"service":"0x105","instance":"0x1","unreliable":"60000","reliable":{"port":"30261","enable-magic-cookies":"false"}},
+ {"service":"0x106","instance":"0x1","unreliable":"30262","reliable":{"port":"30262","enable-magic-cookies":"false"}},
+ {"service":"0x107","instance":"0x1","unreliable":"30263","reliable":{"port":"30263","enable-magic-cookies":"false"}},
+ {"service":"0x108","instance":"0x1","unreliable":"30264","reliable":{"port":"30264","enable-magic-cookies":"false"}},
+ {"service":"0x109","instance":"0x1","unreliable":"30265","reliable":{"port":"30265","enable-magic-cookies":"false"}},
+ {"service":"0x10A","instance":"0x1","unreliable":"30266","reliable":{"port":"60000","enable-magic-cookies":"false"}},
+ {"service":"0x10B","instance":"0x1","unreliable":"30267","reliable":{"port":"30267","enable-magic-cookies":"false"}},
+ {"service":"0x10C","instance":"0x1","unreliable":"30268","reliable":{"port":"30268","enable-magic-cookies":"false"}},
+ {"service":"0x10D","instance":"0x1","unreliable":"30269","reliable":{"port":"30269","enable-magic-cookies":"false"}},
+ {"service":"0x10E","instance":"0x1","unreliable":"60000","reliable":{"port":"30270","enable-magic-cookies":"false"}},
+ {"service":"0x10F","instance":"0x1","unreliable":"30271","reliable":{"port":"30271","enable-magic-cookies":"false"}},
+ {"service":"0x110","instance":"0x1","unreliable":"30272","reliable":{"port":"30272","enable-magic-cookies":"false"}},
+ {"service":"0x111","instance":"0x1","unreliable":"30273","reliable":{"port":"60000","enable-magic-cookies":"false"}},
+ {"service":"0x112","instance":"0x1","unreliable":"30274","reliable":{"port":"30274","enable-magic-cookies":"false"}},
+ {"service":"0x113","instance":"0x1","unreliable":"30275","reliable":{"port":"30275","enable-magic-cookies":"false"}},
+ {"service":"0x114","instance":"0x1","unreliable":"30276","reliable":{"port":"30276","enable-magic-cookies":"false"}},
+ {"service":"0x115","instance":"0x1","unreliable":"30277","reliable":{"port":"30277","enable-magic-cookies":"false"}},
+ {"service":"0x116","instance":"0x1","unreliable":"30278","reliable":{"port":"30278","enable-magic-cookies":"false"}},
+ {"service":"0x117","instance":"0x1","unreliable":"60000","reliable":{"port":"30279","enable-magic-cookies":"false"}},
+ {"service":"0x118","instance":"0x1","unreliable":"30280","reliable":{"port":"60000","enable-magic-cookies":"false"}},
+ {"service":"0x119","instance":"0x1","unreliable":"30281","reliable":{"port":"30281","enable-magic-cookies":"false"}},
+ {"service":"0x11A","instance":"0x1","unreliable":"30282","reliable":{"port":"30282","enable-magic-cookies":"false"}},
+ {"service":"0x11B","instance":"0x1","unreliable":"30283","reliable":{"port":"30283","enable-magic-cookies":"false"}},
+ {"service":"0x11C","instance":"0x1","unreliable":"30284","reliable":{"port":"30284","enable-magic-cookies":"false"}},
+ {"service":"0x11D","instance":"0x1","unreliable":"30285","reliable":{"port":"30285","enable-magic-cookies":"false"}},
+ {"service":"0x11E","instance":"0x1","unreliable":"30286","reliable":{"port":"30286","enable-magic-cookies":"false"}},
+ {"service":"0x11F","instance":"0x1","unreliable":"30287","reliable":{"port":"60000","enable-magic-cookies":"false"}},
+ {"service":"0x120","instance":"0x1","unreliable":"60000","reliable":{"port":"30288","enable-magic-cookies":"false"}},
+ {"service":"0x121","instance":"0x1","unreliable":"30289","reliable":{"port":"30289","enable-magic-cookies":"false"}},
+ {"service":"0x122","instance":"0x1","unreliable":"30290","reliable":{"port":"30290","enable-magic-cookies":"false"}},
+ {"service":"0x123","instance":"0x1","unreliable":"30291","reliable":{"port":"30291","enable-magic-cookies":"false"}},
+ {"service":"0x124","instance":"0x1","unreliable":"30292","reliable":{"port":"30292","enable-magic-cookies":"false"}},
+ {"service":"0x125","instance":"0x1","unreliable":"30293","reliable":{"port":"30293","enable-magic-cookies":"false"}},
+ {"service":"0x126","instance":"0x1","unreliable":"30294","reliable":{"port":"60000","enable-magic-cookies":"false"}},
+ {"service":"0x127","instance":"0x1","unreliable":"30295","reliable":{"port":"30295","enable-magic-cookies":"false"}},
+ {"service":"0x128","instance":"0x1","unreliable":"30296","reliable":{"port":"30296","enable-magic-cookies":"false"}},
+ {"service":"0x129","instance":"0x1","unreliable":"60000","reliable":{"port":"30297","enable-magic-cookies":"false"}},
+ {"service":"0x12A","instance":"0x1","unreliable":"30298","reliable":{"port":"30298","enable-magic-cookies":"false"}},
+ {"service":"0x12B","instance":"0x1","unreliable":"30299","reliable":{"port":"30299","enable-magic-cookies":"false"}},
+ {"service":"0x12C","instance":"0x1","unreliable":"30300","reliable":{"port":"30300","enable-magic-cookies":"false"}}
+ ],
+ "routing":"routingmanagerd",
+ "service-discovery":
+ {
+ "enable":"true",
+ "ttl" : "3",
+ "multicast":"224.0.11.1",
+ "cyclic_offer_delay" : "1000",
+ "port":"30490",
+ "protocol":"udp"
+ }
+} \ No newline at end of file
diff --git a/test/network_tests/offer_tests/conf/offer_test_external_master.json.in b/test/network_tests/offer_tests/conf/offer_test_external_master.json.in
new file mode 100644
index 0000000..c54d9ac
--- /dev/null
+++ b/test/network_tests/offer_tests/conf/offer_test_external_master.json.in
@@ -0,0 +1,36 @@
+{
+ "unicast":"@TEST_IP_MASTER@",
+ "logging":
+ {
+ "level":"info",
+ "console":"true",
+ "file":
+ {
+ "enable":"false",
+ "path":"/tmp/vsomeip.log"
+ },
+ "dlt":"false"
+ },
+ "services":
+ [
+ {
+ "service":"0x1111",
+ "instance":"0x0001",
+ "unreliable":"30001",
+ "reliable":
+ {
+ "port":"40001",
+ "enable-magic-cookies":"false"
+ }
+ }
+ ],
+ "routing":"routingmanagerd",
+ "service-discovery":
+ {
+ "enable":"true",
+ "multicast":"224.0.0.1",
+ "port":"30490",
+ "protocol":"udp",
+ "cyclic_offer_delay" : "500"
+ }
+} \ No newline at end of file
diff --git a/test/network_tests/offer_tests/conf/offer_test_external_master_starter.sh.in b/test/network_tests/offer_tests/conf/offer_test_external_master_starter.sh.in
new file mode 100755
index 0000000..0e75fa9
--- /dev/null
+++ b/test/network_tests/offer_tests/conf/offer_test_external_master_starter.sh.in
@@ -0,0 +1,158 @@
+#!/bin/bash
+# Copyright (C) 2015-2017 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+# Purpose: This script is needed to start the services with
+# one command. This is necessary as ctest - which is used to run the
+# tests - isn't able to start multiple binaries for one testcase. Therefore
+# the testcase simply executes this script. This script then runs the services
+# and checks that all exit successfully.
+
+FAIL=0
+# Rejecting offer for which there is already a remote offer:
+# * start daemon
+# * start application which offers service
+# * start daemon remotely
+# * start same application which offers the same service again remotely
+# -> should be rejected as there is already a service instance
+# running in the network
+
+# Array for client pids
+CLIENT_PIDS=()
+export VSOMEIP_CONFIGURATION=offer_test_external_master.json
+# start daemon
+../../examples/routingmanagerd/./routingmanagerd &
+PID_VSOMEIPD=$!
+# Start the services
+./offer_test_service 2 &
+PID_SERVICE_TWO=$!
+echo "SERVICE_TWO pid $PID_SERVICE_TWO"
+
+./offer_test_client SUBSCRIBE &
+CLIENT_PIDS+=($!)
+echo "client pid ${CLIENT_PIDS[0]}"
+
+sleep 1
+
+if [ ! -z "$USE_LXC_TEST" ]; then
+ echo "Waiting for 5s"
+ sleep 5
+ echo "starting offer test on slave LXC offer_test_external_slave_starter.sh"
+ ssh -tt -i $SANDBOX_ROOT_DIR/commonapi_main/lxc-config/.ssh/mgc_lxc/rsa_key_file.pub -o StrictHostKeyChecking=no root@$LXC_TEST_SLAVE_IP "bash -ci \"set -m; cd \\\$SANDBOX_TARGET_DIR/vsomeip_lib/test/network_tests; ./offer_test_external_slave_starter.sh\"" &
+ echo "remote ssh pid: $!"
+elif [ ! -z "$USE_DOCKER" ]; then
+ echo "Waiting for 5s"
+ sleep 5
+ docker exec $DOCKER_IMAGE sh -c "cd $DOCKER_TESTS && sleep 10; ./offer_test_external_slave_starter.sh" &
+else
+cat <<End-of-message
+*******************************************************************************
+*******************************************************************************
+** Please now run:
+** offer_test_external_slave_starter.sh
+** from an external host to successfully complete this test.
+**
+** You probably will need to adapt the 'unicast' settings in
+** offer_test_external_master.json and
+** offer_test_external_slave.json to your personal setup.
+*******************************************************************************
+*******************************************************************************
+End-of-message
+fi
+
+# Wait until all clients and services are finished
+for job in ${CLIENT_PIDS[*]} $PID_SERVICE_TWO
+do
+ # Fail gets incremented if a client exits with a non-zero exit code
+ echo "waiting for $job"
+ wait $job || FAIL=$(($FAIL+1))
+done
+
+# kill the services
+kill $PID_VSOMEIPD
+sleep 1
+
+# wait for slave to finish
+for job in $(jobs -p)
+do
+ # Fail gets incremented if either client or service exit
+ # with a non-zero exit code
+ echo "[Master] waiting for job $job"
+ wait $job || ((FAIL+=1))
+done
+
+# Rejecting remote offer for which there is already a local offer
+# * start application which offers service
+# * send sd message trying to offer the same service instance as already
+# offered locally from a remote host
+
+# Array for client pids
+CLIENT_PIDS=()
+export VSOMEIP_CONFIGURATION=offer_test_external_master.json
+# start daemon
+../../examples/routingmanagerd/./routingmanagerd &
+PID_VSOMEIPD=$!
+# Start the services
+./offer_test_service 2 &
+PID_SERVICE_TWO=$!
+
+./offer_test_client SUBSCRIBE &
+CLIENT_PIDS+=($!)
+echo "client pid ${CLIENT_PIDS[0]}"
+
+sleep 1
+
+if [ ! -z "$USE_LXC_TEST" ]; then
+ echo "Waiting for 5s"
+ sleep 5
+ echo "starting offer test on slave LXC offer_test_external_sd_msg_sender"
+ ssh -tt -i $SANDBOX_ROOT_DIR/commonapi_main/lxc-config/.ssh/mgc_lxc/rsa_key_file.pub -o StrictHostKeyChecking=no root@$LXC_TEST_SLAVE_IP "bash -ci \"set -m; cd \\\$SANDBOX_TARGET_DIR/vsomeip_lib/test/network_tests; ./offer_test_external_sd_msg_sender $LXC_TEST_MASTER_IP\"" &
+ echo "remote ssh job id: $!"
+elif [ ! -z "$USE_DOCKER" ]; then
+ echo "Waiting for 5s"
+ sleep 5
+ docker exec $DOCKER_IMAGE sh -c "cd $DOCKER_TESTS && sleep 10; ./offer_test_external_sd_msg_sender $DOCKER_IP" &
+else
+cat <<End-of-message
+*******************************************************************************
+*******************************************************************************
+** Please now run:
+** offer_test_external_sd_msg_sender @TEST_IP_MASTER@
+** (pass the correct ip address of your test master)
+** from an external host to successfully complete this test.
+**
+*******************************************************************************
+*******************************************************************************
+End-of-message
+fi
+
+# Wait until all clients and services are finished
+for job in ${CLIENT_PIDS[*]} $PID_SERVICE_TWO
+do
+ # Fail gets incremented if a client exits with a non-zero exit code
+ echo "waiting for $job"
+ wait $job || FAIL=$(($FAIL+1))
+done
+
+# kill the services
+kill $PID_VSOMEIPD
+sleep 1
+
+# wait for slave to finish
+for job in $(jobs -p)
+do
+ # Fail gets incremented if either client or service exit
+ # with a non-zero exit code
+ echo "[Master] waiting for job $job"
+ wait $job || ((FAIL+=1))
+done
+
+# Check if everything went well
+if [ $FAIL -eq 0 ]
+then
+ exit 0
+else
+ exit 1
+fi
diff --git a/test/network_tests/offer_tests/conf/offer_test_external_slave.json.in b/test/network_tests/offer_tests/conf/offer_test_external_slave.json.in
new file mode 100644
index 0000000..73a0e58
--- /dev/null
+++ b/test/network_tests/offer_tests/conf/offer_test_external_slave.json.in
@@ -0,0 +1,36 @@
+{
+ "unicast":"@TEST_IP_SLAVE@",
+ "logging":
+ {
+ "level":"info",
+ "console":"true",
+ "file":
+ {
+ "enable":"false",
+ "path":"/tmp/vsomeip.log"
+ },
+ "dlt":"false"
+ },
+ "services":
+ [
+ {
+ "service":"0x1111",
+ "instance":"0x0001",
+ "unreliable":"30001",
+ "reliable":
+ {
+ "port":"40001",
+ "enable-magic-cookies":"false"
+ }
+ }
+ ],
+ "routing":"routingmanagerd",
+ "service-discovery":
+ {
+ "enable":"true",
+ "multicast":"224.0.0.1",
+ "port":"30490",
+ "protocol":"udp",
+ "cyclic_offer_delay" : "500"
+ }
+} \ No newline at end of file
diff --git a/test/network_tests/offer_tests/offer_test_big_sd_msg_client.cpp b/test/network_tests/offer_tests/offer_test_big_sd_msg_client.cpp
new file mode 100644
index 0000000..3524592
--- /dev/null
+++ b/test/network_tests/offer_tests/offer_test_big_sd_msg_client.cpp
@@ -0,0 +1,238 @@
+// Copyright (C) 2014-2017 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#include <chrono>
+#include <condition_variable>
+#include <iomanip>
+#include <iostream>
+#include <sstream>
+#include <thread>
+#include <map>
+#include <algorithm>
+#include <atomic>
+
+#include <gtest/gtest.h>
+
+#include <vsomeip/vsomeip.hpp>
+#include <vsomeip/internal/logger.hpp>
+
+#include "offer_test_globals.hpp"
+
+class offer_test_big_sd_msg_client {
+public:
+ offer_test_big_sd_msg_client(struct offer_test::service_info _service_info) :
+ service_info_(_service_info),
+ app_(vsomeip::runtime::get()->create_application("offer_test_big_sd_msg_client")),
+ wait_until_registered_(true),
+ wait_until_service_available_(true),
+ wait_until_subscribed_(true),
+ wait_for_stop_(true),
+ stop_thread_(std::bind(&offer_test_big_sd_msg_client::wait_for_stop, this)),
+ send_thread_(std::bind(&offer_test_big_sd_msg_client::send, this)) {
+ if (!app_->init()) {
+ ADD_FAILURE() << "Couldn't initialize application";
+ return;
+ }
+ app_->register_state_handler(
+ std::bind(&offer_test_big_sd_msg_client::on_state, this,
+ std::placeholders::_1));
+
+ app_->register_message_handler(vsomeip::ANY_SERVICE,
+ vsomeip::ANY_INSTANCE, vsomeip::ANY_METHOD,
+ std::bind(&offer_test_big_sd_msg_client::on_message, this,
+ std::placeholders::_1));
+
+ // register availability for all other services and request their event.
+ app_->register_availability_handler(vsomeip::ANY_SERVICE,
+ vsomeip::ANY_INSTANCE,
+ std::bind(&offer_test_big_sd_msg_client::on_availability, this,
+ std::placeholders::_1, std::placeholders::_2,
+ std::placeholders::_3), 0x1, 0x1);
+ std::set<vsomeip::eventgroup_t> its_eventgroups;
+ its_eventgroups.insert(offer_test::big_msg_eventgroup_id);
+ for (std::uint16_t s = 1; s <= offer_test::big_msg_number_services; s++) {
+ app_->request_service(s,0x1,0x1,0x1);
+ app_->request_event(s,0x1, offer_test::big_msg_event_id,
+ its_eventgroups, vsomeip::event_type_e::ET_EVENT,
+ vsomeip::reliability_type_e::RT_UNKNOWN);
+ app_->subscribe(s, 0x1,offer_test::big_msg_eventgroup_id, 0x1,
+ offer_test::big_msg_event_id);
+ services_available_subribed_[s] = std::make_pair(false,0);
+ app_->register_subscription_status_handler(s,0x1,
+ offer_test::big_msg_eventgroup_id,
+ offer_test::big_msg_event_id,
+ std::bind(&offer_test_big_sd_msg_client::subscription_status_changed, this,
+ std::placeholders::_1, std::placeholders::_2,
+ std::placeholders::_3, std::placeholders::_4, std::placeholders::_5));
+ }
+ app_->start();
+ }
+
+ ~offer_test_big_sd_msg_client() {
+ send_thread_.join();
+ stop_thread_.join();
+ }
+
+ void on_state(vsomeip::state_type_e _state) {
+ VSOMEIP_WARNING << "Application " << app_->get_name() << " is "
+ << (_state == vsomeip::state_type_e::ST_REGISTERED ?
+ "registered." : "deregistered.");
+
+ if (_state == vsomeip::state_type_e::ST_REGISTERED) {
+ std::lock_guard<std::mutex> its_lock(mutex_);
+ wait_until_registered_ = false;
+ condition_.notify_one();
+ }
+ }
+
+ void on_availability(vsomeip::service_t _service,
+ vsomeip::instance_t _instance, bool _is_available) {
+ VSOMEIP_DEBUG << "Service [" << std::setw(4)
+ << std::setfill('0') << std::hex << _service << "." << _instance
+ << "] is " << (_is_available ? "available":"not available") << ".";
+
+ std::lock_guard<std::mutex> its_lock(mutex_);
+ if(_is_available) {
+ auto found_service = services_available_subribed_.find(_service);
+ if (found_service != services_available_subribed_.end()) {
+ found_service->second.first = true;
+ if (std::all_of(services_available_subribed_.cbegin(),
+ services_available_subribed_.cend(),
+ [](const services_available_subribed_t::value_type& v) {
+ return v.second.first;
+ }
+ )) {
+ VSOMEIP_WARNING << "************************************************************";
+ VSOMEIP_WARNING << "All services available!";
+ VSOMEIP_WARNING << "************************************************************";
+ wait_until_service_available_ = false;
+ condition_.notify_one();
+ }
+ }
+ }
+ }
+
+ void subscription_status_changed(const vsomeip::service_t _service,
+ const vsomeip::instance_t _instance,
+ const vsomeip::eventgroup_t _eventgroup,
+ const vsomeip::event_t _event,
+ const uint16_t _error) {
+ EXPECT_EQ(0x1, _instance);
+ EXPECT_EQ(offer_test::big_msg_eventgroup_id, _eventgroup);
+ EXPECT_EQ(offer_test::big_msg_event_id, _event);
+ VSOMEIP_DEBUG << "Service [" << std::setw(4)
+ << std::setfill('0') << std::hex << _service << "." << _instance
+ << "] has " << (!_error ? "sent subscribe ack":" sent subscribe_nack") << ".";
+ if (_error == 0x0 /*OK*/) {
+
+ std::lock_guard<std::mutex> its_lock(mutex_);
+ auto found_service = services_available_subribed_.find(_service);
+ if (found_service != services_available_subribed_.end()) {
+ found_service->second.second++;
+ if (found_service->second.second > 1) {
+ ADD_FAILURE() << "Registered subscription status handler was "
+ "called " << std::dec << found_service->second.second
+ << " times for service: " << std::hex
+ << found_service->first;
+ }
+ if (std::all_of(services_available_subribed_.cbegin(),
+ services_available_subribed_.cend(),
+ [](const services_available_subribed_t::value_type& v) {
+ return v.second.second == 1;
+ }
+ )) {
+ VSOMEIP_WARNING << "************************************************************";
+ VSOMEIP_WARNING << "All subscription were acknowledged!";
+ VSOMEIP_WARNING << "************************************************************";
+ wait_until_subscribed_ = false;
+ condition_.notify_one();
+ }
+ }
+ }
+ };
+
+ void on_message(const std::shared_ptr<vsomeip::message> &_message) {
+ if (_message->get_message_type() == vsomeip::message_type_e::MT_RESPONSE) {
+ on_response(_message);
+ }
+ }
+
+ void on_response(const std::shared_ptr<vsomeip::message> &_message) {
+ EXPECT_EQ(0x1, _message->get_service());
+ EXPECT_EQ(service_info_.shutdown_method_id, _message->get_method());
+ EXPECT_EQ(0x1, _message->get_instance());
+ if(service_info_.shutdown_method_id == _message->get_method()) {
+ std::lock_guard<std::mutex> its_lock(stop_mutex_);
+ wait_for_stop_ = false;
+ VSOMEIP_INFO << "going down";
+ stop_condition_.notify_one();
+ }
+ }
+
+ void send() {
+ std::unique_lock<std::mutex> its_lock(mutex_);
+ while (wait_until_registered_) {
+ condition_.wait(its_lock);
+ }
+
+ while (wait_until_service_available_) {
+ condition_.wait(its_lock);
+ }
+
+ while (wait_until_subscribed_) {
+ condition_.wait(its_lock);
+ }
+
+ std::this_thread::sleep_for(std::chrono::seconds(5));
+ std::shared_ptr<vsomeip::message> its_req = vsomeip::runtime::get()->create_request();
+ its_req->set_service(1);
+ its_req->set_instance(1);
+ its_req->set_interface_version(0x1);
+ its_req->set_method(service_info_.shutdown_method_id);
+ app_->send(its_req);
+ }
+
+ void wait_for_stop() {
+ std::unique_lock<std::mutex> its_lock(stop_mutex_);
+ while (wait_for_stop_) {
+ stop_condition_.wait(its_lock);
+ }
+ VSOMEIP_INFO << "going down";
+ app_->clear_all_handler();
+ app_->stop();
+ }
+
+private:
+ struct offer_test::service_info service_info_;
+ std::shared_ptr<vsomeip::application> app_;
+
+ bool wait_until_registered_;
+ bool wait_until_service_available_;
+ bool wait_until_subscribed_;
+ std::mutex mutex_;
+ std::condition_variable condition_;
+
+ bool wait_for_stop_;
+ std::mutex stop_mutex_;
+ std::condition_variable stop_condition_;
+
+ typedef std::map<vsomeip::service_t,std::pair<bool, std::uint32_t>> services_available_subribed_t;
+ services_available_subribed_t services_available_subribed_;
+ std::thread stop_thread_;
+ std::thread send_thread_;
+};
+
+TEST(someip_offer_test_big_sd_msg, subscribe_or_call_method_at_service)
+{
+ offer_test_big_sd_msg_client its_sample(offer_test::service);
+}
+
+#if defined(__linux__) || defined(ANDROID)
+int main(int argc, char** argv)
+{
+ ::testing::InitGoogleTest(&argc, argv);
+ return RUN_ALL_TESTS();
+}
+#endif
diff --git a/test/network_tests/offer_tests/offer_test_big_sd_msg_service.cpp b/test/network_tests/offer_tests/offer_test_big_sd_msg_service.cpp
new file mode 100644
index 0000000..1cf52f9
--- /dev/null
+++ b/test/network_tests/offer_tests/offer_test_big_sd_msg_service.cpp
@@ -0,0 +1,172 @@
+// Copyright (C) 2014-2017 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#include <chrono>
+#include <condition_variable>
+#include <iomanip>
+#include <iostream>
+#include <sstream>
+#include <thread>
+#include <map>
+#include <algorithm>
+#include <atomic>
+#include <algorithm>
+
+#include <gtest/gtest.h>
+
+#include <vsomeip/vsomeip.hpp>
+#include <vsomeip/internal/logger.hpp>
+
+#include "offer_test_globals.hpp"
+
+class offer_test_big_sd_msg_service {
+public:
+ offer_test_big_sd_msg_service(struct offer_test::service_info _service_info) :
+ service_info_(_service_info),
+ // service with number 1 uses "routingmanagerd" as application name
+ // this way the same json file can be reused for all local tests
+ // including the ones with routingmanagerd
+ app_(vsomeip::runtime::get()->create_application("offer_test_big_sd_msg_service")),
+ wait_until_registered_(true),
+ wait_until_client_subscribed_to_all_services_(true),
+ shutdown_method_called_(false),
+ offer_thread_(std::bind(&offer_test_big_sd_msg_service::run, this)) {
+ if (!app_->init()) {
+ ADD_FAILURE() << "Couldn't initialize application";
+ return;
+ }
+ app_->register_state_handler(
+ std::bind(&offer_test_big_sd_msg_service::on_state, this,
+ std::placeholders::_1));
+
+ // offer field
+ std::set<vsomeip::eventgroup_t> its_eventgroups;
+ its_eventgroups.insert(offer_test::big_msg_eventgroup_id);
+ for (std::uint16_t s = 1; s <= offer_test::big_msg_number_services; s++) {
+ app_->offer_event(s, 0x1,
+ offer_test::big_msg_event_id, its_eventgroups,
+ vsomeip::event_type_e::ET_EVENT, std::chrono::milliseconds::zero(),
+ false, true, nullptr, vsomeip::reliability_type_e::RT_UNKNOWN);
+ app_->register_subscription_handler(s, 0x1, offer_test::big_msg_eventgroup_id,
+ std::bind(&offer_test_big_sd_msg_service::on_subscription,
+ this, std::placeholders::_1, std::placeholders::_2,
+ std::placeholders::_3, std::placeholders::_4, s));
+ subscriptions_[s] = 0;
+ }
+
+ app_->register_message_handler(vsomeip::ANY_SERVICE,
+ vsomeip::ANY_INSTANCE, service_info_.shutdown_method_id,
+ std::bind(&offer_test_big_sd_msg_service::on_shutdown_method_called, this,
+ std::placeholders::_1));
+
+
+ app_->start();
+ }
+
+ ~offer_test_big_sd_msg_service() {
+ offer_thread_.join();
+ }
+
+ void offer() {
+ for (std::uint16_t s = 1; s <= offer_test::big_msg_number_services; s++) {
+ app_->offer_service(s,0x1,0x1,0x1);
+ }
+ }
+
+ void on_state(vsomeip::state_type_e _state) {
+ VSOMEIP_INFO << "Application " << app_->get_name() << " is "
+ << (_state == vsomeip::state_type_e::ST_REGISTERED ?
+ "registered." : "deregistered.");
+
+ if (_state == vsomeip::state_type_e::ST_REGISTERED) {
+ std::lock_guard<std::mutex> its_lock(mutex_);
+ wait_until_registered_ = false;
+ condition_.notify_one();
+ }
+ }
+
+ bool on_subscription(vsomeip::client_t _client,
+ std::uint32_t _uid, std::uint32_t _gid,
+ bool _subscribed,
+ vsomeip::service_t _service) {
+ (void)_client;
+ (void)_uid;
+ (void)_gid;
+ if (_subscribed) {
+ subscriptions_[_service]++;
+ EXPECT_EQ(1u, subscriptions_[_service]);
+ if (std::all_of(subscriptions_.begin(), subscriptions_.end(), [&](const subscriptions_t::value_type& v){
+ return v.second == 1;
+ })) {
+ std::lock_guard<std::mutex> its_lock(mutex_);
+ wait_until_client_subscribed_to_all_services_ = false;
+ VSOMEIP_WARNING << "************************************************************";
+ VSOMEIP_WARNING << "Client subscribed to all services!";
+ VSOMEIP_WARNING << "************************************************************";
+ condition_.notify_one();
+ }
+ }
+
+ return true;
+ }
+
+ void on_shutdown_method_called(const std::shared_ptr<vsomeip::message> &_message) {
+ app_->send(vsomeip::runtime::get()->create_response(_message));
+ std::this_thread::sleep_for(std::chrono::seconds(1));
+ VSOMEIP_WARNING << "************************************************************";
+ VSOMEIP_WARNING << "Shutdown method called -> going down!";
+ VSOMEIP_WARNING << "************************************************************";
+ shutdown_method_called_ = true;
+ for (std::uint16_t s = 1; s <= offer_test::big_msg_number_services; s++) {
+ app_->stop_offer_service(s,0x1,0x1,0x1);
+ }
+ app_->clear_all_handler();
+ app_->stop();
+ }
+
+ void run() {
+ VSOMEIP_DEBUG << "[" << std::setw(4) << std::setfill('0') << std::hex
+ << service_info_.service_id << "] Running";
+ std::unique_lock<std::mutex> its_lock(mutex_);
+ while (wait_until_registered_) {
+ condition_.wait(its_lock);
+ }
+
+ VSOMEIP_DEBUG << "[" << std::setw(4) << std::setfill('0') << std::hex
+ << service_info_.service_id << "] Offering";
+ offer();
+
+ while (wait_until_client_subscribed_to_all_services_) {
+ condition_.wait(its_lock);
+ }
+ }
+
+private:
+ struct offer_test::service_info service_info_;
+ std::shared_ptr<vsomeip::application> app_;
+
+ bool wait_until_registered_;
+ bool wait_until_client_subscribed_to_all_services_;
+ std::mutex mutex_;
+ std::condition_variable condition_;
+ std::atomic<bool> shutdown_method_called_;
+ typedef std::map<vsomeip::service_t, std::uint32_t> subscriptions_t;
+ subscriptions_t subscriptions_;
+ std::thread offer_thread_;
+};
+
+TEST(someip_offer_test_big_sd_msg, notify_increasing_counter)
+{
+ offer_test_big_sd_msg_service its_sample(offer_test::service);
+}
+
+
+#if defined(__linux__) || defined(ANDROID)
+int main(int argc, char** argv)
+{
+ ::testing::InitGoogleTest(&argc, argv);
+ return RUN_ALL_TESTS();
+}
+#endif
diff --git a/test/network_tests/offer_tests/offer_test_big_sd_msg_slave_starter.sh b/test/network_tests/offer_tests/offer_test_big_sd_msg_slave_starter.sh
new file mode 100755
index 0000000..5f69c30
--- /dev/null
+++ b/test/network_tests/offer_tests/offer_test_big_sd_msg_slave_starter.sh
@@ -0,0 +1,45 @@
+#!/bin/bash
+# Copyright (C) 2015-2017 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+FAIL=0
+# Rejecting offer for which there is already a remote offer:
+# * start daemon
+# * start application which offers service
+# * start daemon remotely
+# * start same application which offers the same service again remotely
+# -> should be rejected as there is already a service instance
+# running in the network
+
+export VSOMEIP_CONFIGURATION=offer_test_big_sd_msg_slave.json
+# start daemon
+../../examples/routingmanagerd/./routingmanagerd &
+PID_VSOMEIPD=$!
+sleep 1
+# Start the services
+./offer_test_big_sd_msg_service &
+PID_SERVICE_TWO=$!
+sleep 1
+
+# Wait until all clients and services are finished
+for job in $PID_SERVICE_TWO
+do
+ # Fail gets incremented if a client exits with a non-zero exit code
+ wait $job || FAIL=$(($FAIL+1))
+done
+
+# kill the services
+kill $PID_VSOMEIPD
+sleep 1
+
+
+
+# Check if everything went well
+if [ $FAIL -eq 0 ]
+then
+ exit 0
+else
+ exit 1
+fi
diff --git a/test/network_tests/offer_tests/offer_test_client.cpp b/test/network_tests/offer_tests/offer_test_client.cpp
new file mode 100644
index 0000000..e8ad09f
--- /dev/null
+++ b/test/network_tests/offer_tests/offer_test_client.cpp
@@ -0,0 +1,288 @@
+// Copyright (C) 2014-2017 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#include <chrono>
+#include <condition_variable>
+#include <iomanip>
+#include <iostream>
+#include <sstream>
+#include <thread>
+#include <map>
+#include <algorithm>
+#include <atomic>
+
+#include <gtest/gtest.h>
+
+#include <vsomeip/vsomeip.hpp>
+#include <vsomeip/internal/logger.hpp>
+
+#ifdef ANDROID
+#include "../../implementation/configuration/include/internal_android.hpp"
+#else
+#include "../../implementation/configuration/include/internal.hpp"
+#endif // ANDROID
+
+#include "offer_test_globals.hpp"
+
+enum operation_mode_e {
+ SUBSCRIBE,
+ METHODCALL
+};
+
+class offer_test_client {
+public:
+ offer_test_client(struct offer_test::service_info _service_info, operation_mode_e _mode) :
+ service_info_(_service_info),
+ operation_mode_(_mode),
+ app_(vsomeip::runtime::get()->create_application("offer_test_client")),
+ wait_until_registered_(true),
+ wait_until_service_available_(true),
+ wait_for_stop_(true),
+ last_received_counter_(0),
+ last_received_response_(std::chrono::steady_clock::now()),
+ number_received_responses_(0),
+ stop_thread_(std::bind(&offer_test_client::wait_for_stop, this)),
+ send_thread_(std::bind(&offer_test_client::send, this)) {
+ if (!app_->init()) {
+ ADD_FAILURE() << "Couldn't initialize application";
+ return;
+ }
+ app_->register_state_handler(
+ std::bind(&offer_test_client::on_state, this,
+ std::placeholders::_1));
+
+ app_->register_message_handler(vsomeip::ANY_SERVICE,
+ vsomeip::ANY_INSTANCE, vsomeip::ANY_METHOD,
+ std::bind(&offer_test_client::on_message, this,
+ std::placeholders::_1));
+
+ // register availability for all other services and request their event.
+ app_->register_availability_handler(service_info_.service_id,
+ service_info_.instance_id,
+ std::bind(&offer_test_client::on_availability, this,
+ std::placeholders::_1, std::placeholders::_2,
+ std::placeholders::_3));
+ app_->request_service(service_info_.service_id,
+ service_info_.instance_id);
+
+ if (operation_mode_ == operation_mode_e::SUBSCRIBE) {
+ std::set<vsomeip::eventgroup_t> its_eventgroups;
+ its_eventgroups.insert(service_info_.eventgroup_id);
+ app_->request_event(service_info_.service_id,
+ service_info_.instance_id, service_info_.event_id,
+ its_eventgroups, vsomeip::event_type_e::ET_EVENT,
+ vsomeip::reliability_type_e::RT_BOTH);
+
+ app_->subscribe(service_info_.service_id, service_info_.instance_id,
+ service_info_.eventgroup_id, vsomeip::DEFAULT_MAJOR);
+ }
+
+ app_->start();
+ }
+
+ ~offer_test_client() {
+ send_thread_.join();
+ stop_thread_.join();
+ }
+
+ void on_state(vsomeip::state_type_e _state) {
+ VSOMEIP_INFO << "Application " << app_->get_name() << " is "
+ << (_state == vsomeip::state_type_e::ST_REGISTERED ?
+ "registered." : "deregistered.");
+
+ if (_state == vsomeip::state_type_e::ST_REGISTERED) {
+ std::lock_guard<std::mutex> its_lock(mutex_);
+ wait_until_registered_ = false;
+ condition_.notify_one();
+ }
+ }
+
+ void on_availability(vsomeip::service_t _service,
+ vsomeip::instance_t _instance, bool _is_available) {
+ VSOMEIP_INFO << "Service [" << std::setw(4)
+ << std::setfill('0') << std::hex << _service << "." << _instance
+ << "] is " << (_is_available ? "available":"not available") << ".";
+ std::lock_guard<std::mutex> its_lock(mutex_);
+ if(_is_available) {
+ wait_until_service_available_ = false;
+ condition_.notify_one();
+ } else {
+ wait_until_service_available_ = true;
+ condition_.notify_one();
+ }
+ }
+
+ void on_message(const std::shared_ptr<vsomeip::message> &_message) {
+ if(_message->get_message_type() == vsomeip::message_type_e::MT_NOTIFICATION) {
+ on_notification(_message);
+ } else if (_message->get_message_type() == vsomeip::message_type_e::MT_RESPONSE) {
+ on_response(_message);
+ }
+ }
+
+ void on_notification(const std::shared_ptr<vsomeip::message> &_message) {
+ std::shared_ptr<vsomeip::payload> its_payload(_message->get_payload());
+ EXPECT_EQ(4u, its_payload->get_length());
+ vsomeip::byte_t *d = its_payload->get_data();
+ static std::uint32_t number_received_notifications(0);
+ std::uint32_t counter(0);
+ counter |= static_cast<std::uint32_t>(d[0] << 24);
+ counter |= static_cast<std::uint32_t>(d[0] << 16);
+ counter = counter | static_cast<std::uint32_t>((d[2] << 8));
+ counter = counter | static_cast<std::uint32_t>(d[3]);
+
+ VSOMEIP_DEBUG
+ << "Received a notification with Client/Session [" << std::setw(4)
+ << std::setfill('0') << std::hex << _message->get_client() << "/"
+ << std::setw(4) << std::setfill('0') << std::hex
+ << _message->get_session() << "] from Service/Method ["
+ << std::setw(4) << std::setfill('0') << std::hex
+ << _message->get_service() << "/" << std::setw(4) << std::setfill('0')
+ << std::hex << _message->get_method() <<"] got:" << std::dec << counter;
+
+ ASSERT_GT(counter, last_received_counter_);
+ last_received_counter_ = counter;
+ ++number_received_notifications;
+
+ if(number_received_notifications >= 250) {
+ std::lock_guard<std::mutex> its_lock(stop_mutex_);
+ wait_for_stop_ = false;
+ VSOMEIP_INFO << "going down";
+ stop_condition_.notify_one();
+ }
+ }
+
+ void on_response(const std::shared_ptr<vsomeip::message> &_message) {
+ ++number_received_responses_;
+ static bool first(true);
+ if (first) {
+ first = false;
+ last_received_response_ = std::chrono::steady_clock::now();
+ return;
+ }
+ EXPECT_EQ(service_info_.service_id, _message->get_service());
+ EXPECT_EQ(service_info_.method_id, _message->get_method());
+ EXPECT_EQ(service_info_.instance_id, _message->get_instance());
+ ASSERT_LT(std::chrono::duration_cast<std::chrono::milliseconds>(
+ std::chrono::steady_clock::now() - last_received_response_).count(),
+ (std::chrono::milliseconds(VSOMEIP_DEFAULT_WATCHDOG_TIMEOUT)
+ + std::chrono::milliseconds(1000)).count());
+ last_received_response_ = std::chrono::steady_clock::now();
+ std::cout << ".";
+ std::cout.flush();
+ }
+
+ void send() {
+ if (operation_mode_ != operation_mode_e::METHODCALL) {
+ return;
+ }
+ std::unique_lock<std::mutex> its_lock(mutex_);
+ while (wait_until_registered_) {
+ condition_.wait(its_lock);
+ }
+
+ while (wait_until_service_available_) {
+ condition_.wait(its_lock);
+ }
+ its_lock.unlock();
+ its_lock.release();
+
+ for (int var = 0; var < offer_test::number_of_messages_to_send; ++var) {
+ bool send(false);
+ {
+ std::lock_guard<std::mutex> its_lock(mutex_);
+ send = !wait_until_service_available_;
+ }
+ if (send) {
+ std::shared_ptr<vsomeip::message> its_req = vsomeip::runtime::get()->create_request();
+ its_req->set_service(service_info_.service_id);
+ its_req->set_instance(service_info_.instance_id);
+ its_req->set_method(service_info_.method_id);
+ app_->send(its_req);
+ std::this_thread::sleep_for(std::chrono::milliseconds(100));
+ } else {
+ std::this_thread::sleep_for(std::chrono::milliseconds(50));
+ }
+ }
+ std::this_thread::sleep_for(std::chrono::milliseconds(100));
+ {
+ std::lock_guard<std::mutex> its_lock(stop_mutex_);
+ wait_for_stop_ = false;
+ VSOMEIP_INFO << "going down. Sent " << offer_test::number_of_messages_to_send
+ << " requests and received " << number_received_responses_
+ << " responses";
+ stop_condition_.notify_one();
+ }
+ }
+
+ void wait_for_stop() {
+ std::unique_lock<std::mutex> its_lock(stop_mutex_);
+ while (wait_for_stop_) {
+ stop_condition_.wait(its_lock);
+ }
+ VSOMEIP_INFO << "going down";
+ app_->clear_all_handler();
+ app_->stop();
+ }
+
+private:
+ struct offer_test::service_info service_info_;
+ operation_mode_e operation_mode_;
+ std::shared_ptr<vsomeip::application> app_;
+
+ bool wait_until_registered_;
+ bool wait_until_service_available_;
+ std::mutex mutex_;
+ std::condition_variable condition_;
+
+ bool wait_for_stop_;
+ std::mutex stop_mutex_;
+ std::condition_variable stop_condition_;
+
+ std::uint32_t last_received_counter_;
+ std::chrono::steady_clock::time_point last_received_response_;
+ std::atomic<std::uint32_t> number_received_responses_;
+ std::thread stop_thread_;
+ std::thread send_thread_;
+};
+
+static operation_mode_e passed_mode = operation_mode_e::SUBSCRIBE;
+
+TEST(someip_offer_test, subscribe_or_call_method_at_service)
+{
+ offer_test_client its_sample(offer_test::service, passed_mode);
+}
+
+#if defined(__linux__) || defined(ANDROID)
+int main(int argc, char** argv)
+{
+ ::testing::InitGoogleTest(&argc, argv);
+ if(argc < 2) {
+ std::cerr << "Please specify a operation mode, like: " << argv[0] << " SUBSCRIBE" << std::endl;
+ std::cerr << "Valid operation modes are SUBSCRIBE and METHODCALL" << std::endl;
+ return 1;
+ }
+
+ if (std::string("SUBSCRIBE") == std::string(argv[1])) {
+ passed_mode = operation_mode_e::SUBSCRIBE;
+ } else if (std::string("METHODCALL") == std::string(argv[1])) {
+ passed_mode = operation_mode_e::METHODCALL;
+ } else {
+ std::cerr << "Wrong operation mode passed, exiting" << std::endl;
+ std::cerr << "Please specify a operation mode, like: " << argv[0] << " SUBSCRIBE" << std::endl;
+ std::cerr << "Valid operation modes are SUBSCRIBE and METHODCALL" << std::endl;
+ return 1;
+ }
+
+#if 0
+ if (argc >= 4 && std::string("SAME_SERVICE_ID") == std::string(argv[3])) {
+ use_same_service_id = true;
+ } else {
+ use_same_service_id = false;
+ }
+#endif
+ return RUN_ALL_TESTS();
+}
+#endif
diff --git a/test/network_tests/offer_tests/offer_test_external_sd_msg_sender.cpp b/test/network_tests/offer_tests/offer_test_external_sd_msg_sender.cpp
new file mode 100644
index 0000000..db9446e
--- /dev/null
+++ b/test/network_tests/offer_tests/offer_test_external_sd_msg_sender.cpp
@@ -0,0 +1,78 @@
+// Copyright (C) 2015-2017 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#include <iostream>
+
+#include <gtest/gtest.h>
+
+#include <boost/asio.hpp>
+
+static char* passed_address;
+
+TEST(someip_offer_test, send_offer_service_sd_message)
+{
+ try {
+#if VSOMEIP_BOOST_VERSION < 106600
+ boost::asio::io_service io;
+#else
+ boost::asio::io_context io;
+#endif
+ boost::asio::ip::udp::socket::endpoint_type target_sd(
+ boost::asio::ip::address::from_string(std::string(passed_address)),
+ 30490);
+ boost::asio::ip::udp::socket udp_socket(io,
+ boost::asio::ip::udp::endpoint(boost::asio::ip::udp::v4(), 30490));
+ std::uint8_t its_offer_service_message[] = {
+ 0xff, 0xff, 0x81, 0x00,
+ 0x00, 0x00, 0x00, 0x3c,
+ 0x00, 0x00, 0x00, 0x01,
+ 0x01, 0x01, 0x02, 0x00,
+ 0xc0, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x10,
+ 0x01, 0x00, 0x00, 0x20,
+ 0x11, 0x11, 0x00, 0x01,
+ 0x00, 0xff, 0xff, 0xff,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x18,
+ 0x00, 0x09, 0x04, 0x00,
+ 0x0a, 0x00, 0x03, 0x01,
+ 0x00, 0x06, 0x9c, 0x41,
+ 0x00, 0x09, 0x04, 0x00,
+ 0x0a, 0x00, 0x03, 0x7D, // slave address
+ 0x00, 0x11, 0x75, 0x31
+ };
+ for (int var = 0; var < 15; ++var) {
+ udp_socket.send_to(boost::asio::buffer(its_offer_service_message), target_sd);
+ ++its_offer_service_message[11];
+ }
+
+ // call shutdown method
+ std::uint8_t shutdown_call[] = {
+ 0x11, 0x11, 0x14, 0x04,
+ 0x00, 0x00, 0x00, 0x08,
+ 0x22, 0x22, 0x00, 0x01,
+ 0x01, 0x00, 0x01, 0x00 };
+ boost::asio::ip::udp::socket::endpoint_type target_service(
+ boost::asio::ip::address::from_string(std::string(passed_address)),
+ 30001);
+ udp_socket.send_to(boost::asio::buffer(shutdown_call), target_service);
+ } catch (...) {
+ ASSERT_FALSE(true);
+ }
+}
+
+
+#if defined(__linux__) || defined(ANDROID)
+int main(int argc, char** argv) {
+ ::testing::InitGoogleTest(&argc, argv);
+ if(argc < 2) {
+ std::cout << "Please pass an target IP address to this binary like: "
+ << argv[0] << " 10.0.3.1" << std::endl;
+ exit(1);
+ }
+ passed_address = argv[1];
+ return RUN_ALL_TESTS();
+}
+#endif
diff --git a/test/network_tests/offer_tests/offer_test_external_slave_starter.sh b/test/network_tests/offer_tests/offer_test_external_slave_starter.sh
new file mode 100755
index 0000000..511bed1
--- /dev/null
+++ b/test/network_tests/offer_tests/offer_test_external_slave_starter.sh
@@ -0,0 +1,45 @@
+#!/bin/bash
+# Copyright (C) 2015-2017 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+FAIL=0
+# Rejecting offer for which there is already a remote offer:
+# * start daemon
+# * start application which offers service
+# * start daemon remotely
+# * start same application which offers the same service again remotely
+# -> should be rejected as there is already a service instance
+# running in the network
+
+export VSOMEIP_CONFIGURATION=offer_test_external_slave.json
+# start daemon
+../../examples/routingmanagerd/routingmanagerd &
+PID_VSOMEIPD=$!
+sleep 1
+# Start the services
+./offer_test_service_external 2 &
+PID_SERVICE_TWO=$!
+sleep 1
+
+# Wait until all clients and services are finished
+for job in $PID_SERVICE_TWO
+do
+ # Fail gets incremented if a client exits with a non-zero exit code
+ wait $job || FAIL=$(($FAIL+1))
+done
+
+# kill the services
+kill $PID_VSOMEIPD
+sleep 1
+
+
+
+# Check if everything went well
+if [ $FAIL -eq 0 ]
+then
+ exit 0
+else
+ exit 1
+fi
diff --git a/test/network_tests/offer_tests/offer_test_globals.hpp b/test/network_tests/offer_tests/offer_test_globals.hpp
new file mode 100644
index 0000000..ba69886
--- /dev/null
+++ b/test/network_tests/offer_tests/offer_test_globals.hpp
@@ -0,0 +1,29 @@
+// Copyright (C) 2014-2017 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef OFFER_TEST_GLOBALS_HPP_
+#define OFFER_TEST_GLOBALS_HPP_
+
+namespace offer_test {
+
+struct service_info {
+ vsomeip::service_t service_id;
+ vsomeip::instance_t instance_id;
+ vsomeip::method_t method_id;
+ vsomeip::event_t event_id;
+ vsomeip::eventgroup_t eventgroup_id;
+ vsomeip::method_t shutdown_method_id;
+};
+
+struct service_info service = { 0x1111, 0x1, 0x1111, 0x1111, 0x1000, 0x1404 };
+
+static constexpr int number_of_messages_to_send = 150;
+
+static constexpr std::uint16_t big_msg_number_services = 300;
+static constexpr vsomeip::event_t big_msg_event_id = 0x8000;
+static constexpr vsomeip::eventgroup_t big_msg_eventgroup_id = 0x1;
+}
+
+#endif /* OFFER_TEST_GLOBALS_HPP_ */
diff --git a/test/network_tests/offer_tests/offer_test_local.json b/test/network_tests/offer_tests/offer_test_local.json
new file mode 100644
index 0000000..be8aa09
--- /dev/null
+++ b/test/network_tests/offer_tests/offer_test_local.json
@@ -0,0 +1,20 @@
+{
+ "unicast":"127.0.0.1",
+ "logging":
+ {
+ "level":"info",
+ "console":"true",
+ "file":
+ {
+ "enable":"false",
+ "path":"/tmp/vsomeip.log"
+ },
+ "dlt":"false"
+ },
+ "routing":"routingmanagerd",
+ "service-discovery":
+ {
+ "enable":"false"
+ }
+}
+
diff --git a/test/network_tests/offer_tests/offer_test_local_starter.sh b/test/network_tests/offer_tests/offer_test_local_starter.sh
new file mode 100755
index 0000000..6c91a6d
--- /dev/null
+++ b/test/network_tests/offer_tests/offer_test_local_starter.sh
@@ -0,0 +1,298 @@
+#!/bin/bash
+# Copyright (C) 2015-2017 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+# Purpose: This script is needed to start the services with
+# one command. This is necessary as ctest - which is used to run the
+# tests - isn't able to start multiple binaries for one testcase. Therefore
+# the testcase simply executes this script. This script then runs the services
+# and checks that all exit successfully.
+
+FAIL=0
+
+cat <<End-of-message
+*******************************************************************************
+*******************************************************************************
+** Running first test
+*******************************************************************************
+*******************************************************************************
+End-of-message
+
+# Rejecting offer of service instance whose hosting application is still
+# alive:
+# * start application which offers service
+# * start two clients which continuously exchanges messages with the service
+# * start application which offers the same service again -> should be
+# rejected and an error message should be printed.
+# * Message exchange with client application should not be interrupted.
+
+# Array for client pids
+CLIENT_PIDS=()
+export VSOMEIP_CONFIGURATION=offer_test_local.json
+# Start the services
+./offer_test_service 1 &
+PID_SERVICE_ONE=$!
+./offer_test_client SUBSCRIBE &
+CLIENT_PIDS+=($!)
+./offer_test_client SUBSCRIBE &
+CLIENT_PIDS+=($!)
+
+./offer_test_service 2 &
+PID_SERVICE_TWO=$!
+
+# Wait until all clients are finished
+for job in ${CLIENT_PIDS[*]}
+do
+ # Fail gets incremented if a client exits with a non-zero exit code
+ wait $job || FAIL=$(($FAIL+1))
+done
+
+# kill the services
+kill $PID_SERVICE_TWO
+kill $PID_SERVICE_ONE
+sleep 1
+
+
+cat <<End-of-message
+*******************************************************************************
+*******************************************************************************
+** Running second test
+*******************************************************************************
+*******************************************************************************
+End-of-message
+
+# Rejecting offer of service instance whose hosting application is still
+# alive with daemon:
+# * start daemon (needed as he has to ping the offering client)
+# * start application which offers service
+# * start two clients which continuously exchanges messages with the service
+# * start application which offers the same service again -> should be
+# rejected and an error message should be printed.
+# * Message exchange with client application should not be interrupted.
+
+# Array for client pids
+CLIENT_PIDS=()
+export VSOMEIP_CONFIGURATION=offer_test_local.json
+# start daemon
+../../examples/routingmanagerd/./routingmanagerd &
+PID_VSOMEIPD=$!
+
+# Start the services
+./offer_test_service 2 &
+PID_SERVICE_TWO=$!
+./offer_test_client SUBSCRIBE &
+CLIENT_PIDS+=($!)
+./offer_test_client SUBSCRIBE &
+CLIENT_PIDS+=($!)
+
+./offer_test_service 3 &
+PID_SERVICE_THREE=$!
+
+# Wait until all clients are finished
+for job in ${CLIENT_PIDS[*]}
+do
+ # Fail gets incremented if a client exits with a non-zero exit code
+ wait $job || FAIL=$(($FAIL+1))
+done
+
+# kill the services
+kill $PID_SERVICE_THREE
+kill $PID_SERVICE_TWO
+sleep 1
+kill $PID_VSOMEIPD
+sleep 1
+
+
+cat <<End-of-message
+*******************************************************************************
+*******************************************************************************
+** Running third test
+*******************************************************************************
+*******************************************************************************
+End-of-message
+
+# Accepting offer of service instance whose hosting application crashed
+# with (send SIGKILL)
+# * start daemon
+# * start application which offers service
+# * start client which exchanges messages with the service
+# * kill application with SIGKILL
+# * start application which offers the same service again -> should be
+# accepted.
+# * start another client which exchanges messages with the service
+# * Client should now communicate with new offerer.
+
+# Array for client pids
+CLIENT_PIDS=()
+export VSOMEIP_CONFIGURATION=offer_test_local.json
+# start daemon
+../../examples/routingmanagerd/./routingmanagerd &
+PID_VSOMEIPD=$!
+# Start the service
+./offer_test_service 2 &
+PID_SERVICE_TWO=$!
+
+# Start a client
+./offer_test_client METHODCALL &
+CLIENT_PIDS+=($!)
+
+# Kill the service
+sleep 1
+kill -KILL $PID_SERVICE_TWO
+
+# reoffer the service
+./offer_test_service 3 &
+PID_SERVICE_THREE=$!
+
+# Start another client
+./offer_test_client METHODCALL &
+CLIENT_PIDS+=($!)
+
+# Wait until all clients are finished
+for job in ${CLIENT_PIDS[*]}
+do
+ # Fail gets incremented if a client exits with a non-zero exit code
+ wait $job || FAIL=$(($FAIL+1))
+done
+
+# kill the services
+kill $PID_SERVICE_THREE
+kill $PID_VSOMEIPD
+sleep 1
+
+cat <<End-of-message
+*******************************************************************************
+*******************************************************************************
+** Running fourth test
+*******************************************************************************
+*******************************************************************************
+End-of-message
+
+# Accepting offer of service instance whose hosting application became
+# unresponsive (SIGSTOP)
+# * start daemon
+# * start application which offers service
+# * Send a SIGSTOP to the service to make it unresponsive
+# * start application which offers the same service again -> should be
+# marked as PENDING_OFFER and a ping should be sent to the paused
+# application.
+# * After the timeout passed the new offer should be accepted.
+# * start client which exchanges messages with the service
+# * Client should now communicate with new offerer.
+
+# Array for client pids
+CLIENT_PIDS=()
+export VSOMEIP_CONFIGURATION=offer_test_local.json
+# start daemon
+../../examples/routingmanagerd/./routingmanagerd &
+PID_VSOMEIPD=$!
+# Start the service
+./offer_test_service 2 &
+PID_SERVICE_TWO=$!
+
+# Start a client
+./offer_test_client METHODCALL &
+CLIENT_PIDS+=($!)
+
+# Pause the service
+sleep 1
+kill -STOP $PID_SERVICE_TWO
+
+# reoffer the service
+./offer_test_service 3 &
+PID_SERVICE_THREE=$!
+
+# Start another client
+./offer_test_client METHODCALL &
+CLIENT_PIDS+=($!)
+
+# Wait until all clients are finished
+for job in ${CLIENT_PIDS[*]}
+do
+ # Fail gets incremented if a client exits with a non-zero exit code
+ wait $job || FAIL=$(($FAIL+1))
+done
+
+# kill the services
+kill -CONT $PID_SERVICE_TWO
+kill $PID_SERVICE_TWO
+kill $PID_SERVICE_THREE
+kill $PID_VSOMEIPD
+sleep 1
+
+cat <<End-of-message
+*******************************************************************************
+*******************************************************************************
+** Running fifth test
+*******************************************************************************
+*******************************************************************************
+End-of-message
+
+# Rejecting offers for which there is already a pending offer
+# * start daemon
+# * start application which offers service
+# * Send a SIGSTOP to the service to make it unresponsive
+# * start application which offers the same service again -> should be
+# marked as PENDING_OFFER and a ping should be sent to the paused
+# application.
+# * start application which offers the same service again -> should be
+# rejected as there is already a PENDING_OFFER pending.
+# * After the timeout passed the new offer should be accepted.
+# * start client which exchanges messages with the service
+# * Client should now communicate with new offerer.
+
+# Array for client pids
+CLIENT_PIDS=()
+export VSOMEIP_CONFIGURATION=offer_test_local.json
+# start daemon
+../../examples/routingmanagerd/./routingmanagerd &
+PID_VSOMEIPD=$!
+# Start the service
+./offer_test_service 2 &
+PID_SERVICE_TWO=$!
+
+# Start a client
+./offer_test_client METHODCALL &
+CLIENT_PIDS+=($!)
+
+# Pause the service
+sleep 1
+kill -STOP $PID_SERVICE_TWO
+
+# reoffer the service
+./offer_test_service 3 &
+PID_SERVICE_THREE=$!
+
+# reoffer the service again to provoke rejecting as there is
+# already a pending offer
+./offer_test_service 4 &
+PID_SERVICE_FOUR=$!
+
+# Start another client
+./offer_test_client METHODCALL &
+CLIENT_PIDS+=($!)
+
+# Wait until all clients are finished
+for job in ${CLIENT_PIDS[*]}
+do
+ # Fail gets incremented if a client exits with a non-zero exit code
+ wait $job || FAIL=$(($FAIL+1))
+done
+
+# kill the services
+kill -CONT $PID_SERVICE_TWO
+kill $PID_SERVICE_TWO
+kill $PID_SERVICE_THREE
+kill $PID_SERVICE_FOUR
+kill $PID_VSOMEIPD
+
+
+# Check if everything went well
+if [ $FAIL -eq 0 ]
+then
+ exit 0
+else
+ exit 1
+fi
diff --git a/test/network_tests/offer_tests/offer_test_service.cpp b/test/network_tests/offer_tests/offer_test_service.cpp
new file mode 100644
index 0000000..c160a6f
--- /dev/null
+++ b/test/network_tests/offer_tests/offer_test_service.cpp
@@ -0,0 +1,171 @@
+// Copyright (C) 2014-2017 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#include <chrono>
+#include <condition_variable>
+#include <iomanip>
+#include <iostream>
+#include <sstream>
+#include <thread>
+#include <map>
+#include <algorithm>
+#include <atomic>
+
+#include <gtest/gtest.h>
+
+#include <vsomeip/vsomeip.hpp>
+#include <vsomeip/internal/logger.hpp>
+
+#include "offer_test_globals.hpp"
+
+static std::string service_number;
+
+class offer_test_service {
+public:
+ offer_test_service(struct offer_test::service_info _service_info) :
+ service_info_(_service_info),
+ // service with number 1 uses "routingmanagerd" as application name
+ // this way the same json file can be reused for all local tests
+ // including the ones with routingmanagerd
+ app_(vsomeip::runtime::get()->create_application(
+ (service_number == "1") ? "routingmanagerd" :
+ "offer_test_service" + service_number)),
+ counter_(0),
+ wait_until_registered_(true),
+ shutdown_method_called_(false),
+ offer_thread_(std::bind(&offer_test_service::run, this)) {
+ if (!app_->init()) {
+ ADD_FAILURE() << "Couldn't initialize application";
+ return;
+ }
+ app_->register_state_handler(
+ std::bind(&offer_test_service::on_state, this,
+ std::placeholders::_1));
+
+ // offer field
+ std::set<vsomeip::eventgroup_t> its_eventgroups;
+ its_eventgroups.insert(service_info_.eventgroup_id);
+ app_->offer_event(service_info_.service_id, service_info_.instance_id,
+ service_info_.event_id, its_eventgroups,
+ vsomeip::event_type_e::ET_EVENT, std::chrono::milliseconds::zero(),
+ false, true, nullptr, vsomeip::reliability_type_e::RT_BOTH);
+
+ inc_counter_and_notify();
+
+ app_->register_message_handler(service_info_.service_id,
+ service_info_.instance_id, service_info_.method_id,
+ std::bind(&offer_test_service::on_request, this,
+ std::placeholders::_1));
+
+ app_->register_message_handler(service_info_.service_id,
+ service_info_.instance_id, service_info_.shutdown_method_id,
+ std::bind(&offer_test_service::on_shutdown_method_called, this,
+ std::placeholders::_1));
+ app_->start();
+ }
+
+ ~offer_test_service() {
+ offer_thread_.join();
+ }
+
+ void offer() {
+ app_->offer_service(service_info_.service_id, service_info_.instance_id);
+ // this is allowed
+ app_->offer_service(service_info_.service_id, service_info_.instance_id);
+ // this is not allowed and will be rejected
+ app_->offer_service(service_info_.service_id, service_info_.instance_id, 33, 4711);
+ }
+
+ void on_state(vsomeip::state_type_e _state) {
+ VSOMEIP_INFO << "Application " << app_->get_name() << " is "
+ << (_state == vsomeip::state_type_e::ST_REGISTERED ?
+ "registered." : "deregistered.");
+
+ if (_state == vsomeip::state_type_e::ST_REGISTERED) {
+ std::lock_guard<std::mutex> its_lock(mutex_);
+ wait_until_registered_ = false;
+ condition_.notify_one();
+ }
+ }
+
+ void on_request(const std::shared_ptr<vsomeip::message> &_message) {
+ app_->send(vsomeip::runtime::get()->create_response(_message));
+ }
+
+ void on_shutdown_method_called(const std::shared_ptr<vsomeip::message> &_message) {
+ (void)_message;
+ shutdown_method_called_ = true;
+ // this is will trigger a warning
+ app_->stop_offer_service(service_info_.service_id, service_info_.instance_id, 44, 4711);
+ app_->stop_offer_service(service_info_.service_id, service_info_.instance_id);
+ app_->clear_all_handler();
+ app_->stop();
+ }
+
+ void run() {
+ VSOMEIP_DEBUG << "[" << std::setw(4) << std::setfill('0') << std::hex
+ << service_info_.service_id << "] Running";
+ std::unique_lock<std::mutex> its_lock(mutex_);
+ while (wait_until_registered_) {
+ condition_.wait(its_lock);
+ }
+
+ VSOMEIP_DEBUG << "[" << std::setw(4) << std::setfill('0') << std::hex
+ << service_info_.service_id << "] Offering";
+ offer();
+
+ VSOMEIP_DEBUG << "[" << std::setw(4) << std::setfill('0') << std::hex
+ << service_info_.service_id << "] Notifying";
+ while(!shutdown_method_called_) {
+ std::this_thread::sleep_for(std::chrono::milliseconds(10));
+ inc_counter_and_notify();
+ }
+ }
+
+ void inc_counter_and_notify() {
+ ++counter_;
+ // set value to field
+ const std::shared_ptr<vsomeip::payload> its_payload(vsomeip::runtime::get()->create_payload());
+ std::vector<vsomeip::byte_t> its_data;
+ its_data.push_back(static_cast<vsomeip::byte_t>((counter_ & 0xFF000000) >> 24));
+ its_data.push_back(static_cast<vsomeip::byte_t>((counter_ & 0xFF0000) >> 16));
+ its_data.push_back(static_cast<vsomeip::byte_t>((counter_ & 0xFF00) >> 8));
+ its_data.push_back(static_cast<vsomeip::byte_t>((counter_ & 0xFF)));
+ its_payload->set_data(its_data);
+ app_->notify(service_info_.service_id, service_info_.instance_id,
+ service_info_.event_id, its_payload);
+ }
+
+private:
+ struct offer_test::service_info service_info_;
+ std::shared_ptr<vsomeip::application> app_;
+ std::uint32_t counter_;
+
+ bool wait_until_registered_;
+ std::mutex mutex_;
+ std::condition_variable condition_;
+ std::atomic<bool> shutdown_method_called_;
+ std::thread offer_thread_;
+};
+
+TEST(someip_offer_test, notify_increasing_counter)
+{
+ offer_test_service its_sample(offer_test::service);
+}
+
+
+#if defined(__linux__) || defined(ANDROID)
+int main(int argc, char** argv)
+{
+ ::testing::InitGoogleTest(&argc, argv);
+ if(argc < 2) {
+ std::cerr << "Please specify a service number, like: " << argv[0] << " 2" << std::endl;
+ return 1;
+ }
+
+ service_number = std::string(argv[1]);
+ return RUN_ALL_TESTS();
+}
+#endif
diff --git a/test/network_tests/offer_tests/offer_test_service_external.cpp b/test/network_tests/offer_tests/offer_test_service_external.cpp
new file mode 100644
index 0000000..7cd8ad8
--- /dev/null
+++ b/test/network_tests/offer_tests/offer_test_service_external.cpp
@@ -0,0 +1,155 @@
+// Copyright (C) 2014-2017 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#include <chrono>
+#include <condition_variable>
+#include <iomanip>
+#include <iostream>
+#include <sstream>
+#include <thread>
+#include <map>
+#include <algorithm>
+
+#include <gtest/gtest.h>
+
+#include <vsomeip/vsomeip.hpp>
+#include <vsomeip/internal/logger.hpp>
+
+#include "offer_test_globals.hpp"
+
+static std::string service_number;
+
+class offer_test_service {
+public:
+ offer_test_service(struct offer_test::service_info _service_info) :
+ service_info_(_service_info),
+ // service with number 1 uses "routingmanagerd" as application name
+ // this way the same json file can be reused for all local tests
+ // including the ones with routingmanagerd
+ app_(vsomeip::runtime::get()->create_application(
+ (service_number == "1") ? "routingmanagerd" :
+ "offer_test_service" + service_number)),
+ wait_until_registered_(true),
+ wait_until_service_available_(true),
+ offer_thread_(std::bind(&offer_test_service::run, this)) {
+ if (!app_->init()) {
+ ADD_FAILURE() << "Couldn't initialize application";
+ return;
+ }
+ app_->register_state_handler(
+ std::bind(&offer_test_service::on_state, this,
+ std::placeholders::_1));
+
+ app_->register_availability_handler(service_info_.service_id,
+ service_info_.instance_id,
+ std::bind(&offer_test_service::on_availability, this,
+ std::placeholders::_1, std::placeholders::_2,
+ std::placeholders::_3));
+ app_->request_service(service_info_.service_id,
+ service_info_.instance_id);
+ app_->start();
+ }
+
+ ~offer_test_service() {
+ offer_thread_.join();
+ }
+
+ void offer() {
+ app_->offer_service(service_info_.service_id, service_info_.instance_id);
+ // this is allowed
+ app_->offer_service(service_info_.service_id, service_info_.instance_id);
+ // this is not allowed and will be rejected
+ app_->offer_service(service_info_.service_id, service_info_.instance_id, 33, 4711);
+ }
+
+ void on_state(vsomeip::state_type_e _state) {
+ VSOMEIP_INFO << "Application " << app_->get_name() << " is "
+ << (_state == vsomeip::state_type_e::ST_REGISTERED ?
+ "registered." : "deregistered.");
+
+ if (_state == vsomeip::state_type_e::ST_REGISTERED) {
+ std::lock_guard<std::mutex> its_lock(mutex_);
+ wait_until_registered_ = false;
+ condition_.notify_one();
+ }
+ }
+
+ void on_availability(vsomeip::service_t _service,
+ vsomeip::instance_t _instance, bool _is_available) {
+ VSOMEIP_INFO << "Service [" << std::setw(4)
+ << std::setfill('0') << std::hex << _service << "." << _instance
+ << "] is " << (_is_available ? "available":"not available") << ".";
+ std::lock_guard<std::mutex> its_lock(mutex_);
+ if(_is_available) {
+ wait_until_service_available_ = false;
+ condition_.notify_one();
+ } else {
+ wait_until_service_available_ = true;
+ condition_.notify_one();
+ }
+ }
+
+ void run() {
+ VSOMEIP_DEBUG << "[" << std::setw(4) << std::setfill('0') << std::hex
+ << service_info_.service_id << "] Running";
+ {
+ std::unique_lock<std::mutex> its_lock(mutex_);
+ while (wait_until_registered_) {
+ condition_.wait(its_lock);
+ }
+
+ VSOMEIP_DEBUG << "[" << std::setw(4) << std::setfill('0') << std::hex
+ << service_info_.service_id << "] Offering";
+ offer();
+
+ while(wait_until_service_available_) {
+ condition_.wait(its_lock);
+ }
+ }
+
+ std::this_thread::sleep_for(std::chrono::seconds(1));
+ VSOMEIP_DEBUG << "[" << std::setw(4) << std::setfill('0') << std::hex
+ << service_info_.service_id << "] Calling stop method";
+ std::shared_ptr<vsomeip::message> msg(vsomeip::runtime::get()->create_request());
+ msg->set_service(service_info_.service_id);
+ msg->set_instance(service_info_.instance_id);
+ msg->set_method(service_info_.shutdown_method_id);
+ msg->set_message_type(vsomeip::message_type_e::MT_REQUEST_NO_RETURN);
+ app_->send(msg);
+ std::this_thread::sleep_for(std::chrono::seconds(2));
+ app_->clear_all_handler();
+ app_->stop();
+ }
+
+private:
+ struct offer_test::service_info service_info_;
+ std::shared_ptr<vsomeip::application> app_;
+
+ bool wait_until_registered_;
+ bool wait_until_service_available_;
+ std::mutex mutex_;
+ std::condition_variable condition_;
+ std::thread offer_thread_;
+};
+
+TEST(someip_offer_test, notify_increasing_counter)
+{
+ offer_test_service its_sample(offer_test::service);
+}
+
+
+#if defined(__linux__) || defined(ANDROID)
+int main(int argc, char** argv)
+{
+ ::testing::InitGoogleTest(&argc, argv);
+ if(argc < 2) {
+ std::cerr << "Please specify a service number, like: " << argv[0] << " 2" << std::endl;
+ return 1;
+ }
+
+ service_number = std::string(argv[1]);
+ return RUN_ALL_TESTS();
+}
+#endif