66 lines
1.4 KiB
Go
66 lines
1.4 KiB
Go
package gossip
|
|
|
|
import (
|
|
"context"
|
|
"crypto/ed25519"
|
|
"crypto/rand"
|
|
"net"
|
|
"net/netip"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
"golang.org/x/sync/errgroup"
|
|
)
|
|
|
|
func TestPingServer(t *testing.T) {
|
|
conn, err := net.ListenUDP("udp", net.UDPAddrFromAddrPort(netip.MustParseAddrPort("[::1]:0")))
|
|
require.NoError(t, err)
|
|
defer conn.Close()
|
|
|
|
lo := conn.LocalAddr().(*net.UDPAddr).AddrPort()
|
|
|
|
_, identity, err := ed25519.GenerateKey(rand.Reader)
|
|
require.NoError(t, err)
|
|
|
|
handler := &Handler{
|
|
PingClient: NewPingClient(identity, conn),
|
|
PingServer: NewPingServer(identity, conn),
|
|
}
|
|
client := NewDriver(handler, conn)
|
|
|
|
ctx := context.Background()
|
|
ctx, cancel := context.WithCancel(ctx)
|
|
|
|
group, ctx := errgroup.WithContext(ctx)
|
|
group.Go(func() error {
|
|
return client.Run(ctx)
|
|
})
|
|
group.Go(func() error {
|
|
defer cancel()
|
|
pinger := handler.PingClient
|
|
|
|
for i := 0; i < 100; i++ {
|
|
pong, responder, err := pinger.Ping(ctx, lo)
|
|
require.NoError(t, err)
|
|
assert.Equal(t, lo, responder)
|
|
assert.True(t, pong.Verify())
|
|
}
|
|
return nil
|
|
})
|
|
err = group.Wait()
|
|
assert.NoError(t, err)
|
|
}
|
|
|
|
func BenchmarkPing_SignHashVerify(b *testing.B) {
|
|
_, identity, err := ed25519.GenerateKey(rand.Reader)
|
|
require.NoError(b, err)
|
|
|
|
for i := 0; i < b.N; i++ {
|
|
ping := NewPingRandom(identity)
|
|
assert.True(b, ping.Verify())
|
|
pong := NewPing(HashPingToken(ping.Token), identity)
|
|
assert.True(b, pong.Verify())
|
|
}
|
|
}
|