pool_test.go 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361
  1. package memcache
  2. import (
  3. "bytes"
  4. "context"
  5. "os"
  6. "testing"
  7. "time"
  8. "go-common/library/container/pool"
  9. xtime "go-common/library/time"
  10. )
  11. var p *Pool
  12. var config *Config
  13. func init() {
  14. testMemcacheAddr := "127.0.0.1:11211"
  15. if addr := os.Getenv("TEST_MEMCACHE_ADDR"); addr != "" {
  16. testMemcacheAddr = addr
  17. }
  18. config = &Config{
  19. Name: "test",
  20. Proto: "tcp",
  21. Addr: testMemcacheAddr,
  22. DialTimeout: xtime.Duration(time.Second),
  23. ReadTimeout: xtime.Duration(time.Second),
  24. WriteTimeout: xtime.Duration(time.Second),
  25. }
  26. config.Config = &pool.Config{
  27. Active: 10,
  28. Idle: 5,
  29. IdleTimeout: xtime.Duration(90 * time.Second),
  30. }
  31. }
  32. var itempool = &Item{
  33. Key: "testpool",
  34. Value: []byte("testpool"),
  35. Flags: 0,
  36. Expiration: 60,
  37. cas: 0,
  38. }
  39. var itempool2 = &Item{
  40. Key: "test_count",
  41. Value: []byte("0"),
  42. Flags: 0,
  43. Expiration: 1000,
  44. cas: 0,
  45. }
  46. type testObject struct {
  47. Mid int64
  48. Value []byte
  49. }
  50. var largeValue = &Item{
  51. Key: "large_value",
  52. Flags: FlagGOB | FlagGzip,
  53. Expiration: 1000,
  54. cas: 0,
  55. }
  56. var largeValueBoundary = &Item{
  57. Key: "large_value",
  58. Flags: FlagGOB | FlagGzip,
  59. Expiration: 1000,
  60. cas: 0,
  61. }
  62. func prepareEnv2() {
  63. if p != nil {
  64. return
  65. }
  66. p = NewPool(config)
  67. }
  68. func TestPoolSet(t *testing.T) {
  69. prepareEnv2()
  70. conn := p.Get(context.Background())
  71. defer conn.Close()
  72. // set
  73. if err := conn.Set(itempool); err != nil {
  74. t.Errorf("memcache: set error(%v)", err)
  75. } else {
  76. t.Logf("memcache: set value: %s", item.Value)
  77. }
  78. if err := conn.Close(); err != nil {
  79. t.Errorf("memcache: close error(%v)", err)
  80. }
  81. }
  82. func TestPoolGet(t *testing.T) {
  83. prepareEnv2()
  84. key := "testpool"
  85. conn := p.Get(context.Background())
  86. defer conn.Close()
  87. // get
  88. if res, err := conn.Get(key); err != nil {
  89. t.Errorf("memcache: get error(%v)", err)
  90. } else {
  91. t.Logf("memcache: get value: %s", res.Value)
  92. }
  93. if _, err := conn.Get("not_found"); err != ErrNotFound {
  94. t.Errorf("memcache: expceted err is not found but got: %v", err)
  95. }
  96. if err := conn.Close(); err != nil {
  97. t.Errorf("memcache: close error(%v)", err)
  98. }
  99. }
  100. func TestPoolGetMulti(t *testing.T) {
  101. prepareEnv2()
  102. conn := p.Get(context.Background())
  103. defer conn.Close()
  104. s := []string{"testpool", "test1"}
  105. // get
  106. if res, err := conn.GetMulti(s); err != nil {
  107. t.Errorf("memcache: gets error(%v)", err)
  108. } else {
  109. t.Logf("memcache: gets value: %d", len(res))
  110. }
  111. if err := conn.Close(); err != nil {
  112. t.Errorf("memcache: close error(%v)", err)
  113. }
  114. }
  115. func TestPoolTouch(t *testing.T) {
  116. prepareEnv2()
  117. key := "testpool"
  118. conn := p.Get(context.Background())
  119. defer conn.Close()
  120. // touch
  121. if err := conn.Touch(key, 10); err != nil {
  122. t.Errorf("memcache: touch error(%v)", err)
  123. }
  124. if err := conn.Close(); err != nil {
  125. t.Errorf("memcache: close error(%v)", err)
  126. }
  127. }
  128. func TestPoolIncrement(t *testing.T) {
  129. prepareEnv2()
  130. key := "test_count"
  131. conn := p.Get(context.Background())
  132. defer conn.Close()
  133. // set
  134. if err := conn.Set(itempool2); err != nil {
  135. t.Errorf("memcache: set error(%v)", err)
  136. } else {
  137. t.Logf("memcache: set value: 0")
  138. }
  139. // incr
  140. if res, err := conn.Increment(key, 1); err != nil {
  141. t.Errorf("memcache: incr error(%v)", err)
  142. } else {
  143. t.Logf("memcache: incr n: %d", res)
  144. if res != 1 {
  145. t.Errorf("memcache: expected res=1 but got %d", res)
  146. }
  147. }
  148. // decr
  149. if res, err := conn.Decrement(key, 1); err != nil {
  150. t.Errorf("memcache: decr error(%v)", err)
  151. } else {
  152. t.Logf("memcache: decr n: %d", res)
  153. if res != 0 {
  154. t.Errorf("memcache: expected res=0 but got %d", res)
  155. }
  156. }
  157. if err := conn.Close(); err != nil {
  158. t.Errorf("memcache: close error(%v)", err)
  159. }
  160. }
  161. func TestPoolErr(t *testing.T) {
  162. prepareEnv2()
  163. conn := p.Get(context.Background())
  164. defer conn.Close()
  165. if err := conn.Close(); err != nil {
  166. t.Errorf("memcache: close error(%v)", err)
  167. }
  168. if err := conn.Err(); err == nil {
  169. t.Errorf("memcache: err not nil")
  170. } else {
  171. t.Logf("memcache: err: %v", err)
  172. }
  173. }
  174. func TestPoolCompareAndSwap(t *testing.T) {
  175. prepareEnv2()
  176. conn := p.Get(context.Background())
  177. defer conn.Close()
  178. key := "testpool"
  179. //cas
  180. if r, err := conn.Get(key); err != nil {
  181. t.Errorf("conn.Get() error(%v)", err)
  182. } else {
  183. r.Value = []byte("shit")
  184. if err := conn.CompareAndSwap(r); err != nil {
  185. t.Errorf("conn.Get() error(%v)", err)
  186. }
  187. r, _ := conn.Get("testpool")
  188. if r.Key != "testpool" || !bytes.Equal(r.Value, []byte("shit")) || r.Flags != 0 {
  189. t.Error("conn.Get() error, value")
  190. }
  191. if err := conn.Close(); err != nil {
  192. t.Errorf("memcache: close error(%v)", err)
  193. }
  194. }
  195. }
  196. func TestPoolDel(t *testing.T) {
  197. prepareEnv2()
  198. key := "testpool"
  199. conn := p.Get(context.Background())
  200. defer conn.Close()
  201. // delete
  202. if err := conn.Delete(key); err != nil {
  203. t.Errorf("memcache: delete error(%v)", err)
  204. } else {
  205. t.Logf("memcache: delete key: %s", key)
  206. }
  207. if err := conn.Close(); err != nil {
  208. t.Errorf("memcache: close error(%v)", err)
  209. }
  210. }
  211. func BenchmarkMemcache(b *testing.B) {
  212. c := &Config{
  213. Name: "test",
  214. Proto: "tcp",
  215. Addr: "127.0.0.1:11211",
  216. DialTimeout: xtime.Duration(time.Second),
  217. ReadTimeout: xtime.Duration(time.Second),
  218. WriteTimeout: xtime.Duration(time.Second),
  219. }
  220. c.Config = &pool.Config{
  221. Active: 10,
  222. Idle: 5,
  223. IdleTimeout: xtime.Duration(90 * time.Second),
  224. }
  225. p = NewPool(c)
  226. b.ResetTimer()
  227. b.RunParallel(func(pb *testing.PB) {
  228. for pb.Next() {
  229. conn := p.Get(context.Background())
  230. if err := conn.Close(); err != nil {
  231. b.Errorf("memcache: close error(%v)", err)
  232. }
  233. }
  234. })
  235. if err := p.Close(); err != nil {
  236. b.Errorf("memcache: close error(%v)", err)
  237. }
  238. }
  239. func TestPoolSetLargeValue(t *testing.T) {
  240. var b bytes.Buffer
  241. for i := 0; i < 4000000; i++ {
  242. b.WriteByte(1)
  243. }
  244. obj := &testObject{}
  245. obj.Mid = 1000
  246. obj.Value = b.Bytes()
  247. largeValue.Object = obj
  248. prepareEnv2()
  249. conn := p.Get(context.Background())
  250. defer conn.Close()
  251. // set
  252. if err := conn.Set(largeValue); err != nil {
  253. t.Errorf("memcache: set error(%v)", err)
  254. }
  255. if err := conn.Close(); err != nil {
  256. t.Errorf("memcache: close error(%v)", err)
  257. }
  258. }
  259. func TestPoolGetLargeValue(t *testing.T) {
  260. prepareEnv2()
  261. key := largeValue.Key
  262. conn := p.Get(context.Background())
  263. defer conn.Close()
  264. // get
  265. var err error
  266. if _, err = conn.Get(key); err != nil {
  267. t.Errorf("memcache: large get error(%+v)", err)
  268. }
  269. }
  270. func TestPoolGetMultiLargeValue(t *testing.T) {
  271. prepareEnv2()
  272. conn := p.Get(context.Background())
  273. defer conn.Close()
  274. s := []string{largeValue.Key, largeValue.Key}
  275. // get
  276. if res, err := conn.GetMulti(s); err != nil {
  277. t.Errorf("memcache: gets error(%v)", err)
  278. } else {
  279. t.Logf("memcache: gets value: %d", len(res))
  280. }
  281. if err := conn.Close(); err != nil {
  282. t.Errorf("memcache: close error(%v)", err)
  283. }
  284. }
  285. func TestPoolSetLargeValueBoundary(t *testing.T) {
  286. var b bytes.Buffer
  287. for i := 0; i < _largeValue; i++ {
  288. b.WriteByte(1)
  289. }
  290. obj := &testObject{}
  291. obj.Mid = 1000
  292. obj.Value = b.Bytes()
  293. largeValueBoundary.Object = obj
  294. prepareEnv2()
  295. conn := p.Get(context.Background())
  296. defer conn.Close()
  297. // set
  298. if err := conn.Set(largeValueBoundary); err != nil {
  299. t.Errorf("memcache: set error(%v)", err)
  300. }
  301. if err := conn.Close(); err != nil {
  302. t.Errorf("memcache: close error(%v)", err)
  303. }
  304. }
  305. func TestPoolGetLargeValueBoundary(t *testing.T) {
  306. prepareEnv2()
  307. key := largeValueBoundary.Key
  308. conn := p.Get(context.Background())
  309. defer conn.Close()
  310. // get
  311. var err error
  312. if _, err = conn.Get(key); err != nil {
  313. t.Errorf("memcache: large get error(%v)", err)
  314. }
  315. }
  316. func TestPoolAdd(t *testing.T) {
  317. var (
  318. key = "test_add"
  319. item = &Item{
  320. Key: key,
  321. Value: []byte("0"),
  322. Flags: 0,
  323. Expiration: 60,
  324. cas: 0,
  325. }
  326. conn = p.Get(context.Background())
  327. )
  328. defer conn.Close()
  329. prepareEnv2()
  330. conn.Delete(key)
  331. if err := conn.Add(item); err != nil {
  332. t.Errorf("memcache: add error(%v)", err)
  333. }
  334. if err := conn.Add(item); err != ErrNotStored {
  335. t.Errorf("memcache: add error(%v)", err)
  336. }
  337. }