mirror of
https://github.com/netbirdio/netbird.git
synced 2026-10-22 13:29:08 +02:00
The recovery test could time out its own bootstraps under CI load, the non-capable test passed with the cancellation removed, and the decoder rejection test only exercised the encoder. The timing spike ran on every go test; it is a benchmark now.
87 lines
2.6 KiB
Go
87 lines
2.6 KiB
Go
package pqkem
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestMessageRoundTrip(t *testing.T) {
|
|
init, err := NewInitiator()
|
|
require.NoError(t, err)
|
|
answer, _, err := Respond(init.Offer(), Binding{LocalID: wgB, RemoteID: wgA})
|
|
require.NoError(t, err)
|
|
|
|
id := ExchangeID{1, 2, 3, 4}
|
|
ack := ExchangeID{9, 9, 9}
|
|
|
|
offBytes, err := (&OfferMsg{ExchangeID: id, AckID: ack, KEMOffer: init.Offer()}).Encode()
|
|
require.NoError(t, err)
|
|
typ, decoded, err := Decode(offBytes)
|
|
require.NoError(t, err)
|
|
require.Equal(t, MsgOffer, typ)
|
|
require.Equal(t, id, decoded.(*OfferMsg).ExchangeID)
|
|
require.Equal(t, ack, decoded.(*OfferMsg).AckID)
|
|
require.Equal(t, init.Offer(), decoded.(*OfferMsg).KEMOffer)
|
|
|
|
ansBytes, err := (&AnswerMsg{ExchangeID: id, KEMAnswer: answer}).Encode()
|
|
require.NoError(t, err)
|
|
typ, decoded, err = Decode(ansBytes)
|
|
require.NoError(t, err)
|
|
require.Equal(t, MsgAnswer, typ)
|
|
require.Equal(t, answer, decoded.(*AnswerMsg).KEMAnswer)
|
|
|
|
// The error marker is a non-empty, payload-less message carrying the exchange id, so
|
|
// the initiator can tell a responder failure from an empty "no KEM" answer.
|
|
errBytes := (&ErrorMsg{ExchangeID: id}).Encode()
|
|
require.NotEmpty(t, errBytes)
|
|
typ, decoded, err = Decode(errBytes)
|
|
require.NoError(t, err)
|
|
require.Equal(t, MsgError, typ)
|
|
require.Equal(t, id, decoded.(*ErrorMsg).ExchangeID)
|
|
}
|
|
|
|
func TestDecodeRejects(t *testing.T) {
|
|
// too short
|
|
_, _, err := Decode([]byte{1, 1})
|
|
require.Error(t, err)
|
|
|
|
// wrong version
|
|
bad := make([]byte, headerSize+ExchangeIDSize+OfferSize)
|
|
bad[0] = byte(MsgOffer)
|
|
bad[1] = ProtocolVersion + 1
|
|
_, _, err = Decode(bad)
|
|
require.Error(t, err)
|
|
|
|
// unknown type
|
|
bad2 := make([]byte, headerSize)
|
|
bad2[0] = 99
|
|
bad2[1] = ProtocolVersion
|
|
_, _, err = Decode(bad2)
|
|
require.Error(t, err)
|
|
|
|
// the encoder refuses an offer with the wrong payload size
|
|
_, err = (&OfferMsg{KEMOffer: []byte{1, 2, 3}}).Encode()
|
|
require.Error(t, err)
|
|
|
|
// the decoder refuses a framed offer, answer or error marker whose payload has the
|
|
// wrong size
|
|
short := make([]byte, headerSize+ExchangeIDSize+OfferSize-1)
|
|
short[0] = byte(MsgOffer)
|
|
short[1] = ProtocolVersion
|
|
_, _, err = Decode(short)
|
|
require.Error(t, err, "a truncated offer must be rejected")
|
|
|
|
long := make([]byte, headerSize+AnswerSize+1)
|
|
long[0] = byte(MsgAnswer)
|
|
long[1] = ProtocolVersion
|
|
_, _, err = Decode(long)
|
|
require.Error(t, err, "an oversized answer must be rejected")
|
|
|
|
marker := make([]byte, headerSize+1)
|
|
marker[0] = byte(MsgError)
|
|
marker[1] = ProtocolVersion
|
|
_, _, err = Decode(marker)
|
|
require.Error(t, err, "an error marker with a payload must be rejected")
|
|
}
|