@@ -5,9 +5,9 @@ use std::fs;
5
5
use std:: str;
6
6
use std:: { env:: consts:: EXE_SUFFIX , path:: Path } ;
7
7
8
- use rustup :: test :: {
9
- CliTestContext , Config , MULTI_ARCH1 , Scenario , print_command , print_indented , this_host_triple ,
10
- } ;
8
+ use itertools :: Itertools ;
9
+ use rustup :: test :: Assert ;
10
+ use rustup :: test :: { CliTestContext , MULTI_ARCH1 , Scenario , this_host_triple } ;
11
11
use rustup:: utils;
12
12
use rustup:: utils:: raw:: symlink_dir;
13
13
@@ -50,22 +50,24 @@ info: The currently active `rustc` version is `1.3.0 (hash-nightly-2)`
50
50
#[ tokio:: test]
51
51
async fn no_colors_in_piped_error_output ( ) {
52
52
let cx = CliTestContext :: new ( Scenario :: SimpleV2 ) . await ;
53
- let args: Vec < & str > = vec ! [ ] ;
54
- let out = cx. config . run ( "rustc" , args, & [ ] ) . await ;
55
- assert ! ( !out. ok) ;
56
- assert ! ( !out. stderr. contains( '\x1b' ) ) ;
53
+ cx. config
54
+ . expect ( [ "rustc" ] )
55
+ . await
56
+ . is_err ( )
57
+ . without_stderr ( "\u{1b} " ) ;
57
58
}
58
59
59
60
#[ tokio:: test]
60
61
async fn rustc_with_bad_rustup_toolchain_env_var ( ) {
61
62
let cx = CliTestContext :: new ( Scenario :: SimpleV2 ) . await ;
62
- let args: Vec < & str > = vec ! [ ] ;
63
- let out = cx
64
- . config
65
- . run ( "rustc" , args, & [ ( "RUSTUP_TOOLCHAIN" , "bogus" ) ] )
66
- . await ;
67
- assert ! ( !out. ok) ;
68
- assert ! ( out. stderr. contains( "toolchain 'bogus' is not installed" ) ) ;
63
+ cx. config
64
+ . expect_with_env ( [ "rustc" ] , [ ( "RUSTUP_TOOLCHAIN" , "bogus" ) ] )
65
+ . await
66
+ . with_stderr ( snapbox:: str![ [ r#"
67
+ error: override toolchain 'bogus' is not installed[..]
68
+
69
+ "# ] ] )
70
+ . is_err ( ) ;
69
71
}
70
72
71
73
#[ tokio:: test]
@@ -389,90 +391,83 @@ async fn rustup_doesnt_prepend_path_unnecessarily() {
389
391
. await
390
392
. is_ok ( ) ;
391
393
392
- async fn expect_stderr_ok_env_first_then (
393
- config : & Config ,
394
- args : & [ & str ] ,
395
- env : & [ ( & str , & str ) ] ,
396
- first : & Path ,
397
- second : Option < & Path > ,
398
- ) {
399
- let out = config. run ( args[ 0 ] , & args[ 1 ..] , env) . await ;
400
- let first_then_second = |list : & str | -> bool {
401
- let mut saw_first = false ;
402
- let mut saw_second = false ;
403
- for path in std:: env:: split_paths ( list) {
404
- if path == first {
405
- if saw_second {
406
- return false ;
407
- }
408
- saw_first = true ;
409
- }
410
- if Some ( & * path) == second {
411
- if !saw_first {
412
- return false ;
413
- }
414
- saw_second = true ;
415
- }
416
- }
417
- true
418
- } ;
419
- if !out. ok || !first_then_second ( & out. stderr ) {
420
- print_command ( args, & out) ;
421
- println ! ( "expected.ok: true" ) ;
422
- print_indented (
423
- "expected.stderr.first_then" ,
424
- & format ! ( "{} comes before {:?}" , first. display( ) , second) ,
425
- ) ;
426
- panic ! ( ) ;
427
- }
428
- }
394
+ let assert_ok_with_paths = |assert : & Assert , data| {
395
+ assert. is_ok ( ) ;
396
+ let stderr = std:: env:: split_paths ( & assert. output . stderr )
397
+ . format_with ( "\n " , |p, f| f ( & p. display ( ) ) )
398
+ . to_string ( ) ;
399
+ let stderr = assert. redact ( & stderr) ;
400
+ snapbox:: assert_data_eq!( stderr, data) ;
401
+ } ;
429
402
430
403
// For all of these, CARGO_HOME/bin will be auto-prepended.
431
404
let cargo_home_bin = cx. config . cargodir . join ( "bin" ) ;
432
- expect_stderr_ok_env_first_then (
433
- & cx. config ,
434
- & [ "cargo" , "--echo-path" ] ,
435
- & [ ] ,
436
- & cargo_home_bin,
437
- None ,
438
- )
439
- . await ;
440
- expect_stderr_ok_env_first_then (
441
- & cx. config ,
442
- & [ "cargo" , "--echo-path" ] ,
443
- & [ ( "PATH" , "" ) ] ,
444
- & cargo_home_bin,
445
- None ,
446
- )
447
- . await ;
405
+ assert_ok_with_paths (
406
+ cx. config
407
+ . expect ( [ "cargo" , "--echo-path" ] )
408
+ . await
409
+ . extend_redactions ( [ ( "[CARGO_HOME_BIN]" , & cargo_home_bin) ] ) ,
410
+ snapbox:: str![ [ r#"
411
+ [CARGO_HOME_BIN]
412
+ ...
413
+ "# ] ] ,
414
+ ) ;
415
+
416
+ assert_ok_with_paths (
417
+ cx. config
418
+ . expect_with_env ( [ "cargo" , "--echo-path" ] , [ ( "PATH" , "" ) ] )
419
+ . await
420
+ . extend_redactions ( [ ( "[CARGO_HOME_BIN]" , & cargo_home_bin) ] ) ,
421
+ snapbox:: str![ [ r#"
422
+ [CARGO_HOME_BIN]
423
+ ...
424
+ "# ] ] ,
425
+ ) ;
448
426
449
427
// Check that CARGO_HOME/bin is prepended to path.
450
- let config = & cx. config ;
451
- expect_stderr_ok_env_first_then (
452
- config,
453
- & [ "cargo" , "--echo-path" ] ,
454
- & [ ( "PATH" , & format ! ( "{}" , config. exedir. display( ) ) ) ] ,
455
- & cargo_home_bin,
456
- Some ( & config. exedir ) ,
457
- )
458
- . await ;
428
+ assert_ok_with_paths (
429
+ cx. config
430
+ . expect_with_env (
431
+ [ "cargo" , "--echo-path" ] ,
432
+ [ ( "PATH" , & * cx. config . exedir . display ( ) . to_string ( ) ) ] ,
433
+ )
434
+ . await
435
+ . extend_redactions ( [
436
+ ( "[CARGO_HOME_BIN]" , & cargo_home_bin) ,
437
+ ( "[EXEDIR]" , & cx. config . exedir ) ,
438
+ ] ) ,
439
+ snapbox:: str![ [ r#"
440
+ [CARGO_HOME_BIN]
441
+ [EXEDIR]
442
+ ...
443
+ "# ] ] ,
444
+ ) ;
459
445
460
446
// But if CARGO_HOME/bin is already on PATH, it will not be prepended again,
461
447
// so exedir will take precedence.
462
- expect_stderr_ok_env_first_then (
463
- config,
464
- & [ "cargo" , "--echo-path" ] ,
465
- & [ (
466
- "PATH" ,
467
- std:: env:: join_paths ( [ & config. exedir , & cargo_home_bin] )
468
- . unwrap ( )
469
- . to_str ( )
470
- . unwrap ( ) ,
471
- ) ] ,
472
- & config. exedir ,
473
- Some ( & cargo_home_bin) ,
474
- )
475
- . await ;
448
+ assert_ok_with_paths (
449
+ cx. config
450
+ . expect_with_env (
451
+ [ "cargo" , "--echo-path" ] ,
452
+ [ (
453
+ "PATH" ,
454
+ std:: env:: join_paths ( [ & cx. config . exedir , & cargo_home_bin] )
455
+ . unwrap ( )
456
+ . to_str ( )
457
+ . unwrap ( ) ,
458
+ ) ] ,
459
+ )
460
+ . await
461
+ . extend_redactions ( [
462
+ ( "[CARGO_HOME_BIN]" , & cargo_home_bin) ,
463
+ ( "[EXEDIR]" , & cx. config . exedir ) ,
464
+ ] ) ,
465
+ snapbox:: str![ [ r#"
466
+ [EXEDIR]
467
+ [CARGO_HOME_BIN]
468
+ ...
469
+ "# ] ] ,
470
+ ) ;
476
471
}
477
472
478
473
#[ tokio:: test]
@@ -832,9 +827,15 @@ async fn rename_rls_list() {
832
827
. await
833
828
. is_ok ( ) ;
834
829
835
- let out = cx. config . run ( "rustup" , [ "component" , "list" ] , & [ ] ) . await ;
836
- assert ! ( out. ok) ;
837
- assert ! ( out. stdout. contains( & format!( "rls-{}" , this_host_triple( ) ) ) ) ;
830
+ cx. config
831
+ . expect ( [ "rustup" , "component" , "list" ] )
832
+ . await
833
+ . with_stdout ( snapbox:: str![ [ r#"
834
+ ...
835
+ rls-[HOST_TRIPLE] (installed)
836
+ ...
837
+ "# ] ] )
838
+ . is_ok ( ) ;
838
839
}
839
840
840
841
#[ tokio:: test]
@@ -853,9 +854,15 @@ async fn rename_rls_preview_list() {
853
854
. await
854
855
. is_ok ( ) ;
855
856
856
- let out = cx. config . run ( "rustup" , [ "component" , "list" ] , & [ ] ) . await ;
857
- assert ! ( out. ok) ;
858
- assert ! ( out. stdout. contains( & format!( "rls-{}" , this_host_triple( ) ) ) ) ;
857
+ cx. config
858
+ . expect ( [ "rustup" , "component" , "list" ] )
859
+ . await
860
+ . with_stdout ( snapbox:: str![ [ r#"
861
+ ...
862
+ rls-[HOST_TRIPLE] (installed)
863
+ ...
864
+ "# ] ] )
865
+ . is_ok ( ) ;
859
866
}
860
867
861
868
#[ tokio:: test]
@@ -1479,27 +1486,29 @@ custom-1 [..]/custom-1
1479
1486
#[ tokio:: test]
1480
1487
async fn update_self_smart_guess ( ) {
1481
1488
let cx = CliTestContext :: new ( Scenario :: SimpleV2 ) . await ;
1482
- let out = cx. config . run ( "rustup" , & [ "update" , "self" ] , & [ ] ) . await ;
1483
- let invalid_toolchain = out. stderr . contains ( "invalid toolchain name" ) ;
1484
- if !out. ok && invalid_toolchain {
1485
- assert ! (
1486
- out. stderr
1487
- . contains( "if you meant to update rustup itself, use `rustup self update`" )
1488
- )
1489
- }
1489
+ cx. config
1490
+ . expect ( [ "rustup" , "update" , "self" ] )
1491
+ . await
1492
+ . is_err ( )
1493
+ . with_stderr ( snapbox:: str![ [ r#"
1494
+ ...
1495
+ info: if you meant to update rustup itself, use `rustup self update`
1496
+ ...
1497
+ "# ] ] ) ;
1490
1498
}
1491
1499
1492
1500
#[ tokio:: test]
1493
1501
async fn uninstall_self_smart_guess ( ) {
1494
1502
let cx = CliTestContext :: new ( Scenario :: SimpleV2 ) . await ;
1495
- let out = cx. config . run ( "rustup" , & [ "uninstall" , "self" ] , & [ ] ) . await ;
1496
- let no_toolchain_installed = out. stdout . contains ( "no toolchain installed" ) ;
1497
- if out. ok && no_toolchain_installed {
1498
- assert ! (
1499
- out. stdout
1500
- . contains( "if you meant to uninstall rustup itself, use `rustup self uninstall`" )
1501
- )
1502
- }
1503
+ cx. config
1504
+ . expect ( [ "rustup" , "uninstall" , "self" ] )
1505
+ . await
1506
+ . is_ok ( )
1507
+ . with_stderr ( snapbox:: str![ [ r#"
1508
+ ...
1509
+ info: if you meant to uninstall rustup itself, use `rustup self uninstall`
1510
+ ...
1511
+ "# ] ] ) ;
1503
1512
}
1504
1513
1505
1514
// https://github.com/rust-lang/rustup/issues/4073
@@ -1547,9 +1556,9 @@ async fn rustup_updates_cargo_env_if_proxy() {
1547
1556
. borrow ( )
1548
1557
. join ( "bin" )
1549
1558
. join ( format ! ( "cargo{EXE_SUFFIX}" ) ) ;
1550
- let real_path = cx. config . run ( "rustup" , & [ "which" , "cargo" ] , & [ ] ) . await ;
1551
- assert ! ( real_path. ok ) ;
1552
- let real_path = real_path. stdout ;
1559
+ let real_path = cx. config . expect ( [ "rustup" , "which" , "cargo" ] ) . await ;
1560
+ real_path. is_ok ( ) ;
1561
+ let real_path = & real_path. output . stdout ;
1553
1562
1554
1563
fs:: create_dir_all ( proxy_path. parent ( ) . unwrap ( ) ) . unwrap ( ) ;
1555
1564
#[ cfg( windows) ]
@@ -1623,10 +1632,10 @@ async fn rust_analyzer_proxy_falls_back_external() {
1623
1632
// use the former.
1624
1633
let real_path = cx
1625
1634
. config
1626
- . run ( "rust-analyzer" , & [ "--echo-current-exe" ] , & [ ] )
1635
+ . expect ( [ "rust-analyzer" , "--echo-current-exe" ] )
1627
1636
. await ;
1628
- assert ! ( real_path. ok ) ;
1629
- let real_path = Path :: new ( real_path. stderr . trim ( ) ) ;
1637
+ real_path. is_ok ( ) ;
1638
+ let real_path = Path :: new ( real_path. output . stderr . trim ( ) ) ;
1630
1639
1631
1640
assert ! ( real_path. is_file( ) ) ;
1632
1641
0 commit comments