]> git.giacomolli.uk - onehouse/blob - protocol/identifier_test.go
Apply M31 commands through the shared ledger
[onehouse] / protocol / identifier_test.go
1 package protocol
2
3 import (
4 "testing"
5 "time"
6
7 "github.com/stretchr/testify/require"
8 )
9
10 func TestNewIDPreservesTimestampAndAddsRandomness(t *testing.T) {
11 now := time.UnixMilli(1234567890123)
12 first, err := NewID(now)
13 require.NoError(t, err)
14
15 second, err := NewID(now)
16 require.NoError(t, err)
17 require.True(t, ValidID(first))
18 require.NotEqual(t, first, second)
19 require.Equal(t, first[:10], second[:10])
20
21 var milliseconds int64
22
23 for _, character := range first[:10] {
24 for index, candidate := range idAlphabet {
25 if candidate == character {
26 milliseconds = milliseconds*32 + int64(index)
27 }
28 }
29 }
30
31 require.Equal(t, now.UnixMilli(), milliseconds)
32
33 _, err = NewID(time.UnixMilli(-1))
34 require.Error(t, err)
35
36 _, err = NewID(time.UnixMilli(1 << 48))
37 require.Error(t, err)
38 }
39
40 func TestIdentifiersRejectNoncanonicalText(t *testing.T) {
41 require.True(t, ValidID(deviceID))
42
43 for _, value := range []string{"", "8123456789ABCDEFGHJKMNPQRST", "0123456789abcdefghjkmnpqrst", "0123456789ABCDEFGHIKMNPQRST"} {
44 require.False(t, ValidID(value), value)
45 }
46
47 for _, value := range []string{"relay", "a0.b1-c2"} {
48 require.True(t, ValidIdentifier(value), value)
49 }
50
51 for _, value := range []string{"", "-relay", "relay.", "a..b", "a.-b", "a_b", "A", "+", "#"} {
52 require.False(t, ValidIdentifier(value), value)
53 }
54 }