1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
|
package server_test
import (
"bufio"
"io"
"net"
"strings"
"testing"
"github.com/emersion/go-imap/server"
"github.com/emersion/go-sasl"
)
func testServerGreeted(t *testing.T) (s *server.Server, c net.Conn, scanner *bufio.Scanner) {
s, c = testServer(t)
scanner = bufio.NewScanner(c)
scanner.Scan() // Greeting
return
}
func TestCapability(t *testing.T) {
s, c, scanner := testServerGreeted(t)
defer s.Close()
defer c.Close()
io.WriteString(c, "a001 CAPABILITY\r\n")
scanner.Scan()
if scanner.Text() != "* CAPABILITY IMAP4rev1 "+builtinExtensions+" AUTH=PLAIN" {
t.Fatal("Bad capability:", scanner.Text())
}
scanner.Scan()
if !strings.HasPrefix(scanner.Text(), "a001 OK ") {
t.Fatal("Bad status response:", scanner.Text())
}
}
func TestNoop(t *testing.T) {
s, c, scanner := testServerGreeted(t)
defer s.Close()
defer c.Close()
io.WriteString(c, "a001 NOOP\r\n")
scanner.Scan()
if !strings.HasPrefix(scanner.Text(), "a001 OK ") {
t.Fatal("Bad status response:", scanner.Text())
}
}
func TestLogout(t *testing.T) {
s, c, scanner := testServerGreeted(t)
defer s.Close()
defer c.Close()
io.WriteString(c, "a001 LOGOUT\r\n")
scanner.Scan()
if !strings.HasPrefix(scanner.Text(), "* BYE ") {
t.Fatal("Bad BYE response:", scanner.Text())
}
scanner.Scan()
if !strings.HasPrefix(scanner.Text(), "a001 OK ") {
t.Fatal("Bad status response:", scanner.Text())
}
}
type xnoop struct{}
func (ext *xnoop) Capabilities(server.Conn) []string {
return []string{"XNOOP"}
}
func (ext *xnoop) Command(string) server.HandlerFactory {
return nil
}
func TestServer_Enable(t *testing.T) {
s, c, scanner := testServerGreeted(t)
defer s.Close()
defer c.Close()
s.Enable(&xnoop{})
io.WriteString(c, "a001 CAPABILITY\r\n")
scanner.Scan()
if scanner.Text() != "* CAPABILITY IMAP4rev1 "+builtinExtensions+" AUTH=PLAIN XNOOP" {
t.Fatal("Bad capability:", scanner.Text())
}
scanner.Scan()
if !strings.HasPrefix(scanner.Text(), "a001 OK ") {
t.Fatal("Bad status response:", scanner.Text())
}
}
type xnoopAuth struct{}
func (ext *xnoopAuth) Next(response []byte) (challenge []byte, done bool, err error) {
done = true
return
}
func TestServer_EnableAuth(t *testing.T) {
s, c, scanner := testServerGreeted(t)
defer s.Close()
defer c.Close()
s.EnableAuth("XNOOP", func(server.Conn) sasl.Server {
return &xnoopAuth{}
})
io.WriteString(c, "a001 CAPABILITY\r\n")
scanner.Scan()
if scanner.Text() != "* CAPABILITY IMAP4rev1 "+builtinExtensions+" AUTH=PLAIN AUTH=XNOOP" &&
scanner.Text() != "* CAPABILITY IMAP4rev1 "+builtinExtensions+" AUTH=XNOOP AUTH=PLAIN" {
t.Fatal("Bad capability:", scanner.Text())
}
scanner.Scan()
if !strings.HasPrefix(scanner.Text(), "a001 OK ") {
t.Fatal("Bad status response:", scanner.Text())
}
}
|