closedenvelope_test.go raw
1 package closedenvelope
2
3 import (
4 "fmt"
5 "math"
6 "testing"
7
8 "next.orly.dev/pkg/nostr/encoders/envelopes"
9 "next.orly.dev/pkg/nostr/utils"
10 "next.orly.dev/pkg/nostr/utils/bufpool"
11 "next.orly.dev/pkg/lol/chk"
12
13 "lukechampine.com/frand"
14 )
15
16 var messages = [][]byte{
17 []byte(""),
18 []byte("pow: difficulty 25>=24"),
19 []byte("duplicate: already have this event"),
20 []byte("blocked: you are banned from posting here"),
21 []byte("blocked: please register your pubkey at https://my-expensive-realy.example.com"),
22 []byte("rate-limited: slow down there chief"),
23 []byte("invalid: event creation date is too far off from the current time"),
24 []byte("pow: difficulty 26 is less than 30"),
25 []byte("error: could not connect to the database"),
26 }
27
28 func RandomMessage() []byte {
29 return messages[frand.Intn(len(messages)-1)]
30 }
31
32 func TestMarshalUnmarshal(t *testing.T) {
33 var err error
34 for _ = range 1000 {
35 rb, rb1, rb2 := bufpool.Get(), bufpool.Get(), bufpool.Get()
36 s := []byte(fmt.Sprintf("sub:%d", frand.Intn(math.MaxInt64)))
37 req := NewFrom(s, RandomMessage())
38 rb = req.Marshal(rb)
39 rb1 = append(rb1, rb...)
40 var rem []byte
41 var l string
42 if l, rb, err = envelopes.Identify(rb); chk.E(err) {
43 t.Fatal(err)
44 }
45 if l != L {
46 t.Fatalf("invalid sentinel %s, expect %s", l, L)
47 }
48 req2 := New()
49 if rem, err = req2.Unmarshal(rb); chk.E(err) {
50 t.Fatal(err)
51 }
52 // log.I.Ln(req2.ID)
53 if len(rem) > 0 {
54 t.Fatalf(
55 "unmarshal failed, remainder\n%d %s",
56 len(rem), rem,
57 )
58 }
59 rb2 = req2.Marshal(rb2)
60 if !utils.FastEqual(rb1, rb2) {
61 if len(rb1) != len(rb2) {
62 t.Fatalf(
63 "unmarshal failed, different lengths\n%d %s\n%d %s\n",
64 len(rb1), rb1, len(rb2), rb2,
65 )
66 }
67 for i := range rb1 {
68 if rb1[i] != rb2[i] {
69 t.Fatalf(
70 "unmarshal failed, difference at position %d\n%d %s\n%s\n%d %s\n%s\n",
71 i, len(rb1), rb1[:i], rb1[i:], len(rb2), rb2[:i],
72 rb2[i:],
73 )
74 }
75 }
76 t.Fatalf(
77 "unmarshal failed\n%d %s\n%d %s\n",
78 len(rb1), rb1, len(rb2), rb2,
79 )
80 }
81 bufpool.Put(rb1)
82 bufpool.Put(rb2)
83 bufpool.Put(rb)
84 }
85 }
86