From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [IPv6:2a01:7e0:0:424::9]) by lore.proxmox.com (Postfix) with ESMTPS id 0FDDC1FF16F for ; Fri, 29 Nov 2024 13:22:29 +0100 (CET) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 625FD183C5; Fri, 29 Nov 2024 13:22:07 +0100 (CET) From: Christoph Heiss To: pve-devel@lists.proxmox.com Date: Fri, 29 Nov 2024 13:21:13 +0100 Message-ID: <20241129122125.1494917-6-c.heiss@proxmox.com> X-Mailer: git-send-email 2.47.0 In-Reply-To: <20241129122125.1494917-1-c.heiss@proxmox.com> References: <20241129122125.1494917-1-c.heiss@proxmox.com> MIME-Version: 1.0 X-SPAM-LEVEL: Spam detection results: 0 AWL 0.029 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% DMARC_MISSING 0.1 Missing DMARC policy KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record Subject: [pve-devel] [PATCH installer v2 5/5] auto: add negative tests for root password option X-BeenThere: pve-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox VE development discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: Proxmox VE development discussion Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: pve-devel-bounces@lists.proxmox.com Sender: "pve-devel" 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 .fail.json file. Signed-off-by: Christoph Heiss --- 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@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@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@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 } /// See Proxmox::Install::Config -#[derive(Deserialize, Serialize)] +#[derive(Debug, Deserialize, Serialize)] pub struct InstallConfig { pub autoreboot: usize, -- 2.47.0 _______________________________________________ pve-devel mailing list pve-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel