event_test.go raw

   1  package event
   2  
   3  import (
   4  	"bufio"
   5  	"bytes"
   6  	"testing"
   7  	"time"
   8  
   9  	"encoding/json"
  10  
  11  	"next.orly.dev/pkg/nostr/encoders/event/examples"
  12  	"next.orly.dev/pkg/nostr/encoders/hex"
  13  	"next.orly.dev/pkg/nostr/encoders/tag"
  14  	"next.orly.dev/pkg/nostr/utils"
  15  	"next.orly.dev/pkg/nostr/utils/bufpool"
  16  	"next.orly.dev/pkg/nostr/utils/units"
  17  	"next.orly.dev/pkg/lol/chk"
  18  	"next.orly.dev/pkg/lol/log"
  19  	"lukechampine.com/frand"
  20  )
  21  
  22  func TestMarshalJSONUnmarshalJSON(t *testing.T) {
  23  	for range 10000 {
  24  		ev := New()
  25  		ev.ID = frand.Bytes(32)
  26  		ev.Pubkey = frand.Bytes(32)
  27  		ev.CreatedAt = time.Now().Unix()
  28  		ev.Kind = 1
  29  		ev.Tags = &tag.S{
  30  			{T: [][]byte{[]byte("t"), []byte("hashtag")}},
  31  			{
  32  				T: [][]byte{
  33  					[]byte("e"),
  34  					hex.EncAppend(nil, frand.Bytes(32)),
  35  				},
  36  			},
  37  		}
  38  		ev.Content = []byte(`some text content
  39  
  40  	with line breaks and tabs and other stuff
  41  `)
  42  		ev.Sig = frand.Bytes(64)
  43  		var err error
  44  		var b []byte
  45  		if b, err = json.Marshal(ev); chk.E(err) {
  46  			t.Fatal(err)
  47  		}
  48  		var bc []byte
  49  		bc = append(bc, b...)
  50  		ev2 := New()
  51  		if err = json.Unmarshal(b, ev2); chk.E(err) {
  52  			t.Fatal(err)
  53  		}
  54  		var b2 []byte
  55  		if b2, err = json.Marshal(ev2); err != nil {
  56  			t.Fatal(err)
  57  		}
  58  		if !utils.FastEqual(bc, b2) {
  59  			t.Errorf("failed to re-marshal back original")
  60  		}
  61  		// free up the resources for the next iteration
  62  		ev.Free()
  63  		ev2.Free()
  64  		bufpool.PutBytes(b)
  65  		bufpool.PutBytes(b2)
  66  		bufpool.PutBytes(bc)
  67  	}
  68  }
  69  
  70  func TestExamplesCache(t *testing.T) {
  71  	scanner := bufio.NewScanner(bytes.NewBuffer(examples.Cache))
  72  	scanner.Buffer(make([]byte, 0, 4*units.Mb), 4*units.Mb)
  73  	var err error
  74  	for scanner.Scan() {
  75  		b := scanner.Bytes()
  76  		c := bufpool.Get()
  77  		c = c[:0]
  78  		c = append(c, b...)
  79  		// log.I.F("c: %s", c)
  80  		// log.I.F("b: %s", b)
  81  		ev := New()
  82  		if _, err = ev.Unmarshal(c); chk.E(err) {
  83  			t.Fatal(err)
  84  		}
  85  		var b2 []byte
  86  		// can't use encoding/json.Marshal as it improperly escapes <, > and &.
  87  		if b2, err = ev.MarshalJSON(); err != nil {
  88  			t.Fatal(err)
  89  		}
  90  		if !utils.FastEqual(c, b2) {
  91  			log.I.F("\n%s\n%s", c, b2)
  92  			t.Fatalf("failed to re-marshal back original")
  93  		}
  94  		ev.Free()
  95  		// Don't return scanner.Bytes() to the pool as it's a buffer from embed.
  96  		// bufpool.PutBytes(b)
  97  		bufpool.PutBytes(b2)
  98  		bufpool.PutBytes(c)
  99  	}
 100  }
 101