[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