| import os |
| |
| import infra.basetest |
| |
| |
| class TestMicroPython(infra.basetest.BRTest): |
| config = infra.basetest.BASIC_TOOLCHAIN_CONFIG + \ |
| f""" |
| BR2_PACKAGE_MICROPYTHON=y |
| BR2_PACKAGE_MICROPYTHON_LIB=y |
| BR2_ROOTFS_OVERLAY="{infra.filepath("tests/package/test_micropython/rootfs-overlay")}" |
| BR2_TARGET_ROOTFS_CPIO=y |
| # BR2_TARGET_ROOTFS_TAR is not set |
| """ |
| |
| def run_upy_code(self, python_code, opts=""): |
| cmd = f'micropython {opts} -c "{python_code}"' |
| output, ret = self.emulator.run(cmd) |
| self.assertEqual(ret, 0, f"could not run '{cmd}', returned {ret}: '{output}'") |
| return output |
| |
| def test_run(self): |
| cpio_file = os.path.join(self.builddir, "images", "rootfs.cpio") |
| self.emulator.boot(arch="armv5", |
| kernel="builtin", |
| options=["-initrd", cpio_file]) |
| self.emulator.login() |
| |
| # The micropython binary can execute. |
| self.assertRunOk("micropython -h") |
| |
| # Query interpreter version and implementation. |
| py_code = "import sys ; " |
| py_code += "print('Version:', sys.version) ; " |
| py_code += "print('Implementation:', sys.implementation)" |
| self.run_upy_code(py_code) |
| |
| # Check implementation is 'micropython'. |
| py_code = "import sys ; print(sys.implementation.name)" |
| output = self.run_upy_code(py_code) |
| self.assertEqual(output[0], "micropython") |
| |
| # Check micropython optimization are correctly reported. |
| py_code = "import micropython ; print(micropython.opt_level())" |
| for opt_level in range(4): |
| output = self.run_upy_code(py_code, f"-O{opt_level}") |
| self.assertEqual( |
| int(output[0]), |
| opt_level, |
| f"Running '{py_code}' at -O{opt_level} returned '{output}'" |
| ) |
| |
| # Check micropython can return a non-zero exit code. |
| expected_code = 123 |
| py_code = "import sys ; " |
| py_code += f"sys.exit({expected_code})" |
| cmd = f'micropython -c "{py_code}"' |
| _, exit_code = self.emulator.run(cmd) |
| self.assertEqual(exit_code, expected_code) |
| |
| # Check micropython computes correctly. |
| input_value = 1234 |
| expected_output = str(sum(range(input_value))) |
| py_code = f"print(sum(range(({input_value}))))" |
| output = self.run_upy_code(py_code) |
| self.assertEqual(output[0], expected_output) |
| |
| # Check a small script can execute. |
| self.assertRunOk("/root/mandel.py", timeout=10) |
| |
| # Check we can use a micropython-lib module. |
| msg = "Hello Buildroot!" |
| filename = "file.txt" |
| gz_filename = f"{filename}.gz" |
| self.assertRunOk(f"echo '{msg}' > {filename}") |
| self.assertRunOk(f"gzip {filename}") |
| out, ret = self.emulator.run(f"/root/zcat.py {gz_filename}") |
| self.assertEqual(ret, 0) |
| self.assertEqual(out[0], msg) |