github.com/influx6/npkg@v0.8.8/nstorage/nmap/nmap_test.go (about) 1 package nmap 2 3 import ( 4 "math/rand" 5 "testing" 6 "time" 7 "unsafe" 8 9 "github.com/stretchr/testify/require" 10 ) 11 12 func TestAnyMap(t *testing.T) { 13 var any = NewAnyMap(10) 14 require.Equal(t, uint(10), any.Capacity) 15 require.NotNil(t, any) 16 17 any.Set("amount", "20") 18 require.True(t, any.Has("amount")) 19 require.Equal(t, "20", any.Get("amount")) 20 21 any.Set("amount", "40") 22 require.True(t, any.Has("amount")) 23 require.Equal(t, "40", any.Get("amount")) 24 } 25 26 func TestStringAnyMap(t *testing.T) { 27 var any = NewStringAnyMap(10) 28 require.Equal(t, uint(10), any.Capacity) 29 require.NotNil(t, any) 30 31 any.Set("amount", "20") 32 require.True(t, any.Has("amount")) 33 require.Equal(t, "20", any.Get("amount")) 34 35 any.Set("amount", "40") 36 require.True(t, any.Has("amount")) 37 require.Equal(t, "40", any.Get("amount")) 38 } 39 40 func TestByteMap(t *testing.T) { 41 var any = NewByteMap(10) 42 require.Equal(t, uint(10), any.Capacity) 43 require.NotNil(t, any) 44 45 any.Set("amount", string2Bytes("20")) 46 require.True(t, any.Has("amount")) 47 require.Equal(t, "20", bytes2String(any.Get("amount"))) 48 49 any.Set("amount", string2Bytes("40")) 50 require.True(t, any.Has("amount")) 51 require.Equal(t, "40", bytes2String(any.Get("amount"))) 52 } 53 54 func TestExpiringByteMap(t *testing.T) { 55 var any = NewExpiringByteMap() 56 require.NotNil(t, any) 57 58 any.Set("amount", string2Bytes("20"), 0) 59 any.Set("rewards", string2Bytes("20"), time.Second) 60 any.Set("rewards", string2Bytes("200"), time.Second) 61 62 require.True(t, any.Has("amount")) 63 require.Equal(t, time.Duration(0), any.TTL("amount")) 64 require.Equal(t, "20", bytes2String(any.Get("amount"))) 65 66 any.Set("amount", string2Bytes("40"), time.Second) 67 require.True(t, any.Has("amount")) 68 require.Equal(t, "40", bytes2String(any.Get("amount"))) 69 70 var before = any.TTL("amount") 71 <-time.After(time.Second) 72 require.Empty(t, any.Get("amount")) 73 require.NotEqual(t, before, any.TTL("amount")) 74 } 75 76 func TestStringMap(t *testing.T) { 77 var any = NewStringMap(10) 78 require.Equal(t, uint(10), any.Capacity) 79 require.NotNil(t, any) 80 81 any.Set("amount", "20") 82 require.True(t, any.Has("amount")) 83 require.Equal(t, "20", any.Get("amount")) 84 85 any.Set("amount", "40") 86 require.True(t, any.Has("amount")) 87 require.Equal(t, "40", any.Get("amount")) 88 } 89 90 func BenchmarkAnyMap(b *testing.B) { 91 b.ReportAllocs() 92 93 b.Run("set", func(b *testing.B) { 94 b.ResetTimer() 95 b.ReportAllocs() 96 var any = NewAnyMap() 97 any.SetMany(func(cache map[interface{}]interface{}) { 98 for i := 0; i < b.N; i++ { 99 cache[randomString()] = randomString() 100 } 101 }) 102 }) 103 104 b.Run("set_get", func(b *testing.B) { 105 b.ResetTimer() 106 b.ReportAllocs() 107 var any = NewAnyMap() 108 any.Set("i", 1) 109 110 for i := 0; i < b.N; i++ { 111 any.Get("i") 112 } 113 }) 114 } 115 116 func BenchmarkStringAnyMap(b *testing.B) { 117 b.Run("set", func(b *testing.B) { 118 b.ResetTimer() 119 b.ReportAllocs() 120 var any = NewStringAnyMap() 121 any.SetMany(func(cache map[string]interface{}) { 122 for i := 0; i < b.N; i++ { 123 cache["a"] = i 124 } 125 }) 126 }) 127 128 b.Run("set_get", func(b *testing.B) { 129 b.ResetTimer() 130 b.ReportAllocs() 131 var any = NewStringAnyMap() 132 any.Set("i", 1) 133 134 for i := 0; i < b.N; i++ { 135 any.Get("i") 136 } 137 }) 138 } 139 140 func BenchmarkExpiringByteMap(b *testing.B) { 141 b.ReportAllocs() 142 143 b.Run("set", func(b *testing.B) { 144 b.ResetTimer() 145 b.ReportAllocs() 146 var any = NewExpiringByteMap(100) 147 any.SetMany(func(cache map[string]ExpiringValue) { 148 for i := 0; i < b.N; i++ { 149 cache[randomString()] = NewExpiringValue(string2Bytes(randomString()), 0) 150 } 151 }) 152 }) 153 154 b.Run("set_get", func(b *testing.B) { 155 b.ResetTimer() 156 b.ReportAllocs() 157 var any = NewExpiringByteMap(100) 158 any.Set("i", string2Bytes("1"), 0) 159 160 for i := 0; i < b.N; i++ { 161 any.Get("i") 162 } 163 }) 164 } 165 166 func BenchmarkByteMap(b *testing.B) { 167 b.ReportAllocs() 168 169 b.Run("set", func(b *testing.B) { 170 b.ResetTimer() 171 b.ReportAllocs() 172 var any = NewByteMap(100) 173 any.SetMany(func(cache map[string][]byte) { 174 for i := 0; i < b.N; i++ { 175 cache[randomString()] = string2Bytes(randomString()) 176 } 177 }) 178 }) 179 180 b.Run("set_get", func(b *testing.B) { 181 b.ResetTimer() 182 b.ReportAllocs() 183 var any = NewByteMap(100) 184 any.Set("i", string2Bytes("1")) 185 186 for i := 0; i < b.N; i++ { 187 any.Get("i") 188 } 189 }) 190 } 191 192 func BenchmarkStringMap(b *testing.B) { 193 b.ReportAllocs() 194 195 b.Run("set", func(b *testing.B) { 196 b.ResetTimer() 197 b.ReportAllocs() 198 var any = NewStringMap(100) 199 any.SetMany(func(cache map[string]string) { 200 for i := 0; i < b.N; i++ { 201 cache[randomString()] = randomString() 202 } 203 }) 204 }) 205 206 b.Run("set_get", func(b *testing.B) { 207 b.ResetTimer() 208 b.ReportAllocs() 209 var any = NewStringMap() 210 any.Set("i", "1") 211 212 for i := 0; i < b.N; i++ { 213 any.Get("i") 214 } 215 }) 216 } 217 218 func bytes2String(bc []byte) string { 219 return *(*string)(unsafe.Pointer(&bc)) 220 } 221 222 func string2Bytes(bc string) []byte { 223 return *(*[]byte)(unsafe.Pointer(&bc)) 224 } 225 226 var alphabets = "abcdefghijklmnoprz" 227 228 func randomString() string { 229 var in = rand.Intn(len(alphabets)) 230 return string(alphabets[in]) 231 }