]> git.lizzy.rs Git - rust.git/blob - test-cargo-miri/run-test.py
Auto merge of #1726 - hyd-dev:stub-d, r=RalfJung
[rust.git] / test-cargo-miri / run-test.py
1 #!/usr/bin/env python3
2 '''
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.
6 '''
7
8 import sys, subprocess, os
9
10 CGREEN  = '\33[32m'
11 CBOLD   = '\33[1m'
12 CEND    = '\33[0m'
13
14 def fail(msg):
15     print("\nTEST FAIL: {}".format(msg))
16     sys.exit(1)
17
18 def cargo_miri(cmd, quiet = True):
19     args = ["cargo", "miri", cmd]
20     if quiet:
21         args += ["-q"]
22     if 'MIRI_TEST_TARGET' in os.environ:
23         args += ["--target", os.environ['MIRI_TEST_TARGET']]
24     return args
25
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()
30     p_env.update(env)
31     p = subprocess.Popen(
32         cmd,
33         stdin=subprocess.PIPE,
34         stdout=subprocess.PIPE,
35         stderr=subprocess.PIPE,
36         env=p_env,
37     )
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():
42         # All good!
43         return
44     # Show output
45     print("--- BEGIN stdout ---")
46     print(stdout, end="")
47     print("--- END stdout ---")
48     print("--- BEGIN stderr ---")
49     print(stderr, end="")
50     print("--- END stderr ---")
51     fail("exit code was {}".format(p.returncode))
52
53 def test_no_rebuild(name, cmd, env={}):
54     print("Testing {}...".format(name))
55     p_env = os.environ.copy()
56     p_env.update(env)
57     p = subprocess.Popen(
58         cmd,
59         stdout=subprocess.PIPE,
60         stderr=subprocess.PIPE,
61         env=p_env,
62     )
63     (stdout, stderr) = p.communicate()
64     stdout = stdout.decode("UTF-8")
65     stderr = stderr.decode("UTF-8")
66     if p.returncode != 0:
67         fail("rebuild failed");
68     # Also check for 'Running' as a sanity check.
69     if stderr.count(" Compiling ") > 0 or stderr.count(" Running ") == 0:
70         print("--- BEGIN stderr ---")
71         print(stderr, end="")
72         print("--- END stderr ---")
73         fail("Something was being rebuilt when it should not be (or we got no output)");
74
75 def test_cargo_miri_run():
76     test("`cargo miri run` (no isolation)",
77         cargo_miri("run"),
78         "run.default.stdout.ref", "run.default.stderr.ref",
79         stdin=b'12\n21\n',
80         env={
81             'MIRIFLAGS': "-Zmiri-disable-isolation",
82             'MIRITESTVAR': "wrongval", # make sure the build.rs value takes precedence
83         },
84     )
85     # Special test: run it again *without* `-q` to make sure nothing is being rebuilt (Miri issue #1722)
86     test_no_rebuild("`cargo miri run` (no rebuild)",
87         cargo_miri("run", quiet=False) + ["--", ""],
88         env={'MIRITESTVAR': "wrongval"}, # changing the env var causes a rebuild (re-runs build.rs),
89                                          # so keep it set
90     )
91     test("`cargo miri run` (with arguments and target)",
92         cargo_miri("run") + ["--bin", "cargo-miri-test", "--", "hello world", '"hello world"'],
93         "run.args.stdout.ref", "run.args.stderr.ref",
94     )
95     test("`cargo miri run` (subcrate, no ioslation)",
96         cargo_miri("run") + ["-p", "subcrate"],
97         "run.subcrate.stdout.ref", "run.subcrate.stderr.ref",
98         env={'MIRIFLAGS': "-Zmiri-disable-isolation"},
99     )
100
101 def test_cargo_miri_test():
102     # rustdoc is not run on foreign targets
103     is_foreign = 'MIRI_TEST_TARGET' in os.environ
104     rustdoc_ref = "test.stderr-empty.ref" if is_foreign else "test.stderr-rustdoc.ref"
105
106     test("`cargo miri test`",
107         cargo_miri("test"),
108         "test.default.stdout.ref", rustdoc_ref,
109         env={'MIRIFLAGS': "-Zmiri-seed=feed"},
110     )
111     test("`cargo miri test` (no isolation)",
112         cargo_miri("test"),
113         "test.default.stdout.ref", rustdoc_ref,
114         env={'MIRIFLAGS': "-Zmiri-disable-isolation"},
115     )
116     test("`cargo miri test` (raw-ptr tracking)",
117         cargo_miri("test"),
118         "test.default.stdout.ref", rustdoc_ref,
119         env={'MIRIFLAGS': "-Zmiri-track-raw-pointers"},
120     )
121     test("`cargo miri test` (with filter)",
122         cargo_miri("test") + ["--", "--format=pretty", "le1"],
123         "test.filter.stdout.ref", rustdoc_ref,
124     )
125     test("`cargo miri test` (test target)",
126         cargo_miri("test") + ["--test", "test", "--", "--format=pretty"],
127         "test.test-target.stdout.ref", "test.stderr-empty.ref",
128     )
129     test("`cargo miri test` (bin target)",
130         cargo_miri("test") + ["--bin", "cargo-miri-test", "--", "--format=pretty"],
131         "test.bin-target.stdout.ref", "test.stderr-empty.ref",
132     )
133     test("`cargo miri test` (subcrate, no isolation)",
134         cargo_miri("test") + ["-p", "subcrate"],
135         "test.subcrate.stdout.ref", "test.stderr-proc-macro.ref",
136         env={'MIRIFLAGS': "-Zmiri-disable-isolation"},
137     )
138
139 os.chdir(os.path.dirname(os.path.realpath(__file__)))
140 os.environ["RUST_TEST_NOCAPTURE"] = "0" # this affects test output, so make sure it is not set
141
142 target_str = " for target {}".format(os.environ['MIRI_TEST_TARGET']) if 'MIRI_TEST_TARGET' in os.environ else ""
143 print(CGREEN + CBOLD + "## Running `cargo miri` tests{}".format(target_str) + CEND)
144
145 if not 'MIRI_SYSROOT' in os.environ:
146     # Make sure we got a working sysroot.
147     # (If the sysroot gets built later when output is compared, that leads to test failures.)
148     subprocess.run(cargo_miri("setup"), check=True)
149 test_cargo_miri_run()
150 test_cargo_miri_test()
151
152 print("\nTEST SUCCESSFUL!")
153 sys.exit(0)