github.com/linapex/ethereum-dpos-chinese@v0.0.0-20190316121959-b78b3a4a1ece/p2p/message_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  //</624342658554269696>
    11  
    12  
    13  package p2p
    14  
    15  import (
    16  	"bytes"
    17  	"encoding/hex"
    18  	"fmt"
    19  	"io"
    20  	"runtime"
    21  	"strings"
    22  	"testing"
    23  	"time"
    24  )
    25  
    26  func ExampleMsgPipe() {
    27  	rw1, rw2 := MsgPipe()
    28  	go func() {
    29  		Send(rw1, 8, [][]byte{{0, 0}})
    30  		Send(rw1, 5, [][]byte{{1, 1}})
    31  		rw1.Close()
    32  	}()
    33  
    34  	for {
    35  		msg, err := rw2.ReadMsg()
    36  		if err != nil {
    37  			break
    38  		}
    39  		var data [][]byte
    40  		msg.Decode(&data)
    41  		fmt.Printf("msg: %d, %x\n", msg.Code, data[0])
    42  	}
    43  //输出:
    44  //味精:8, 0000
    45  //味精:5, 0101
    46  }
    47  
    48  func TestMsgPipeUnblockWrite(t *testing.T) {
    49  loop:
    50  	for i := 0; i < 100; i++ {
    51  		rw1, rw2 := MsgPipe()
    52  		done := make(chan struct{})
    53  		go func() {
    54  			if err := SendItems(rw1, 1); err == nil {
    55  				t.Error("EncodeMsg returned nil error")
    56  			} else if err != ErrPipeClosed {
    57  				t.Errorf("EncodeMsg returned wrong error: got %v, want %v", err, ErrPipeClosed)
    58  			}
    59  			close(done)
    60  		}()
    61  
    62  //此调用应确保EncodeMsg正在等待
    63  //有时交付。如果不这样做,关闭很可能
    64  //在encodemsg启动之前执行,然后我们将不测试
    65  //所有病例。
    66  		runtime.Gosched()
    67  
    68  		rw2.Close()
    69  		select {
    70  		case <-done:
    71  		case <-time.After(200 * time.Millisecond):
    72  			t.Errorf("write didn't unblock")
    73  			break loop
    74  		}
    75  	}
    76  }
    77  
    78  //如果未正确执行并发关闭操作,则此测试应该会死机。
    79  func TestMsgPipeConcurrentClose(t *testing.T) {
    80  	rw1, _ := MsgPipe()
    81  	for i := 0; i < 10; i++ {
    82  		go rw1.Close()
    83  	}
    84  }
    85  
    86  func TestEOFSignal(t *testing.T) {
    87  	rb := make([]byte, 10)
    88  
    89  //空读者
    90  	eof := make(chan struct{}, 1)
    91  	sig := &eofSignal{new(bytes.Buffer), 0, eof}
    92  	if n, err := sig.Read(rb); n != 0 || err != io.EOF {
    93  		t.Errorf("Read returned unexpected values: (%v, %v)", n, err)
    94  	}
    95  	select {
    96  	case <-eof:
    97  	default:
    98  		t.Error("EOF chan not signaled")
    99  	}
   100  
   101  //错误前计数
   102  	eof = make(chan struct{}, 1)
   103  	sig = &eofSignal{bytes.NewBufferString("aaaaaaaa"), 4, eof}
   104  	if n, err := sig.Read(rb); n != 4 || err != nil {
   105  		t.Errorf("Read returned unexpected values: (%v, %v)", n, err)
   106  	}
   107  	select {
   108  	case <-eof:
   109  	default:
   110  		t.Error("EOF chan not signaled")
   111  	}
   112  
   113  //计数前出错
   114  	eof = make(chan struct{}, 1)
   115  	sig = &eofSignal{bytes.NewBufferString("aaaa"), 999, eof}
   116  	if n, err := sig.Read(rb); n != 4 || err != nil {
   117  		t.Errorf("Read returned unexpected values: (%v, %v)", n, err)
   118  	}
   119  	if n, err := sig.Read(rb); n != 0 || err != io.EOF {
   120  		t.Errorf("Read returned unexpected values: (%v, %v)", n, err)
   121  	}
   122  	select {
   123  	case <-eof:
   124  	default:
   125  		t.Error("EOF chan not signaled")
   126  	}
   127  
   128  //如果两者都不发生,则无信号
   129  	eof = make(chan struct{}, 1)
   130  	sig = &eofSignal{bytes.NewBufferString("aaaaaaaaaaaaaaaaaaaaa"), 999, eof}
   131  	if n, err := sig.Read(rb); n != 10 || err != nil {
   132  		t.Errorf("Read returned unexpected values: (%v, %v)", n, err)
   133  	}
   134  	select {
   135  	case <-eof:
   136  		t.Error("unexpected EOF signal")
   137  	default:
   138  	}
   139  }
   140  
   141  func unhex(str string) []byte {
   142  	r := strings.NewReplacer("\t", "", " ", "", "\n", "")
   143  	b, err := hex.DecodeString(r.Replace(str))
   144  	if err != nil {
   145  		panic(fmt.Sprintf("invalid hex string: %q", str))
   146  	}
   147  	return b
   148  }
   149