summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
authorScott Shawcroft <scott@tannewt.org>2018-07-30 12:33:44 -0700
committerGitHub <noreply@github.com>2018-07-30 12:33:44 -0700
commita6d94b68453b8535398ff0b61cd6c4a0c7f77f8b (patch)
tree8defd6392975b8145dc11f0cce9c39a4e440b32a /tools
parent433a29bb70d51abb84c77a911ced43c6ff14706e (diff)
parentb1006170f1dcfa3a9499ef31c19c8f20736b136a (diff)
Merge pull request #1068 from dhalbert/micropython-25ae98f-merge
Micropython 25ae98f merge
Diffstat (limited to 'tools')
-rwxr-xr-xtools/bootstrap_upip.sh2
-rwxr-xr-xtools/mpy-tool.py5
-rwxr-xr-xtools/pydfu.py44
-rwxr-xr-xtools/tinytest-codegen.py97
-rw-r--r--tools/tinytest/README18
-rw-r--r--tools/tinytest/tinytest.c474
-rw-r--r--tools/tinytest/tinytest.h98
-rw-r--r--tools/tinytest/tinytest_macros.h184
-rw-r--r--tools/upip.py17
9 files changed, 107 insertions, 832 deletions
diff --git a/tools/bootstrap_upip.sh b/tools/bootstrap_upip.sh
index 667d0845a..2891775d7 100755
--- a/tools/bootstrap_upip.sh
+++ b/tools/bootstrap_upip.sh
@@ -17,7 +17,7 @@ fi
# Remove any stale old version
rm -rf micropython-upip-*
-wget -nd -r -l1 https://pypi.python.org/pypi/micropython-upip/ --accept-regex ".*pypi.python.org/packages/source/.*.gz" --reject=html
+wget -nd -rH -l1 -D files.pythonhosted.org https://pypi.org/project/micropython-upip/ --reject=html
tar xfz micropython-upip-*.tar.gz
tmpd="$PWD"
diff --git a/tools/mpy-tool.py b/tools/mpy-tool.py
index ac7b2c1cc..eeb760a5f 100755
--- a/tools/mpy-tool.py
+++ b/tools/mpy-tool.py
@@ -287,7 +287,9 @@ class RawCode:
# generate constant objects
for i, obj in enumerate(self.objs):
obj_name = 'const_obj_%s_%u' % (self.escaped_name, i)
- if is_str_type(obj) or is_bytes_type(obj):
+ if obj is Ellipsis:
+ print('#define %s mp_const_ellipsis_obj' % obj_name)
+ elif is_str_type(obj) or is_bytes_type(obj):
if is_str_type(obj):
obj = bytes_cons(obj, 'utf8')
obj_type = 'mp_type_str'
@@ -328,7 +330,6 @@ class RawCode:
print('STATIC const mp_obj_complex_t %s = {{&mp_type_complex}, %.16g, %.16g};'
% (obj_name, obj.real, obj.imag))
else:
- # TODO
raise FreezeError(self, 'freezing of object %r is not implemented' % (obj,))
# generate constant table, if it has any entries
diff --git a/tools/pydfu.py b/tools/pydfu.py
index 8c0220de8..a7adda37c 100755
--- a/tools/pydfu.py
+++ b/tools/pydfu.py
@@ -5,7 +5,7 @@
# details.
"""This module implements enough functionality to program the STM32F4xx over
-DFU, without requiringdfu-util.
+DFU, without requiring dfu-util.
See app note AN3156 for a description of the DFU protocol.
See document UM0391 for a dscription of the DFuse file.
@@ -81,6 +81,7 @@ def init():
if len(devices) > 1:
raise ValueError("Multiple DFU devices found")
__dev = devices[0]
+ __dev.set_configuration()
# Claim DFU interface
usb.util.claim_interface(__dev, __DFU_INTERFACE)
@@ -167,7 +168,7 @@ def write_memory(addr, buf, progress=None, progress_addr=0, progress_size=0):
print ("Addr 0x%x %dKBs/%dKBs..." % (xfer_base + xfer_bytes,
xfer_bytes // 1024,
xfer_total // 1024))
- if progress and xfer_count % 256 == 0:
+ if progress and xfer_count % 2 == 0:
progress(progress_addr, xfer_base + xfer_bytes - progress_addr,
progress_size)
@@ -175,7 +176,9 @@ def write_memory(addr, buf, progress=None, progress_addr=0, progress_size=0):
set_address(xfer_base+xfer_bytes)
# Send DNLOAD with fw data
- chunk = min(64, xfer_total-xfer_bytes)
+ # the "2048" is the DFU transfer size supported by the ST DFU bootloader
+ # TODO: this number should be extracted from the USB config descriptor
+ chunk = min(2048, xfer_total-xfer_bytes)
__dev.ctrl_transfer(0x21, __DFU_DNLOAD, 2, __DFU_INTERFACE,
buf[xfer_bytes:xfer_bytes + chunk], __TIMEOUT)
@@ -391,24 +394,25 @@ def get_memory_layout(device):
intf = cfg[(0, 0)]
mem_layout_str = get_string(device, intf.iInterface)
mem_layout = mem_layout_str.split('/')
- addr = int(mem_layout[1], 0)
- segments = mem_layout[2].split(',')
- seg_re = re.compile(r'(\d+)\*(\d+)(.)(.)')
result = []
- for segment in segments:
- seg_match = seg_re.match(segment)
- num_pages = int(seg_match.groups()[0], 10)
- page_size = int(seg_match.groups()[1], 10)
- multiplier = seg_match.groups()[2]
- if multiplier == 'K':
- page_size *= 1024
- if multiplier == 'M':
- page_size *= 1024 * 1024
- size = num_pages * page_size
- last_addr = addr + size - 1
- result.append(named((addr, last_addr, size, num_pages, page_size),
- "addr last_addr size num_pages page_size"))
- addr += size
+ for mem_layout_index in range(1, len(mem_layout), 2):
+ addr = int(mem_layout[mem_layout_index], 0)
+ segments = mem_layout[mem_layout_index + 1].split(',')
+ seg_re = re.compile(r'(\d+)\*(\d+)(.)(.)')
+ for segment in segments:
+ seg_match = seg_re.match(segment)
+ num_pages = int(seg_match.groups()[0], 10)
+ page_size = int(seg_match.groups()[1], 10)
+ multiplier = seg_match.groups()[2]
+ if multiplier == 'K':
+ page_size *= 1024
+ if multiplier == 'M':
+ page_size *= 1024 * 1024
+ size = num_pages * page_size
+ last_addr = addr + size - 1
+ result.append(named((addr, last_addr, size, num_pages, page_size),
+ "addr last_addr size num_pages page_size"))
+ addr += size
return result
diff --git a/tools/tinytest-codegen.py b/tools/tinytest-codegen.py
index 0f9e62847..7f14db4ba 100755
--- a/tools/tinytest-codegen.py
+++ b/tools/tinytest-codegen.py
@@ -1,27 +1,30 @@
-#! /usr/bin/env python3
+#!/usr/bin/env python3
import os, sys
from glob import glob
from re import sub
+import argparse
+
def escape(s):
- lookup = {
- '\0': '\\0',
- '\t': '\\t',
- '\n': '\\n\"\n\"',
- '\r': '\\r',
- '\\': '\\\\',
- '\"': '\\\"',
- }
- return "\"\"\n\"{}\"".format(''.join([lookup[x] if x in lookup else x for x in s]))
+ s = s.decode()
+ lookup = {
+ '\0': '\\0',
+ '\t': '\\t',
+ '\n': '\\n\"\n\"',
+ '\r': '\\r',
+ '\\': '\\\\',
+ '\"': '\\\"',
+ }
+ return "\"\"\n\"{}\"".format(''.join([lookup[x] if x in lookup else x for x in s]))
def chew_filename(t):
- return { 'func': "test_{}_fn".format(sub(r'/|\.|-', '_', t)), 'desc': t.split('/')[1] }
+ return { 'func': "test_{}_fn".format(sub(r'/|\.|-', '_', t)), 'desc': t }
-def script_to_map(t):
- r = { 'name': chew_filename(t)['func'] }
- with open(t) as test:
- script = test.readlines()
+def script_to_map(test_file):
+ r = {"name": chew_filename(test_file)["func"]}
+ with open(t) as test:
+ script = test.readlines()
# Test for import skip_if and inject it into the test as needed.
if "import skip_if\n" in script:
@@ -37,12 +40,14 @@ def script_to_map(t):
script.insert(index + total_lines, "\t" + line)
total_lines += 1
r['script'] = escape(''.join(script))
- return r
+ return r
test_function = (
"void {name}(void* data) {{\n"
- " const char * pystr = {script};\n"
- " do_str(pystr);\n"
+ " static const char pystr[] = {script};\n"
+ " static const char exp[] = {output};\n"
+ " upytest_set_expected_output(exp, sizeof(exp) - 1);\n"
+ " upytest_execute_test(pystr);\n"
"}}"
)
@@ -57,30 +62,62 @@ testgroup_struct = (
"struct testgroup_t groups[] = {{\n{body}\n END_OF_GROUPS\n}};"
)
testgroup_member = (
- " {{ \"{name}/\", {name}_tests }},"
+ " {{ \"{name}\", {name}_tests }},"
)
## XXX: may be we could have `--without <groups>` argument...
# currently these tests are selected because they pass on qemu-arm
test_dirs = ('basics', 'micropython', 'float', 'extmod', 'inlineasm') # 'import', 'io', 'misc')
exclude_tests = (
- 'float/float2int_doubleprec_intbig.py', # requires double precision floating point to work
- 'inlineasm/asmfpaddsub.py', 'inlineasm/asmfpcmp.py', 'inlineasm/asmfpldrstr.py', 'inlineasm/asmfpmuldiv.py', 'inlineasm/asmfpsqrt.py',
- 'extmod/ticks_diff.py', 'extmod/time_ms_us.py', 'extmod/uheapq_timeq.py',
- 'extmod/vfs_fat_ramdisk.py', 'extmod/vfs_fat_fileio.py', 'extmod/vfs_fat_fsusermount.py', 'extmod/vfs_fat_oldproto.py',
+ # pattern matching in .exp
+ 'basics/bytes_compare3.py',
+ 'extmod/ticks_diff.py',
+ 'extmod/time_ms_us.py',
+ 'extmod/uheapq_timeq.py',
+ # unicode char issue
+ 'extmod/ujson_loads.py',
+ # doesn't output to python stdout
+ 'extmod/ure_debug.py',
+ 'extmod/vfs_basic.py',
+ 'extmod/vfs_fat_ramdisk.py', 'extmod/vfs_fat_fileio.py',
+ 'extmod/vfs_fat_fsusermount.py', 'extmod/vfs_fat_oldproto.py',
+ # rounding issues
+ 'float/float_divmod.py',
+ # requires double precision floating point to work
+ 'float/float2int_doubleprec_intbig.py',
+ 'float/float_parse_doubleprec.py',
+ # inline asm FP tests (require Cortex-M4)
+ 'inlineasm/asmfpaddsub.py', 'inlineasm/asmfpcmp.py', 'inlineasm/asmfpldrstr.py',
+ 'inlineasm/asmfpmuldiv.py','inlineasm/asmfpsqrt.py',
+ # different filename in output
+ 'micropython/emg_exc.py',
+ 'micropython/heapalloc_traceback.py',
+ # pattern matching in .exp
+ 'micropython/meminfo.py',
)
output = []
+tests = []
+
+argparser = argparse.ArgumentParser(description='Convert native MicroPython tests to tinytest/upytesthelper C code')
+argparser.add_argument('--stdin', action="store_true", help='read list of tests from stdin')
+args = argparser.parse_args()
+
+if not args.stdin:
+ for group in test_dirs:
+ tests += [test for test in glob('{}/*.py'.format(group)) if test not in exclude_tests]
+else:
+ for l in sys.stdin:
+ tests.append(l.rstrip())
-for group in test_dirs:
- tests = [test for test in glob('{}/*.py'.format(group)) if test not in exclude_tests]
- output.extend([test_function.format(**script_to_map(test)) for test in tests])
- testcase_members = [testcase_member.format(**chew_filename(test)) for test in tests]
- output.append(testcase_struct.format(name=group, body='\n'.join(testcase_members)))
+output.extend([test_function.format(**script_to_map(test)) for test in tests])
+testcase_members = [testcase_member.format(**chew_filename(test)) for test in tests]
+output.append(testcase_struct.format(name="", body='\n'.join(testcase_members)))
-testgroup_members = [testgroup_member.format(name=group) for group in test_dirs]
+testgroup_members = [testgroup_member.format(name=group) for group in [""]]
output.append(testgroup_struct.format(body='\n'.join(testgroup_members)))
## XXX: may be we could have `--output <filename>` argument...
-print('\n\n'.join(output))
+# Don't depend on what system locale is set, use utf8 encoding.
+sys.stdout.buffer.write('\n\n'.join(output).encode('utf8'))
diff --git a/tools/tinytest/README b/tools/tinytest/README
deleted file mode 100644
index 902c4a2e0..000000000
--- a/tools/tinytest/README
+++ /dev/null
@@ -1,18 +0,0 @@
-Tinytest is a tiny little test framework written in C by Nick Mathewson.
-
-It is distributed under the 3-clause BSD license. You can use it in
-your own programs so long as you follow the license's conditions.
-
-It's been tested on Windows, Mac, and many of the free Unixes.
-
-It knows how to fork before running certain tests, and it makes
-text-mode output in a format I like.
-
-For info on how to use it, check out tinytest_demo.c.
-
-You can get the latest version using Git, by pulling from
- git://github.com/nmathewson/tinytest.git
-
-Patches are welcome. Patches that turn this from tinytest to hugetest
-will not be applied. If you want a huge test framework, use CUnit.
-
diff --git a/tools/tinytest/tinytest.c b/tools/tinytest/tinytest.c
deleted file mode 100644
index 1ef957d31..000000000
--- a/tools/tinytest/tinytest.c
+++ /dev/null
@@ -1,474 +0,0 @@
-/* tinytest.c -- Copyright 2009-2012 Nick Mathewson
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-#ifdef TINYTEST_LOCAL
-#include "tinytest_local.h"
-#endif
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <assert.h>
-
-#ifndef NO_FORKING
-
-#ifdef _WIN32
-#include <windows.h>
-#else
-#include <sys/types.h>
-#include <sys/wait.h>
-#include <unistd.h>
-#endif
-
-#if defined(__APPLE__) && defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__)
-#if (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 1060 && \
- __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1070)
-/* Workaround for a stupid bug in OSX 10.6 */
-#define FORK_BREAKS_GCOV
-#include <vproc.h>
-#endif
-#endif
-
-#endif /* !NO_FORKING */
-
-#ifndef __GNUC__
-#define __attribute__(x)
-#endif
-
-#include "tinytest.h"
-#include "tinytest_macros.h"
-
-#define LONGEST_TEST_NAME 16384
-
-static int in_tinytest_main = 0; /**< true if we're in tinytest_main().*/
-static int n_ok = 0; /**< Number of tests that have passed */
-static int n_bad = 0; /**< Number of tests that have failed. */
-static int n_skipped = 0; /**< Number of tests that have been skipped. */
-
-static int opt_forked = 0; /**< True iff we're called from inside a win32 fork*/
-static int opt_nofork = 0; /**< Suppress calls to fork() for debugging. */
-static int opt_verbosity = 1; /**< -==quiet,0==terse,1==normal,2==verbose */
-const char *verbosity_flag = "";
-
-const struct testlist_alias_t *cfg_aliases=NULL;
-
-enum outcome { SKIP=2, OK=1, FAIL=0 };
-static enum outcome cur_test_outcome = 0;
-const char *cur_test_prefix = NULL; /**< prefix of the current test group */
-/** Name of the current test, if we haven't logged is yet. Used for --quiet */
-const char *cur_test_name = NULL;
-
-#ifdef _WIN32
-/* Copy of argv[0] for win32. */
-static char commandname[MAX_PATH+1];
-#endif
-
-static void usage(struct testgroup_t *groups, int list_groups)
- __attribute__((noreturn));
-static int process_test_option(struct testgroup_t *groups, const char *test);
-
-static enum outcome
-testcase_run_bare_(const struct testcase_t *testcase)
-{
- void *env = NULL;
- int outcome;
- if (testcase->setup) {
- env = testcase->setup->setup_fn(testcase);
- if (!env)
- return FAIL;
- else if (env == (void*)TT_SKIP)
- return SKIP;
- }
-
- cur_test_outcome = OK;
- testcase->fn(env);
- outcome = cur_test_outcome;
-
- if (testcase->setup) {
- if (testcase->setup->cleanup_fn(testcase, env) == 0)
- outcome = FAIL;
- }
-
- return outcome;
-}
-
-#define MAGIC_EXITCODE 42
-
-#ifndef NO_FORKING
-
-static enum outcome
-testcase_run_forked_(const struct testgroup_t *group,
- const struct testcase_t *testcase)
-{
-#ifdef _WIN32
- /* Fork? On Win32? How primitive! We'll do what the smart kids do:
- we'll invoke our own exe (whose name we recall from the command
- line) with a command line that tells it to run just the test we
- want, and this time without forking.
-
- (No, threads aren't an option. The whole point of forking is to
- share no state between tests.)
- */
- int ok;
- char buffer[LONGEST_TEST_NAME+256];
- STARTUPINFOA si;
- PROCESS_INFORMATION info;
- DWORD exitcode;
-
- if (!in_tinytest_main) {
- printf("\nERROR. On Windows, testcase_run_forked_ must be"
- " called from within tinytest_main.\n");
- abort();
- }
- if (opt_verbosity>0)
- printf("[forking] ");
-
- snprintf(buffer, sizeof(buffer), "%s --RUNNING-FORKED %s %s%s",
- commandname, verbosity_flag, group->prefix, testcase->name);
-
- memset(&si, 0, sizeof(si));
- memset(&info, 0, sizeof(info));
- si.cb = sizeof(si);
-
- ok = CreateProcessA(commandname, buffer, NULL, NULL, 0,
- 0, NULL, NULL, &si, &info);
- if (!ok) {
- printf("CreateProcess failed!\n");
- return 0;
- }
- WaitForSingleObject(info.hProcess, INFINITE);
- GetExitCodeProcess(info.hProcess, &exitcode);
- CloseHandle(info.hProcess);
- CloseHandle(info.hThread);
- if (exitcode == 0)
- return OK;
- else if (exitcode == MAGIC_EXITCODE)
- return SKIP;
- else
- return FAIL;
-#else
- int outcome_pipe[2];
- pid_t pid;
- (void)group;
-
- if (pipe(outcome_pipe))
- perror("opening pipe");
-
- if (opt_verbosity>0)
- printf("[forking] ");
- pid = fork();
-#ifdef FORK_BREAKS_GCOV
- vproc_transaction_begin(0);
-#endif
- if (!pid) {
- /* child. */
- int test_r, write_r;
- char b[1];
- close(outcome_pipe[0]);
- test_r = testcase_run_bare_(testcase);
- assert(0<=(int)test_r && (int)test_r<=2);
- b[0] = "NYS"[test_r];
- write_r = (int)write(outcome_pipe[1], b, 1);
- if (write_r != 1) {
- perror("write outcome to pipe");
- exit(1);
- }
- exit(0);
- return FAIL; /* unreachable */
- } else {
- /* parent */
- int status, r;
- char b[1];
- /* Close this now, so that if the other side closes it,
- * our read fails. */
- close(outcome_pipe[1]);
- r = (int)read(outcome_pipe[0], b, 1);
- if (r == 0) {
- printf("[Lost connection!] ");
- return 0;
- } else if (r != 1) {
- perror("read outcome from pipe");
- }
- waitpid(pid, &status, 0);
- close(outcome_pipe[0]);
- return b[0]=='Y' ? OK : (b[0]=='S' ? SKIP : FAIL);
- }
-#endif
-}
-
-#endif /* !NO_FORKING */
-
-int
-testcase_run_one(const struct testgroup_t *group,
- const struct testcase_t *testcase)
-{
- enum outcome outcome;
-
- if (testcase->flags & (TT_SKIP|TT_OFF_BY_DEFAULT)) {
- if (opt_verbosity>0)
- printf("%s%s: %s\n",
- group->prefix, testcase->name,
- (testcase->flags & TT_SKIP) ? "SKIPPED" : "DISABLED");
- ++n_skipped;
- return SKIP;
- }
-
- if (opt_verbosity>0 && !opt_forked) {
- printf("%s%s: ", group->prefix, testcase->name);
- } else {
- if (opt_verbosity==0) printf(".");
- cur_test_prefix = group->prefix;
- cur_test_name = testcase->name;
- }
-
-#ifndef NO_FORKING
- if ((testcase->flags & TT_FORK) && !(opt_forked||opt_nofork)) {
- outcome = testcase_run_forked_(group, testcase);
- } else {
-#else
- {
-#endif
- outcome = testcase_run_bare_(testcase);
- }
-
- if (outcome == OK) {
- ++n_ok;
- if (opt_verbosity>0 && !opt_forked)
- puts(opt_verbosity==1?"OK":"");
- } else if (outcome == SKIP) {
- ++n_skipped;
- if (opt_verbosity>0 && !opt_forked)
- puts("SKIPPED");
- } else {
- ++n_bad;
- if (!opt_forked)
- printf("\n [%s FAILED]\n", testcase->name);
- }
-
- if (opt_forked) {
- exit(outcome==OK ? 0 : (outcome==SKIP?MAGIC_EXITCODE : 1));
- return 1; /* unreachable */
- } else {
- return (int)outcome;
- }
-}
-
-int
-tinytest_set_flag_(struct testgroup_t *groups, const char *arg, int set, unsigned long flag)
-{
- int i, j;
- size_t length = LONGEST_TEST_NAME;
- char fullname[LONGEST_TEST_NAME];
- int found=0;
- if (strstr(arg, ".."))
- length = strstr(arg,"..")-arg;
- for (i=0; groups[i].prefix; ++i) {
- for (j=0; groups[i].cases[j].name; ++j) {
- struct testcase_t *testcase = &groups[i].cases[j];
- snprintf(fullname, sizeof(fullname), "%s%s",
- groups[i].prefix, testcase->name);
- if (!flag) { /* Hack! */
- printf(" %s", fullname);
- if (testcase->flags & TT_OFF_BY_DEFAULT)
- puts(" (Off by default)");
- else if (testcase->flags & TT_SKIP)
- puts(" (DISABLED)");
- else
- puts("");
- }
- if (!strncmp(fullname, arg, length)) {
- if (set)
- testcase->flags |= flag;
- else
- testcase->flags &= ~flag;
- ++found;
- }
- }
- }
- return found;
-}
-
-static void
-usage(struct testgroup_t *groups, int list_groups)
-{
- puts("Options are: [--verbose|--quiet|--terse] [--no-fork]");
- puts(" Specify tests by name, or using a prefix ending with '..'");
- puts(" To skip a test, prefix its name with a colon.");
- puts(" To enable a disabled test, prefix its name with a plus.");
- puts(" Use --list-tests for a list of tests.");
- if (list_groups) {
- puts("Known tests are:");
- tinytest_set_flag_(groups, "..", 1, 0);
- }
- exit(0);
-}
-
-static int
-process_test_alias(struct testgroup_t *groups, const char *test)
-{
- int i, j, n, r;
- for (i=0; cfg_aliases && cfg_aliases[i].name; ++i) {
- if (!strcmp(cfg_aliases[i].name, test)) {
- n = 0;
- for (j = 0; cfg_aliases[i].tests[j]; ++j) {
- r = process_test_option(groups, cfg_aliases[i].tests[j]);
- if (r<0)
- return -1;
- n += r;
- }
- return n;
- }
- }
- printf("No such test alias as @%s!",test);
- return -1;
-}
-
-static int
-process_test_option(struct testgroup_t *groups, const char *test)
-{
- int flag = TT_ENABLED_;
- int n = 0;
- if (test[0] == '@') {
- return process_test_alias(groups, test + 1);
- } else if (test[0] == ':') {
- ++test;
- flag = TT_SKIP;
- } else if (test[0] == '+') {
- ++test;
- ++n;
- if (!tinytest_set_flag_(groups, test, 0, TT_OFF_BY_DEFAULT)) {
- printf("No such test as %s!\n", test);
- return -1;
- }
- } else {
- ++n;
- }
- if (!tinytest_set_flag_(groups, test, 1, flag)) {
- printf("No such test as %s!\n", test);
- return -1;
- }
- return n;
-}
-
-void
-tinytest_set_aliases(const struct testlist_alias_t *aliases)
-{
- cfg_aliases = aliases;
-}
-
-int
-tinytest_main(int c, const char **v, struct testgroup_t *groups)
-{
- int i, j, n=0;
-
-#ifdef _WIN32
- const char *sp = strrchr(v[0], '.');
- const char *extension = "";
- if (!sp || stricmp(sp, ".exe"))
- extension = ".exe"; /* Add an exe so CreateProcess will work */
- snprintf(commandname, sizeof(commandname), "%s%s", v[0], extension);
- commandname[MAX_PATH]='\0';
-#endif
- for (i=1; i<c; ++i) {
- if (v[i][0] == '-') {
- if (!strcmp(v[i], "--RUNNING-FORKED")) {
- opt_forked = 1;
- } else if (!strcmp(v[i], "--no-fork")) {
- opt_nofork = 1;
- } else if (!strcmp(v[i], "--quiet")) {
- opt_verbosity = -1;
- verbosity_flag = "--quiet";
- } else if (!strcmp(v[i], "--verbose")) {
- opt_verbosity = 2;
- verbosity_flag = "--verbose";
- } else if (!strcmp(v[i], "--terse")) {
- opt_verbosity = 0;
- verbosity_flag = "--terse";
- } else if (!strcmp(v[i], "--help")) {
- usage(groups, 0);
- } else if (!strcmp(v[i], "--list-tests")) {
- usage(groups, 1);
- } else {
- printf("Unknown option %s. Try --help\n",v[i]);
- return -1;
- }
- } else {
- int r = process_test_option(groups, v[i]);
- if (r<0)
- return -1;
- n += r;
- }
- }
- if (!n)
- tinytest_set_flag_(groups, "..", 1, TT_ENABLED_);
-
-#ifdef _IONBF
- setvbuf(stdout, NULL, _IONBF, 0);
-#endif
-
- ++in_tinytest_main;
- for (i=0; groups[i].prefix; ++i)
- for (j=0; groups[i].cases[j].name; ++j)
- if (groups[i].cases[j].flags & TT_ENABLED_)
- testcase_run_one(&groups[i],
- &groups[i].cases[j]);
-
- --in_tinytest_main;
-
- if (opt_verbosity==0)
- puts("");
-
- if (n_bad)
- printf("%d/%d TESTS FAILED. (%d skipped)\n", n_bad,
- n_bad+n_ok,n_skipped);
- else if (opt_verbosity >= 1)
- printf("%d tests ok. (%d skipped)\n", n_ok, n_skipped);
-
- return (n_bad == 0) ? 0 : 1;
-}
-
-int
-tinytest_get_verbosity_(void)
-{
- return opt_verbosity;
-}
-
-void
-tinytest_set_test_failed_(void)
-{
- if (opt_verbosity <= 0 && cur_test_name) {
- if (opt_verbosity==0) puts("");
- printf("%s%s: ", cur_test_prefix, cur_test_name);
- cur_test_name = NULL;
- }
- cur_test_outcome = 0;
-}
-
-void
-tinytest_set_test_skipped_(void)
-{
- if (cur_test_outcome==OK)
- cur_test_outcome = SKIP;
-}
-
diff --git a/tools/tinytest/tinytest.h b/tools/tinytest/tinytest.h
deleted file mode 100644
index dff440e31..000000000
--- a/tools/tinytest/tinytest.h
+++ /dev/null
@@ -1,98 +0,0 @@
-/* tinytest.h -- Copyright 2009-2012 Nick Mathewson
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef TINYTEST_H_INCLUDED_
-#define TINYTEST_H_INCLUDED_
-
-/** Flag for a test that needs to run in a subprocess. */
-#define TT_FORK (1<<0)
-/** Runtime flag for a test we've decided to skip. */
-#define TT_SKIP (1<<1)
-/** Internal runtime flag for a test we've decided to run. */
-#define TT_ENABLED_ (1<<2)
-/** Flag for a test that's off by default. */
-#define TT_OFF_BY_DEFAULT (1<<3)
-/** If you add your own flags, make them start at this point. */
-#define TT_FIRST_USER_FLAG (1<<4)
-
-typedef void (*testcase_fn)(void *);
-
-struct testcase_t;
-
-/** Functions to initialize/teardown a structure for a testcase. */
-struct testcase_setup_t {
- /** Return a new structure for use by a given testcase. */
- void *(*setup_fn)(const struct testcase_t *);
- /** Clean/free a structure from setup_fn. Return 1 if ok, 0 on err. */
- int (*cleanup_fn)(const struct testcase_t *, void *);
-};
-
-/** A single test-case that you can run. */
-struct testcase_t {
- const char *name; /**< An identifier for this case. */
- testcase_fn fn; /**< The function to run to implement this case. */
- unsigned long flags; /**< Bitfield of TT_* flags. */
- const struct testcase_setup_t *setup; /**< Optional setup/cleanup fns*/
- void *setup_data; /**< Extra data usable by setup function */
-};
-#define END_OF_TESTCASES { NULL, NULL, 0, NULL, NULL }
-
-/** A group of tests that are selectable together. */
-struct testgroup_t {
- const char *prefix; /**< Prefix to prepend to testnames. */
- struct testcase_t *cases; /** Array, ending with END_OF_TESTCASES */
-};
-#define END_OF_GROUPS { NULL, NULL}
-
-struct testlist_alias_t {
- const char *name;
- const char **tests;
-};
-#define END_OF_ALIASES { NULL, NULL }
-
-/** Implementation: called from a test to indicate failure, before logging. */
-void tinytest_set_test_failed_(void);
-/** Implementation: called from a test to indicate that we're skipping. */
-void tinytest_set_test_skipped_(void);
-/** Implementation: return 0 for quiet, 1 for normal, 2 for loud. */
-int tinytest_get_verbosity_(void);
-/** Implementation: Set a flag on tests matching a name; returns number
- * of tests that matched. */
-int tinytest_set_flag_(struct testgroup_t *, const char *, int set, unsigned long);
-
-/** Set all tests in 'groups' matching the name 'named' to be skipped. */
-#define tinytest_skip(groups, named) \
- tinytest_set_flag_(groups, named, 1, TT_SKIP)
-
-/** Run a single testcase in a single group. */
-int testcase_run_one(const struct testgroup_t *,const struct testcase_t *);
-
-void tinytest_set_aliases(const struct testlist_alias_t *aliases);
-
-/** Run a set of testcases from an END_OF_GROUPS-terminated array of groups,
- as selected from the command line. */
-int tinytest_main(int argc, const char **argv, struct testgroup_t *groups);
-
-#endif
diff --git a/tools/tinytest/tinytest_macros.h b/tools/tinytest/tinytest_macros.h
deleted file mode 100644
index 9ff69b1d5..000000000
--- a/tools/tinytest/tinytest_macros.h
+++ /dev/null
@@ -1,184 +0,0 @@
-/* tinytest_macros.h -- Copyright 2009-2012 Nick Mathewson
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef TINYTEST_MACROS_H_INCLUDED_
-#define TINYTEST_MACROS_H_INCLUDED_
-
-/* Helpers for defining statement-like macros */
-#define TT_STMT_BEGIN do {
-#define TT_STMT_END } while (0)
-
-/* Redefine this if your test functions want to abort with something besides
- * "goto end;" */
-#ifndef TT_EXIT_TEST_FUNCTION
-#define TT_EXIT_TEST_FUNCTION TT_STMT_BEGIN goto end; TT_STMT_END
-#endif
-
-/* Redefine this if you want to note success/failure in some different way. */
-#ifndef TT_DECLARE
-#define TT_DECLARE(prefix, args) \
- TT_STMT_BEGIN \
- printf("\n %s %s:%d: ",prefix,__FILE__,__LINE__); \
- printf args ; \
- TT_STMT_END
-#endif
-
-/* Announce a failure. Args are parenthesized printf args. */
-#define TT_GRIPE(args) TT_DECLARE("FAIL", args)
-
-/* Announce a non-failure if we're verbose. */
-#define TT_BLATHER(args) \
- TT_STMT_BEGIN \
- if (tinytest_get_verbosity_()>1) TT_DECLARE(" OK", args); \
- TT_STMT_END
-
-#define TT_DIE(args) \
- TT_STMT_BEGIN \
- tinytest_set_test_failed_(); \
- TT_GRIPE(args); \
- TT_EXIT_TEST_FUNCTION; \
- TT_STMT_END
-
-#define TT_FAIL(args) \
- TT_STMT_BEGIN \
- tinytest_set_test_failed_(); \
- TT_GRIPE(args); \
- TT_STMT_END
-
-/* Fail and abort the current test for the reason in msg */
-#define tt_abort_printf(msg) TT_DIE(msg)
-#define tt_abort_perror(op) TT_DIE(("%s: %s [%d]",(op),strerror(errno), errno))
-#define tt_abort_msg(msg) TT_DIE(("%s", msg))
-#define tt_abort() TT_DIE(("%s", "(Failed.)"))
-
-/* Fail but do not abort the current test for the reason in msg. */
-#define tt_failprint_f(msg) TT_FAIL(msg)
-#define tt_fail_perror(op) TT_FAIL(("%s: %s [%d]",(op),strerror(errno), errno))
-#define tt_fail_msg(msg) TT_FAIL(("%s", msg))
-#define tt_fail() TT_FAIL(("%s", "(Failed.)"))
-
-/* End the current test, and indicate we are skipping it. */
-#define tt_skip() \
- TT_STMT_BEGIN \
- tinytest_set_test_skipped_(); \
- TT_EXIT_TEST_FUNCTION; \
- TT_STMT_END
-
-#define tt_want_(b, msg, fail) \
- TT_STMT_BEGIN \
- if (!(b)) { \
- tinytest_set_test_failed_(); \
- TT_GRIPE(("%s",msg)); \
- fail; \
- } else { \
- TT_BLATHER(("%s",msg)); \
- } \
- TT_STMT_END
-
-/* Assert b, but do not stop the test if b fails. Log msg on failure. */
-#define tt_want_msg(b, msg) \
- tt_want_(b, msg, );
-
-/* Assert b and stop the test if b fails. Log msg on failure. */
-#define tt_assert_msg(b, msg) \
- tt_want_(b, msg, TT_EXIT_TEST_FUNCTION);
-
-/* Assert b, but do not stop the test if b fails. */
-#define tt_want(b) tt_want_msg( (b), "want("#b")")
-/* Assert b, and stop the test if b fails. */
-#define tt_assert(b) tt_assert_msg((b), "assert("#b")")
-
-#define tt_assert_test_fmt_type(a,b,str_test,type,test,printf_type,printf_fmt, \
- setup_block,cleanup_block,die_on_fail) \
- TT_STMT_BEGIN \
- type val1_ = (type)(a); \
- type val2_ = (type)(b); \
- int tt_status_ = (test); \
- if (!tt_status_ || tinytest_get_verbosity_()>1) { \
- printf_type print_; \
- printf_type print1_; \
- printf_type print2_; \
- type value_ = val1_; \
- setup_block; \
- print1_ = print_; \
- value_ = val2_; \
- setup_block; \
- print2_ = print_; \
- TT_DECLARE(tt_status_?" OK":"FAIL", \
- ("assert(%s): "printf_fmt" vs "printf_fmt, \
- str_test, print1_, print2_)); \
- print_ = print1_; \
- cleanup_block; \
- print_ = print2_; \
- cleanup_block; \
- if (!tt_status_) { \
- tinytest_set_test_failed_(); \
- die_on_fail ; \
- } \
- } \
- TT_STMT_END
-
-#define tt_assert_test_type(a,b,str_test,type,test,fmt,die_on_fail) \
- tt_assert_test_fmt_type(a,b,str_test,type,test,type,fmt, \
- {print_=value_;},{},die_on_fail)
-
-/* Helper: assert that a op b, when cast to type. Format the values with
- * printf format fmt on failure. */
-#define tt_assert_op_type(a,op,b,type,fmt) \
- tt_assert_test_type(a,b,#a" "#op" "#b,type,(val1_ op val2_),fmt, \
- TT_EXIT_TEST_FUNCTION)
-
-#define tt_int_op(a,op,b) \
- tt_assert_test_type(a,b,#a" "#op" "#b,long,(val1_ op val2_), \
- "%ld",TT_EXIT_TEST_FUNCTION)
-
-#define tt_uint_op(a,op,b) \
- tt_assert_test_type(a,b,#a" "#op" "#b,unsigned long, \
- (val1_ op val2_),"%lu",TT_EXIT_TEST_FUNCTION)
-
-#define tt_ptr_op(a,op,b) \
- tt_assert_test_type(a,b,#a" "#op" "#b,void*, \
- (val1_ op val2_),"%p",TT_EXIT_TEST_FUNCTION)
-
-#define tt_str_op(a,op,b) \
- tt_assert_test_type(a,b,#a" "#op" "#b,const char *, \
- (strcmp(val1_,val2_) op 0),"<%s>",TT_EXIT_TEST_FUNCTION)
-
-#define tt_want_int_op(a,op,b) \
- tt_assert_test_type(a,b,#a" "#op" "#b,long,(val1_ op val2_),"%ld",(void)0)
-
-#define tt_want_uint_op(a,op,b) \
- tt_assert_test_type(a,b,#a" "#op" "#b,unsigned long, \
- (val1_ op val2_),"%lu",(void)0)
-
-#define tt_want_ptr_op(a,op,b) \
- tt_assert_test_type(a,b,#a" "#op" "#b,void*, \
- (val1_ op val2_),"%p",(void)0)
-
-#define tt_want_str_op(a,op,b) \
- tt_assert_test_type(a,b,#a" "#op" "#b,const char *, \
- (strcmp(val1_,val2_) op 0),"<%s>",(void)0)
-
-#endif
diff --git a/tools/upip.py b/tools/upip.py
index 411da49e8..a400c3174 100644
--- a/tools/upip.py
+++ b/tools/upip.py
@@ -1,3 +1,10 @@
+#
+# upip - Package manager for MicroPython
+#
+# Copyright (c) 2015-2018 Paul Sokolovsky
+#
+# Licensed under the MIT license.
+#
import sys
import gc
import uos as os
@@ -110,16 +117,16 @@ def url_open(url):
proto, _, host, urlpath = url.split('/', 3)
try:
- ai = usocket.getaddrinfo(host, 443)
+ ai = usocket.getaddrinfo(host, 443, 0, usocket.SOCK_STREAM)
except OSError as e:
fatal("Unable to resolve %s (no Internet?)" % host, e)
#print("Address infos:", ai)
- addr = ai[0][4]
+ ai = ai[0]
- s = usocket.socket(ai[0][0])
+ s = usocket.socket(ai[0], ai[1], ai[2])
try:
#print("Connect address:", addr)
- s.connect(addr)
+ s.connect(ai[-1])
if proto == "https:":
s = ussl.wrap_socket(s, server_hostname=host)
@@ -149,7 +156,7 @@ def url_open(url):
def get_pkg_metadata(name):
- f = url_open("https://pypi.python.org/pypi/%s/json" % name)
+ f = url_open("https://pypi.org/pypi/%s/json" % name)
try:
return json.load(f)
finally: