|
|
@ -119,39 +119,6 @@ func TestPEXReactorRunning(t *testing.T) { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
func assertPeersWithTimeout(t *testing.T, switches []*p2p.Switch, checkPeriod, timeout time.Duration, nPeers int) { |
|
|
|
ticker := time.NewTicker(checkPeriod) |
|
|
|
remaining := timeout |
|
|
|
for { |
|
|
|
select { |
|
|
|
case <-ticker.C: |
|
|
|
// check peers are connected
|
|
|
|
allGood := true |
|
|
|
for _, s := range switches { |
|
|
|
outbound, inbound, _ := s.NumPeers() |
|
|
|
if outbound+inbound < nPeers { |
|
|
|
allGood = false |
|
|
|
} |
|
|
|
} |
|
|
|
remaining -= checkPeriod |
|
|
|
if remaining < 0 { |
|
|
|
remaining = 0 |
|
|
|
} |
|
|
|
if allGood { |
|
|
|
return |
|
|
|
} |
|
|
|
case <-time.After(remaining): |
|
|
|
numPeersStr := "" |
|
|
|
for i, s := range switches { |
|
|
|
outbound, inbound, _ := s.NumPeers() |
|
|
|
numPeersStr += fmt.Sprintf("%d => {outbound: %d, inbound: %d}, ", i, outbound, inbound) |
|
|
|
} |
|
|
|
t.Errorf("expected all switches to be connected to at least one peer (switches: %s)", numPeersStr) |
|
|
|
return |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
func TestPEXReactorReceive(t *testing.T) { |
|
|
|
assert, require := assert.New(t), require.New(t) |
|
|
|
|
|
|
@ -259,6 +226,7 @@ func TestPEXReactorAddrsMessageAbuse(t *testing.T) { |
|
|
|
} |
|
|
|
|
|
|
|
func TestPEXReactorUsesSeedsIfNeeded(t *testing.T) { |
|
|
|
|
|
|
|
dir, err := ioutil.TempDir("", "pex_reactor") |
|
|
|
require.Nil(t, err) |
|
|
|
defer os.RemoveAll(dir) // nolint: errcheck
|
|
|
@ -267,36 +235,56 @@ func TestPEXReactorUsesSeedsIfNeeded(t *testing.T) { |
|
|
|
book.SetLogger(log.TestingLogger()) |
|
|
|
|
|
|
|
// 1. create seed
|
|
|
|
seed := p2p.MakeSwitch(config, 0, "127.0.0.1", "123.123.123", func(i int, sw *p2p.Switch) *p2p.Switch { |
|
|
|
sw.SetLogger(log.TestingLogger()) |
|
|
|
seed := p2p.MakeSwitch( |
|
|
|
config, |
|
|
|
0, |
|
|
|
"127.0.0.1", |
|
|
|
"123.123.123", |
|
|
|
func(i int, sw *p2p.Switch) *p2p.Switch { |
|
|
|
sw.SetLogger(log.TestingLogger()) |
|
|
|
|
|
|
|
r := NewPEXReactor(book, &PEXReactorConfig{}) |
|
|
|
r.SetLogger(log.TestingLogger()) |
|
|
|
r.SetEnsurePeersPeriod(250 * time.Millisecond) |
|
|
|
sw.AddReactor("pex", r) |
|
|
|
return sw |
|
|
|
}) |
|
|
|
seed.AddListener(p2p.NewDefaultListener("tcp", seed.NodeInfo().ListenAddr, true, log.TestingLogger())) |
|
|
|
err = seed.Start() |
|
|
|
require.Nil(t, err) |
|
|
|
r := NewPEXReactor(book, &PEXReactorConfig{}) |
|
|
|
r.SetLogger(log.TestingLogger()) |
|
|
|
sw.AddReactor("pex", r) |
|
|
|
return sw |
|
|
|
}, |
|
|
|
) |
|
|
|
seed.AddListener( |
|
|
|
p2p.NewDefaultListener( |
|
|
|
"tcp", |
|
|
|
seed.NodeInfo().ListenAddr, |
|
|
|
true, |
|
|
|
log.TestingLogger(), |
|
|
|
), |
|
|
|
) |
|
|
|
require.Nil(t, seed.Start()) |
|
|
|
defer seed.Stop() |
|
|
|
|
|
|
|
// 2. create usual peer
|
|
|
|
sw := p2p.MakeSwitch(config, 1, "127.0.0.1", "123.123.123", func(i int, sw *p2p.Switch) *p2p.Switch { |
|
|
|
sw.SetLogger(log.TestingLogger()) |
|
|
|
|
|
|
|
r := NewPEXReactor(book, &PEXReactorConfig{Seeds: []string{seed.NodeInfo().NetAddress().String()}}) |
|
|
|
r.SetLogger(log.TestingLogger()) |
|
|
|
r.SetEnsurePeersPeriod(250 * time.Millisecond) |
|
|
|
sw.AddReactor("pex", r) |
|
|
|
return sw |
|
|
|
}) |
|
|
|
err = sw.Start() |
|
|
|
require.Nil(t, err) |
|
|
|
defer sw.Stop() |
|
|
|
// 2. create usual peer with only seed configured.
|
|
|
|
peer := p2p.MakeSwitch( |
|
|
|
config, |
|
|
|
1, |
|
|
|
"127.0.0.1", |
|
|
|
"123.123.123", |
|
|
|
func(i int, sw *p2p.Switch) *p2p.Switch { |
|
|
|
sw.SetLogger(log.TestingLogger()) |
|
|
|
|
|
|
|
r := NewPEXReactor( |
|
|
|
book, |
|
|
|
&PEXReactorConfig{ |
|
|
|
Seeds: []string{seed.NodeInfo().NetAddress().String()}, |
|
|
|
}, |
|
|
|
) |
|
|
|
r.SetLogger(log.TestingLogger()) |
|
|
|
sw.AddReactor("pex", r) |
|
|
|
return sw |
|
|
|
}, |
|
|
|
) |
|
|
|
require.Nil(t, peer.Start()) |
|
|
|
defer peer.Stop() |
|
|
|
|
|
|
|
// 3. check that peer at least connects to seed
|
|
|
|
assertPeersWithTimeout(t, []*p2p.Switch{sw}, 10*time.Millisecond, 10*time.Second, 1) |
|
|
|
// 3. check that the peer connects to seed immediately
|
|
|
|
assertPeersWithTimeout(t, []*p2p.Switch{peer}, 10*time.Millisecond, 1*time.Second, 1) |
|
|
|
} |
|
|
|
|
|
|
|
func TestPEXReactorCrawlStatus(t *testing.T) { |
|
|
@ -368,3 +356,47 @@ func (mp mockPeer) Send(byte, interface{}) bool { return false } |
|
|
|
func (mp mockPeer) TrySend(byte, interface{}) bool { return false } |
|
|
|
func (mp mockPeer) Set(string, interface{}) {} |
|
|
|
func (mp mockPeer) Get(string) interface{} { return nil } |
|
|
|
|
|
|
|
func assertPeersWithTimeout( |
|
|
|
t *testing.T, |
|
|
|
switches []*p2p.Switch, |
|
|
|
checkPeriod, timeout time.Duration, |
|
|
|
nPeers int, |
|
|
|
) { |
|
|
|
var ( |
|
|
|
ticker = time.NewTicker(checkPeriod) |
|
|
|
remaining = timeout |
|
|
|
) |
|
|
|
|
|
|
|
for { |
|
|
|
select { |
|
|
|
case <-ticker.C: |
|
|
|
// check peers are connected
|
|
|
|
allGood := true |
|
|
|
for _, s := range switches { |
|
|
|
outbound, inbound, _ := s.NumPeers() |
|
|
|
if outbound+inbound < nPeers { |
|
|
|
allGood = false |
|
|
|
} |
|
|
|
} |
|
|
|
remaining -= checkPeriod |
|
|
|
if remaining < 0 { |
|
|
|
remaining = 0 |
|
|
|
} |
|
|
|
if allGood { |
|
|
|
return |
|
|
|
} |
|
|
|
case <-time.After(remaining): |
|
|
|
numPeersStr := "" |
|
|
|
for i, s := range switches { |
|
|
|
outbound, inbound, _ := s.NumPeers() |
|
|
|
numPeersStr += fmt.Sprintf("%d => {outbound: %d, inbound: %d}, ", i, outbound, inbound) |
|
|
|
} |
|
|
|
t.Errorf( |
|
|
|
"expected all switches to be connected to at least one peer (switches: %s)", |
|
|
|
numPeersStr, |
|
|
|
) |
|
|
|
return |
|
|
|
} |
|
|
|
} |
|
|
|
} |