Skip to content

Commit 66b94cd

Browse files
authored
Merge pull request #770 from plusiv/fix-imap-idle-handling
Thank you for your contribution and for submitting this PR! I fixed the test, everything is passing now.
2 parents a13c966 + 4a8703a commit 66b94cd

3 files changed

Lines changed: 47 additions & 6 deletions

File tree

.vscode/launch.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
"type": "go",
1010
"request": "launch",
1111
"mode": "auto",
12-
"program": "${workspaceRoot}/cmd/mokapi/main.go",
12+
"program": "${workspaceRoot}/cmd/mokapi",
1313
"env": {"MOKAPI_Log.Level": "debug", "MOKAPI_Providers.File.Directory": "data", "DEVUSER": "lehmannmar"}, //"MOKAPI_configFile": "config.yml",
1414
"args": ["--Log.Format=json", "--Api.Port=8081"],//"--Log.Level=debug", , "--configFile", "config.yml"
1515
"cwd": "${workspaceRoot}"

imap/idle.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package imap
33
import (
44
"io"
55
"net/textproto"
6+
"strings"
67
)
78

89
type UpdateWriter interface {
@@ -39,8 +40,7 @@ func (c *conn) handleIdle(tag string) error {
3940
return err
4041
}
4142

42-
_, cmd, _ := parseLine(line)
43-
if cmd != "DONE" {
43+
if strings.ToUpper(line) != "DONE" {
4444
return c.writeResponse(tag, &response{
4545
status: bad,
4646
text: "Expected DONE to end IDLE",

imap/idle_test.go

Lines changed: 44 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,13 @@ package imap_test
22

33
import (
44
"fmt"
5-
"github.com/stretchr/testify/require"
65
"mokapi/imap"
76
"mokapi/imap/imaptest"
87
"mokapi/try"
98
"testing"
109
"time"
10+
11+
"github.com/stretchr/testify/require"
1112
)
1213

1314
func TestIdle(t *testing.T) {
@@ -62,7 +63,47 @@ func TestIdle(t *testing.T) {
6263
require.NoError(t, err)
6364
require.Equal(t, "+ idling", res)
6465

65-
res, err = c.SendRaw("A01 DONE")
66+
res, err = c.SendRaw("DONE")
67+
require.NoError(t, err)
68+
require.Equal(t, "A01 OK IDLE terminated", res)
69+
},
70+
},
71+
{
72+
name: "idle and done with lower case",
73+
handler: func(t *testing.T) imap.Handler {
74+
return &imaptest.Handler{
75+
SelectFunc: func(mailbox string, readonly bool, session map[string]interface{}) (*imap.Selected, error) {
76+
return &imap.Selected{}, nil
77+
},
78+
IdleFunc: func(w imap.UpdateWriter, done chan struct{}, session map[string]interface{}) error {
79+
session["idle"] = done
80+
return nil
81+
},
82+
UnselectFunc: func(session map[string]interface{}) error {
83+
done := session["idle"].(chan struct{})
84+
doneClosed := false
85+
select {
86+
case <-done:
87+
doneClosed = true
88+
case <-time.After(time.Second):
89+
}
90+
91+
require.True(t, doneClosed, "done is closed")
92+
return nil
93+
},
94+
}
95+
},
96+
test: func(t *testing.T, c *imap.Client) {
97+
err := c.PlainAuth("", "bob", "password")
98+
require.NoError(t, err)
99+
_, err = c.Select("INBOX", false)
100+
require.NoError(t, err)
101+
102+
res, err := c.SendRaw("A01 idle")
103+
require.NoError(t, err)
104+
require.Equal(t, "+ idling", res)
105+
106+
res, err = c.SendRaw("done")
66107
require.NoError(t, err)
67108
require.Equal(t, "A01 OK IDLE terminated", res)
68109
},
@@ -125,7 +166,7 @@ func TestIdle(t *testing.T) {
125166
}()
126167

127168
c := imap.NewClient(fmt.Sprintf("localhost:%v", p))
128-
defer c.Close()
169+
defer func() { _ = c.Close() }()
129170

130171
_, err := c.Dial()
131172
require.NoError(t, err)

0 commit comments

Comments
 (0)