Skip to content

Commit

Permalink
SQUASH_ME: timeout, synced teardown, sudo check
Browse files Browse the repository at this point in the history
  • Loading branch information
brummer-simon committed Oct 3, 2019
1 parent 05054d5 commit 1433a13
Show file tree
Hide file tree
Showing 6 changed files with 64 additions and 31 deletions.
13 changes: 6 additions & 7 deletions tests/gnrc_tcp/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,13 +26,12 @@ or by executing the following commands:
sudo ip tuntap add tap0 mode tap user ${USER}
sudo ip link set tap0 up

Usage
Usage (native)
==========
make BOARD=<BOARD_NAME> all flash test
make BOARD=<BOARD_NAME> all test

With `ethos` (so for non-`native` boards) you will need to start the tests with
`sudo`:
Usage (non-native)
==========
gnrc_tcp tests require root privileges for boards other than 'native' due to ethos usage.

```sh
sudo make BOARD=<BOARD_NAME> test
```
sudo make BOARD=<BOARD_NAME> all flash test
16 changes: 10 additions & 6 deletions tests/gnrc_tcp/tests/01-conn_lifecycle_as_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,18 +12,20 @@

from testrunner import run
from shared_func import TcpServer, generate_port_number, get_host_tap_device, \
get_host_ll_addr, get_riot_if_id, verify_pktbuf_empty
get_host_ll_addr, get_riot_if_id, verify_pktbuf_empty, \
sudo_guard


def tcp_server(port):
with TcpServer(port):
pass
def tcp_server(port, shutdown_event):
with TcpServer(port, shutdown_event) as srv:
srv.wait_for_shutdown()


def testfunc(child):
port = generate_port_number()
shutdown_event = threading.Event()

server_handle = threading.Thread(target=tcp_server, args=(port,))
server_handle = threading.Thread(target=tcp_server, args=(port, shutdown_event))
server_handle.start()

target_addr = get_host_ll_addr(get_host_tap_device()) + '%' + get_riot_if_id(child)
Expand All @@ -34,6 +36,7 @@ def testfunc(child):
child.expect_exact('gnrc_tcp_open_active: returns 0')

# Close connection and verify that pktbuf is cleared
shutdown_event.set()
child.sendline('gnrc_tcp_close')
server_handle.join()

Expand All @@ -43,4 +46,5 @@ def testfunc(child):


if __name__ == '__main__':
sys.exit(run(testfunc, timeout=3, echo=False, traceback=True))
sudo_guard()
sys.exit(run(testfunc, timeout=20, echo=False, traceback=True))
14 changes: 10 additions & 4 deletions tests/gnrc_tcp/tests/02-conn_lifecycle_as_server.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,23 +13,27 @@

from testrunner import run
from shared_func import generate_port_number, get_host_tap_device, get_riot_ll_addr, \
verify_pktbuf_empty
verify_pktbuf_empty, sudo_guard


def tcp_client(addr, port):
def tcp_client(addr, port, shutdown_event):
sock = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

addr_info = socket.getaddrinfo(addr + '%' + get_host_tap_device(), port, type=socket.SOCK_STREAM)

sock.connect(addr_info[0][-1])

shutdown_event.wait()

sock.close()


def testfunc(child):
port = generate_port_number()
shutdown_event = threading.Event()

client_handle = threading.Thread(target=tcp_client, args=(get_riot_ll_addr(child), port))
client_handle = threading.Thread(target=tcp_client, args=(get_riot_ll_addr(child), port, shutdown_event))

# Setup RIOT Node wait for incoming connections from host system
child.sendline('gnrc_tcp_tcb_init')
Expand All @@ -39,6 +43,7 @@ def testfunc(child):
child.expect_exact('gnrc_tcp_open_passive: returns 0')

# Close connection and verify that pktbuf is cleared
shutdown_event.set()
child.sendline('gnrc_tcp_close')
client_handle.join()

Expand All @@ -48,4 +53,5 @@ def testfunc(child):


if __name__ == '__main__':
sys.exit(run(testfunc, timeout=3, echo=False, traceback=True))
sudo_guard()
sys.exit(run(testfunc, timeout=20, echo=False, traceback=True))
17 changes: 11 additions & 6 deletions tests/gnrc_tcp/tests/03-send_data.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,16 +13,19 @@
from testrunner import run
from shared_func import TcpServer, generate_port_number, get_host_tap_device, \
get_host_ll_addr, get_riot_if_id, setup_internal_buffer, \
write_data_to_internal_buffer, verify_pktbuf_empty
write_data_to_internal_buffer, verify_pktbuf_empty, \
sudo_guard


def tcp_server(port, expectedData):
with TcpServer(port) as tcp_srv:
assert tcp_srv.recv(len(expectedData)) == expectedData
def tcp_server(port, shutdown_event, expected_data):
with TcpServer(port, shutdown_event) as tcp_srv:
assert tcp_srv.recv(len(expected_data)) == expected_data
tcp_srv.wait_for_shutdown()


