93 lines
2.0 KiB
Go
93 lines
2.0 KiB
Go
|
package fasthttputil
|
||
|
|
||
|
import (
|
||
|
"bytes"
|
||
|
"fmt"
|
||
|
"testing"
|
||
|
"time"
|
||
|
)
|
||
|
|
||
|
func TestInmemoryListener(t *testing.T) {
|
||
|
ln := NewInmemoryListener()
|
||
|
|
||
|
ch := make(chan struct{})
|
||
|
for i := 0; i < 10; i++ {
|
||
|
go func(n int) {
|
||
|
conn, err := ln.Dial()
|
||
|
if err != nil {
|
||
|
t.Fatalf("unexpected error: %s", err)
|
||
|
}
|
||
|
defer conn.Close()
|
||
|
req := fmt.Sprintf("request_%d", n)
|
||
|
nn, err := conn.Write([]byte(req))
|
||
|
if err != nil {
|
||
|
t.Fatalf("unexpected error: %s", err)
|
||
|
}
|
||
|
if nn != len(req) {
|
||
|
t.Fatalf("unexpected number of bytes written: %d. Expecting %d", nn, len(req))
|
||
|
}
|
||
|
buf := make([]byte, 30)
|
||
|
nn, err = conn.Read(buf)
|
||
|
if err != nil {
|
||
|
t.Fatalf("unexpected error: %s", err)
|
||
|
}
|
||
|
buf = buf[:nn]
|
||
|
resp := fmt.Sprintf("response_%d", n)
|
||
|
if nn != len(resp) {
|
||
|
t.Fatalf("unexpected number of bytes read: %d. Expecting %d", nn, len(resp))
|
||
|
}
|
||
|
if string(buf) != resp {
|
||
|
t.Fatalf("unexpected response %q. Expecting %q", buf, resp)
|
||
|
}
|
||
|
ch <- struct{}{}
|
||
|
}(i)
|
||
|
}
|
||
|
|
||
|
serverCh := make(chan struct{})
|
||
|
go func() {
|
||
|
for {
|
||
|
conn, err := ln.Accept()
|
||
|
if err != nil {
|
||
|
close(serverCh)
|
||
|
return
|
||
|
}
|
||
|
defer conn.Close()
|
||
|
buf := make([]byte, 30)
|
||
|
n, err := conn.Read(buf)
|
||
|
if err != nil {
|
||
|
t.Fatalf("unexpected error: %s", err)
|
||
|
}
|
||
|
buf = buf[:n]
|
||
|
if !bytes.HasPrefix(buf, []byte("request_")) {
|
||
|
t.Fatalf("unexpected request prefix %q. Expecting %q", buf, "request_")
|
||
|
}
|
||
|
resp := fmt.Sprintf("response_%s", buf[len("request_"):])
|
||
|
n, err = conn.Write([]byte(resp))
|
||
|
if err != nil {
|
||
|
t.Fatalf("unexpected error: %s", err)
|
||
|
}
|
||
|
if n != len(resp) {
|
||
|
t.Fatalf("unexpected number of bytes written: %d. Expecting %d", n, len(resp))
|
||
|
}
|
||
|
}
|
||
|
}()
|
||
|
|
||
|
for i := 0; i < 10; i++ {
|
||
|
select {
|
||
|
case <-ch:
|
||
|
case <-time.After(time.Second):
|
||
|
t.Fatalf("timeout")
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if err := ln.Close(); err != nil {
|
||
|
t.Fatalf("unexpected error: %s", err)
|
||
|
}
|
||
|
|
||
|
select {
|
||
|
case <-serverCh:
|
||
|
case <-time.After(time.Second):
|
||
|
t.Fatalf("timeout")
|
||
|
}
|
||
|
}
|