snowflake/snowflake_test.go

198 lines
3.3 KiB
Go
Raw Normal View History

2016-06-01 16:15:57 -05:00
package snowflake
2016-05-25 14:57:33 -05:00
import (
"bytes"
2017-06-16 09:02:15 -07:00
"reflect"
"testing"
)
2016-05-25 14:57:33 -05:00
2019-04-10 01:02:19 +00:00
// 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) {
2017-06-16 09:02:15 -07:00
tt := []struct {
json string
2019-04-10 01:12:21 +00:00
expectedID ID
2017-06-16 09:02:15 -07:00
expectedErr error
}{
{`"13587"`, 13587, nil},
{`1`, 0, JSONSyntaxError{[]byte(`1`)}},
{`"invalid`, 0, JSONSyntaxError{[]byte(`"invalid`)}},
}
2017-06-16 09:02:15 -07:00
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)
}
2019-04-10 01:12:21 +00:00
if id != tc.expectedID {
t.Errorf("Expected to get ID '%s' decoding JSON, but got '%s'", tc.expectedID, id)
2017-06-16 09:02:15 -07:00
}
}
}
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()
}
}
2017-02-21 09:58:29 -06:00
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.")
}
}
}
2019-04-10 01:02:19 +00:00
2017-02-21 09:58:29 -06:00
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()
}
}
2016-05-25 14:57:33 -05:00
func BenchmarkGenerate(b *testing.B) {
2016-06-01 14:59:26 -05:00
node, _ := NewNode(1)
2016-05-25 14:57:33 -05:00
b.ReportAllocs()
b.ResetTimer()
2016-05-25 14:57:33 -05:00
for n := 0; n < b.N; n++ {
_ = node.Generate()
2016-05-25 14:57:33 -05:00
}
}
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()
2016-05-25 14:57:33 -05:00
b.ReportAllocs()
b.ResetTimer()
for n := 0; n < b.N; n++ {
_, _ = id.MarshalJSON()
}
2016-05-25 14:57:33 -05:00
}