You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
naza/pkg/snowflake/snowflake_test.go

165 lines
3.3 KiB
Go

// Copyright 2019, Chef. All rights reserved.
// https://github.com/q191201771/naza
//
// Use of this source code is governed by a MIT-style license
// that can be found in the License file.
//
// Author: Chef (191201771@qq.com)
package snowflake_test
import (
"sync"
"testing"
"github.com/q191201771/naza/pkg/assert"
"github.com/q191201771/naza/pkg/nazalog"
"github.com/q191201771/naza/pkg/snowflake"
)
func TestNew(t *testing.T) {
n, err := snowflake.New(0, 0)
assert.Equal(t, nil, err)
id, err := n.Gen()
assert.Equal(t, nil, err)
nazalog.Debug(id)
id, err = n.Gen()
assert.Equal(t, nil, err)
nazalog.Debug(id)
}
func TestNegative(t *testing.T) {
n, err := snowflake.New(0, 0)
assert.Equal(t, nil, err)
id, err := n.Gen(1288834974657 + (1 << 41))
assert.Equal(t, true, id < 0)
}
func TestAlwaysPositive(t *testing.T) {
n, err := snowflake.New(0, 0, func(option *snowflake.Option) {
option.AlwaysPositive = true
})
assert.Equal(t, nil, err)
id, err := n.Gen(1288834974657 + (1 << 41))
assert.Equal(t, true, id == 0)
id, err = n.Gen(1288834974657 + (1 << 41) + 0x1234)
assert.Equal(t, true, id >= 0)
}
func TestErrInitial(t *testing.T) {
var (
n *snowflake.Node
err error
id int64
)
n, err = snowflake.New(0, 0, func(option *snowflake.Option) {
option.SequenceBits = 64
})
assert.Equal(t, snowflake.ErrInitial, err)
n, err = snowflake.New(0, 0, func(option *snowflake.Option) {
option.WorkerIdBits = 64
})
assert.Equal(t, snowflake.ErrInitial, err)
n, err = snowflake.New(0, 0, func(option *snowflake.Option) {
option.DataCenterIdBits = 64
})
assert.Equal(t, snowflake.ErrInitial, err)
n, err = snowflake.New(0, 0, func(option *snowflake.Option) {
option.DataCenterIdBits = 31
option.WorkerIdBits = 31
option.SequenceBits = 31
})
assert.Equal(t, snowflake.ErrInitial, err)
n, err = snowflake.New(100, 0, func(option *snowflake.Option) {
option.DataCenterIdBits = 1
})
assert.Equal(t, snowflake.ErrInitial, err)
n, err = snowflake.New(0, 100, func(option *snowflake.Option) {
option.WorkerIdBits = 1
})
assert.Equal(t, snowflake.ErrInitial, err)
if n != nil {
id, err = n.Gen()
assert.Equal(t, nil, err)
nazalog.Debug(id)
}
}
func TestErrGen(t *testing.T) {
var (
n *snowflake.Node
err error
id int64
)
n, err = snowflake.New(0, 0)
assert.Equal(t, nil, err)
assert.IsNotNil(t, n)
id, err = n.Gen(2)
assert.Equal(t, nil, err)
id, err = n.Gen(1)
assert.Equal(t, snowflake.ErrGen, err)
nazalog.Debug(id)
}
func TestMt(t *testing.T) {
var (
n *snowflake.Node
err error
)
n, err = snowflake.New(0, 0, func(option *snowflake.Option) {
option.SequenceBits = 1
})
assert.Equal(t, nil, err)
assert.IsNotNil(t, n)
ii := 16
jj := 16
var mu sync.Mutex
m := make(map[int64]struct{})
var wg sync.WaitGroup
wg.Add(ii * jj)
for i := 0; i < ii; i++ {
go func() {
for j := 0; j < jj; j++ {
id, err := n.Gen()
assert.Equal(t, nil, err)
mu.Lock()
m[id] = struct{}{}
mu.Unlock()
wg.Done()
}
}()
}
wg.Wait()
assert.Equal(t, ii*jj, len(m))
}
func BenchmarkNode_Gen(b *testing.B) {
var (
n *snowflake.Node
err error
)
n, err = snowflake.New(0, 0)
assert.Equal(b, nil, err)
assert.IsNotNil(b, n)
var dummy int64
for i := 0; i < b.N; i++ {
id, _ := n.Gen()
dummy += id
}
nazalog.Debug(dummy)
}