github.com/linapex/ethereum-dpos-chinese@v0.0.0-20190316121959-b78b3a4a1ece/p2p/simulations/adapters/inproc_test.go (about)

     1  
     2  //<developer>
     3  //    <name>linapex 曹一峰</name>
     4  //    <email>linapex@163.com</email>
     5  //    <wx>superexc</wx>
     6  //    <qqgroup>128148617</qqgroup>
     7  //    <url>https://jsq.ink</url>
     8  //    <role>pku engineer</role>
     9  //    <date>2019-03-16 12:09:44</date>
    10  //</624342660789833728>
    11  
    12  
    13  package adapters
    14  
    15  import (
    16  	"bytes"
    17  	"encoding/binary"
    18  	"fmt"
    19  	"testing"
    20  	"time"
    21  
    22  	"github.com/ethereum/go-ethereum/p2p/simulations/pipes"
    23  )
    24  
    25  func TestTCPPipe(t *testing.T) {
    26  	c1, c2, err := pipes.TCPPipe()
    27  	if err != nil {
    28  		t.Fatal(err)
    29  	}
    30  
    31  	done := make(chan struct{})
    32  
    33  	go func() {
    34  		msgs := 50
    35  		size := 1024
    36  		for i := 0; i < msgs; i++ {
    37  			msg := make([]byte, size)
    38  			_ = binary.PutUvarint(msg, uint64(i))
    39  
    40  			_, err := c1.Write(msg)
    41  			if err != nil {
    42  				t.Fatal(err)
    43  			}
    44  		}
    45  
    46  		for i := 0; i < msgs; i++ {
    47  			msg := make([]byte, size)
    48  			_ = binary.PutUvarint(msg, uint64(i))
    49  
    50  			out := make([]byte, size)
    51  			_, err := c2.Read(out)
    52  			if err != nil {
    53  				t.Fatal(err)
    54  			}
    55  
    56  			if !bytes.Equal(msg, out) {
    57  				t.Fatalf("expected %#v, got %#v", msg, out)
    58  			}
    59  		}
    60  		done <- struct{}{}
    61  	}()
    62  
    63  	select {
    64  	case <-done:
    65  	case <-time.After(5 * time.Second):
    66  		t.Fatal("test timeout")
    67  	}
    68  }
    69  
    70  func TestTCPPipeBidirections(t *testing.T) {
    71  	c1, c2, err := pipes.TCPPipe()
    72  	if err != nil {
    73  		t.Fatal(err)
    74  	}
    75  
    76  	done := make(chan struct{})
    77  
    78  	go func() {
    79  		msgs := 50
    80  		size := 7
    81  		for i := 0; i < msgs; i++ {
    82  			msg := []byte(fmt.Sprintf("ping %02d", i))
    83  
    84  			_, err := c1.Write(msg)
    85  			if err != nil {
    86  				t.Fatal(err)
    87  			}
    88  		}
    89  
    90  		for i := 0; i < msgs; i++ {
    91  			expected := []byte(fmt.Sprintf("ping %02d", i))
    92  
    93  			out := make([]byte, size)
    94  			_, err := c2.Read(out)
    95  			if err != nil {
    96  				t.Fatal(err)
    97  			}
    98  
    99  			if !bytes.Equal(expected, out) {
   100  				t.Fatalf("expected %#v, got %#v", out, expected)
   101  			} else {
   102  				msg := []byte(fmt.Sprintf("pong %02d", i))
   103  				_, err := c2.Write(msg)
   104  				if err != nil {
   105  					t.Fatal(err)
   106  				}
   107  			}
   108  		}
   109  
   110  		for i := 0; i < msgs; i++ {
   111  			expected := []byte(fmt.Sprintf("pong %02d", i))
   112  
   113  			out := make([]byte, size)
   114  			_, err := c1.Read(out)
   115  			if err != nil {
   116  				t.Fatal(err)
   117  			}
   118  
   119  			if !bytes.Equal(expected, out) {
   120  				t.Fatalf("expected %#v, got %#v", out, expected)
   121  			}
   122  		}
   123  		done <- struct{}{}
   124  	}()
   125  
   126  	select {
   127  	case <-done:
   128  	case <-time.After(5 * time.Second):
   129  		t.Fatal("test timeout")
   130  	}
   131  }
   132  
   133  func TestNetPipe(t *testing.T) {
   134  	c1, c2, err := pipes.NetPipe()
   135  	if err != nil {
   136  		t.Fatal(err)
   137  	}
   138  
   139  	done := make(chan struct{})
   140  
   141  	go func() {
   142  		msgs := 50
   143  		size := 1024
   144  //网管阻塞,因此写操作是异步发出的。
   145  		go func() {
   146  			for i := 0; i < msgs; i++ {
   147  				msg := make([]byte, size)
   148  				_ = binary.PutUvarint(msg, uint64(i))
   149  
   150  				_, err := c1.Write(msg)
   151  				if err != nil {
   152  					t.Fatal(err)
   153  				}
   154  			}
   155  		}()
   156  
   157  		for i := 0; i < msgs; i++ {
   158  			msg := make([]byte, size)
   159  			_ = binary.PutUvarint(msg, uint64(i))
   160  
   161  			out := make([]byte, size)
   162  			_, err := c2.Read(out)
   163  			if err != nil {
   164  				t.Fatal(err)
   165  			}
   166  
   167  			if !bytes.Equal(msg, out) {
   168  				t.Fatalf("expected %#v, got %#v", msg, out)
   169  			}
   170  		}
   171  
   172  		done <- struct{}{}
   173  	}()
   174  
   175  	select {
   176  	case <-done:
   177  	case <-time.After(5 * time.Second):
   178  		t.Fatal("test timeout")
   179  	}
   180  }
   181  
   182  func TestNetPipeBidirections(t *testing.T) {
   183  	c1, c2, err := pipes.NetPipe()
   184  	if err != nil {
   185  		t.Fatal(err)
   186  	}
   187  
   188  	done := make(chan struct{})
   189  
   190  	go func() {
   191  		msgs := 1000
   192  		size := 8
   193  		pingTemplate := "ping %03d"
   194  		pongTemplate := "pong %03d"
   195  
   196  //网管阻塞,因此写操作是异步发出的。
   197  		go func() {
   198  			for i := 0; i < msgs; i++ {
   199  				msg := []byte(fmt.Sprintf(pingTemplate, i))
   200  
   201  				_, err := c1.Write(msg)
   202  				if err != nil {
   203  					t.Fatal(err)
   204  				}
   205  			}
   206  		}()
   207  
   208  //网管阻塞,因此对pong的读取是异步发出的。
   209  		go func() {
   210  			for i := 0; i < msgs; i++ {
   211  				expected := []byte(fmt.Sprintf(pongTemplate, i))
   212  
   213  				out := make([]byte, size)
   214  				_, err := c1.Read(out)
   215  				if err != nil {
   216  					t.Fatal(err)
   217  				}
   218  
   219  				if !bytes.Equal(expected, out) {
   220  					t.Fatalf("expected %#v, got %#v", expected, out)
   221  				}
   222  			}
   223  
   224  			done <- struct{}{}
   225  		}()
   226  
   227  //期望读取ping,并用pong响应备用连接
   228  		for i := 0; i < msgs; i++ {
   229  			expected := []byte(fmt.Sprintf(pingTemplate, i))
   230  
   231  			out := make([]byte, size)
   232  			_, err := c2.Read(out)
   233  			if err != nil {
   234  				t.Fatal(err)
   235  			}
   236  
   237  			if !bytes.Equal(expected, out) {
   238  				t.Fatalf("expected %#v, got %#v", expected, out)
   239  			} else {
   240  				msg := []byte(fmt.Sprintf(pongTemplate, i))
   241  
   242  				_, err := c2.Write(msg)
   243  				if err != nil {
   244  					t.Fatal(err)
   245  				}
   246  			}
   247  		}
   248  	}()
   249  
   250  	select {
   251  	case <-done:
   252  	case <-time.After(5 * time.Second):
   253  		t.Fatal("test timeout")
   254  	}
   255  }
   256