github.com/MMMY001/go-ethereum@v1.9.7/p2p/simulations/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 simulations 18 19 import ( 20 "testing" 21 22 "github.com/ethereum/go-ethereum/p2p" 23 "github.com/ethereum/go-ethereum/p2p/enode" 24 "github.com/ethereum/go-ethereum/p2p/enr" 25 "github.com/ethereum/go-ethereum/rpc" 26 ) 27 28 // NoopService is the service that does not do anything 29 // but implements node.Service interface. 30 type NoopService struct { 31 c map[enode.ID]chan struct{} 32 } 33 34 func NewNoopService(ackC map[enode.ID]chan struct{}) *NoopService { 35 return &NoopService{ 36 c: ackC, 37 } 38 } 39 40 func (t *NoopService) Protocols() []p2p.Protocol { 41 return []p2p.Protocol{ 42 { 43 Name: "noop", 44 Version: 666, 45 Length: 0, 46 Run: func(peer *p2p.Peer, rw p2p.MsgReadWriter) error { 47 if t.c != nil { 48 t.c[peer.ID()] = make(chan struct{}) 49 close(t.c[peer.ID()]) 50 } 51 rw.ReadMsg() 52 return nil 53 }, 54 NodeInfo: func() interface{} { 55 return struct{}{} 56 }, 57 PeerInfo: func(id enode.ID) interface{} { 58 return struct{}{} 59 }, 60 Attributes: []enr.Entry{}, 61 }, 62 } 63 } 64 65 func (t *NoopService) APIs() []rpc.API { 66 return []rpc.API{} 67 } 68 69 func (t *NoopService) Start(server *p2p.Server) error { 70 return nil 71 } 72 73 func (t *NoopService) Stop() error { 74 return nil 75 } 76 77 func VerifyRing(t *testing.T, net *Network, ids []enode.ID) { 78 t.Helper() 79 n := len(ids) 80 for i := 0; i < n; i++ { 81 for j := i + 1; j < n; j++ { 82 c := net.GetConn(ids[i], ids[j]) 83 if i == j-1 || (i == 0 && j == n-1) { 84 if c == nil { 85 t.Errorf("nodes %v and %v are not connected, but they should be", i, j) 86 } 87 } else { 88 if c != nil { 89 t.Errorf("nodes %v and %v are connected, but they should not be", i, j) 90 } 91 } 92 } 93 } 94 } 95 96 func VerifyChain(t *testing.T, net *Network, ids []enode.ID) { 97 t.Helper() 98 n := len(ids) 99 for i := 0; i < n; i++ { 100 for j := i + 1; j < n; j++ { 101 c := net.GetConn(ids[i], ids[j]) 102 if i == j-1 { 103 if c == nil { 104 t.Errorf("nodes %v and %v are not connected, but they should be", i, j) 105 } 106 } else { 107 if c != nil { 108 t.Errorf("nodes %v and %v are connected, but they should not be", i, j) 109 } 110 } 111 } 112 } 113 } 114 115 func VerifyFull(t *testing.T, net *Network, ids []enode.ID) { 116 t.Helper() 117 n := len(ids) 118 var connections int 119 for i, lid := range ids { 120 for _, rid := range ids[i+1:] { 121 if net.GetConn(lid, rid) != nil { 122 connections++ 123 } 124 } 125 } 126 127 want := n * (n - 1) / 2 128 if connections != want { 129 t.Errorf("wrong number of connections, got: %v, want: %v", connections, want) 130 } 131 } 132 133 func VerifyStar(t *testing.T, net *Network, ids []enode.ID, centerIndex int) { 134 t.Helper() 135 n := len(ids) 136 for i := 0; i < n; i++ { 137 for j := i + 1; j < n; j++ { 138 c := net.GetConn(ids[i], ids[j]) 139 if i == centerIndex || j == centerIndex { 140 if c == nil { 141 t.Errorf("nodes %v and %v are not connected, but they should be", i, j) 142 } 143 } else { 144 if c != nil { 145 t.Errorf("nodes %v and %v are connected, but they should not be", i, j) 146 } 147 } 148 } 149 } 150 }