|
@@ -20,8 +20,8 @@ import (
|
|
|
"bytes"
|
|
"bytes"
|
|
|
"encoding/binary"
|
|
"encoding/binary"
|
|
|
"fmt"
|
|
"fmt"
|
|
|
|
|
+ "sync"
|
|
|
"testing"
|
|
"testing"
|
|
|
- "time"
|
|
|
|
|
|
|
|
|
|
"github.com/ethereum/go-ethereum/p2p/simulations/pipes"
|
|
"github.com/ethereum/go-ethereum/p2p/simulations/pipes"
|
|
|
)
|
|
)
|
|
@@ -32,42 +32,26 @@ func TestTCPPipe(t *testing.T) {
|
|
|
t.Fatal(err)
|
|
t.Fatal(err)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- done := make(chan struct{})
|
|
|
|
|
-
|
|
|
|
|
- go func() {
|
|
|
|
|
- msgs := 50
|
|
|
|
|
- size := 1024
|
|
|
|
|
- for i := 0; i < msgs; i++ {
|
|
|
|
|
- msg := make([]byte, size)
|
|
|
|
|
- _ = binary.PutUvarint(msg, uint64(i))
|
|
|
|
|
-
|
|
|
|
|
- _, err := c1.Write(msg)
|
|
|
|
|
- if err != nil {
|
|
|
|
|
- t.Fatal(err)
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ msgs := 50
|
|
|
|
|
+ size := 1024
|
|
|
|
|
+ for i := 0; i < msgs; i++ {
|
|
|
|
|
+ msg := make([]byte, size)
|
|
|
|
|
+ binary.PutUvarint(msg, uint64(i))
|
|
|
|
|
+ if _, err := c1.Write(msg); err != nil {
|
|
|
|
|
+ t.Fatal(err)
|
|
|
}
|
|
}
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
- for i := 0; i < msgs; i++ {
|
|
|
|
|
- msg := make([]byte, size)
|
|
|
|
|
- _ = binary.PutUvarint(msg, uint64(i))
|
|
|
|
|
-
|
|
|
|
|
- out := make([]byte, size)
|
|
|
|
|
- _, err := c2.Read(out)
|
|
|
|
|
- if err != nil {
|
|
|
|
|
- t.Fatal(err)
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- if !bytes.Equal(msg, out) {
|
|
|
|
|
- t.Fatalf("expected %#v, got %#v", msg, out)
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ for i := 0; i < msgs; i++ {
|
|
|
|
|
+ msg := make([]byte, size)
|
|
|
|
|
+ binary.PutUvarint(msg, uint64(i))
|
|
|
|
|
+ out := make([]byte, size)
|
|
|
|
|
+ if _, err := c2.Read(out); err != nil {
|
|
|
|
|
+ t.Fatal(err)
|
|
|
|
|
+ }
|
|
|
|
|
+ if !bytes.Equal(msg, out) {
|
|
|
|
|
+ t.Fatalf("expected %#v, got %#v", msg, out)
|
|
|
}
|
|
}
|
|
|
- done <- struct{}{}
|
|
|
|
|
- }()
|
|
|
|
|
-
|
|
|
|
|
- select {
|
|
|
|
|
- case <-done:
|
|
|
|
|
- case <-time.After(5 * time.Second):
|
|
|
|
|
- t.Fatal("test timeout")
|
|
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -77,60 +61,41 @@ func TestTCPPipeBidirections(t *testing.T) {
|
|
|
t.Fatal(err)
|
|
t.Fatal(err)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- done := make(chan struct{})
|
|
|
|
|
-
|
|
|
|
|
- go func() {
|
|
|
|
|
- msgs := 50
|
|
|
|
|
- size := 7
|
|
|
|
|
- for i := 0; i < msgs; i++ {
|
|
|
|
|
- msg := []byte(fmt.Sprintf("ping %02d", i))
|
|
|
|
|
-
|
|
|
|
|
- _, err := c1.Write(msg)
|
|
|
|
|
- if err != nil {
|
|
|
|
|
- t.Fatal(err)
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ msgs := 50
|
|
|
|
|
+ size := 7
|
|
|
|
|
+ for i := 0; i < msgs; i++ {
|
|
|
|
|
+ msg := []byte(fmt.Sprintf("ping %02d", i))
|
|
|
|
|
+ if _, err := c1.Write(msg); err != nil {
|
|
|
|
|
+ t.Fatal(err)
|
|
|
}
|
|
}
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
- for i := 0; i < msgs; i++ {
|
|
|
|
|
- expected := []byte(fmt.Sprintf("ping %02d", i))
|
|
|
|
|
-
|
|
|
|
|
- out := make([]byte, size)
|
|
|
|
|
- _, err := c2.Read(out)
|
|
|
|
|
- if err != nil {
|
|
|
|
|
- t.Fatal(err)
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- if !bytes.Equal(expected, out) {
|
|
|
|
|
- t.Fatalf("expected %#v, got %#v", out, expected)
|
|
|
|
|
- } else {
|
|
|
|
|
- msg := []byte(fmt.Sprintf("pong %02d", i))
|
|
|
|
|
- _, err := c2.Write(msg)
|
|
|
|
|
- if err != nil {
|
|
|
|
|
- t.Fatal(err)
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ for i := 0; i < msgs; i++ {
|
|
|
|
|
+ expected := []byte(fmt.Sprintf("ping %02d", i))
|
|
|
|
|
+ out := make([]byte, size)
|
|
|
|
|
+ if _, err := c2.Read(out); err != nil {
|
|
|
|
|
+ t.Fatal(err)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- for i := 0; i < msgs; i++ {
|
|
|
|
|
- expected := []byte(fmt.Sprintf("pong %02d", i))
|
|
|
|
|
-
|
|
|
|
|
- out := make([]byte, size)
|
|
|
|
|
- _, err := c1.Read(out)
|
|
|
|
|
- if err != nil {
|
|
|
|
|
|
|
+ if !bytes.Equal(expected, out) {
|
|
|
|
|
+ t.Fatalf("expected %#v, got %#v", out, expected)
|
|
|
|
|
+ } else {
|
|
|
|
|
+ msg := []byte(fmt.Sprintf("pong %02d", i))
|
|
|
|
|
+ if _, err := c2.Write(msg); err != nil {
|
|
|
t.Fatal(err)
|
|
t.Fatal(err)
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
- if !bytes.Equal(expected, out) {
|
|
|
|
|
- t.Fatalf("expected %#v, got %#v", out, expected)
|
|
|
|
|
- }
|
|
|
|
|
}
|
|
}
|
|
|
- done <- struct{}{}
|
|
|
|
|
- }()
|
|
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
- select {
|
|
|
|
|
- case <-done:
|
|
|
|
|
- case <-time.After(5 * time.Second):
|
|
|
|
|
- t.Fatal("test timeout")
|
|
|
|
|
|
|
+ for i := 0; i < msgs; i++ {
|
|
|
|
|
+ expected := []byte(fmt.Sprintf("pong %02d", i))
|
|
|
|
|
+ out := make([]byte, size)
|
|
|
|
|
+ if _, err := c1.Read(out); err != nil {
|
|
|
|
|
+ t.Fatal(err)
|
|
|
|
|
+ }
|
|
|
|
|
+ if !bytes.Equal(expected, out) {
|
|
|
|
|
+ t.Fatalf("expected %#v, got %#v", out, expected)
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -140,46 +105,35 @@ func TestNetPipe(t *testing.T) {
|
|
|
t.Fatal(err)
|
|
t.Fatal(err)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- done := make(chan struct{})
|
|
|
|
|
|
|
+ msgs := 50
|
|
|
|
|
+ size := 1024
|
|
|
|
|
+ var wg sync.WaitGroup
|
|
|
|
|
+ defer wg.Wait()
|
|
|
|
|
|
|
|
|
|
+ // netPipe is blocking, so writes are emitted asynchronously
|
|
|
|
|
+ wg.Add(1)
|
|
|
go func() {
|
|
go func() {
|
|
|
- msgs := 50
|
|
|
|
|
- size := 1024
|
|
|
|
|
- // netPipe is blocking, so writes are emitted asynchronously
|
|
|
|
|
- go func() {
|
|
|
|
|
- for i := 0; i < msgs; i++ {
|
|
|
|
|
- msg := make([]byte, size)
|
|
|
|
|
- _ = binary.PutUvarint(msg, uint64(i))
|
|
|
|
|
-
|
|
|
|
|
- _, err := c1.Write(msg)
|
|
|
|
|
- if err != nil {
|
|
|
|
|
- t.Fatal(err)
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- }()
|
|
|
|
|
|
|
+ defer wg.Done()
|
|
|
|
|
|
|
|
for i := 0; i < msgs; i++ {
|
|
for i := 0; i < msgs; i++ {
|
|
|
msg := make([]byte, size)
|
|
msg := make([]byte, size)
|
|
|
- _ = binary.PutUvarint(msg, uint64(i))
|
|
|
|
|
-
|
|
|
|
|
- out := make([]byte, size)
|
|
|
|
|
- _, err := c2.Read(out)
|
|
|
|
|
- if err != nil {
|
|
|
|
|
- t.Fatal(err)
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- if !bytes.Equal(msg, out) {
|
|
|
|
|
- t.Fatalf("expected %#v, got %#v", msg, out)
|
|
|
|
|
|
|
+ binary.PutUvarint(msg, uint64(i))
|
|
|
|
|
+ if _, err := c1.Write(msg); err != nil {
|
|
|
|
|
+ t.Error(err)
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
- done <- struct{}{}
|
|
|
|
|
}()
|
|
}()
|
|
|
|
|
|
|
|
- select {
|
|
|
|
|
- case <-done:
|
|
|
|
|
- case <-time.After(5 * time.Second):
|
|
|
|
|
- t.Fatal("test timeout")
|
|
|
|
|
|
|
+ for i := 0; i < msgs; i++ {
|
|
|
|
|
+ msg := make([]byte, size)
|
|
|
|
|
+ binary.PutUvarint(msg, uint64(i))
|
|
|
|
|
+ out := make([]byte, size)
|
|
|
|
|
+ if _, err := c2.Read(out); err != nil {
|
|
|
|
|
+ t.Error(err)
|
|
|
|
|
+ }
|
|
|
|
|
+ if !bytes.Equal(msg, out) {
|
|
|
|
|
+ t.Errorf("expected %#v, got %#v", msg, out)
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -189,71 +143,60 @@ func TestNetPipeBidirections(t *testing.T) {
|
|
|
t.Fatal(err)
|
|
t.Fatal(err)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- done := make(chan struct{})
|
|
|
|
|
|
|
+ msgs := 1000
|
|
|
|
|
+ size := 8
|
|
|
|
|
+ pingTemplate := "ping %03d"
|
|
|
|
|
+ pongTemplate := "pong %03d"
|
|
|
|
|
+ var wg sync.WaitGroup
|
|
|
|
|
+ defer wg.Wait()
|
|
|
|
|
|
|
|
|
|
+ // netPipe is blocking, so writes are emitted asynchronously
|
|
|
|
|
+ wg.Add(1)
|
|
|
go func() {
|
|
go func() {
|
|
|
- msgs := 1000
|
|
|
|
|
- size := 8
|
|
|
|
|
- pingTemplate := "ping %03d"
|
|
|
|
|
- pongTemplate := "pong %03d"
|
|
|
|
|
-
|
|
|
|
|
- // netPipe is blocking, so writes are emitted asynchronously
|
|
|
|
|
- go func() {
|
|
|
|
|
- for i := 0; i < msgs; i++ {
|
|
|
|
|
- msg := []byte(fmt.Sprintf(pingTemplate, i))
|
|
|
|
|
|
|
+ defer wg.Done()
|
|
|
|
|
|
|
|
- _, err := c1.Write(msg)
|
|
|
|
|
- if err != nil {
|
|
|
|
|
- t.Fatal(err)
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- }()
|
|
|
|
|
-
|
|
|
|
|
- // netPipe is blocking, so reads for pong are emitted asynchronously
|
|
|
|
|
- go func() {
|
|
|
|
|
- for i := 0; i < msgs; i++ {
|
|
|
|
|
- expected := []byte(fmt.Sprintf(pongTemplate, i))
|
|
|
|
|
-
|
|
|
|
|
- out := make([]byte, size)
|
|
|
|
|
- _, err := c1.Read(out)
|
|
|
|
|
- if err != nil {
|
|
|
|
|
- t.Fatal(err)
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- if !bytes.Equal(expected, out) {
|
|
|
|
|
- t.Fatalf("expected %#v, got %#v", expected, out)
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ for i := 0; i < msgs; i++ {
|
|
|
|
|
+ msg := []byte(fmt.Sprintf(pingTemplate, i))
|
|
|
|
|
+ if _, err := c1.Write(msg); err != nil {
|
|
|
|
|
+ t.Error(err)
|
|
|
}
|
|
}
|
|
|
|
|
+ }
|
|
|
|
|
+ }()
|
|
|
|
|
|
|
|
- done <- struct{}{}
|
|
|
|
|
- }()
|
|
|
|
|
|
|
+ // netPipe is blocking, so reads for pong are emitted asynchronously
|
|
|
|
|
+ wg.Add(1)
|
|
|
|
|
+ go func() {
|
|
|
|
|
+ defer wg.Done()
|
|
|
|
|
|
|
|
- // expect to read pings, and respond with pongs to the alternate connection
|
|
|
|
|
for i := 0; i < msgs; i++ {
|
|
for i := 0; i < msgs; i++ {
|
|
|
- expected := []byte(fmt.Sprintf(pingTemplate, i))
|
|
|
|
|
-
|
|
|
|
|
|
|
+ expected := []byte(fmt.Sprintf(pongTemplate, i))
|
|
|
out := make([]byte, size)
|
|
out := make([]byte, size)
|
|
|
- _, err := c2.Read(out)
|
|
|
|
|
- if err != nil {
|
|
|
|
|
- t.Fatal(err)
|
|
|
|
|
|
|
+ if _, err := c1.Read(out); err != nil {
|
|
|
|
|
+ t.Error(err)
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
if !bytes.Equal(expected, out) {
|
|
if !bytes.Equal(expected, out) {
|
|
|
- t.Fatalf("expected %#v, got %#v", expected, out)
|
|
|
|
|
- } else {
|
|
|
|
|
- msg := []byte(fmt.Sprintf(pongTemplate, i))
|
|
|
|
|
-
|
|
|
|
|
- _, err := c2.Write(msg)
|
|
|
|
|
- if err != nil {
|
|
|
|
|
- t.Fatal(err)
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ t.Errorf("expected %#v, got %#v", expected, out)
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}()
|
|
}()
|
|
|
|
|
|
|
|
- select {
|
|
|
|
|
- case <-done:
|
|
|
|
|
- case <-time.After(5 * time.Second):
|
|
|
|
|
- t.Fatal("test timeout")
|
|
|
|
|
|
|
+ // expect to read pings, and respond with pongs to the alternate connection
|
|
|
|
|
+ for i := 0; i < msgs; i++ {
|
|
|
|
|
+ expected := []byte(fmt.Sprintf(pingTemplate, i))
|
|
|
|
|
+
|
|
|
|
|
+ out := make([]byte, size)
|
|
|
|
|
+ _, err := c2.Read(out)
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ t.Fatal(err)
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if !bytes.Equal(expected, out) {
|
|
|
|
|
+ t.Errorf("expected %#v, got %#v", expected, out)
|
|
|
|
|
+ } else {
|
|
|
|
|
+ msg := []byte(fmt.Sprintf(pongTemplate, i))
|
|
|
|
|
+ if _, err := c2.Write(msg); err != nil {
|
|
|
|
|
+ t.Fatal(err)
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|