|
|
@@ -156,14 +156,18 @@ func TestProtocolHandshake(t *testing.T) {
|
|
|
node1 = &discover.Node{ID: discover.PubkeyID(&prv1.PublicKey), IP: net.IP{5, 6, 7, 8}, TCP: 44}
|
|
|
hs1 = &protoHandshake{Version: 3, ID: node1.ID, Caps: []Cap{{"c", 1}, {"d", 3}}}
|
|
|
|
|
|
- fd0, fd1 = net.Pipe()
|
|
|
- wg sync.WaitGroup
|
|
|
+ wg sync.WaitGroup
|
|
|
)
|
|
|
|
|
|
+ fd0, fd1, err := tcpPipe()
|
|
|
+ if err != nil {
|
|
|
+ t.Fatal(err)
|
|
|
+ }
|
|
|
+
|
|
|
wg.Add(2)
|
|
|
go func() {
|
|
|
defer wg.Done()
|
|
|
- defer fd1.Close()
|
|
|
+ defer fd0.Close()
|
|
|
rlpx := newRLPX(fd0)
|
|
|
remid, err := rlpx.doEncHandshake(prv0, node1)
|
|
|
if err != nil {
|
|
|
@@ -597,3 +601,31 @@ func TestHandshakeForwardCompatibility(t *testing.T) {
|
|
|
t.Errorf("ingress-mac('foo') mismatch:\ngot %x\nwant %x", fooIngressHash, wantFooIngressHash)
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+// tcpPipe creates an in process full duplex pipe based on a localhost TCP socket
|
|
|
+func tcpPipe() (net.Conn, net.Conn, error) {
|
|
|
+ l, err := net.Listen("tcp", "127.0.0.1:0")
|
|
|
+ if err != nil {
|
|
|
+ return nil, nil, err
|
|
|
+ }
|
|
|
+ defer l.Close()
|
|
|
+
|
|
|
+ var aconn net.Conn
|
|
|
+ aerr := make(chan error, 1)
|
|
|
+ go func() {
|
|
|
+ var err error
|
|
|
+ aconn, err = l.Accept()
|
|
|
+ aerr <- err
|
|
|
+ }()
|
|
|
+
|
|
|
+ dconn, err := net.Dial("tcp", l.Addr().String())
|
|
|
+ if err != nil {
|
|
|
+ <-aerr
|
|
|
+ return nil, nil, err
|
|
|
+ }
|
|
|
+ if err := <-aerr; err != nil {
|
|
|
+ dconn.Close()
|
|
|
+ return nil, nil, err
|
|
|
+ }
|
|
|
+ return aconn, dconn, nil
|
|
|
+}
|