|
@@ -0,0 +1,90 @@
|
|
|
+package guerrilla
|
|
|
+
|
|
|
+import (
|
|
|
+ "testing"
|
|
|
+
|
|
|
+ "bufio"
|
|
|
+ "fmt"
|
|
|
+ "github.com/flashmob/go-guerrilla/backends"
|
|
|
+ "github.com/flashmob/go-guerrilla/mocks"
|
|
|
+ "net/textproto"
|
|
|
+ "strings"
|
|
|
+ "sync"
|
|
|
+)
|
|
|
+
|
|
|
+// getMockServerConfig gets a mock ServerConfig struct used for creating a new server
|
|
|
+func getMockServerConfig() *ServerConfig {
|
|
|
+ sc := &ServerConfig{
|
|
|
+ IsEnabled: true, // not tested here
|
|
|
+ Hostname: "saggydimes.test.com",
|
|
|
+ MaxSize: 1024, // smtp message max size
|
|
|
+ PrivateKeyFile: "./tests/mail.guerrillamail.com.key.pem",
|
|
|
+ PublicKeyFile: "./tests/mail.guerrillamail.com.cert.pem",
|
|
|
+ Timeout: 5,
|
|
|
+ ListenInterface: "127.0.0.1:2529",
|
|
|
+ StartTLSOn: true,
|
|
|
+ TLSAlwaysOn: false,
|
|
|
+ MaxClients: 30, // not tested here
|
|
|
+ LogFile: "/dev/stdout",
|
|
|
+ }
|
|
|
+ return sc
|
|
|
+}
|
|
|
+
|
|
|
+// getMockServerConn gets a new server using sc. Server will be using a mocked TCP connection
|
|
|
+// using the dummy backend
|
|
|
+// RCP TO command only allows test.com host
|
|
|
+func getMockServerConn(sc *ServerConfig, t *testing.T) (*mocks.Conn, *server) {
|
|
|
+
|
|
|
+ backend, err := backends.New("dummy", backends.BackendConfig{"log_received_mails": true})
|
|
|
+ if err != nil {
|
|
|
+ t.Error("new dummy backend failed because:", err)
|
|
|
+ }
|
|
|
+ server, err := newServer(sc, backend)
|
|
|
+ if err != nil {
|
|
|
+ t.Error("new server failed because:", err)
|
|
|
+ } else {
|
|
|
+ server.setAllowedHosts([]string{"test.com"})
|
|
|
+ }
|
|
|
+ conn := mocks.NewConn()
|
|
|
+ return conn, server
|
|
|
+}
|
|
|
+
|
|
|
+func TestHandleClient(t *testing.T) {
|
|
|
+
|
|
|
+ sc := getMockServerConfig()
|
|
|
+ conn, server := getMockServerConn(sc, t)
|
|
|
+ // call the serve.handleClient() func in a goroutine.
|
|
|
+ client := NewClient(conn.Server, 1)
|
|
|
+ var wg sync.WaitGroup
|
|
|
+ wg.Add(1)
|
|
|
+ go func() {
|
|
|
+ server.handleClient(client)
|
|
|
+ wg.Done()
|
|
|
+ }()
|
|
|
+ // Wait for the greeting from the server
|
|
|
+ r := textproto.NewReader(bufio.NewReader(conn.Client))
|
|
|
+ line, _ := r.ReadLine()
|
|
|
+ fmt.Println(line)
|
|
|
+ w := textproto.NewWriter(bufio.NewWriter(conn.Client))
|
|
|
+ w.PrintfLine("HELO test.test.com")
|
|
|
+ line, _ = r.ReadLine()
|
|
|
+ fmt.Println(line)
|
|
|
+ w.PrintfLine("QUIT")
|
|
|
+ line, _ = r.ReadLine()
|
|
|
+ fmt.Println("line is:", line)
|
|
|
+ expected := "221 Bye"
|
|
|
+ if strings.Index(line, expected) != 0 {
|
|
|
+ t.Error("expected", expected, "but got:", line)
|
|
|
+ }
|
|
|
+ wg.Wait() // wait for handleClient to exit
|
|
|
+}
|
|
|
+
|
|
|
+// TODO
|
|
|
+// - test github issue #44 and #42
|
|
|
+// - test other commands
|
|
|
+
|
|
|
+// also, could test
|
|
|
+// - test allowsHost() and allowsHost()
|
|
|
+// - test isInTransaction() (make sure it returns true after MAIL command, but false after HELO/EHLO/RSET/end of DATA
|
|
|
+// - test to make sure client envelope
|
|
|
+// - perhaps anything else that can be tested in server_test.go
|