Skip to content

Commit ca0ddb7

Browse files
committed
imapclient: allow IdleCommand.Wait to be called before Close
Allows users to figure out when the connection has been closed while idling.
1 parent 4b2f4f1 commit ca0ddb7

File tree

3 files changed

+42
-20
lines changed

3 files changed

+42
-20
lines changed

imapclient/client_test.go

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -145,21 +145,6 @@ func TestLogout(t *testing.T) {
145145
}
146146
}
147147

148-
func TestIdle(t *testing.T) {
149-
client, server := newClientServerPair(t, imap.ConnStateSelected)
150-
defer client.Close()
151-
defer server.Close()
152-
153-
idleCmd, err := client.Idle()
154-
if err != nil {
155-
t.Fatalf("Idle() = %v", err)
156-
}
157-
// TODO: test unilateral updates
158-
if err := idleCmd.Close(); err != nil {
159-
t.Errorf("Close() = %v", err)
160-
}
161-
}
162-
163148
// https://github.com/emersion/go-imap/issues/562
164149
func TestFetch_invalid(t *testing.T) {
165150
client, server := newClientServerPair(t, imap.ConnStateSelected)

imapclient/idle.go

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -96,12 +96,7 @@ func (cmd *IdleCommand) Close() error {
9696
}
9797

9898
// Wait blocks until the IDLE command has completed.
99-
//
100-
// Wait can only be called after Close.
10199
func (cmd *IdleCommand) Wait() error {
102-
if !cmd.stopped.Load() {
103-
return fmt.Errorf("imapclient: IdleCommand.Close must be called before Wait")
104-
}
105100
<-cmd.done
106101
if cmd.err != nil {
107102
return cmd.err

imapclient/idle_test.go

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package imapclient_test
2+
3+
import (
4+
"testing"
5+
6+
"github.com/emersion/go-imap/v2"
7+
)
8+
9+
func TestIdle(t *testing.T) {
10+
client, server := newClientServerPair(t, imap.ConnStateSelected)
11+
defer client.Close()
12+
defer server.Close()
13+
14+
idleCmd, err := client.Idle()
15+
if err != nil {
16+
t.Fatalf("Idle() = %v", err)
17+
}
18+
// TODO: test unilateral updates
19+
if err := idleCmd.Close(); err != nil {
20+
t.Errorf("Close() = %v", err)
21+
}
22+
}
23+
24+
func TestIdle_closedConn(t *testing.T) {
25+
client, server := newClientServerPair(t, imap.ConnStateSelected)
26+
defer client.Close()
27+
defer server.Close()
28+
29+
idleCmd, err := client.Idle()
30+
if err != nil {
31+
t.Fatalf("Idle() = %v", err)
32+
}
33+
defer idleCmd.Close()
34+
35+
if err := client.Close(); err != nil {
36+
t.Fatalf("client.Close() = %v", err)
37+
}
38+
39+
if err := idleCmd.Wait(); err == nil {
40+
t.Errorf("IdleCommand.Wait() = nil, want an error")
41+
}
42+
}

0 commit comments

Comments
 (0)