[pve-devel] [PATCH installer v2 5/5] auto: add negative tests for root password option
Christoph Heiss
c.heiss at proxmox.com
Fri Nov 29 13:21:13 CET 2024
Extends our "test runner" for the parse-answer tests such that if a test
file ends with ".fail.toml", it is considered a negative test and
expected to fail. The expected error message is stored in the
accompanying <name>.fail.json file.
Signed-off-by: Christoph Heiss <c.heiss at proxmox.com>
---
Changes v1 -> v2:
* new patch
proxmox-auto-installer/tests/parse-answer.rs | 22 ++++++++++++++++---
.../both-password-and-hashed-set.fail.json | 3 +++
.../both-password-and-hashed-set.fail.toml | 15 +++++++++++++
.../no-root-password-set.fail.json | 3 +++
.../no-root-password-set.fail.toml | 13 +++++++++++
.../parse_answer/short-password.fail.json | 3 +++
.../parse_answer/short-password.fail.toml | 14 ++++++++++++
proxmox-installer-common/src/setup.rs | 6 ++---
8 files changed, 73 insertions(+), 6 deletions(-)
create mode 100644 proxmox-auto-installer/tests/resources/parse_answer/both-password-and-hashed-set.fail.json
create mode 100644 proxmox-auto-installer/tests/resources/parse_answer/both-password-and-hashed-set.fail.toml
create mode 100644 proxmox-auto-installer/tests/resources/parse_answer/no-root-password-set.fail.json
create mode 100644 proxmox-auto-installer/tests/resources/parse_answer/no-root-password-set.fail.toml
create mode 100644 proxmox-auto-installer/tests/resources/parse_answer/short-password.fail.json
create mode 100644 proxmox-auto-installer/tests/resources/parse_answer/short-password.fail.toml
diff --git a/proxmox-auto-installer/tests/parse-answer.rs b/proxmox-auto-installer/tests/parse-answer.rs
index 65f8c1e..57436a2 100644
--- a/proxmox-auto-installer/tests/parse-answer.rs
+++ b/proxmox-auto-installer/tests/parse-answer.rs
@@ -64,11 +64,27 @@ fn test_parse_answers() {
let extension = p.extension().unwrap().to_str().unwrap();
if extension == "toml" {
println!("Test: {name}");
+
let answer = get_answer(p.clone()).unwrap();
- let config =
- &parse_answer(&answer, &udev_info, &runtime_info, &locales, &setup_info).unwrap();
+ let config = parse_answer(&answer, &udev_info, &runtime_info, &locales, &setup_info);
+
+ let config = if name.ends_with(".fail") {
+ let json_path = tests_path.join(format!("{name}.json"));
+ let json_raw = std::fs::read_to_string(json_path).unwrap();
+ let err_json: Value = serde_json::from_str(&json_raw).unwrap();
+
+ assert!(config.is_err());
+ assert_eq!(
+ config.unwrap_err().to_string(),
+ err_json.get("error").unwrap().as_str().unwrap()
+ );
+ continue;
+ } else {
+ config.unwrap()
+ };
+
println!("Selected disks: {:#?}", &config.disk_selection);
- let config_json = serde_json::to_string(config);
+ let config_json = serde_json::to_string(&config);
let config: Value = serde_json::from_str(config_json.unwrap().as_str()).unwrap();
let mut path = tests_path.clone();
path.push(format!("{name}.json"));
diff --git a/proxmox-auto-installer/tests/resources/parse_answer/both-password-and-hashed-set.fail.json b/proxmox-auto-installer/tests/resources/parse_answer/both-password-and-hashed-set.fail.json
new file mode 100644
index 0000000..fd1213e
--- /dev/null
+++ b/proxmox-auto-installer/tests/resources/parse_answer/both-password-and-hashed-set.fail.json
@@ -0,0 +1,3 @@
+{
+ "error": "`global.root_password` and `global.root_password_hashed` cannot be set at the same time"
+}
diff --git a/proxmox-auto-installer/tests/resources/parse_answer/both-password-and-hashed-set.fail.toml b/proxmox-auto-installer/tests/resources/parse_answer/both-password-and-hashed-set.fail.toml
new file mode 100644
index 0000000..0a56fc9
--- /dev/null
+++ b/proxmox-auto-installer/tests/resources/parse_answer/both-password-and-hashed-set.fail.toml
@@ -0,0 +1,15 @@
+[global]
+keyboard = "de"
+country = "at"
+fqdn = "both-password-and-hashed-set.fail.testinstall"
+mailto = "mail at no.invalid"
+timezone = "Europe/Vienna"
+root_password = "12345678"
+root_password_hashed = "$y$j9T$343s9MNhV4xZhW1Be6J6H1$rIxofnXWmp0FQGGIPO3BRwb1jK4ZXWaxT7OjhHJmum0"
+
+[network]
+source = "from-dhcp"
+
+[disk-setup]
+filesystem = "ext4"
+disk_list = ["sda"]
diff --git a/proxmox-auto-installer/tests/resources/parse_answer/no-root-password-set.fail.json b/proxmox-auto-installer/tests/resources/parse_answer/no-root-password-set.fail.json
new file mode 100644
index 0000000..6d75755
--- /dev/null
+++ b/proxmox-auto-installer/tests/resources/parse_answer/no-root-password-set.fail.json
@@ -0,0 +1,3 @@
+{
+ "error": "One of `global.root_password` or `global.root_password_hashed` must be set"
+}
diff --git a/proxmox-auto-installer/tests/resources/parse_answer/no-root-password-set.fail.toml b/proxmox-auto-installer/tests/resources/parse_answer/no-root-password-set.fail.toml
new file mode 100644
index 0000000..454e0b6
--- /dev/null
+++ b/proxmox-auto-installer/tests/resources/parse_answer/no-root-password-set.fail.toml
@@ -0,0 +1,13 @@
+[global]
+keyboard = "de"
+country = "at"
+fqdn = "no-root-password-set.fail.testinstall"
+mailto = "mail at no.invalid"
+timezone = "Europe/Vienna"
+
+[network]
+source = "from-dhcp"
+
+[disk-setup]
+filesystem = "ext4"
+disk_list = ["sda"]
diff --git a/proxmox-auto-installer/tests/resources/parse_answer/short-password.fail.json b/proxmox-auto-installer/tests/resources/parse_answer/short-password.fail.json
new file mode 100644
index 0000000..c424b0b
--- /dev/null
+++ b/proxmox-auto-installer/tests/resources/parse_answer/short-password.fail.json
@@ -0,0 +1,3 @@
+{
+ "error": "`global.root_password` must be at least 8 characters long"
+}
diff --git a/proxmox-auto-installer/tests/resources/parse_answer/short-password.fail.toml b/proxmox-auto-installer/tests/resources/parse_answer/short-password.fail.toml
new file mode 100644
index 0000000..a0eb1ec
--- /dev/null
+++ b/proxmox-auto-installer/tests/resources/parse_answer/short-password.fail.toml
@@ -0,0 +1,14 @@
+[global]
+keyboard = "de"
+country = "at"
+fqdn = "short-password.fail.testinstall"
+mailto = "mail at no.invalid"
+timezone = "Europe/Vienna"
+root_password = "12345"
+
+[network]
+source = "from-dhcp"
+
+[disk-setup]
+filesystem = "ext4"
+disk_list = ["sda"]
diff --git a/proxmox-installer-common/src/setup.rs b/proxmox-installer-common/src/setup.rs
index 4adb168..c8fc118 100644
--- a/proxmox-installer-common/src/setup.rs
+++ b/proxmox-installer-common/src/setup.rs
@@ -463,14 +463,14 @@ impl Interface {
}
}
-#[derive(Clone, Deserialize, Serialize)]
+#[derive(Clone, Debug, Deserialize, Serialize)]
#[serde(rename_all = "lowercase")]
pub enum InstallRootPassword {
Plain(String),
Hashed(String),
}
-#[derive(Clone, Default, Deserialize, Serialize)]
+#[derive(Clone, Debug, Default, Deserialize, Serialize)]
pub struct InstallFirstBootSetup {
#[serde(
serialize_with = "serialize_bool_as_u32",
@@ -501,7 +501,7 @@ pub fn spawn_low_level_installer(test_mode: bool) -> io::Result<process::Child>
}
/// See Proxmox::Install::Config
-#[derive(Deserialize, Serialize)]
+#[derive(Debug, Deserialize, Serialize)]
pub struct InstallConfig {
pub autoreboot: usize,
--
2.47.0
More information about the pve-devel
mailing list