14 "github.com/mjl-/mox/mlog"
15 "github.com/mjl-/mox/mox-"
18func TestExport(t *testing.T) {
19 // Set up an account, add 2 messages to different 2 mailboxes. export as tar/zip
20 // and maildir/mbox. check there are 2 files in the repo, no errors.txt.
22 os.RemoveAll("../testdata/store/data")
23 mox.ConfigStaticPath = filepath.FromSlash("../testdata/store/mox.conf")
24 mox.MustLoadConfig(true, false)
25 acc, err := OpenAccount(pkglog, "mjl")
26 tcheck(t, err, "open account")
30 log := mlog.New("export", nil)
32 msgFile, err := CreateMessageTemp(pkglog, "mox-test-export")
33 tcheck(t, err, "create temp")
34 defer os.Remove(msgFile.Name()) // To be sure.
36 const msg = "test: test\r\n\r\ntest\r\n"
37 _, err = msgFile.Write([]byte(msg))
38 tcheck(t, err, "write message")
40 m := Message{Received: time.Now(), Size: int64(len(msg))}
41 err = acc.DeliverMailbox(pkglog, "Inbox", &m, msgFile)
42 tcheck(t, err, "deliver")
44 m = Message{Received: time.Now(), Size: int64(len(msg))}
45 err = acc.DeliverMailbox(pkglog, "Trash", &m, msgFile)
46 tcheck(t, err, "deliver")
48 var maildirZip, maildirTar, mboxZip, mboxTar bytes.Buffer
50 archive := func(archiver Archiver, maildir bool) {
52 err = ExportMessages(ctxbg, log, acc.DB, acc.Dir, archiver, maildir, "")
53 tcheck(t, err, "export messages")
54 err = archiver.Close()
55 tcheck(t, err, "archiver close")
58 os.RemoveAll("../testdata/exportmaildir")
59 os.RemoveAll("../testdata/exportmbox")
61 archive(ZipArchiver{zip.NewWriter(&maildirZip)}, true)
62 archive(ZipArchiver{zip.NewWriter(&mboxZip)}, false)
63 archive(TarArchiver{tar.NewWriter(&maildirTar)}, true)
64 archive(TarArchiver{tar.NewWriter(&mboxTar)}, false)
65 archive(DirArchiver{filepath.FromSlash("../testdata/exportmaildir")}, true)
66 archive(DirArchiver{filepath.FromSlash("../testdata/exportmbox")}, false)
68 if r, err := zip.NewReader(bytes.NewReader(maildirZip.Bytes()), int64(maildirZip.Len())); err != nil {
69 t.Fatalf("reading maildir zip: %v", err)
70 } else if len(r.File) != 2*3+2 {
71 t.Fatalf("maildir zip, expected 2*3 dirs, and 2 files, got %d files", len(r.File))
74 if r, err := zip.NewReader(bytes.NewReader(mboxZip.Bytes()), int64(mboxZip.Len())); err != nil {
75 t.Fatalf("reading mbox zip: %v", err)
76 } else if len(r.File) != 2 {
77 t.Fatalf("maildir zip, 2 files, got %d files", len(r.File))
80 checkTarFiles := func(r io.Reader, n int) {
82 tr := tar.NewReader(r)
90 if h.Name == "errors.txt" {
91 t.Fatalf("got errors.txt")
93 _, err = io.Copy(io.Discard, tr)
94 tcheck(t, err, "copy")
97 t.Fatalf("got %d files, expected %d", have, n)
101 checkTarFiles(&maildirTar, 2*3+2)
102 checkTarFiles(&mboxTar, 2)
104 checkDirFiles := func(dir string, n int) {
107 err := filepath.WalkDir(dir, func(path string, d fs.DirEntry, err error) error {
108 if err == nil && !d.IsDir() {
113 tcheck(t, err, "walkdir")
115 t.Fatalf("got %d files, expected %d", have, n)
119 checkDirFiles(filepath.FromSlash("../testdata/exportmaildir"), 2)
120 checkDirFiles(filepath.FromSlash("../testdata/exportmbox"), 2)