rust/test-cargo-miri/run-test.py

102 lines
3.2 KiB
Python
Raw Normal View History

2018-10-30 09:07:40 -05:00
#!/usr/bin/env python3
2018-10-30 05:26:53 -05:00
'''
Test whether cargo-miri works properly.
Assumes the `MIRI_SYSROOT` env var to be set appropriately,
and the working directory to contain the cargo-miri-test project.
'''
import sys, subprocess, os
2018-10-30 05:26:53 -05:00
CGREEN = '\33[32m'
CBOLD = '\33[1m'
CEND = '\33[0m'
def fail(msg):
2019-06-29 06:33:47 -05:00
print("\nTEST FAIL: {}".format(msg))
sys.exit(1)
def cargo_miri(cmd):
args = ["cargo", "miri", cmd, "-q"]
if 'MIRI_TEST_TARGET' in os.environ:
args += ["--target", os.environ['MIRI_TEST_TARGET']]
return args
2020-09-09 02:18:10 -05:00
def test(name, cmd, stdout_ref, stderr_ref, stdin=b'', env={}):
print("==> Testing `{}` <==".format(name))
2018-10-30 05:26:53 -05:00
## Call `cargo miri`, capture all output
p_env = os.environ.copy()
p_env.update(env)
2018-10-30 05:26:53 -05:00
p = subprocess.Popen(
cmd,
2020-09-09 02:18:10 -05:00
stdin=subprocess.PIPE,
2018-10-30 05:26:53 -05:00
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
env=p_env,
2018-10-30 05:26:53 -05:00
)
2020-09-09 02:18:10 -05:00
(stdout, stderr) = p.communicate(input=stdin)
2018-10-30 05:26:53 -05:00
stdout = stdout.decode("UTF-8")
stderr = stderr.decode("UTF-8")
# Show output
print("=> captured stdout <=")
print(stdout, end="")
print("=> captured stderr <=")
print(stderr, end="")
# Test for failures
if p.returncode != 0:
fail("Non-zero exit status")
if stdout != open(stdout_ref).read():
fail("stdout does not match reference")
if stderr != open(stderr_ref).read():
fail("stderr does not match reference")
2018-10-30 05:26:53 -05:00
def test_cargo_miri_run():
test("cargo miri run",
cargo_miri("run"),
2020-09-09 02:18:10 -05:00
"stdout.ref", "stderr.ref",
stdin=b'12\n21\n',
env={'MIRIFLAGS': "-Zmiri-disable-isolation"},
)
2020-09-09 02:18:10 -05:00
test("cargo miri run (with arguments and target)",
cargo_miri("run") + ["--bin", "cargo-miri-test", "--", "hello world", '"hello world"'],
"stdout.ref2", "stderr.ref2"
)
2018-10-30 05:26:53 -05:00
def test_cargo_miri_test():
test("cargo miri test",
cargo_miri("test"),
"test.stdout.ref", "test.stderr.ref",
env={'MIRIFLAGS': "-Zmiri-seed=feed"},
)
test("cargo miri test (with filter)",
cargo_miri("test") + ["--", "--format=pretty", "le1"],
"test.stdout.ref2", "test.stderr.ref"
)
2019-08-29 04:09:34 -05:00
test("cargo miri test (without isolation)",
cargo_miri("test") + ["--", "--format=pretty", "num_cpus"],
"test.stdout.ref3", "test.stderr.ref",
env={'MIRIFLAGS': "-Zmiri-disable-isolation"},
2019-08-29 04:09:34 -05:00
)
2020-08-28 23:12:11 -05:00
test("cargo miri test (test target)",
cargo_miri("test") + ["--test", "test", "--", "--format=pretty"],
2020-08-28 23:12:11 -05:00
"test.stdout.ref4", "test.stderr.ref"
)
test("cargo miri test (bin target)",
cargo_miri("test") + ["--bin", "cargo-miri-test", "--", "--format=pretty"],
2020-08-28 23:12:11 -05:00
"test.stdout.ref5", "test.stderr.ref"
)
2018-10-30 05:26:53 -05:00
os.chdir(os.path.dirname(os.path.realpath(__file__)))
target_str = " for target {}".format(os.environ['MIRI_TEST_TARGET']) if 'MIRI_TEST_TARGET' in os.environ else ""
print(CGREEN + CBOLD + "## Running `cargo miri` tests{}".format(target_str) + CEND)
if not 'MIRI_SYSROOT' in os.environ:
# Make sure we got a working sysroot.
# (If the sysroot gets built later when output is compared, that leads to test failures.)
subprocess.run(cargo_miri("setup"), check=True)
test_cargo_miri_run()
2018-10-30 05:26:53 -05:00
test_cargo_miri_test()
2019-06-29 06:33:47 -05:00
print("\nTEST SUCCESSFUL!")
2018-10-30 05:26:53 -05:00
sys.exit(0)