Commit c1c32d65 authored by Ilya Dmitrichenko's avatar Ilya Dmitrichenko Committed by Paul Sokolovsky
Browse files

qemu-arm: fully integrated test suite.

This is primarily intended to provide testing of Thumb-specific code within
Travis CI as well as if anyone else want to run it locally.  As discussed in
purposes.  This is currently agains an emulated Cortex-M3 core, however in
the near future it can extended to support M0, M0+ as well M4 (work in
progress exists in sushihangover/qemu).

It's probably true that most of the code base can be covered running uPy
natively on a POSIX system, however we do have the tiny bit of assembly
code.  There may exist bugs related to endianness and type aliases, let
alone potential standard library or compiler bugs or even
architecture-specific optimisations.

This could also incorporate lwIP (or other TCP/IP stack) integration as well
as SDIO+FATFS drivers.

The solution to inline the test cases was chose due to simplicity. It could
alternatively be implemented in a number of different way (see #515), but
this looked the simplest.

Inclusion of tinytest was just to avoid writing bo...
parent be86596b
......@@ -33,9 +33,16 @@ endif
## - gcc-arm-none-eabi-4_8-2014q1/share/gcc-arm-none-eabi/samples/src/qemu/Makefile
LDFLAGS= --specs=nano.specs --specs=rdimon.specs -Wl,--gc-sections -Wl,-Map=$(
ifeq ($(RUN_TESTS), 1)
SRC_C = \
test_main.c \
SRC_C = \
main.c \
SRC_S = \
......@@ -43,12 +50,25 @@ OBJ += $(PY_O)
OBJ += $(addprefix $(BUILD)/, $(SRC_C:.c=.o))
OBJ += $(addprefix $(BUILD)/, $(SRC_S:.s=.o))
ifeq ($(RUN_TESTS), 1)
INC += -I../tools/tinytest/
OBJ += $(BUILD)/tinytest.o
all: run
run: $(BUILD)/flash.elf
qemu-system-arm -cpu cortex-m3 -nographic -monitor null -serial null -semihosting -kernel $(BUILD)/flash.elf
.PHONY: $(BUILD)/genhdr/tests.h
$(BUILD)/test_main.o: $(BUILD)/genhdr/tests.h
$(Q)echo "Generating $@";(cd ../tests; ../tools/ > $@
$(Q)$(CC) $(CFLAGS) -DNO_FORKING -o $@ -c ../tools/tinytest/tinytest.c
## `$(LD)` doesn't seem to like `--specs` for some reason, but we can just use `$(CC)` here.
$(BUILD)/flash.elf: $(OBJ)
$(Q)$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(OBJ) $(LIBS)
#include <stdint.h>
#include <stdio.h>
#include <string.h>
#include "mpconfig.h"
#include "nlr.h"
#include "misc.h"
#include "qstr.h"
#include "lexer.h"
#include "parse.h"
#include "obj.h"
#include "parsehelper.h"
#include "compile.h"
#include "runtime0.h"
#include "runtime.h"
#include "repl.h"
#include "tinytest.h"
#include "tinytest_macros.h"
inline void do_str(const char *src) {
mp_lexer_t *lex = mp_lexer_new_from_str_len(MP_QSTR__lt_stdin_gt_, src, strlen(src), 0);
if (lex == NULL) {
tt_abort_msg("Lexer initialization error");
mp_parse_error_kind_t parse_error_kind;
mp_parse_node_t pn = mp_parse(lex, MP_PARSE_FILE_INPUT, &parse_error_kind);
if (pn == MP_PARSE_NODE_NULL) {
mp_parse_show_exception(lex, parse_error_kind);
tt_abort_msg("Parser error");
// parse okay
qstr source_name = mp_lexer_source_name(lex);
mp_obj_t module_fun = mp_compile(pn, source_name, MP_EMIT_OPT_NONE, true);
if (module_fun == mp_const_none) {
tt_abort_msg("Computer error");
nlr_buf_t nlr;
if (nlr_push(&nlr) == 0) {
} else {
tt_abort_msg("Uncaught exception");
#include "genhdr/tests.h"
int main() {
const char a[] = {"sim"};
int r = tinytest_main(1, (const char **) a, groups);
printf( "status: %i\n", r);
return r;
void gc_collect(void) {
mp_lexer_t *mp_lexer_new_from_file(const char *filename) {
return NULL;
mp_import_stat_t mp_import_stat(const char *path) {
mp_obj_t mp_builtin_open(uint n_args, const mp_obj_t *args) {
return mp_const_none;
MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mp_builtin_open_obj, 1, 2, mp_builtin_open);
void nlr_jump_fail(void *val) {
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment