Add an integration test based on an existing LDNS test.

This commit is contained in:
Ximon Eighteen
2024-12-05 10:59:56 +01:00
parent 09e0732065
commit e2810b218d
8 changed files with 213 additions and 55 deletions
Generated
+28 -1
View File
@@ -253,6 +253,26 @@ dependencies = [
"crossbeam-utils",
]
[[package]]
name = "const_format"
version = "0.2.33"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "50c655d81ff1114fb0dcdea9225ea9f0cc712a6f8d189378e82bdf62a473a64b"
dependencies = [
"const_format_proc_macros",
]
[[package]]
name = "const_format_proc_macros"
version = "0.2.33"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "eff1a44b93f47b1bac19a27932f5c591e43d1ba357ee4f61526c8a25603f0eb1"
dependencies = [
"proc-macro2",
"quote",
"unicode-xid",
]
[[package]]
name = "core-foundation-sys"
version = "0.8.7"
@@ -299,6 +319,7 @@ dependencies = [
"bytes",
"chrono",
"clap",
"const_format",
"domain",
"lazy_static",
"lexopt",
@@ -313,7 +334,7 @@ dependencies = [
[[package]]
name = "domain"
version = "0.10.3"
source = "git+https://github.com/NLnetLabs/domain?branch=sortedrecords-zonemd-remove-replace-plus-pr444#7aac5ed30141a9fb53c63a27a148104d2821d5ae"
source = "git+https://github.com/NLnetLabs/domain?branch=sortedrecords-zonemd-remove-replace-plus-pr444#93259567c56c88b4690a0bbfb07595cb1961af25"
dependencies = [
"arc-swap",
"bytes",
@@ -1224,6 +1245,12 @@ version = "1.0.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83"
[[package]]
name = "unicode-xid"
version = "0.2.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853"
[[package]]
name = "untrusted"
version = "0.9.0"
+2
View File
@@ -39,6 +39,7 @@ lexopt = "0.3.0"
octseq = "0.5.2"
ring = "0.17.8"
tokio = "1.40.0"
#tracing-subscriber = { version = "0.3.19", features = ["env-filter"] }
# This is a workaround. lazy_static 1.0.0 fails to compile, but sharded-slab
# still uses it. And sharded-slab is used by tracing-subscriber, which is
@@ -46,6 +47,7 @@ tokio = "1.40.0"
_unused_lazy_static = { package = "lazy_static", version = "1.0.2" }
[dev-dependencies]
const_format = " 0.2.33"
test_bin = "0.4.0"
tempfile = "3.14.0"
regex = "1.11.1"
@@ -0,0 +1 @@
jelte.nlnetlabs.nl. IN DNSKEY 256 3 8 AwEAAbmZNEjurnAH9aav6UEJsoMWoTx/gGRd92xGrrVPC/JzDxL3Ksw8MkReNZGke1ChRnbIQ2f04yj8K5G9OjK/fxBh3J32G7IXdQHWQReBf4oxT1ReQXnZZ3FkiCqgkq5fsAlhO7KQBVSKAVCF17Cso8HAoyQSU6dwKbG27472OhOygEf/knw4nKo+VQpnK90dhs4NikHCI1veo+qd5Q3bFxWIJTWc0LwcWOGYcKZVzkZPCANqFCKANPXGdcqH+bTeAeVHzvM9oaXvseL9TjY5LBg+CMDRSfQv8tpIBk/iBoagDKJ3R8LdUF6SjH3ICVIprbXep98FaB1ZStowgOKPbCc=
@@ -0,0 +1,10 @@
Private-key-format: v1.2
Algorithm: 8 (RSASHA256)
Modulus: uZk0SO6ucAf1pq/pQQmygxahPH+AZF33bEautU8L8nMPEvcqzDwyRF41kaR7UKFGdshDZ/TjKPwrkb06Mr9/EGHcnfYbshd1AdZBF4F/ijFPVF5BedlncWSIKqCSrl+wCWE7spAFVIoBUIXXsKyjwcCjJBJTp3ApsbbvjvY6E7KAR/+SfDicqj5VCmcr3R2Gzg2KQcIjW96j6p3lDdsXFYglNZzQvBxY4ZhwplXORk8IA2oUIoA09cZ1yof5tN4B5UfO8z2hpe+x4v1ONjksGD4IwNFJ9C/y2kgGT+IGhqAMondHwt1QXpKMfcgJUimttd6n3wVoHVlK2jCA4o9sJw==
PublicExponent: AQAB
PrivateExponent: Cr+NQEQCT3PxN/asAsY1qP3LLJ5oUxJWB9aNZkFDpzDJSLHjr/GJ1QfCVm2OGVHzALdW9VLrQi5dtOeefTM11T8K8GLroQQBagUnE94TWBoZnACGuNsW8IF/7pK0q+stXf2xiq+91J2BYfu+TU781Mr70lT1X0Gm8ycYTHvZ9StMZWEcsT1dOJ00axMXyDtwvAleoBbdPWgEp1Q8HWTEPL8ve6bEPUeINvhovuq+bqL1L0wFL7kwSOez6HTrUEv7WqYmC9eE0MIWAVRfLEQHkgTMnnc6yNP7soPLIhXp1+r8B6innOTx2ZRrza+PjZaf7aDfPsBAbNmxg6ru9OCyIQ==
Prime1: +TBbSkr5BDS88V+XI/metoiZca8Y+E4JfoLeNtVgTcFa72Fp/jNvUTi5/eKb9cjf5bYyZvUI6NefkwOLtWx1PnwH2s9d/LcdOM5OSTOlco/um+t7rM9opgp4w5ZpWd8JMA1YjSOod38ngM47B9myjTuDn/h/Xv/+PV35XUx4bO8=
Prime2: vqvjRtHS1UGslBQRzjImqDIQw1nbN6BuhrbJYtXOc23Bz/dNIsC4h9+B4R2D+Tkf6c4l4beJMaAnXuB4ngvAKKKpcgy+o4Utew3HOSEeamLq1bPBAHkV9S50oUEc2wcLYD+5vHN13WyNiEiSuRXW8LSUWbjH1Wrqp38+M6cFZEk=
Exponent1: DqhghlM4qJ2ti4ky68PQKS6J0B0bm+eDOXTbO2B7xLcd8TzKrlA6OQ3cKun8gI2rVejMuC+rsX6VfWFVA3v4vY8wKxfNkIL47hF8m2O1VLLQt003vieJIVM2XVLoqYesE66FSfASBc1t9m6rHEAa96HLkUpdu6nVO6jedTV9U/M=
Exponent2: nWoXVy5/W2S+7/mpwYwR8iZzRHR40XH4Dev2U0ylBxMEQYev/RMSxco21f2iKS2KNWLmT3VRJNFN77xumDynRmUUc34mHaYjqEX1xiqbi8Vij0+59YQCJstVqpOxGPq135583yKLmmS2bF9OEtP/AfZzy6cMBBwi4mnglpA7mVE=
Coefficient: vO61lIEOgDwn5xR/OOrxt3N0fbGPHNB+DcW5p58tgkyeVLKHk12Lzs2pSzJ2hLuw1u9FMkDb/2fahMJY0BHHi6AphEA+CVPDAwEBsnSeQvQlkaSrCyRoimVrxT8Cdie1DOncC3h3jzfvGkY5ppBMNks1FjErIJZCN+g70CiKQw==
+34
View File
@@ -0,0 +1,34 @@
; loosely based on jelte.nlnetlabs.nl.
jelte.nlnetlabs.nl. 3600 IN SOA ns.jelte.nlnetlabs.nl. jelte.jelte.nlnetlabs.nl. 808 28800 7200 604800 3600
jelte.nlnetlabs.nl. 3600 IN NS ns.jelte.nlnetlabs.nl.
jelte.nlnetlabs.nl. 3600 IN NS ext.ns.whyscream.net.
jelte.nlnetlabs.nl. 3600 IN NS ns-ext.nlnetlabs.nl.
jelte.nlnetlabs.nl. 3600 IN A 178.18.82.80
jelte.nlnetlabs.nl. 60 IN MX 10 smtp.jelte.nlnetlabs.nl.
jelte.nlnetlabs.nl. 3600 IN AAAA 2a02:348:55:5250::80
jelte.nlnetlabs.nl. 0 IN TYPE65534 \# 5 0846480001
dnssec.jelte.nlnetlabs.nl. 3600 IN NS ns2.jelte.nlnetlabs.nl.
dnssec.jelte.nlnetlabs.nl. 3600 IN DS 8340 5 1 5733A59841EA708AE9223822124B07B555E17332
dragon.jelte.nlnetlabs.nl. 1234 IN AAAA 2002:c3a9:dd9d:8:219:d1ff:fe81:5c10
git.jelte.nlnetlabs.nl. 3600 IN AAAA 2a02:348:55:5250::80
git.jelte.nlnetlabs.nl. 3600 IN A 178.18.82.80
imap.jelte.nlnetlabs.nl. 3600 IN A 178.18.82.80
nepmail.jelte.nlnetlabs.nl. 3600 IN MX 10 mirre.nlnetlabs.nl.
ns.jelte.nlnetlabs.nl. 3600 IN A 178.18.82.80
ns.jelte.nlnetlabs.nl. 3600 IN AAAA 2a02:348:55:5250::53
ns-ext.jelte.nlnetlabs.nl. 3600 IN A 178.18.82.80
ns2.jelte.nlnetlabs.nl. 3600 IN A 195.169.221.157
ns2.jelte.nlnetlabs.nl. 3600 IN AAAA 2002:c3a9:dd9d:1::1
nsec3.jelte.nlnetlabs.nl. 3600 IN NS ns2.jelte.nlnetlabs.nl.
nsec3.jelte.nlnetlabs.nl. 3600 IN DS 21665 7 1 8D5E7DEDC1501A38009882DD1508246EB4A2251C
smtp.jelte.nlnetlabs.nl. 3600 IN A 178.18.82.80
svn.jelte.nlnetlabs.nl. 3600 IN A 178.18.82.80
talon.jelte.nlnetlabs.nl. 3600 IN A 195.169.221.157
v6.jelte.nlnetlabs.nl. 3600 IN AAAA 2002:c3a9:dd9d:1::1
vps.jelte.nlnetlabs.nl. 3600 IN A 178.18.82.80
vpsv6.jelte.nlnetlabs.nl. 3600 IN AAAA 2a02:348:55:5250::1
www.jelte.nlnetlabs.nl. 3600 IN A 178.18.82.80
www.jelte.nlnetlabs.nl. 3600 IN AAAA 2a02:348:55:5250::80
wwwv6.jelte.nlnetlabs.nl. 3600 IN AAAA 2a02:348:55:5250::80
+62
View File
@@ -0,0 +1,62 @@
use std::process::Command;
pub fn assert_org_ldns_cmd_eq_new_ldns_cmd(
org_ldns_cmd: &[&str],
new_ldns_cmd: &[&str],
expect_stdout_content: bool,
) {
let org_ldns_cmd_out = Command::new(org_ldns_cmd[0])
.args(&org_ldns_cmd[1..])
.output()
.unwrap();
let new_ldns_cmd_out = test_bin::get_test_bin("ldns")
.args(new_ldns_cmd)
.output()
.unwrap();
assert_eq!(
std::str::from_utf8(&org_ldns_cmd_out.stderr),
Ok(""),
"Unexpected stderr content for original ldns command: {}",
org_ldns_cmd.join(" ")
);
assert_eq!(
std::str::from_utf8(&new_ldns_cmd_out.stderr),
Ok(""),
"Unexpected stderr content for reimplemented ldns command: {}",
new_ldns_cmd.join(" ")
);
if expect_stdout_content {
assert!(
!org_ldns_cmd_out.stdout.is_empty(),
"Expected stdout content for original ldns command: {}: {:?}",
org_ldns_cmd.join(" "),
std::str::from_utf8(&org_ldns_cmd_out.stdout)
);
assert!(
!new_ldns_cmd_out.stdout.is_empty(),
"Expected stdout content for reimplemented ldns command: {}: {:?}",
new_ldns_cmd.join(" "),
std::str::from_utf8(&new_ldns_cmd_out.stdout)
);
}
assert_eq!(
org_ldns_cmd_out.status.code(),
new_ldns_cmd_out.status.code(),
"Exit code mismatch for original ldns command: {}",
org_ldns_cmd.join(" ")
);
// This will only work for LDNS commands whose output we are able to
// replicate exactly.
assert_eq!(
std::str::from_utf8(&org_ldns_cmd_out.stdout),
std::str::from_utf8(&new_ldns_cmd_out.stdout),
"Stdout content mismatch for original ldns command: {}",
{
eprintln!("{}", std::str::from_utf8(&new_ldns_cmd_out.stdout).unwrap());
org_ldns_cmd.join(" ")
}
);
}
+16 -54
View File
@@ -1,23 +1,27 @@
use std::process::Command;
mod common;
use common::assert_org_ldns_cmd_eq_new_ldns_cmd;
const TEST_ZONE_NAME: &str = "nlnetlabs.nl";
const LDNS_NSEC3_CMD: &str = "ldns-nsec3-hash";
const DNST_NSEC3_SUBCMD: &str = "nsec3-hash";
const TEST_ZONE_NAME: &str = "nlnetlabs.nl";
#[ignore = "should only be run if ldns command line tools are installed"]
#[test]
fn nsec3_hash() {
// Note: ldns-nsec3-hash defaults NSEC3 iterations to 1, while dnst
// nsec-hash defaults NSEC3 iterations to 0.
assert_cmds_eq(
assert_org_ldns_cmd_eq_new_ldns_cmd(
&[LDNS_NSEC3_CMD, TEST_ZONE_NAME],
&[DNST_NSEC3_SUBCMD, "--iterations", "1", TEST_ZONE_NAME],
true,
);
assert_cmds_eq(
assert_org_ldns_cmd_eq_new_ldns_cmd(
&[LDNS_NSEC3_CMD, TEST_ZONE_NAME, "-t", "0"],
&[DNST_NSEC3_SUBCMD, TEST_ZONE_NAME],
true,
);
assert_cmds_eq(
assert_org_ldns_cmd_eq_new_ldns_cmd(
&[LDNS_NSEC3_CMD, "-a", "1", TEST_ZONE_NAME],
&[
DNST_NSEC3_SUBCMD,
@@ -27,8 +31,9 @@ fn nsec3_hash() {
"1",
TEST_ZONE_NAME,
],
true,
);
assert_cmds_eq(
assert_org_ldns_cmd_eq_new_ldns_cmd(
&[LDNS_NSEC3_CMD, "-s", "", TEST_ZONE_NAME],
&[
DNST_NSEC3_SUBCMD,
@@ -38,8 +43,9 @@ fn nsec3_hash() {
"",
TEST_ZONE_NAME,
],
true,
);
assert_cmds_eq(
assert_org_ldns_cmd_eq_new_ldns_cmd(
&[LDNS_NSEC3_CMD, "-s", "DEADBEEF", TEST_ZONE_NAME],
&[
DNST_NSEC3_SUBCMD,
@@ -49,10 +55,11 @@ fn nsec3_hash() {
"DEADBEEF",
TEST_ZONE_NAME,
],
true,
);
for iterations in 0..10 {
assert_cmds_eq(
assert_org_ldns_cmd_eq_new_ldns_cmd(
&[
LDNS_NSEC3_CMD,
"-t",
@@ -65,52 +72,7 @@ fn nsec3_hash() {
&iterations.to_string(),
TEST_ZONE_NAME,
],
true,
);
}
}
fn assert_cmds_eq(cmd1: &[&str], cmd2: &[&str]) {
let cmd1_output = Command::new(cmd1[0]).args(&cmd1[1..]).output().unwrap();
let cmd2_output = test_bin::get_test_bin("dnst").args(cmd2).output().unwrap();
assert_eq!(
std::str::from_utf8(&cmd1_output.stderr),
Ok(""),
"Unexpected stderr content for command: {}",
cmd1.join(" ")
);
assert_eq!(
std::str::from_utf8(&cmd2_output.stderr),
Ok(""),
"Unexpected stderr content for command: {}",
cmd2.join(" ")
);
assert!(
!cmd1_output.stdout.is_empty(),
"Expected stdout content for command: {}: {:?}",
cmd1.join(" "),
std::str::from_utf8(&cmd1_output.stdout)
);
assert!(
!cmd2_output.stdout.is_empty(),
"Expected stdout content for command: {}: {:?}",
cmd2.join(" "),
std::str::from_utf8(&cmd2_output.stdout)
);
assert_eq!(
cmd1_output.status.code(),
cmd2_output.status.code(),
"Exit code mismatch for command: {}",
cmd1.join(" ")
);
// This will only work for LDNS commands whose output we are able to
// replicate exactly.
assert_eq!(
std::str::from_utf8(&cmd1_output.stdout),
std::str::from_utf8(&cmd2_output.stdout),
"Stdout content mismatch for command: {}",
cmd1.join(" ")
);
}
+60
View File
@@ -0,0 +1,60 @@
// Based on: https://github.com/NLnetLabs/ldns/tree/1.8.4/test/20-sign-zone.tpkg
// But uses a newer algorithm as algorithm 5 is not supported by DNST.
mod common;
use common::assert_org_ldns_cmd_eq_new_ldns_cmd;
use const_format::concatcp;
use std::process::Command;
use tempfile::tempdir;
const LDNS_CMD: &str = "ldns-signzone";
const TEST_DATA_DIR: &str = "test-data/";
const TEST_ZONE_PATH: &str = concatcp!(TEST_DATA_DIR, "jelte.nlnetlabs.nl");
const KEY_FILE_BASE_PATH: &str = concatcp!(TEST_DATA_DIR, "Kjelte.nlnetlabs.nl.+008+19779");
#[ignore = "should only be run if ldns command line tools are installed"]
#[test]
fn signzone() {
let temp_dir = tempdir().unwrap().into_path();
let ldns_out_path = format!("{}/ldns.signed", temp_dir.display());
let dnst_out_path = format!("{}/dnst.signed", temp_dir.display());
assert_org_ldns_cmd_eq_new_ldns_cmd(
&[
LDNS_CMD,
"-b",
"-f",
&ldns_out_path,
TEST_ZONE_PATH,
KEY_FILE_BASE_PATH,
],
&[
LDNS_CMD,
"-b",
"-f",
&dnst_out_path,
TEST_ZONE_PATH,
KEY_FILE_BASE_PATH,
],
false,
);
let verify_output = Command::new("ldns-verify-zone")
.args(&[&dnst_out_path])
.output()
.unwrap();
if !verify_output.status.success() {
eprintln!(
"ldns-verify-zone failed with exit code {:?} and stderr output:\n{}",
verify_output.status.code(),
std::str::from_utf8(&verify_output.stderr).unwrap()
);
}
assert!(
verify_output.status.success(),
"Expected zone verification to succeed"
);
}