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  }