Add missing wlocks around message delivery to account, mostly for tests.

This commit is contained in:
Mechiel Lukkien 2025-03-03 23:59:43 +01:00
parent 2da280f2bb
commit 684c716e4d
No known key found for this signature in database
7 changed files with 50 additions and 37 deletions

View File

@ -450,8 +450,11 @@ func TestCtl(t *testing.T) {
defer msgf.Close() defer msgf.Close()
_, err = msgf.Write(content) _, err = msgf.Write(content)
tcheck(t, err, "write message file") tcheck(t, err, "write message file")
err = acc.DeliverMailbox(ctl.log, "Inbox", m, msgf)
tcheck(t, err, "deliver message") acc.WithWLock(func() {
err = acc.DeliverMailbox(ctl.log, "Inbox", m, msgf)
tcheck(t, err, "deliver message")
})
} }
var msgBadSize store.Message var msgBadSize store.Message

View File

@ -293,6 +293,8 @@ func TestAuthenticateTLSClientCert(t *testing.T) {
tcheck(t, err, "open account") tcheck(t, err, "open account")
err = acc.SetPassword(pkglog, "test1234") err = acc.SetPassword(pkglog, "test1234")
tcheck(t, err, "set password") tcheck(t, err, "set password")
err = acc.Close()
tcheck(t, err, "close account")
tc = startArgsMore(t, true, true, nil, &clientConfig, false, true, true, "mjl", addClientCert) tc = startArgsMore(t, true, true, nil, &clientConfig, false, true, true, "mjl", addClientCert)
tc.transactf("no", "authenticate plain %s", base64.StdEncoding.EncodeToString([]byte("\u0000other@mox.example\u0000test1234"))) tc.transactf("no", "authenticate plain %s", base64.StdEncoding.EncodeToString([]byte("\u0000other@mox.example\u0000test1234")))
tc.close() tc.close()

View File

@ -646,10 +646,11 @@ func tinsertmsg(t *testing.T, acc *store.Account, mailbox string, m *store.Messa
defer mf.Close() defer mf.Close()
_, err = mf.Write([]byte(msg)) _, err = mf.Write([]byte(msg))
tcheck(t, err, "write message") tcheck(t, err, "write message")
err = acc.DeliverMailbox(pkglog, mailbox, m, mf)
tcheck(t, err, "deliver message") acc.WithWLock(func() {
err = mf.Close() err = acc.DeliverMailbox(pkglog, mailbox, m, mf)
tcheck(t, err, "close message") tcheck(t, err, "deliver message")
})
} }
func tretrain(t *testing.T, acc *store.Account) { func tretrain(t *testing.T, acc *store.Account) {

View File

@ -41,13 +41,15 @@ func TestExport(t *testing.T) {
_, err = msgFile.Write([]byte(msg)) _, err = msgFile.Write([]byte(msg))
tcheck(t, err, "write message") tcheck(t, err, "write message")
m := Message{Received: time.Now(), Size: int64(len(msg))} acc.WithWLock(func() {
err = acc.DeliverMailbox(pkglog, "Inbox", &m, msgFile) m := Message{Received: time.Now(), Size: int64(len(msg))}
tcheck(t, err, "deliver") err = acc.DeliverMailbox(pkglog, "Inbox", &m, msgFile)
tcheck(t, err, "deliver")
m = Message{Received: time.Now(), Size: int64(len(msg))} m = Message{Received: time.Now(), Size: int64(len(msg))}
err = acc.DeliverMailbox(pkglog, "Trash", &m, msgFile) err = acc.DeliverMailbox(pkglog, "Trash", &m, msgFile)
tcheck(t, err, "deliver") tcheck(t, err, "deliver")
})
var maildirZip, maildirTar, mboxZip, mboxTar bytes.Buffer var maildirZip, maildirTar, mboxZip, mboxTar bytes.Buffer

View File

@ -42,8 +42,11 @@ func TestThreadingUpgrade(t *testing.T) {
MsgPrefix: []byte(s), MsgPrefix: []byte(s),
Received: recv, Received: recv,
} }
err = acc.DeliverMailbox(log, "Inbox", &m, f) acc.WithWLock(func() {
tcheck(t, err, "deliver") err = acc.DeliverMailbox(log, "Inbox", &m, f)
tcheck(t, err, "deliver")
})
if expThreadID == 0 { if expThreadID == 0 {
expThreadID = m.ID expThreadID = m.ID
} }

View File

@ -264,28 +264,30 @@ type testmsg struct {
} }
func tdeliver(t *testing.T, acc *store.Account, tm *testmsg) { func tdeliver(t *testing.T, acc *store.Account, tm *testmsg) {
msgFile, err := store.CreateMessageTemp(pkglog, "webmail-test") acc.WithWLock(func() {
tcheck(t, err, "create message temp") msgFile, err := store.CreateMessageTemp(pkglog, "webmail-test")
defer os.Remove(msgFile.Name()) tcheck(t, err, "create message temp")
defer msgFile.Close() defer os.Remove(msgFile.Name())
size, err := msgFile.Write(tm.msg.Marshal(t)) defer msgFile.Close()
tcheck(t, err, "write message temp") size, err := msgFile.Write(tm.msg.Marshal(t))
m := store.Message{ tcheck(t, err, "write message temp")
Flags: tm.Flags, m := store.Message{
RcptToLocalpart: "mox", Flags: tm.Flags,
RcptToDomain: "other.example", RcptToLocalpart: "mox",
MsgFromLocalpart: "mjl", RcptToDomain: "other.example",
MsgFromDomain: "mox.example", MsgFromLocalpart: "mjl",
DKIMDomains: []string{"mox.example"}, MsgFromDomain: "mox.example",
Keywords: tm.Keywords, DKIMDomains: []string{"mox.example"},
Size: int64(size), Keywords: tm.Keywords,
} Size: int64(size),
err = acc.DeliverMailbox(pkglog, tm.Mailbox, &m, msgFile) }
tcheck(t, err, "deliver test message") err = acc.DeliverMailbox(pkglog, tm.Mailbox, &m, msgFile)
err = msgFile.Close() tcheck(t, err, "deliver test message")
tcheck(t, err, "closing test message") err = msgFile.Close()
tm.m = m tcheck(t, err, "closing test message")
tm.ID = m.ID tm.m = m
tm.ID = m.ID
})
} }
func readBody(r io.Reader) string { func readBody(r io.Reader) string {

View File

@ -358,7 +358,7 @@ func (x XOps) MailboxesMarkRead(ctx context.Context, log mlog.Log, acc *store.Ac
// MessageMove moves messages to the mailbox represented by mailboxName, or to mailboxID if mailboxName is empty. // MessageMove moves messages to the mailbox represented by mailboxName, or to mailboxID if mailboxName is empty.
func (x XOps) MessageMove(ctx context.Context, log mlog.Log, acc *store.Account, messageIDs []int64, mailboxName string, mailboxID int64) { func (x XOps) MessageMove(ctx context.Context, log mlog.Log, acc *store.Account, messageIDs []int64, mailboxName string, mailboxID int64) {
acc.WithRLock(func() { acc.WithWLock(func() {
var changes []store.Change var changes []store.Change
x.DBWrite(ctx, acc, func(tx *bstore.Tx) { x.DBWrite(ctx, acc, func(tx *bstore.Tx) {