@@ -36,6 +36,9 @@ use crate::{
36
36
utils:: utils,
37
37
} ;
38
38
39
+ #[ cfg( feature = "test" ) ]
40
+ use crate :: test:: mock:: clitools;
41
+
39
42
#[ derive( Debug , ThisError ) ]
40
43
enum OverrideFileConfigError {
41
44
#[ error( "empty toolchain override file detected. Please remove it, or else specify the desired toolchain properties in the file" ) ]
@@ -149,7 +152,7 @@ impl Display for OverrideReason {
149
152
}
150
153
}
151
154
152
- #[ derive( Default , Debug ) ]
155
+ #[ derive( Default , Debug , PartialEq ) ]
153
156
struct OverrideCfg {
154
157
toolchain : Option < LocalToolchainName > ,
155
158
components : Vec < String > ,
@@ -1005,6 +1008,29 @@ impl Cfg {
1005
1008
}
1006
1009
}
1007
1010
1011
+ #[ cfg( feature = "test" ) ]
1012
+ impl From < clitools:: Config > for Cfg {
1013
+ fn from ( cfg : clitools:: Config ) -> Self {
1014
+ let rustup_dir = & cfg. rustupdir ;
1015
+ let dist_root_server = dist:: DEFAULT_DIST_SERVER ;
1016
+
1017
+ Self {
1018
+ rustup_dir : rustup_dir. rustupdir . clone ( ) ,
1019
+ fallback_settings : None ,
1020
+ settings_file : SettingsFile :: new ( rustup_dir. join ( "settings.toml" ) ) ,
1021
+ toolchains_dir : rustup_dir. join ( "toolchains" ) ,
1022
+ update_hash_dir : rustup_dir. join ( "update-hashes" ) ,
1023
+ download_dir : rustup_dir. join ( "downloads" ) ,
1024
+ dist_root_url : dist_root_server. to_owned ( ) + "/dist" ,
1025
+ temp_cfg : temp:: Cfg :: new ( rustup_dir. join ( "tmp" ) , dist_root_server, Box :: new ( |_| { } ) ) ,
1026
+ toolchain_override : None ,
1027
+ profile_override : None ,
1028
+ env_override : None ,
1029
+ notify_handler : Arc :: new ( |_| { } ) ,
1030
+ }
1031
+ }
1032
+ }
1033
+
1008
1034
fn update_override (
1009
1035
override_ : & mut Option < ( OverrideFile , OverrideReason ) > ,
1010
1036
file : OverrideFile ,
@@ -1046,7 +1072,7 @@ enum ParseMode {
1046
1072
mod tests {
1047
1073
use rustup_macros:: unit_test as test;
1048
1074
1049
- use crate :: { cli :: common :: set_globals , utils:: raw} ;
1075
+ use crate :: { test :: mock :: clitools :: setup_test_state , utils:: raw} ;
1050
1076
1051
1077
use super :: * ;
1052
1078
@@ -1254,8 +1280,10 @@ channel = nightly
1254
1280
/// Checks that `rust-toolchain.toml` configs can be overridden by `<proxy> +<toolchain>`.
1255
1281
/// See: <https://github.com/rust-lang/rustup/issues/3483>
1256
1282
#[ test]
1257
- fn find_override_config_with_toolchain_override ( ) {
1258
- let cwd = crate :: test:: test_dir ( ) . unwrap ( ) ;
1283
+ fn toolchain_override_beats_toml ( ) {
1284
+ let test_dist_dir = crate :: test:: test_dist_dir ( ) . unwrap ( ) ;
1285
+ let ( cwd, config) = setup_test_state ( test_dist_dir) ;
1286
+
1259
1287
let toolchain_file = cwd. path ( ) . join ( "rust-toolchain.toml" ) ;
1260
1288
raw:: write_file (
1261
1289
& toolchain_file,
@@ -1267,10 +1295,70 @@ channel = nightly
1267
1295
)
1268
1296
. unwrap ( ) ;
1269
1297
1270
- let mut cfg = set_globals ( true , false ) . unwrap ( ) ;
1298
+ let mut cfg = Cfg :: try_from ( config) . unwrap ( ) ;
1299
+ let default_host_triple = cfg. get_default_host_triple ( ) . unwrap ( ) ;
1271
1300
cfg. toolchain_override = Some ( "beta" . try_into ( ) . unwrap ( ) ) ;
1272
1301
1273
1302
let found_override = cfg. find_override_config ( cwd. path ( ) ) . unwrap ( ) ;
1274
- assert ! ( dbg!( found_override) . is_none( ) ) ;
1303
+ let override_cfg = found_override. map ( |it| it. 0 ) ;
1304
+
1305
+ let expected_override_cfg = OverrideCfg {
1306
+ toolchain : Some ( LocalToolchainName :: Named ( ToolchainName :: Official (
1307
+ ToolchainDesc {
1308
+ channel : "beta" . to_owned ( ) ,
1309
+ date : None ,
1310
+ target : default_host_triple,
1311
+ } ,
1312
+ ) ) ) ,
1313
+ components : vec ! [ "rls" . to_owned( ) ] ,
1314
+ targets : vec ! [ ] ,
1315
+ profile : None ,
1316
+ } ;
1317
+ assert_eq ! ( override_cfg, Some ( expected_override_cfg) ) ;
1318
+ }
1319
+
1320
+ /// Checks that `rust-toolchain.toml` configs can be overridden by `RUSTUP_TOOLCHAIN`.
1321
+ /// See: <https://github.com/rust-lang/rustup/issues/3483>
1322
+ #[ test]
1323
+ fn env_override_beats_toml ( ) {
1324
+ let test_dist_dir = crate :: test:: test_dist_dir ( ) . unwrap ( ) ;
1325
+ let ( cwd, config) = setup_test_state ( test_dist_dir) ;
1326
+
1327
+ let toolchain_file = cwd. path ( ) . join ( "rust-toolchain.toml" ) ;
1328
+ raw:: write_file (
1329
+ & toolchain_file,
1330
+ r#"
1331
+ [toolchain]
1332
+ channel = "nightly"
1333
+ components = [ "rls" ]
1334
+ "# ,
1335
+ )
1336
+ . unwrap ( ) ;
1337
+
1338
+ let mut cfg = Cfg :: try_from ( config) . unwrap ( ) ;
1339
+ let default_host_triple = cfg. get_default_host_triple ( ) . unwrap ( ) ;
1340
+ cfg. env_override = Some (
1341
+ ResolvableLocalToolchainName :: try_from ( "beta" )
1342
+ . unwrap ( )
1343
+ . resolve ( & default_host_triple)
1344
+ . unwrap ( ) ,
1345
+ ) ;
1346
+
1347
+ let found_override = cfg. find_override_config ( cwd. path ( ) ) . unwrap ( ) ;
1348
+ let override_cfg = found_override. map ( |it| it. 0 ) ;
1349
+
1350
+ let expected_override_cfg = OverrideCfg {
1351
+ toolchain : Some ( LocalToolchainName :: Named ( ToolchainName :: Official (
1352
+ ToolchainDesc {
1353
+ channel : "beta" . to_owned ( ) ,
1354
+ date : None ,
1355
+ target : default_host_triple. clone ( ) ,
1356
+ } ,
1357
+ ) ) ) ,
1358
+ components : vec ! [ "rls" . to_owned( ) ] ,
1359
+ targets : vec ! [ ] ,
1360
+ profile : None ,
1361
+ } ;
1362
+ assert_eq ! ( override_cfg, Some ( expected_override_cfg) ) ;
1275
1363
}
1276
1364
}
0 commit comments