github.com/aaa256/atlantis@v0.0.0-20210707112435-42ee889287a2/swarm/network/stream/streamer_test.go (about)

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