github.com/fabletang/idgen@v1.5.1/idgen_test.go (about) 1 package idgen 2 3 import ( 4 "errors" 5 "math/rand" 6 "testing" 7 ) 8 9 var idWorker *IDWorker 10 11 func init() { 12 idWorker, _ = NewNodeIDByIP() 13 } 14 15 func TestDecode62Str(t *testing.T) { 16 str62 := "7m85Y0n8LzA" 17 rs, err := Decode62Str(str62) 18 if err != nil { 19 t.Errorf("解码失败") 20 } 21 if rs != int64(^uint(0)>>1) { 22 t.Errorf("解码失败") 23 } 24 t.Logf("62进制字符串 %s 10进制解码为 %v\n", str62, rs) 25 26 rsStr, err := Encode62Str(rs) 27 if err != nil { 28 t.Errorf("编码失败") 29 } 30 31 if rsStr != str62 { 32 t.Errorf("编码失败") 33 } 34 t.Logf("10进制数字 %v 编码为62进制字符串 %s\n", rs, rsStr) 35 36 } 37 func TestEncode82Str(t *testing.T) { 38 rs, _ := idWorker.NextID() 39 rsStr, err := Encode82Str(rs) 40 if err != nil { 41 t.Errorf("编码失败") 42 } 43 t.Logf("10进制数字 %v 编码为82进制字符串 %s\n", rs, rsStr) 44 45 } 46 47 func TestEncodeAndDecode(t *testing.T) { 48 length := 10000 49 var err error 50 for i := 0; i < length; i++ { 51 err = encodeAndDecode(rand.Int63()) 52 } 53 if err != nil { 54 t.Errorf("%s", err) 55 } else { 56 t.Logf("随机编码解码%v个数字成功", length) 57 } 58 } 59 60 func encodeAndDecode(longNum int64) (err error) { 61 rsStr, err := Encode62Str(longNum) 62 if err != nil { 63 err = errors.New("编码失败") 64 return 65 } 66 rsNum, err := Decode62Str(rsStr) 67 if err != nil { 68 err = errors.New("解码失败") 69 return 70 } 71 if rsNum != longNum { 72 err = errors.New("编码解码不匹配") 73 return 74 } 75 return 76 } 77 func encodeAndDecode82(longNum int64) (err error) { 78 rsStr, err := Encode82Str(longNum) 79 if err != nil { 80 err = errors.New("编码失败") 81 return 82 } 83 rsNum, err := Decode82Str(rsStr) 84 if err != nil { 85 err = errors.New("解码失败") 86 return 87 } 88 if rsNum != longNum { 89 err = errors.New("编码解码不匹配") 90 return 91 } 92 return 93 } 94 func TestIDWorker_FromIp(t *testing.T) { 95 iw, err := NewNodeIDByIP() 96 if err != nil { 97 t.Errorf("%s\n", err) 98 } 99 myWorkID := iw.nodeID 100 if err != nil { 101 t.Errorf("%s\n", err) 102 } 103 id, err := iw.NextID() 104 if err != nil { 105 t.Errorf("%s\n", err) 106 } 107 108 iDDetail, _ := ParseID(id) 109 seq1 := iDDetail.sequence 110 111 if myWorkID != iDDetail.nodeID { 112 t.Errorf("id产生和解释不一致") 113 } 114 t.Logf("iDDetail 1:%v", iDDetail) 115 id2, _ := iw.NextID() 116 iDDetail, _ = ParseID(id2) 117 t.Logf("iDDetail 2:%v", iDDetail) 118 if myWorkID != iDDetail.nodeID { 119 t.Errorf("id产生和解释不一致") 120 } 121 if iDDetail.sequence != seq1+1 { 122 t.Errorf("id产生和解释不一致") 123 } 124 const shortForm = "2006-01-02 15:04:03 +0800 CST" 125 for i := 0; i < 0xFF-1; i++ { 126 id2, _ = iw.NextID() 127 } 128 if id2 != id+0xFF { 129 t.Errorf("id产生错误,id:%v,id2:%v\n", id, id2) 130 } 131 } 132 func TestIDWorker_NextID(t *testing.T) { 133 var myWorkID int64 = 5 134 iw, err := NewCustomNodeID(myWorkID) 135 if err != nil { 136 t.Errorf("%s\n", err) 137 } 138 139 id, err := iw.NextID() 140 if err != nil { 141 t.Errorf("%s\n", err) 142 } 143 144 iDDetail, _ := ParseID(id) 145 seq1 := iDDetail.sequence 146 147 if myWorkID != iDDetail.nodeID { 148 t.Errorf("id产生和解释不一致") 149 } 150 t.Logf("iDDetail 1:%v", iDDetail) 151 id2, _ := iw.NextID() 152 iDDetail, _ = ParseID(id2) 153 t.Logf("iDDetail 2:%v", iDDetail) 154 if myWorkID != iDDetail.nodeID { 155 t.Errorf("id产生和解释不一致") 156 } 157 if iDDetail.sequence != seq1+1 { 158 t.Errorf("id产生和解释不一致") 159 } 160 //const shortForm = "2006-01-02 15:04:03 +0800 CST" 161 162 for i := 0; i < 0xFF-1; i++ { 163 id2, _ = iw.NextID() 164 } 165 if id2 != id+0xFF { 166 t.Errorf("id产生错误,id:%v,id2:%v\n", id, id2) 167 } 168 169 } 170 171 func BenchmarkIDWorker_NextID(b *testing.B) { 172 var myWorkID int64 = 7 173 //var id int64 = 0 174 var id int64 175 iw, _ := NewCustomNodeID(int64(myWorkID)) 176 b.StopTimer() 177 b.StartTimer() 178 id, _ = iw.NextID() 179 if id < 1 { 180 b.Errorf("id产生错误:%v", id) 181 } 182 } 183 184 //func TestTimeBack (t *testing.T){ 185 // iw, _:= NewNodeIDByIpAndTimeBackInterval(int64(6000))// 60 secondes 186 // for i:=0;i<1e7;i++{ 187 // _,err:=iw.NextID() 188 // if err!=nil{ 189 // t.Error(err) 190 // return 191 // } 192 // } 193 //}