github.com/yinchengtsinghua/golang-Eos-dpos-Ethereum@v0.0.0-20190121132951-92cc4225ed8e/swarm/network/stream/streamer_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  //
    10  //
    11  //
    12  //
    13  //
    14  //
    15  //
    16  //
    17  //
    18  //
    19  //
    20  //
    21  //
    22  //
    23  //
    24  
    25  package stream
    26  
    27  import (
    28  	"bytes"
    29  	"context"
    30  	"testing"
    31  	"time"
    32  
    33  	"github.com/ethereum/go-ethereum/crypto/sha3"
    34  	p2ptest "github.com/ethereum/go-ethereum/p2p/testing"
    35  )
    36  
    37  func TestStreamerSubscribe(t *testing.T) {
    38  	tester, streamer, _, teardown, err := newStreamerTester(t)
    39  	defer teardown()
    40  	if err != nil {
    41  		t.Fatal(err)
    42  	}
    43  
    44  	stream := NewStream("foo", "", true)
    45  	err = streamer.Subscribe(tester.IDs[0], stream, NewRange(0, 0), Top)
    46  	if err == nil || err.Error() != "stream foo not registered" {
    47  		t.Fatalf("Expected error %v, got %v", "stream foo not registered", err)
    48  	}
    49  }
    50  
    51  func TestStreamerRequestSubscription(t *testing.T) {
    52  	tester, streamer, _, teardown, err := newStreamerTester(t)
    53  	defer teardown()
    54  	if err != nil {
    55  		t.Fatal(err)
    56  	}
    57  
    58  	stream := NewStream("foo", "", false)
    59  	err = streamer.RequestSubscription(tester.IDs[0], stream, &Range{}, Top)
    60  	if err == nil || err.Error() != "stream foo not registered" {
    61  		t.Fatalf("Expected error %v, got %v", "stream foo not registered", err)
    62  	}
    63  }
    64  
    65  var (
    66  	hash0     = sha3.Sum256([]byte{0})
    67  	hash1     = sha3.Sum256([]byte{1})
    68  	hash2     = sha3.Sum256([]byte{2})
    69  	hashesTmp = append(hash0[:], hash1[:]...)
    70  	hashes    = append(hashesTmp, hash2[:]...)
    71  )
    72  
    73  type testClient struct {
    74  	t              string
    75  	wait0          chan bool
    76  	wait2          chan bool
    77  	batchDone      chan bool
    78  	receivedHashes map[string][]byte
    79  }
    80  
    81  func newTestClient(t string) *testClient {
    82  	return &testClient{
    83  		t:              t,
    84  		wait0:          make(chan bool),
    85  		wait2:          make(chan bool),
    86  		batchDone:      make(chan bool),
    87  		receivedHashes: make(map[string][]byte),
    88  	}
    89  }
    90  
    91  func (self *testClient) NeedData(ctx context.Context, hash []byte) func() {
    92  	self.receivedHashes[string(hash)] = hash
    93  	if bytes.Equal(hash, hash0[:]) {
    94  		return func() {
    95  			<-self.wait0
    96  		}
    97  	} else if bytes.Equal(hash, hash2[:]) {
    98  		return func() {
    99  			<-self.wait2
   100  		}
   101  	}
   102  	return nil
   103  }
   104  
   105  func (self *testClient) BatchDone(Stream, uint64, []byte, []byte) func() (*TakeoverProof, error) {
   106  	close(self.batchDone)
   107  	return nil
   108  }
   109  
   110  func (self *testClient) Close() {}
   111  
   112  type testServer struct {
   113  	t string
   114  }
   115  
   116  func newTestServer(t string) *testServer {
   117  	return &testServer{
   118  		t: t,
   119  	}
   120  }
   121  
   122  func (self *testServer) SetNextBatch(from uint64, to uint64) ([]byte, uint64, uint64, *HandoverProof, error) {
   123  	return make([]byte, HashSize), from + 1, to + 1, nil, nil
   124  }
   125  
   126  func (self *testServer) GetData(context.Context, []byte) ([]byte, error) {
   127  	return nil, nil
   128  }
   129  
   130  func (self *testServer) Close() {
   131  }
   132  
   133  func TestStreamerDownstreamSubscribeUnsubscribeMsgExchange(t *testing.T) {
   134  	tester, streamer, _, teardown, err := newStreamerTester(t)
   135  	defer teardown()
   136  	if err != nil {
   137  		t.Fatal(err)
   138  	}
   139  
   140  	streamer.RegisterClientFunc("foo", func(p *Peer, t string, live bool) (Client, error) {
   141  		return newTestClient(t), nil
   142  	})
   143  
   144  	peerID := tester.IDs[0]
   145  
   146  	stream := NewStream("foo", "", true)
   147  	err = streamer.Subscribe(peerID, stream, NewRange(5, 8), Top)
   148  	if err != nil {
   149  		t.Fatalf("Expected no error, got %v", err)
   150  	}
   151  
   152  	err = tester.TestExchanges(
   153  		p2ptest.Exchange{
   154  			Label: "Subscribe message",
   155  			Expects: []p2ptest.Expect{
   156  				{
   157  					Code: 4,
   158  					Msg: &SubscribeMsg{
   159  						Stream:   stream,
   160  						History:  NewRange(5, 8),
   161  						Priority: Top,
   162  					},
   163  					Peer: peerID,
   164  				},
   165  			},
   166  		},
   167  //
   168  		p2ptest.Exchange{
   169  			Label: "OfferedHashes message",
   170  			Triggers: []p2ptest.Trigger{
   171  				{
   172  					Code: 1,
   173  					Msg: &OfferedHashesMsg{
   174  						HandoverProof: &HandoverProof{
   175  							Handover: &Handover{},
   176  						},
   177  						Hashes: hashes,
   178  						From:   5,
   179  						To:     8,
   180  						Stream: stream,
   181  					},
   182  					Peer: peerID,
   183  				},
   184  			},
   185  			Expects: []p2ptest.Expect{
   186  				{
   187  					Code: 2,
   188  					Msg: &WantedHashesMsg{
   189  						Stream: stream,
   190  						Want:   []byte{5},
   191  						From:   9,
   192  						To:     0,
   193  					},
   194  					Peer: peerID,
   195  				},
   196  			},
   197  		},
   198  	)
   199  	if err != nil {
   200  		t.Fatal(err)
   201  	}
   202  
   203  	err = streamer.Unsubscribe(peerID, stream)
   204  	if err != nil {
   205  		t.Fatalf("Expected no error, got %v", err)
   206  	}
   207  
   208  	err = tester.TestExchanges(p2ptest.Exchange{
   209  		Label: "Unsubscribe message",
   210  		Expects: []p2ptest.Expect{
   211  			{
   212  				Code: 0,
   213  				Msg: &UnsubscribeMsg{
   214  					Stream: stream,
   215  				},
   216  				Peer: peerID,
   217  			},
   218  		},
   219  	})
   220  
   221  	if err != nil {
   222  		t.Fatal(err)
   223  	}
   224  }
   225  
   226  func TestStreamerUpstreamSubscribeUnsubscribeMsgExchange(t *testing.T) {
   227  	tester, streamer, _, teardown, err := newStreamerTester(t)
   228  	defer teardown()
   229  	if err != nil {
   230  		t.Fatal(err)
   231  	}
   232  
   233  	stream := NewStream("foo", "", false)
   234  
   235  	streamer.RegisterServerFunc("foo", func(p *Peer, t string, live bool) (Server, error) {
   236  		return newTestServer(t), nil
   237  	})
   238  
   239  	peerID := tester.IDs[0]
   240  
   241  	err = tester.TestExchanges(p2ptest.Exchange{
   242  		Label: "Subscribe message",
   243  		Triggers: []p2ptest.Trigger{
   244  			{
   245  				Code: 4,
   246  				Msg: &SubscribeMsg{
   247  					Stream:   stream,
   248  					History:  NewRange(5, 8),
   249  					Priority: Top,
   250  				},
   251  				Peer: peerID,
   252  			},
   253  		},
   254  		Expects: []p2ptest.Expect{
   255  			{
   256  				Code: 1,
   257  				Msg: &OfferedHashesMsg{
   258  					Stream: stream,
   259  					HandoverProof: &HandoverProof{
   260  						Handover: &Handover{},
   261  					},
   262  					Hashes: make([]byte, HashSize),
   263  					From:   6,
   264  					To:     9,
   265  				},
   266  				Peer: peerID,
   267  			},
   268  		},
   269  	})
   270  
   271  	if err != nil {
   272  		t.Fatal(err)
   273  	}
   274  
   275  	err = tester.TestExchanges(p2ptest.Exchange{
   276  		Label: "unsubscribe message",
   277  		Triggers: []p2ptest.Trigger{
   278  			{
   279  				Code: 0,
   280  				Msg: &UnsubscribeMsg{
   281  					Stream: stream,
   282  				},
   283  				Peer: peerID,
   284  			},
   285  		},
   286  	})
   287  
   288  	if err != nil {
   289  		t.Fatal(err)
   290  	}
   291  }
   292  
   293  func TestStreamerUpstreamSubscribeUnsubscribeMsgExchangeLive(t *testing.T) {
   294  	tester, streamer, _, teardown, err := newStreamerTester(t)
   295  	defer teardown()
   296  	if err != nil {
   297  		t.Fatal(err)
   298  	}
   299  
   300  	stream := NewStream("foo", "", true)
   301  
   302  	streamer.RegisterServerFunc("foo", func(p *Peer, t string, live bool) (Server, error) {
   303  		return newTestServer(t), nil
   304  	})
   305  
   306  	peerID := tester.IDs[0]
   307  
   308  	err = tester.TestExchanges(p2ptest.Exchange{
   309  		Label: "Subscribe message",
   310  		Triggers: []p2ptest.Trigger{
   311  			{
   312  				Code: 4,
   313  				Msg: &SubscribeMsg{
   314  					Stream:   stream,
   315  					Priority: Top,
   316  				},
   317  				Peer: peerID,
   318  			},
   319  		},
   320  		Expects: []p2ptest.Expect{
   321  			{
   322  				Code: 1,
   323  				Msg: &OfferedHashesMsg{
   324  					Stream: stream,
   325  					HandoverProof: &HandoverProof{
   326  						Handover: &Handover{},
   327  					},
   328  					Hashes: make([]byte, HashSize),
   329  					From:   1,
   330  					To:     1,
   331  				},
   332  				Peer: peerID,
   333  			},
   334  		},
   335  	})
   336  
   337  	if err != nil {
   338  		t.Fatal(err)
   339  	}
   340  
   341  	err = tester.TestExchanges(p2ptest.Exchange{
   342  		Label: "unsubscribe message",
   343  		Triggers: []p2ptest.Trigger{
   344  			{
   345  				Code: 0,
   346  				Msg: &UnsubscribeMsg{
   347  					Stream: stream,
   348  				},
   349  				Peer: peerID,
   350  			},
   351  		},
   352  	})
   353  
   354  	if err != nil {
   355  		t.Fatal(err)
   356  	}
   357  }
   358  
   359  func TestStreamerUpstreamSubscribeErrorMsgExchange(t *testing.T) {
   360  	tester, streamer, _, teardown, err := newStreamerTester(t)
   361  	defer teardown()
   362  	if err != nil {
   363  		t.Fatal(err)
   364  	}
   365  
   366  	streamer.RegisterServerFunc("foo", func(p *Peer, t string, live bool) (Server, error) {
   367  		return newTestServer(t), nil
   368  	})
   369  
   370  	stream := NewStream("bar", "", true)
   371  
   372  	peerID := tester.IDs[0]
   373  
   374  	err = tester.TestExchanges(p2ptest.Exchange{
   375  		Label: "Subscribe message",
   376  		Triggers: []p2ptest.Trigger{
   377  			{
   378  				Code: 4,
   379  				Msg: &SubscribeMsg{
   380  					Stream:   stream,
   381  					History:  NewRange(5, 8),
   382  					Priority: Top,
   383  				},
   384  				Peer: peerID,
   385  			},
   386  		},
   387  		Expects: []p2ptest.Expect{
   388  			{
   389  				Code: 7,
   390  				Msg: &SubscribeErrorMsg{
   391  					Error: "stream bar not registered",
   392  				},
   393  				Peer: peerID,
   394  			},
   395  		},
   396  	})
   397  
   398  	if err != nil {
   399  		t.Fatal(err)
   400  	}
   401  }
   402  
   403  func TestStreamerUpstreamSubscribeLiveAndHistory(t *testing.T) {
   404  	tester, streamer, _, teardown, err := newStreamerTester(t)
   405  	defer teardown()
   406  	if err != nil {
   407  		t.Fatal(err)
   408  	}
   409  
   410  	stream := NewStream("foo", "", true)
   411  
   412  	streamer.RegisterServerFunc("foo", func(p *Peer, t string, live bool) (Server, error) {
   413  		return &testServer{
   414  			t: t,
   415  		}, nil
   416  	})
   417  
   418  	peerID := tester.IDs[0]
   419  
   420  	err = tester.TestExchanges(p2ptest.Exchange{
   421  		Label: "Subscribe message",
   422  		Triggers: []p2ptest.Trigger{
   423  			{
   424  				Code: 4,
   425  				Msg: &SubscribeMsg{
   426  					Stream:   stream,
   427  					History:  NewRange(5, 8),
   428  					Priority: Top,
   429  				},
   430  				Peer: peerID,
   431  			},
   432  		},
   433  		Expects: []p2ptest.Expect{
   434  			{
   435  				Code: 1,
   436  				Msg: &OfferedHashesMsg{
   437  					Stream: NewStream("foo", "", false),
   438  					HandoverProof: &HandoverProof{
   439  						Handover: &Handover{},
   440  					},
   441  					Hashes: make([]byte, HashSize),
   442  					From:   6,
   443  					To:     9,
   444  				},
   445  				Peer: peerID,
   446  			},
   447  			{
   448  				Code: 1,
   449  				Msg: &OfferedHashesMsg{
   450  					Stream: stream,
   451  					HandoverProof: &HandoverProof{
   452  						Handover: &Handover{},
   453  					},
   454  					From:   1,
   455  					To:     1,
   456  					Hashes: make([]byte, HashSize),
   457  				},
   458  				Peer: peerID,
   459  			},
   460  		},
   461  	})
   462  
   463  	if err != nil {
   464  		t.Fatal(err)
   465  	}
   466  }
   467  
   468  func TestStreamerDownstreamOfferedHashesMsgExchange(t *testing.T) {
   469  	tester, streamer, _, teardown, err := newStreamerTester(t)
   470  	defer teardown()
   471  	if err != nil {
   472  		t.Fatal(err)
   473  	}
   474  
   475  	stream := NewStream("foo", "", true)
   476  
   477  	var tc *testClient
   478  
   479  	streamer.RegisterClientFunc("foo", func(p *Peer, t string, live bool) (Client, error) {
   480  		tc = newTestClient(t)
   481  		return tc, nil
   482  	})
   483  
   484  	peerID := tester.IDs[0]
   485  
   486  	err = streamer.Subscribe(peerID, stream, NewRange(5, 8), Top)
   487  	if err != nil {
   488  		t.Fatalf("Expected no error, got %v", err)
   489  	}
   490  
   491  	err = tester.TestExchanges(p2ptest.Exchange{
   492  		Label: "Subscribe message",
   493  		Expects: []p2ptest.Expect{
   494  			{
   495  				Code: 4,
   496  				Msg: &SubscribeMsg{
   497  					Stream:   stream,
   498  					History:  NewRange(5, 8),
   499  					Priority: Top,
   500  				},
   501  				Peer: peerID,
   502  			},
   503  		},
   504  	},
   505  		p2ptest.Exchange{
   506  			Label: "WantedHashes message",
   507  			Triggers: []p2ptest.Trigger{
   508  				{
   509  					Code: 1,
   510  					Msg: &OfferedHashesMsg{
   511  						HandoverProof: &HandoverProof{
   512  							Handover: &Handover{},
   513  						},
   514  						Hashes: hashes,
   515  						From:   5,
   516  						To:     8,
   517  						Stream: stream,
   518  					},
   519  					Peer: peerID,
   520  				},
   521  			},
   522  			Expects: []p2ptest.Expect{
   523  				{
   524  					Code: 2,
   525  					Msg: &WantedHashesMsg{
   526  						Stream: stream,
   527  						Want:   []byte{5},
   528  						From:   9,
   529  						To:     0,
   530  					},
   531  					Peer: peerID,
   532  				},
   533  			},
   534  		})
   535  	if err != nil {
   536  		t.Fatal(err)
   537  	}
   538  
   539  	if len(tc.receivedHashes) != 3 {
   540  		t.Fatalf("Expected number of received hashes %v, got %v", 3, len(tc.receivedHashes))
   541  	}
   542  
   543  	close(tc.wait0)
   544  
   545  	timeout := time.NewTimer(100 * time.Millisecond)
   546  	defer timeout.Stop()
   547  
   548  	select {
   549  	case <-tc.batchDone:
   550  		t.Fatal("batch done early")
   551  	case <-timeout.C:
   552  	}
   553  
   554  	close(tc.wait2)
   555  
   556  	timeout2 := time.NewTimer(10000 * time.Millisecond)
   557  	defer timeout2.Stop()
   558  
   559  	select {
   560  	case <-tc.batchDone:
   561  	case <-timeout2.C:
   562  		t.Fatal("timeout waiting batchdone call")
   563  	}
   564  
   565  }
   566  
   567  func TestStreamerRequestSubscriptionQuitMsgExchange(t *testing.T) {
   568  	tester, streamer, _, teardown, err := newStreamerTester(t)
   569  	defer teardown()
   570  	if err != nil {
   571  		t.Fatal(err)
   572  	}
   573  
   574  	streamer.RegisterServerFunc("foo", func(p *Peer, t string, live bool) (Server, error) {
   575  		return newTestServer(t), nil
   576  	})
   577  
   578  	peerID := tester.IDs[0]
   579  
   580  	stream := NewStream("foo", "", true)
   581  	err = streamer.RequestSubscription(peerID, stream, NewRange(5, 8), Top)
   582  	if err != nil {
   583  		t.Fatalf("Expected no error, got %v", err)
   584  	}
   585  
   586  	err = tester.TestExchanges(
   587  		p2ptest.Exchange{
   588  			Label: "RequestSubscription message",
   589  			Expects: []p2ptest.Expect{
   590  				{
   591  					Code: 8,
   592  					Msg: &RequestSubscriptionMsg{
   593  						Stream:   stream,
   594  						History:  NewRange(5, 8),
   595  						Priority: Top,
   596  					},
   597  					Peer: peerID,
   598  				},
   599  			},
   600  		},
   601  		p2ptest.Exchange{
   602  			Label: "Subscribe message",
   603  			Triggers: []p2ptest.Trigger{
   604  				{
   605  					Code: 4,
   606  					Msg: &SubscribeMsg{
   607  						Stream:   stream,
   608  						History:  NewRange(5, 8),
   609  						Priority: Top,
   610  					},
   611  					Peer: peerID,
   612  				},
   613  			},
   614  			Expects: []p2ptest.Expect{
   615  				{
   616  					Code: 1,
   617  					Msg: &OfferedHashesMsg{
   618  						Stream: NewStream("foo", "", false),
   619  						HandoverProof: &HandoverProof{
   620  							Handover: &Handover{},
   621  						},
   622  						Hashes: make([]byte, HashSize),
   623  						From:   6,
   624  						To:     9,
   625  					},
   626  					Peer: peerID,
   627  				},
   628  				{
   629  					Code: 1,
   630  					Msg: &OfferedHashesMsg{
   631  						Stream: stream,
   632  						HandoverProof: &HandoverProof{
   633  							Handover: &Handover{},
   634  						},
   635  						From:   1,
   636  						To:     1,
   637  						Hashes: make([]byte, HashSize),
   638  					},
   639  					Peer: peerID,
   640  				},
   641  			},
   642  		},
   643  	)
   644  	if err != nil {
   645  		t.Fatal(err)
   646  	}
   647  
   648  	err = streamer.Quit(peerID, stream)
   649  	if err != nil {
   650  		t.Fatalf("Expected no error, got %v", err)
   651  	}
   652  
   653  	err = tester.TestExchanges(p2ptest.Exchange{
   654  		Label: "Quit message",
   655  		Expects: []p2ptest.Expect{
   656  			{
   657  				Code: 9,
   658  				Msg: &QuitMsg{
   659  					Stream: stream,
   660  				},
   661  				Peer: peerID,
   662  			},
   663  		},
   664  	})
   665  
   666  	if err != nil {
   667  		t.Fatal(err)
   668  	}
   669  
   670  	historyStream := getHistoryStream(stream)
   671  
   672  	err = streamer.Quit(peerID, historyStream)
   673  	if err != nil {
   674  		t.Fatalf("Expected no error, got %v", err)
   675  	}
   676  
   677  	err = tester.TestExchanges(p2ptest.Exchange{
   678  		Label: "Quit message",
   679  		Expects: []p2ptest.Expect{
   680  			{
   681  				Code: 9,
   682  				Msg: &QuitMsg{
   683  					Stream: historyStream,
   684  				},
   685  				Peer: peerID,
   686  			},
   687  		},
   688  	})
   689  
   690  	if err != nil {
   691  		t.Fatal(err)
   692  	}
   693  }