Skip to content

Instantly share code, notes, and snippets.

@memememomo
Created November 2, 2014 05:28
Show Gist options
  • Select an option

  • Save memememomo/004824700a859980fd12 to your computer and use it in GitHub Desktop.

Select an option

Save memememomo/004824700a859980fd12 to your computer and use it in GitHub Desktop.
go-tcptestを使って、echoサーバをテストする ref: http://qiita.com/uchiko/items/240d6c5d56c15027907a
package echoserver
import (
"bufio"
"fmt"
"net"
"strconv"
)
type Server struct {
Host string
Port int
}
func (s *Server) Run() error {
server, err := net.Listen("tcp", s.Host+":"+strconv.Itoa(s.Port))
if err != nil {
return err
}
conns := s.ClientConns(server)
for {
go s.HandleConn(<-conns)
}
return nil
}
func (s *Server) ClientConns(listener net.Listener) chan net.Conn {
ch := make(chan net.Conn)
i := 0
go func() {
for {
client, err := listener.Accept()
if err != nil {
fmt.Printf("couldn't accept: " + err.Error())
continue
}
i++
fmt.Printf("%d: %v <-> %v\n", i, client.LocalAddr(), client.RemoteAddr())
ch <- client
}
}()
return ch
}
func (s *Server) HandleConn(client net.Conn) {
b := bufio.NewReader(client)
for {
line, err := b.ReadBytes('\n')
if err != nil { // EOF, or worse
break
}
client.Write(line)
}
}
package echoserver
import (
"bufio"
"fmt"
"github.com/lestrrat/go-tcptest"
"log"
"net"
"strconv"
"testing"
"time"
)
func TestRun(t *testing.T) {
echo := func(port int) {
server := &Server{Host: "localhost", Port: port}
err := server.Run()
if err != nil {
t.Error("Error")
}
}
server, err := tcptest.Start(echo, 30*time.Second)
if err != nil {
t.Error("Failed to start echoserver: %s", err)
}
log.Printf("echoserver started on port %d", server.Port())
conn, err := net.Dial("tcp", "localhost:"+strconv.Itoa(server.Port()))
if err != nil {
t.Error("Failed to connect to echoserver")
}
fmt.Fprintf(conn, "test hogehoge\n")
res, err := bufio.NewReader(conn).ReadString('\n')
if res != "test hogehoge\n" {
t.Error("Wrong Response")
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment