github.com/oskarth/go-ethereum@v1.6.8-0.20191013093314-dac24a9d3494/swarm/network/stream/streamer_test.go (about)

     1  // Copyright 2018 The go-ethereum Authors
     2  // This file is part of the go-ethereum library.
     3  //
     4  // The go-ethereum 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-ethereum 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-ethereum library. If not, see <http://www.gnu.org/licenses/>.
    16  
    17  package stream
    18  
    19  import (
    20  	"bytes"
    21  	"context"
    22  	"errors"
    23  	"strconv"
    24  	"testing"
    25  	"time"
    26  
    27  	"github.com/ethereum/go-ethereum/crypto/sha3"
    28  	p2ptest "github.com/ethereum/go-ethereum/p2p/testing"
    29  )
    30  
    31  func TestStreamerSubscribe(t *testing.T) {
    32  	tester, streamer, _, teardown, err := newStreamerTester(t, nil)
    33  	defer teardown()
    34  	if err != nil {
    35  		t.Fatal(err)
    36  	}
    37  
    38  	stream := NewStream("foo", "", true)
    39  	err = streamer.Subscribe(tester.Nodes[0].ID(), stream, NewRange(0, 0), Top)
    40  	if err == nil || err.Error() != "stream foo not registered" {
    41  		t.Fatalf("Expected error %v, got %v", "stream foo not registered", err)
    42  	}
    43  }
    44  
    45  func TestStreamerRequestSubscription(t *testing.T) {
    46  	tester, streamer, _, teardown, err := newStreamerTester(t, nil)
    47  	defer teardown()
    48  	if err != nil {
    49  		t.Fatal(err)
    50  	}
    51  
    52  	stream := NewStream("foo", "", false)
    53  	err = streamer.RequestSubscription(tester.Nodes[0].ID(), stream, &Range{}, Top)
    54  	if err == nil || err.Error() != "stream foo not registered" {
    55  		t.Fatalf("Expected error %v, got %v", "stream foo not registered", err)
    56  	}
    57  }
    58  
    59  var (
    60  	hash0         = sha3.Sum256([]byte{0})
    61  	hash1         = sha3.Sum256([]byte{1})
    62  	hash2         = sha3.Sum256([]byte{2})
    63  	hashesTmp     = append(hash0[:], hash1[:]...)
    64  	hashes        = append(hashesTmp, hash2[:]...)
    65  	corruptHashes = append(hashes[:40])
    66  )
    67  
    68  type testClient struct {
    69  	t              string
    70  	wait0          chan bool
    71  	wait2          chan bool
    72  	batchDone      chan bool
    73  	receivedHashes map[string][]byte
    74  }
    75  
    76  func newTestClient(t string) *testClient {
    77  	return &testClient{
    78  		t:              t,
    79  		wait0:          make(chan bool),
    80  		wait2:          make(chan bool),
    81  		batchDone:      make(chan bool),
    82  		receivedHashes: make(map[string][]byte),
    83  	}
    84  }
    85  
    86  func (self *testClient) NeedData(ctx context.Context, hash []byte) func(context.Context) error {
    87  	self.receivedHashes[string(hash)] = hash
    88  	if bytes.Equal(hash, hash0[:]) {
    89  		return func(context.Context) error {
    90  			<-self.wait0
    91  			return nil
    92  		}
    93  	} else if bytes.Equal(hash, hash2[:]) {
    94  		return func(context.Context) error {
    95  			<-self.wait2
    96  			return nil
    97  		}
    98  	}
    99  	return nil
   100  }
   101  
   102  func (self *testClient) BatchDone(Stream, uint64, []byte, []byte) func() (*TakeoverProof, error) {
   103  	close(self.batchDone)
   104  	return nil
   105  }
   106  
   107  func (self *testClient) Close() {}
   108  
   109  type testServer struct {
   110  	t            string
   111  	sessionIndex uint64
   112  }
   113  
   114  func newTestServer(t string, sessionIndex uint64) *testServer {
   115  	return &testServer{
   116  		t:            t,
   117  		sessionIndex: sessionIndex,
   118  	}
   119  }
   120  
   121  func (s *testServer) SessionIndex() (uint64, error) {
   122  	return s.sessionIndex, nil
   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, nil)
   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  	node := tester.Nodes[0]
   148  
   149  	stream := NewStream("foo", "", true)
   150  	err = streamer.Subscribe(node.ID(), 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: node.ID(),
   167  				},
   168  			},
   169  		},
   170  		// trigger OfferedHashesMsg to actually create the client
   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: node.ID(),
   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: node.ID(),
   198  				},
   199  			},
   200  		},
   201  	)
   202  	if err != nil {
   203  		t.Fatal(err)
   204  	}
   205  
   206  	err = streamer.Unsubscribe(node.ID(), 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: node.ID(),
   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, nil)
   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, 10), nil
   240  	})
   241  
   242  	node := tester.Nodes[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: node.ID(),
   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: node.ID(),
   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: node.ID(),
   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, nil)
   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, 0), nil
   307  	})
   308  
   309  	node := tester.Nodes[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: node.ID(),
   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:     0,
   334  				},
   335  				Peer: node.ID(),
   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: node.ID(),
   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, nil)
   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, 0), nil
   371  	})
   372  
   373  	stream := NewStream("bar", "", true)
   374  
   375  	node := tester.Nodes[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: node.ID(),
   388  			},
   389  		},
   390  		Expects: []p2ptest.Expect{
   391  			{
   392  				Code: 7,
   393  				Msg: &SubscribeErrorMsg{
   394  					Error: "stream bar not registered",
   395  				},
   396  				Peer: node.ID(),
   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, nil)
   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 newTestServer(t, 10), nil
   417  	})
   418  
   419  	node := tester.Nodes[0]
   420  
   421  	err = tester.TestExchanges(p2ptest.Exchange{
   422  		Label: "Subscribe message",
   423  		Triggers: []p2ptest.Trigger{
   424  			{
   425  				Code: 4,
   426  				Msg: &SubscribeMsg{
   427  					Stream:   stream,
   428  					History:  NewRange(5, 8),
   429  					Priority: Top,
   430  				},
   431  				Peer: node.ID(),
   432  			},
   433  		},
   434  		Expects: []p2ptest.Expect{
   435  			{
   436  				Code: 1,
   437  				Msg: &OfferedHashesMsg{
   438  					Stream: NewStream("foo", "", false),
   439  					HandoverProof: &HandoverProof{
   440  						Handover: &Handover{},
   441  					},
   442  					Hashes: make([]byte, HashSize),
   443  					From:   6,
   444  					To:     9,
   445  				},
   446  				Peer: node.ID(),
   447  			},
   448  			{
   449  				Code: 1,
   450  				Msg: &OfferedHashesMsg{
   451  					Stream: stream,
   452  					HandoverProof: &HandoverProof{
   453  						Handover: &Handover{},
   454  					},
   455  					From:   11,
   456  					To:     0,
   457  					Hashes: make([]byte, HashSize),
   458  				},
   459  				Peer: node.ID(),
   460  			},
   461  		},
   462  	})
   463  
   464  	if err != nil {
   465  		t.Fatal(err)
   466  	}
   467  }
   468  
   469  func TestStreamerDownstreamCorruptHashesMsgExchange(t *testing.T) {
   470  	tester, streamer, _, teardown, err := newStreamerTester(t, nil)
   471  	defer teardown()
   472  	if err != nil {
   473  		t.Fatal(err)
   474  	}
   475  
   476  	stream := NewStream("foo", "", true)
   477  
   478  	var tc *testClient
   479  
   480  	streamer.RegisterClientFunc("foo", func(p *Peer, t string, live bool) (Client, error) {
   481  		tc = newTestClient(t)
   482  		return tc, nil
   483  	})
   484  
   485  	node := tester.Nodes[0]
   486  
   487  	err = streamer.Subscribe(node.ID(), stream, NewRange(5, 8), Top)
   488  	if err != nil {
   489  		t.Fatalf("Expected no error, got %v", err)
   490  	}
   491  
   492  	err = tester.TestExchanges(p2ptest.Exchange{
   493  		Label: "Subscribe message",
   494  		Expects: []p2ptest.Expect{
   495  			{
   496  				Code: 4,
   497  				Msg: &SubscribeMsg{
   498  					Stream:   stream,
   499  					History:  NewRange(5, 8),
   500  					Priority: Top,
   501  				},
   502  				Peer: node.ID(),
   503  			},
   504  		},
   505  	},
   506  		p2ptest.Exchange{
   507  			Label: "Corrupt offered hash message",
   508  			Triggers: []p2ptest.Trigger{
   509  				{
   510  					Code: 1,
   511  					Msg: &OfferedHashesMsg{
   512  						HandoverProof: &HandoverProof{
   513  							Handover: &Handover{},
   514  						},
   515  						Hashes: corruptHashes,
   516  						From:   5,
   517  						To:     8,
   518  						Stream: stream,
   519  					},
   520  					Peer: node.ID(),
   521  				},
   522  			},
   523  		})
   524  	if err != nil {
   525  		t.Fatal(err)
   526  	}
   527  
   528  	expectedError := errors.New("Message handler error: (msg code 1): error invalid hashes length (len: 40)")
   529  	if err := tester.TestDisconnected(&p2ptest.Disconnect{Peer: node.ID(), Error: expectedError}); err != nil {
   530  		t.Fatal(err)
   531  	}
   532  }
   533  
   534  func TestStreamerDownstreamOfferedHashesMsgExchange(t *testing.T) {
   535  	tester, streamer, _, teardown, err := newStreamerTester(t, nil)
   536  	defer teardown()
   537  	if err != nil {
   538  		t.Fatal(err)
   539  	}
   540  
   541  	stream := NewStream("foo", "", true)
   542  
   543  	var tc *testClient
   544  
   545  	streamer.RegisterClientFunc("foo", func(p *Peer, t string, live bool) (Client, error) {
   546  		tc = newTestClient(t)
   547  		return tc, nil
   548  	})
   549  
   550  	node := tester.Nodes[0]
   551  
   552  	err = streamer.Subscribe(node.ID(), stream, NewRange(5, 8), Top)
   553  	if err != nil {
   554  		t.Fatalf("Expected no error, got %v", err)
   555  	}
   556  
   557  	err = tester.TestExchanges(p2ptest.Exchange{
   558  		Label: "Subscribe message",
   559  		Expects: []p2ptest.Expect{
   560  			{
   561  				Code: 4,
   562  				Msg: &SubscribeMsg{
   563  					Stream:   stream,
   564  					History:  NewRange(5, 8),
   565  					Priority: Top,
   566  				},
   567  				Peer: node.ID(),
   568  			},
   569  		},
   570  	},
   571  		p2ptest.Exchange{
   572  			Label: "WantedHashes message",
   573  			Triggers: []p2ptest.Trigger{
   574  				{
   575  					Code: 1,
   576  					Msg: &OfferedHashesMsg{
   577  						HandoverProof: &HandoverProof{
   578  							Handover: &Handover{},
   579  						},
   580  						Hashes: hashes,
   581  						From:   5,
   582  						To:     8,
   583  						Stream: stream,
   584  					},
   585  					Peer: node.ID(),
   586  				},
   587  			},
   588  			Expects: []p2ptest.Expect{
   589  				{
   590  					Code: 2,
   591  					Msg: &WantedHashesMsg{
   592  						Stream: stream,
   593  						Want:   []byte{5},
   594  						From:   9,
   595  						To:     0,
   596  					},
   597  					Peer: node.ID(),
   598  				},
   599  			},
   600  		})
   601  	if err != nil {
   602  		t.Fatal(err)
   603  	}
   604  
   605  	if len(tc.receivedHashes) != 3 {
   606  		t.Fatalf("Expected number of received hashes %v, got %v", 3, len(tc.receivedHashes))
   607  	}
   608  
   609  	close(tc.wait0)
   610  
   611  	timeout := time.NewTimer(100 * time.Millisecond)
   612  	defer timeout.Stop()
   613  
   614  	select {
   615  	case <-tc.batchDone:
   616  		t.Fatal("batch done early")
   617  	case <-timeout.C:
   618  	}
   619  
   620  	close(tc.wait2)
   621  
   622  	timeout2 := time.NewTimer(10000 * time.Millisecond)
   623  	defer timeout2.Stop()
   624  
   625  	select {
   626  	case <-tc.batchDone:
   627  	case <-timeout2.C:
   628  		t.Fatal("timeout waiting batchdone call")
   629  	}
   630  
   631  }
   632  
   633  func TestStreamerRequestSubscriptionQuitMsgExchange(t *testing.T) {
   634  	tester, streamer, _, teardown, err := newStreamerTester(t, nil)
   635  	defer teardown()
   636  	if err != nil {
   637  		t.Fatal(err)
   638  	}
   639  
   640  	streamer.RegisterServerFunc("foo", func(p *Peer, t string, live bool) (Server, error) {
   641  		return newTestServer(t, 10), nil
   642  	})
   643  
   644  	node := tester.Nodes[0]
   645  
   646  	stream := NewStream("foo", "", true)
   647  	err = streamer.RequestSubscription(node.ID(), stream, NewRange(5, 8), Top)
   648  	if err != nil {
   649  		t.Fatalf("Expected no error, got %v", err)
   650  	}
   651  
   652  	err = tester.TestExchanges(
   653  		p2ptest.Exchange{
   654  			Label: "RequestSubscription message",
   655  			Expects: []p2ptest.Expect{
   656  				{
   657  					Code: 8,
   658  					Msg: &RequestSubscriptionMsg{
   659  						Stream:   stream,
   660  						History:  NewRange(5, 8),
   661  						Priority: Top,
   662  					},
   663  					Peer: node.ID(),
   664  				},
   665  			},
   666  		},
   667  		p2ptest.Exchange{
   668  			Label: "Subscribe message",
   669  			Triggers: []p2ptest.Trigger{
   670  				{
   671  					Code: 4,
   672  					Msg: &SubscribeMsg{
   673  						Stream:   stream,
   674  						History:  NewRange(5, 8),
   675  						Priority: Top,
   676  					},
   677  					Peer: node.ID(),
   678  				},
   679  			},
   680  			Expects: []p2ptest.Expect{
   681  				{
   682  					Code: 1,
   683  					Msg: &OfferedHashesMsg{
   684  						Stream: NewStream("foo", "", false),
   685  						HandoverProof: &HandoverProof{
   686  							Handover: &Handover{},
   687  						},
   688  						Hashes: make([]byte, HashSize),
   689  						From:   6,
   690  						To:     9,
   691  					},
   692  					Peer: node.ID(),
   693  				},
   694  				{
   695  					Code: 1,
   696  					Msg: &OfferedHashesMsg{
   697  						Stream: stream,
   698  						HandoverProof: &HandoverProof{
   699  							Handover: &Handover{},
   700  						},
   701  						From:   11,
   702  						To:     0,
   703  						Hashes: make([]byte, HashSize),
   704  					},
   705  					Peer: node.ID(),
   706  				},
   707  			},
   708  		},
   709  	)
   710  	if err != nil {
   711  		t.Fatal(err)
   712  	}
   713  
   714  	err = streamer.Quit(node.ID(), stream)
   715  	if err != nil {
   716  		t.Fatalf("Expected no error, got %v", err)
   717  	}
   718  
   719  	err = tester.TestExchanges(p2ptest.Exchange{
   720  		Label: "Quit message",
   721  		Expects: []p2ptest.Expect{
   722  			{
   723  				Code: 9,
   724  				Msg: &QuitMsg{
   725  					Stream: stream,
   726  				},
   727  				Peer: node.ID(),
   728  			},
   729  		},
   730  	})
   731  
   732  	if err != nil {
   733  		t.Fatal(err)
   734  	}
   735  
   736  	historyStream := getHistoryStream(stream)
   737  
   738  	err = streamer.Quit(node.ID(), historyStream)
   739  	if err != nil {
   740  		t.Fatalf("Expected no error, got %v", err)
   741  	}
   742  
   743  	err = tester.TestExchanges(p2ptest.Exchange{
   744  		Label: "Quit message",
   745  		Expects: []p2ptest.Expect{
   746  			{
   747  				Code: 9,
   748  				Msg: &QuitMsg{
   749  					Stream: historyStream,
   750  				},
   751  				Peer: node.ID(),
   752  			},
   753  		},
   754  	})
   755  
   756  	if err != nil {
   757  		t.Fatal(err)
   758  	}
   759  }
   760  
   761  // TestMaxPeerServersWithUnsubscribe creates a registry with a limited
   762  // number of stream servers, and performs a test with subscriptions and
   763  // unsubscriptions, checking if unsubscriptions will remove streams,
   764  // leaving place for new streams.
   765  func TestMaxPeerServersWithUnsubscribe(t *testing.T) {
   766  	var maxPeerServers = 6
   767  	tester, streamer, _, teardown, err := newStreamerTester(t, &RegistryOptions{
   768  		MaxPeerServers: maxPeerServers,
   769  	})
   770  	defer teardown()
   771  	if err != nil {
   772  		t.Fatal(err)
   773  	}
   774  
   775  	streamer.RegisterServerFunc("foo", func(p *Peer, t string, live bool) (Server, error) {
   776  		return newTestServer(t, 0), nil
   777  	})
   778  
   779  	node := tester.Nodes[0]
   780  
   781  	for i := 0; i < maxPeerServers+10; i++ {
   782  		stream := NewStream("foo", strconv.Itoa(i), true)
   783  
   784  		err = tester.TestExchanges(p2ptest.Exchange{
   785  			Label: "Subscribe message",
   786  			Triggers: []p2ptest.Trigger{
   787  				{
   788  					Code: 4,
   789  					Msg: &SubscribeMsg{
   790  						Stream:   stream,
   791  						Priority: Top,
   792  					},
   793  					Peer: node.ID(),
   794  				},
   795  			},
   796  			Expects: []p2ptest.Expect{
   797  				{
   798  					Code: 1,
   799  					Msg: &OfferedHashesMsg{
   800  						Stream: stream,
   801  						HandoverProof: &HandoverProof{
   802  							Handover: &Handover{},
   803  						},
   804  						Hashes: make([]byte, HashSize),
   805  						From:   1,
   806  						To:     0,
   807  					},
   808  					Peer: node.ID(),
   809  				},
   810  			},
   811  		})
   812  
   813  		if err != nil {
   814  			t.Fatal(err)
   815  		}
   816  
   817  		err = tester.TestExchanges(p2ptest.Exchange{
   818  			Label: "unsubscribe message",
   819  			Triggers: []p2ptest.Trigger{
   820  				{
   821  					Code: 0,
   822  					Msg: &UnsubscribeMsg{
   823  						Stream: stream,
   824  					},
   825  					Peer: node.ID(),
   826  				},
   827  			},
   828  		})
   829  
   830  		if err != nil {
   831  			t.Fatal(err)
   832  		}
   833  	}
   834  }
   835  
   836  // TestMaxPeerServersWithoutUnsubscribe creates a registry with a limited
   837  // number of stream servers, and performs subscriptions to detect subscriptions
   838  // error message exchange.
   839  func TestMaxPeerServersWithoutUnsubscribe(t *testing.T) {
   840  	var maxPeerServers = 6
   841  	tester, streamer, _, teardown, err := newStreamerTester(t, &RegistryOptions{
   842  		MaxPeerServers: maxPeerServers,
   843  	})
   844  	defer teardown()
   845  	if err != nil {
   846  		t.Fatal(err)
   847  	}
   848  
   849  	streamer.RegisterServerFunc("foo", func(p *Peer, t string, live bool) (Server, error) {
   850  		return newTestServer(t, 0), nil
   851  	})
   852  
   853  	node := tester.Nodes[0]
   854  
   855  	for i := 0; i < maxPeerServers+10; i++ {
   856  		stream := NewStream("foo", strconv.Itoa(i), true)
   857  
   858  		if i >= maxPeerServers {
   859  			err = tester.TestExchanges(p2ptest.Exchange{
   860  				Label: "Subscribe message",
   861  				Triggers: []p2ptest.Trigger{
   862  					{
   863  						Code: 4,
   864  						Msg: &SubscribeMsg{
   865  							Stream:   stream,
   866  							Priority: Top,
   867  						},
   868  						Peer: node.ID(),
   869  					},
   870  				},
   871  				Expects: []p2ptest.Expect{
   872  					{
   873  						Code: 7,
   874  						Msg: &SubscribeErrorMsg{
   875  							Error: ErrMaxPeerServers.Error(),
   876  						},
   877  						Peer: node.ID(),
   878  					},
   879  				},
   880  			})
   881  
   882  			if err != nil {
   883  				t.Fatal(err)
   884  			}
   885  			continue
   886  		}
   887  
   888  		err = tester.TestExchanges(p2ptest.Exchange{
   889  			Label: "Subscribe message",
   890  			Triggers: []p2ptest.Trigger{
   891  				{
   892  					Code: 4,
   893  					Msg: &SubscribeMsg{
   894  						Stream:   stream,
   895  						Priority: Top,
   896  					},
   897  					Peer: node.ID(),
   898  				},
   899  			},
   900  			Expects: []p2ptest.Expect{
   901  				{
   902  					Code: 1,
   903  					Msg: &OfferedHashesMsg{
   904  						Stream: stream,
   905  						HandoverProof: &HandoverProof{
   906  							Handover: &Handover{},
   907  						},
   908  						Hashes: make([]byte, HashSize),
   909  						From:   1,
   910  						To:     0,
   911  					},
   912  					Peer: node.ID(),
   913  				},
   914  			},
   915  		})
   916  
   917  		if err != nil {
   918  			t.Fatal(err)
   919  		}
   920  	}
   921  }