From 807d01ee215e9b4611445476bf703f1ca9e5dda1 Mon Sep 17 00:00:00 2001 From: Mechiel Lukkien Date: Wed, 29 Jan 2025 21:11:39 +0100 Subject: [PATCH] simplify/cleanup common smtpserver test code --- smtpserver/alias_test.go | 112 ++++-------- smtpserver/server_test.go | 376 ++++++++++++-------------------------- 2 files changed, 153 insertions(+), 335 deletions(-) diff --git a/smtpserver/alias_test.go b/smtpserver/alias_test.go index e0ebc3880a..8d70bebabd 100644 --- a/smtpserver/alias_test.go +++ b/smtpserver/alias_test.go @@ -30,23 +30,17 @@ Subject: test test email `, "\n", "\r\n") - ts.run(func(err error, client *smtpclient.Client) { - t.Helper() + ts.run(func(client *smtpclient.Client) { mailFrom := "mjl@mox.example" rcptTo := "public@mox.example" - if err == nil { - err = client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(msg)), strings.NewReader(msg), false, false, false) - } + err := client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(msg)), strings.NewReader(msg), false, false, false) ts.smtpErr(err, nil) }) - ts.run(func(err error, client *smtpclient.Client) { - t.Helper() + ts.run(func(client *smtpclient.Client) { mailFrom := "public@mox.example" // List address as smtp mail from. rcptTo := "public@mox.example" - if err == nil { - err = client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(msg)), strings.NewReader(msg), false, false, false) - } + err := client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(msg)), strings.NewReader(msg), false, false, false) ts.smtpErr(err, nil) }) @@ -57,23 +51,17 @@ Subject: test test email `, "\n", "\r\n") - ts.run(func(err error, client *smtpclient.Client) { - t.Helper() + ts.run(func(client *smtpclient.Client) { mailFrom := "mjl@mox.example" rcptTo := "private@mox.example" - if err == nil { - err = client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(msg)), strings.NewReader(msg), false, false, false) - } + err := client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(msg)), strings.NewReader(msg), false, false, false) ts.smtpErr(err, &smtpclient.Error{Permanent: true, Code: smtp.C550MailboxUnavail, Secode: smtp.SePol7DeliveryUnauth1}) }) - ts.run(func(err error, client *smtpclient.Client) { - t.Helper() + ts.run(func(client *smtpclient.Client) { mailFrom := "private@mox.example" // List address as smtp mail from. rcptTo := "private@mox.example" - if err == nil { - err = client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(msg)), strings.NewReader(msg), false, false, false) - } + err := client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(msg)), strings.NewReader(msg), false, false, false) ts.smtpErr(err, &smtpclient.Error{Permanent: true, Code: smtp.C550MailboxUnavail, Secode: smtp.SePol7DeliveryUnauth1}) }) } @@ -108,23 +96,17 @@ Subject: test test email `, "\n", "\r\n") - ts.run(func(err error, client *smtpclient.Client) { - t.Helper() + ts.run(func(client *smtpclient.Client) { mailFrom := "☺@mox.example" rcptTo := "public@mox.example" - if err == nil { - err = client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(msg)), strings.NewReader(msg), true, true, false) - } + err := client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(msg)), strings.NewReader(msg), true, true, false) ts.smtpErr(err, &smtpclient.Error{Permanent: true, Code: smtp.C550MailboxUnavail, Secode: smtp.SePol7DeliveryUnauth1}) }) - ts.run(func(err error, client *smtpclient.Client) { - t.Helper() + ts.run(func(client *smtpclient.Client) { mailFrom := "public@mox.example" // List address as message from. rcptTo := "public@mox.example" - if err == nil { - err = client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(msg)), strings.NewReader(msg), true, true, false) - } + err := client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(msg)), strings.NewReader(msg), true, true, false) ts.smtpErr(err, &smtpclient.Error{Permanent: true, Code: smtp.C550MailboxUnavail, Secode: smtp.SePol7DeliveryUnauth1}) }) } @@ -148,13 +130,10 @@ To: test email `, "\n", "\r\n") - ts.run(func(err error, client *smtpclient.Client) { - t.Helper() + ts.run(func(client *smtpclient.Client) { mailFrom := "other@example.org" rcptTo := "private@mox.example" - if err == nil { - err = client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(msg)), strings.NewReader(msg), false, false, false) - } + err := client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(msg)), strings.NewReader(msg), false, false, false) ts.smtpErr(err, &smtpclient.Error{Permanent: true, Code: smtp.C550MailboxUnavail, Secode: smtp.SePol7ExpnProhibited2}) }) @@ -164,13 +143,10 @@ To: test email `, "\n", "\r\n") - ts.run(func(err error, client *smtpclient.Client) { - t.Helper() + ts.run(func(client *smtpclient.Client) { mailFrom := "private@example.org" rcptTo := "private@mox.example" - if err == nil { - err = client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(msg)), strings.NewReader(msg), false, false, false) - } + err := client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(msg)), strings.NewReader(msg), false, false, false) ts.smtpErr(err, &smtpclient.Error{Permanent: true, Code: smtp.C550MailboxUnavail, Secode: smtp.SePol7ExpnProhibited2}) }) @@ -181,25 +157,19 @@ Subject: test test email `, "\n", "\r\n") - ts.run(func(err error, client *smtpclient.Client) { - t.Helper() + ts.run(func(client *smtpclient.Client) { mailFrom := "other@example.org" rcptTo := "public@mox.example" - if err == nil { - err = client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(msg)), strings.NewReader(msg), false, false, false) - } + err := client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(msg)), strings.NewReader(msg), false, false, false) ts.smtpErr(err, nil) ts.checkCount("Inbox", 2) // Receiving for both mjl@ and móx@. }) - ts.run(func(err error, client *smtpclient.Client) { - t.Helper() + ts.run(func(client *smtpclient.Client) { mailFrom := "public@example.org" // List address as message from. rcptTo := "public@mox.example" - if err == nil { - err = client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(msg)), strings.NewReader(msg), false, false, false) - } + err := client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(msg)), strings.NewReader(msg), false, false, false) ts.smtpErr(err, nil) ts.checkCount("Inbox", 4) // Receiving for both mjl@ and móx@. @@ -229,24 +199,20 @@ To: test email `, "\n", "\r\n") - ts.run(func(err error, client *smtpclient.Client) { + ts.run(func(client *smtpclient.Client) { mailFrom := "mjl@mox.example" rcptTo := []string{"private@mox.example", "móx@mox.example"} - if err == nil { - _, err = client.DeliverMultiple(ctxbg, mailFrom, rcptTo, int64(len(msg)), strings.NewReader(msg), true, true, false) - // assuming there wasn't a per-recipient error - } + _, err := client.DeliverMultiple(ctxbg, mailFrom, rcptTo, int64(len(msg)), strings.NewReader(msg), true, true, false) + // assuming there wasn't a per-recipient error ts.smtpErr(err, nil) ts.checkCount("Inbox", 1) // Receiving once. For explicit móx@ recipient, not for mjl@ due to msgfrom, and another again for móx@ due to rcpt to. }) - ts.run(func(err error, client *smtpclient.Client) { + ts.run(func(client *smtpclient.Client) { mailFrom := "mjl@mox.example" rcptTo := "private@mox.example" - if err == nil { - err = client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(msg)), strings.NewReader(msg), false, false, false) - } + err := client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(msg)), strings.NewReader(msg), false, false, false) ts.smtpErr(err, nil) ts.checkCount("Inbox", 2) // Only receiving 1 new message compared to previous, for móx@mox.example, not mjl@. @@ -259,13 +225,10 @@ Subject: test test email `, "\n", "\r\n") - ts.run(func(err error, client *smtpclient.Client) { - t.Helper() + ts.run(func(client *smtpclient.Client) { mailFrom := "other@mox.example" rcptTo := "private@mox.example" - if err == nil { - err = client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(msg)), strings.NewReader(msg), false, false, false) - } + err := client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(msg)), strings.NewReader(msg), false, false, false) ts.smtpErr(err, &smtpclient.Error{Permanent: true, Code: smtp.C550MailboxUnavail, Secode: smtp.SePol7ExpnProhibited2}) }) @@ -276,13 +239,10 @@ Subject: test test email `, "\n", "\r\n") - ts.run(func(err error, client *smtpclient.Client) { - t.Helper() + ts.run(func(client *smtpclient.Client) { mailFrom := "mjl@mox.example" rcptTo := "public@mox.example" - if err == nil { - err = client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(msg)), strings.NewReader(msg), false, false, false) - } + err := client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(msg)), strings.NewReader(msg), false, false, false) ts.smtpErr(err, nil) }) } @@ -309,13 +269,10 @@ To: test email `, "\n", "\r\n") - ts.run(func(err error, client *smtpclient.Client) { - t.Helper() + ts.run(func(client *smtpclient.Client) { mailFrom := "mjl@mox.example" rcptTo := "private@mox.example" - if err == nil { - err = client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(msg)), strings.NewReader(msg), false, false, false) - } + err := client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(msg)), strings.NewReader(msg), false, false, false) ts.smtpErr(err, nil) ts.checkCount("Inbox", 1) // Only receiving for móx@mox.example, not mjl@. @@ -327,13 +284,10 @@ test email tcheck(t, err, "mark as junk") tcompare(t, n, 1) - ts.run(func(err error, client *smtpclient.Client) { - t.Helper() + ts.run(func(client *smtpclient.Client) { mailFrom := "mjl@mox.example" rcptTo := "private@mox.example" - if err == nil { - err = client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(msg)), strings.NewReader(msg), false, false, false) - } + err := client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(msg)), strings.NewReader(msg), false, false, false) ts.smtpErr(err, &smtpclient.Error{Code: smtp.C451LocalErr, Secode: smtp.SeSys3Other0}) }) } diff --git a/smtpserver/server_test.go b/smtpserver/server_test.go index 35cf15181d..490f0dbc1a 100644 --- a/smtpserver/server_test.go +++ b/smtpserver/server_test.go @@ -187,7 +187,16 @@ func (ts *testserver) checkCount(mailboxName string, expect int) { } } -func (ts *testserver) run(fn func(helloErr error, client *smtpclient.Client)) { +func (ts *testserver) run(fn func(client *smtpclient.Client)) { + ts.t.Helper() + ts.runx(func(helloErr error, client *smtpclient.Client) { + ts.t.Helper() + tcheck(ts.t, helloErr, "hello") + fn(client) + }) +} + +func (ts *testserver) runx(fn func(helloErr error, client *smtpclient.Client)) { ts.t.Helper() ts.runRaw(func(conn net.Conn) { ts.t.Helper() @@ -240,13 +249,14 @@ func (ts *testserver) runRaw(fn func(clientConn net.Conn)) { fn(clientConn) } -func (ts *testserver) smtpErr(err error, expErr *smtpclient.Error) { +func (ts *testserver) smtpErr(err error, expErr *smtpclient.Error) *smtpclient.Error { t := ts.t t.Helper() var cerr smtpclient.Error if expErr == nil && err != nil || expErr != nil && (err == nil || !errors.As(err, &cerr) || cerr.Permanent != expErr.Permanent || cerr.Code != expErr.Code || cerr.Secode != expErr.Secode) { t.Fatalf("got err:\n%#v (%q)\nexpected:\n%#v", err, err, expErr) } + return &cerr } // Just a cert that appears valid. SMTP client will not verify anything about it @@ -317,8 +327,7 @@ func TestSubmission(t *testing.T) { } else { ts.auth = nil } - ts.run(func(err error, client *smtpclient.Client) { - t.Helper() + ts.runx(func(err error, client *smtpclient.Client) { mailFrom := "mjl@mox.example" rcptTo := "remote@example.org" if err == nil { @@ -483,16 +492,11 @@ func TestDomainDisabled(t *testing.T) { ts.pass = password0 // Submission with SMTP MAIL FROM of disabled domain must fail. - ts.run(func(err error, client *smtpclient.Client) { + ts.run(func(client *smtpclient.Client) { mailFrom := "mjl@disabled.example" // Disabled. rcptTo := "remote@example.org" - if err == nil { - err = client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(submitMessage)), strings.NewReader(submitMessage), false, false, false) - } - var cerr smtpclient.Error - if err == nil || !errors.As(err, &cerr) || cerr.Code != smtp.C451LocalErr { - t.Fatalf("got err %v, expected smtpclient.Error with code %d", err, smtp.C451LocalErr) - } + err := client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(submitMessage)), strings.NewReader(submitMessage), false, false, false) + ts.smtpErr(err, &smtpclient.Error{Permanent: false, Code: smtp.C451LocalErr, Secode: smtp.SeSys3Other0}) checkEvaluationCount(t, 0) }) @@ -504,16 +508,11 @@ Message-Id: test email `, "\n", "\r\n") - ts.run(func(err error, client *smtpclient.Client) { + ts.run(func(client *smtpclient.Client) { mailFrom := "mjl@mox.example" rcptTo := "remote@example.org" - if err == nil { - err = client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(submitMessage2)), strings.NewReader(submitMessage2), false, false, false) - } - var cerr smtpclient.Error - if err == nil || !errors.As(err, &cerr) || cerr.Code != smtp.C451LocalErr { - t.Fatalf("got err %v, expected smtpclient.Error with code %d", err, smtp.C451LocalErr) - } + err := client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(submitMessage2)), strings.NewReader(submitMessage2), false, false, false) + ts.smtpErr(err, &smtpclient.Error{Permanent: false, Code: smtp.C451LocalErr, Secode: smtp.SeSys3Other0}) checkEvaluationCount(t, 0) }) } @@ -529,85 +528,55 @@ func TestDelivery(t *testing.T) { ts := newTestServer(t, filepath.FromSlash("../testdata/smtp/mox.conf"), resolver) defer ts.close() - ts.run(func(err error, client *smtpclient.Client) { + ts.run(func(client *smtpclient.Client) { mailFrom := "remote@example.org" rcptTo := "mjl@127.0.0.10" - if err == nil { - err = client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(deliverMessage)), strings.NewReader(deliverMessage), false, false, false) - } - var cerr smtpclient.Error - if err == nil || !errors.As(err, &cerr) || cerr.Code != smtp.C550MailboxUnavail { - t.Fatalf("deliver to ip address, got err %v, expected smtpclient.Error with code %d", err, smtp.C550MailboxUnavail) - } + err := client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(deliverMessage)), strings.NewReader(deliverMessage), false, false, false) + ts.smtpErr(err, &smtpclient.Error{Permanent: true, Code: smtp.C550MailboxUnavail, Secode: smtp.SeAddr1UnknownDestMailbox1}) }) - ts.run(func(err error, client *smtpclient.Client) { + ts.run(func(client *smtpclient.Client) { mailFrom := "remote@example.org" rcptTo := "mjl@test.example" // Not configured as destination. - if err == nil { - err = client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(deliverMessage)), strings.NewReader(deliverMessage), false, false, false) - } - var cerr smtpclient.Error - if err == nil || !errors.As(err, &cerr) || cerr.Code != smtp.C550MailboxUnavail { - t.Fatalf("deliver to unknown domain, got err %v, expected smtpclient.Error with code %d", err, smtp.C550MailboxUnavail) - } + err := client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(deliverMessage)), strings.NewReader(deliverMessage), false, false, false) + ts.smtpErr(err, &smtpclient.Error{Permanent: true, Code: smtp.C550MailboxUnavail, Secode: smtp.SeAddr1UnknownDestMailbox1}) }) - ts.run(func(err error, client *smtpclient.Client) { + ts.run(func(client *smtpclient.Client) { mailFrom := "remote@example.org" rcptTo := "unknown@mox.example" // User unknown. - if err == nil { - err = client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(deliverMessage)), strings.NewReader(deliverMessage), false, false, false) - } - var cerr smtpclient.Error - if err == nil || !errors.As(err, &cerr) || cerr.Code != smtp.C550MailboxUnavail { - t.Fatalf("deliver to unknown user for known domain, got err %v, expected smtpclient.Error with code %d", err, smtp.C550MailboxUnavail) - } + err := client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(deliverMessage)), strings.NewReader(deliverMessage), false, false, false) + ts.smtpErr(err, &smtpclient.Error{Permanent: true, Code: smtp.C550MailboxUnavail, Secode: smtp.SeAddr1UnknownDestMailbox1}) }) - ts.run(func(err error, client *smtpclient.Client) { + ts.run(func(client *smtpclient.Client) { mailFrom := "remote@example.org" rcptTo := "mjl@mox.example" - if err == nil { - err = client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(deliverMessage)), strings.NewReader(deliverMessage), false, false, false) - } - var cerr smtpclient.Error - if err == nil || !errors.As(err, &cerr) || cerr.Code != smtp.C451LocalErr { - t.Fatalf("deliver from user without reputation, valid iprev required, got err %v, expected smtpclient.Error with code %d", err, smtp.C451LocalErr) - } + err := client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(deliverMessage)), strings.NewReader(deliverMessage), false, false, false) + ts.smtpErr(err, &smtpclient.Error{Permanent: false, Code: smtp.C451LocalErr, Secode: smtp.SeSys3Other0}) }) // Set up iprev to get delivery from unknown user to be accepted. resolver.PTR["127.0.0.10"] = []string{"example.org."} // Only ascii o@ is configured, not the greek and cyrillic lookalikes. - ts.run(func(err error, client *smtpclient.Client) { + ts.run(func(client *smtpclient.Client) { mailFrom := "remote@example.org" rcptTo := "ο@mox.example" // omicron \u03bf, looks like the configured o@ msg := strings.ReplaceAll(deliverMessage, "mjl@mox.example", rcptTo) - if err == nil { - err = client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(msg)), strings.NewReader(msg), false, true, false) - } - var cerr smtpclient.Error - if err == nil || !errors.As(err, &cerr) || cerr.Code != smtp.C550MailboxUnavail { - t.Fatalf("deliver to omicron @ instead of ascii o @, got err %v, expected smtpclient.Error with code %d", err, smtp.C550MailboxUnavail) - } + err := client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(msg)), strings.NewReader(msg), false, true, false) + ts.smtpErr(err, &smtpclient.Error{Permanent: true, Code: smtp.C550MailboxUnavail, Secode: smtp.SeAddr1UnknownDestMailbox1}) }) // Deliveries to disabled domain are rejected with temporary error. - ts.run(func(err error, client *smtpclient.Client) { + ts.run(func(client *smtpclient.Client) { mailFrom := "remote@example.org" rcptTo := "mjl@disabled.example" - if err == nil { - err = client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(deliverMessage)), strings.NewReader(deliverMessage), false, false, false) - } - var cerr smtpclient.Error - if err == nil || !errors.As(err, &cerr) || cerr.Code != smtp.C450MailboxUnavail { - t.Fatalf("deliver to disabled domain, got err %v, expected smtpclient.Error with code %d", err, smtp.C450MailboxUnavail) - } + err := client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(deliverMessage)), strings.NewReader(deliverMessage), false, false, false) + ts.smtpErr(err, &smtpclient.Error{Permanent: false, Code: smtp.C450MailboxUnavail, Secode: smtp.SeMailbox2Disabled1}) }) - ts.run(func(err error, client *smtpclient.Client) { + ts.run(func(client *smtpclient.Client) { recipients := []string{ "mjl@mox.example", "o@mox.example", // ascii o, as configured @@ -624,9 +593,7 @@ func TestDelivery(t *testing.T) { msg := strings.ReplaceAll(deliverMessage, "mjl@mox.example", rcptTo) mailFrom := "remote@example.org" - if err == nil { - err = client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(msg)), strings.NewReader(msg), false, true, false) - } + err := client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(msg)), strings.NewReader(msg), false, true, false) tcheck(t, err, "deliver to remote") changes := make(chan []store.Change) @@ -741,16 +708,11 @@ func TestSpam(t *testing.T) { } // Delivery from sender with bad reputation should fail. - ts.run(func(err error, client *smtpclient.Client) { + ts.run(func(client *smtpclient.Client) { mailFrom := "remote@example.org" rcptTo := "mjl@mox.example" - if err == nil { - err = client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(deliverMessage)), strings.NewReader(deliverMessage), false, false, false) - } - var cerr smtpclient.Error - if err == nil || !errors.As(err, &cerr) || cerr.Code != smtp.C451LocalErr { - t.Fatalf("delivery by bad sender, got err %v, expected smtpclient.Error with code %d", err, smtp.C451LocalErr) - } + err := client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(deliverMessage)), strings.NewReader(deliverMessage), false, false, false) + ts.smtpErr(err, &smtpclient.Error{Permanent: false, Code: smtp.C451LocalErr, Secode: smtp.SeSys3Other0}) ts.checkCount("Rejects", 1) checkEvaluationCount(t, 0) // No positive interactions yet. @@ -758,12 +720,10 @@ func TestSpam(t *testing.T) { // Delivery from sender with bad reputation matching AcceptRejectsToMailbox should // result in accepted delivery to the mailbox. - ts.run(func(err error, client *smtpclient.Client) { + ts.run(func(client *smtpclient.Client) { mailFrom := "remote@example.org" rcptTo := "mjl2@mox.example" - if err == nil { - err = client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(deliverMessage2)), strings.NewReader(deliverMessage2), false, false, false) - } + err := client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(deliverMessage2)), strings.NewReader(deliverMessage2), false, false, false) tcheck(t, err, "deliver") ts.checkCount("mjl2junk", 1) // In ruleset rejects mailbox. @@ -778,12 +738,11 @@ func TestSpam(t *testing.T) { tcheck(t, err, "update junkiness") // Message should now be accepted. - ts.run(func(err error, client *smtpclient.Client) { + ts.run(func(client *smtpclient.Client) { + tcheck(t, err, "hello") mailFrom := "remote@example.org" rcptTo := "mjl@mox.example" - if err == nil { - err = client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(deliverMessage)), strings.NewReader(deliverMessage), false, false, false) - } + err := client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(deliverMessage)), strings.NewReader(deliverMessage), false, false, false) tcheck(t, err, "deliver") // Message should now be removed from Rejects mailboxes. @@ -801,16 +760,12 @@ func TestSpam(t *testing.T) { tretrain(t, ts.acc) // Message should be refused for spammy content. - ts.run(func(err error, client *smtpclient.Client) { + ts.run(func(client *smtpclient.Client) { + tcheck(t, err, "hello") mailFrom := "remote@example.org" rcptTo := "mjl@mox.example" - if err == nil { - err = client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(deliverMessage)), strings.NewReader(deliverMessage), false, false, false) - } - var cerr smtpclient.Error - if err == nil || !errors.As(err, &cerr) || cerr.Code != smtp.C451LocalErr { - t.Fatalf("attempt to deliver spamy message, got err %v, expected smtpclient.Error with code %d", err, smtp.C451LocalErr) - } + err := client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(deliverMessage)), strings.NewReader(deliverMessage), false, false, false) + ts.smtpErr(err, &smtpclient.Error{Permanent: false, Code: smtp.C451LocalErr, Secode: smtp.SeSys3Other0}) checkEvaluationCount(t, 1) // No new evaluation, this isn't a DMARC reject. }) } @@ -876,16 +831,14 @@ happens to come from forwarding mail server. // Deliver forwarded messages, then classify as junk. Normally enough to treat // other unrelated messages from IP as junk, but not for forwarded messages. - ts.run(func(err error, client *smtpclient.Client) { - tcheck(t, err, "connect") - + ts.run(func(client *smtpclient.Client) { mailFrom := "remote@forward.example" if !forward { mailFrom = "remote@bad.example" } for i := 0; i < 10; i++ { - err = client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(msgBad)), strings.NewReader(msgBad), false, false, false) + err := client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(msgBad)), strings.NewReader(msgBad), false, false, false) tcheck(t, err, "deliver message") } totalEvaluations += 10 @@ -896,10 +849,7 @@ happens to come from forwarding mail server. // Next delivery will fail, with negative "message From" signal. err = client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(msgBad)), strings.NewReader(msgBad), false, false, false) - var cerr smtpclient.Error - if err == nil || !errors.As(err, &cerr) || cerr.Code != smtp.C451LocalErr { - t.Fatalf("delivery by bad sender, got err %v, expected smtpclient.Error with code %d", err, smtp.C451LocalErr) - } + ts.smtpErr(err, &smtpclient.Error{Permanent: false, Code: smtp.C451LocalErr, Secode: smtp.SeSys3Other0}) checkEvaluationCount(t, totalEvaluations) }) @@ -907,31 +857,24 @@ happens to come from forwarding mail server. // Delivery from different "message From" without reputation, but from same // forwarding email server, should succeed under forwarding, not as regular sending // server. - ts.run(func(err error, client *smtpclient.Client) { - tcheck(t, err, "connect") - + ts.run(func(client *smtpclient.Client) { mailFrom := "remote@forward.example" if !forward { mailFrom = "remote@good.example" } - err = client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(msgOK)), strings.NewReader(msgOK), false, false, false) + err := client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(msgOK)), strings.NewReader(msgOK), false, false, false) if forward { tcheck(t, err, "deliver") totalEvaluations += 1 } else { - var cerr smtpclient.Error - if err == nil || !errors.As(err, &cerr) || cerr.Code != smtp.C451LocalErr { - t.Fatalf("delivery by bad ip, got err %v, expected smtpclient.Error with code %d", err, smtp.C451LocalErr) - } + ts.smtpErr(err, &smtpclient.Error{Permanent: false, Code: smtp.C451LocalErr, Secode: smtp.SeSys3Other0}) } checkEvaluationCount(t, totalEvaluations) }) // Delivery from forwarding server that isn't a forward should get same treatment. - ts.run(func(err error, client *smtpclient.Client) { - tcheck(t, err, "connect") - + ts.run(func(client *smtpclient.Client) { mailFrom := "other@forward.example" // Ensure To header matches. @@ -940,15 +883,12 @@ happens to come from forwarding mail server. msg = strings.ReplaceAll(msg, "", "") } - err = client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(msg)), strings.NewReader(msg), false, false, false) + err := client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(msg)), strings.NewReader(msg), false, false, false) if forward { tcheck(t, err, "deliver") totalEvaluations += 1 } else { - var cerr smtpclient.Error - if err == nil || !errors.As(err, &cerr) || cerr.Code != smtp.C451LocalErr { - t.Fatalf("delivery by bad ip, got err %v, expected smtpclient.Error with code %d", err, smtp.C451LocalErr) - } + ts.smtpErr(err, &smtpclient.Error{Permanent: false, Code: smtp.C451LocalErr, Secode: smtp.SeSys3Other0}) } checkEvaluationCount(t, totalEvaluations) }) @@ -973,16 +913,11 @@ func TestDMARCSent(t *testing.T) { defer ts.close() // First check that DMARC policy rejects message and results in optional evaluation. - ts.run(func(err error, client *smtpclient.Client) { + ts.run(func(client *smtpclient.Client) { mailFrom := "remote@example.org" rcptTo := "mjl@mox.example" - if err == nil { - err = client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(deliverMessage)), strings.NewReader(deliverMessage), false, false, false) - } - var cerr smtpclient.Error - if err == nil || !errors.As(err, &cerr) || cerr.Code != smtp.C550MailboxUnavail { - t.Fatalf("attempt to deliver spamy message, got err %v, expected smtpclient.Error with code %d", err, smtp.C550MailboxUnavail) - } + err := client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(deliverMessage)), strings.NewReader(deliverMessage), false, false, false) + ts.smtpErr(err, &smtpclient.Error{Permanent: true, Code: smtp.C550MailboxUnavail, Secode: smtp.SePol7MultiAuthFails26}) l := checkEvaluationCount(t, 1) tcompare(t, l[0].Optional, true) }) @@ -1011,16 +946,11 @@ func TestDMARCSent(t *testing.T) { tretrain(t, ts.acc) // Baseline, message should be refused for spammy content. - ts.run(func(err error, client *smtpclient.Client) { + ts.run(func(client *smtpclient.Client) { mailFrom := "remote@example.org" rcptTo := "mjl@mox.example" - if err == nil { - err = client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(deliverMessage)), strings.NewReader(deliverMessage), false, false, false) - } - var cerr smtpclient.Error - if err == nil || !errors.As(err, &cerr) || cerr.Code != smtp.C451LocalErr { - t.Fatalf("attempt to deliver spamy message, got err %v, expected smtpclient.Error with code %d", err, smtp.C451LocalErr) - } + err := client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(deliverMessage)), strings.NewReader(deliverMessage), false, false, false) + ts.smtpErr(err, &smtpclient.Error{Permanent: false, Code: smtp.C451LocalErr, Secode: smtp.SeSys3Other0}) checkEvaluationCount(t, 1) // No new evaluation. }) @@ -1034,28 +964,21 @@ func TestDMARCSent(t *testing.T) { // is no longer unknown and we should see a non-optional evaluation that will // result in a DMARC report. resolver.TXT["example.org."] = []string{"v=spf1 ip4:127.0.0.1 -all"} - ts.run(func(err error, client *smtpclient.Client) { + ts.run(func(client *smtpclient.Client) { mailFrom := "remote@example.org" rcptTo := "mjl@mox.example" - if err == nil { - err = client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(deliverMessage)), strings.NewReader(deliverMessage), false, false, false) - } - var cerr smtpclient.Error - if err == nil || !errors.As(err, &cerr) || cerr.Code != smtp.C550MailboxUnavail { - t.Fatalf("attempt to deliver spamy message, got err %v, expected smtpclient.Error with code %d", err, smtp.C550MailboxUnavail) - } + err := client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(deliverMessage)), strings.NewReader(deliverMessage), false, false, false) + ts.smtpErr(err, &smtpclient.Error{Permanent: true, Code: smtp.C550MailboxUnavail, Secode: smtp.SePol7MultiAuthFails26}) l := checkEvaluationCount(t, 2) // New evaluation. tcompare(t, l[1].Optional, false) }) // We should now be accepting the message because we recently sent a message. resolver.TXT["example.org."] = []string{"v=spf1 ip4:127.0.0.10 -all"} - ts.run(func(err error, client *smtpclient.Client) { + ts.run(func(client *smtpclient.Client) { mailFrom := "remote@example.org" rcptTo := "mjl@mox.example" - if err == nil { - err = client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(deliverMessage)), strings.NewReader(deliverMessage), false, false, false) - } + err := client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(deliverMessage)), strings.NewReader(deliverMessage), false, false, false) tcheck(t, err, "deliver") l := checkEvaluationCount(t, 3) // New evaluation. tcompare(t, l[2].Optional, false) @@ -1085,16 +1008,11 @@ func TestBlocklistedSubjectpass(t *testing.T) { defer ts.close() // Message should be refused softly (temporary error) due to DNSBL. - ts.run(func(err error, client *smtpclient.Client) { + ts.run(func(client *smtpclient.Client) { mailFrom := "remote@example.org" rcptTo := "mjl@mox.example" - if err == nil { - err = client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(deliverMessage)), strings.NewReader(deliverMessage), false, false, false) - } - var cerr smtpclient.Error - if err == nil || !errors.As(err, &cerr) || cerr.Code != smtp.C451LocalErr { - t.Fatalf("attempted deliver from dnsblocklisted ip, got err %v, expected smtpclient.Error with code %d", err, smtp.C451LocalErr) - } + err := client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(deliverMessage)), strings.NewReader(deliverMessage), false, false, false) + ts.smtpErr(err, &smtpclient.Error{Permanent: false, Code: smtp.C451LocalErr, Secode: smtp.SeSys3Other0}) }) // Set up subjectpass on account. @@ -1104,16 +1022,11 @@ func TestBlocklistedSubjectpass(t *testing.T) { // Message should be refused quickly (permanent error) due to DNSBL and Subjectkey. var pass string - ts.run(func(err error, client *smtpclient.Client) { + ts.run(func(client *smtpclient.Client) { mailFrom := "remote@example.org" rcptTo := "mjl@mox.example" - if err == nil { - err = client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(deliverMessage)), strings.NewReader(deliverMessage), false, false, false) - } - var cerr smtpclient.Error - if err == nil || !errors.As(err, &cerr) || cerr.Code != smtp.C550MailboxUnavail { - t.Fatalf("attempted deliver from dnsblocklisted ip, got err %v, expected smtpclient.Error with code %d", err, smtp.C550MailboxUnavail) - } + err := client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(deliverMessage)), strings.NewReader(deliverMessage), false, false, false) + cerr := ts.smtpErr(err, &smtpclient.Error{Permanent: true, Code: smtp.C550MailboxUnavail, Secode: smtp.SePol7DeliveryUnauth1}) i := strings.Index(cerr.Line, subjectpass.Explanation) if i < 0 { t.Fatalf("got error line %q, expected error line with subjectpass", cerr.Line) @@ -1121,13 +1034,11 @@ func TestBlocklistedSubjectpass(t *testing.T) { pass = cerr.Line[i+len(subjectpass.Explanation):] }) - ts.run(func(err error, client *smtpclient.Client) { + ts.run(func(client *smtpclient.Client) { mailFrom := "remote@example.org" rcptTo := "mjl@mox.example" passMessage := strings.Replace(deliverMessage, "Subject: test", "Subject: test "+pass, 1) - if err == nil { - err = client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(passMessage)), strings.NewReader(passMessage), false, false, false) - } + err := client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(passMessage)), strings.NewReader(passMessage), false, false, false) tcheck(t, err, "deliver with subjectpass") }) } @@ -1151,11 +1062,9 @@ func TestDMARCReport(t *testing.T) { run := func(report string, n int) { t.Helper() - ts.run(func(err error, client *smtpclient.Client) { + ts.run(func(client *smtpclient.Client) { t.Helper() - tcheck(t, err, "run") - mailFrom := "remote@example.org" rcptTo := "mjl@mox.example" @@ -1167,9 +1076,7 @@ func TestDMARCReport(t *testing.T) { tcheck(t, xerr, "write message") msg := msgb.String() - if err == nil { - err = client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(msg)), strings.NewReader(msg), false, false, false) - } + err := client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(msg)), strings.NewReader(msg), false, false, false) tcheck(t, err, "deliver") records, err := dmarcdb.Records(ctxbg) @@ -1278,7 +1185,7 @@ func TestTLSReport(t *testing.T) { run := func(rcptTo, tlsrpt string, n int) { t.Helper() - ts.run(func(err error, client *smtpclient.Client) { + ts.run(func(client *smtpclient.Client) { t.Helper() mailFrom := "remote@example.org" @@ -1293,9 +1200,7 @@ func TestTLSReport(t *testing.T) { tcheck(t, xerr, "dkim sign") msg = headers + msg - if err == nil { - err = client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(msg)), strings.NewReader(msg), false, false, false) - } + err := client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(msg)), strings.NewReader(msg), false, false, false) tcheck(t, err, "deliver") records, err := tlsrptdb.Records(ctxbg) @@ -1331,7 +1236,7 @@ func TestRatelimitConnectionrate(t *testing.T) { // We may be passing a window boundary during this tests. The limit is 300/minute. // So make twice that many connections and hope the tests don't take too long. for i := 0; i <= 2*300; i++ { - ts.run(func(err error, client *smtpclient.Client) { + ts.runx(func(err error, client *smtpclient.Client) { t.Helper() if err != nil && i < 300 { t.Fatalf("expected smtp connection, got %v", err) @@ -1359,7 +1264,7 @@ func TestRatelimitAuth(t *testing.T) { // failures/minute. So make twice that many connections and hope the tests don't // take too long. for i := 0; i <= 2*10; i++ { - ts.run(func(err error, client *smtpclient.Client) { + ts.runx(func(err error, client *smtpclient.Client) { t.Helper() if err == nil { t.Fatalf("got auth success with bad credentials") @@ -1397,19 +1302,14 @@ func TestRatelimitDelivery(t *testing.T) { limitIPMasked1MessagesPerMinute = orig }() - ts.run(func(err error, client *smtpclient.Client) { + ts.run(func(client *smtpclient.Client) { mailFrom := "remote@example.org" rcptTo := "mjl@mox.example" - if err == nil { - err = client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(deliverMessage)), strings.NewReader(deliverMessage), false, false, false) - } + err := client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(deliverMessage)), strings.NewReader(deliverMessage), false, false, false) tcheck(t, err, "deliver to remote") err = client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(deliverMessage)), strings.NewReader(deliverMessage), false, false, false) - var cerr smtpclient.Error - if err == nil || !errors.As(err, &cerr) || cerr.Code != smtp.C452StorageFull { - t.Fatalf("got err %v, expected smtpclient error with code 452 for storage full", err) - } + ts.smtpErr(err, &smtpclient.Error{Permanent: false, Code: smtp.C452StorageFull, Secode: smtp.SeMailbox2Full2}) }) limitIPMasked1MessagesPerMinute = orig @@ -1426,19 +1326,14 @@ func TestRatelimitDelivery(t *testing.T) { defer func() { limitIPMasked1SizePerMinute = origSize }() - ts.run(func(err error, client *smtpclient.Client) { + ts.run(func(client *smtpclient.Client) { mailFrom := "remote@example.org" rcptTo := "mjl@mox.example" - if err == nil { - err = client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(deliverMessage)), strings.NewReader(deliverMessage), false, false, false) - } + err := client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(deliverMessage)), strings.NewReader(deliverMessage), false, false, false) tcheck(t, err, "deliver to remote") err = client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(deliverMessage)), strings.NewReader(deliverMessage), false, false, false) - var cerr smtpclient.Error - if err == nil || !errors.As(err, &cerr) || cerr.Code != smtp.C452StorageFull { - t.Fatalf("got err %v, expected smtpclient error with code 452 for storage full", err) - } + ts.smtpErr(err, &smtpclient.Error{Permanent: false, Code: smtp.C452StorageFull, Secode: smtp.SeMailbox2Full2}) }) } @@ -1499,12 +1394,10 @@ func TestLimitOutgoing(t *testing.T) { testSubmit := func(rcptTo string, expErr *smtpclient.Error) { t.Helper() - ts.run(func(err error, client *smtpclient.Client) { + ts.run(func(client *smtpclient.Client) { t.Helper() mailFrom := "mjl@mox.example" - if err == nil { - err = client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(submitMessage)), strings.NewReader(submitMessage), false, false, false) - } + err := client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(submitMessage)), strings.NewReader(submitMessage), false, false, false) ts.smtpErr(err, expErr) }) } @@ -1532,13 +1425,9 @@ func TestQuota(t *testing.T) { defer ts.close() testDeliver := func(rcptTo string, expErr *smtpclient.Error) { - t.Helper() - ts.run(func(err error, client *smtpclient.Client) { - t.Helper() + ts.run(func(client *smtpclient.Client) { mailFrom := "mjl@other.example" - if err == nil { - err = client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(deliverMessage)), strings.NewReader(deliverMessage), false, false, false) - } + err := client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(deliverMessage)), strings.NewReader(deliverMessage), false, false, false) ts.smtpErr(err, expErr) }) } @@ -1561,12 +1450,10 @@ func TestCatchall(t *testing.T) { testDeliver := func(rcptTo string, expErr *smtpclient.Error) { t.Helper() - ts.run(func(err error, client *smtpclient.Client) { + ts.run(func(client *smtpclient.Client) { t.Helper() mailFrom := "mjl@other.example" - if err == nil { - err = client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(submitMessage)), strings.NewReader(submitMessage), false, false, false) - } + err := client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(submitMessage)), strings.NewReader(submitMessage), false, false, false) ts.smtpErr(err, expErr) }) } @@ -1645,7 +1532,7 @@ func TestDKIMSign(t *testing.T) { n := 0 testSubmit := func(mailFrom, msgFrom string) { t.Helper() - ts.run(func(err error, client *smtpclient.Client) { + ts.run(func(client *smtpclient.Client) { t.Helper() msg := strings.ReplaceAll(fmt.Sprintf(`From: <%s> @@ -1657,9 +1544,7 @@ test email `, msgFrom), "\n", "\r\n") rcptTo := "remote@example.org" - if err == nil { - err = client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(msg)), strings.NewReader(msg), false, false, false) - } + err := client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(msg)), strings.NewReader(msg), false, false, false) tcheck(t, err, "deliver") msgs, err := queue.List(ctxbg, queue.Filter{}, queue.Sort{}) @@ -1699,12 +1584,10 @@ func TestPostmaster(t *testing.T) { testDeliver := func(rcptTo string, expErr *smtpclient.Error) { t.Helper() - ts.run(func(err error, client *smtpclient.Client) { + ts.run(func(client *smtpclient.Client) { t.Helper() mailFrom := "mjl@other.example" - if err == nil { - err = client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(deliverMessage)), strings.NewReader(deliverMessage), false, false, false) - } + err := client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(deliverMessage)), strings.NewReader(deliverMessage), false, false, false) ts.smtpErr(err, expErr) }) } @@ -1729,15 +1612,10 @@ func TestEmptylocalpart(t *testing.T) { defer ts.close() testDeliver := func(rcptTo string, expErr *smtpclient.Error) { - t.Helper() - ts.run(func(err error, client *smtpclient.Client) { - t.Helper() - + ts.run(func(client *smtpclient.Client) { mailFrom := `""@other.example` msg := strings.ReplaceAll(deliverMessage, "To: ", `To: <""@mox.example>`) - if err == nil { - err = client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(msg)), strings.NewReader(msg), false, false, false) - } + err := client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(msg)), strings.NewReader(msg), false, false, false) ts.smtpErr(err, expErr) }) } @@ -1796,13 +1674,11 @@ test email testSubmit := func(msg string, requiretls bool, expRequireTLS *bool) { t.Helper() - ts.run(func(err error, client *smtpclient.Client) { + ts.run(func(client *smtpclient.Client) { t.Helper() rcptTo := "remote@example.org" - if err == nil { - err = client.Deliver(ctxbg, "mjl@mox.example", rcptTo, int64(len(msg)), strings.NewReader(msg), false, false, requiretls) - } + err := client.Deliver(ctxbg, "mjl@mox.example", rcptTo, int64(len(msg)), strings.NewReader(msg), false, false, requiretls) tcheck(t, err, "deliver") msgs, err := queue.List(ctxbg, queue.Filter{}, queue.Sort{}) @@ -1824,13 +1700,9 @@ test email // Check that we get an error if remote SMTP server does not support the requiretls // extension. ts.requiretls = false - ts.run(func(err error, client *smtpclient.Client) { - t.Helper() - + ts.run(func(client *smtpclient.Client) { rcptTo := "remote@example.org" - if err == nil { - err = client.Deliver(ctxbg, "mjl@mox.example", rcptTo, int64(len(msg0)), strings.NewReader(msg0), false, false, true) - } + err := client.Deliver(ctxbg, "mjl@mox.example", rcptTo, int64(len(msg0)), strings.NewReader(msg0), false, false, true) if err == nil { t.Fatalf("delivered with requiretls to server without requiretls") } @@ -1993,7 +1865,7 @@ func TestSMTPUTF8(t *testing.T) { test := func(mailFrom string, rcptTo string, headerValue string, filename string, clientSmtputf8 bool, expectedSmtputf8 bool, expErr *smtpclient.Error) { t.Helper() - ts.run(func(_ error, client *smtpclient.Client) { + ts.run(func(client *smtpclient.Client) { t.Helper() msg := strings.ReplaceAll(fmt.Sprintf(`From: <%s> To: <%s> @@ -2062,12 +1934,10 @@ Message-Id: test email `, "\n", "\r\n") - ts.run(func(err error, client *smtpclient.Client) { - t.Helper() - tcheck(t, err, "init client") + ts.run(func(client *smtpclient.Client) { mailFrom := "mjl@mox.example" rcptTo := "mjl@mox.example" - err = client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(extraMsg)), strings.NewReader(extraMsg), true, true, false) + err := client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(extraMsg)), strings.NewReader(extraMsg), true, true, false) tcheck(t, err, "deliver") }) msgs, err := queue.List(ctxbg, queue.Filter{}, queue.Sort{}) @@ -2101,11 +1971,10 @@ Message-Id: test email `, "\n", "\r\n") - ts.run(func(err error, client *smtpclient.Client) { - tcheck(t, err, "init client") + ts.run(func(client *smtpclient.Client) { mailFrom := "mjl@mox.example" rcptTo := "mjl@mox.example" - err = client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(extraMsg)), strings.NewReader(extraMsg), true, true, false) + err := client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(extraMsg)), strings.NewReader(extraMsg), true, true, false) ts.smtpErr(err, &smtpclient.Error{Permanent: true, Code: smtp.C554TransactionFailed, Secode: smtp.SeMsg6Other0}) }) } @@ -2127,29 +1996,26 @@ test email `, "\n", "\r\n") // Specify our own unique id when queueing. - ts.run(func(err error, client *smtpclient.Client) { - tcheck(t, err, "init client") + ts.run(func(client *smtpclient.Client) { mailFrom := "mjl+unique@mox.example" rcptTo := "mjl@mox.example" - err = client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(extraMsg)), strings.NewReader(extraMsg), true, true, false) + err := client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(extraMsg)), strings.NewReader(extraMsg), true, true, false) ts.smtpErr(err, nil) }) // But we can only use it once. - ts.run(func(err error, client *smtpclient.Client) { - tcheck(t, err, "init client") + ts.run(func(client *smtpclient.Client) { mailFrom := "mjl+unique@mox.example" rcptTo := "mjl@mox.example" - err = client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(extraMsg)), strings.NewReader(extraMsg), true, true, false) + err := client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(extraMsg)), strings.NewReader(extraMsg), true, true, false) ts.smtpErr(err, &smtpclient.Error{Permanent: true, Code: smtp.C554TransactionFailed, Secode: smtp.SeAddr1SenderSyntax7}) }) // We cannot use our own fromid with multiple recipients. - ts.run(func(err error, client *smtpclient.Client) { - tcheck(t, err, "init client") + ts.run(func(client *smtpclient.Client) { mailFrom := "mjl+unique2@mox.example" rcptTo := []string{"mjl@mox.example", "mjl@mox.example"} - _, err = client.DeliverMultiple(ctxbg, mailFrom, rcptTo, int64(len(extraMsg)), strings.NewReader(extraMsg), true, true, false) + _, err := client.DeliverMultiple(ctxbg, mailFrom, rcptTo, int64(len(extraMsg)), strings.NewReader(extraMsg), true, true, false) ts.smtpErr(err, &smtpclient.Error{Permanent: true, Code: smtp.C554TransactionFailed, Secode: smtp.SeProto5TooManyRcpts3}) }) } @@ -2165,12 +2031,10 @@ func TestDestinationSMTPError(t *testing.T) { ts := newTestServer(t, filepath.FromSlash("../testdata/smtp/mox.conf"), resolver) defer ts.close() - ts.run(func(err error, client *smtpclient.Client) { - t.Helper() - tcheck(t, err, "init client") + ts.run(func(client *smtpclient.Client) { mailFrom := "mjl@example.org" rcptTo := "blocked@mox.example" - err = client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(deliverMessage)), strings.NewReader(deliverMessage), false, false, false) + err := client.Deliver(ctxbg, mailFrom, rcptTo, int64(len(deliverMessage)), strings.NewReader(deliverMessage), false, false, false) ts.smtpErr(err, &smtpclient.Error{Permanent: true, Code: smtp.C550MailboxUnavail, Secode: smtp.SeAddr1UnknownDestMailbox1}) }) }