267d02f8b9
This allows a benchmark showing how fast ids can be generated with 21 bits assigned to the sequence number
212 lines
3.4 KiB
Go
212 lines
3.4 KiB
Go
package snowflake
|
|
|
|
import (
|
|
"bytes"
|
|
"reflect"
|
|
"testing"
|
|
)
|
|
|
|
// I feel like there's probably a better way
|
|
func TestRace(t *testing.T) {
|
|
|
|
node, _ := NewNode(1)
|
|
|
|
go func() {
|
|
for i := 0; i < 1000000000; i++ {
|
|
|
|
NewNode(1)
|
|
}
|
|
}()
|
|
|
|
for i := 0; i < 4000; i++ {
|
|
|
|
node.Generate()
|
|
}
|
|
|
|
}
|
|
|
|
func TestMarshalJSON(t *testing.T) {
|
|
id := ID(13587)
|
|
expected := "\"13587\""
|
|
|
|
bytes, err := id.MarshalJSON()
|
|
if err != nil {
|
|
t.Error("Unexpected error during MarshalJSON")
|
|
}
|
|
|
|
if string(bytes) != expected {
|
|
t.Errorf("Got %s, expected %s", string(bytes), expected)
|
|
}
|
|
}
|
|
|
|
func TestMarshalsIntBytes(t *testing.T) {
|
|
id := ID(13587).IntBytes()
|
|
expected := []byte{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x35, 0x13}
|
|
if !bytes.Equal(id[:], expected) {
|
|
t.Errorf("Expected ID to be encoded as %v, got %v", expected, id)
|
|
}
|
|
}
|
|
|
|
func TestUnmarshalJSON(t *testing.T) {
|
|
tt := []struct {
|
|
json string
|
|
expectedID ID
|
|
expectedErr error
|
|
}{
|
|
{`"13587"`, 13587, nil},
|
|
{`1`, 0, JSONSyntaxError{[]byte(`1`)}},
|
|
{`"invalid`, 0, JSONSyntaxError{[]byte(`"invalid`)}},
|
|
}
|
|
|
|
for _, tc := range tt {
|
|
var id ID
|
|
err := id.UnmarshalJSON([]byte(tc.json))
|
|
if !reflect.DeepEqual(err, tc.expectedErr) {
|
|
t.Errorf("Expected to get error '%s' decoding JSON, but got '%s'", tc.expectedErr, err)
|
|
}
|
|
|
|
if id != tc.expectedID {
|
|
t.Errorf("Expected to get ID '%s' decoding JSON, but got '%s'", tc.expectedID, id)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestBase32(t *testing.T) {
|
|
|
|
node, _ := NewNode(1)
|
|
|
|
for i := 0; i < 100; i++ {
|
|
|
|
sf := node.Generate()
|
|
b32i := sf.Base32()
|
|
psf, err := ParseBase32([]byte(b32i))
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if sf != psf {
|
|
t.Fatal("Parsed does not match String.")
|
|
}
|
|
}
|
|
}
|
|
|
|
func BenchmarkParseBase32(b *testing.B) {
|
|
|
|
node, _ := NewNode(1)
|
|
sf := node.Generate()
|
|
b32i := sf.Base32()
|
|
|
|
b.ReportAllocs()
|
|
|
|
b.ResetTimer()
|
|
for n := 0; n < b.N; n++ {
|
|
ParseBase32([]byte(b32i))
|
|
}
|
|
}
|
|
func BenchmarkBase32(b *testing.B) {
|
|
|
|
node, _ := NewNode(1)
|
|
sf := node.Generate()
|
|
|
|
b.ReportAllocs()
|
|
|
|
b.ResetTimer()
|
|
for n := 0; n < b.N; n++ {
|
|
sf.Base32()
|
|
}
|
|
}
|
|
func TestBase58(t *testing.T) {
|
|
|
|
node, _ := NewNode(1)
|
|
|
|
for i := 0; i < 10; i++ {
|
|
|
|
sf := node.Generate()
|
|
b58 := sf.Base58()
|
|
psf, err := ParseBase58([]byte(b58))
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if sf != psf {
|
|
t.Fatal("Parsed does not match String.")
|
|
}
|
|
}
|
|
}
|
|
|
|
func BenchmarkParseBase58(b *testing.B) {
|
|
|
|
node, _ := NewNode(1)
|
|
sf := node.Generate()
|
|
b58 := sf.Base58()
|
|
|
|
b.ReportAllocs()
|
|
|
|
b.ResetTimer()
|
|
for n := 0; n < b.N; n++ {
|
|
ParseBase58([]byte(b58))
|
|
}
|
|
}
|
|
func BenchmarkBase58(b *testing.B) {
|
|
|
|
node, _ := NewNode(1)
|
|
sf := node.Generate()
|
|
|
|
b.ReportAllocs()
|
|
|
|
b.ResetTimer()
|
|
for n := 0; n < b.N; n++ {
|
|
sf.Base58()
|
|
}
|
|
}
|
|
func BenchmarkGenerate(b *testing.B) {
|
|
|
|
node, _ := NewNode(1)
|
|
|
|
b.ReportAllocs()
|
|
|
|
b.ResetTimer()
|
|
for n := 0; n < b.N; n++ {
|
|
_ = node.Generate()
|
|
}
|
|
}
|
|
|
|
func BenchmarkGenerateMaxSequence(b *testing.B) {
|
|
|
|
NodeBits = 1
|
|
StepBits = 21
|
|
node, _ := NewNode(1)
|
|
|
|
b.ReportAllocs()
|
|
|
|
b.ResetTimer()
|
|
for n := 0; n < b.N; n++ {
|
|
_ = node.Generate()
|
|
}
|
|
}
|
|
|
|
func BenchmarkUnmarshal(b *testing.B) {
|
|
// Generate the ID to unmarshal
|
|
node, _ := NewNode(1)
|
|
id := node.Generate()
|
|
bytes, _ := id.MarshalJSON()
|
|
|
|
var id2 ID
|
|
|
|
b.ReportAllocs()
|
|
b.ResetTimer()
|
|
for n := 0; n < b.N; n++ {
|
|
_ = id2.UnmarshalJSON(bytes)
|
|
}
|
|
}
|
|
|
|
func BenchmarkMarshal(b *testing.B) {
|
|
// Generate the ID to marshal
|
|
node, _ := NewNode(1)
|
|
id := node.Generate()
|
|
|
|
b.ReportAllocs()
|
|
b.ResetTimer()
|
|
for n := 0; n < b.N; n++ {
|
|
_, _ = id.MarshalJSON()
|
|
}
|
|
}
|