9 "github.com/mjl-/bstore"
11 "github.com/mjl-/mox/message"
12 "github.com/mjl-/mox/mlog"
13 "github.com/mjl-/mox/mox-"
16func TestReparse(t *testing.T) {
17 log := mlog.New("store", nil)
18 os.RemoveAll("../testdata/store/data")
19 mox.ConfigStaticPath = filepath.FromSlash("../testdata/store/mox.conf")
20 mox.MustLoadConfig(true, false)
22 tcheck(t, err, "init")
25 tcheck(t, err, "close")
29 orig := reparseMessageBatchSize
30 reparseMessageBatchSize = 2
32 reparseMessageBatchSize = orig
35 acc, err := OpenAccount(log, "mjl", false)
36 tcheck(t, err, "open account")
38 // Prepare message to add later.
39 msgFile, err := CreateMessageTemp(log, "account-test")
40 tcheck(t, err, "create temp message file")
41 defer CloseRemoveTempFile(log, msgFile, "temp message file")
42 msgWriter := message.NewWriter(msgFile)
43 _, err = msgWriter.Write([]byte(" message"))
44 tcheck(t, err, "write message")
46 msgPrefix := []byte("From: <mjl@mox.example\r\nTo: <mjl@mox.example>\r\nCc: <mjl@mox.example>Subject: test\r\nMessage-Id: <m01@mox.example>\r\n\r\n")
49 Size: int64(len(msgPrefix)) + msgWriter.Size,
54 acc.WithRLock(func() {
58 err := acc.DeliverDestination(log, conf.Destinations["mjl"], &nm, msgFile)
59 tcheck(t, err, "deliver")
63 // Reparse explicitly.
64 total, err := acc.ReparseMessages(ctxbg, log)
65 tcheck(t, err, "reparsing messages")
66 tcompare(t, total, 10)
68 // Ensure a next reopen will reparse messages in the background.
69 _, err = bstore.QueryDB[Upgrade](ctxbg, acc.DB).UpdateNonzero(Upgrade{MessageParseVersion: MessageParseVersionLatest + 1})
70 tcheck(t, err, "change")
72 // Close account, and wait until really closed.
74 tcheck(t, err, "closing account")
77 // Reopen account, should trigger reparse. We immediately Close again, account DB
78 // should be kept open.
79 acc, err = OpenAccount(log, "mjl", false)
80 tcheck(t, err, "open account")
82 tcheck(t, err, "closing account")
85 // Check that the reparse is finished.
86 acc, err = OpenAccount(log, "mjl", false)
87 tcheck(t, err, "open account")
89 up, err := bstore.QueryDB[Upgrade](ctxbg, acc.DB).Get()
90 tcheck(t, err, "change")
91 if up.MessageParseVersion == MessageParseVersionLatest {
94 time.Sleep(time.Second / 10)
97 tcheck(t, err, "closing account")