github.com/yinchengtsinghua/golang-Eos-dpos-Ethereum@v0.0.0-20190121132951-92cc4225ed8e/p2p/message_test.go (about)

     1  
     2  //此源码被清华学神尹成大魔王专业翻译分析并修改
     3  //尹成QQ77025077
     4  //尹成微信18510341407
     5  //尹成所在QQ群721929980
     6  //尹成邮箱 yinc13@mails.tsinghua.edu.cn
     7  //尹成毕业于清华大学,微软区块链领域全球最有价值专家
     8  //https://mvp.microsoft.com/zh-cn/PublicProfile/4033620
     9  //版权所有2014 Go Ethereum作者
    10  //此文件是Go以太坊库的一部分。
    11  //
    12  //Go-Ethereum库是免费软件:您可以重新分发它和/或修改
    13  //根据GNU发布的较低通用公共许可证的条款
    14  //自由软件基金会,或者许可证的第3版,或者
    15  //(由您选择)任何更高版本。
    16  //
    17  //Go以太坊图书馆的发行目的是希望它会有用,
    18  //但没有任何保证;甚至没有
    19  //适销性或特定用途的适用性。见
    20  //GNU较低的通用公共许可证,了解更多详细信息。
    21  //
    22  //你应该收到一份GNU较低级别的公共许可证副本
    23  //以及Go以太坊图书馆。如果没有,请参见<http://www.gnu.org/licenses/>。
    24  
    25  package p2p
    26  
    27  import (
    28  	"bytes"
    29  	"encoding/hex"
    30  	"fmt"
    31  	"io"
    32  	"runtime"
    33  	"strings"
    34  	"testing"
    35  	"time"
    36  )
    37  
    38  func ExampleMsgPipe() {
    39  	rw1, rw2 := MsgPipe()
    40  	go func() {
    41  		Send(rw1, 8, [][]byte{{0, 0}})
    42  		Send(rw1, 5, [][]byte{{1, 1}})
    43  		rw1.Close()
    44  	}()
    45  
    46  	for {
    47  		msg, err := rw2.ReadMsg()
    48  		if err != nil {
    49  			break
    50  		}
    51  		var data [][]byte
    52  		msg.Decode(&data)
    53  		fmt.Printf("msg: %d, %x\n", msg.Code, data[0])
    54  	}
    55  //输出:
    56  //味精:8, 0000
    57  //味精:5, 0101
    58  }
    59  
    60  func TestMsgPipeUnblockWrite(t *testing.T) {
    61  loop:
    62  	for i := 0; i < 100; i++ {
    63  		rw1, rw2 := MsgPipe()
    64  		done := make(chan struct{})
    65  		go func() {
    66  			if err := SendItems(rw1, 1); err == nil {
    67  				t.Error("EncodeMsg returned nil error")
    68  			} else if err != ErrPipeClosed {
    69  				t.Errorf("EncodeMsg returned wrong error: got %v, want %v", err, ErrPipeClosed)
    70  			}
    71  			close(done)
    72  		}()
    73  
    74  //此调用应确保EncodeMsg正在等待
    75  //有时交付。如果不这样做,关闭很可能
    76  //在encodemsg启动之前执行,然后我们将不测试
    77  //所有病例。
    78  		runtime.Gosched()
    79  
    80  		rw2.Close()
    81  		select {
    82  		case <-done:
    83  		case <-time.After(200 * time.Millisecond):
    84  			t.Errorf("write didn't unblock")
    85  			break loop
    86  		}
    87  	}
    88  }
    89  
    90  //如果未正确执行并发关闭操作,则此测试应该会死机。
    91  func TestMsgPipeConcurrentClose(t *testing.T) {
    92  	rw1, _ := MsgPipe()
    93  	for i := 0; i < 10; i++ {
    94  		go rw1.Close()
    95  	}
    96  }
    97  
    98  func TestEOFSignal(t *testing.T) {
    99  	rb := make([]byte, 10)
   100  
   101  //空读者
   102  	eof := make(chan struct{}, 1)
   103  	sig := &eofSignal{new(bytes.Buffer), 0, eof}
   104  	if n, err := sig.Read(rb); n != 0 || err != io.EOF {
   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("aaaaaaaa"), 4, 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  	select {
   120  	case <-eof:
   121  	default:
   122  		t.Error("EOF chan not signaled")
   123  	}
   124  
   125  //计数前出错
   126  	eof = make(chan struct{}, 1)
   127  	sig = &eofSignal{bytes.NewBufferString("aaaa"), 999, eof}
   128  	if n, err := sig.Read(rb); n != 4 || err != nil {
   129  		t.Errorf("Read returned unexpected values: (%v, %v)", n, err)
   130  	}
   131  	if n, err := sig.Read(rb); n != 0 || err != io.EOF {
   132  		t.Errorf("Read returned unexpected values: (%v, %v)", n, err)
   133  	}
   134  	select {
   135  	case <-eof:
   136  	default:
   137  		t.Error("EOF chan not signaled")
   138  	}
   139  
   140  //如果两者都不发生,则无信号
   141  	eof = make(chan struct{}, 1)
   142  	sig = &eofSignal{bytes.NewBufferString("aaaaaaaaaaaaaaaaaaaaa"), 999, eof}
   143  	if n, err := sig.Read(rb); n != 10 || err != nil {
   144  		t.Errorf("Read returned unexpected values: (%v, %v)", n, err)
   145  	}
   146  	select {
   147  	case <-eof:
   148  		t.Error("unexpected EOF signal")
   149  	default:
   150  	}
   151  }
   152  
   153  func unhex(str string) []byte {
   154  	r := strings.NewReplacer("\t", "", " ", "", "\n", "")
   155  	b, err := hex.DecodeString(r.Replace(str))
   156  	if err != nil {
   157  		panic(fmt.Sprintf("invalid hex string: %q", str))
   158  	}
   159  	return b
   160  }