Skip to content

Commit

Permalink
feat(benchmark): Allow mailboxes to be populated from directory
Browse files Browse the repository at this point in the history
Use `-imap-mbox-file-dir` to load all `*.eml` from that directory to use
as input for the mailbox creation on all existing IMAP benches.
  • Loading branch information
LBeernaertProton authored and jameshoulahan committed Sep 16, 2022
1 parent 45de48c commit ed9df6d
Show file tree
Hide file tree
Showing 3 changed files with 61 additions and 3 deletions.
1 change: 1 addition & 0 deletions benchmarks/gluon_bench/flags/imap_benchmarks.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,5 @@ var (
IMAPRandomSeqSetIntervals = flag.Bool("imap-random-seqset-intervals", false, "When set, generate random sequence intervals rather than single numbers.")
IMAPUIDMode = flag.Bool("imap-uid-mode", false, "When set, will run benchmarks in UID mode if available.")
IMAPParallelClients = flag.Uint("imap-parallel-clients", 1, "Set the number of clients to be run in parallel during the benchmark.")
IMAPMailboxMessageDir = flag.String("imap-mbox-file-dir", "", "Folder path to load *.eml messages instead of builtin selection.")
)
27 changes: 24 additions & 3 deletions benchmarks/gluon_bench/imap_benchmarks/build_mailbox.go
Original file line number Diff line number Diff line change
@@ -1,20 +1,41 @@
package imap_benchmarks

import (
"fmt"
"github.com/ProtonMail/gluon/benchmarks/gluon_bench/flags"
"time"

"github.com/ProtonMail/gluon/benchmarks/gluon_bench/utils"
"github.com/emersion/go-imap/client"
"golang.org/x/exp/rand"
)

// BuildMailbox creates a mailbox of name `mailbox` and fills it up with `messageCount` random messages.
func BuildMailbox(cl *client.Client, mailbox string, messageCount int) error {
messages := []string{utils.MessageAfterNoonMeeting, utils.MessageMultiPartMixed, utils.MessageEmbedded}
var messages []string

if len(*flags.IMAPMailboxMessageDir) != 0 {
msgs, err := utils.LoadEMLFilesFromDirectory(*flags.IMAPMailboxMessageDir)
if err != nil {
return err
}

if *flags.Verbose {
fmt.Printf("Loaded %v messages from '%v'\n", len(msgs), *flags.IMAPMailboxMessageDir)
}

messages = msgs
} else {
messages = []string{utils.MessageAfterNoonMeeting, utils.MessageMultiPartMixed, utils.MessageEmbedded}
}

return BuildMailboxWithMessages(cl, mailbox, messageCount, messages)
}

func BuildMailboxWithMessages(cl *client.Client, mailbox string, messageCount int, messages []string) error {
messagesLen := len(messages)

for i := 0; i < messageCount; i++ {
if err := AppendToMailbox(cl, mailbox, messages[rand.Intn(messagesLen)], time.Now()); err != nil {
if err := AppendToMailbox(cl, mailbox, messages[i%messagesLen], time.Now()); err != nil {
return err
}
}
Expand Down
36 changes: 36 additions & 0 deletions benchmarks/gluon_bench/utils/utils.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,10 @@ package utils

import (
"bufio"
"io/fs"
"os"
"path/filepath"
"strings"
)

func ReadLinesFromFile(path string) ([]string, error) {
Expand All @@ -24,3 +27,36 @@ func ReadLinesFromFile(path string) ([]string, error) {

return lines, nil
}

func LoadFilesFromDirectory(path string, filter func(string, fs.FileInfo) bool) ([]string, error) {
var files []string

if err := filepath.Walk(path, func(path string, info fs.FileInfo, err error) error {
if err != nil {
return err
}

if !filter(path, info) {
return nil
}

bytes, err := os.ReadFile(path)
if err != nil {
return err
}

files = append(files, string(bytes))

return nil
}); err != nil {
return nil, err
}

return files, nil
}

func LoadEMLFilesFromDirectory(path string) ([]string, error) {
return LoadFilesFromDirectory(path, func(s string, info fs.FileInfo) bool {
return !info.IsDir() && strings.HasSuffix(s, ".eml")
})
}

0 comments on commit ed9df6d

Please sign in to comment.