sdk: test and fix encode/decode relay lists.

This commit is contained in:
fiatjaf 2025-01-16 17:53:44 -03:00
parent 956868e956
commit 7be028ff7c
2 changed files with 85 additions and 1 deletions

View File

@ -21,6 +21,9 @@ func makeEventRelayKey(eventID []byte) []byte {
func encodeRelayList(relays []string) []byte {
totalSize := 0
for _, relay := range relays {
if len(relay) > 256 {
continue
}
totalSize += 1 + len(relay) // 1 byte for length prefix
}
@ -41,7 +44,7 @@ func encodeRelayList(relays []string) []byte {
}
func decodeRelayList(data []byte) []string {
relays := make([]string, 0)
relays := make([]string, 0, 6)
offset := 0
for offset < len(data) {

81
sdk/event_relays_test.go Normal file
View File

@ -0,0 +1,81 @@
package sdk
import (
"strings"
"testing"
"github.com/stretchr/testify/require"
)
func TestEncodeDecodeRelayList(t *testing.T) {
tests := []struct {
name string
relays []string
}{
{
name: "empty list",
relays: []string{},
},
{
name: "single relay",
relays: []string{"wss://relay.example.com"},
},
{
name: "multiple relays",
relays: []string{
"wss://relay1.example.com",
"wss://relay23.example.com",
"wss://relay456.example.com",
},
},
{
name: "relays with varying lengths",
relays: []string{
"wss://a.com",
"wss://very-long-relay-url.example.com",
"wss://b.com",
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
// test encoding
encoded := encodeRelayList(tt.relays)
require.NotNil(t, encoded)
// test decoding
decoded := decodeRelayList(encoded)
require.Equal(t, tt.relays, decoded)
})
}
t.Run("malformed data", func(t *testing.T) {
// test with truncated data
decoded := decodeRelayList([]byte{5, 'h', 'e'}) // length prefix of 5 but only 2 bytes of data
require.Nil(t, decoded)
// test with invalid length prefix
decoded = decodeRelayList([]byte{255}) // length prefix but no data
require.Nil(t, decoded)
})
t.Run("skip too long relay URLs", func(t *testing.T) {
// create a long URL by repeating 'a' 257 times
longURL := "wss://" + strings.Repeat("a", 257) + ".com"
longRelays := []string{
"wss://normal.example.com",
longURL,
"wss://also-normal.example.com",
}
encoded := encodeRelayList(longRelays)
decoded := decodeRelayList(encoded)
// should only contain the normal URLs
require.Equal(t, []string{
"wss://normal.example.com",
"wss://also-normal.example.com",
}, decoded)
})
}