package protocol import ( "testing" "time" "github.com/stretchr/testify/require" ) func TestNewIDPreservesTimestampAndAddsRandomness(t *testing.T) { now := time.UnixMilli(1234567890123) first, err := NewID(now) require.NoError(t, err) second, err := NewID(now) require.NoError(t, err) require.True(t, ValidID(first)) require.NotEqual(t, first, second) require.Equal(t, first[:10], second[:10]) var milliseconds int64 for _, character := range first[:10] { for index, candidate := range idAlphabet { if candidate == character { milliseconds = milliseconds*32 + int64(index) } } } require.Equal(t, now.UnixMilli(), milliseconds) _, err = NewID(time.UnixMilli(-1)) require.Error(t, err) _, err = NewID(time.UnixMilli(1 << 48)) require.Error(t, err) } func TestIdentifiersRejectNoncanonicalText(t *testing.T) { require.True(t, ValidID(deviceID)) for _, value := range []string{"", "8123456789ABCDEFGHJKMNPQRST", "0123456789abcdefghjkmnpqrst", "0123456789ABCDEFGHIKMNPQRST"} { require.False(t, ValidID(value), value) } for _, value := range []string{"relay", "a0.b1-c2"} { require.True(t, ValidIdentifier(value), value) } for _, value := range []string{"", "-relay", "relay.", "a..b", "a.-b", "a_b", "A", "+", "#"} { require.False(t, ValidIdentifier(value), value) } }