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  //}