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  }