1 // Copyright 2010 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
17 type authTest struct {
24 var authTests = []authTest{
25 {PlainAuth("", "user", "pass", "testserver"), []string{}, "PLAIN", []string{"\x00user\x00pass"}},
26 {PlainAuth("foo", "bar", "baz", "testserver"), []string{}, "PLAIN", []string{"foo\x00bar\x00baz"}},
29 func TestAuth(t *testing.T) {
31 for i, test := range authTests {
32 name, resp, err := test.auth.Start(&ServerInfo{"testserver", true, nil})
33 if name != test.name {
34 t.Errorf("#%d got name %s, expected %s", i, name, test.name)
36 if !bytes.Equal(resp, []byte(test.responses[0])) {
37 t.Errorf("#%d got response %s, expected %s", i, resp, test.responses[0])
40 t.Errorf("#%d error: %s", i, err.String())
42 for j := range test.challenges {
43 challenge := []byte(test.challenges[j])
44 expected := []byte(test.responses[j+1])
45 resp, err := test.auth.Next(challenge, true)
47 t.Errorf("#%d error: %s", i, err.String())
50 if !bytes.Equal(resp, expected) {
51 t.Errorf("#%d got %s, expected %s", i, resp, expected)
62 func (f faker) Close() os.Error {
66 func TestBasic(t *testing.T) {
67 basicServer = strings.Join(strings.Split(basicServer, "\n", -1), "\r\n")
68 basicClient = strings.Join(strings.Split(basicClient, "\n", -1), "\r\n")
70 var cmdbuf bytes.Buffer
71 bcmdbuf := bufio.NewWriter(&cmdbuf)
73 fake.ReadWriter = bufio.NewReadWriter(bufio.NewReader(strings.NewReader(basicServer)), bcmdbuf)
74 c := &Client{Text: textproto.NewConn(fake)}
76 if err := c.helo(); err != nil {
77 t.Fatalf("HELO failed: %s", err.String())
79 if err := c.ehlo(); err == nil {
80 t.Fatalf("Expected first EHLO to fail")
82 if err := c.ehlo(); err != nil {
83 t.Fatalf("Second EHLO failed: %s", err.String())
86 if ok, args := c.Extension("aUtH"); !ok || args != "LOGIN PLAIN" {
87 t.Fatalf("Expected AUTH supported")
89 if ok, _ := c.Extension("DSN"); ok {
90 t.Fatalf("Shouldn't support DSN")
93 if err := c.Mail("user@gmail.com"); err == nil {
94 t.Fatalf("MAIL should require authentication")
97 if err := c.Verify("user1@gmail.com"); err == nil {
98 t.Fatalf("First VRFY: expected no verification")
100 if err := c.Verify("user2@gmail.com"); err != nil {
101 t.Fatalf("Second VRFY: expected verification, got %s", err)
104 // fake TLS so authentication won't complain
106 c.serverName = "smtp.google.com"
107 if err := c.Auth(PlainAuth("", "user", "pass", "smtp.google.com")); err != nil {
108 t.Fatalf("AUTH failed: %s", err.String())
111 if err := c.Mail("user@gmail.com"); err != nil {
112 t.Fatalf("MAIL failed: %s", err.String())
114 if err := c.Rcpt("golang-nuts@googlegroups.com"); err != nil {
115 t.Fatalf("RCPT failed: %s", err.String())
117 msg := `From: user@gmail.com
118 To: golang-nuts@googlegroups.com
119 Subject: Hooray for Go
126 t.Fatalf("DATA failed: %s", err.String())
128 if _, err := w.Write([]byte(msg)); err != nil {
129 t.Fatalf("Data write failed: %s", err.String())
131 if err := w.Close(); err != nil {
132 t.Fatalf("Bad data response: %s", err.String())
135 if err := c.Quit(); err != nil {
136 t.Fatalf("QUIT failed: %s", err.String())
140 actualcmds := cmdbuf.String()
141 if basicClient != actualcmds {
142 t.Fatalf("Got:\n%s\nExpected:\n%s", actualcmds, basicClient)
146 var basicServer = `250 mx.google.com at your service
147 502 Unrecognized command.
148 250-mx.google.com at your service
152 530 Authentication required
153 252 Send some mail, I'll try my best
163 var basicClient = `HELO localhost
166 MAIL FROM:<user@gmail.com> BODY=8BITMIME
169 AUTH PLAIN AHVzZXIAcGFzcw==
170 MAIL FROM:<user@gmail.com> BODY=8BITMIME
171 RCPT TO:<golang-nuts@googlegroups.com>
174 To: golang-nuts@googlegroups.com
175 Subject: Hooray for Go