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