memcache_test.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. package cache
  2. import (
  3. "testing"
  4. )
  5. type simpleStruct struct {
  6. int
  7. string
  8. }
  9. type complexStruct struct {
  10. int
  11. simpleStruct
  12. }
  13. var getTests = []struct {
  14. name string
  15. keyToAdd string
  16. keyToGet string
  17. expectedOk bool
  18. }{
  19. {"string_hit", "myKey", "myKey", true},
  20. {"string_miss", "myKey", "nonsense", false},
  21. }
  22. func TestSet(t *testing.T) {
  23. cache := NewMemCache(0)
  24. values := []string{"test1", "test2", "test3"}
  25. key := "key1"
  26. for _, v := range values {
  27. cache.Set(key, v)
  28. val, ok := cache.Get(key)
  29. if !ok {
  30. t.Fatalf("expect key:%v ,value:%v", key, v)
  31. } else if ok && val != v {
  32. t.Fatalf("key :%v,expect value:%v, get value:%v", key, v, val)
  33. }
  34. t.Logf("value:%v ", val)
  35. }
  36. }
  37. func TestGet(t *testing.T) {
  38. cache := NewMemCache(0)
  39. for _, tt := range getTests {
  40. cache.Set(tt.keyToAdd, 1234)
  41. val, ok := cache.Get(tt.keyToGet)
  42. if ok != tt.expectedOk {
  43. t.Fatalf("%s: val:%v cache hit = %v; want %v", tt.name, val, ok, !ok)
  44. } else if ok && val != 1234 {
  45. t.Fatalf("%s expected get to return 1234 but got %v", tt.name, val)
  46. }
  47. }
  48. }
  49. func TestDelete(t *testing.T) {
  50. var cache Cache
  51. cache = NewMemCache(0)
  52. cache.Set("myKey", 1234)
  53. if val, ok := cache.Get("myKey"); !ok {
  54. t.Fatal("TestRemove returned no match")
  55. } else if val != 1234 {
  56. t.Fatalf("TestRemove failed. Expected %d, got %v", 1234, val)
  57. }
  58. cache.Delete("myKey")
  59. if _, ok := cache.Get("myKey"); ok {
  60. t.Fatal("TestRemove returned a removed item")
  61. }
  62. }
  63. func TestStatus(t *testing.T) {
  64. keys := []string{"1", "2", "3", "4", "5"}
  65. var gets int64
  66. var hits int64
  67. var maxSize int
  68. var currentSize int
  69. maxSize = 20
  70. var cache Cache
  71. cache = NewMemCache(maxSize)
  72. //keys := []string{"1", "2", "3", "4", "5"}
  73. for _, key := range keys {
  74. cache.Set(key, 1234)
  75. currentSize++
  76. }
  77. newKeys := []string{"1", "2", "3", "4", "5", "6", "7", "8", "9", "10"}
  78. for _, newKey := range newKeys {
  79. _, ok := cache.Get(newKey)
  80. if ok == true {
  81. hits++
  82. }
  83. gets++
  84. }
  85. t.Logf("gets:%v, hits:%v, maxSize:%v, currentSize:%v", gets, hits, maxSize, currentSize)
  86. status := cache.Status()
  87. if status.CurrentSize != currentSize || status.MaxItemSize != maxSize ||
  88. status.Gets != gets || status.Hits != hits {
  89. t.Fatalf("get status maxSize:%v, currentSize:%v, nget:%v, nhit:%v",
  90. status.MaxItemSize, status.CurrentSize, status.Gets, status.Hits)
  91. }
  92. }
  93. func TestLRU(t *testing.T) {
  94. keys := []string{"1", "2", "3", "4", "2", "1", "3", "5", "6", "5", "6"}
  95. maxSize := 3
  96. var cache Cache
  97. cache = NewMemCache(maxSize)
  98. for i, key := range keys {
  99. cache.Set(key, 1234)
  100. if i == 3 {
  101. status := cache.Status()
  102. if status.CurrentSize != maxSize {
  103. t.Fatalf("expected maxSize %v,currentSize:%v", maxSize, status.CurrentSize)
  104. }
  105. _, ok1 := cache.Get("2")
  106. _, ok2 := cache.Get("3")
  107. _, ok3 := cache.Get("4")
  108. if !(ok1 && ok2 && ok3) {
  109. t.Fatalf("expected remains key 2:%v,3:%v, 4:%v", ok1, ok2, ok3)
  110. }
  111. }
  112. }
  113. status := cache.Status()
  114. if status.CurrentSize != maxSize {
  115. t.Fatalf("expected maxSize %v,currentSize:%v", maxSize, status.CurrentSize)
  116. }
  117. _, ok1 := cache.Get("3")
  118. _, ok2 := cache.Get("5")
  119. _, ok3 := cache.Get("6")
  120. if !(ok1 && ok2 && ok3) {
  121. t.Fatalf("expected remains key 3:%v,5:%v, 6:%v", ok1, ok2, ok3)
  122. }
  123. }