go-libp2p-core/peer/record_test.go
Steven Allen ef6e277df7
fix: make timestamps strictly increasing (#201)
* fix: make timestamps strictly increasing

On Linux, this is almost always the case. Windows, however, doesn't have
nanosecond accuracy.

We make the timestamp sequence numbers strictly increasing by returning
the last timestamp + 1 where necessary.

* apply code review

Co-authored-by: Marten Seemann <martenseemann@gmail.com>

* use a lock

Co-authored-by: Marten Seemann <martenseemann@gmail.com>
2021-07-16 15:02:22 -07:00

68 lines
2.0 KiB
Go

package peer_test
import (
"bytes"
"testing"
"github.com/libp2p/go-libp2p-core/crypto"
. "github.com/libp2p/go-libp2p-core/peer"
"github.com/libp2p/go-libp2p-core/record"
"github.com/libp2p/go-libp2p-core/test"
)
func TestPeerRecordConstants(t *testing.T) {
msgf := "Changing the %s may cause peer records to be incompatible with older versions. " +
"If you've already thought that through, please update this test so that it passes with the new values."
rec := PeerRecord{}
if rec.Domain() != "libp2p-peer-record" {
t.Errorf(msgf, "signing domain")
}
if !bytes.Equal(rec.Codec(), []byte{0x03, 0x01}) {
t.Errorf(msgf, "codec value")
}
}
func TestSignedPeerRecordFromEnvelope(t *testing.T) {
priv, _, err := test.RandTestKeyPair(crypto.Ed25519, 256)
test.AssertNilError(t, err)
addrs := test.GenerateTestAddrs(10)
id, err := IDFromPrivateKey(priv)
test.AssertNilError(t, err)
rec := &PeerRecord{PeerID: id, Addrs: addrs, Seq: TimestampSeq()}
envelope, err := record.Seal(rec, priv)
test.AssertNilError(t, err)
t.Run("is unaltered after round-trip serde", func(t *testing.T) {
envBytes, err := envelope.Marshal()
test.AssertNilError(t, err)
env2, untypedRecord, err := record.ConsumeEnvelope(envBytes, PeerRecordEnvelopeDomain)
test.AssertNilError(t, err)
rec2, ok := untypedRecord.(*PeerRecord)
if !ok {
t.Error("unmarshaled record is not a *PeerRecord")
}
if !rec.Equal(rec2) {
t.Error("expected peer record to be unaltered after round-trip serde")
}
if !envelope.Equal(env2) {
t.Error("expected signed envelope to be unchanged after round-trip serde")
}
})
}
// This is pretty much guaranteed to pass on Linux no matter how we implement it, but Windows has
// low clock precision. This makes sure we never get a duplicate.
func TestTimestampSeq(t *testing.T) {
var last uint64
for i := 0; i < 1000; i++ {
next := TimestampSeq()
if next <= last {
t.Errorf("non-increasing timestamp found: %d <= %d", next, last)
}
last = next
}
}