1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2024-12-29 04:50:03 +01:00

Merge pull request #11875 from cladmi/pr/test_utils/sync

test_utils_interactive_sync: add a helper for synchronizing tests
This commit is contained in:
Francisco 2019-08-15 19:12:11 +02:00 committed by GitHub
commit 5653004d52
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
20 changed files with 128 additions and 19 deletions

View File

@ -14,6 +14,7 @@ import pexpect
from .spawn import find_exc_origin, setup_child, teardown_child
from .unittest import PexpectTestCase # noqa, F401 expose to users
from .utils import test_utils_interactive_sync # noqa, F401 expose to users
# Timeout for tests can be changed by setting RIOT_TEST_TIMEOUT to the desired
# value in the environment variables

27
dist/pythonlibs/testrunner/utils.py vendored Normal file
View File

@ -0,0 +1,27 @@
# Copyright (C) 2019 Freie Universität Berlin
#
# 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.
"""Utility functions for writing tests."""
import pexpect
def test_utils_interactive_sync(child, retries=5, delay=1):
"""Synchronisation for 'test_utils_interactive_sync' function.
Interacts through input to wait for node being ready.
"""
for _ in range(0, retries):
child.sendline('r')
ret = child.expect_exact(['READY', pexpect.TIMEOUT], timeout=delay)
if ret == 0:
break
else:
# Last call to make it fail her,
child.expect_exact('READY', timeout=0)
child.sendline('s')
child.expect_exact('START')

View File

@ -25,6 +25,9 @@ endif
ifneq (,$(filter shell_commands,$(USEMODULE)))
DIRS += shell/commands
endif
ifneq (,$(filter test_utils_interactive_sync,$(USEMODULE)))
DIRS += test_utils/interactive_sync
endif
ifneq (,$(filter net_help,$(USEMODULE)))
DIRS += net/crosslayer/net_help
endif

View File

@ -9,3 +9,5 @@ endif
ifneq (,$(filter prng_fortuna,$(USEMODULE)))
CFLAGS += -DCRYPTO_AES
endif
include $(RIOTBASE)/sys/test_utils/Makefile.dep

View File

@ -0,0 +1,42 @@
/*
* Copyright (C) 2019 Freie Universität Berlin
*
* 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.
*/
/**
* @defgroup test_utils_interactive_sync Test interactive synchronization
* @ingroup sys
* @brief Utility function for synchronizing before a test
*
* @{
* @file
* @brief Synchronization for normally non interactive tests
*
* @author Gaëtan Harter <gaetan.harter@fu-berlin.de>
*/
#ifndef TEST_UTILS_INTERACTIVE_SYNC_H
#define TEST_UTILS_INTERACTIVE_SYNC_H
#ifdef __cplusplus
extern "C" {
#endif
/**
* @brief Wait for the tester to start test
*
* @details Wait for a 's' character to return
*
*/
void test_utils_interactive_sync(void);
#ifdef __cplusplus
}
#endif
#endif /* TEST_UTILS_INTERACTIVE_SYNC_H */
/** @} */

View File

@ -0,0 +1,3 @@
ifneq (,$(filter test_utils_interactive_sync,$(USEMODULE)))
USEMODULE += stdin
endif

View File

@ -0,0 +1,3 @@
MODULE = test_utils_interactive_sync
include $(RIOTBASE)/Makefile.base

View File

@ -0,0 +1,20 @@
#include <stdio.h>
#include "test_utils/interactive_sync.h"
void test_utils_interactive_sync(void)
{
char c = '\0'; /* Print help on first loop */
do {
if (c == 'r') {
/* This one should have a different case than the help message
* otherwise we match it when using 'expect' */
puts("READY");
}
else if (c != '\n' && c != '\r') {
puts("Help: Press s to start test, r to print it is ready");
}
c = getchar();
} while (c != 's');
puts("START");
}

View File

@ -7,4 +7,6 @@ BOARD_INSUFFICIENT_MEMORY := arduino-duemilanove arduino-leonardo arduino-nano \
nucleo-l031k6 nucleo-l053 nucleo-l053r8 \
stm32f0discovery stm32l0538-disco
USEMODULE += test_utils_interactive_sync
include $(RIOTBASE)/Makefile.include

View File

@ -24,6 +24,7 @@
#include "cond.h"
#include "mutex.h"
#include "thread.h"
#include "test_utils/interactive_sync.h"
#define THREAD_NUMOF (5U)
#define THREAD_FIRSTGROUP_NUMOF (3U)
@ -62,6 +63,8 @@ int main(void)
puts("Condition variable order test");
puts("Please refer to the README.md for more information\n");
test_utils_interactive_sync();
mutex_init(&testlock);
cond_init(&testcond);

