87 lines
2.5 KiB
Go
87 lines
2.5 KiB
Go
package queue
|
|
|
|
import (
|
|
"io"
|
|
"math/rand/v2"
|
|
"testing"
|
|
|
|
"github.com/go-json-experiment/json"
|
|
"github.com/go-json-experiment/json/jsontext"
|
|
)
|
|
|
|
func TestSenderUnique(t *testing.T) {
|
|
// Salt, channel, and user should all produce differences in the sender ID.
|
|
base := Sender([]byte("nijika"), "kessoku", "bocchi")
|
|
salt := Sender([]byte("kita"), "kessoku", "bocchi")
|
|
channel := Sender([]byte("nijika"), "sickhack", "bocchi")
|
|
user := Sender([]byte("nijika"), "kessoku", "ryō")
|
|
m := map[sender]struct{}{
|
|
base: {},
|
|
salt: {},
|
|
channel: {},
|
|
user: {},
|
|
}
|
|
if len(m) != 4 {
|
|
t.Errorf("collision:\nbase: %v\nsalt: %v\nchan: %v\nuser: %v", base, salt, channel, user)
|
|
}
|
|
}
|
|
|
|
func TestSenderRoundTrip(t *testing.T) {
|
|
want := Sender([]byte("nijika"), "kessoku", "bocchi")
|
|
b, err := json.Marshal(want)
|
|
if err != nil {
|
|
t.Errorf("encode failed: %v", err)
|
|
}
|
|
var got sender
|
|
if err := json.Unmarshal(b, &got); err != nil {
|
|
t.Errorf("decode failed: %v", err)
|
|
}
|
|
if want != got {
|
|
t.Errorf("round-trip failed:\nwant %v\ngot %v", want, got)
|
|
}
|
|
}
|
|
|
|
func BenchmarkSenderEncode(b *testing.B) {
|
|
enc := jsontext.NewEncoder(io.Discard)
|
|
opts := []*sender{ // pointers to avoid allocations
|
|
ref(Sender([]byte("nijika"), "kessoku", "bocchi")),
|
|
ref(Sender([]byte("kita"), "kessoku", "bocchi")),
|
|
ref(Sender([]byte("nijika"), "sickhack", "bocchi")),
|
|
ref(Sender([]byte("nijika"), "kessoku", "ryō")),
|
|
ref(Sender([]byte("nijika"), "kessoku", "bocchi2")),
|
|
ref(Sender([]byte("kita"), "kessoku", "bocchi2")),
|
|
ref(Sender([]byte("nijika"), "sickhack", "bocchi2")),
|
|
ref(Sender([]byte("nijika"), "kessoku", "ryō2")),
|
|
}
|
|
b.ReportAllocs()
|
|
for b.Loop() {
|
|
json.MarshalEncode(enc, opts[rand.IntN(len(opts))])
|
|
}
|
|
}
|
|
|
|
func BenchmarkSenderDecode(b *testing.B) {
|
|
opts := [][]byte{
|
|
must(json.Marshal(Sender([]byte("nijika"), "kessoku", "bocchi"))),
|
|
must(json.Marshal(Sender([]byte("kita"), "kessoku", "bocchi"))),
|
|
must(json.Marshal(Sender([]byte("nijika"), "sickhack", "bocchi"))),
|
|
must(json.Marshal(Sender([]byte("nijika"), "kessoku", "ryō"))),
|
|
must(json.Marshal(Sender([]byte("nijika"), "kessoku", "bocchi2"))),
|
|
must(json.Marshal(Sender([]byte("kita"), "kessoku", "bocchi2"))),
|
|
must(json.Marshal(Sender([]byte("nijika"), "sickhack", "bocchi2"))),
|
|
must(json.Marshal(Sender([]byte("nijika"), "kessoku", "ryō2"))),
|
|
}
|
|
b.ReportAllocs()
|
|
var v sender
|
|
for b.Loop() {
|
|
json.Unmarshal(opts[rand.IntN(len(opts))], &v)
|
|
}
|
|
}
|
|
|
|
func ref[T any](x T) *T { return &x }
|
|
func must[T any](x T, err error) T {
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
return x
|
|
}
|