From d3b32caea410897d8bac849489b4558505869dfe Mon Sep 17 00:00:00 2001
From: Damien George <damien.p.george@gmail.com>
Date: Fri, 8 May 2015 00:19:56 +0100
Subject: [PATCH] unix: Add special function to improve coverage.

The function and corresponding command-line option are only enabled for
the coverage build.  They are used to exercise uPy features that can't
be properly tested by Python scripts.
---
 .travis.yml     |  2 ++
 unix/Makefile   |  5 ++++-
 unix/coverage.c | 26 ++++++++++++++++++++++++++
 unix/main.c     |  6 ++++++
 4 files changed, 38 insertions(+), 1 deletion(-)
 create mode 100644 unix/coverage.c

diff --git a/.travis.yml b/.travis.yml
index c598783f4..5d9a383c1 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -35,6 +35,8 @@ script:
   - make -C unix CC=gcc-4.7 coverage
   - (cd tests && MICROPY_CPYTHON3=python3.4 MICROPY_MICROPYTHON=../unix/micropython_coverage ./run-tests)
   - (cd tests && MICROPY_CPYTHON3=python3.4 MICROPY_MICROPYTHON=../unix/micropython_coverage ./run-tests --emit native)
+  # TODO the output of this extra coverage test is not checked
+  - unix/micropython_coverage --coverage
 
 after_success:
   - (cd unix && coveralls --root .. --build-root . --gcov $(which gcov-4.7) --gcov-options '\-o build-coverage/' --include py --include extmod)
diff --git a/unix/Makefile b/unix/Makefile
index 403f9295f..78572dbba 100644
--- a/unix/Makefile
+++ b/unix/Makefile
@@ -94,6 +94,7 @@ SRC_C = \
 	file.c \
 	modos.c \
 	alloc.c \
+	coverage.c \
 	$(SRC_MOD)
 
 
@@ -133,9 +134,11 @@ minimal:
 
 # build an interpreter for coverage testing and do the testing
 coverage:
-	$(MAKE) COPT="-O0" CFLAGS_EXTRA='-fprofile-arcs -ftest-coverage -Wdouble-promotion -Wformat -Wmissing-declarations -Wmissing-prototypes -Wold-style-definition -Wpointer-arith -Wshadow -Wsign-compare -Wuninitialized -Wunused-parameter' LDFLAGS_EXTRA='-fprofile-arcs -ftest-coverage' BUILD=build-coverage PROG=micropython_coverage
+	$(MAKE) COPT="-O0" CFLAGS_EXTRA='-fprofile-arcs -ftest-coverage -Wdouble-promotion -Wformat -Wmissing-declarations -Wmissing-prototypes -Wold-style-definition -Wpointer-arith -Wshadow -Wsign-compare -Wuninitialized -Wunused-parameter -DMICROPY_UNIX_COVERAGE' LDFLAGS_EXTRA='-fprofile-arcs -ftest-coverage' BUILD=build-coverage PROG=micropython_coverage
 
 coverage_test: coverage
 	$(eval DIRNAME=$(notdir $(CURDIR)))
 	cd ../tests && MICROPY_MICROPYTHON=../$(DIRNAME)/micropython_coverage ./run-tests
+	cd ../tests && MICROPY_MICROPYTHON=../$(DIRNAME)/micropython_coverage ./run-tests --emit native
 	gcov -o build-coverage/py ../py/*.c
+	gcov -o build-coverage/extmod ../extmod/*.c
diff --git a/unix/coverage.c b/unix/coverage.c
new file mode 100644
index 000000000..48dbfd5c7
--- /dev/null
+++ b/unix/coverage.c
@@ -0,0 +1,26 @@
+#include <stdio.h>
+
+#include "py/obj.h"
+#include "py/runtime.h"
+#include "py/repl.h"
+
+#if defined(MICROPY_UNIX_COVERAGE)
+
+// function to run extra tests for things that can't be checked by scripts
+void run_extra_coverage_tests(void);
+
+void run_extra_coverage_tests(void) {
+    // repl autocomplete
+    {
+        const char *str;
+        mp_uint_t len = mp_repl_autocomplete("__", 2, &mp_plat_print, &str);
+        printf("%.*s\n", (int)len, str);
+
+        mp_store_global(MP_QSTR_sys, mp_import_name(MP_QSTR_sys, mp_const_none, MP_OBJ_NEW_SMALL_INT(0)));
+        mp_repl_autocomplete("sys.", 4, &mp_plat_print, &str);
+        len = mp_repl_autocomplete("sys.impl", 8, &mp_plat_print, &str);
+        printf("%.*s\n", (int)len, str);
+    }
+}
+
+#endif
diff --git a/unix/main.c b/unix/main.c
index 4a71bfac6..abea15728 100644
--- a/unix/main.c
+++ b/unix/main.c
@@ -434,6 +434,12 @@ int main(int argc, char **argv) {
                     MP_STATE_VM(mp_optimise_value) = 0;
                     for (char *p = argv[a] + 1; *p && *p == 'O'; p++, MP_STATE_VM(mp_optimise_value)++);
                 }
+            #if defined(MICROPY_UNIX_COVERAGE)
+            } else if (strcmp(argv[a], "--coverage") == 0) {
+                void run_extra_coverage_tests(void);
+                run_extra_coverage_tests();
+                ret = 0;
+            #endif
             } else {
                 return usage(argv);
             }
-- 
GitLab