Skip to content

Commit a25b723

Browse files
committed
Add unit tests for Cfg overriding
1 parent 1cb07af commit a25b723

File tree

1 file changed

+164
-1
lines changed

1 file changed

+164
-1
lines changed

src/config.rs

+164-1
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,9 @@ use crate::{
3636
utils::utils,
3737
};
3838

39+
#[cfg(feature = "test")]
40+
use crate::test::mock::clitools;
41+
3942
#[derive(Debug, ThisError)]
4043
enum OverrideFileConfigError {
4144
#[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 {
149152
}
150153
}
151154

152-
#[derive(Default, Debug)]
155+
#[derive(Default, Debug, PartialEq)]
153156
struct OverrideCfg {
154157
toolchain: Option<LocalToolchainName>,
155158
components: Vec<String>,
@@ -1005,6 +1008,29 @@ impl Cfg {
10051008
}
10061009
}
10071010

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+
10081034
fn update_override(
10091035
override_: &mut Option<(OverrideFile, OverrideReason)>,
10101036
file: OverrideFile,
@@ -1046,6 +1072,11 @@ enum ParseMode {
10461072
mod tests {
10471073
use rustup_macros::unit_test as test;
10481074

1075+
use crate::{
1076+
test::{mock::clitools::setup_test_state, test_dist_dir},
1077+
utils::raw,
1078+
};
1079+
10491080
use super::*;
10501081

10511082
#[test]
@@ -1248,4 +1279,136 @@ channel = nightly
12481279
Ok(OverrideFileConfigError::Parsing)
12491280
));
12501281
}
1282+
1283+
/// Ensures that `rust-toolchain.toml` configs can be overridden by `<proxy> +<toolchain>`.
1284+
/// See: <https://github.com/rust-lang/rustup/issues/3483>
1285+
#[test]
1286+
fn toolchain_override_beats_toml() {
1287+
let test_dist_dir = test_dist_dir().unwrap();
1288+
let (cwd, config) = setup_test_state(test_dist_dir);
1289+
1290+
let toolchain_file = cwd.path().join("rust-toolchain.toml");
1291+
raw::write_file(
1292+
&toolchain_file,
1293+
r#"
1294+
[toolchain]
1295+
channel = "nightly"
1296+
components = [ "rls" ]
1297+
"#,
1298+
)
1299+
.unwrap();
1300+
1301+
let mut cfg = Cfg::try_from(config).unwrap();
1302+
let default_host_triple = cfg.get_default_host_triple().unwrap();
1303+
cfg.toolchain_override = Some("beta".try_into().unwrap());
1304+
1305+
let found_override = cfg.find_override_config(cwd.path()).unwrap();
1306+
let override_cfg = found_override.map(|it| it.0);
1307+
1308+
let expected_override_cfg = OverrideCfg {
1309+
toolchain: Some(LocalToolchainName::Named(ToolchainName::Official(
1310+
ToolchainDesc {
1311+
channel: "beta".to_owned(),
1312+
date: None,
1313+
target: default_host_triple,
1314+
},
1315+
))),
1316+
components: vec!["rls".to_owned()],
1317+
targets: vec![],
1318+
profile: None,
1319+
};
1320+
assert_eq!(override_cfg, Some(expected_override_cfg));
1321+
}
1322+
1323+
/// Ensures that `rust-toolchain.toml` configs can be overridden by `RUSTUP_TOOLCHAIN`.
1324+
/// See: <https://github.com/rust-lang/rustup/issues/3483>
1325+
#[test]
1326+
fn env_override_beats_toml() {
1327+
let test_dist_dir = test_dist_dir().unwrap();
1328+
let (cwd, config) = setup_test_state(test_dist_dir);
1329+
1330+
let toolchain_file = cwd.path().join("rust-toolchain.toml");
1331+
raw::write_file(
1332+
&toolchain_file,
1333+
r#"
1334+
[toolchain]
1335+
channel = "nightly"
1336+
components = [ "rls" ]
1337+
"#,
1338+
)
1339+
.unwrap();
1340+
1341+
let mut cfg = Cfg::try_from(config).unwrap();
1342+
let default_host_triple = cfg.get_default_host_triple().unwrap();
1343+
cfg.env_override = Some(
1344+
ResolvableLocalToolchainName::try_from("beta")
1345+
.unwrap()
1346+
.resolve(&default_host_triple)
1347+
.unwrap(),
1348+
);
1349+
1350+
let found_override = cfg.find_override_config(cwd.path()).unwrap();
1351+
let override_cfg = found_override.map(|it| it.0);
1352+
1353+
let expected_override_cfg = OverrideCfg {
1354+
toolchain: Some(LocalToolchainName::Named(ToolchainName::Official(
1355+
ToolchainDesc {
1356+
channel: "beta".to_owned(),
1357+
date: None,
1358+
target: default_host_triple,
1359+
},
1360+
))),
1361+
components: vec!["rls".to_owned()],
1362+
targets: vec![],
1363+
profile: None,
1364+
};
1365+
assert_eq!(override_cfg, Some(expected_override_cfg));
1366+
}
1367+
1368+
/// Ensures that `rust-toolchain.toml` configs can be overridden by `rustup override set`.
1369+
/// See: <https://github.com/rust-lang/rustup/issues/3483>
1370+
#[test]
1371+
fn override_set_beats_toml() {
1372+
let test_dist_dir = test_dist_dir().unwrap();
1373+
let (cwd, config) = setup_test_state(test_dist_dir);
1374+
1375+
let toolchain_file = cwd.path().join("rust-toolchain.toml");
1376+
raw::write_file(
1377+
&toolchain_file,
1378+
r#"
1379+
[toolchain]
1380+
channel = "nightly"
1381+
components = [ "rls" ]
1382+
"#,
1383+
)
1384+
.unwrap();
1385+
1386+
let cfg = Cfg::try_from(config).unwrap();
1387+
let default_host_triple = cfg.get_default_host_triple().unwrap();
1388+
1389+
cfg.settings_file
1390+
.with_mut(|settings| {
1391+
// "." -> beta, no rls
1392+
settings.add_override(cwd.path(), "beta".to_owned(), &|_| {});
1393+
Ok(())
1394+
})
1395+
.unwrap();
1396+
1397+
let found_override = cfg.find_override_config(cwd.path()).unwrap();
1398+
let override_cfg = found_override.map(|it| it.0);
1399+
1400+
let expected_override_cfg = OverrideCfg {
1401+
toolchain: Some(LocalToolchainName::Named(ToolchainName::Official(
1402+
ToolchainDesc {
1403+
channel: "beta".to_owned(),
1404+
date: None,
1405+
target: default_host_triple,
1406+
},
1407+
))),
1408+
components: vec!["rls".to_owned()],
1409+
targets: vec![],
1410+
profile: None,
1411+
};
1412+
assert_eq!(override_cfg, Some(expected_override_cfg));
1413+
}
12511414
}

0 commit comments

Comments
 (0)