OSDN Git Service

add package
[bytom/vapor.git] / vendor / github.com / mr-tron / base58 / base58 / base58_test.go
1 package base58
2
3 import (
4         "crypto/rand"
5         "encoding/hex"
6         "testing"
7 )
8
9 type testValues struct {
10         dec []byte
11         enc string
12 }
13
14 var n = 5000000
15 var testPairs = make([]testValues, 0, n)
16
17 func initTestPairs() {
18         if len(testPairs) > 0 {
19                 return
20         }
21         // pre-make the test pairs, so it doesn't take up benchmark time...
22         for i := 0; i < n; i++ {
23                 data := make([]byte, 32)
24                 rand.Read(data)
25                 testPairs = append(testPairs, testValues{dec: data, enc: FastBase58Encoding(data)})
26         }
27 }
28
29 func randAlphabet() *Alphabet {
30         // Permutes [0, 127] and returns the first 58 elements.
31         // Like (math/rand).Perm but using crypto/rand.
32         var randomness [128]byte
33         rand.Read(randomness[:])
34
35         var bts [128]byte
36         for i, r := range randomness {
37                 j := int(r) % (i + 1)
38                 bts[i] = bts[j]
39                 bts[j] = byte(i)
40         }
41         return NewAlphabet(string(bts[:58]))
42 }
43
44 func TestFastEqTrivialEncodingAndDecoding(t *testing.T) {
45         for k := 0; k < 10; k++ {
46                 testEncDecLoop(t, randAlphabet())
47         }
48         testEncDecLoop(t, BTCAlphabet)
49         testEncDecLoop(t, FlickrAlphabet)
50 }
51
52 func testEncDecLoop(t *testing.T, alph *Alphabet) {
53         for j := 1; j < 256; j++ {
54                 var b = make([]byte, j)
55                 for i := 0; i < 100; i++ {
56                         rand.Read(b)
57                         fe := FastBase58EncodingAlphabet(b, alph)
58                         te := TrivialBase58EncodingAlphabet(b, alph)
59
60                         if fe != te {
61                                 t.Errorf("encoding err: %#v", hex.EncodeToString(b))
62                         }
63
64                         fd, ferr := FastBase58DecodingAlphabet(fe, alph)
65                         if ferr != nil {
66                                 t.Errorf("fast error: %v", ferr)
67                         }
68                         td, terr := TrivialBase58DecodingAlphabet(te, alph)
69                         if terr != nil {
70                                 t.Errorf("trivial error: %v", terr)
71                         }
72
73                         if hex.EncodeToString(b) != hex.EncodeToString(td) {
74                                 t.Errorf("decoding err: %s != %s", hex.EncodeToString(b), hex.EncodeToString(td))
75                         }
76                         if hex.EncodeToString(b) != hex.EncodeToString(fd) {
77                                 t.Errorf("decoding err: %s != %s", hex.EncodeToString(b), hex.EncodeToString(fd))
78                         }
79                 }
80         }
81 }
82
83 func BenchmarkTrivialBase58Encoding(b *testing.B) {
84         initTestPairs()
85         b.ResetTimer()
86
87         for i := 0; i < b.N; i++ {
88                 TrivialBase58Encoding([]byte(testPairs[i].dec))
89         }
90 }
91
92 func BenchmarkFastBase58Encoding(b *testing.B) {
93         initTestPairs()
94         b.ResetTimer()
95
96         for i := 0; i < b.N; i++ {
97                 FastBase58Encoding(testPairs[i].dec)
98         }
99 }
100
101 func BenchmarkTrivialBase58Decoding(b *testing.B) {
102         initTestPairs()
103         b.ResetTimer()
104
105         for i := 0; i < b.N; i++ {
106                 TrivialBase58Decoding(testPairs[i].enc)
107         }
108 }
109
110 func BenchmarkFastBase58Decoding(b *testing.B) {
111         initTestPairs()
112         b.ResetTimer()
113
114         for i := 0; i < b.N; i++ {
115                 FastBase58Decoding(testPairs[i].enc)
116         }
117 }