11use colored:: * ;
22use regex:: Regex ;
33use std:: path:: { Path , PathBuf } ;
4- use std:: { env, ffi :: OsString , process:: Command } ;
5- use ui_test:: { color_eyre:: Result , Config , DependencyBuilder , Mode , OutputConflictHandling } ;
4+ use std:: { env, process:: Command } ;
5+ use ui_test:: { color_eyre:: Result , Config , Mode , OutputConflictHandling } ;
66
77fn miri_path ( ) -> PathBuf {
88 PathBuf :: from ( option_env ! ( "MIRI" ) . unwrap_or ( env ! ( "CARGO_BIN_EXE_miri" ) ) )
@@ -43,30 +43,40 @@ fn run_tests(
4343 target : Option < String > ,
4444 with_dependencies : bool ,
4545) -> Result < ( ) > {
46+ let mut config = Config {
47+ target,
48+ stderr_filters : STDERR . clone ( ) ,
49+ stdout_filters : STDOUT . clone ( ) ,
50+ root_dir : PathBuf :: from ( path) ,
51+ mode,
52+ program : miri_path ( ) ,
53+ quiet : false ,
54+ ..Config :: default ( )
55+ } ;
56+
4657 let in_rustc_test_suite = option_env ! ( "RUSTC_STAGE" ) . is_some ( ) ;
4758
4859 // Add some flags we always want.
49- let mut flags: Vec < OsString > = Vec :: new ( ) ;
50- flags. push ( "--edition" . into ( ) ) ;
51- flags. push ( "2018" . into ( ) ) ;
60+ config. args . push ( "--edition" . into ( ) ) ;
61+ config. args . push ( "2018" . into ( ) ) ;
5262 if in_rustc_test_suite {
5363 // Less aggressive warnings to make the rustc toolstate management less painful.
5464 // (We often get warnings when e.g. a feature gets stabilized or some lint gets added/improved.)
55- flags . push ( "-Astable-features" . into ( ) ) ;
56- flags . push ( "-Aunused" . into ( ) ) ;
65+ config . args . push ( "-Astable-features" . into ( ) ) ;
66+ config . args . push ( "-Aunused" . into ( ) ) ;
5767 } else {
58- flags . push ( "-Dwarnings" . into ( ) ) ;
59- flags . push ( "-Dunused" . into ( ) ) ;
68+ config . args . push ( "-Dwarnings" . into ( ) ) ;
69+ config . args . push ( "-Dunused" . into ( ) ) ;
6070 }
6171 if let Ok ( extra_flags) = env:: var ( "MIRIFLAGS" ) {
6272 for flag in extra_flags. split_whitespace ( ) {
63- flags . push ( flag. into ( ) ) ;
73+ config . args . push ( flag. into ( ) ) ;
6474 }
6575 }
66- flags . push ( "-Zui-testing" . into ( ) ) ;
67- if let Some ( target) = & target {
68- flags . push ( "--target" . into ( ) ) ;
69- flags . push ( target. into ( ) ) ;
76+ config . args . push ( "-Zui-testing" . into ( ) ) ;
77+ if let Some ( target) = & config . target {
78+ config . args . push ( "--target" . into ( ) ) ;
79+ config . args . push ( target. into ( ) ) ;
7080 }
7181
7282 // If we're on linux, and we're testing the extern-so functionality,
@@ -76,57 +86,43 @@ fn run_tests(
7686 let so_file_path = build_so_for_c_ffi_tests ( ) ;
7787 let mut flag = std:: ffi:: OsString :: from ( "-Zmiri-extern-so-file=" ) ;
7888 flag. push ( so_file_path. into_os_string ( ) ) ;
79- flags . push ( flag) ;
89+ config . args . push ( flag) ;
8090 }
8191
8292 let skip_ui_checks = env:: var_os ( "MIRI_SKIP_UI_CHECKS" ) . is_some ( ) ;
8393
84- let output_conflict_handling = match ( env:: var_os ( "MIRI_BLESS" ) . is_some ( ) , skip_ui_checks) {
94+ config . output_conflict_handling = match ( env:: var_os ( "MIRI_BLESS" ) . is_some ( ) , skip_ui_checks) {
8595 ( false , false ) => OutputConflictHandling :: Error ,
8696 ( true , false ) => OutputConflictHandling :: Bless ,
8797 ( false , true ) => OutputConflictHandling :: Ignore ,
8898 ( true , true ) => panic ! ( "cannot use MIRI_BLESS and MIRI_SKIP_UI_CHECKS at the same time" ) ,
8999 } ;
90100
91- // Pass on all unknown arguments as filters.
92- let mut quiet = false ;
93- let path_filter = std:: env:: args ( ) . skip ( 1 ) . filter ( |arg| {
101+ // Handle command-line arguments.
102+ config. path_filter . extend ( std:: env:: args ( ) . skip ( 1 ) . filter ( |arg| {
94103 match & * * arg {
95104 "--quiet" => {
96- quiet = true ;
105+ config . quiet = true ;
97106 false
98107 }
99108 _ => true ,
100109 }
101- } ) ;
110+ } ) ) ;
102111
103112 let use_std = env:: var_os ( "MIRI_NO_STD" ) . is_none ( ) ;
104113
105- let config = Config {
106- args : flags,
107- target,
108- stderr_filters : STDERR . clone ( ) ,
109- stdout_filters : STDOUT . clone ( ) ,
110- root_dir : PathBuf :: from ( path) ,
111- mode,
112- path_filter : path_filter. collect ( ) ,
113- program : miri_path ( ) ,
114- output_conflict_handling,
115- dependencies_crate_manifest_path : ( with_dependencies && use_std)
116- . then ( || Path :: new ( "test_dependencies" ) . join ( "Cargo.toml" ) ) ,
117- dependency_builder : Some ( DependencyBuilder {
118- program : std:: env:: var_os ( "CARGO" ) . unwrap ( ) . into ( ) ,
119- args : vec ! [
120- "run" . into( ) ,
121- "--manifest-path" . into( ) ,
122- "cargo-miri/Cargo.toml" . into( ) ,
123- "--" . into( ) ,
124- "miri" . into( ) ,
125- ] ,
126- envs : vec ! [ ] ,
127- } ) ,
128- quiet,
129- } ;
114+ if with_dependencies && use_std {
115+ config. dependencies_crate_manifest_path =
116+ Some ( Path :: new ( "test_dependencies" ) . join ( "Cargo.toml" ) ) ;
117+ config. dependency_builder . args = vec ! [
118+ "run" . into( ) ,
119+ "--manifest-path" . into( ) ,
120+ "cargo-miri/Cargo.toml" . into( ) ,
121+ "--" . into( ) ,
122+ "miri" . into( ) ,
123+ "run" . into( ) , // There is no `cargo miri build` so we just use `cargo miri run`.
124+ ] ;
125+ }
130126 ui_test:: run_tests ( config)
131127}
132128
@@ -214,10 +210,10 @@ fn main() -> Result<()> {
214210 ui ( Mode :: Pass , "tests/pass" , WithoutDependencies ) ?;
215211 ui ( Mode :: Pass , "tests/pass-dep" , WithDependencies ) ?;
216212 ui ( Mode :: Panic , "tests/panic" , WithDependencies ) ?;
217- ui ( Mode :: Fail , "tests/fail" , WithDependencies ) ?;
213+ ui ( Mode :: Fail { require_patterns : true } , "tests/fail" , WithDependencies ) ?;
218214 if cfg ! ( target_os = "linux" ) {
219215 ui ( Mode :: Pass , "tests/extern-so/pass" , WithoutDependencies ) ?;
220- ui ( Mode :: Fail , "tests/extern-so/fail" , WithDependencies ) ?;
216+ ui ( Mode :: Fail { require_patterns : true } , "tests/extern-so/fail" , WithDependencies ) ?;
221217 }
222218
223219 Ok ( ( ) )
0 commit comments