def testfunc(child):
port = generate_port_number()
shutdown_event = threading.Event()

# Try to send 2000 byte from RIOT to the Host System.
data = '0123456789' * 200
Expand All @@ -31,7 +34,7 @@ def testfunc(child):
# Verify that RIOT Applications internal buffer can hold test data.
assert setup_internal_buffer(child) >= data_len

server_handle = threading.Thread(target=tcp_server, args=(port, data))
server_handle = threading.Thread(target=tcp_server, args=(port, shutdown_event, data))
server_handle.start()

target_addr = get_host_ll_addr(get_host_tap_device()) + '%' + get_riot_if_id(child)
Expand All @@ -47,6 +50,7 @@ def testfunc(child):
child.expect_exact('gnrc_tcp_send: sent ' + str(data_len))

# Close connection and verify that pktbuf is cleared
shutdown_event.set()
child.sendline('gnrc_tcp_close')
server_handle.join()

Expand All @@ -56,4 +60,5 @@ def testfunc(child):


if __name__ == '__main__':
sys.exit(run(testfunc, timeout=3, echo=False, traceback=True))
sudo_guard()
sys.exit(run(testfunc, timeout=20, echo=False, traceback=True))
17 changes: 11 additions & 6 deletions tests/gnrc_tcp/tests/04-receive_data.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,16 +13,19 @@
from testrunner import run
from shared_func import TcpServer, generate_port_number, get_host_tap_device, \
get_host_ll_addr, get_riot_if_id, setup_internal_buffer, \
read_data_from_internal_buffer, verify_pktbuf_empty
read_data_from_internal_buffer, verify_pktbuf_empty, \
sudo_guard


def tcp_server(port, data):
with TcpServer(port) as tcp_srv:
def tcp_server(port, shutdown_event, data):
with TcpServer(port, shutdown_event) as tcp_srv:
tcp_srv.send(data)
tcp_srv.wait_for_shutdown()


def testfunc(child):
port = generate_port_number()
shutdown_event = threading.Event()

# Try to receive 2000 bytes sent from the Host System.
data = '0123456789' * 200
Expand All @@ -31,7 +34,7 @@ def testfunc(child):
# Verify that RIOT Applications internal buffer can hold test data.
assert setup_internal_buffer(child) >= data_len

server_handle = threading.Thread(target=tcp_server, args=(port, data))
server_handle = threading.Thread(target=tcp_server, args=(port, shutdown_event, data))
server_handle.start()

target_addr = get_host_ll_addr(get_host_tap_device()) + '%' + get_riot_if_id(child)
Expand All @@ -42,10 +45,11 @@ def testfunc(child):
child.expect_exact('gnrc_tcp_open_active: returns 0')

# Accept Data sent by the host system
child.sendline('gnrc_tcp_recv 1000000 ' + str(data_len))
child.sendline('gnrc_tcp_recv 20000000 ' + str(data_len))
child.expect_exact('gnrc_tcp_recv: received ' + str(data_len))

# Close connection and verify that pktbuf is cleared
shutdown_event.set()
child.sendline('gnrc_tcp_close')
server_handle.join()

Expand All @@ -58,4 +62,5 @@ def testfunc(child):


if __name__ == '__main__':
sys.exit(run(testfunc, timeout=3, echo=False, traceback=True))
sudo_guard()
sys.exit(run(testfunc, timeout=20, echo=False, traceback=True))
18 changes: 16 additions & 2 deletions tests/gnrc_tcp/tests/shared_func.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,17 @@
# This file is subject to the terms and conditions of the GNU Lesser
# General Public License v2.1. See the file LICENSE in the top level
# directory for more details.

import sys
import os
import re
import socket
import random


class TcpServer:
def __init__(self, port):
def __init__(self, port, shutdown_event):
self._port = port
self._shutdown = shutdown_event

def __enter__(self):
self.sock = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
Expand All @@ -34,6 +35,9 @@ def send(self, data):
def recv(self, number_of_bytes):
return self.conn.recv(number_of_bytes, socket.MSG_WAITALL).decode('utf-8')

def wait_for_shutdown(self):
self._shutdown.wait()


def generate_port_number():
return random.randint(1024, 65535)
Expand Down Expand Up @@ -97,3 +101,13 @@ def verify_pktbuf_empty(child):
pktbuf_size = child.match.group(2)

child.expect(r'~ unused: {} \(next: (\(nil\)|0), size: {}\) ~'.format(pktbuf_addr, pktbuf_size))


def sudo_guard():
sudo_required = os.environ.get("BOARD", "") != "native"
if sudo_required:
if os.geteuid() != 0:
print("\x1b[1;31mThis test requires root privileges.\n"
"It's constructing and sending Ethernet frames.\x1b[0m\n",
file=sys.stderr)
sys.exit(1)

0 comments on commit 1433a13

Please sign in to comment.