2020-02-11 16:59:21 +00:00
|
|
|
package waku
|
|
|
|
|
|
|
|
import (
|
|
|
|
"math"
|
|
|
|
"testing"
|
2020-04-07 17:24:34 +00:00
|
|
|
"reflect"
|
|
|
|
"strconv"
|
|
|
|
"strings"
|
2020-02-11 16:59:21 +00:00
|
|
|
|
|
|
|
"github.com/stretchr/testify/require"
|
|
|
|
|
|
|
|
"github.com/ethereum/go-ethereum/rlp"
|
|
|
|
)
|
|
|
|
|
|
|
|
func TestEncodeDecodeRLP(t *testing.T) {
|
2020-02-21 14:48:53 +00:00
|
|
|
pow := math.Float64bits(6.02)
|
|
|
|
lightNodeEnabled := true
|
|
|
|
confirmationsEnabled := true
|
|
|
|
|
2020-02-11 16:59:21 +00:00
|
|
|
opts := statusOptions{
|
2020-02-21 14:48:53 +00:00
|
|
|
PoWRequirement: &pow,
|
2020-02-11 16:59:21 +00:00
|
|
|
BloomFilter: TopicToBloom(TopicType{0xaa, 0xbb, 0xcc, 0xdd}),
|
2020-02-21 14:48:53 +00:00
|
|
|
LightNodeEnabled: &lightNodeEnabled,
|
|
|
|
ConfirmationsEnabled: &confirmationsEnabled,
|
|
|
|
RateLimits: &RateLimits{
|
2020-02-11 16:59:21 +00:00
|
|
|
IPLimits: 10,
|
|
|
|
PeerIDLimits: 5,
|
|
|
|
TopicLimits: 1,
|
|
|
|
},
|
|
|
|
TopicInterest: []TopicType{{0x01}, {0x02}, {0x03}, {0x04}},
|
|
|
|
}
|
|
|
|
data, err := rlp.EncodeToBytes(opts)
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
var optsDecoded statusOptions
|
|
|
|
err = rlp.DecodeBytes(data, &optsDecoded)
|
|
|
|
require.NoError(t, err)
|
|
|
|
require.EqualValues(t, opts, optsDecoded)
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestBackwardCompatibility(t *testing.T) {
|
|
|
|
alist := []interface{}{
|
|
|
|
[]interface{}{"0", math.Float64bits(2.05)},
|
|
|
|
}
|
|
|
|
data, err := rlp.EncodeToBytes(alist)
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
var optsDecoded statusOptions
|
|
|
|
err = rlp.DecodeBytes(data, &optsDecoded)
|
|
|
|
require.NoError(t, err)
|
2020-02-21 14:48:53 +00:00
|
|
|
pow := math.Float64bits(2.05)
|
|
|
|
require.EqualValues(t, statusOptions{PoWRequirement: &pow}, optsDecoded)
|
2020-02-11 16:59:21 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func TestForwardCompatibility(t *testing.T) {
|
2020-02-21 14:48:53 +00:00
|
|
|
pow := math.Float64bits(2.05)
|
2020-02-11 16:59:21 +00:00
|
|
|
alist := []interface{}{
|
2020-02-21 14:48:53 +00:00
|
|
|
[]interface{}{"0", pow},
|
2020-02-11 16:59:21 +00:00
|
|
|
[]interface{}{"99", uint(10)}, // some future option
|
|
|
|
}
|
|
|
|
data, err := rlp.EncodeToBytes(alist)
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
var optsDecoded statusOptions
|
|
|
|
err = rlp.DecodeBytes(data, &optsDecoded)
|
|
|
|
require.NoError(t, err)
|
2020-02-21 14:48:53 +00:00
|
|
|
require.EqualValues(t, statusOptions{PoWRequirement: &pow}, optsDecoded)
|
2020-02-11 16:59:21 +00:00
|
|
|
}
|
2020-04-07 17:24:34 +00:00
|
|
|
|
|
|
|
func TestStatusOptionKeys(t *testing.T) {
|
|
|
|
o := statusOptions{}
|
|
|
|
|
|
|
|
kfi := make(map[statusOptionKey]int)
|
|
|
|
ifk := make(map[int]statusOptionKey)
|
|
|
|
|
|
|
|
v := reflect.ValueOf(o)
|
|
|
|
|
|
|
|
for i := 0; i < v.NumField(); i++ {
|
|
|
|
// skip unexported fields
|
|
|
|
if !v.Field(i).CanInterface() {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
rlpTag := v.Type().Field(i).Tag.Get("rlp")
|
|
|
|
// skip fields without rlp field tag
|
|
|
|
if rlpTag == "" {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
|
|
|
|
keys := strings.Split(rlpTag, "=")
|
|
|
|
require.Equal(t, 2, len(keys))
|
|
|
|
|
|
|
|
// parse keys[1] as an int
|
|
|
|
key, err := strconv.ParseUint(keys[1], 10, 64)
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
// typecast key to be of statusOptionKey type
|
|
|
|
kfi[statusOptionKey(key)] = i
|
|
|
|
ifk[i] = statusOptionKey(key)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Test that the statusOptions' derived kfi length matches the global keyFieldIdx length
|
|
|
|
require.Equal(t, len(keyFieldIdx), len(kfi))
|
|
|
|
|
|
|
|
// Test that each index of the statusOptions' derived kfi values matches the global keyFieldIdx of the same index
|
|
|
|
for k, v := range kfi {
|
|
|
|
require.Equal(t, keyFieldIdx[k], v)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Test that each index of the global keyFieldIdx values matches statusOptions' derived kfi values of the same index
|
|
|
|
for k, v := range keyFieldIdx {
|
|
|
|
require.Equal(t, kfi[k], v)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Test that the statusOptions' derived ifk length matches the global idxFieldKey length
|
|
|
|
require.Equal(t, len(idxFieldKey), len(ifk))
|
|
|
|
|
|
|
|
// Test that each index of the statusOptions' derived ifk values matches the global idxFieldKey of the same index
|
|
|
|
for k, v := range ifk {
|
|
|
|
require.Equal(t, idxFieldKey[k], v)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Test that each index of the global idxFieldKey values matches statusOptions' derived ifk values of the same index
|
|
|
|
for k, v := range idxFieldKey {
|
|
|
|
require.Equal(t, ifk[k], v)
|
|
|
|
}
|
|
|
|
}
|