github.com/linapex/ethereum-go-chinese@v0.0.0-20190316121929-f8b7a73c3fa1/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 19:16:44</date>
    10  //</624450115813249024>
    11  
    12  
    13  package stream
    14  
    15  import (
    16  	"bytes"
    17  	"context"
    18  	"errors"
    19  	"fmt"
    20  	"strconv"
    21  	"testing"
    22  	"time"
    23  
    24  	"github.com/ethereum/go-ethereum/common"
    25  	"github.com/ethereum/go-ethereum/log"
    26  	"github.com/ethereum/go-ethereum/p2p/enode"
    27  	p2ptest "github.com/ethereum/go-ethereum/p2p/testing"
    28  	"github.com/ethereum/go-ethereum/swarm/network"
    29  	"golang.org/x/crypto/sha3"
    30  )
    31  
    32  func TestStreamerSubscribe(t *testing.T) {
    33  	tester, streamer, _, teardown, err := newStreamerTester(t, nil)
    34  	defer teardown()
    35  	if err != nil {
    36  		t.Fatal(err)
    37  	}
    38  
    39  	stream := NewStream("foo", "", true)
    40  	err = streamer.Subscribe(tester.Nodes[0].ID(), stream, NewRange(0, 0), Top)
    41  	if err == nil || err.Error() != "stream foo not registered" {
    42  		t.Fatalf("Expected error %v, got %v", "stream foo not registered", err)
    43  	}
    44  }
    45  
    46  func TestStreamerRequestSubscription(t *testing.T) {
    47  	tester, streamer, _, teardown, err := newStreamerTester(t, nil)
    48  	defer teardown()
    49  	if err != nil {
    50  		t.Fatal(err)
    51  	}
    52  
    53  	stream := NewStream("foo", "", false)
    54  	err = streamer.RequestSubscription(tester.Nodes[0].ID(), stream, &Range{}, Top)
    55  	if err == nil || err.Error() != "stream foo not registered" {
    56  		t.Fatalf("Expected error %v, got %v", "stream foo not registered", err)
    57  	}
    58  }
    59  
    60  var (
    61  	hash0         = sha3.Sum256([]byte{0})
    62  	hash1         = sha3.Sum256([]byte{1})
    63  	hash2         = sha3.Sum256([]byte{2})
    64  	hashesTmp     = append(hash0[:], hash1[:]...)
    65  	hashes        = append(hashesTmp, hash2[:]...)
    66  	corruptHashes = append(hashes[:40])
    67  )
    68  
    69  type testClient struct {
    70  	t              string
    71  	wait0          chan bool
    72  	wait2          chan bool
    73  	batchDone      chan bool
    74  	receivedHashes map[string][]byte
    75  }
    76  
    77  func newTestClient(t string) *testClient {
    78  	return &testClient{
    79  		t:              t,
    80  		wait0:          make(chan bool),
    81  		wait2:          make(chan bool),
    82  		batchDone:      make(chan bool),
    83  		receivedHashes: make(map[string][]byte),
    84  	}
    85  }
    86  
    87  func (self *testClient) NeedData(ctx context.Context, hash []byte) func(context.Context) error {
    88  	self.receivedHashes[string(hash)] = hash
    89  	if bytes.Equal(hash, hash0[:]) {
    90  		return func(context.Context) error {
    91  			<-self.wait0
    92  			return nil
    93  		}
    94  	} else if bytes.Equal(hash, hash2[:]) {
    95  		return func(context.Context) error {
    96  			<-self.wait2
    97  			return nil
    98  		}
    99  	}
   100  	return nil
   101  }
   102  
   103  func (self *testClient) BatchDone(Stream, uint64, []byte, []byte) func() (*TakeoverProof, error) {
   104  	close(self.batchDone)
   105  	return nil
   106  }
   107  
   108  func (self *testClient) Close() {}
   109  
   110  type testServer struct {
   111  	t            string
   112  	sessionIndex uint64
   113  }
   114  
   115  func newTestServer(t string, sessionIndex uint64) *testServer {
   116  	return &testServer{
   117  		t:            t,
   118  		sessionIndex: sessionIndex,
   119  	}
   120  }
   121  
   122  func (s *testServer) SessionIndex() (uint64, error) {
   123  	return s.sessionIndex, nil
   124  }
   125  
   126  func (self *testServer) SetNextBatch(from uint64, to uint64) ([]byte, uint64, uint64, *HandoverProof, error) {
   127  	return make([]byte, HashSize), from + 1, to + 1, nil, nil
   128  }
   129  
   130  func (self *testServer) GetData(context.Context, []byte) ([]byte, error) {
   131  	return nil, nil
   132  }
   133  
   134  func (self *testServer) Close() {
   135  }
   136  
   137  func TestStreamerDownstreamSubscribeUnsubscribeMsgExchange(t *testing.T) {
   138  	tester, streamer, _, teardown, err := newStreamerTester(t, nil)
   139  	defer teardown()
   140  	if err != nil {
   141  		t.Fatal(err)
   142  	}
   143  
   144  	streamer.RegisterClientFunc("foo", func(p *Peer, t string, live bool) (Client, error) {
   145  		return newTestClient(t), nil
   146  	})
   147  
   148  	node := tester.Nodes[0]
   149  
   150  	stream := NewStream("foo", "", true)
   151  	err = streamer.Subscribe(node.ID(), stream, NewRange(5, 8), Top)
   152  	if err != nil {
   153  		t.Fatalf("Expected no error, got %v", err)
   154  	}
   155  
   156  	err = tester.TestExchanges(
   157  		p2ptest.Exchange{
   158  			Label: "Subscribe message",
   159  			Expects: []p2ptest.Expect{
   160  				{
   161  					Code: 4,
   162  					Msg: &SubscribeMsg{
   163  						Stream:   stream,
   164  						History:  NewRange(5, 8),
   165  						Priority: Top,
   166  					},
   167  					Peer: node.ID(),
   168  				},
   169  			},
   170  		},
   171  //触发器offeredhashemsg以实际创建客户端
   172  		p2ptest.Exchange{
   173  			Label: "OfferedHashes message",
   174  			Triggers: []p2ptest.Trigger{
   175  				{
   176  					Code: 1,
   177  					Msg: &OfferedHashesMsg{
   178  						HandoverProof: &HandoverProof{
   179  							Handover: &Handover{},
   180  						},
   181  						Hashes: hashes,
   182  						From:   5,
   183  						To:     8,
   184  						Stream: stream,
   185  					},
   186  					Peer: node.ID(),
   187  				},
   188  			},
   189  			Expects: []p2ptest.Expect{
   190  				{
   191  					Code: 2,
   192  					Msg: &WantedHashesMsg{
   193  						Stream: stream,
   194  						Want:   []byte{5},
   195  						From:   9,
   196  						To:     0,
   197  					},
   198  					Peer: node.ID(),
   199  				},
   200  			},
   201  		},
   202  	)
   203  	if err != nil {
   204  		t.Fatal(err)
   205  	}
   206  
   207  	err = streamer.Unsubscribe(node.ID(), stream)
   208  	if err != nil {
   209  		t.Fatalf("Expected no error, got %v", err)
   210  	}
   211  
   212  	err = tester.TestExchanges(p2ptest.Exchange{
   213  		Label: "Unsubscribe message",
   214  		Expects: []p2ptest.Expect{
   215  			{
   216  				Code: 0,
   217  				Msg: &UnsubscribeMsg{
   218  					Stream: stream,
   219  				},
   220  				Peer: node.ID(),
   221  			},
   222  		},
   223  	})
   224  
   225  	if err != nil {
   226  		t.Fatal(err)
   227  	}
   228  }
   229  
   230  func TestStreamerUpstreamSubscribeUnsubscribeMsgExchange(t *testing.T) {
   231  	tester, streamer, _, teardown, err := newStreamerTester(t, nil)
   232  	defer teardown()
   233  	if err != nil {
   234  		t.Fatal(err)
   235  	}
   236  
   237  	stream := NewStream("foo", "", false)
   238  
   239  	streamer.RegisterServerFunc("foo", func(p *Peer, t string, live bool) (Server, error) {
   240  		return newTestServer(t, 10), nil
   241  	})
   242  
   243  	node := tester.Nodes[0]
   244  
   245  	err = tester.TestExchanges(p2ptest.Exchange{
   246  		Label: "Subscribe message",
   247  		Triggers: []p2ptest.Trigger{
   248  			{
   249  				Code: 4,
   250  				Msg: &SubscribeMsg{
   251  					Stream:   stream,
   252  					History:  NewRange(5, 8),
   253  					Priority: Top,
   254  				},
   255  				Peer: node.ID(),
   256  			},
   257  		},
   258  		Expects: []p2ptest.Expect{
   259  			{
   260  				Code: 1,
   261  				Msg: &OfferedHashesMsg{
   262  					Stream: stream,
   263  					HandoverProof: &HandoverProof{
   264  						Handover: &Handover{},
   265  					},
   266  					Hashes: make([]byte, HashSize),
   267  					From:   6,
   268  					To:     9,
   269  				},
   270  				Peer: node.ID(),
   271  			},
   272  		},
   273  	})
   274  
   275  	if err != nil {
   276  		t.Fatal(err)
   277  	}
   278  
   279  	err = tester.TestExchanges(p2ptest.Exchange{
   280  		Label: "unsubscribe message",
   281  		Triggers: []p2ptest.Trigger{
   282  			{
   283  				Code: 0,
   284  				Msg: &UnsubscribeMsg{
   285  					Stream: stream,
   286  				},
   287  				Peer: node.ID(),
   288  			},
   289  		},
   290  	})
   291  
   292  	if err != nil {
   293  		t.Fatal(err)
   294  	}
   295  }
   296  
   297  func TestStreamerUpstreamSubscribeUnsubscribeMsgExchangeLive(t *testing.T) {
   298  	tester, streamer, _, teardown, err := newStreamerTester(t, nil)
   299  	defer teardown()
   300  	if err != nil {
   301  		t.Fatal(err)
   302  	}
   303  
   304  	stream := NewStream("foo", "", true)
   305  
   306  	streamer.RegisterServerFunc("foo", func(p *Peer, t string, live bool) (Server, error) {
   307  		return newTestServer(t, 0), nil
   308  	})
   309  
   310  	node := tester.Nodes[0]
   311  
   312  	err = tester.TestExchanges(p2ptest.Exchange{
   313  		Label: "Subscribe message",
   314  		Triggers: []p2ptest.Trigger{
   315  			{
   316  				Code: 4,
   317  				Msg: &SubscribeMsg{
   318  					Stream:   stream,
   319  					Priority: Top,
   320  				},
   321  				Peer: node.ID(),
   322  			},
   323  		},
   324  		Expects: []p2ptest.Expect{
   325  			{
   326  				Code: 1,
   327  				Msg: &OfferedHashesMsg{
   328  					Stream: stream,
   329  					HandoverProof: &HandoverProof{
   330  						Handover: &Handover{},
   331  					},
   332  					Hashes: make([]byte, HashSize),
   333  					From:   1,
   334  					To:     0,
   335  				},
   336  				Peer: node.ID(),
   337  			},
   338  		},
   339  	})
   340  
   341  	if err != nil {
   342  		t.Fatal(err)
   343  	}
   344  
   345  	err = tester.TestExchanges(p2ptest.Exchange{
   346  		Label: "unsubscribe message",
   347  		Triggers: []p2ptest.Trigger{
   348  			{
   349  				Code: 0,
   350  				Msg: &UnsubscribeMsg{
   351  					Stream: stream,
   352  				},
   353  				Peer: node.ID(),
   354  			},
   355  		},
   356  	})
   357  
   358  	if err != nil {
   359  		t.Fatal(err)
   360  	}
   361  }
   362  
   363  func TestStreamerUpstreamSubscribeErrorMsgExchange(t *testing.T) {
   364  	tester, streamer, _, teardown, err := newStreamerTester(t, nil)
   365  	defer teardown()
   366  	if err != nil {
   367  		t.Fatal(err)
   368  	}
   369  
   370  	streamer.RegisterServerFunc("foo", func(p *Peer, t string, live bool) (Server, error) {
   371  		return newTestServer(t, 0), nil
   372  	})
   373  
   374  	stream := NewStream("bar", "", true)
   375  
   376  	node := tester.Nodes[0]
   377  
   378  	err = tester.TestExchanges(p2ptest.Exchange{
   379  		Label: "Subscribe message",
   380  		Triggers: []p2ptest.Trigger{
   381  			{
   382  				Code: 4,
   383  				Msg: &SubscribeMsg{
   384  					Stream:   stream,
   385  					History:  NewRange(5, 8),
   386  					Priority: Top,
   387  				},
   388  				Peer: node.ID(),
   389  			},
   390  		},
   391  		Expects: []p2ptest.Expect{
   392  			{
   393  				Code: 7,
   394  				Msg: &SubscribeErrorMsg{
   395  					Error: "stream bar not registered",
   396  				},
   397  				Peer: node.ID(),
   398  			},
   399  		},
   400  	})
   401  
   402  	if err != nil {
   403  		t.Fatal(err)
   404  	}
   405  }
   406  
   407  func TestStreamerUpstreamSubscribeLiveAndHistory(t *testing.T) {
   408  	tester, streamer, _, teardown, err := newStreamerTester(t, nil)
   409  	defer teardown()
   410  	if err != nil {
   411  		t.Fatal(err)
   412  	}
   413  
   414  	stream := NewStream("foo", "", true)
   415  
   416  	streamer.RegisterServerFunc("foo", func(p *Peer, t string, live bool) (Server, error) {
   417  		return newTestServer(t, 10), nil
   418  	})
   419  
   420  	node := tester.Nodes[0]
   421  
   422  	err = tester.TestExchanges(p2ptest.Exchange{
   423  		Label: "Subscribe message",
   424  		Triggers: []p2ptest.Trigger{
   425  			{
   426  				Code: 4,
   427  				Msg: &SubscribeMsg{
   428  					Stream:   stream,
   429  					History:  NewRange(5, 8),
   430  					Priority: Top,
   431  				},
   432  				Peer: node.ID(),
   433  			},
   434  		},
   435  		Expects: []p2ptest.Expect{
   436  			{
   437  				Code: 1,
   438  				Msg: &OfferedHashesMsg{
   439  					Stream: NewStream("foo", "", false),
   440  					HandoverProof: &HandoverProof{
   441  						Handover: &Handover{},
   442  					},
   443  					Hashes: make([]byte, HashSize),
   444  					From:   6,
   445  					To:     9,
   446  				},
   447  				Peer: node.ID(),
   448  			},
   449  			{
   450  				Code: 1,
   451  				Msg: &OfferedHashesMsg{
   452  					Stream: stream,
   453  					HandoverProof: &HandoverProof{
   454  						Handover: &Handover{},
   455  					},
   456  					From:   11,
   457  					To:     0,
   458  					Hashes: make([]byte, HashSize),
   459  				},
   460  				Peer: node.ID(),
   461  			},
   462  		},
   463  	})
   464  
   465  	if err != nil {
   466  		t.Fatal(err)
   467  	}
   468  }
   469  
   470  func TestStreamerDownstreamCorruptHashesMsgExchange(t *testing.T) {
   471  	tester, streamer, _, teardown, err := newStreamerTester(t, nil)
   472  	defer teardown()
   473  	if err != nil {
   474  		t.Fatal(err)
   475  	}
   476  
   477  	stream := NewStream("foo", "", true)
   478  
   479  	var tc *testClient
   480  
   481  	streamer.RegisterClientFunc("foo", func(p *Peer, t string, live bool) (Client, error) {
   482  		tc = newTestClient(t)
   483  		return tc, nil
   484  	})
   485  
   486  	node := tester.Nodes[0]
   487  
   488  	err = streamer.Subscribe(node.ID(), stream, NewRange(5, 8), Top)
   489  	if err != nil {
   490  		t.Fatalf("Expected no error, got %v", err)
   491  	}
   492  
   493  	err = tester.TestExchanges(p2ptest.Exchange{
   494  		Label: "Subscribe message",
   495  		Expects: []p2ptest.Expect{
   496  			{
   497  				Code: 4,
   498  				Msg: &SubscribeMsg{
   499  					Stream:   stream,
   500  					History:  NewRange(5, 8),
   501  					Priority: Top,
   502  				},
   503  				Peer: node.ID(),
   504  			},
   505  		},
   506  	},
   507  		p2ptest.Exchange{
   508  			Label: "Corrupt offered hash message",
   509  			Triggers: []p2ptest.Trigger{
   510  				{
   511  					Code: 1,
   512  					Msg: &OfferedHashesMsg{
   513  						HandoverProof: &HandoverProof{
   514  							Handover: &Handover{},
   515  						},
   516  						Hashes: corruptHashes,
   517  						From:   5,
   518  						To:     8,
   519  						Stream: stream,
   520  					},
   521  					Peer: node.ID(),
   522  				},
   523  			},
   524  		})
   525  	if err != nil {
   526  		t.Fatal(err)
   527  	}
   528  
   529  	expectedError := errors.New("Message handler error: (msg code 1): error invalid hashes length (len: 40)")
   530  	if err := tester.TestDisconnected(&p2ptest.Disconnect{Peer: node.ID(), Error: expectedError}); err != nil {
   531  		t.Fatal(err)
   532  	}
   533  }
   534  
   535  func TestStreamerDownstreamOfferedHashesMsgExchange(t *testing.T) {
   536  	tester, streamer, _, teardown, err := newStreamerTester(t, nil)
   537  	defer teardown()
   538  	if err != nil {
   539  		t.Fatal(err)
   540  	}
   541  
   542  	stream := NewStream("foo", "", true)
   543  
   544  	var tc *testClient
   545  
   546  	streamer.RegisterClientFunc("foo", func(p *Peer, t string, live bool) (Client, error) {
   547  		tc = newTestClient(t)
   548  		return tc, nil
   549  	})
   550  
   551  	node := tester.Nodes[0]
   552  
   553  	err = streamer.Subscribe(node.ID(), stream, NewRange(5, 8), Top)
   554  	if err != nil {
   555  		t.Fatalf("Expected no error, got %v", err)
   556  	}
   557  
   558  	err = tester.TestExchanges(p2ptest.Exchange{
   559  		Label: "Subscribe message",
   560  		Expects: []p2ptest.Expect{
   561  			{
   562  				Code: 4,
   563  				Msg: &SubscribeMsg{
   564  					Stream:   stream,
   565  					History:  NewRange(5, 8),
   566  					Priority: Top,
   567  				},
   568  				Peer: node.ID(),
   569  			},
   570  		},
   571  	},
   572  		p2ptest.Exchange{
   573  			Label: "WantedHashes message",
   574  			Triggers: []p2ptest.Trigger{
   575  				{
   576  					Code: 1,
   577  					Msg: &OfferedHashesMsg{
   578  						HandoverProof: &HandoverProof{
   579  							Handover: &Handover{},
   580  						},
   581  						Hashes: hashes,
   582  						From:   5,
   583  						To:     8,
   584  						Stream: stream,
   585  					},
   586  					Peer: node.ID(),
   587  				},
   588  			},
   589  			Expects: []p2ptest.Expect{
   590  				{
   591  					Code: 2,
   592  					Msg: &WantedHashesMsg{
   593  						Stream: stream,
   594  						Want:   []byte{5},
   595  						From:   9,
   596  						To:     0,
   597  					},
   598  					Peer: node.ID(),
   599  				},
   600  			},
   601  		})
   602  	if err != nil {
   603  		t.Fatal(err)
   604  	}
   605  
   606  	if len(tc.receivedHashes) != 3 {
   607  		t.Fatalf("Expected number of received hashes %v, got %v", 3, len(tc.receivedHashes))
   608  	}
   609  
   610  	close(tc.wait0)
   611  
   612  	timeout := time.NewTimer(100 * time.Millisecond)
   613  	defer timeout.Stop()
   614  
   615  	select {
   616  	case <-tc.batchDone:
   617  		t.Fatal("batch done early")
   618  	case <-timeout.C:
   619  	}
   620  
   621  	close(tc.wait2)
   622  
   623  	timeout2 := time.NewTimer(10000 * time.Millisecond)
   624  	defer timeout2.Stop()
   625  
   626  	select {
   627  	case <-tc.batchDone:
   628  	case <-timeout2.C:
   629  		t.Fatal("timeout waiting batchdone call")
   630  	}
   631  
   632  }
   633  
   634  func TestStreamerRequestSubscriptionQuitMsgExchange(t *testing.T) {
   635  	tester, streamer, _, teardown, err := newStreamerTester(t, nil)
   636  	defer teardown()
   637  	if err != nil {
   638  		t.Fatal(err)
   639  	}
   640  
   641  	streamer.RegisterServerFunc("foo", func(p *Peer, t string, live bool) (Server, error) {
   642  		return newTestServer(t, 10), nil
   643  	})
   644  
   645  	node := tester.Nodes[0]
   646  
   647  	stream := NewStream("foo", "", true)
   648  	err = streamer.RequestSubscription(node.ID(), stream, NewRange(5, 8), Top)
   649  	if err != nil {
   650  		t.Fatalf("Expected no error, got %v", err)
   651  	}
   652  
   653  	err = tester.TestExchanges(
   654  		p2ptest.Exchange{
   655  			Label: "RequestSubscription message",
   656  			Expects: []p2ptest.Expect{
   657  				{
   658  					Code: 8,
   659  					Msg: &RequestSubscriptionMsg{
   660  						Stream:   stream,
   661  						History:  NewRange(5, 8),
   662  						Priority: Top,
   663  					},
   664  					Peer: node.ID(),
   665  				},
   666  			},
   667  		},
   668  		p2ptest.Exchange{
   669  			Label: "Subscribe message",
   670  			Triggers: []p2ptest.Trigger{
   671  				{
   672  					Code: 4,
   673  					Msg: &SubscribeMsg{
   674  						Stream:   stream,
   675  						History:  NewRange(5, 8),
   676  						Priority: Top,
   677  					},
   678  					Peer: node.ID(),
   679  				},
   680  			},
   681  			Expects: []p2ptest.Expect{
   682  				{
   683  					Code: 1,
   684  					Msg: &OfferedHashesMsg{
   685  						Stream: NewStream("foo", "", false),
   686  						HandoverProof: &HandoverProof{
   687  							Handover: &Handover{},
   688  						},
   689  						Hashes: make([]byte, HashSize),
   690  						From:   6,
   691  						To:     9,
   692  					},
   693  					Peer: node.ID(),
   694  				},
   695  				{
   696  					Code: 1,
   697  					Msg: &OfferedHashesMsg{
   698  						Stream: stream,
   699  						HandoverProof: &HandoverProof{
   700  							Handover: &Handover{},
   701  						},
   702  						From:   11,
   703  						To:     0,
   704  						Hashes: make([]byte, HashSize),
   705  					},
   706  					Peer: node.ID(),
   707  				},
   708  			},
   709  		},
   710  	)
   711  	if err != nil {
   712  		t.Fatal(err)
   713  	}
   714  
   715  	err = streamer.Quit(node.ID(), stream)
   716  	if err != nil {
   717  		t.Fatalf("Expected no error, got %v", err)
   718  	}
   719  
   720  	err = tester.TestExchanges(p2ptest.Exchange{
   721  		Label: "Quit message",
   722  		Expects: []p2ptest.Expect{
   723  			{
   724  				Code: 9,
   725  				Msg: &QuitMsg{
   726  					Stream: stream,
   727  				},
   728  				Peer: node.ID(),
   729  			},
   730  		},
   731  	})
   732  
   733  	if err != nil {
   734  		t.Fatal(err)
   735  	}
   736  
   737  	historyStream := getHistoryStream(stream)
   738  
   739  	err = streamer.Quit(node.ID(), historyStream)
   740  	if err != nil {
   741  		t.Fatalf("Expected no error, got %v", err)
   742  	}
   743  
   744  	err = tester.TestExchanges(p2ptest.Exchange{
   745  		Label: "Quit message",
   746  		Expects: []p2ptest.Expect{
   747  			{
   748  				Code: 9,
   749  				Msg: &QuitMsg{
   750  					Stream: historyStream,
   751  				},
   752  				Peer: node.ID(),
   753  			},
   754  		},
   755  	})
   756  
   757  	if err != nil {
   758  		t.Fatal(err)
   759  	}
   760  }
   761  
   762  //testmaxpeerserverswithunsubscribe创建一个注册表,其中
   763  //流服务器的数量,并使用订阅和
   764  //取消订阅,检查取消订阅是否将删除流,
   765  //离开新河流的地方。
   766  func TestMaxPeerServersWithUnsubscribe(t *testing.T) {
   767  	var maxPeerServers = 6
   768  	tester, streamer, _, teardown, err := newStreamerTester(t, &RegistryOptions{
   769  		Retrieval:      RetrievalDisabled,
   770  		Syncing:        SyncingDisabled,
   771  		MaxPeerServers: maxPeerServers,
   772  	})
   773  	defer teardown()
   774  	if err != nil {
   775  		t.Fatal(err)
   776  	}
   777  
   778  	streamer.RegisterServerFunc("foo", func(p *Peer, t string, live bool) (Server, error) {
   779  		return newTestServer(t, 0), nil
   780  	})
   781  
   782  	node := tester.Nodes[0]
   783  
   784  	for i := 0; i < maxPeerServers+10; i++ {
   785  		stream := NewStream("foo", strconv.Itoa(i), true)
   786  
   787  		err = tester.TestExchanges(p2ptest.Exchange{
   788  			Label: "Subscribe message",
   789  			Triggers: []p2ptest.Trigger{
   790  				{
   791  					Code: 4,
   792  					Msg: &SubscribeMsg{
   793  						Stream:   stream,
   794  						Priority: Top,
   795  					},
   796  					Peer: node.ID(),
   797  				},
   798  			},
   799  			Expects: []p2ptest.Expect{
   800  				{
   801  					Code: 1,
   802  					Msg: &OfferedHashesMsg{
   803  						Stream: stream,
   804  						HandoverProof: &HandoverProof{
   805  							Handover: &Handover{},
   806  						},
   807  						Hashes: make([]byte, HashSize),
   808  						From:   1,
   809  						To:     0,
   810  					},
   811  					Peer: node.ID(),
   812  				},
   813  			},
   814  		})
   815  
   816  		if err != nil {
   817  			t.Fatal(err)
   818  		}
   819  
   820  		err = tester.TestExchanges(p2ptest.Exchange{
   821  			Label: "unsubscribe message",
   822  			Triggers: []p2ptest.Trigger{
   823  				{
   824  					Code: 0,
   825  					Msg: &UnsubscribeMsg{
   826  						Stream: stream,
   827  					},
   828  					Peer: node.ID(),
   829  				},
   830  			},
   831  		})
   832  
   833  		if err != nil {
   834  			t.Fatal(err)
   835  		}
   836  	}
   837  }
   838  
   839  //testmaxpeerserverswithountsubscribe创建一个注册表,其中
   840  //流服务器的数量,并执行订阅以检测订阅
   841  //错误消息交换。
   842  func TestMaxPeerServersWithoutUnsubscribe(t *testing.T) {
   843  	var maxPeerServers = 6
   844  	tester, streamer, _, teardown, err := newStreamerTester(t, &RegistryOptions{
   845  		MaxPeerServers: maxPeerServers,
   846  	})
   847  	defer teardown()
   848  	if err != nil {
   849  		t.Fatal(err)
   850  	}
   851  
   852  	streamer.RegisterServerFunc("foo", func(p *Peer, t string, live bool) (Server, error) {
   853  		return newTestServer(t, 0), nil
   854  	})
   855  
   856  	node := tester.Nodes[0]
   857  
   858  	for i := 0; i < maxPeerServers+10; i++ {
   859  		stream := NewStream("foo", strconv.Itoa(i), true)
   860  
   861  		if i >= maxPeerServers {
   862  			err = tester.TestExchanges(p2ptest.Exchange{
   863  				Label: "Subscribe message",
   864  				Triggers: []p2ptest.Trigger{
   865  					{
   866  						Code: 4,
   867  						Msg: &SubscribeMsg{
   868  							Stream:   stream,
   869  							Priority: Top,
   870  						},
   871  						Peer: node.ID(),
   872  					},
   873  				},
   874  				Expects: []p2ptest.Expect{
   875  					{
   876  						Code: 7,
   877  						Msg: &SubscribeErrorMsg{
   878  							Error: ErrMaxPeerServers.Error(),
   879  						},
   880  						Peer: node.ID(),
   881  					},
   882  				},
   883  			})
   884  
   885  			if err != nil {
   886  				t.Fatal(err)
   887  			}
   888  			continue
   889  		}
   890  
   891  		err = tester.TestExchanges(p2ptest.Exchange{
   892  			Label: "Subscribe message",
   893  			Triggers: []p2ptest.Trigger{
   894  				{
   895  					Code: 4,
   896  					Msg: &SubscribeMsg{
   897  						Stream:   stream,
   898  						Priority: Top,
   899  					},
   900  					Peer: node.ID(),
   901  				},
   902  			},
   903  			Expects: []p2ptest.Expect{
   904  				{
   905  					Code: 1,
   906  					Msg: &OfferedHashesMsg{
   907  						Stream: stream,
   908  						HandoverProof: &HandoverProof{
   909  							Handover: &Handover{},
   910  						},
   911  						Hashes: make([]byte, HashSize),
   912  						From:   1,
   913  						To:     0,
   914  					},
   915  					Peer: node.ID(),
   916  				},
   917  			},
   918  		})
   919  
   920  		if err != nil {
   921  			t.Fatal(err)
   922  		}
   923  	}
   924  }
   925  
   926  //TestHasPriceImplementation将检查注册表是否具有
   927  //`price`接口实现
   928  func TestHasPriceImplementation(t *testing.T) {
   929  	_, r, _, teardown, err := newStreamerTester(t, &RegistryOptions{
   930  		Retrieval: RetrievalDisabled,
   931  		Syncing:   SyncingDisabled,
   932  	})
   933  	defer teardown()
   934  	if err != nil {
   935  		t.Fatal(err)
   936  	}
   937  
   938  	if r.prices == nil {
   939  		t.Fatal("No prices implementation available for the stream protocol")
   940  	}
   941  
   942  	pricesInstance, ok := r.prices.(*StreamerPrices)
   943  	if !ok {
   944  		t.Fatal("`Registry` does not have the expected Prices instance")
   945  	}
   946  	price := pricesInstance.Price(&ChunkDeliveryMsgRetrieval{})
   947  	if price == nil || price.Value == 0 || price.Value != pricesInstance.getChunkDeliveryMsgRetrievalPrice() {
   948  		t.Fatal("No prices set for chunk delivery msg")
   949  	}
   950  
   951  	price = pricesInstance.Price(&RetrieveRequestMsg{})
   952  	if price == nil || price.Value == 0 || price.Value != pricesInstance.getRetrieveRequestMsgPrice() {
   953  		t.Fatal("No prices set for chunk delivery msg")
   954  	}
   955  }
   956  
   957  /*
   958  TestRequestPeerSubscriptions是流的请求同步订阅的单元测试。
   959  
   960  测试如下:
   961   *将每个连接的对等机分配给一个箱映射
   962    *提前建立一个已知的花环
   963   *运行eachconn函数,该函数返回假定的订阅容器
   964   *在地图中存储每个对等机的所有假定箱
   965   *检查所有对等方是否具有预期订阅
   966  
   967  此KAD表及其对等项从network.testKademliacase1复制,
   968  它表示一个边缘情况,但用于测试
   969  同步订阅很好。
   970  
   971  此测试中使用的地址作为仿真网络的一部分被发现
   972  在流的高级测试中。它们是随机产生的。
   973  
   974  生成的卡德米利亚如下:
   975  =========================================================
   976  12月21日星期五20:02:39 UTC 2018 K∧∧Mli∧Hive:皇后地址:7EFEF1
   977  人口:12(12),MinProxBin大小:2,MinBin大小:2,MaxBin大小:4
   978  000 2 8196 835F 2 8196(0)835F(0)
   979  001 2 2690 28f0 2 2690(0)28f0(0)
   980  002 2 4D72 4A45 2 4D72(0)4A45(0)
   981  003 1 646E 1 646E(0)
   982  004 3 769C 76D1 7656 3 769C(0)76D1(0)7656(0)
   983  ===========深度:5=============================
   984  005 1 7A48 1 7A48(0)
   985  006 1 7CBD 1 7CBD(0)
   986  007 0_0
   987  008 0_0
   988  009 0_0
   989  010 0_0
   990  011 0_0
   991  012 0_0
   992  013 0_0
   993  014 0_0
   994  015 0_0
   995  =========================================================
   996  **/
   997  
   998  func TestRequestPeerSubscriptions(t *testing.T) {
   999  //透视地址;这是实际的Kademlia节点
  1000  	pivotAddr := "7efef1c41d77f843ad167be95f6660567eb8a4a59f39240000cce2e0d65baf8e"
  1001  
  1002  //从给定的卡德米利亚到地址的bin编号的地图
  1003  	binMap := make(map[int][]string)
  1004  	binMap[0] = []string{
  1005  		"835fbbf1d16ba7347b6e2fc552d6e982148d29c624ea20383850df3c810fa8fc",
  1006  		"81968a2d8fb39114342ee1da85254ec51e0608d7f0f6997c2a8354c260a71009",
  1007  	}
  1008  	binMap[1] = []string{
  1009  		"28f0bc1b44658548d6e05dd16d4c2fe77f1da5d48b6774bc4263b045725d0c19",
  1010  		"2690a910c33ee37b91eb6c4e0731d1d345e2dc3b46d308503a6e85bbc242c69e",
  1011  	}
  1012  	binMap[2] = []string{
  1013  		"4a45f1fc63e1a9cb9dfa44c98da2f3d20c2923e5d75ff60b2db9d1bdb0c54d51",
  1014  		"4d72a04ddeb851a68cd197ef9a92a3e2ff01fbbff638e64929dd1a9c2e150112",
  1015  	}
  1016  	binMap[3] = []string{
  1017  		"646e9540c84f6a2f9cf6585d45a4c219573b4fd1b64a3c9a1386fc5cf98c0d4d",
  1018  	}
  1019  	binMap[4] = []string{
  1020  		"7656caccdc79cd8d7ce66d415cc96a718e8271c62fb35746bfc2b49faf3eebf3",
  1021  		"76d1e83c71ca246d042e37ff1db181f2776265fbcfdc890ce230bfa617c9c2f0",
  1022  		"769ce86aa90b518b7ed382f9fdacfbed93574e18dc98fe6c342e4f9f409c2d5a",
  1023  	}
  1024  	binMap[5] = []string{
  1025  		"7a48f75f8ca60487ae42d6f92b785581b40b91f2da551ae73d5eae46640e02e8",
  1026  	}
  1027  	binMap[6] = []string{
  1028  		"7cbd42350bde8e18ae5b955b5450f8e2cef3419f92fbf5598160c60fd78619f0",
  1029  	}
  1030  
  1031  //创建轴的花环
  1032  	addr := common.FromHex(pivotAddr)
  1033  	k := network.NewKademlia(addr, network.NewKadParams())
  1034  
  1035  //构建同行和卡德米利亚
  1036  	for _, binaddrs := range binMap {
  1037  		for _, a := range binaddrs {
  1038  			addr := common.FromHex(a)
  1039  			k.On(network.NewPeer(&network.BzzPeer{BzzAddr: &network.BzzAddr{OAddr: addr}}, k))
  1040  		}
  1041  	}
  1042  
  1043  //TODO:检查KAD表是否相同
  1044  //当前k.string()打印日期,使其永远不会相同:)
  1045  //-->KAD表的JSON表示实现
  1046  	log.Debug(k.String())
  1047  
  1048  //模拟一下我们要订阅:只需存储bin编号
  1049  	fakeSubscriptions := make(map[string][]int)
  1050  //测试完成后,我们需要将subscriptionUnc重置为默认值
  1051  	defer func() { subscriptionFunc = doRequestSubscription }()
  1052  //定义应该为每个连接运行的函数
  1053  //我们不做真正的订阅,只存储箱号
  1054  	subscriptionFunc = func(r *Registry, p *network.Peer, bin uint8, subs map[enode.ID]map[Stream]struct{}) bool {
  1055  //获取对等体ID
  1056  		peerstr := fmt.Sprintf("%x", p.Over())
  1057  //为每个对等机创建容器数组
  1058  		if _, ok := fakeSubscriptions[peerstr]; !ok {
  1059  			fakeSubscriptions[peerstr] = make([]int, 0)
  1060  		}
  1061  //存储(假)bin订阅
  1062  		log.Debug(fmt.Sprintf("Adding fake subscription for peer %s with bin %d", peerstr, bin))
  1063  		fakeSubscriptions[peerstr] = append(fakeSubscriptions[peerstr], int(bin))
  1064  		return true
  1065  	}
  1066  //只创建一个简单的注册表对象,以便能够调用…
  1067  	r := &Registry{}
  1068  	r.requestPeerSubscriptions(k, nil)
  1069  //计算Kademlia深度
  1070  	kdepth := k.NeighbourhoodDepth()
  1071  
  1072  //现在,检查所有对等方是否都有预期(假)订阅
  1073  //迭代bin映射
  1074  	for bin, peers := range binMap {
  1075  //对于每一个同伴…
  1076  		for _, peer := range peers {
  1077  //…获取其(假的)订阅
  1078  			fakeSubsForPeer := fakeSubscriptions[peer]
  1079  //如果同伴的箱子比花环的深度浅…
  1080  			if bin < kdepth {
  1081  //(重复所有(假)订阅)
  1082  				for _, subbin := range fakeSubsForPeer {
  1083  //…只应“订阅”对等机的bin
  1084  //(因此只有一个订阅)
  1085  					if subbin != bin || len(fakeSubsForPeer) != 1 {
  1086  						t.Fatalf("Did not get expected subscription for bin < depth; bin of peer %s: %d, subscription: %d", peer, bin, subbin)
  1087  					}
  1088  				}
  1089  } else { //如果同伴的箱子等于或高于卡德米利亚深度…
  1090  //(重复所有(假)订阅)
  1091  				for i, subbin := range fakeSubsForPeer {
  1092  //…从对等机的bin号到k.maxproxydisplay的每个bin都应该是“订阅的”
  1093  //当我们从深度开始时,我们可以使用迭代索引来检查
  1094  					if subbin != i+kdepth {
  1095  						t.Fatalf("Did not get expected subscription for bin > depth; bin of peer %s: %d, subscription: %d", peer, bin, subbin)
  1096  					}
  1097  //最后一个“订阅”应该是k.maxproxplay
  1098  					if i == len(fakeSubsForPeer)-1 && subbin != k.MaxProxDisplay {
  1099  						t.Fatalf("Expected last subscription to be: %d, but is: %d", k.MaxProxDisplay, subbin)
  1100  					}
  1101  				}
  1102  			}
  1103  		}
  1104  	}
  1105  
  1106  //打印一些输出
  1107  	for p, subs := range fakeSubscriptions {
  1108  		log.Debug(fmt.Sprintf("Peer %s has the following fake subscriptions: ", p))
  1109  		for _, bin := range subs {
  1110  			log.Debug(fmt.Sprintf("%d,", bin))
  1111  		}
  1112  	}
  1113  }
  1114