From: Lukas Wagner <l.wagner@proxmox.com>
To: pve-devel@lists.proxmox.com
Subject: [pve-devel] [PATCH proxmox] sendmail: fix test failures outside CET/CEST timezones
Date: Mon, 26 May 2025 15:42:11 +0200 [thread overview]
Message-ID: <20250526134211.278900-1-l.wagner@proxmox.com> (raw)
The `Date` header in the generated email includes a timestamp with a
time zone offset (RFC 2822 format). This causes test failures when the
host system's time zone differs from CET/CEST, as the expected and
actual outputs no longer match.
As a workaround, the `Date` header is excluded from comparisons between
the generated and reference emails.
Signed-off-by: Lukas Wagner <l.wagner@proxmox.com>
---
proxmox-sendmail/src/lib.rs | 66 +++++++++++++++++++++++--------------
1 file changed, 42 insertions(+), 24 deletions(-)
diff --git a/proxmox-sendmail/src/lib.rs b/proxmox-sendmail/src/lib.rs
index d9c16c4f..053fc98e 100644
--- a/proxmox-sendmail/src/lib.rs
+++ b/proxmox-sendmail/src/lib.rs
@@ -490,6 +490,24 @@ impl<'a> Mail<'a> {
mod test {
use super::*;
+ /// Compare two multi-line strings, ignoring any line that starts with 'Date:'.
+ ///
+ /// The `Date` header is formatted in the local timezone, which means our
+ /// tests are sensitive to the timezone of the machine running the tests.
+ /// Simplest solution is to just ignore the date header.
+ fn assert_lines_equal_ignore_date(s1: &str, s2: &str) {
+ let lines1 = s1.lines();
+ let lines2 = s2.lines();
+
+ for (line1, line2) in lines1.zip(lines2) {
+ if !(line1.starts_with("Date:") && line2.starts_with("Date:")) {
+ assert_eq!(line1, line2);
+ }
+ }
+
+ assert_eq!(s1.lines().count(), s2.lines().count());
+ }
+
#[test]
fn email_without_recipients_fails() {
let result = Mail::new("Sender", "mail@example.com", "hi", "body").send();
@@ -515,8 +533,8 @@ mod test {
let body = mail.format_mail(0).expect("could not format mail");
- assert_eq!(
- body,
+ assert_lines_equal_ignore_date(
+ &body,
r#"Subject: Subject Line
From: Sender Name <mailfrom@example.com>
To: Receiver Name <receiver@example.com>
@@ -527,7 +545,7 @@ Content-Type: text/plain;
Content-Transfer-Encoding: 8bit
This is just ascii text.
-Nothing too special."#
+Nothing too special."#,
)
}
@@ -545,8 +563,8 @@ Nothing too special."#
let body = mail.format_mail(0).expect("could not format mail");
- assert_eq!(
- body,
+ assert_lines_equal_ignore_date(
+ &body,
r#"Subject: Subject Line
From: Sender Name <mailfrom@example.com>
To: Undisclosed <noreply>
@@ -557,7 +575,7 @@ Content-Type: text/plain;
Content-Transfer-Encoding: 8bit
This is just ascii text.
-Nothing too special."#
+Nothing too special."#,
)
}
@@ -576,8 +594,8 @@ Nothing too special."#
let body = mail.format_mail(0).expect("could not format mail");
- assert_eq!(
- body,
+ assert_lines_equal_ignore_date(
+ &body,
r#"MIME-Version: 1.0
Subject: Subject Line
From: Sender Name <mailfrom@example.com>
@@ -589,7 +607,7 @@ Content-Type: text/plain;
Content-Transfer-Encoding: 8bit
This is just ascii text.
-Nothing too special."#
+Nothing too special."#,
)
}
@@ -605,8 +623,8 @@ Nothing too special."#
let body = mail.format_mail(1732806251).expect("could not format mail");
- assert_eq!(
- body,
+ assert_lines_equal_ignore_date(
+ &body,
r#"MIME-Version: 1.0
Subject: =?utf-8?B?U3ViamVjdCBMaW5lIPCfp5E=?=
From: =?utf-8?B?VVRGLTggU2VuZGVyIE5hbWUg8J+Tpw==?= <differentfrom@example.com>
@@ -620,7 +638,7 @@ Content-Transfer-Encoding: 8bit
This utf-8 email should handle emojis
🧑📧
and weird german characters: öäüß
-and more."#
+and more."#,
)
}
@@ -635,8 +653,8 @@ and more."#
.with_recipient("receiver@example.com")
.with_html_alt("<html lang=\"de-at\"><head></head><body>\n\t<pre>\n\t\tLorem Ipsum Dolor Sit Amet\n\t</pre>\n</body></html>");
let body = mail.format_mail(1732806251).expect("could not format mail");
- assert_eq!(
- body,
+ assert_lines_equal_ignore_date(
+ &body,
r#"Content-Type: multipart/alternative;
boundary="----_=_NextPart_002_1732806251"
MIME-Version: 1.0
@@ -665,7 +683,7 @@ Content-Transfer-Encoding: 8bit
Lorem Ipsum Dolor Sit Amet
</pre>
</body></html>
-------_=_NextPart_002_1732806251--"#
+------_=_NextPart_002_1732806251--"#,
)
}
@@ -689,8 +707,8 @@ Content-Transfer-Encoding: 8bit
.with_attachment("deadbeef.bin", "application/octet-stream", &bin);
let body = mail.format_mail(1732806251).expect("could not format mail");
- assert_eq!(
- body,
+ assert_lines_equal_ignore_date(
+ &body,
r#"Content-Type: multipart/mixed;
boundary="----_=_NextPart_001_1732806251"
MIME-Version: 1.0
@@ -716,7 +734,7 @@ Content-Transfer-Encoding: base64
3q2+796tvu/erb7v3q3erb7v3q2+796tvu/erd6tvu/erb7v3q2+796t3q2+796tvu/erb7v
3q2+796tvu8=
-------_=_NextPart_001_1732806251--"#
+------_=_NextPart_001_1732806251--"#,
)
}
@@ -743,8 +761,8 @@ Content-Transfer-Encoding: base64
let body = mail.format_mail(1732806251).expect("could not format mail");
- assert_eq!(
- body,
+ assert_lines_equal_ignore_date(
+ &body,
r#"Content-Type: multipart/mixed;
boundary="----_=_NextPart_001_1732806251"
MIME-Version: 1.0
@@ -792,7 +810,7 @@ Content-Transfer-Encoding: base64
3q2+796tvu/erb7v3q3erb7v3q2+796tvu/erd6tvu/erb7v3q2+796t3q2+796tvu/erb7v
3q2+796tvu8=
-------_=_NextPart_001_1732806251--"#
+------_=_NextPart_001_1732806251--"#,
)
}
@@ -809,8 +827,8 @@ Content-Transfer-Encoding: base64
let body = mail.format_mail(1718977850).expect("could not format mail");
- assert_eq!(
- body,
+ assert_lines_equal_ignore_date(
+ &body,
r#"Content-Type: multipart/alternative;
boundary="----_=_NextPart_002_1718977850"
MIME-Version: 1.0
@@ -834,7 +852,7 @@ Content-Type: text/html;
Content-Transfer-Encoding: 8bit
<body>This is the HTML body</body>
-------_=_NextPart_002_1718977850--"#
+------_=_NextPart_002_1718977850--"#,
);
}
}
--
2.39.5
_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel
next reply other threads:[~2025-05-26 13:42 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-05-26 13:42 Lukas Wagner [this message]
2025-05-26 15:17 ` [pve-devel] applied: " Thomas Lamprecht
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250526134211.278900-1-l.wagner@proxmox.com \
--to=l.wagner@proxmox.com \
--cc=pve-devel@lists.proxmox.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal