github.com/fengyoulin/shm@v0.0.0-20200305015033-287e184bdf0a/map_test.go (about) 1 package shm 2 3 import ( 4 "encoding/hex" 5 "math/rand" 6 "os" 7 "testing" 8 "time" 9 "unsafe" 10 ) 11 12 const ( 13 testFileName = "testdb.db" 14 testMapCap = 4 * 1024 * 1024 15 testValLen = 8 16 testMaxTry = 20 17 initWait = 10 * time.Second 18 ) 19 20 var testMap *Map 21 22 func TestCreate(t *testing.T) { 23 var err error 24 testMap, err = Create(testFileName, testMapCap, 2*testValLen, testValLen, testMaxTry, initWait) 25 if err != nil { 26 t.Fatal(err) 27 } 28 } 29 30 func TestMap_GetOrAdd(t *testing.T) { 31 rand.Seed(time.Now().UnixNano()) 32 for i := 0; i < testMapCap; i++ { 33 var vb [testValLen]byte 34 var kb [2 * testValLen]byte 35 *(*int64)(unsafe.Pointer(&vb)) = rand.Int63() 36 ks := kb[:] 37 hex.Encode(ks, vb[:]) 38 k := *(*string)(unsafe.Pointer(&ks)) 39 v, err := testMap.Get(k, true) 40 if err != nil { 41 t.Error(err) 42 } 43 copy(v, vb[:]) 44 } 45 } 46 47 func TestMap_Foreach(t *testing.T) { 48 fn := func(key string, value []byte) bool { 49 var kb [16]byte 50 ks := kb[:] 51 hex.Encode(ks, value[:8]) 52 //k := *(*string)(unsafe.Pointer(&ks)) 53 //fmt.Printf("key: %s, value: %s\n", key, k) 54 return true 55 } 56 testMap.Foreach(fn) 57 } 58 59 func TestMap_Delete(t *testing.T) { 60 fn := func(key string, value []byte) bool { 61 if !testMap.Delete(key) { 62 t.Errorf("failed to delete %s\n", key) 63 return false 64 } 65 return true 66 } 67 testMap.Foreach(fn) 68 fn = func(key string, value []byte) bool { 69 t.Errorf("found after delete: %s\n", key) 70 return true 71 } 72 testMap.Foreach(fn) 73 } 74 75 func TestMap_Close(t *testing.T) { 76 err := testMap.Close() 77 if err != nil { 78 t.Error(err) 79 } 80 err = os.Remove(testFileName) 81 if err != nil { 82 t.Error(err) 83 } 84 } 85 86 func BenchmarkMap_GetOrAdd(b *testing.B) { 87 // create 88 var err error 89 testMap, err = Create(testFileName, testMapCap, 2*testValLen, testValLen, testMaxTry, initWait) 90 if err != nil { 91 b.Fatal(err) 92 } 93 b.StartTimer() 94 b.RunParallel(func(pb *testing.PB) { 95 for pb.Next() { 96 var vb [testValLen]byte 97 var kb [2 * testValLen]byte 98 *(*int64)(unsafe.Pointer(&vb)) = rand.Int63() 99 ks := kb[:] 100 hex.Encode(ks, vb[:]) 101 k := *(*string)(unsafe.Pointer(&ks)) 102 v, err := testMap.Get(k, true) 103 if err != nil { 104 panic(err) 105 } 106 copy(v, vb[:]) 107 } 108 }) 109 b.StopTimer() 110 // close 111 err = testMap.Close() 112 if err != nil { 113 b.Error(err) 114 } 115 err = os.Remove(testFileName) 116 if err != nil { 117 b.Error(err) 118 } 119 }