summaryrefslogtreecommitdiff
path: root/test/payload_tests/external_local_payload_test_client_local_and_external_starter.sh
blob: dda58cef03f09b4ce81655376a7ebfaa8003a33f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
#!/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 client and service with
# one command. This is necessary as ctest - which is used to run the
# tests - isn't able to start two binaries for one testcase. Therefore
# the testcase simply executes this script. This script then runs client
# and service and checks that both exit sucessfully.

FAIL=0

# Parameter 1: the pid to check
# Parameter 2: number of TCP/UDP sockets the process should have open
check_tcp_udp_sockets_are_open ()
{
    # Check that the passed pid/process does listen on at least one TCP/UDP socket 
    # awk is used to avoid the case when a inode number is the same as a PID. The awk
    # program filters the netstat output down to the protocol (1st field) and 
    # the PID/Program name (last field) fields.
    SERVICE_SOCKETS_LISTENING=$(netstat -tulpen 2> /dev/null | awk '{print $1 "\t"  $NF}' | grep $1 | wc -l)
    if [ $SERVICE_SOCKETS_LISTENING -lt $2 ]
    then
        ((FAIL+=1))
    fi
}

# Parameter 1: the pid to check
check_tcp_udp_sockets_are_closed ()
{
    # Check that the passed pid/process does not listen on any TCP/UDP socket 
    # or has any active connection via a TCP/UDP socket
    # awk is used to avoid the case when a inode number is the same as a PID. The awk
    # program filters the netstat output down to the protocol (1st field) and 
    # the PID/Program name (last field) fields.
    SERVICE_SOCKETS_LISTENING=$(netstat -tulpen 2> /dev/null | awk '{print $1 "\t"  $NF}' | grep $1 | wc -l)
    if [ $SERVICE_SOCKETS_LISTENING -ne 0 ]
    then
        ((FAIL+=1))
    fi

    SERVICE_SOCKETS_CONNECTED=$(netstat -tupen 2> /dev/null | awk '{print $1 "\t"  $NF}' | grep $1 | wc -l)
    if [ $SERVICE_SOCKETS_CONNECTED -ne 0 ]
    then
        ((FAIL+=1))
    fi
}

# Start the service
export VSOMEIP_APPLICATION_NAME=external_local_payload_test_service
export VSOMEIP_CONFIGURATION=external_local_payload_test_service.json
./payload_test_service &
SERIVCE_PID=$!
sleep 1;

# The service should listen on a TCP and UDP socket now
check_tcp_udp_sockets_are_open $SERIVCE_PID 2

# Start the client which sends messages over local UDS
export VSOMEIP_APPLICATION_NAME=external_local_payload_test_client_local
export VSOMEIP_CONFIGURATION=external_local_payload_test_client_local.json
./payload_test_client --dont-shutdown-service &
CLIENT_PID=$!
sleep 1

check_tcp_udp_sockets_are_open $SERIVCE_PID 2
check_tcp_udp_sockets_are_closed $CLIENT_PID

# Wait until client is finished
wait $CLIENT_PID || ((FAIL+=1))

# Display a message to show the user that he must now call the external client
# to finish the test successfully
if [ ! -z "$USE_LXC_TEST" ]; then
    echo "starting external local payload on slave LXC"
    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; ./external_local_payload_test_client_external_start.sh\"" &
    echo "remote ssh job id: $!"
elif [ ! -z "$USE_DOCKER" ]; then
    docker exec $DOCKER_IMAGE sh -c "cd $DOCKER_TESTS && ./external_local_payload_test_client_external_start.sh" &
elif [ ! -z "$JENKINS" ]; then
    ssh -tt -i $PRV_KEY -o StrictHostKeyChecking=no jenkins@$IP_SLAVE "bash -ci \"set -m; cd $WS_ROOT/build/test; ./external_local_payload_test_client_external_start.sh\" >> $WS_ROOT/slave_test_output 2>&1" &

else
cat <<End-of-message
*******************************************************************************
*******************************************************************************
** Please now run:
** external_local_payload_test_client_external_start.sh
** from an external host to successfully complete this test.
**
** You probably will need to adapt the 'unicast' settings in
** external_local_payload_test_client_external.json and
** external_local_payload_test_service.json to your personal setup.
*******************************************************************************
*******************************************************************************
End-of-message
fi

# The service should still listen on a TCP and UDP socket
sleep 1
check_tcp_udp_sockets_are_open $SERIVCE_PID 2

# Wait until service is finished
# The client remotely shuts down the service if he has successfully transmitted
# all the packets with different payloads. Therefore we can assume that everything
# went well, even if we can only check the exit code of the service here.

# Fail gets incremented if either client or service exit
# with a non-zero exit code
wait $SERIVCE_PID || ((FAIL+=1))


# Start the service for payload test with tcp
export VSOMEIP_APPLICATION_NAME=external_local_payload_test_service
export VSOMEIP_CONFIGURATION=external_local_payload_test_service.json
./payload_test_service --tcp &
SERIVCE_PID=$!

# The service should listen on a TCP and UDP socket now
sleep 1
check_tcp_udp_sockets_are_open $SERIVCE_PID 2


# Wait until service is finished
# The client remotely shuts down the service if he has successfully transmitted
# all the packets with different payloads. Therefore we can assume that everything
# went well, even if we can only check the exit code of the service here.

# Fail gets incremented if either client or service exit
# with a non-zero exit code
wait $SERIVCE_PID || ((FAIL+=1))

# Check if client and server both exited sucessfully and the service didnt't
# have any open TCP/UDP sockets
if [ $FAIL -eq 0 ]
then
    exit 0
else
    exit 1
fi