View File

@ -10,6 +10,8 @@
import os
import sys
from testrunner import test_utils_interactive_sync
thread_prio = {
3: 6,
4: 4,
@ -21,6 +23,8 @@ first_group_size = 3
def testfunc(child):
test_utils_interactive_sync(child)
for k in thread_prio.keys():
child.expect(u"T%i \(prio %i\): waiting on condition variable now" % (k, thread_prio[k]))

View File

@ -2,7 +2,7 @@ include ../Makefile.tests_common
USEPKG += libfixmath
USEMODULE += libfixmath
USEMODULE += xtimer
USEMODULE += test_utils_interactive_sync
TEST_ON_CI_WHITELIST += all

View File

@ -30,8 +30,9 @@
#include <stdio.h>
#include "xtimer.h"
#include "kernel_defines.h"
#include "fix16.h"
#include "test_utils/interactive_sync.h"
#ifndef M_PI
# define M_PI 3.14159265359
@ -185,8 +186,9 @@ static void unary_ops(void)
int main(void)
{
/* Delay output to prevent flooding of buffer */
xtimer_sleep(1);
/* Sync to prevent flooding of buffer */
test_utils_interactive_sync();
puts("Unary.");
unary_ops();

View File

@ -1,7 +1,7 @@
#!/usr/bin/env python3
import sys
from testrunner import run
from testrunner import run, test_utils_interactive_sync
def expect_unary(child):
@ -31,6 +31,7 @@ def expect_binary(child):
def testfunc(child):
test_utils_interactive_sync(child)
child.expect_exact('Unary.')
expect_unary(child)
child.expect_exact('Binary.')

View File

@ -2,8 +2,7 @@ include ../Makefile.tests_common
USEMODULE += posix_time
# This application uses getchar and thus expects input from stdio
USEMODULE += stdin
USEMODULE += test_utils_interactive_sync
TEST_ON_CI_WHITELIST += all

View File

@ -26,11 +26,11 @@
#include <stdio.h>
#include <unistd.h>
#include "test_utils/interactive_sync.h"
int main(void)
{
puts("Please hit any key and then ENTER to continue");
getchar();
test_utils_interactive_sync();
puts("5 x usleep(i++ * 500000)");
for (unsigned i = 0; i < 5; i++) {
useconds_t us = i * 500000u;

View File

@ -10,7 +10,7 @@
import sys
import time
from testrunner import run
from testrunner import run, test_utils_interactive_sync
US_PER_SEC = 1000000
EXTERNAL_JITTER = 0.15
@ -22,8 +22,7 @@ class InvalidTimeout(Exception):
def testfunc(child):
try:
child.expect_exact("Please hit any key and then ENTER to continue")
child.sendline("a")
test_utils_interactive_sync(child)
start_test = time.time()
child.expect_exact("5 x usleep(i++ * 500000)")
for i in range(5):

View File

@ -6,8 +6,7 @@ TEST_ON_CI_WHITELIST += all
# This test randomly fails on `native` so disable it from CI
TEST_ON_CI_BLACKLIST += native
# This application uses getchar and thus expects input from stdio
USEMODULE += stdin
USEMODULE += test_utils_interactive_sync
# Port and pin configuration for probing with oscilloscope
# Port number should be found in port enum e.g in cpu/include/periph_cpu.h

View File

@ -27,6 +27,7 @@
#include "xtimer.h"
#include "timex.h"
#include "test_utils/interactive_sync.h"
#define RUNS (5U)
#define SLEEP_TIMES_NUMOF ARRAY_SIZE(sleep_times)
@ -61,8 +62,7 @@ int main(void)
printf("Running test %u times with %u distinct sleep times\n", RUNS,
(unsigned)SLEEP_TIMES_NUMOF);
puts("Please hit any key and then ENTER to continue");
getchar();
test_utils_interactive_sync();
start_test = xtimer_now_usec();
for (unsigned m = 0; m < RUNS; m++) {
for (unsigned n = 0;

View File

@ -11,7 +11,7 @@
import sys
import time
from testrunner import run
from testrunner import run, test_utils_interactive_sync
US_PER_SEC = 1000000
@ -28,8 +28,7 @@ def testfunc(child):
RUNS = int(child.match.group(1))
SLEEP_TIMES_NUMOF = int(child.match.group(2))
try:
child.expect_exact(u"Please hit any key and then ENTER to continue")
child.sendline(u"a")
test_utils_interactive_sync(child)
start_test = time.time()
for m in range(RUNS):
for n in range(SLEEP_TIMES_NUMOF):