1
0
mirror of https://github.com/esp8266/Arduino.git synced 2025-07-20 10:24:18 +03:00

allow reading test environment from python mocks

This allows requesting environment variable values set in the C++ test
code, from python mock code. Use case is cross-checking test
results against values expected by the host side part of the test.
This commit is contained in:
Ivan Grokhotkov
2018-04-10 21:19:53 +08:00
committed by Ivan Grokhotkov
parent 8bd26f2ded
commit 1acaa8b8f6
6 changed files with 81 additions and 7 deletions

View File

@ -14,7 +14,7 @@ $(PYTHON_ENV_DIR):
. $(PYTHON_ENV_DIR)/bin/activate && pip install -r requirements.txt . $(PYTHON_ENV_DIR)/bin/activate && pip install -r requirements.txt
test: $(TEST_EXECUTABLE) $(PYTHON_ENV_DIR) test: $(TEST_EXECUTABLE) $(PYTHON_ENV_DIR)
. $(PYTHON_ENV_DIR)/bin/activate && python runner.py -e $(TEST_EXECUTABLE) . $(PYTHON_ENV_DIR)/bin/activate && python runner.py -e $(TEST_EXECUTABLE) -m test/test.py
$(TEST_EXECUTABLE): test/test.cpp $(TEST_EXECUTABLE): test/test.cpp
g++ -std=c++11 -Isrc -o $@ test/test.cpp g++ -std=c++11 -Isrc -o $@ test/test.cpp

View File

@ -26,3 +26,19 @@ def teardown(test_name):
func_env['teardown'] = func_wrapper func_env['teardown'] = func_wrapper
return func_wrapper return func_wrapper
return decorator return decorator
def setenv(test_env, key, value):
if 'env' not in test_env:
test_env['env'] = []
test_env['env'] += [(key, value)]
def request_env(test_env, key):
return test_env['request_env'](key)
def get_all_envs(test_name):
global env
if test_name not in env:
return None
if 'env' not in env[test_name]:
return None
return env[test_name]['env']

View File

@ -93,19 +93,27 @@ class BSTestRunner(object):
self.sp.logfile = test_output self.sp.logfile = test_output
print('running test "{}"'.format(name)) print('running test "{}"'.format(name))
if should_update_env: if should_update_env:
res = self.update_env() res = self.update_env(self.env_vars)
if res != BSTestRunner.SUCCESS: if res != BSTestRunner.SUCCESS:
print('failed to set environment variables') print('failed to set environment variables')
break; break;
should_update_env = False should_update_env = False
if name in self.mocks: if name in self.mocks:
debug_print('setting up mocks') debug_print('setting up mocks')
self.mocks[name]['request_env'] = self.request_env
self.mocks[name]['setup']() self.mocks[name]['setup']()
extra_env = mock_decorators.get_all_envs(name)
if extra_env is not None:
self.update_env(extra_env)
t_start = time.time() t_start = time.time()
result = self.run_test(index) result = self.run_test(index)
if name in self.mocks: if name in self.mocks:
debug_print('tearing down mocks') debug_print('tearing down mocks')
self.mocks[name]['teardown']() try:
self.mocks[name]['teardown']()
except AssertionError:
debug_print('teardown assert failure')
result = BSTestRunner.FAIL
t_stop = time.time() t_stop = time.time()
self.sp.logfile = None self.sp.logfile = None
test_case.elapsed_sec = t_stop - t_start test_case.elapsed_sec = t_stop - t_start
@ -167,12 +175,12 @@ class BSTestRunner(object):
if timeout <= 0: if timeout <= 0:
return BSTestRunner.TIMEOUT return BSTestRunner.TIMEOUT
def update_env(self): def update_env(self, env_to_set):
for env_kv in self.env_vars: for env_kv in env_to_set:
self.sp.sendline('setenv "{}" "{}"'.format(env_kv[0], env_kv[1])) self.sp.sendline('setenv "{}" "{}"'.format(env_kv[0], env_kv[1]))
timeout = 10 timeout = 10
while timeout > 0: while timeout > 0:
res = self.sp.expect(['>>>>>bs_test_setenv ok', EOF, TIMEOUT]) res = self.sp.expect(['>>>>>bs_test_setenv', EOF, TIMEOUT])
if res == 0: if res == 0:
break break
time.sleep(0.1) time.sleep(0.1)
@ -183,6 +191,20 @@ class BSTestRunner(object):
return BSTestRunner.TIMEOUT return BSTestRunner.TIMEOUT
return BSTestRunner.SUCCESS return BSTestRunner.SUCCESS
def request_env(self, key):
self.sp.sendline('getenv "{}"'.format(key))
timeout = 10
while timeout > 0:
res = self.sp.expect([r'>>>>>bs_test_getenv value=\"(.+)\"', EOF, TIMEOUT])
if res == 0:
break
time.sleep(0.1)
timeout -= 0.1
if res != 0:
return None
return self.sp.match.group(1)
ser = None ser = None
def spawn_port(port_name, baudrate=115200): def spawn_port(port_name, baudrate=115200):

View File

@ -48,7 +48,14 @@ void output_menu_end(IO& io)
template<typename IO> template<typename IO>
void output_setenv_result(IO& io, const char* key, const char* value) void output_setenv_result(IO& io, const char* key, const char* value)
{ {
io.printf(BS_LINE_PREFIX "setenv ok key='%s' value='%s'\n", key, value); io.printf(BS_LINE_PREFIX "setenv key=\"%s\" value=\"%s\"\n", key, value);
}
template<typename IO>
void output_getenv_result(IO& io, const char* key, const char* value)
{
(void) key;
io.printf(BS_LINE_PREFIX "getenv value=\"%s\"\n", value);
} }
template<typename IO> template<typename IO>
@ -72,6 +79,15 @@ bool input_handle(IO& io, char* line_buf, size_t line_buf_size, int& test_num)
test_num = -1; test_num = -1;
return false; /* we didn't get the test number yet, so return false */ return false; /* we didn't get the test number yet, so return false */
} }
if (strcmp(argv[0], "getenv") == 0) {
if (argc != 2) {
return false;
}
const char* value = getenv(argv[1]);
output_getenv_result(io, argv[1], (value != NULL) ? value : "");
return false;
}
/* not one of the commands, try to parse as test number */
char* endptr; char* endptr;
test_num = (int) strtol(argv[0], &endptr, 10); test_num = (int) strtol(argv[0], &endptr, 10);
if (endptr != argv[0] + strlen(argv[0])) { if (endptr != argv[0] + strlen(argv[0])) {

View File

@ -49,3 +49,12 @@ TEST_CASE("this test also runs successfully", "[bluesmoke]")
{ {
} }
TEST_CASE("environment variables can be set and read from python", "[bluesmoke]")
{
const char* res = getenv("VAR_FROM_PYTHON");
REQUIRE(res != NULL);
CHECK(strcmp(res, "42") == 0);
setenv("VAR_FROM_TEST", "24", 1);
}

View File

@ -0,0 +1,11 @@
from mock_decorators import setup, teardown, setenv, request_env
@setup('environment variables can be set and read from python')
def setup_envtest(e):
setenv(e, 'VAR_FROM_PYTHON', '42')
@teardown('environment variables can be set and read from python')
def teardown_envtest(e):
env_value = request_env(e, 'VAR_FROM_TEST')
assert(env_value == '24')