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