boourns-memcached 1.4.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (542) hide show
  1. data/BENCHMARKS +128 -0
  2. data/CHANGELOG +158 -0
  3. data/Gemfile +2 -0
  4. data/Gemfile.lock +41 -0
  5. data/LICENSE +184 -0
  6. data/Manifest +243 -0
  7. data/README.rdoc +124 -0
  8. data/Rakefile +118 -0
  9. data/TODO +4 -0
  10. data/ext/Makefile +213 -0
  11. data/ext/Makefile.in +213 -0
  12. data/ext/bin/memcat +0 -0
  13. data/ext/bin/memcp +0 -0
  14. data/ext/bin/memdump +0 -0
  15. data/ext/bin/memerror +0 -0
  16. data/ext/bin/memflush +0 -0
  17. data/ext/bin/memrm +0 -0
  18. data/ext/bin/memslap +0 -0
  19. data/ext/bin/memstat +0 -0
  20. data/ext/extconf-make.rb +25 -0
  21. data/ext/extconf.rb +87 -0
  22. data/ext/include/libmemcached/memcached.h +304 -0
  23. data/ext/include/libmemcached/memcached.hpp +799 -0
  24. data/ext/include/libmemcached/memcached_configure.h +23 -0
  25. data/ext/include/libmemcached/memcached_constants.h +145 -0
  26. data/ext/include/libmemcached/memcached_exist.h +20 -0
  27. data/ext/include/libmemcached/memcached_get.h +87 -0
  28. data/ext/include/libmemcached/memcached_result.h +59 -0
  29. data/ext/include/libmemcached/memcached_sasl.h +44 -0
  30. data/ext/include/libmemcached/memcached_server.h +93 -0
  31. data/ext/include/libmemcached/memcached_storage.h +107 -0
  32. data/ext/include/libmemcached/memcached_string.h +53 -0
  33. data/ext/include/libmemcached/memcached_touch.h +31 -0
  34. data/ext/include/libmemcached/memcached_types.h +44 -0
  35. data/ext/include/libmemcached/memcached_watchpoint.h +38 -0
  36. data/ext/include/libmemcached/visibility.h +51 -0
  37. data/ext/lib/libmemcached.a +0 -0
  38. data/ext/lib/libmemcached.la +41 -0
  39. data/ext/lib/libmemcached_gem.a +0 -0
  40. data/ext/lib/libmemcached_gem.la +41 -0
  41. data/ext/lib/pkgconfig/libmemcached.pc +10 -0
  42. data/ext/libmemcached-0.32/AUTHORS +7 -0
  43. data/ext/libmemcached-0.32/COPYING +32 -0
  44. data/ext/libmemcached-0.32/ChangeLog +303 -0
  45. data/ext/libmemcached-0.32/INSTALL +302 -0
  46. data/ext/libmemcached-0.32/Makefile +831 -0
  47. data/ext/libmemcached-0.32/Makefile.am +36 -0
  48. data/ext/libmemcached-0.32/Makefile.in +831 -0
  49. data/ext/libmemcached-0.32/NEWS +1 -0
  50. data/ext/libmemcached-0.32/README +33 -0
  51. data/ext/libmemcached-0.32/THANKS +14 -0
  52. data/ext/libmemcached-0.32/TODO +11 -0
  53. data/ext/libmemcached-0.32/aclocal.m4 +1917 -0
  54. data/ext/libmemcached-0.32/clients/Makefile +773 -0
  55. data/ext/libmemcached-0.32/clients/Makefile.am +80 -0
  56. data/ext/libmemcached-0.32/clients/Makefile.in +773 -0
  57. data/ext/libmemcached-0.32/clients/client_options.h +32 -0
  58. data/ext/libmemcached-0.32/clients/execute.c +64 -0
  59. data/ext/libmemcached-0.32/clients/execute.h +5 -0
  60. data/ext/libmemcached-0.32/clients/execute.lo +12 -0
  61. data/ext/libmemcached-0.32/clients/execute.o +0 -0
  62. data/ext/libmemcached-0.32/clients/generator.c +74 -0
  63. data/ext/libmemcached-0.32/clients/generator.h +20 -0
  64. data/ext/libmemcached-0.32/clients/generator.lo +12 -0
  65. data/ext/libmemcached-0.32/clients/generator.o +0 -0
  66. data/ext/libmemcached-0.32/clients/libgenexec.la +41 -0
  67. data/ext/libmemcached-0.32/clients/libutilities.la +41 -0
  68. data/ext/libmemcached-0.32/clients/memcat +0 -0
  69. data/ext/libmemcached-0.32/clients/memcat.c +178 -0
  70. data/ext/libmemcached-0.32/clients/memcat.o +0 -0
  71. data/ext/libmemcached-0.32/clients/memcp +0 -0
  72. data/ext/libmemcached-0.32/clients/memcp.c +251 -0
  73. data/ext/libmemcached-0.32/clients/memcp.o +0 -0
  74. data/ext/libmemcached-0.32/clients/memdump +0 -0
  75. data/ext/libmemcached-0.32/clients/memdump.c +170 -0
  76. data/ext/libmemcached-0.32/clients/memdump.o +0 -0
  77. data/ext/libmemcached-0.32/clients/memerror +0 -0
  78. data/ext/libmemcached-0.32/clients/memerror.c +80 -0
  79. data/ext/libmemcached-0.32/clients/memerror.o +0 -0
  80. data/ext/libmemcached-0.32/clients/memflush +0 -0
  81. data/ext/libmemcached-0.32/clients/memflush.c +143 -0
  82. data/ext/libmemcached-0.32/clients/memflush.o +0 -0
  83. data/ext/libmemcached-0.32/clients/memrm +0 -0
  84. data/ext/libmemcached-0.32/clients/memrm.c +160 -0
  85. data/ext/libmemcached-0.32/clients/memrm.o +0 -0
  86. data/ext/libmemcached-0.32/clients/memslap +0 -0
  87. data/ext/libmemcached-0.32/clients/memslap-memslap.o +0 -0
  88. data/ext/libmemcached-0.32/clients/memslap.c +441 -0
  89. data/ext/libmemcached-0.32/clients/memstat +0 -0
  90. data/ext/libmemcached-0.32/clients/memstat.c +326 -0
  91. data/ext/libmemcached-0.32/clients/memstat.o +0 -0
  92. data/ext/libmemcached-0.32/clients/utilities.c +207 -0
  93. data/ext/libmemcached-0.32/clients/utilities.h +41 -0
  94. data/ext/libmemcached-0.32/clients/utilities.lo +12 -0
  95. data/ext/libmemcached-0.32/clients/utilities.o +0 -0
  96. data/ext/libmemcached-0.32/config.h +253 -0
  97. data/ext/libmemcached-0.32/config.h.in +252 -0
  98. data/ext/libmemcached-0.32/config.log +2440 -0
  99. data/ext/libmemcached-0.32/config.status +2384 -0
  100. data/ext/libmemcached-0.32/config/compile +143 -0
  101. data/ext/libmemcached-0.32/config/config.guess +1561 -0
  102. data/ext/libmemcached-0.32/config/config.rpath +666 -0
  103. data/ext/libmemcached-0.32/config/config.sub +1686 -0
  104. data/ext/libmemcached-0.32/config/depcomp +630 -0
  105. data/ext/libmemcached-0.32/config/install-sh +520 -0
  106. data/ext/libmemcached-0.32/config/ltmain.sh +9636 -0
  107. data/ext/libmemcached-0.32/config/missing +376 -0
  108. data/ext/libmemcached-0.32/configure +23825 -0
  109. data/ext/libmemcached-0.32/configure.ac +122 -0
  110. data/ext/libmemcached-0.32/docs/Makefile +920 -0
  111. data/ext/libmemcached-0.32/docs/Makefile.am +415 -0
  112. data/ext/libmemcached-0.32/docs/Makefile.in +920 -0
  113. data/ext/libmemcached-0.32/docs/libmemcached.3 +229 -0
  114. data/ext/libmemcached-0.32/docs/libmemcached.pod +123 -0
  115. data/ext/libmemcached-0.32/docs/libmemcached_examples.3 +242 -0
  116. data/ext/libmemcached-0.32/docs/libmemcached_examples.pod +115 -0
  117. data/ext/libmemcached-0.32/docs/libmemcachedutil.pod +40 -0
  118. data/ext/libmemcached-0.32/docs/memcached_add.3 +308 -0
  119. data/ext/libmemcached-0.32/docs/memcached_add_by_key.3 +308 -0
  120. data/ext/libmemcached-0.32/docs/memcached_analyze.3 +175 -0
  121. data/ext/libmemcached-0.32/docs/memcached_analyze.pod +52 -0
  122. data/ext/libmemcached-0.32/docs/memcached_append.3 +308 -0
  123. data/ext/libmemcached-0.32/docs/memcached_append_by_key.3 +308 -0
  124. data/ext/libmemcached-0.32/docs/memcached_auto.pod +97 -0
  125. data/ext/libmemcached-0.32/docs/memcached_behavior.pod +224 -0
  126. data/ext/libmemcached-0.32/docs/memcached_behavior_get.3 +317 -0
  127. data/ext/libmemcached-0.32/docs/memcached_behavior_set.3 +317 -0
  128. data/ext/libmemcached-0.32/docs/memcached_callback.pod +123 -0
  129. data/ext/libmemcached-0.32/docs/memcached_callback_get.3 +231 -0
  130. data/ext/libmemcached-0.32/docs/memcached_callback_set.3 +231 -0
  131. data/ext/libmemcached-0.32/docs/memcached_cas.3 +308 -0
  132. data/ext/libmemcached-0.32/docs/memcached_cas_by_key.3 +308 -0
  133. data/ext/libmemcached-0.32/docs/memcached_clone.3 +183 -0
  134. data/ext/libmemcached-0.32/docs/memcached_create.3 +183 -0
  135. data/ext/libmemcached-0.32/docs/memcached_create.pod +61 -0
  136. data/ext/libmemcached-0.32/docs/memcached_decrement.3 +219 -0
  137. data/ext/libmemcached-0.32/docs/memcached_decrement_with_initial.3 +219 -0
  138. data/ext/libmemcached-0.32/docs/memcached_delete.3 +176 -0
  139. data/ext/libmemcached-0.32/docs/memcached_delete.pod +54 -0
  140. data/ext/libmemcached-0.32/docs/memcached_delete_by_key.3 +176 -0
  141. data/ext/libmemcached-0.32/docs/memcached_destroy_sasl_auth_data.3 +184 -0
  142. data/ext/libmemcached-0.32/docs/memcached_dump.3 +175 -0
  143. data/ext/libmemcached-0.32/docs/memcached_dump.pod +53 -0
  144. data/ext/libmemcached-0.32/docs/memcached_fetch.3 +283 -0
  145. data/ext/libmemcached-0.32/docs/memcached_fetch_execute.3 +283 -0
  146. data/ext/libmemcached-0.32/docs/memcached_fetch_result.3 +283 -0
  147. data/ext/libmemcached-0.32/docs/memcached_flush.pod +46 -0
  148. data/ext/libmemcached-0.32/docs/memcached_flush_buffers.3 +164 -0
  149. data/ext/libmemcached-0.32/docs/memcached_flush_buffers.pod +42 -0
  150. data/ext/libmemcached-0.32/docs/memcached_free.3 +183 -0
  151. data/ext/libmemcached-0.32/docs/memcached_generate_hash_value.3 +179 -0
  152. data/ext/libmemcached-0.32/docs/memcached_generate_hash_value.pod +57 -0
  153. data/ext/libmemcached-0.32/docs/memcached_get.3 +283 -0
  154. data/ext/libmemcached-0.32/docs/memcached_get.pod +161 -0
  155. data/ext/libmemcached-0.32/docs/memcached_get_by_key.3 +283 -0
  156. data/ext/libmemcached-0.32/docs/memcached_get_memory_allocators.3 +194 -0
  157. data/ext/libmemcached-0.32/docs/memcached_get_sasl_callbacks.3 +184 -0
  158. data/ext/libmemcached-0.32/docs/memcached_get_user_data.3 +171 -0
  159. data/ext/libmemcached-0.32/docs/memcached_increment.3 +219 -0
  160. data/ext/libmemcached-0.32/docs/memcached_increment_with_initial.3 +219 -0
  161. data/ext/libmemcached-0.32/docs/memcached_lib_version.3 +176 -0
  162. data/ext/libmemcached-0.32/docs/memcached_memory_allocators.pod +73 -0
  163. data/ext/libmemcached-0.32/docs/memcached_mget.3 +283 -0
  164. data/ext/libmemcached-0.32/docs/memcached_mget_by_key.3 +283 -0
  165. data/ext/libmemcached-0.32/docs/memcached_pool.pod +77 -0
  166. data/ext/libmemcached-0.32/docs/memcached_prepend.3 +308 -0
  167. data/ext/libmemcached-0.32/docs/memcached_prepend_by_key.3 +308 -0
  168. data/ext/libmemcached-0.32/docs/memcached_quit.3 +169 -0
  169. data/ext/libmemcached-0.32/docs/memcached_quit.pod +47 -0
  170. data/ext/libmemcached-0.32/docs/memcached_replace.3 +308 -0
  171. data/ext/libmemcached-0.32/docs/memcached_replace_by_key.3 +308 -0
  172. data/ext/libmemcached-0.32/docs/memcached_sasl.pod +63 -0
  173. data/ext/libmemcached-0.32/docs/memcached_server_add.3 +224 -0
  174. data/ext/libmemcached-0.32/docs/memcached_server_count.3 +224 -0
  175. data/ext/libmemcached-0.32/docs/memcached_server_list.3 +224 -0
  176. data/ext/libmemcached-0.32/docs/memcached_server_list_append.3 +196 -0
  177. data/ext/libmemcached-0.32/docs/memcached_server_list_count.3 +196 -0
  178. data/ext/libmemcached-0.32/docs/memcached_server_list_free.3 +196 -0
  179. data/ext/libmemcached-0.32/docs/memcached_server_push.3 +224 -0
  180. data/ext/libmemcached-0.32/docs/memcached_server_st.pod +75 -0
  181. data/ext/libmemcached-0.32/docs/memcached_servers.pod +102 -0
  182. data/ext/libmemcached-0.32/docs/memcached_servers_parse.3 +196 -0
  183. data/ext/libmemcached-0.32/docs/memcached_set.3 +308 -0
  184. data/ext/libmemcached-0.32/docs/memcached_set.pod +187 -0
  185. data/ext/libmemcached-0.32/docs/memcached_set_by_key.3 +308 -0
  186. data/ext/libmemcached-0.32/docs/memcached_set_memory_allocators.3 +194 -0
  187. data/ext/libmemcached-0.32/docs/memcached_set_sasl_auth_data.3 +184 -0
  188. data/ext/libmemcached-0.32/docs/memcached_set_sasl_callbacks.3 +184 -0
  189. data/ext/libmemcached-0.32/docs/memcached_set_user_data.3 +171 -0
  190. data/ext/libmemcached-0.32/docs/memcached_stat.3 +204 -0
  191. data/ext/libmemcached-0.32/docs/memcached_stat_get_keys.3 +204 -0
  192. data/ext/libmemcached-0.32/docs/memcached_stat_get_value.3 +204 -0
  193. data/ext/libmemcached-0.32/docs/memcached_stat_servername.3 +204 -0
  194. data/ext/libmemcached-0.32/docs/memcached_stats.pod +82 -0
  195. data/ext/libmemcached-0.32/docs/memcached_strerror.3 +168 -0
  196. data/ext/libmemcached-0.32/docs/memcached_strerror.pod +46 -0
  197. data/ext/libmemcached-0.32/docs/memcached_user_data.pod +49 -0
  198. data/ext/libmemcached-0.32/docs/memcached_verbosity.3 +163 -0
  199. data/ext/libmemcached-0.32/docs/memcached_verbosity.pod +41 -0
  200. data/ext/libmemcached-0.32/docs/memcached_version.3 +176 -0
  201. data/ext/libmemcached-0.32/docs/memcached_version.pod +56 -0
  202. data/ext/libmemcached-0.32/docs/memcat.1 +161 -0
  203. data/ext/libmemcached-0.32/docs/memcat.pod +37 -0
  204. data/ext/libmemcached-0.32/docs/memcp.1 +164 -0
  205. data/ext/libmemcached-0.32/docs/memcp.pod +40 -0
  206. data/ext/libmemcached-0.32/docs/memdump.1 +155 -0
  207. data/ext/libmemcached-0.32/docs/memdump.pod +31 -0
  208. data/ext/libmemcached-0.32/docs/memerror.1 +154 -0
  209. data/ext/libmemcached-0.32/docs/memerror.pod +30 -0
  210. data/ext/libmemcached-0.32/docs/memflush.1 +159 -0
  211. data/ext/libmemcached-0.32/docs/memflush.pod +35 -0
  212. data/ext/libmemcached-0.32/docs/memrm.1 +158 -0
  213. data/ext/libmemcached-0.32/docs/memrm.pod +34 -0
  214. data/ext/libmemcached-0.32/docs/memslap.1 +157 -0
  215. data/ext/libmemcached-0.32/docs/memslap.pod +33 -0
  216. data/ext/libmemcached-0.32/docs/memstat.1 +159 -0
  217. data/ext/libmemcached-0.32/docs/memstat.pod +35 -0
  218. data/ext/libmemcached-0.32/libmemcached/Makefile +1069 -0
  219. data/ext/libmemcached-0.32/libmemcached/Makefile.am +111 -0
  220. data/ext/libmemcached-0.32/libmemcached/Makefile.in +1069 -0
  221. data/ext/libmemcached-0.32/libmemcached/byteorder.c +31 -0
  222. data/ext/libmemcached-0.32/libmemcached/common.h +189 -0
  223. data/ext/libmemcached-0.32/libmemcached/crc.c +86 -0
  224. data/ext/libmemcached-0.32/libmemcached/hsieh_hash.c +68 -0
  225. data/ext/libmemcached-0.32/libmemcached/jenkins_hash.c +213 -0
  226. data/ext/libmemcached-0.32/libmemcached/libmemcached.la +41 -0
  227. data/ext/libmemcached-0.32/libmemcached/libmemcached.ver +1 -0
  228. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-byteorder.lo +12 -0
  229. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-byteorder.o +0 -0
  230. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-crc.lo +12 -0
  231. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-crc.o +0 -0
  232. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-jenkins_hash.lo +12 -0
  233. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-jenkins_hash.o +0 -0
  234. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-md5.lo +12 -0
  235. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-md5.o +0 -0
  236. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached.lo +12 -0
  237. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached.o +0 -0
  238. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_allocators.lo +12 -0
  239. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_allocators.o +0 -0
  240. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_analyze.lo +12 -0
  241. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_analyze.o +0 -0
  242. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_auto.lo +12 -0
  243. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_auto.o +0 -0
  244. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_behavior.lo +12 -0
  245. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_behavior.o +0 -0
  246. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_connect.lo +12 -0
  247. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_connect.o +0 -0
  248. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_delete.lo +12 -0
  249. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_delete.o +0 -0
  250. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_do.lo +12 -0
  251. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_do.o +0 -0
  252. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_dump.lo +12 -0
  253. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_dump.o +0 -0
  254. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_exist.lo +12 -0
  255. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_exist.o +0 -0
  256. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_fetch.lo +12 -0
  257. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_fetch.o +0 -0
  258. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_flush.lo +12 -0
  259. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_flush.o +0 -0
  260. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_flush_buffers.lo +12 -0
  261. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_flush_buffers.o +0 -0
  262. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_get.lo +12 -0
  263. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_get.o +0 -0
  264. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_hash.lo +12 -0
  265. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_hash.o +0 -0
  266. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_hosts.lo +12 -0
  267. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_hosts.o +0 -0
  268. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_io.lo +12 -0
  269. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_io.o +0 -0
  270. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_key.lo +12 -0
  271. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_key.o +0 -0
  272. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_parse.lo +12 -0
  273. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_parse.o +0 -0
  274. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_purge.lo +12 -0
  275. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_purge.o +0 -0
  276. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_quit.lo +12 -0
  277. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_quit.o +0 -0
  278. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_response.lo +12 -0
  279. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_response.o +0 -0
  280. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_result.lo +12 -0
  281. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_result.o +0 -0
  282. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_sasl.lo +12 -0
  283. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_sasl.o +0 -0
  284. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_server.lo +12 -0
  285. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_server.o +0 -0
  286. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_stats.lo +12 -0
  287. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_stats.o +0 -0
  288. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_storage.lo +12 -0
  289. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_storage.o +0 -0
  290. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_strerror.lo +12 -0
  291. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_strerror.o +0 -0
  292. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_string.lo +12 -0
  293. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_string.o +0 -0
  294. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_touch.lo +12 -0
  295. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_touch.o +0 -0
  296. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_verbosity.lo +12 -0
  297. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_verbosity.o +0 -0
  298. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_version.lo +12 -0
  299. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_version.o +0 -0
  300. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-murmur_hash.lo +12 -0
  301. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-murmur_hash.o +0 -0
  302. data/ext/libmemcached-0.32/libmemcached/libmemcached_probes.d +30 -0
  303. data/ext/libmemcached-0.32/libmemcached/libmemcached_probes.h +82 -0
  304. data/ext/libmemcached-0.32/libmemcached/libmemcachedcallbacks.la +41 -0
  305. data/ext/libmemcached-0.32/libmemcached/libmemcachedcallbacks_la-memcached_callback.lo +12 -0
  306. data/ext/libmemcached-0.32/libmemcached/libmemcachedcallbacks_la-memcached_callback.o +0 -0
  307. data/ext/libmemcached-0.32/libmemcached/md5.c +354 -0
  308. data/ext/libmemcached-0.32/libmemcached/memcached.c +152 -0
  309. data/ext/libmemcached-0.32/libmemcached/memcached.h +304 -0
  310. data/ext/libmemcached-0.32/libmemcached/memcached.hpp +799 -0
  311. data/ext/libmemcached-0.32/libmemcached/memcached/README.txt +7 -0
  312. data/ext/libmemcached-0.32/libmemcached/memcached/protocol_binary.h +385 -0
  313. data/ext/libmemcached-0.32/libmemcached/memcached_allocators.c +72 -0
  314. data/ext/libmemcached-0.32/libmemcached/memcached_analyze.c +100 -0
  315. data/ext/libmemcached-0.32/libmemcached/memcached_auto.c +207 -0
  316. data/ext/libmemcached-0.32/libmemcached/memcached_behavior.c +285 -0
  317. data/ext/libmemcached-0.32/libmemcached/memcached_callback.c +175 -0
  318. data/ext/libmemcached-0.32/libmemcached/memcached_configure.h +23 -0
  319. data/ext/libmemcached-0.32/libmemcached/memcached_configure.h.in +23 -0
  320. data/ext/libmemcached-0.32/libmemcached/memcached_connect.c +371 -0
  321. data/ext/libmemcached-0.32/libmemcached/memcached_constants.h +145 -0
  322. data/ext/libmemcached-0.32/libmemcached/memcached_delete.c +0 -0
  323. data/ext/libmemcached-0.32/libmemcached/memcached_do.c +70 -0
  324. data/ext/libmemcached-0.32/libmemcached/memcached_dump.c +79 -0
  325. data/ext/libmemcached-0.32/libmemcached/memcached_exist.c +114 -0
  326. data/ext/libmemcached-0.32/libmemcached/memcached_exist.h +20 -0
  327. data/ext/libmemcached-0.32/libmemcached/memcached_fetch.c +102 -0
  328. data/ext/libmemcached-0.32/libmemcached/memcached_flush.c +89 -0
  329. data/ext/libmemcached-0.32/libmemcached/memcached_flush_buffers.c +22 -0
  330. data/ext/libmemcached-0.32/libmemcached/memcached_get.c +494 -0
  331. data/ext/libmemcached-0.32/libmemcached/memcached_get.h +87 -0
  332. data/ext/libmemcached-0.32/libmemcached/memcached_hash.c +252 -0
  333. data/ext/libmemcached-0.32/libmemcached/memcached_hosts.c +510 -0
  334. data/ext/libmemcached-0.32/libmemcached/memcached_internal.h +31 -0
  335. data/ext/libmemcached-0.32/libmemcached/memcached_io.c +575 -0
  336. data/ext/libmemcached-0.32/libmemcached/memcached_io.h +72 -0
  337. data/ext/libmemcached-0.32/libmemcached/memcached_key.c +28 -0
  338. data/ext/libmemcached-0.32/libmemcached/memcached_parse.c +74 -0
  339. data/ext/libmemcached-0.32/libmemcached/memcached_pool.h +38 -0
  340. data/ext/libmemcached-0.32/libmemcached/memcached_purge.c +76 -0
  341. data/ext/libmemcached-0.32/libmemcached/memcached_quit.c +75 -0
  342. data/ext/libmemcached-0.32/libmemcached/memcached_response.c +529 -0
  343. data/ext/libmemcached-0.32/libmemcached/memcached_result.c +57 -0
  344. data/ext/libmemcached-0.32/libmemcached/memcached_result.h +59 -0
  345. data/ext/libmemcached-0.32/libmemcached/memcached_sasl.c +225 -0
  346. data/ext/libmemcached-0.32/libmemcached/memcached_sasl.h +44 -0
  347. data/ext/libmemcached-0.32/libmemcached/memcached_server.c +159 -0
  348. data/ext/libmemcached-0.32/libmemcached/memcached_server.h +93 -0
  349. data/ext/libmemcached-0.32/libmemcached/memcached_stats.c +437 -0
  350. data/ext/libmemcached-0.32/libmemcached/memcached_storage.c +515 -0
  351. data/ext/libmemcached-0.32/libmemcached/memcached_storage.h +107 -0
  352. data/ext/libmemcached-0.32/libmemcached/memcached_strerror.c +92 -0
  353. data/ext/libmemcached-0.32/libmemcached/memcached_string.c +138 -0
  354. data/ext/libmemcached-0.32/libmemcached/memcached_string.h +53 -0
  355. data/ext/libmemcached-0.32/libmemcached/memcached_touch.c +60 -0
  356. data/ext/libmemcached-0.32/libmemcached/memcached_touch.h +31 -0
  357. data/ext/libmemcached-0.32/libmemcached/memcached_types.h +44 -0
  358. data/ext/libmemcached-0.32/libmemcached/memcached_util.h +15 -0
  359. data/ext/libmemcached-0.32/libmemcached/memcached_verbosity.c +36 -0
  360. data/ext/libmemcached-0.32/libmemcached/memcached_version.c +112 -0
  361. data/ext/libmemcached-0.32/libmemcached/memcached_watchpoint.h +38 -0
  362. data/ext/libmemcached-0.32/libmemcached/murmur_hash.c +76 -0
  363. data/ext/libmemcached-0.32/libmemcached/visibility.h +51 -0
  364. data/ext/libmemcached-0.32/libmemcachedutil/Makefile +604 -0
  365. data/ext/libmemcached-0.32/libmemcachedutil/Makefile.am +11 -0
  366. data/ext/libmemcached-0.32/libmemcachedutil/Makefile.in +604 -0
  367. data/ext/libmemcached-0.32/libmemcachedutil/libmemcachedutil.ver +1 -0
  368. data/ext/libmemcached-0.32/libmemcachedutil/memcached_pool.c +170 -0
  369. data/ext/libmemcached-0.32/libtool +10223 -0
  370. data/ext/libmemcached-0.32/m4/ac_cxx_compile_stdcxx_0x.m4 +103 -0
  371. data/ext/libmemcached-0.32/m4/ac_cxx_header_stdcxx_98.m4 +67 -0
  372. data/ext/libmemcached-0.32/m4/acx_pthread.m4 +276 -0
  373. data/ext/libmemcached-0.32/m4/byteorder.m4 +40 -0
  374. data/ext/libmemcached-0.32/m4/deprecated.m4 +17 -0
  375. data/ext/libmemcached-0.32/m4/enable_utillib.m4 +16 -0
  376. data/ext/libmemcached-0.32/m4/extensions.m4 +94 -0
  377. data/ext/libmemcached-0.32/m4/hsieh.m4 +18 -0
  378. data/ext/libmemcached-0.32/m4/lib-prefix.m4 +221 -0
  379. data/ext/libmemcached-0.32/m4/libtool.m4 +7831 -0
  380. data/ext/libmemcached-0.32/m4/ltoptions.m4 +369 -0
  381. data/ext/libmemcached-0.32/m4/ltsugar.m4 +123 -0
  382. data/ext/libmemcached-0.32/m4/ltversion.m4 +23 -0
  383. data/ext/libmemcached-0.32/m4/lt~obsolete.m4 +98 -0
  384. data/ext/libmemcached-0.32/m4/memcached.m4 +30 -0
  385. data/ext/libmemcached-0.32/m4/pandora_64bit.m4 +55 -0
  386. data/ext/libmemcached-0.32/m4/pandora_canonical.m4 +151 -0
  387. data/ext/libmemcached-0.32/m4/pandora_check_compiler_version.m4 +37 -0
  388. data/ext/libmemcached-0.32/m4/pandora_check_cxx_standard.m4 +16 -0
  389. data/ext/libmemcached-0.32/m4/pandora_enable_dtrace.m4 +41 -0
  390. data/ext/libmemcached-0.32/m4/pandora_ensure_gcc_version.m4 +36 -0
  391. data/ext/libmemcached-0.32/m4/pandora_have_better_malloc.m4 +54 -0
  392. data/ext/libmemcached-0.32/m4/pandora_have_sasl.m4 +133 -0
  393. data/ext/libmemcached-0.32/m4/pandora_header_assert.m4 +23 -0
  394. data/ext/libmemcached-0.32/m4/pandora_libtool.m4 +15 -0
  395. data/ext/libmemcached-0.32/m4/pandora_optimize.m4 +79 -0
  396. data/ext/libmemcached-0.32/m4/pandora_shared_ptr.m4 +56 -0
  397. data/ext/libmemcached-0.32/m4/pandora_vc_build.m4 +32 -0
  398. data/ext/libmemcached-0.32/m4/pandora_warnings.m4 +262 -0
  399. data/ext/libmemcached-0.32/m4/pod2man.m4 +7 -0
  400. data/ext/libmemcached-0.32/m4/protocol_binary.m4 +23 -0
  401. data/ext/libmemcached-0.32/m4/setsockopt.m4 +57 -0
  402. data/ext/libmemcached-0.32/m4/visibility.m4 +52 -0
  403. data/ext/libmemcached-0.32/stamp-h1 +1 -0
  404. data/ext/libmemcached-0.32/support/Makefile +487 -0
  405. data/ext/libmemcached-0.32/support/Makefile.am +4 -0
  406. data/ext/libmemcached-0.32/support/Makefile.in +487 -0
  407. data/ext/libmemcached-0.32/support/libmemcached-fc.spec +105 -0
  408. data/ext/libmemcached-0.32/support/libmemcached-fc.spec.in +105 -0
  409. data/ext/libmemcached-0.32/support/libmemcached.pc +10 -0
  410. data/ext/libmemcached-0.32/support/libmemcached.pc.in +10 -0
  411. data/ext/libmemcached-0.32/support/libmemcached.spec +105 -0
  412. data/ext/libmemcached-0.32/support/libmemcached.spec.in +105 -0
  413. data/ext/libmemcached-0.32/support/set_benchmark.sh +5 -0
  414. data/ext/libmemcached-0.32/tests/Makefile +762 -0
  415. data/ext/libmemcached-0.32/tests/Makefile.am +113 -0
  416. data/ext/libmemcached-0.32/tests/Makefile.in +762 -0
  417. data/ext/libmemcached-0.32/tests/atomsmasher +0 -0
  418. data/ext/libmemcached-0.32/tests/atomsmasher.c +245 -0
  419. data/ext/libmemcached-0.32/tests/atomsmasher.o +0 -0
  420. data/ext/libmemcached-0.32/tests/function.c +4893 -0
  421. data/ext/libmemcached-0.32/tests/ketama_test_cases.h +108 -0
  422. data/ext/libmemcached-0.32/tests/libserver.la +41 -0
  423. data/ext/libmemcached-0.32/tests/libtest.la +41 -0
  424. data/ext/libmemcached-0.32/tests/output.cmp +7 -0
  425. data/ext/libmemcached-0.32/tests/output.res +7 -0
  426. data/ext/libmemcached-0.32/tests/output2.res +46 -0
  427. data/ext/libmemcached-0.32/tests/plus.cpp +293 -0
  428. data/ext/libmemcached-0.32/tests/plus.o +0 -0
  429. data/ext/libmemcached-0.32/tests/r/memcat.res +19 -0
  430. data/ext/libmemcached-0.32/tests/r/memcp.res +27 -0
  431. data/ext/libmemcached-0.32/tests/r/memrm.res +19 -0
  432. data/ext/libmemcached-0.32/tests/r/memslap.res +33 -0
  433. data/ext/libmemcached-0.32/tests/r/memstat.res +33 -0
  434. data/ext/libmemcached-0.32/tests/server.c +118 -0
  435. data/ext/libmemcached-0.32/tests/server.h +25 -0
  436. data/ext/libmemcached-0.32/tests/server.lo +12 -0
  437. data/ext/libmemcached-0.32/tests/server.o +0 -0
  438. data/ext/libmemcached-0.32/tests/start.c +16 -0
  439. data/ext/libmemcached-0.32/tests/start.o +0 -0
  440. data/ext/libmemcached-0.32/tests/startservers +0 -0
  441. data/ext/libmemcached-0.32/tests/t/memcat.test +4 -0
  442. data/ext/libmemcached-0.32/tests/t/memcp.test +3 -0
  443. data/ext/libmemcached-0.32/tests/t/memrm.test +3 -0
  444. data/ext/libmemcached-0.32/tests/t/memslap.test +5 -0
  445. data/ext/libmemcached-0.32/tests/t/memstat.test +3 -0
  446. data/ext/libmemcached-0.32/tests/test.c +137 -0
  447. data/ext/libmemcached-0.32/tests/test.h +46 -0
  448. data/ext/libmemcached-0.32/tests/test.lo +12 -0
  449. data/ext/libmemcached-0.32/tests/test.o +0 -0
  450. data/ext/libmemcached-0.32/tests/testapp +0 -0
  451. data/ext/libmemcached-0.32/tests/testapp-function.o +0 -0
  452. data/ext/libmemcached-0.32/tests/testplus +0 -0
  453. data/ext/libmemcached-0.32/tests/udp.c +76 -0
  454. data/ext/libmemcached-0.32/tests/udp.o +0 -0
  455. data/ext/libmemcached-0.32/tests/udptest +0 -0
  456. data/ext/rlibmemcached.bundle +0 -0
  457. data/ext/rlibmemcached.i +249 -0
  458. data/ext/rlibmemcached_wrap.c +13781 -0
  459. data/ext/rlibmemcached_wrap.o +0 -0
  460. data/ext/share/man/man1/memcat.1 +161 -0
  461. data/ext/share/man/man1/memcp.1 +164 -0
  462. data/ext/share/man/man1/memdump.1 +155 -0
  463. data/ext/share/man/man1/memerror.1 +154 -0
  464. data/ext/share/man/man1/memflush.1 +159 -0
  465. data/ext/share/man/man1/memrm.1 +158 -0
  466. data/ext/share/man/man1/memslap.1 +157 -0
  467. data/ext/share/man/man1/memstat.1 +159 -0
  468. data/ext/share/man/man3/libmemcached.3 +229 -0
  469. data/ext/share/man/man3/libmemcached_examples.3 +242 -0
  470. data/ext/share/man/man3/memcached_add.3 +308 -0
  471. data/ext/share/man/man3/memcached_add_by_key.3 +308 -0
  472. data/ext/share/man/man3/memcached_analyze.3 +175 -0
  473. data/ext/share/man/man3/memcached_append.3 +308 -0
  474. data/ext/share/man/man3/memcached_append_by_key.3 +308 -0
  475. data/ext/share/man/man3/memcached_behavior_get.3 +317 -0
  476. data/ext/share/man/man3/memcached_behavior_set.3 +317 -0
  477. data/ext/share/man/man3/memcached_callback_get.3 +231 -0
  478. data/ext/share/man/man3/memcached_callback_set.3 +231 -0
  479. data/ext/share/man/man3/memcached_cas.3 +308 -0
  480. data/ext/share/man/man3/memcached_cas_by_key.3 +308 -0
  481. data/ext/share/man/man3/memcached_clone.3 +183 -0
  482. data/ext/share/man/man3/memcached_create.3 +183 -0
  483. data/ext/share/man/man3/memcached_decrement.3 +219 -0
  484. data/ext/share/man/man3/memcached_decrement_with_initial.3 +219 -0
  485. data/ext/share/man/man3/memcached_delete.3 +176 -0
  486. data/ext/share/man/man3/memcached_delete_by_key.3 +176 -0
  487. data/ext/share/man/man3/memcached_destroy_sasl_auth_data.3 +184 -0
  488. data/ext/share/man/man3/memcached_dump.3 +175 -0
  489. data/ext/share/man/man3/memcached_fetch.3 +283 -0
  490. data/ext/share/man/man3/memcached_fetch_execute.3 +283 -0
  491. data/ext/share/man/man3/memcached_fetch_result.3 +283 -0
  492. data/ext/share/man/man3/memcached_flush_buffers.3 +164 -0
  493. data/ext/share/man/man3/memcached_free.3 +183 -0
  494. data/ext/share/man/man3/memcached_generate_hash_value.3 +179 -0
  495. data/ext/share/man/man3/memcached_get.3 +283 -0
  496. data/ext/share/man/man3/memcached_get_by_key.3 +283 -0
  497. data/ext/share/man/man3/memcached_get_memory_allocators.3 +194 -0
  498. data/ext/share/man/man3/memcached_get_sasl_callbacks.3 +184 -0
  499. data/ext/share/man/man3/memcached_get_user_data.3 +171 -0
  500. data/ext/share/man/man3/memcached_increment.3 +219 -0
  501. data/ext/share/man/man3/memcached_increment_with_initial.3 +219 -0
  502. data/ext/share/man/man3/memcached_lib_version.3 +176 -0
  503. data/ext/share/man/man3/memcached_mget.3 +283 -0
  504. data/ext/share/man/man3/memcached_mget_by_key.3 +283 -0
  505. data/ext/share/man/man3/memcached_prepend.3 +308 -0
  506. data/ext/share/man/man3/memcached_prepend_by_key.3 +308 -0
  507. data/ext/share/man/man3/memcached_quit.3 +169 -0
  508. data/ext/share/man/man3/memcached_replace.3 +308 -0
  509. data/ext/share/man/man3/memcached_replace_by_key.3 +308 -0
  510. data/ext/share/man/man3/memcached_server_add.3 +224 -0
  511. data/ext/share/man/man3/memcached_server_count.3 +224 -0
  512. data/ext/share/man/man3/memcached_server_list.3 +224 -0
  513. data/ext/share/man/man3/memcached_server_list_append.3 +196 -0
  514. data/ext/share/man/man3/memcached_server_list_count.3 +196 -0
  515. data/ext/share/man/man3/memcached_server_list_free.3 +196 -0
  516. data/ext/share/man/man3/memcached_server_push.3 +224 -0
  517. data/ext/share/man/man3/memcached_servers_parse.3 +196 -0
  518. data/ext/share/man/man3/memcached_set.3 +308 -0
  519. data/ext/share/man/man3/memcached_set_by_key.3 +308 -0
  520. data/ext/share/man/man3/memcached_set_memory_allocators.3 +194 -0
  521. data/ext/share/man/man3/memcached_set_sasl_auth_data.3 +184 -0
  522. data/ext/share/man/man3/memcached_set_sasl_callbacks.3 +184 -0
  523. data/ext/share/man/man3/memcached_set_user_data.3 +171 -0
  524. data/ext/share/man/man3/memcached_stat.3 +204 -0
  525. data/ext/share/man/man3/memcached_stat_get_keys.3 +204 -0
  526. data/ext/share/man/man3/memcached_stat_get_value.3 +204 -0
  527. data/ext/share/man/man3/memcached_stat_servername.3 +204 -0
  528. data/ext/share/man/man3/memcached_strerror.3 +168 -0
  529. data/ext/share/man/man3/memcached_verbosity.3 +163 -0
  530. data/ext/share/man/man3/memcached_version.3 +176 -0
  531. data/lib/memcached.rb +32 -0
  532. data/lib/memcached/behaviors.rb +77 -0
  533. data/lib/memcached/exceptions.rb +84 -0
  534. data/lib/memcached/experimental.rb +48 -0
  535. data/lib/memcached/memcached.rb +683 -0
  536. data/lib/memcached/rails.rb +200 -0
  537. data/test/test_helper.rb +19 -0
  538. data/test/unit/binding_test.rb +8 -0
  539. data/test/unit/memcached_experimental_test.rb +274 -0
  540. data/test/unit/memcached_test.rb +1340 -0
  541. data/test/unit/rails_test.rb +282 -0
  542. metadata +658 -0
