print("\nTEST FAIL: {}".format(msg))
sys.exit(1)
-def cargo_miri(cmd):
- args = ["cargo", "miri", cmd, "-q"]
+def cargo_miri(cmd, quiet = True):
+ args = ["cargo", "miri", cmd]
+ if quiet:
+ args += ["-q"]
if 'MIRI_TEST_TARGET' in os.environ:
args += ["--target", os.environ['MIRI_TEST_TARGET']]
return args
print("--- END stderr ---")
fail("exit code was {}".format(p.returncode))
+def test_no_rebuild(name, cmd, env={}):
+ print("Testing {}...".format(name))
+ p_env = os.environ.copy()
+ p_env.update(env)
+ p = subprocess.Popen(
+ cmd,
+ stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE,
+ env=p_env,
+ )
+ (stdout, stderr) = p.communicate()
+ stdout = stdout.decode("UTF-8")
+ stderr = stderr.decode("UTF-8")
+ if p.returncode != 0:
+ fail("rebuild failed");
+ # Also check for 'Running' as a sanity check.
+ if stderr.count(" Compiling ") > 0 or stderr.count(" Running ") == 0:
+ print("--- BEGIN stderr ---")
+ print(stderr, end="")
+ print("--- END stderr ---")
+ fail("Something was being rebuilt when it should not be (or we got no output)");
+
def test_cargo_miri_run():
test("`cargo miri run` (no isolation)",
cargo_miri("run"),
- "stdout.ref1", "stderr.ref1",
+ "run.default.stdout.ref", "run.default.stderr.ref",
stdin=b'12\n21\n',
env={
'MIRIFLAGS': "-Zmiri-disable-isolation",
'MIRITESTVAR': "wrongval", # make sure the build.rs value takes precedence
},
)
+ # Special test: run it again *without* `-q` to make sure nothing is being rebuilt (Miri issue #1722)
+ test_no_rebuild("`cargo miri run` (no rebuild)",
+ cargo_miri("run", quiet=False) + ["--", ""],
+ env={'MIRITESTVAR': "wrongval"}, # changing the env var causes a rebuild (re-runs build.rs),
+ # so keep it set
+ )
test("`cargo miri run` (with arguments and target)",
cargo_miri("run") + ["--bin", "cargo-miri-test", "--", "hello world", '"hello world"'],
- "stdout.ref2", "stderr.ref2",
+ "run.args.stdout.ref", "run.args.stderr.ref",
)
test("`cargo miri run` (subcrate, no ioslation)",
cargo_miri("run") + ["-p", "subcrate"],
- "stdout.ref3", "stderr.ref3",
+ "run.subcrate.stdout.ref", "run.subcrate.stderr.ref",
env={'MIRIFLAGS': "-Zmiri-disable-isolation"},
)
def test_cargo_miri_test():
# rustdoc is not run on foreign targets
is_foreign = 'MIRI_TEST_TARGET' in os.environ
- rustdoc_ref = "test.stderr.ref2" if is_foreign else "test.stderr.ref1"
+ rustdoc_ref = "test.stderr-empty.ref" if is_foreign else "test.stderr-rustdoc.ref"
test("`cargo miri test`",
cargo_miri("test"),
- "test.stdout.ref1", rustdoc_ref,
+ "test.default.stdout.ref", rustdoc_ref,
env={'MIRIFLAGS': "-Zmiri-seed=feed"},
)
test("`cargo miri test` (no isolation)",
cargo_miri("test"),
- "test.stdout.ref1", rustdoc_ref,
+ "test.default.stdout.ref", rustdoc_ref,
env={'MIRIFLAGS': "-Zmiri-disable-isolation"},
)
+ test("`cargo miri test` (raw-ptr tracking)",
+ cargo_miri("test"),
+ "test.default.stdout.ref", rustdoc_ref,
+ env={'MIRIFLAGS': "-Zmiri-track-raw-pointers"},
+ )
test("`cargo miri test` (with filter)",
cargo_miri("test") + ["--", "--format=pretty", "le1"],
- "test.stdout.ref2", rustdoc_ref,
+ "test.filter.stdout.ref", rustdoc_ref,
)
test("`cargo miri test` (test target)",
cargo_miri("test") + ["--test", "test", "--", "--format=pretty"],
- "test.stdout.ref3", "test.stderr.ref2",
+ "test.test-target.stdout.ref", "test.stderr-empty.ref",
)
test("`cargo miri test` (bin target)",
cargo_miri("test") + ["--bin", "cargo-miri-test", "--", "--format=pretty"],
- "test.stdout.ref4", "test.stderr.ref2",
+ "test.bin-target.stdout.ref", "test.stderr-empty.ref",
)
test("`cargo miri test` (subcrate, no isolation)",
cargo_miri("test") + ["-p", "subcrate"],
- "test.stdout.ref5", "test.stderr.ref2",
+ "test.subcrate.stdout.ref", "test.stderr-proc-macro.ref",
env={'MIRIFLAGS': "-Zmiri-disable-isolation"},
)
os.chdir(os.path.dirname(os.path.realpath(__file__)))
+os.environ["RUST_TEST_NOCAPTURE"] = "0" # this affects test output, so make sure it is not set
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)