94 lines
1.6 KiB
Go
94 lines
1.6 KiB
Go
package out
|
|
|
|
import (
|
|
"net"
|
|
"testing"
|
|
|
|
fs "github.com/farsightsec/golang-framestream"
|
|
)
|
|
|
|
func acceptOne(t *testing.T, l net.Listener) {
|
|
server, err := l.Accept()
|
|
if err != nil {
|
|
t.Fatalf("server accept: %s", err)
|
|
return
|
|
}
|
|
|
|
dec, err := fs.NewDecoder(server, &fs.DecoderOptions{
|
|
ContentType: []byte("protobuf:dnstap.Dnstap"),
|
|
Bidirectional: true,
|
|
})
|
|
if err != nil {
|
|
t.Fatalf("server decoder: %s", err)
|
|
return
|
|
}
|
|
|
|
if _, err := dec.Decode(); err != nil {
|
|
t.Errorf("server decode: %s", err)
|
|
}
|
|
|
|
if err := server.Close(); err != nil {
|
|
t.Error(err)
|
|
}
|
|
}
|
|
func sendOne(socket *Socket) error {
|
|
if _, err := socket.Write([]byte("frame")); err != nil {
|
|
return err
|
|
}
|
|
if err := socket.enc.Flush(); err != nil {
|
|
// Would happen during Write in real life.
|
|
socket.conn.Close()
|
|
socket.err = err
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
func TestSocket(t *testing.T) {
|
|
socket, err := NewSocket("dnstap.sock")
|
|
if err == nil {
|
|
t.Fatal("new socket: not listening but no error")
|
|
return
|
|
}
|
|
|
|
if err := sendOne(socket); err == nil {
|
|
t.Fatal("not listening but no error")
|
|
return
|
|
}
|
|
|
|
l, err := net.Listen("unix", "dnstap.sock")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
return
|
|
}
|
|
|
|
wait := make(chan bool)
|
|
go func() {
|
|
acceptOne(t, l)
|
|
wait <- true
|
|
}()
|
|
|
|
if err := sendOne(socket); err != nil {
|
|
t.Fatalf("send one: %s", err)
|
|
return
|
|
}
|
|
|
|
<-wait
|
|
if err := sendOne(socket); err == nil {
|
|
panic("must fail")
|
|
}
|
|
|
|
go func() {
|
|
acceptOne(t, l)
|
|
wait <- true
|
|
}()
|
|
|
|
if err := sendOne(socket); err != nil {
|
|
t.Fatalf("send one: %s", err)
|
|
return
|
|
}
|
|
|
|
<-wait
|
|
if err := l.Close(); err != nil {
|
|
t.Error(err)
|
|
}
|
|
}
|