@@ -0,0 +1,1340 @@
1
+
2
+ require File.expand_path("#{File.dirname(__FILE__)}/../test_helper")
3
+
4
+ class MemcachedTest < Test::Unit::TestCase
5
+
6
+ def setup
7
+ @servers = ['localhost:43042', 'localhost:43043', "#{UNIX_SOCKET_NAME}0"]
8
+ @udp_servers = ['localhost:43052', 'localhost:43053']
9
+
10
+ # Maximum allowed prefix key size for :hash_with_prefix_key_key => false
11
+ @prefix_key = 'prefix_key_'
12
+
13
+ @options = {
14
+ :prefix_key => @prefix_key,
15
+ :hash => :default,
16
+ :distribution => :modula,
17
+ :show_backtraces => true}
18
+ @cache = Memcached.new(@servers, @options)
19
+
20
+ @binary_protocol_options = {
21
+ :prefix_key => @prefix_key,
22
+ :hash => :default,
23
+ :distribution => :modula,
24
+ :binary_protocol => true,
25
+ :show_backtraces => true}
26
+ @binary_protocol_cache = Memcached.new(@servers, @binary_protocol_options)
27
+
28
+ @udp_options = {
29
+ :prefix_key => @prefix_key,
30
+ :hash => :default,
31
+ :use_udp => true,
32
+ :distribution => :modula,
33
+ :show_backtraces => true}
34
+ @udp_cache = Memcached.new(@udp_servers, @udp_options)
35
+
36
+ @noblock_options = {
37
+ :prefix_key => @prefix_key,
38
+ :no_block => true,
39
+ :noreply => true,
40
+ :buffer_requests => true,
41
+ :hash => :default,
42
+ :distribution => :modula,
43
+ :show_backtraces => true}
44
+ @noblock_cache = Memcached.new(@servers, @noblock_options)
45
+
46
+ @value = OpenStruct.new(:a => 1, :b => 2, :c => GenericClass)
47
+ @marshalled_value = Marshal.dump(@value)
48
+ end
49
+
50
+ # Initialize
51
+
52
+ def test_initialize
53
+ cache = Memcached.new @servers, :prefix_key => 'test'
54
+ assert_equal 'test', cache.prefix_key
55
+ assert_equal 3, cache.send(:server_structs).size
56
+ assert_equal 'localhost', cache.send(:server_structs).first.hostname
57
+ assert_equal 43042, cache.send(:server_structs).first.port
58
+ end
59
+
60
+ def test_initialize_with_ip_addresses
61
+ cache = Memcached.new ['127.0.0.1:43042', '127.0.0.1:43043']
62
+ assert_equal '127.0.0.1', cache.send(:server_structs).first.hostname
63
+ assert_equal '127.0.0.1', cache.send(:server_structs).last.hostname
64
+ end
65
+
66
+ def test_initialize_without_port
67
+ cache = Memcached.new ['localhost']
68
+ assert_equal 'localhost', cache.send(:server_structs).first.hostname
69
+ assert_equal 11211, cache.send(:server_structs).first.port
70
+ end
71
+
72
+ def test_initialize_with_ports_and_weights
73
+ cache = Memcached.new ['localhost:43042:2', 'localhost:43043:10']
74
+ assert_equal 2, cache.send(:server_structs).first.weight
75
+ assert_equal 43043, cache.send(:server_structs).last.port
76
+ assert_equal 10, cache.send(:server_structs).last.weight
77
+ end
78
+
79
+ def test_initialize_with_hostname_only
80
+ addresses = (1..8).map { |i| "app-cache-%02d" % i }
81
+ cache = Memcached.new(addresses)
82
+ addresses.each_with_index do |address, index|
83
+ assert_equal address, cache.send(:server_structs)[index].hostname
84
+ assert_equal 11211, cache.send(:server_structs)[index].port
85
+ end
86
+ end
87
+
88
+ def test_initialize_with_ip_address_and_options
89
+ cache = Memcached.new '127.0.0.1:43042', :ketama_weighted => false
90
+ assert_equal '127.0.0.1', cache.send(:server_structs).first.hostname
91
+ assert_equal false, cache.options[:ketama_weighted]
92
+ end
93
+
94
+ def test_options_are_set
95
+ Memcached::DEFAULTS.merge(@noblock_options).each do |key, expected|
96
+ value = @noblock_cache.options[key]
97
+ unless key == :rcv_timeout or key == :poll_timeout or key == :prefix_key or key == :ketama_weighted
98
+ assert(expected == value, "#{key} should be #{expected} but was #{value}")
99
+ end
100
+ end
101
+ end
102
+
103
+ def test_options_are_frozen
104
+ assert_raise(TypeError, RuntimeError) do
105
+ @cache.options[:no_block] = true
106
+ end
107
+ end
108
+
109
+ def test_behaviors_are_set
110
+ Memcached::BEHAVIORS.keys.each do |key, value|
111
+ assert_not_nil @cache.send(:get_behavior, key)
112
+ end
113
+ end
114
+
115
+ def test_initialize_with_invalid_server_strings
116
+ assert_raise(ArgumentError) { Memcached.new ":43042" }
117
+ assert_raise(ArgumentError) { Memcached.new "localhost:memcached" }
118
+ assert_raise(ArgumentError) { Memcached.new "local host:43043:1" }
119
+ end
120
+
121
+ def test_initialize_with_invalid_options
122
+ assert_raise(ArgumentError) do
123
+ Memcached.new @servers, :sort_hosts => true, :distribution => :consistent
124
+ end
125
+ end
126
+
127
+ def test_initialize_with_invalid_prefix_key
128
+ assert_raise(ArgumentError) do
129
+ Memcached.new @servers, :prefix_key => "x" * 128
130
+ end
131
+ end
132
+
133
+ def test_initialize_without_prefix_key
134
+ cache = Memcached.new @servers
135
+ assert_equal 3, cache.send(:server_structs).size
136
+ end
137
+
138
+ def test_set_prefix_key
139
+ cache = Memcached.new @servers, :prefix_key => "foo"
140
+ cache.set_prefix_key("bar")
141
+ assert_equal "bar", cache.prefix_key
142
+ end
143
+
144
+ def test_set_prefix_key_to_empty_string
145
+ cache = Memcached.new @servers, :prefix_key => "foo"
146
+ cache.set_prefix_key("")
147
+ assert_equal "", cache.prefix_key
148
+ end
149
+
150
+ def test_memcached_callback_set_with_empty_string_should_not_raise_exception
151
+ cache = Memcached.new @servers, :prefix_key => "foo"
152
+ assert_nothing_raised do
153
+ cache.set_prefix_key("")
154
+ end
155
+ end
156
+
157
+ def test_initialize_negative_behavior
158
+ cache = Memcached.new @servers,
159
+ :buffer_requests => false
160
+ assert_nothing_raised do
161
+ cache.set key, @value
162
+ end
163
+ end
164
+
165
+ def test_initialize_without_backtraces
166
+ cache = Memcached.new @servers,
167
+ :show_backtraces => false
168
+ cache.delete key rescue
169
+ begin
170
+ cache.get key
171
+ rescue Memcached::NotFound => e
172
+ assert e.backtrace.empty?
173
+ end
174
+ begin
175
+ cache.append key, @value
176
+ rescue Memcached::NotStored => e
177
+ assert e.backtrace.empty?
178
+ end
179
+ end
180
+
181
+ def test_initialize_with_backtraces
182
+ cache = Memcached.new @servers, :show_backtraces => true
183
+ cache.delete key rescue nil
184
+ begin
185
+ cache.get key
186
+ rescue Memcached::NotFound => e
187
+ assert !e.backtrace.empty?
188
+ end
189
+ end
190
+
191
+ def test_initialize_sort_hosts
192
+ # Original
193
+ cache = Memcached.new(@servers.sort,
194
+ :sort_hosts => false,
195
+ :distribution => :modula
196
+ )
197
+ assert_equal @servers.sort,
198
+ cache.servers
199
+
200
+ # Original with sort_hosts
201
+ cache = Memcached.new(@servers.sort,
202
+ :sort_hosts => true,
203
+ :distribution => :modula
204
+ )
205
+ assert_equal @servers.sort,
206
+ cache.servers
207
+
208
+ # Reversed
209
+ cache = Memcached.new(@servers.sort.reverse,
210
+ :sort_hosts => false,
211
+ :distribution => :modula
212
+ )
213
+ assert_equal @servers.sort.reverse,
214
+ cache.servers
215
+
216
+ # Reversed with sort_hosts
217
+ cache = Memcached.new(@servers.sort.reverse,
218
+ :sort_hosts => true,
219
+ :distribution => :modula
220
+ )
221
+ assert_equal @servers.sort,
222
+ cache.servers
223
+ end
224
+
225
+ def test_initialize_single_server
226
+ cache = Memcached.new 'localhost:43042'
227
+ assert_equal 1, cache.send(:server_structs).size
228
+ end
229
+
230
+ def test_initialize_strange_argument
231
+ assert_raise(ArgumentError) { Memcached.new 1 }
232
+ end
233
+
234
+ # Get
235
+
236
+ def test_get
237
+ @cache.set key, @value
238
+ assert_equal @value, @cache.get(key)
239
+ assert_equal @value, @binary_protocol_cache.get(key)
240
+
241
+ @udp_cache.set(key, @value)
242
+ assert_raises(Memcached::ActionNotSupported) do
243
+ @udp_cache.get(key)
244
+ end
245
+ end
246
+
247
+ def test_get_nil
248
+ @cache.set key, nil, 0
249
+ result = @cache.get key
250
+ assert_equal nil, result
251
+ end
252
+
253
+ def test_get_from_last
254
+ cache = Memcached.new(@servers, :distribution => :random)
255
+ 10.times { |n| cache.set key, n }
256
+ 10.times do
257
+ assert_equal cache.get(key), cache.get_from_last(key)
258
+ end
259
+ end
260
+
261
+ def test_get_missing
262
+ @cache.delete key rescue nil
263
+ assert_raise(Memcached::NotFound) do
264
+ result = @cache.get key
265
+ end
266
+ end
267
+
268
+ def test_get_with_server_timeout
269
+ socket = stub_server 43047
270
+ cache = Memcached.new("localhost:43047:1", :timeout => 0.5, :exception_retry_limit => 0)
271
+ assert 0.49 < (Benchmark.measure do
272
+ assert_raise(Memcached::ATimeoutOccurred) do
273
+ result = cache.get key
274
+ end
275
+ end).real
276
+
277
+ cache = Memcached.new("localhost:43047:1", :poll_timeout => 0.001, :rcv_timeout => 0.5, :exception_retry_limit => 0)
278
+ assert 0.49 < (Benchmark.measure do
279
+ assert_raise(Memcached::ATimeoutOccurred) do
280
+ result = cache.get key
281
+ end
282
+ end).real
283
+
284
+ cache = Memcached.new("localhost:43047:1", :poll_timeout => 0.25, :rcv_timeout => 0.25, :exception_retry_limit => 0)
285
+ assert 0.51 > (Benchmark.measure do
286
+ assert_raise(Memcached::ATimeoutOccurred) do
287
+ result = cache.get key
288
+ end
289
+ end).real
290
+
291
+ socket.close
292
+ end
293
+
294
+ def test_get_with_no_block_server_timeout
295
+ socket = stub_server 43048
296
+ cache = Memcached.new("localhost:43048:1", :no_block => true, :timeout => 0.25, :exception_retry_limit => 0)
297
+ assert 0.24 < (Benchmark.measure do
298
+ assert_raise(Memcached::ATimeoutOccurred) do
299
+ result = cache.get key
300
+ end
301
+ end).real
302
+
303
+ cache = Memcached.new("localhost:43048:1", :no_block => true, :poll_timeout => 0.25, :rcv_timeout => 0.001, :exception_retry_limit => 0)
304
+ assert 0.24 < (Benchmark.measure do
305
+ assert_raise(Memcached::ATimeoutOccurred) do
306
+ result = cache.get key
307
+ end
308
+ end).real
309
+
310
+ cache = Memcached.new("localhost:43048:1", :no_block => true,
311
+ :poll_timeout => 0.001,
312
+ :rcv_timeout => 0.25, # No affect in no-block mode
313
+ :exception_retry_limit => 0
314
+ )
315
+ assert 0.24 > (Benchmark.measure do
316
+ assert_raise(Memcached::ATimeoutOccurred) do
317
+ result = cache.get key
318
+ end
319
+ end).real
320
+
321
+ socket.close
322
+ end
323
+
324
+ def test_get_with_prefix_key
325
+ # Prefix_key
326
+ cache = Memcached.new(
327
+ # We can only use one server because the key is hashed separately from the prefix key
328
+ @servers.first,
329
+ :prefix_key => @prefix_key,
330
+ :hash => :default,
331
+ :distribution => :modula
332
+ )
333
+ cache.set key, @value
334
+ assert_equal @value, cache.get(key)
335
+
336
+ # No prefix_key specified
337
+ cache = Memcached.new(
338
+ @servers.first,
339
+ :hash => :default,
340
+ :distribution => :modula
341
+ )
342
+ assert_nothing_raised do
343
+ assert_equal @value, cache.get("#{@prefix_key}#{key}")
344
+ end
345
+ end
346
+
347
+ def test_values_with_null_characters_are_not_truncated
348
+ value = OpenStruct.new(:a => Object.new) # Marshals with a null \000
349
+ @cache.set key, value
350
+ result = @cache.get key, false
351
+ non_wrapped_result = Rlibmemcached.memcached_get(
352
+ @cache.instance_variable_get("@struct"),
353
+ key
354
+ ).first
355
+ assert result.size > non_wrapped_result.size
356
+ end
357
+
358
+ def test_get_multi
359
+ @cache.set "#{key}_1", 1
360
+ @cache.set "#{key}_2", 2
361
+ assert_equal({"#{key}_1" => 1, "#{key}_2" => 2},
362
+ @cache.get(["#{key}_1", "#{key}_2"]))
363
+ end
364
+
365
+ def test_get_multi_missing
366
+ @cache.set "#{key}_1", 1
367
+ @cache.delete "#{key}_2" rescue nil
368
+ @cache.set "#{key}_3", 3
369
+ @cache.delete "#{key}_4" rescue nil
370
+ assert_equal(
371
+ {"test_get_multi_missing_3"=>3, "test_get_multi_missing_1"=>1},
372
+ @cache.get(["#{key}_1", "#{key}_2", "#{key}_3", "#{key}_4"])
373
+ )
374
+ end
375
+
376
+ def test_get_multi_binary
377
+ @binary_protocol_cache.set "#{key}_1", 1
378
+ @binary_protocol_cache.delete "#{key}_2" rescue nil
379
+ @binary_protocol_cache.set "#{key}_3", 3
380
+ assert_equal(
381
+ {"test_get_multi_binary_3"=>3, "test_get_multi_binary_1"=>1},
382
+ @binary_protocol_cache.get(["#{key}_1", "#{key}_2", "#{key}_3"])
383
+ )
384
+ end
385
+
386
+ def test_get_multi_binary_one_record_missing
387
+ @binary_protocol_cache.delete("magic_key") rescue nil
388
+ assert_equal({}, @binary_protocol_cache.get(["magic_key"]))
389
+ end
390
+
391
+ def test_get_multi_binary_one_record
392
+ @binary_protocol_cache.set("magic_key", 1)
393
+ assert_equal({"magic_key" => 1}, @binary_protocol_cache.get(["magic_key"]))
394
+ end
395
+
396
+ def test_get_multi_completely_missing
397
+ @cache.delete "#{key}_1" rescue nil
398
+ @cache.delete "#{key}_2" rescue nil
399
+ assert_equal(
400
+ {},
401
+ @cache.get(["#{key}_1", "#{key}_2"])
402
+ )
403
+ end
404
+
405
+ def test_get_multi_empty_string
406
+ @cache.set "#{key}_1", "", 0, false
407
+ assert_equal({"#{key}_1" => ""},
408
+ @cache.get(["#{key}_1"], false))
409
+ end
410
+
411
+ def test_get_multi_checks_types
412
+ assert_raises(TypeError, ArgumentError) do
413
+ @cache.get([nil])
414
+ end
415
+ end
416
+
417
+ def test_set_and_get_unmarshalled
418
+ @cache.set key, @value
419
+ result = @cache.get key, false
420
+ assert_equal @marshalled_value, result
421
+ end
422
+
423
+ def test_set_unmarshalled_and_get_unmarshalled
424
+ @cache.set key, @marshalled_value, 0, false
425
+ result = @cache.get key, false
426
+ assert_equal @marshalled_value, result
427
+ end
428
+
429
+ def test_set_unmarshalled_error
430
+ assert_raises(TypeError) do
431
+ @cache.set key, @value, 0, false
432
+ end
433
+ end
434
+
435
+ def test_get_multi_unmarshalled
436
+ @cache.set "#{key}_1", "1", 0, false
437
+ @cache.set "#{key}_2", "2", 0, false
438
+ assert_equal(
439
+ {"#{key}_1" => "1", "#{key}_2" => "2"},
440
+ @cache.get(["#{key}_1", "#{key}_2"], false)
441
+ )
442
+ end
443
+
444
+ def test_get_multi_mixed_marshalling
445
+ @cache.set "#{key}_1", 1
446
+ @cache.set "#{key}_2", "2", 0, false
447
+ assert_nothing_raised do
448
+ @cache.get(["#{key}_1", "#{key}_2"], false)
449
+ end
450
+ assert_raise(ArgumentError, TypeError) do
451
+ @cache.get(["#{key}_1", "#{key}_2"])
452
+ end
453
+ end
454
+
455
+ def test_random_distribution_is_statistically_random
456
+ cache = Memcached.new(@servers, :distribution => :random)
457
+ read_cache = Memcached.new(@servers.first)
458
+ hits = 4
459
+
460
+ while hits == 4 do
461
+ cache.flush
462
+ 20.times do |i|
463
+ cache.set "#{key}#{i}", @value
464
+ end
465
+
466
+ hits = 0
467
+ 20.times do |i|
468
+ begin
469
+ read_cache.get "#{key}#{i}"
470
+ hits += 1
471
+ rescue Memcached::NotFound
472
+ end
473
+ end
474
+ end
475
+
476
+ assert_not_equal 4, hits
477
+ end
478
+
479
+ # Set
480
+
481
+ def test_set
482
+ assert_nothing_raised do
483
+ @cache.set(key, @value)
484
+ end
485
+
486
+ assert_nothing_raised do
487
+ @binary_protocol_cache.set(key, @value)
488
+ end
489
+
490
+ assert_nothing_raised do
491
+ @udp_cache.set(key, @value)
492
+ end
493
+ end
494
+
495
+ def test_set_expiry
496
+ @cache.set key, @value, 1
497
+ assert_nothing_raised do
498
+ @cache.get key
499
+ end
500
+ sleep(2)
501
+ assert_raise(Memcached::NotFound) do
502
+ @cache.get key
503
+ end
504
+
505
+ assert_raise(TypeError) do
506
+ @cache.set key, @value, Time.now
507
+ end
508
+ end
509
+
510
+ def test_set_with_default_ttl
511
+ cache = Memcached.new(
512
+ @servers,
513
+ :default_ttl => 1
514
+ )
515
+ cache.set key, @value
516
+ assert_nothing_raised do
517
+ cache.get key
518
+ end
519
+ sleep(2)
520
+ assert_raise(Memcached::NotFound) do
521
+ cache.get key
522
+ end
523
+ end
524
+
525
+ def disabled_test_set_retry_on_client_error
526
+ # FIXME Test passes, but Mocha doesn't restore the original method properly
527
+ Rlibmemcached.stubs(:memcached_set).raises(Memcached::ClientError)
528
+ Rlibmemcached.stubs(:memcached_set).returns(0)
529
+
530
+ assert_nothing_raised do
531
+ @cache.set(key, @value)
532
+ end
533
+ end
534
+
535
+ # Delete
536
+
537
+ def test_delete
538
+ @cache.set key, @value
539
+ @cache.delete key
540
+ assert_raise(Memcached::NotFound) do
541
+ @cache.get key
542
+ end
543
+
544
+ @binary_protocol_cache.set key, @value
545
+ @binary_protocol_cache.delete key
546
+ assert_raise(Memcached::NotFound) do
547
+ @binary_protocol_cache.get key
548
+ end
549
+ end
550
+
551
+ def test_missing_delete
552
+ @cache.delete key rescue nil
553
+ assert_raise(Memcached::NotFound) do
554
+ @cache.delete key
555
+ end
556
+ end
557
+
558
+ # Flush
559
+
560
+ def test_flush
561
+ @cache.set key, @value
562
+ assert_equal @value,
563
+ @cache.get(key)
564
+ @cache.flush
565
+ assert_raise(Memcached::NotFound) do
566
+ @cache.get key
567
+ end
568
+ end
569
+
570
+ # Add
571
+
572
+ def test_add
573
+ @cache.delete key rescue nil
574
+ @cache.add key, @value
575
+ assert_equal @value, @cache.get(key)
576
+ end
577
+
578
+ def test_existing_add
579
+ @cache.set key, @value
580
+ assert_raise(Memcached::NotStored) do
581
+ @cache.add key, @value
582
+ end
583
+ end
584
+
585
+ def test_add_expiry
586
+ @cache.delete key rescue nil
587
+ @cache.set key, @value, 1
588
+ assert_nothing_raised do
589
+ @cache.get key
590
+ end
591
+ sleep(1)
592
+ assert_raise(Memcached::NotFound) do
593
+ @cache.get key
594
+ end
595
+ end
596
+
597
+ def test_unmarshalled_add
598
+ @cache.delete key rescue nil
599
+ @cache.add key, @marshalled_value, 0, false
600
+ assert_equal @marshalled_value, @cache.get(key, false)
601
+ assert_equal @value, @cache.get(key)
602
+ end
603
+
604
+ # Increment and decrement
605
+
606
+ def test_increment
607
+ @cache.set key, "10", 0, false
608
+ assert_equal 11, @cache.increment(key)
609
+ end
610
+
611
+ def test_increment_binary
612
+ @binary_protocol_cache.set key, "10", 0, false
613
+ assert_equal 11, @binary_protocol_cache.increment(key)
614
+ end
615
+
616
+ def test_increment_offset
617
+ @cache.set key, "10", 0, false
618
+ assert_equal 15, @cache.increment(key, 5)
619
+ end
620
+
621
+ def test_missing_increment
622
+ @cache.delete key rescue nil
623
+ assert_raise(Memcached::NotFound) do
624
+ @cache.increment key
625
+ end
626
+ end
627
+
628
+ def test_decrement
629
+ @cache.set key, "10", 0, false
630
+ assert_equal 9, @cache.decrement(key)
631
+ end
632
+
633
+ def test_decrement_binary
634
+ @binary_protocol_cache.set key, "10", 0, false
635
+ assert_equal 9, @binary_protocol_cache.decrement(key)
636
+ end
637
+
638
+ def test_decrement_offset
639
+ @cache.set key, "10", 0, false
640
+ assert_equal 5, @cache.decrement(key, 5)
641
+ end
642
+
643
+ def test_missing_decrement
644
+ @cache.delete key rescue nil
645
+ assert_raise(Memcached::NotFound) do
646
+ @cache.decrement key
647
+ end
648
+ end
649
+
650
+ # Exist
651
+
652
+ def test_missing_exist
653
+ assert_raise(Memcached::NotFound) do
654
+ @cache.exist key
655
+ end
656
+ end
657
+
658
+ def test_exist
659
+ @cache.set key, @value
660
+ assert_nil @cache.exist(key)
661
+ end
662
+
663
+ def test_missing_exist_binary
664
+ assert_raise(Memcached::NotFound) do
665
+ @binary_protocol_cache.exist key
666
+ end
667
+ end
668
+
669
+ def test_exist_binary
670
+ @binary_protocol_cache.set key, @value
671
+ assert_nil @binary_protocol_cache.exist(key)
672
+ end
673
+
674
+ # Replace
675
+
676
+ def test_replace
677
+ @cache.set key, nil
678
+ assert_nothing_raised do
679
+ @cache.replace key, @value
680
+ end
681
+ assert_equal @value, @cache.get(key)
682
+ end
683
+
684
+ def test_missing_replace
685
+ @cache.delete key rescue nil
686
+ assert_raise(Memcached::NotStored) do
687
+ @cache.replace key, @value
688
+ end
689
+ assert_raise(Memcached::NotFound) do
690
+ assert_equal @value, @cache.get(key)
691
+ end
692
+ end
693
+
694
+ # Append and prepend
695
+
696
+ def test_append
697
+ @cache.set key, "start", 0, false
698
+ assert_nothing_raised do
699
+ @cache.append key, "end"
700
+ end
701
+ assert_equal "startend", @cache.get(key, false)
702
+
703
+ @binary_protocol_cache.set key, "start", 0, false
704
+ assert_nothing_raised do
705
+ @binary_protocol_cache.append key, "end"
706
+ end
707
+ assert_equal "startend", @binary_protocol_cache.get(key, false)
708
+ end
709
+
710
+ def test_missing_append
711
+ @cache.delete key rescue nil
712
+ assert_raise(Memcached::NotStored) do
713
+ @cache.append key, "end"
714
+ end
715
+ assert_raise(Memcached::NotFound) do
716
+ assert_equal @value, @cache.get(key)
717
+ end
718
+
719
+ @binary_protocol_cache.delete key rescue nil
720
+ assert_raise(Memcached::NotStored) do
721
+ @binary_protocol_cache.append key, "end"
722
+ end
723
+ assert_raise(Memcached::NotFound) do
724
+ assert_equal @value, @binary_protocol_cache.get(key)
725
+ end
726
+ end
727
+
728
+ def test_prepend
729
+ @cache.set key, "end", 0, false
730
+ assert_nothing_raised do
731
+ @cache.prepend key, "start"
732
+ end
733
+ assert_equal "startend", @cache.get(key, false)
734
+ end
735
+
736
+ def test_missing_prepend
737
+ @cache.delete key rescue nil
738
+ assert_raise(Memcached::NotStored) do
739
+ @cache.prepend key, "end"
740
+ end
741
+ assert_raise(Memcached::NotFound) do
742
+ assert_equal @value, @cache.get(key)
743
+ end
744
+ end
745
+
746
+ def test_cas
747
+ cache = Memcached.new(
748
+ @servers,
749
+ :prefix_key => @prefix_key,
750
+ :support_cas => true
751
+ )
752
+ value2 = OpenStruct.new(:d => 3, :e => 4, :f => GenericClass)
753
+
754
+ # Existing set
755
+ cache.set key, @value
756
+ cache.cas(key) do |current|
757
+ assert_equal @value, current
758
+ value2
759
+ end
760
+ assert_equal value2, cache.get(key)
761
+
762
+ # Existing test without marshalling
763
+ cache.set(key, "foo", 0, false)
764
+ cache.cas(key, 0, false) do |current|
765
+ "#{current}bar"
766
+ end
767
+ assert_equal "foobar", cache.get(key, false)
768
+
769
+ # Missing set
770
+ cache.delete key
771
+ assert_raises(Memcached::NotFound) do
772
+ cache.cas(key) {}
773
+ end
774
+
775
+ # Conflicting set
776
+ cache.set key, @value
777
+ assert_raises(Memcached::ConnectionDataExists) do
778
+ cache.cas(key) do |current|
779
+ cache.set key, value2
780
+ current
781
+ end
782
+ end
783
+ end
784
+
785
+ # Error states
786
+
787
+ def test_key_with_spaces
788
+ key = "i have a space"
789
+ assert_raises(Memcached::ABadKeyWasProvidedOrCharactersOutOfRange) do
790
+ @cache.set key, @value
791
+ end
792
+ assert_raises(Memcached::ABadKeyWasProvidedOrCharactersOutOfRange) do
793
+ @cache.get(key)
794
+ end
795
+ end
796
+
797
+ def test_key_with_null
798
+ key = "with\000null"
799
+ assert_raises(Memcached::ABadKeyWasProvidedOrCharactersOutOfRange) do
800
+ @cache.set key, @value
801
+ end
802
+ assert_raises(Memcached::ABadKeyWasProvidedOrCharactersOutOfRange) do
803
+ @cache.get(key)
804
+ end
805
+
806
+ assert_raises(Memcached::ABadKeyWasProvidedOrCharactersOutOfRange) do
807
+ response = @cache.get([key])
808
+ end
809
+ end
810
+
811
+ def test_key_with_invalid_control_characters
812
+ key = "ch\303\242teau"
813
+ assert_raises(Memcached::ABadKeyWasProvidedOrCharactersOutOfRange) do
814
+ @cache.set key, @value
815
+ end
816
+ assert_raises(Memcached::ABadKeyWasProvidedOrCharactersOutOfRange) do
817
+ @cache.get(key)
818
+ end
819
+
820
+ assert_raises(Memcached::ABadKeyWasProvidedOrCharactersOutOfRange) do
821
+ response = @cache.get([key])
822
+ end
823
+ end
824
+
825
+ def test_key_too_long
826
+ key = "x"*251
827
+ assert_raises(Memcached::ABadKeyWasProvidedOrCharactersOutOfRange) do
828
+ @cache.set key, @value
829
+ end
830
+ assert_raises(Memcached::ABadKeyWasProvidedOrCharactersOutOfRange) do
831
+ @cache.get(key)
832
+ end
833
+ assert_raises(Memcached::ABadKeyWasProvidedOrCharactersOutOfRange) do
834
+ @cache.get([key])
835
+ end
836
+ end
837
+
838
+ def test_verify_key_disabled
839
+ cache = Memcached.new @servers, :verify_key => false
840
+ key = "i have a space"
841
+ assert_raises(Memcached::ProtocolError) do
842
+ cache.set key, @value
843
+ end
844
+ assert_raises(Memcached::NotFound) do
845
+ cache.get key, @value
846
+ end
847
+ end
848
+
849
+ def test_key_error_message
850
+ key = "i have a space"
851
+ @cache.get key, @value
852
+ assert false # Never reached
853
+ rescue Memcached::ABadKeyWasProvidedOrCharactersOutOfRange => e
854
+ assert_match /#{key}/, e.message
855
+ end
856
+
857
+ def test_server_error_message
858
+ assert_raises(Memcached::NotStored) do
859
+ @cache.set key, "I'm big" * 1000000
860
+ end
861
+ end
862
+
863
+ def test_errno_message
864
+ Rlibmemcached::MemcachedServerSt.any_instance.stubs("cached_errno").returns(1)
865
+ @cache.send(:check_return_code, Rlibmemcached::MEMCACHED_ERRNO, key)
866
+ rescue Memcached::SystemError => e
867
+ assert_match /^Errno 1: "Operation not permitted". Key/, e.message
868
+ end
869
+
870
+ # Stats
871
+
872
+ def disable_test_stats
873
+ stats = @cache.stats
874
+ assert_equal 3, stats[:pid].size
875
+ assert_instance_of Fixnum, stats[:pid].first
876
+ assert_instance_of String, stats[:version].first
877
+
878
+ stats = @binary_protocol_cache.stats
879
+ assert_equal 3, stats[:pid].size
880
+ assert_instance_of Fixnum, stats[:pid].first
881
+ assert_instance_of String, stats[:version].first
882
+
883
+ assert_nothing_raised do
884
+ @noblock_cache.stats
885
+ end
886
+ assert_raises(TypeError) do
887
+ @udp_cache.stats
888
+ end
889
+ end
890
+
891
+ def test_missing_stats
892
+ cache = Memcached.new('localhost:43041')
893
+ assert_raises(Memcached::SomeErrorsWereReported) { cache.stats }
894
+ end
895
+
896
+ # Clone
897
+
898
+ def test_clone
899
+ cache = @cache.clone
900
+ assert_equal cache.servers, @cache.servers
901
+ assert_not_equal cache, @cache
902
+
903
+ # Definitely check that the structs are unlinked
904
+ assert_not_equal @cache.instance_variable_get('@struct').object_id,
905
+ cache.instance_variable_get('@struct').object_id
906
+
907
+ assert_nothing_raised do
908
+ @cache.set key, @value
909
+ end
910
+ end
911
+
912
+ # Pipelined, non-blocking IO
913
+
914
+ def test_buffered_requests_return_value
915
+ cache = Memcached.new @servers,
916
+ :buffer_requests => true
917
+ assert_nothing_raised do
918
+ cache.set key, @value
919
+ end
920
+ ret = Rlibmemcached.memcached_set(
921
+ cache.instance_variable_get("@struct"),
922
+ key,
923
+ @marshalled_value,
924
+ 0,
925
+ Memcached::FLAGS
926
+ )
927
+ assert_equal Rlibmemcached::MEMCACHED_BUFFERED, ret
928
+ end
929
+
930
+ def test_no_block_return_value
931
+ assert_nothing_raised do
932
+ @noblock_cache.set key, @value
933
+ end
934
+ ret = Rlibmemcached.memcached_set(
935
+ @noblock_cache.instance_variable_get("@struct"),
936
+ key,
937
+ @marshalled_value,
938
+ 0,
939
+ Memcached::FLAGS
940
+ )
941
+ assert_equal Rlibmemcached::MEMCACHED_BUFFERED, ret
942
+ end
943
+
944
+ def test_no_block_prepend
945
+ @cache.set key, "help", 0, false
946
+ @noblock_cache.prepend key, "help"
947
+ assert_equal "help",
948
+ @cache.get(key, false)
949
+ @noblock_cache.get "no_exist", false rescue nil
950
+ assert_equal "helphelp",
951
+ @cache.get(key, false)
952
+ end
953
+
954
+ def test_no_block_get
955
+ @noblock_cache.set key, @value
956
+ assert_equal @value,
957
+ @noblock_cache.get(key)
958
+ end
959
+
960
+ def test_no_block_missing_delete
961
+ @noblock_cache.delete key rescue nil
962
+ assert_nothing_raised do
963
+ @noblock_cache.delete key
964
+ @noblock_cache.delete key
965
+ end
966
+ end
967
+
968
+ def test_no_block_set_invalid_key
969
+ assert_raises(Memcached::ABadKeyWasProvidedOrCharactersOutOfRange) do
970
+ @noblock_cache.set "I'm so bad", @value
971
+ end
972
+ end
973
+
974
+ def test_no_block_set_object_too_large
975
+ assert_raise( Memcached::NotStored) do
976
+ @noblock_cache.set key, "I'm big" * 1000000
977
+ end
978
+ end
979
+
980
+ def test_no_block_existing_add
981
+ # Should still raise
982
+ noblock_cache = Memcached.new(@servers, @noblock_options.merge(:noreply => false))
983
+ noblock_cache.set key, @value
984
+ assert_raise(Memcached::NotStored) do
985
+ noblock_cache.add key, @value
986
+ end
987
+ end
988
+
989
+ # Server removal and consistent hashing
990
+
991
+ def test_unresponsive_server
992
+ socket = stub_server 43041
993
+
994
+ cache = Memcached.new(
995
+ [@servers.last, 'localhost:43041'],
996
+ :prefix_key => @prefix_key,
997
+ :auto_eject_hosts => true,
998
+ :server_failure_limit => 2,
999
+ :retry_timeout => 1,
1000
+ :hash_with_prefix_key => false,
1001
+ :hash => :md5,
1002
+ :exception_retry_limit => 0
1003
+ )
1004
+
1005
+ # Hit second server up to the server_failure_limit
1006
+ key2 = 'test_missing_server'
1007
+ assert_raise(Memcached::ATimeoutOccurred) { cache.set(key2, @value) }
1008
+ assert_raise(Memcached::ATimeoutOccurred) { cache.get(key2, @value) }
1009
+
1010
+ # Hit second server and pass the limit
1011
+ key2 = 'test_missing_server'
1012
+ begin
1013
+ cache.get(key2)
1014
+ rescue => e
1015
+ assert_equal Memcached::ServerIsMarkedDead, e.class
1016
+ assert_match /localhost:43041/, e.message
1017
+ end
1018
+
1019
+ # Hit first server on retry
1020
+ assert_nothing_raised do
1021
+ cache.set(key2, @value)
1022
+ assert_equal cache.get(key2), @value
1023
+ end
1024
+
1025
+ sleep(2)
1026
+
1027
+ # Hit second server again after restore, expect same failure
1028
+ key2 = 'test_missing_server'
1029
+ assert_raise(Memcached::ATimeoutOccurred) do
1030
+ cache.set(key2, @value)
1031
+ end
1032
+
1033
+ socket.close
1034
+ end
1035
+
1036
+ def test_unresponsive_server_retries_greater_than_server_failure_limit
1037
+ socket = stub_server 43041
1038
+
1039
+ cache = Memcached.new(
1040
+ [@servers.last, 'localhost:43041'],
1041
+ :prefix_key => @prefix_key,
1042
+ :auto_eject_hosts => true,
1043
+ :server_failure_limit => 2,
1044
+ :retry_timeout => 1,
1045
+ :hash_with_prefix_key => false,
1046
+ :hash => :md5,
1047
+ :exception_retry_limit => 3
1048
+ )
1049
+
1050
+ key2 = 'test_missing_server'
1051
+ assert_nothing_raised do
1052
+ cache.set(key2, @value)
1053
+ assert_equal cache.get(key2), @value
1054
+ end
1055
+
1056
+ assert_nothing_raised do
1057
+ cache.set(key2, @value)
1058
+ assert_equal cache.get(key2), @value
1059
+ end
1060
+
1061
+ sleep(2)
1062
+
1063
+ assert_nothing_raised do
1064
+ cache.set(key2, @value)
1065
+ assert_equal cache.get(key2), @value
1066
+ end
1067
+
1068
+ socket.close
1069
+ end
1070
+
1071
+ def test_unresponsive_server_retries_equals_server_failure_limit
1072
+ socket = stub_server 43041
1073
+
1074
+ cache = Memcached.new(
1075
+ [@servers.last, 'localhost:43041'],
1076
+ :prefix_key => @prefix_key,
1077
+ :auto_eject_hosts => true,
1078
+ :server_failure_limit => 2,
1079
+ :retry_timeout => 1,
1080
+ :hash_with_prefix_key => false,
1081
+ :hash => :md5,
1082
+ :exception_retry_limit => 3
1083
+ )
1084
+
1085
+ key2 = 'test_missing_server'
1086
+ begin
1087
+ cache.get(key2)
1088
+ rescue => e
1089
+ assert_equal Memcached::ServerIsMarkedDead, e.class
1090
+ assert_match /localhost:43041/, e.message
1091
+ end
1092
+
1093
+ assert_nothing_raised do
1094
+ cache.set(key2, @value)
1095
+ assert_equal cache.get(key2), @value
1096
+ end
1097
+
1098
+ sleep(2)
1099
+
1100
+ begin
1101
+ cache.get(key2)
1102
+ rescue => e
1103
+ assert_equal Memcached::ServerIsMarkedDead, e.class
1104
+ assert_match /localhost:43041/, e.message
1105
+ end
1106
+
1107
+ assert_nothing_raised do
1108
+ cache.set(key2, @value)
1109
+ assert_equal cache.get(key2), @value
1110
+ end
1111
+
1112
+ socket.close
1113
+ end
1114
+
1115
+ def test_unresponsive_server_retries_less_than_server_failure_limit
1116
+ socket = stub_server 43041
1117
+
1118
+ cache = Memcached.new(
1119
+ [@servers.last, 'localhost:43041'],
1120
+ :prefix_key => @prefix_key,
1121
+ :auto_eject_hosts => true,
1122
+ :server_failure_limit => 2,
1123
+ :retry_timeout => 1,
1124
+ :hash_with_prefix_key => false,
1125
+ :hash => :md5,
1126
+ :exception_retry_limit => 1
1127
+ )
1128
+
1129
+ key2 = 'test_missing_server'
1130
+ assert_raise(Memcached::ATimeoutOccurred) { cache.set(key2, @value) }
1131
+ begin
1132
+ cache.get(key2)
1133
+ rescue => e
1134
+ assert_equal Memcached::ServerIsMarkedDead, e.class
1135
+ assert_match /localhost:43041/, e.message
1136
+ end
1137
+
1138
+ sleep(2)
1139
+
1140
+ assert_raise(Memcached::ATimeoutOccurred) { cache.set(key2, @value) }
1141
+ begin
1142
+ cache.get(key2)
1143
+ rescue => e
1144
+ assert_equal Memcached::ServerIsMarkedDead, e.class
1145
+ assert_match /localhost:43041/, e.message
1146
+ end
1147
+
1148
+ socket.close
1149
+ end
1150
+
1151
+ def test_wrong_failure_counter
1152
+ cache = Memcached.new(
1153
+ [@servers.last],
1154
+ :prefix_key => @prefix_key,
1155
+ :auto_eject_hosts => true,
1156
+ :server_failure_limit => 1,
1157
+ :retry_timeout => 1,
1158
+ :hash_with_prefix_key => false,
1159
+ :hash => :md5,
1160
+ :exception_retry_limit => 0
1161
+ )
1162
+
1163
+ # This is an abuse of knowledge, but it's necessary to verify that
1164
+ # the library is handling the counter properly.
1165
+ struct = cache.instance_variable_get(:@struct)
1166
+ server = Memcached::Lib.memcached_server_by_key(struct, "marmotte").first
1167
+
1168
+ # set to ensure connectivity
1169
+ cache.set("marmotte", "milk")
1170
+ server.server_failure_counter = 0
1171
+ cache.quit
1172
+ assert_equal 0, server.server_failure_counter
1173
+ end
1174
+
1175
+ def test_missing_server
1176
+ cache = Memcached.new(
1177
+ [@servers.last, 'localhost:43041'],
1178
+ :prefix_key => @prefix_key,
1179
+ :auto_eject_hosts => true,
1180
+ :server_failure_limit => 2,
1181
+ :retry_timeout => 1,
1182
+ :hash_with_prefix_key => false,
1183
+ :hash => :md5,
1184
+ :exception_retry_limit => 0
1185
+ )
1186
+
1187
+ # Hit second server up to the server_failure_limit
1188
+ key2 = 'test_missing_server'
1189
+ assert_raise(Memcached::SystemError) { cache.set(key2, @value) }
1190
+ assert_raise(Memcached::SystemError) { cache.get(key2, @value) }
1191
+
1192
+ # Hit second server and pass the limit
1193
+ key2 = 'test_missing_server'
1194
+ begin
1195
+ cache.get(key2)
1196
+ rescue => e
1197
+ assert_equal Memcached::ServerIsMarkedDead, e.class
1198
+ assert_match /localhost:43041/, e.message
1199
+ end
1200
+
1201
+ # Hit first server on retry
1202
+ assert_nothing_raised do
1203
+ cache.set(key2, @value)
1204
+ assert_equal cache.get(key2), @value
1205
+ end
1206
+
1207
+ sleep(2)
1208
+
1209
+ # Hit second server again after restore, expect same failure
1210
+ key2 = 'test_missing_server'
1211
+ assert_raise(Memcached::SystemError) do
1212
+ cache.set(key2, @value)
1213
+ end
1214
+ end
1215
+
1216
+ def test_unresponsive_with_random_distribution
1217
+ socket = stub_server 43041
1218
+ failures = [Memcached::ATimeoutOccurred, Memcached::ServerIsMarkedDead]
1219
+
1220
+ cache = Memcached.new(
1221
+ [@servers.last, 'localhost:43041'],
1222
+ :auto_eject_hosts => true,
1223
+ :distribution => :random,
1224
+ :server_failure_limit => 1,
1225
+ :retry_timeout => 1,
1226
+ :exception_retry_limit => 0
1227
+ )
1228
+
1229
+ # Provoke the errors in 'failures'
1230
+ exceptions = []
1231
+ 100.times { begin; cache.set key, @value; rescue => e; exceptions << e; end }
1232
+ assert_equal failures, exceptions.map { |x| x.class }
1233
+
1234
+ # Hit first server on retry
1235
+ assert_nothing_raised { cache.set(key, @value) }
1236
+
1237
+ # Hit second server again after restore, expect same failures
1238
+ sleep(2)
1239
+ exceptions = []
1240
+ 100.times { begin; cache.set key, @value; rescue => e; exceptions << e; end }
1241
+ assert_equal failures, exceptions.map { |x| x.class }
1242
+
1243
+ socket.close
1244
+ end
1245
+
1246
+ def test_consistent_hashing
1247
+ keys = %w(EN6qtgMW n6Oz2W4I ss4A8Brr QShqFLZt Y3hgP9bs CokDD4OD Nd3iTSE1 24vBV4AU H9XBUQs5 E5j8vUq1 AzSh8fva PYBlK2Pi Ke3TgZ4I AyAIYanO oxj8Xhyd eBFnE6Bt yZyTikWQ pwGoU7Pw 2UNDkKRN qMJzkgo2 keFXbQXq pBl2QnIg ApRl3mWY wmalTJW1 TLueug8M wPQL4Qfg uACwus23 nmOk9R6w lwgZJrzJ v1UJtKdG RK629Cra U2UXFRqr d9OQLNl8 KAm1K3m5 Z13gKZ1v tNVai1nT LhpVXuVx pRib1Itj I1oLUob7 Z1nUsd5Q ZOwHehUa aXpFX29U ZsnqxlGz ivQRjOdb mB3iBEAj)
1248
+
1249
+ # Five servers
1250
+ cache = Memcached.new(
1251
+ @servers + ['localhost:43044', 'localhost:43045', 'localhost:43046'],
1252
+ :prefix_key => @prefix_key
1253
+ )
1254
+
1255
+ cache.flush
1256
+ keys.each do |key|
1257
+ cache.set(key, @value)
1258
+ end
1259
+
1260
+ # Pull a server
1261
+ cache = Memcached.new(
1262
+ @servers + ['localhost:43044', 'localhost:43046'],
1263
+ :prefix_key => @prefix_key
1264
+ )
1265
+
1266
+ failed = 0
1267
+ keys.each_with_index do |key, i|
1268
+ begin
1269
+ cache.get(key)
1270
+ rescue Memcached::NotFound
1271
+ failed += 1
1272
+ end
1273
+ end
1274
+
1275
+ assert(failed < keys.size / 3, "#{failed} failed out of #{keys.size}")
1276
+ end
1277
+
1278
+ # Concurrency
1279
+
1280
+ def test_thread_contention
1281
+ threads = []
1282
+ 4.times do |index|
1283
+ threads << Thread.new do
1284
+ cache = @cache.clone
1285
+ assert_nothing_raised do
1286
+ cache.set("test_thread_contention_#{index}", index)
1287
+ end
1288
+ assert_equal index, cache.get("test_thread_contention_#{index}")
1289
+ end
1290
+ end
1291
+ threads.each {|thread| thread.join}
1292
+ end
1293
+
1294
+ # Hash
1295
+
1296
+ def test_hash
1297
+ assert_equal 3157003241,
1298
+ Rlibmemcached.memcached_generate_hash_rvalue("test", Rlibmemcached::MEMCACHED_HASH_FNV1_32)
1299
+ end
1300
+
1301
+ def test_noop_hash
1302
+ %w[foo bar baz qux quux].each do |word|
1303
+ assert_equal 1,
1304
+ Rlibmemcached.memcached_generate_hash_rvalue(word, Rlibmemcached::MEMCACHED_HASH_NONE)
1305
+ end
1306
+ end
1307
+
1308
+ # Memory cleanup
1309
+
1310
+ def test_reset
1311
+ original_struct = @cache.instance_variable_get("@struct")
1312
+ assert_nothing_raised do
1313
+ @cache.reset
1314
+ end
1315
+ assert_not_equal original_struct,
1316
+ @cache.instance_variable_get("@struct")
1317
+ end
1318
+
1319
+ # NOTE: This breaks encapsulation, but there's no other easy way to test this without
1320
+ # mocking out Rlibmemcached calls
1321
+ def test_reraise_invalid_return_code
1322
+ assert_raise Memcached::Error do
1323
+ @cache.send(:check_return_code, 5000)
1324
+ end
1325
+ end
1326
+
1327
+ private
1328
+
1329
+ def key
1330
+ caller.first[/.*[` ](.*)'/, 1] # '
1331
+ end
1332
+
1333
+ def stub_server(port)
1334
+ socket = TCPServer.new('127.0.0.1', port)
1335
+ Thread.new { socket.accept }
1336
+ socket
1337
+ end
1338
+
1339
+ end
1340
+