You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
69 lines
1.3 KiB
Go
69 lines
1.3 KiB
Go
package ch3
|
|
|
|
import (
|
|
"io"
|
|
"net"
|
|
"testing"
|
|
)
|
|
|
|
func TestDial(t *testing.T) {
|
|
//create a listener on a random port to make out test connection to
|
|
listener, err := net.Listen("tcp", "127.0.0.1:0")
|
|
t.Log("Test server listening on:", listener.Addr().String())
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
// channel that receives struct objects
|
|
done := make(chan struct{})
|
|
|
|
// Goroutine (aka handler) for listening for connections
|
|
go func() {
|
|
defer func() { done <- struct{}{} }()
|
|
|
|
for {
|
|
conn, err := listener.Accept()
|
|
if err != nil {
|
|
t.Log(err)
|
|
return
|
|
}
|
|
// goroutine for responding to connection requests
|
|
go func(c net.Conn) {
|
|
defer func() {
|
|
c.Close()
|
|
done <- struct{}{}
|
|
}()
|
|
|
|
// create a slice of size 1024 (1 kilobyte)
|
|
buf := make([]byte, 1024)
|
|
for {
|
|
// reads up to 1024 bytes at a time from the socket
|
|
n, err := c.Read(buf)
|
|
if err != nil {
|
|
// c.Read returns io.EOF when FIN packet (graceful termination) is received
|
|
if err != io.EOF {
|
|
t.Log("FIN packet received.")
|
|
t.Error(err)
|
|
}
|
|
return
|
|
}
|
|
// logs the bytes it receives
|
|
t.Logf("received: %q", buf[:n])
|
|
}
|
|
}(conn)
|
|
|
|
}
|
|
}()
|
|
|
|
// Now we make our client
|
|
conn, err := net.Dial("tcp", listener.Addr().String())
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
conn.Close()
|
|
<-done
|
|
listener.Close()
|
|
<-done
|
|
}
|