diff --git a/pkg/storage/file/fstore.go b/pkg/storage/file/fstore.go index d1e6231..be805ed 100644 --- a/pkg/storage/file/fstore.go +++ b/pkg/storage/file/fstore.go @@ -11,6 +11,7 @@ import ( "github.com/inbucket/inbucket/pkg/config" "github.com/inbucket/inbucket/pkg/extension" + "github.com/inbucket/inbucket/pkg/message" "github.com/inbucket/inbucket/pkg/storage" "github.com/inbucket/inbucket/pkg/stringutil" "github.com/rs/zerolog/log" @@ -186,6 +187,17 @@ func (fs *Store) PurgeMessages(mailbox string) error { mb := fs.mbox(mailbox) mb.Lock() defer mb.Unlock() + + // Emit delete events. + if !mb.indexLoaded { + if err := mb.readIndex(); err != nil { + return err + } + } + for _, m := range mb.messages { + fs.extHost.Events.AfterMessageDeleted.Emit(message.MakeMetadata(m)) + } + return mb.purge() } diff --git a/pkg/storage/mem/store.go b/pkg/storage/mem/store.go index fd1ceae..7c1a78e 100644 --- a/pkg/storage/mem/store.go +++ b/pkg/storage/mem/store.go @@ -144,16 +144,25 @@ func (s *Store) MarkSeen(mailbox, id string) error { // PurgeMessages deletes the contents of a mailbox. func (s *Store) PurgeMessages(mailbox string) error { + // Grab lock, copy messages, clear, and drop lock. var messages map[string]*Message s.withMailbox(mailbox, true, func(mb *mbox) { messages = mb.messages mb.messages = make(map[string]*Message) }) - if len(messages) > 0 && s.remove != nil { + + // Process size/quota. + if s.remove != nil { for _, m := range messages { s.enforcerRemove(m) } } + + // Emit delete events. + for _, m := range messages { + s.extHost.Events.AfterMessageDeleted.Emit(message.MakeMetadata(m)) + } + return nil } diff --git a/pkg/test/storage_suite.go b/pkg/test/storage_suite.go index fa13260..f22abb2 100644 --- a/pkg/test/storage_suite.go +++ b/pkg/test/storage_suite.go @@ -343,16 +343,33 @@ func testDelete(t *testing.T, store storage.Store, extHost *extension.Host) { func testPurge(t *testing.T, store storage.Store, extHost *extension.Host) { mailbox := "fred" subjects := []string{"alpha", "bravo", "charlie", "delta", "echo"} + + // Subscribe to events. + eventListener := extHost.Events.AfterMessageDeleted.AsyncTestListener(len(subjects)) + + // Populate mailbox. for _, subj := range subjects { DeliverToStore(t, store, mailbox, subj, time.Now()) } GetAndCountMessages(t, store, mailbox, len(subjects)) + // Purge and verify. err := store.PurgeMessages(mailbox) - if err != nil { - t.Fatal(err) - } + require.NoError(t, err) GetAndCountMessages(t, store, mailbox, 0) + + // Confirm events emitted. + gotEvents := []*event.MessageMetadata{} + for range subjects { + ev, err := eventListener() + if err != nil { + t.Error(err) + break + } + gotEvents = append(gotEvents, ev) + } + assert.Equal(t, len(subjects), len(gotEvents), + "expected delete event for each message in mailbox") } // testMsgCap verifies the message cap is enforced.