aboutsummaryrefslogblamecommitdiffstats
path: root/p2p/simulations/test.go
blob: beeb414e41b367d7fdfd137125b714dec3bd430b (plain) (tree)





































































































































                                                                                                               
package simulations

import (
    "testing"

    "github.com/ethereum/go-ethereum/p2p"
    "github.com/ethereum/go-ethereum/p2p/enode"
    "github.com/ethereum/go-ethereum/p2p/enr"
    "github.com/ethereum/go-ethereum/rpc"
)

// NoopService is the service that does not do anything
// but implements node.Service interface.
type NoopService struct {
    c map[enode.ID]chan struct{}
}

func NewNoopService(ackC map[enode.ID]chan struct{}) *NoopService {
    return &NoopService{
        c: ackC,
    }
}

func (t *NoopService) Protocols() []p2p.Protocol {
    return []p2p.Protocol{
        {
            Name:    "noop",
            Version: 666,
            Length:  0,
            Run: func(peer *p2p.Peer, rw p2p.MsgReadWriter) error {
                if t.c != nil {
                    t.c[peer.ID()] = make(chan struct{})
                    close(t.c[peer.ID()])
                }
                rw.ReadMsg()
                return nil
            },
            NodeInfo: func() interface{} {
                return struct{}{}
            },
            PeerInfo: func(id enode.ID) interface{} {
                return struct{}{}
            },
            Attributes: []enr.Entry{},
        },
    }
}

func (t *NoopService) APIs() []rpc.API {
    return []rpc.API{}
}

func (t *NoopService) Start(server *p2p.Server) error {
    return nil
}

func (t *NoopService) Stop() error {
    return nil
}

func VerifyRing(t *testing.T, net *Network, ids []enode.ID) {
    t.Helper()
    n := len(ids)
    for i := 0; i < n; i++ {
        for j := i + 1; j < n; j++ {
            c := net.GetConn(ids[i], ids[j])
            if i == j-1 || (i == 0 && j == n-1) {
                if c == nil {
                    t.Errorf("nodes %v and %v are not connected, but they should be", i, j)
                }
            } else {
                if c != nil {
                    t.Errorf("nodes %v and %v are connected, but they should not be", i, j)
                }
            }
        }
    }
}

func VerifyChain(t *testing.T, net *Network, ids []enode.ID) {
    t.Helper()
    n := len(ids)
    for i := 0; i < n; i++ {
        for j := i + 1; j < n; j++ {
            c := net.GetConn(ids[i], ids[j])
            if i == j-1 {
                if c == nil {
                    t.Errorf("nodes %v and %v are not connected, but they should be", i, j)
                }
            } else {
                if c != nil {
                    t.Errorf("nodes %v and %v are connected, but they should not be", i, j)
                }
            }
        }
    }
}

func VerifyFull(t *testing.T, net *Network, ids []enode.ID) {
    t.Helper()
    n := len(ids)
    var connections int
    for i, lid := range ids {
        for _, rid := range ids[i+1:] {
            if net.GetConn(lid, rid) != nil {
                connections++
            }
        }
    }

    want := n * (n - 1) / 2
    if connections != want {
        t.Errorf("wrong number of connections, got: %v, want: %v", connections, want)
    }
}

func VerifyStar(t *testing.T, net *Network, ids []enode.ID, centerIndex int) {
    t.Helper()
    n := len(ids)
    for i := 0; i < n; i++ {
        for j := i + 1; j < n; j++ {
            c := net.GetConn(ids[i], ids[j])
            if i == centerIndex || j == centerIndex {
                if c == nil {
                    t.Errorf("nodes %v and %v are not connected, but they should be", i, j)
                }
            } else {
                if c != nil {
                    t.Errorf("nodes %v and %v are connected, but they should not be", i, j)
                }
            }
        }
    }
}