3 Test whether cargo-miri works properly.
4 Assumes the `MIRI_SYSROOT` env var to be set appropriately,
5 and the working directory to contain the cargo-miri-test project.
8 import sys, subprocess, os
15 print("\nTEST FAIL: {}".format(msg))
18 def cargo_miri(cmd, quiet = True):
19 args = ["cargo", "miri", cmd]
22 if 'MIRI_TEST_TARGET' in os.environ:
23 args += ["--target", os.environ['MIRI_TEST_TARGET']]
26 def test(name, cmd, stdout_ref, stderr_ref, stdin=b'', env={}):
27 print("Testing {}...".format(name))
28 ## Call `cargo miri`, capture all output
29 p_env = os.environ.copy()
33 stdin=subprocess.PIPE,
34 stdout=subprocess.PIPE,
35 stderr=subprocess.PIPE,
38 (stdout, stderr) = p.communicate(input=stdin)
39 stdout = stdout.decode("UTF-8")
40 stderr = stderr.decode("UTF-8")
41 if p.returncode == 0 and stdout == open(stdout_ref).read() and stderr == open(stderr_ref).read():
45 print("--- BEGIN stdout ---")
47 print("--- END stdout ---")
48 print("--- BEGIN stderr ---")
50 print("--- END stderr ---")
51 fail("exit code was {}".format(p.returncode))
53 def test_rebuild(name, cmd, rebuild_count_expected):
54 print("Testing {}...".format(name))
57 stdout=subprocess.PIPE,
58 stderr=subprocess.PIPE,
60 (stdout, stderr) = p.communicate()
61 stdout = stdout.decode("UTF-8")
62 stderr = stderr.decode("UTF-8")
64 fail("rebuild failed");
65 rebuild_count = stderr.count(" Compiling ");
66 if rebuild_count != rebuild_count_expected:
67 print("--- BEGIN stderr ---")
69 print("--- END stderr ---")
70 fail("Expected {} rebuild(s), but got {}".format(rebuild_count_expected, rebuild_count));
72 def test_cargo_miri_run():
73 test("`cargo miri run` (no isolation)",
75 "run.default.stdout.ref", "run.default.stderr.ref",
78 'MIRIFLAGS': "-Zmiri-disable-isolation",
79 'MIRITESTVAR': "wrongval", # make sure the build.rs value takes precedence
82 test("`cargo miri run` (with arguments and target)",
83 cargo_miri("run") + ["--bin", "cargo-miri-test", "--", "hello world", '"hello world"'],
84 "run.args.stdout.ref", "run.args.stderr.ref",
86 test("`cargo miri run` (subcrate, no ioslation)",
87 cargo_miri("run") + ["-p", "subcrate"],
88 "run.subcrate.stdout.ref", "run.subcrate.stderr.ref",
89 env={'MIRIFLAGS': "-Zmiri-disable-isolation"},
91 # Special test: run it again *without* `-q` to make sure nothing is being rebuilt (Miri issue #1722)
92 test_rebuild("`cargo miri run` (clean rebuild)",
93 cargo_miri("run", quiet=False) + ["--", ""],
94 rebuild_count_expected=1,
97 def test_cargo_miri_test():
98 # rustdoc is not run on foreign targets
99 is_foreign = 'MIRI_TEST_TARGET' in os.environ
100 rustdoc_ref = "test.stderr-empty.ref" if is_foreign else "test.stderr-rustdoc.ref"
102 test("`cargo miri test`",
104 "test.default.stdout.ref", rustdoc_ref,
105 env={'MIRIFLAGS': "-Zmiri-seed=feed"},
107 test("`cargo miri test` (no isolation)",
109 "test.default.stdout.ref", rustdoc_ref,
110 env={'MIRIFLAGS': "-Zmiri-disable-isolation"},
112 test("`cargo miri test` (raw-ptr tracking)",
114 "test.default.stdout.ref", rustdoc_ref,
115 env={'MIRIFLAGS': "-Zmiri-track-raw-pointers"},
117 test("`cargo miri test` (with filter)",
118 cargo_miri("test") + ["--", "--format=pretty", "le1"],
119 "test.filter.stdout.ref", rustdoc_ref,
121 test("`cargo miri test` (test target)",
122 cargo_miri("test") + ["--test", "test", "--", "--format=pretty"],
123 "test.test-target.stdout.ref", "test.stderr-empty.ref",
125 test("`cargo miri test` (bin target)",
126 cargo_miri("test") + ["--bin", "cargo-miri-test", "--", "--format=pretty"],
127 "test.bin-target.stdout.ref", "test.stderr-empty.ref",
129 test("`cargo miri test` (subcrate, no isolation)",
130 cargo_miri("test") + ["-p", "subcrate"],
131 "test.subcrate.stdout.ref", "test.stderr-proc-macro.ref",
132 env={'MIRIFLAGS': "-Zmiri-disable-isolation"},
135 os.chdir(os.path.dirname(os.path.realpath(__file__)))
136 os.environ["RUST_TEST_NOCAPTURE"] = "0" # this affects test output, so make sure it is not set
138 target_str = " for target {}".format(os.environ['MIRI_TEST_TARGET']) if 'MIRI_TEST_TARGET' in os.environ else ""
139 print(CGREEN + CBOLD + "## Running `cargo miri` tests{}".format(target_str) + CEND)
141 if not 'MIRI_SYSROOT' in os.environ:
142 # Make sure we got a working sysroot.
143 # (If the sysroot gets built later when output is compared, that leads to test failures.)
144 subprocess.run(cargo_miri("setup"), check=True)
145 test_cargo_miri_run()
146 test_cargo_miri_test()
148 print("\nTEST SUCCESSFUL!")