package sonyflake import ( "fmt" "runtime" "testing" "time" ) var sf *Sonyflake var startTime int64 var machineID uint64 func init() { var st Settings st.StartTime = time.Now() sf = NewSonyflake(st) if sf == nil { panic("sonyflake not created") } startTime = toSonyflakeTime(st.StartTime) ip, _ := lower16BitPrivateIP() machineID = uint64(ip) } func nextID(t *testing.T) uint64 { id, err := sf.NextID() if err != nil { t.Fatal("id not generated") } return id } func TestSonyflakeOnce(t *testing.T) { sleepTime := time.Duration(50 * sonyflakeTimeUnit) time.Sleep(sleepTime) id := nextID(t) actualTime := ElapsedTime(id) if actualTime < sleepTime || actualTime > sleepTime+sonyflakeTimeUnit { t.Errorf("unexpected time: %d", actualTime) } actualSequence := SequenceNumber(id) if actualSequence != 0 { t.Errorf("unexpected sequence: %d", actualSequence) } actualMachineID := MachineID(id) if actualMachineID != machineID { t.Errorf("unexpected machine id: %d", actualMachineID) } fmt.Println("sonyflake id:", id) fmt.Println("decompose:", Decompose(id)) } func currentTime() int64 { return toSonyflakeTime(time.Now()) } func TestSonyflakeFor10Sec(t *testing.T) { var numID uint32 var lastID uint64 var maxSequence uint64 initial := currentTime() current := initial for current-initial < 1000 { id := nextID(t) parts := Decompose(id) numID++ if id == lastID { t.Fatal("duplicated id") } if id < lastID { t.Fatal("must increase with time") } lastID = id current = currentTime() actualMSB := parts["msb"] if actualMSB != 0 { t.Errorf("unexpected msb: %d", actualMSB) } actualTime := int64(parts["time"]) overtime := startTime + actualTime - current if overtime > 0 { t.Errorf("unexpected overtime: %d", overtime) } actualSequence := parts["sequence"] if maxSequence < actualSequence { maxSequence = actualSequence } actualMachineID := parts["machine-id"] if actualMachineID != machineID { t.Errorf("unexpected machine id: %d", actualMachineID) } } if maxSequence != 1<