libcouchbase 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (561) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +18 -0
  3. data/.gitmodules +3 -0
  4. data/.rspec +1 -0
  5. data/.travis.yml +35 -0
  6. data/Gemfile +4 -0
  7. data/LICENSE +24 -0
  8. data/README.md +389 -0
  9. data/Rakefile +75 -0
  10. data/ext/README.md +6 -0
  11. data/ext/Rakefile +20 -0
  12. data/ext/libcouchbase/.gitignore +130 -0
  13. data/ext/libcouchbase/.travis.yml +19 -0
  14. data/ext/libcouchbase/CMakeLists.txt +429 -0
  15. data/ext/libcouchbase/CONTRIBUTING.md +124 -0
  16. data/ext/libcouchbase/LICENSE +202 -0
  17. data/ext/libcouchbase/README.markdown +163 -0
  18. data/ext/libcouchbase/RELEASE_NOTES.markdown +2691 -0
  19. data/ext/libcouchbase/cmake/Modules/ConfigureDtrace.cmake +27 -0
  20. data/ext/libcouchbase/cmake/Modules/CopyPDB.cmake +42 -0
  21. data/ext/libcouchbase/cmake/Modules/DistScript.cmake +17 -0
  22. data/ext/libcouchbase/cmake/Modules/DownloadLcbDep.cmake +20 -0
  23. data/ext/libcouchbase/cmake/Modules/FindCouchbaseHdrHistogram.cmake +15 -0
  24. data/ext/libcouchbase/cmake/Modules/FindCouchbaseLibev.cmake +73 -0
  25. data/ext/libcouchbase/cmake/Modules/FindCouchbaseLibevent.cmake +52 -0
  26. data/ext/libcouchbase/cmake/Modules/FindCouchbaseLibuv.cmake +56 -0
  27. data/ext/libcouchbase/cmake/Modules/FindCouchbaseSnappy.cmake +11 -0
  28. data/ext/libcouchbase/cmake/Modules/GenerateConfigDotH.cmake +29 -0
  29. data/ext/libcouchbase/cmake/Modules/GetLibcouchbaseFlags.cmake +133 -0
  30. data/ext/libcouchbase/cmake/Modules/GetPlatformCCInfo.cmake +45 -0
  31. data/ext/libcouchbase/cmake/Modules/GetVersionInfo.cmake +70 -0
  32. data/ext/libcouchbase/cmake/config-cmake.h.in +60 -0
  33. data/ext/libcouchbase/cmake/configure +357 -0
  34. data/ext/libcouchbase/cmake/defs.mk.in +8 -0
  35. data/ext/libcouchbase/cmake/dtrace-instr-link.pl +38 -0
  36. data/ext/libcouchbase/cmake/source_files.cmake +73 -0
  37. data/ext/libcouchbase/configure.pl +1 -0
  38. data/ext/libcouchbase/contrib/cJSON/cJSON.c +624 -0
  39. data/ext/libcouchbase/contrib/cJSON/cJSON.h +158 -0
  40. data/ext/libcouchbase/contrib/cbsasl/CMakeLists.txt +9 -0
  41. data/ext/libcouchbase/contrib/cbsasl/COPYING +202 -0
  42. data/ext/libcouchbase/contrib/cbsasl/include/cbsasl/cbsasl.h +217 -0
  43. data/ext/libcouchbase/contrib/cbsasl/src/client.c +205 -0
  44. data/ext/libcouchbase/contrib/cbsasl/src/common.c +46 -0
  45. data/ext/libcouchbase/contrib/cbsasl/src/cram-md5/hmac.c +67 -0
  46. data/ext/libcouchbase/contrib/cbsasl/src/cram-md5/hmac.h +33 -0
  47. data/ext/libcouchbase/contrib/cbsasl/src/cram-md5/md5.c +296 -0
  48. data/ext/libcouchbase/contrib/cbsasl/src/cram-md5/md5.h +45 -0
  49. data/ext/libcouchbase/contrib/cbsasl/src/hash.c +573 -0
  50. data/ext/libcouchbase/contrib/cbsasl/src/hash.h +15 -0
  51. data/ext/libcouchbase/contrib/cbsasl/src/util.h +31 -0
  52. data/ext/libcouchbase/contrib/cliopts/CMakeLists.txt +2 -0
  53. data/ext/libcouchbase/contrib/cliopts/cliopts.c +747 -0
  54. data/ext/libcouchbase/contrib/cliopts/cliopts.h +493 -0
  55. data/ext/libcouchbase/contrib/genhash/genhash.c +372 -0
  56. data/ext/libcouchbase/contrib/genhash/genhash.h +235 -0
  57. data/ext/libcouchbase/contrib/gtest-1.7.0/CHANGES +157 -0
  58. data/ext/libcouchbase/contrib/gtest-1.7.0/CMakeLists.txt +252 -0
  59. data/ext/libcouchbase/contrib/gtest-1.7.0/CONTRIBUTORS +37 -0
  60. data/ext/libcouchbase/contrib/gtest-1.7.0/LICENSE +28 -0
  61. data/ext/libcouchbase/contrib/gtest-1.7.0/MINIFY.sh +15 -0
  62. data/ext/libcouchbase/contrib/gtest-1.7.0/README +435 -0
  63. data/ext/libcouchbase/contrib/gtest-1.7.0/cmake/internal_utils.cmake +227 -0
  64. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-death-test.h +294 -0
  65. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-message.h +250 -0
  66. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-param-test.h +1421 -0
  67. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-param-test.h.pump +487 -0
  68. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-printers.h +855 -0
  69. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-spi.h +232 -0
  70. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-test-part.h +179 -0
  71. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-typed-test.h +259 -0
  72. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest.h +2291 -0
  73. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest_pred_impl.h +358 -0
  74. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest_prod.h +58 -0
  75. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-death-test-internal.h +319 -0
  76. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-filepath.h +206 -0
  77. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-internal.h +1158 -0
  78. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-linked_ptr.h +233 -0
  79. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-param-util-generated.h +5143 -0
  80. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-param-util-generated.h.pump +301 -0
  81. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-param-util.h +619 -0
  82. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-port.h +1947 -0
  83. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-string.h +167 -0
  84. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-tuple.h +1012 -0
  85. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-tuple.h.pump +339 -0
  86. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-type-util.h +3331 -0
  87. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-type-util.h.pump +297 -0
  88. data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-all.cc +48 -0
  89. data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-death-test.cc +1344 -0
  90. data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-filepath.cc +382 -0
  91. data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-internal-inl.h +1218 -0
  92. data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-port.cc +805 -0
  93. data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-printers.cc +363 -0
  94. data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-test-part.cc +110 -0
  95. data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-typed-test.cc +110 -0
  96. data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest.cc +5015 -0
  97. data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest_main.cc +38 -0
  98. data/ext/libcouchbase/contrib/http_parser/LICENSE-MIT +23 -0
  99. data/ext/libcouchbase/contrib/http_parser/README.md +178 -0
  100. data/ext/libcouchbase/contrib/http_parser/http_parser.c +2060 -0
  101. data/ext/libcouchbase/contrib/http_parser/http_parser.h +321 -0
  102. data/ext/libcouchbase/contrib/jsonsl/LICENSE +20 -0
  103. data/ext/libcouchbase/contrib/jsonsl/jsonsl.c +1452 -0
  104. data/ext/libcouchbase/contrib/jsonsl/jsonsl.h +971 -0
  105. data/ext/libcouchbase/contrib/lcb-jsoncpp/CMakeLists.txt +6 -0
  106. data/ext/libcouchbase/contrib/lcb-jsoncpp/LICENSE +55 -0
  107. data/ext/libcouchbase/contrib/lcb-jsoncpp/lcb-jsoncpp-forwards.h +255 -0
  108. data/ext/libcouchbase/contrib/lcb-jsoncpp/lcb-jsoncpp.cpp +4892 -0
  109. data/ext/libcouchbase/contrib/lcb-jsoncpp/lcb-jsoncpp.h +1961 -0
  110. data/ext/libcouchbase/contrib/snappy/CMakeLists.txt +8 -0
  111. data/ext/libcouchbase/contrib/snappy/COPYING +28 -0
  112. data/ext/libcouchbase/contrib/snappy/snappy-c.cc +90 -0
  113. data/ext/libcouchbase/contrib/snappy/snappy-c.h +138 -0
  114. data/ext/libcouchbase/contrib/snappy/snappy-internal.h +150 -0
  115. data/ext/libcouchbase/contrib/snappy/snappy-lcb-msvc.h +5 -0
  116. data/ext/libcouchbase/contrib/snappy/snappy-sinksource.cc +71 -0
  117. data/ext/libcouchbase/contrib/snappy/snappy-sinksource.h +137 -0
  118. data/ext/libcouchbase/contrib/snappy/snappy-stubs-internal.cc +42 -0
  119. data/ext/libcouchbase/contrib/snappy/snappy-stubs-internal.h +491 -0
  120. data/ext/libcouchbase/contrib/snappy/snappy-stubs-public.h +98 -0
  121. data/ext/libcouchbase/contrib/snappy/snappy.cc +1307 -0
  122. data/ext/libcouchbase/contrib/snappy/snappy.h +184 -0
  123. data/ext/libcouchbase/contrib/win32-defs/iocpdefs.h +133 -0
  124. data/ext/libcouchbase/contrib/win32-defs/mingwdefs.h +4396 -0
  125. data/ext/libcouchbase/contrib/win32-defs/win_stdint.h +258 -0
  126. data/ext/libcouchbase/example/CMakeLists.txt +37 -0
  127. data/ext/libcouchbase/example/README.markdown +47 -0
  128. data/ext/libcouchbase/example/db/db.c +167 -0
  129. data/ext/libcouchbase/example/db/vb.c +227 -0
  130. data/ext/libcouchbase/example/instancepool/main.cc +102 -0
  131. data/ext/libcouchbase/example/instancepool/pool.cc +102 -0
  132. data/ext/libcouchbase/example/instancepool/pool.h +69 -0
  133. data/ext/libcouchbase/example/libeventdirect/main.c +148 -0
  134. data/ext/libcouchbase/example/mcc/mcc.cc +246 -0
  135. data/ext/libcouchbase/example/minimal/minimal.c +130 -0
  136. data/ext/libcouchbase/example/observe/observe.c +146 -0
  137. data/ext/libcouchbase/example/subdoc/subdoc-multi.cc +132 -0
  138. data/ext/libcouchbase/example/subdoc/subdoc-simple.cc +191 -0
  139. data/ext/libcouchbase/example/tick/tick.c +119 -0
  140. data/ext/libcouchbase/example/views/views-example.cc +83 -0
  141. data/ext/libcouchbase/include/libcouchbase/_cxxwrap.h +150 -0
  142. data/ext/libcouchbase/include/libcouchbase/api-legacy.h +1689 -0
  143. data/ext/libcouchbase/include/libcouchbase/api3.h +2 -0
  144. data/ext/libcouchbase/include/libcouchbase/assert.h +44 -0
  145. data/ext/libcouchbase/include/libcouchbase/cbft.h +109 -0
  146. data/ext/libcouchbase/include/libcouchbase/cntl-private.h +356 -0
  147. data/ext/libcouchbase/include/libcouchbase/cntl.h +937 -0
  148. data/ext/libcouchbase/include/libcouchbase/configuration.h.in +23 -0
  149. data/ext/libcouchbase/include/libcouchbase/couchbase.h +3677 -0
  150. data/ext/libcouchbase/include/libcouchbase/deprecated.h +300 -0
  151. data/ext/libcouchbase/include/libcouchbase/error.h +595 -0
  152. data/ext/libcouchbase/include/libcouchbase/http.h +1 -0
  153. data/ext/libcouchbase/include/libcouchbase/iops.h +1050 -0
  154. data/ext/libcouchbase/include/libcouchbase/ixmgmt.h +263 -0
  155. data/ext/libcouchbase/include/libcouchbase/kvbuf.h +132 -0
  156. data/ext/libcouchbase/include/libcouchbase/n1ql.h +364 -0
  157. data/ext/libcouchbase/include/libcouchbase/pktfwd.h +270 -0
  158. data/ext/libcouchbase/include/libcouchbase/plugins/io/bsdio-inl.c +367 -0
  159. data/ext/libcouchbase/include/libcouchbase/plugins/io/wsaerr-inl.c +76 -0
  160. data/ext/libcouchbase/include/libcouchbase/plugins/io/wsaerr.h +199 -0
  161. data/ext/libcouchbase/include/libcouchbase/subdoc.h +312 -0
  162. data/ext/libcouchbase/include/libcouchbase/sysdefs.h +98 -0
  163. data/ext/libcouchbase/include/libcouchbase/vbucket.h +643 -0
  164. data/ext/libcouchbase/include/libcouchbase/views.h +298 -0
  165. data/ext/libcouchbase/include/libcouchbase/visibility.h +65 -0
  166. data/ext/libcouchbase/include/memcached/COPYING +30 -0
  167. data/ext/libcouchbase/include/memcached/README +10 -0
  168. data/ext/libcouchbase/include/memcached/protocol_binary.h +1916 -0
  169. data/ext/libcouchbase/include/memcached/vbucket.h +42 -0
  170. data/ext/libcouchbase/packaging/README +7 -0
  171. data/ext/libcouchbase/packaging/abicheck/.gitignore +4 -0
  172. data/ext/libcouchbase/packaging/abicheck/Makefile +17 -0
  173. data/ext/libcouchbase/packaging/abicheck/README.md +27 -0
  174. data/ext/libcouchbase/packaging/abicheck/template.xml +3 -0
  175. data/ext/libcouchbase/packaging/deb/compat +1 -0
  176. data/ext/libcouchbase/packaging/deb/control +73 -0
  177. data/ext/libcouchbase/packaging/deb/copyright +10 -0
  178. data/ext/libcouchbase/packaging/deb/libcouchbase-dev.docs +3 -0
  179. data/ext/libcouchbase/packaging/deb/package.mk +31 -0
  180. data/ext/libcouchbase/packaging/deb/rules +46 -0
  181. data/ext/libcouchbase/packaging/deb/source/format +1 -0
  182. data/ext/libcouchbase/packaging/distinfo/README +1 -0
  183. data/ext/libcouchbase/packaging/distinfo/distinfo.cmake.in +4 -0
  184. data/ext/libcouchbase/packaging/dllversion.rc.in +39 -0
  185. data/ext/libcouchbase/packaging/libcouchbase.pc.in +10 -0
  186. data/ext/libcouchbase/packaging/nuget/libcouchbase.autopkg +76 -0
  187. data/ext/libcouchbase/packaging/parse-git-describe.pl +166 -0
  188. data/ext/libcouchbase/packaging/rpm/libcouchbase.spec.in +108 -0
  189. data/ext/libcouchbase/packaging/rpm/package.mk +40 -0
  190. data/ext/libcouchbase/plugins/io/iocp/CMakeLists.txt +9 -0
  191. data/ext/libcouchbase/plugins/io/iocp/iocp_iops.c +466 -0
  192. data/ext/libcouchbase/plugins/io/iocp/iocp_iops.h +217 -0
  193. data/ext/libcouchbase/plugins/io/iocp/iocp_loop.c +295 -0
  194. data/ext/libcouchbase/plugins/io/iocp/iocp_timer.c +79 -0
  195. data/ext/libcouchbase/plugins/io/iocp/iocp_util.c +229 -0
  196. data/ext/libcouchbase/plugins/io/libev/CMakeLists.txt +29 -0
  197. data/ext/libcouchbase/plugins/io/libev/libev_io_opts.h +65 -0
  198. data/ext/libcouchbase/plugins/io/libev/plugin-libev.c +289 -0
  199. data/ext/libcouchbase/plugins/io/libevent/CMakeLists.txt +29 -0
  200. data/ext/libcouchbase/plugins/io/libevent/libevent_io_opts.h +67 -0
  201. data/ext/libcouchbase/plugins/io/libevent/plugin-libevent.c +292 -0
  202. data/ext/libcouchbase/plugins/io/libuv/CMakeLists.txt +42 -0
  203. data/ext/libcouchbase/plugins/io/libuv/libuv_compat.h +212 -0
  204. data/ext/libcouchbase/plugins/io/libuv/libuv_io_opts.h +118 -0
  205. data/ext/libcouchbase/plugins/io/libuv/plugin-internal.h +148 -0
  206. data/ext/libcouchbase/plugins/io/libuv/plugin-libuv.c +648 -0
  207. data/ext/libcouchbase/plugins/io/select/CMakeLists.txt +11 -0
  208. data/ext/libcouchbase/plugins/io/select/plugin-select.c +448 -0
  209. data/ext/libcouchbase/plugins/io/select/select_io_opts.h +39 -0
  210. data/ext/libcouchbase/src/README.md +103 -0
  211. data/ext/libcouchbase/src/aspend.h +106 -0
  212. data/ext/libcouchbase/src/auth.cc +74 -0
  213. data/ext/libcouchbase/src/auth.h +54 -0
  214. data/ext/libcouchbase/src/bootstrap.c +269 -0
  215. data/ext/libcouchbase/src/bootstrap.h +129 -0
  216. data/ext/libcouchbase/src/bucketconfig/bc_cccp.c +495 -0
  217. data/ext/libcouchbase/src/bucketconfig/bc_file.c +347 -0
  218. data/ext/libcouchbase/src/bucketconfig/bc_http.c +630 -0
  219. data/ext/libcouchbase/src/bucketconfig/bc_http.h +82 -0
  220. data/ext/libcouchbase/src/bucketconfig/bc_mcraw.c +150 -0
  221. data/ext/libcouchbase/src/bucketconfig/clconfig.h +681 -0
  222. data/ext/libcouchbase/src/bucketconfig/confmon.c +474 -0
  223. data/ext/libcouchbase/src/callbacks.c +378 -0
  224. data/ext/libcouchbase/src/cbft.cc +210 -0
  225. data/ext/libcouchbase/src/cntl.cc +847 -0
  226. data/ext/libcouchbase/src/config_static.h +159 -0
  227. data/ext/libcouchbase/src/connspec.cc +462 -0
  228. data/ext/libcouchbase/src/connspec.h +105 -0
  229. data/ext/libcouchbase/src/ctx-log-inl.h +27 -0
  230. data/ext/libcouchbase/src/dump.c +98 -0
  231. data/ext/libcouchbase/src/getconfig.c +100 -0
  232. data/ext/libcouchbase/src/gethrtime.c +109 -0
  233. data/ext/libcouchbase/src/handler.c +922 -0
  234. data/ext/libcouchbase/src/hashset.c +164 -0
  235. data/ext/libcouchbase/src/hashset.h +86 -0
  236. data/ext/libcouchbase/src/hashtable.c +75 -0
  237. data/ext/libcouchbase/src/hdr_timings.c +92 -0
  238. data/ext/libcouchbase/src/hostlist.cc +301 -0
  239. data/ext/libcouchbase/src/hostlist.h +171 -0
  240. data/ext/libcouchbase/src/http/http-priv.h +307 -0
  241. data/ext/libcouchbase/src/http/http.cc +633 -0
  242. data/ext/libcouchbase/src/http/http.h +34 -0
  243. data/ext/libcouchbase/src/http/http_io.cc +307 -0
  244. data/ext/libcouchbase/src/instance.cc +722 -0
  245. data/ext/libcouchbase/src/internal.h +244 -0
  246. data/ext/libcouchbase/src/iofactory.c +575 -0
  247. data/ext/libcouchbase/src/jsparse/parser.cc +519 -0
  248. data/ext/libcouchbase/src/jsparse/parser.h +173 -0
  249. data/ext/libcouchbase/src/lcbht/lcbht.c +282 -0
  250. data/ext/libcouchbase/src/lcbht/lcbht.h +199 -0
  251. data/ext/libcouchbase/src/lcbio/connect.c +557 -0
  252. data/ext/libcouchbase/src/lcbio/connect.h +364 -0
  253. data/ext/libcouchbase/src/lcbio/ctx.c +611 -0
  254. data/ext/libcouchbase/src/lcbio/ctx.h +405 -0
  255. data/ext/libcouchbase/src/lcbio/iotable.c +290 -0
  256. data/ext/libcouchbase/src/lcbio/iotable.h +84 -0
  257. data/ext/libcouchbase/src/lcbio/ioutils.c +350 -0
  258. data/ext/libcouchbase/src/lcbio/ioutils.h +203 -0
  259. data/ext/libcouchbase/src/lcbio/lcbio.h +51 -0
  260. data/ext/libcouchbase/src/lcbio/manager.c +584 -0
  261. data/ext/libcouchbase/src/lcbio/manager.h +156 -0
  262. data/ext/libcouchbase/src/lcbio/protoctx.c +84 -0
  263. data/ext/libcouchbase/src/lcbio/rw-inl.h +115 -0
  264. data/ext/libcouchbase/src/lcbio/ssl.h +149 -0
  265. data/ext/libcouchbase/src/lcbio/timer-ng.h +179 -0
  266. data/ext/libcouchbase/src/lcbio/timer.c +132 -0
  267. data/ext/libcouchbase/src/legacy.c +430 -0
  268. data/ext/libcouchbase/src/list.c +144 -0
  269. data/ext/libcouchbase/src/list.h +127 -0
  270. data/ext/libcouchbase/src/logging.c +244 -0
  271. data/ext/libcouchbase/src/logging.h +86 -0
  272. data/ext/libcouchbase/src/mc/compress.c +90 -0
  273. data/ext/libcouchbase/src/mc/compress.h +61 -0
  274. data/ext/libcouchbase/src/mc/forward.c +186 -0
  275. data/ext/libcouchbase/src/mc/forward.h +90 -0
  276. data/ext/libcouchbase/src/mc/iovcursor-inl.h +279 -0
  277. data/ext/libcouchbase/src/mc/iovcursor.h +66 -0
  278. data/ext/libcouchbase/src/mc/mcreq-flush-inl.h +111 -0
  279. data/ext/libcouchbase/src/mc/mcreq.c +954 -0
  280. data/ext/libcouchbase/src/mc/mcreq.h +977 -0
  281. data/ext/libcouchbase/src/mcserver/mcserver.c +784 -0
  282. data/ext/libcouchbase/src/mcserver/mcserver.h +121 -0
  283. data/ext/libcouchbase/src/mcserver/negotiate.c +656 -0
  284. data/ext/libcouchbase/src/mcserver/negotiate.h +119 -0
  285. data/ext/libcouchbase/src/n1ql/ixmgmt.cc +860 -0
  286. data/ext/libcouchbase/src/n1ql/n1ql-internal.h +22 -0
  287. data/ext/libcouchbase/src/n1ql/n1ql.cc +729 -0
  288. data/ext/libcouchbase/src/n1ql/params.cc +215 -0
  289. data/ext/libcouchbase/src/netbuf/netbuf-defs.h +89 -0
  290. data/ext/libcouchbase/src/netbuf/netbuf-mblock.h +235 -0
  291. data/ext/libcouchbase/src/netbuf/netbuf.c +929 -0
  292. data/ext/libcouchbase/src/netbuf/netbuf.h +452 -0
  293. data/ext/libcouchbase/src/newconfig.c +385 -0
  294. data/ext/libcouchbase/src/nodeinfo.cc +194 -0
  295. data/ext/libcouchbase/src/operations/cbflush.c +71 -0
  296. data/ext/libcouchbase/src/operations/counter.c +116 -0
  297. data/ext/libcouchbase/src/operations/durability-cas.c +224 -0
  298. data/ext/libcouchbase/src/operations/durability-seqno.c +157 -0
  299. data/ext/libcouchbase/src/operations/durability.c +668 -0
  300. data/ext/libcouchbase/src/operations/durability_internal.h +199 -0
  301. data/ext/libcouchbase/src/operations/get.c +409 -0
  302. data/ext/libcouchbase/src/operations/observe-seqno.c +96 -0
  303. data/ext/libcouchbase/src/operations/observe.c +340 -0
  304. data/ext/libcouchbase/src/operations/pktfwd.c +86 -0
  305. data/ext/libcouchbase/src/operations/remove.c +83 -0
  306. data/ext/libcouchbase/src/operations/stats.c +461 -0
  307. data/ext/libcouchbase/src/operations/store.c +360 -0
  308. data/ext/libcouchbase/src/operations/subdoc.cc +510 -0
  309. data/ext/libcouchbase/src/operations/touch.c +81 -0
  310. data/ext/libcouchbase/src/packetutils.c +60 -0
  311. data/ext/libcouchbase/src/packetutils.h +147 -0
  312. data/ext/libcouchbase/src/probes.d +211 -0
  313. data/ext/libcouchbase/src/rdb/bigalloc.c +225 -0
  314. data/ext/libcouchbase/src/rdb/bigalloc.h +73 -0
  315. data/ext/libcouchbase/src/rdb/chunkalloc.c +174 -0
  316. data/ext/libcouchbase/src/rdb/libcalloc.c +94 -0
  317. data/ext/libcouchbase/src/rdb/rope.c +419 -0
  318. data/ext/libcouchbase/src/rdb/rope.h +488 -0
  319. data/ext/libcouchbase/src/retrychk.c +113 -0
  320. data/ext/libcouchbase/src/retryq.c +424 -0
  321. data/ext/libcouchbase/src/retryq.h +157 -0
  322. data/ext/libcouchbase/src/ringbuffer.c +442 -0
  323. data/ext/libcouchbase/src/ringbuffer.h +100 -0
  324. data/ext/libcouchbase/src/settings.c +95 -0
  325. data/ext/libcouchbase/src/settings.h +188 -0
  326. data/ext/libcouchbase/src/simplestring.c +211 -0
  327. data/ext/libcouchbase/src/simplestring.h +228 -0
  328. data/ext/libcouchbase/src/sllist-inl.h +197 -0
  329. data/ext/libcouchbase/src/sllist.h +76 -0
  330. data/ext/libcouchbase/src/ssl/CMakeLists.txt +23 -0
  331. data/ext/libcouchbase/src/ssl/ssl_c.c +415 -0
  332. data/ext/libcouchbase/src/ssl/ssl_common.c +454 -0
  333. data/ext/libcouchbase/src/ssl/ssl_e.c +408 -0
  334. data/ext/libcouchbase/src/ssl/ssl_iot_common.h +180 -0
  335. data/ext/libcouchbase/src/ssobuf.h +82 -0
  336. data/ext/libcouchbase/src/strcodecs/base64.c +123 -0
  337. data/ext/libcouchbase/src/strcodecs/strcodecs.h +285 -0
  338. data/ext/libcouchbase/src/timings.c +208 -0
  339. data/ext/libcouchbase/src/trace.h +105 -0
  340. data/ext/libcouchbase/src/utilities.c +171 -0
  341. data/ext/libcouchbase/src/vbucket/CMakeLists.txt +2 -0
  342. data/ext/libcouchbase/src/vbucket/aliases.h +35 -0
  343. data/ext/libcouchbase/src/vbucket/crc32.h +83 -0
  344. data/ext/libcouchbase/src/vbucket/hash.h +30 -0
  345. data/ext/libcouchbase/src/vbucket/json-inl.h +112 -0
  346. data/ext/libcouchbase/src/vbucket/ketama.c +66 -0
  347. data/ext/libcouchbase/src/vbucket/rfc1321/global.h +32 -0
  348. data/ext/libcouchbase/src/vbucket/rfc1321/md5.h +35 -0
  349. data/ext/libcouchbase/src/vbucket/rfc1321/md5c-inl.h +335 -0
  350. data/ext/libcouchbase/src/vbucket/vbucket.c +1543 -0
  351. data/ext/libcouchbase/src/views/docreq.c +194 -0
  352. data/ext/libcouchbase/src/views/docreq.h +83 -0
  353. data/ext/libcouchbase/src/views/viewreq.c +358 -0
  354. data/ext/libcouchbase/src/views/viewreq.h +36 -0
  355. data/ext/libcouchbase/src/wait.c +161 -0
  356. data/ext/libcouchbase/tests/CMakeLists.txt +140 -0
  357. data/ext/libcouchbase/tests/basic/t_base64.cc +81 -0
  358. data/ext/libcouchbase/tests/basic/t_ccbc103.cc +95 -0
  359. data/ext/libcouchbase/tests/basic/t_connstr.cc +404 -0
  360. data/ext/libcouchbase/tests/basic/t_creds.cc +32 -0
  361. data/ext/libcouchbase/tests/basic/t_ctlcodes.cc +92 -0
  362. data/ext/libcouchbase/tests/basic/t_hashset.cc +262 -0
  363. data/ext/libcouchbase/tests/basic/t_host.cc +198 -0
  364. data/ext/libcouchbase/tests/basic/t_jsparse.cc +137 -0
  365. data/ext/libcouchbase/tests/basic/t_jsparse.h +589 -0
  366. data/ext/libcouchbase/tests/basic/t_list.cc +155 -0
  367. data/ext/libcouchbase/tests/basic/t_logger.cc +65 -0
  368. data/ext/libcouchbase/tests/basic/t_misc.cc +24 -0
  369. data/ext/libcouchbase/tests/basic/t_n1qlstrings.cc +18 -0
  370. data/ext/libcouchbase/tests/basic/t_netbuf.cc +446 -0
  371. data/ext/libcouchbase/tests/basic/t_packet.cc +222 -0
  372. data/ext/libcouchbase/tests/basic/t_ringbuffer.cc +278 -0
  373. data/ext/libcouchbase/tests/basic/t_slist.cc +429 -0
  374. data/ext/libcouchbase/tests/basic/t_strerror.cc +64 -0
  375. data/ext/libcouchbase/tests/basic/t_string.cc +112 -0
  376. data/ext/libcouchbase/tests/basic/t_urlencode.cc +132 -0
  377. data/ext/libcouchbase/tests/check-all.cc +608 -0
  378. data/ext/libcouchbase/tests/htparse/t_basic.cc +193 -0
  379. data/ext/libcouchbase/tests/ioserver/connection.cc +166 -0
  380. data/ext/libcouchbase/tests/ioserver/future.cc +50 -0
  381. data/ext/libcouchbase/tests/ioserver/ioserver.cc +104 -0
  382. data/ext/libcouchbase/tests/ioserver/ioserver.h +478 -0
  383. data/ext/libcouchbase/tests/ioserver/socket.cc +88 -0
  384. data/ext/libcouchbase/tests/ioserver/ssl_connection.cc +145 -0
  385. data/ext/libcouchbase/tests/ioserver/threads-pthreads.cc +119 -0
  386. data/ext/libcouchbase/tests/ioserver/threads-win32.cc +117 -0
  387. data/ext/libcouchbase/tests/ioserver/threads.h +66 -0
  388. data/ext/libcouchbase/tests/iotests/iotests.h +15 -0
  389. data/ext/libcouchbase/tests/iotests/mock-environment.cc +524 -0
  390. data/ext/libcouchbase/tests/iotests/mock-environment.h +385 -0
  391. data/ext/libcouchbase/tests/iotests/mock-unit-test.cc +67 -0
  392. data/ext/libcouchbase/tests/iotests/mock-unit-test.h +61 -0
  393. data/ext/libcouchbase/tests/iotests/serverparams.h +76 -0
  394. data/ext/libcouchbase/tests/iotests/t_arithmetic.cc +143 -0
  395. data/ext/libcouchbase/tests/iotests/t_behavior.cc +226 -0
  396. data/ext/libcouchbase/tests/iotests/t_configcache.cc +117 -0
  397. data/ext/libcouchbase/tests/iotests/t_confmon.cc +241 -0
  398. data/ext/libcouchbase/tests/iotests/t_durability.cc +1059 -0
  399. data/ext/libcouchbase/tests/iotests/t_forward.cc +110 -0
  400. data/ext/libcouchbase/tests/iotests/t_get.cc +512 -0
  401. data/ext/libcouchbase/tests/iotests/t_http.cc +438 -0
  402. data/ext/libcouchbase/tests/iotests/t_iops.cc +175 -0
  403. data/ext/libcouchbase/tests/iotests/t_lock.cc +275 -0
  404. data/ext/libcouchbase/tests/iotests/t_misc.cc +713 -0
  405. data/ext/libcouchbase/tests/iotests/t_mutate.cc +609 -0
  406. data/ext/libcouchbase/tests/iotests/t_n1ql.cc +270 -0
  407. data/ext/libcouchbase/tests/iotests/t_netfail.cc +654 -0
  408. data/ext/libcouchbase/tests/iotests/t_obseqno.cc +157 -0
  409. data/ext/libcouchbase/tests/iotests/t_regression.cc +321 -0
  410. data/ext/libcouchbase/tests/iotests/t_sched.cc +88 -0
  411. data/ext/libcouchbase/tests/iotests/t_serverops.cc +230 -0
  412. data/ext/libcouchbase/tests/iotests/t_smoke.cc +528 -0
  413. data/ext/libcouchbase/tests/iotests/t_subdoc.cc +822 -0
  414. data/ext/libcouchbase/tests/iotests/t_syncmode.cc +64 -0
  415. data/ext/libcouchbase/tests/iotests/t_views.cc +405 -0
  416. data/ext/libcouchbase/tests/iotests/testutil.cc +250 -0
  417. data/ext/libcouchbase/tests/iotests/testutil.h +163 -0
  418. data/ext/libcouchbase/tests/mc/mctest.h +119 -0
  419. data/ext/libcouchbase/tests/mc/pktmaker.h +101 -0
  420. data/ext/libcouchbase/tests/mc/t_alloc.cc +269 -0
  421. data/ext/libcouchbase/tests/mc/t_context.cc +100 -0
  422. data/ext/libcouchbase/tests/mc/t_flush.cc +185 -0
  423. data/ext/libcouchbase/tests/mc/t_forward.cc +239 -0
  424. data/ext/libcouchbase/tests/mc/t_ioflush.cc +102 -0
  425. data/ext/libcouchbase/tests/mc/t_iovcursor.cc +173 -0
  426. data/ext/libcouchbase/tests/mocksupport/procutil.c +305 -0
  427. data/ext/libcouchbase/tests/mocksupport/procutil.h +89 -0
  428. data/ext/libcouchbase/tests/mocksupport/server.c +391 -0
  429. data/ext/libcouchbase/tests/mocksupport/server.h +72 -0
  430. data/ext/libcouchbase/tests/mocksupport/timeout.c +69 -0
  431. data/ext/libcouchbase/tests/nonio_tests.cc +23 -0
  432. data/ext/libcouchbase/tests/rdb/rdbtest.h +133 -0
  433. data/ext/libcouchbase/tests/rdb/t_basic.cc +128 -0
  434. data/ext/libcouchbase/tests/rdb/t_bigalloc.cc +93 -0
  435. data/ext/libcouchbase/tests/rdb/t_refs.cc +112 -0
  436. data/ext/libcouchbase/tests/socktests/socktest.cc +347 -0
  437. data/ext/libcouchbase/tests/socktests/socktest.h +448 -0
  438. data/ext/libcouchbase/tests/socktests/t_basic.cc +143 -0
  439. data/ext/libcouchbase/tests/socktests/t_ctx.cc +73 -0
  440. data/ext/libcouchbase/tests/socktests/t_manager.cc +179 -0
  441. data/ext/libcouchbase/tests/socktests/t_putex.cc +256 -0
  442. data/ext/libcouchbase/tests/socktests/t_read.cc +187 -0
  443. data/ext/libcouchbase/tests/socktests/t_reentrant.cc +143 -0
  444. data/ext/libcouchbase/tests/socktests/t_ssl.cc +80 -0
  445. data/ext/libcouchbase/tests/socktests/t_write.cc +95 -0
  446. data/ext/libcouchbase/tests/start_mock.bat +15 -0
  447. data/ext/libcouchbase/tests/start_mock.sh +42 -0
  448. data/ext/libcouchbase/tests/unit_tests.cc +43 -0
  449. data/ext/libcouchbase/tests/vbucket/confdata/bad.json +101 -0
  450. data/ext/libcouchbase/tests/vbucket/confdata/full_25.json +363 -0
  451. data/ext/libcouchbase/tests/vbucket/confdata/memd_25.json +90 -0
  452. data/ext/libcouchbase/tests/vbucket/confdata/memd_30.json +1 -0
  453. data/ext/libcouchbase/tests/vbucket/confdata/memd_45.json +1 -0
  454. data/ext/libcouchbase/tests/vbucket/confdata/terse_25.json +291 -0
  455. data/ext/libcouchbase/tests/vbucket/confdata/terse_30.json +1 -0
  456. data/ext/libcouchbase/tests/vbucket/t_config.cc +341 -0
  457. data/ext/libcouchbase/tools/CMakeLists.txt +51 -0
  458. data/ext/libcouchbase/tools/cbc-handlers.h +462 -0
  459. data/ext/libcouchbase/tools/cbc-n1qlback.cc +439 -0
  460. data/ext/libcouchbase/tools/cbc-pillowfight.cc +822 -0
  461. data/ext/libcouchbase/tools/cbc.cc +1541 -0
  462. data/ext/libcouchbase/tools/common/histogram.cc +43 -0
  463. data/ext/libcouchbase/tools/common/histogram.h +23 -0
  464. data/ext/libcouchbase/tools/common/my_inttypes.h +22 -0
  465. data/ext/libcouchbase/tools/common/options.cc +420 -0
  466. data/ext/libcouchbase/tools/common/options.h +81 -0
  467. data/ext/libcouchbase/tools/docgen/docgen.h +469 -0
  468. data/ext/libcouchbase/tools/docgen/loc.h +210 -0
  469. data/ext/libcouchbase/tools/docgen/placeholders.h +211 -0
  470. data/ext/libcouchbase/tools/docgen/seqgen.h +94 -0
  471. data/lib/libcouchbase.rb +36 -0
  472. data/lib/libcouchbase/bucket.rb +819 -0
  473. data/lib/libcouchbase/callbacks.rb +72 -0
  474. data/lib/libcouchbase/connection.rb +790 -0
  475. data/lib/libcouchbase/design_docs.rb +86 -0
  476. data/lib/libcouchbase/error.rb +68 -0
  477. data/lib/libcouchbase/ext/libcouchbase.rb +1135 -0
  478. data/lib/libcouchbase/ext/libcouchbase/cmdbase.rb +23 -0
  479. data/lib/libcouchbase/ext/libcouchbase/cmdcounter.rb +36 -0
  480. data/lib/libcouchbase/ext/libcouchbase/cmdendure.rb +26 -0
  481. data/lib/libcouchbase/ext/libcouchbase/cmdfts.rb +24 -0
  482. data/lib/libcouchbase/ext/libcouchbase/cmdget.rb +30 -0
  483. data/lib/libcouchbase/ext/libcouchbase/cmdgetreplica.rb +49 -0
  484. data/lib/libcouchbase/ext/libcouchbase/cmdhttp.rb +58 -0
  485. data/lib/libcouchbase/ext/libcouchbase/cmdn1ql.rb +40 -0
  486. data/lib/libcouchbase/ext/libcouchbase/cmdobseqno.rb +33 -0
  487. data/lib/libcouchbase/ext/libcouchbase/cmdobserve.rb +30 -0
  488. data/lib/libcouchbase/ext/libcouchbase/cmdstore.rb +40 -0
  489. data/lib/libcouchbase/ext/libcouchbase/cmdstoredur.rb +45 -0
  490. data/lib/libcouchbase/ext/libcouchbase/cmdsubdoc.rb +49 -0
  491. data/lib/libcouchbase/ext/libcouchbase/cmdverbosity.rb +29 -0
  492. data/lib/libcouchbase/ext/libcouchbase/cmdviewquery.rb +61 -0
  493. data/lib/libcouchbase/ext/libcouchbase/contigbuf.rb +14 -0
  494. data/lib/libcouchbase/ext/libcouchbase/create_st.rb +15 -0
  495. data/lib/libcouchbase/ext/libcouchbase/create_st0.rb +23 -0
  496. data/lib/libcouchbase/ext/libcouchbase/create_st1.rb +26 -0
  497. data/lib/libcouchbase/ext/libcouchbase/create_st2.rb +32 -0
  498. data/lib/libcouchbase/ext/libcouchbase/create_st3.rb +26 -0
  499. data/lib/libcouchbase/ext/libcouchbase/crst_u.rb +20 -0
  500. data/lib/libcouchbase/ext/libcouchbase/durability_opts_st_v.rb +11 -0
  501. data/lib/libcouchbase/ext/libcouchbase/durability_opts_t.rb +14 -0
  502. data/lib/libcouchbase/ext/libcouchbase/durabilityopt_sv0.rb +63 -0
  503. data/lib/libcouchbase/ext/libcouchbase/enums.rb +991 -0
  504. data/lib/libcouchbase/ext/libcouchbase/fragbuf.rb +18 -0
  505. data/lib/libcouchbase/ext/libcouchbase/ftshandle.rb +7 -0
  506. data/lib/libcouchbase/ext/libcouchbase/histogram.rb +34 -0
  507. data/lib/libcouchbase/ext/libcouchbase/http_request_t.rb +7 -0
  508. data/lib/libcouchbase/ext/libcouchbase/keybuf.rb +20 -0
  509. data/lib/libcouchbase/ext/libcouchbase/multicmd_ctx.rb +30 -0
  510. data/lib/libcouchbase/ext/libcouchbase/mutation_token.rb +17 -0
  511. data/lib/libcouchbase/ext/libcouchbase/n1qlhandle.rb +7 -0
  512. data/lib/libcouchbase/ext/libcouchbase/n1qlparams.rb +7 -0
  513. data/lib/libcouchbase/ext/libcouchbase/respbase.rb +29 -0
  514. data/lib/libcouchbase/ext/libcouchbase/respcounter.rb +32 -0
  515. data/lib/libcouchbase/ext/libcouchbase/respendure.rb +49 -0
  516. data/lib/libcouchbase/ext/libcouchbase/respfts.rb +40 -0
  517. data/lib/libcouchbase/ext/libcouchbase/respget.rb +44 -0
  518. data/lib/libcouchbase/ext/libcouchbase/resphttp.rb +48 -0
  519. data/lib/libcouchbase/ext/libcouchbase/respmcversion.rb +38 -0
  520. data/lib/libcouchbase/ext/libcouchbase/respn1ql.rb +41 -0
  521. data/lib/libcouchbase/ext/libcouchbase/respobseqno.rb +52 -0
  522. data/lib/libcouchbase/ext/libcouchbase/respobserve.rb +41 -0
  523. data/lib/libcouchbase/ext/libcouchbase/respserverbase.rb +32 -0
  524. data/lib/libcouchbase/ext/libcouchbase/respstats.rb +38 -0
  525. data/lib/libcouchbase/ext/libcouchbase/respstore.rb +32 -0
  526. data/lib/libcouchbase/ext/libcouchbase/respstoredur.rb +38 -0
  527. data/lib/libcouchbase/ext/libcouchbase/respsubdoc.rb +35 -0
  528. data/lib/libcouchbase/ext/libcouchbase/respviewquery.rb +67 -0
  529. data/lib/libcouchbase/ext/libcouchbase/sdentry.rb +22 -0
  530. data/lib/libcouchbase/ext/libcouchbase/sdspec.rb +26 -0
  531. data/lib/libcouchbase/ext/libcouchbase/t.rb +7 -0
  532. data/lib/libcouchbase/ext/libcouchbase/valbuf.rb +22 -0
  533. data/lib/libcouchbase/ext/libcouchbase/valbuf_u_buf.rb +14 -0
  534. data/lib/libcouchbase/ext/libcouchbase/viewhandle.rb +7 -0
  535. data/lib/libcouchbase/ext/libcouchbase_iocp.rb +26 -0
  536. data/lib/libcouchbase/ext/libcouchbase_libuv.rb +18 -0
  537. data/lib/libcouchbase/ext/tasks.rb +87 -0
  538. data/lib/libcouchbase/n1ql.rb +73 -0
  539. data/lib/libcouchbase/query_full_text.rb +147 -0
  540. data/lib/libcouchbase/query_n1ql.rb +121 -0
  541. data/lib/libcouchbase/query_view.rb +129 -0
  542. data/lib/libcouchbase/results_fiber.rb +262 -0
  543. data/lib/libcouchbase/results_native.rb +211 -0
  544. data/lib/libcouchbase/version.rb +5 -0
  545. data/libcouchbase.gemspec +61 -0
  546. data/spec/bucket_spec.rb +270 -0
  547. data/spec/connection_spec.rb +277 -0
  548. data/spec/design_docs_spec.rb +23 -0
  549. data/spec/error_spec.rb +26 -0
  550. data/spec/fts_spec.rb +129 -0
  551. data/spec/n1ql_spec.rb +201 -0
  552. data/spec/results_libuv_spec.rb +229 -0
  553. data/spec/results_native_spec.rb +259 -0
  554. data/spec/seed/2016-10-25T043505Z/2016-10-25T043505Z-full/bucket-default/design.json +1 -0
  555. data/spec/seed/2016-10-25T043505Z/2016-10-25T043505Z-full/bucket-default/node-127.0.0.1%3A8091/data-0000.cbb +0 -0
  556. data/spec/seed/2016-10-25T043505Z/2016-10-25T043505Z-full/bucket-default/node-127.0.0.1%3A8091/failover.json +1 -0
  557. data/spec/seed/2016-10-25T043505Z/2016-10-25T043505Z-full/bucket-default/node-127.0.0.1%3A8091/meta.json +1 -0
  558. data/spec/seed/2016-10-25T043505Z/2016-10-25T043505Z-full/bucket-default/node-127.0.0.1%3A8091/seqno.json +1 -0
  559. data/spec/seed/2016-10-25T043505Z/2016-10-25T043505Z-full/bucket-default/node-127.0.0.1%3A8091/snapshot_markers.json +1 -0
  560. data/spec/view_spec.rb +195 -0
  561. metadata +775 -0
@@ -0,0 +1,275 @@
1
+ /* -*- Mode: C++; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Copyright 2012 Couchbase, Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+ #include "config.h"
18
+ #include <map>
19
+ #include "iotests.h"
20
+
21
+ class LockUnitTest : public MockUnitTest
22
+ {
23
+ };
24
+
25
+ extern "C" {
26
+ static void getLockedCallback(lcb_t, const void *cookie,
27
+ lcb_error_t err,
28
+ const lcb_get_resp_t *resp)
29
+ {
30
+ Item *itm = (Item *)cookie;
31
+ itm->assign(resp, err);
32
+ }
33
+ static void unlockCallback(lcb_t, const void *cookie,
34
+ lcb_error_t err,
35
+ const lcb_unlock_resp_t *resp)
36
+ {
37
+ *(lcb_error_t *)cookie = err;
38
+ }
39
+ }
40
+
41
+ /**
42
+ * @test
43
+ * Lock (lock and unlock)
44
+ *
45
+ * @pre
46
+ * Set a key, and get the value specifying the lock option with a timeout
47
+ * of @c 10.
48
+ *
49
+ * @post
50
+ * Lock operation succeeds.
51
+ *
52
+ * @pre Unlock the key using the CAS from the previous get result.
53
+ * @post Unlock succeeds
54
+ */
55
+ TEST_F(LockUnitTest, testSimpleLockAndUnlock)
56
+ {
57
+ LCB_TEST_REQUIRE_FEATURE("lock")
58
+
59
+ lcb_t instance;
60
+ HandleWrap hw;
61
+ createConnection(hw, instance);
62
+
63
+ std::string key = "lockKey";
64
+ std::string value = "lockValue";
65
+
66
+ removeKey(instance, key);
67
+ storeKey(instance, key, value);
68
+
69
+ lcb_get_cmd_st cmd = lcb_get_cmd_st(key.c_str(), key.size(),
70
+ 1, 10);
71
+ lcb_get_cmd_st *cmdlist = &cmd;
72
+ Item itm;
73
+ lcb_error_t err;
74
+
75
+ lcb_set_get_callback(instance, getLockedCallback);
76
+
77
+ err = lcb_get(instance, &itm, 1, &cmdlist);
78
+ ASSERT_EQ(LCB_SUCCESS, err);
79
+ lcb_wait(instance);
80
+ ASSERT_EQ(LCB_SUCCESS, itm.err);
81
+
82
+ lcb_unlock_cmd_st ucmd(key.c_str(), key.size(), itm.cas);
83
+ lcb_unlock_cmd_st *ucmdlist = &ucmd;
84
+
85
+ lcb_error_t reserr = LCB_ERROR;
86
+
87
+ lcb_set_unlock_callback(instance, unlockCallback);
88
+ err = lcb_unlock(instance, &reserr, 1, &ucmdlist);
89
+ ASSERT_EQ(LCB_SUCCESS, err);
90
+
91
+ lcb_wait(instance);
92
+
93
+ ASSERT_EQ(LCB_SUCCESS, reserr);
94
+
95
+ }
96
+
97
+ /**
98
+ * @test Lock (Missing CAS)
99
+ *
100
+ * @pre
101
+ * Store a key and attempt to unlock it with an invalid CAS
102
+ *
103
+ * @post
104
+ * Error result of @c ETMPFAIL
105
+ */
106
+ TEST_F(LockUnitTest, testUnlockMissingCas)
107
+ {
108
+ LCB_TEST_REQUIRE_FEATURE("lock")
109
+
110
+ lcb_t instance;
111
+ HandleWrap hw;
112
+ createConnection(hw, instance);
113
+
114
+ lcb_error_t err, reserr = LCB_ERROR;
115
+
116
+ storeKey(instance, "lockKey", "lockValue");
117
+
118
+ lcb_unlock_cmd_t cmd("lockKey", sizeof("lockKey") - 1, 0);
119
+ lcb_unlock_cmd_t *cmdlist = &cmd;
120
+ lcb_set_unlock_callback(instance, unlockCallback);
121
+
122
+ err = lcb_unlock(instance, &reserr, 1, &cmdlist);
123
+ ASSERT_EQ(LCB_SUCCESS, err);
124
+ lcb_wait(instance);
125
+
126
+ /**
127
+ * maybe I mis-understood lock, but isn't it an error to use unlock
128
+ * without a valid CAS? -
129
+ */
130
+ ASSERT_EQ(LCB_ETMPFAIL, reserr);
131
+ }
132
+
133
+ extern "C" {
134
+ static void lockedStorageCallback(lcb_t,
135
+ const void *cookie,
136
+ lcb_storage_t operation,
137
+ lcb_error_t err,
138
+ const lcb_store_resp_t *resp)
139
+ {
140
+ Item *itm = (Item *)cookie;
141
+ itm->assignKC<lcb_store_resp_t>(resp, err);
142
+ }
143
+ }
144
+ /**
145
+ * @test Lock (Storage Contention)
146
+ *
147
+ * @pre
148
+ * Store a key, perform a GET operation with the lock option, specifying a
149
+ * timeout of @c 10.
150
+ *
151
+ * Then attempt to store the key (without specifying any CAS).
152
+ *
153
+ * @post Store operation fails with @c KEY_EEXISTS. Getting the key retains
154
+ * the old value.
155
+ *
156
+ * @pre store the key using the CAS specified from the first GET
157
+ * @post Storage succeeds. Get returns new value.
158
+ */
159
+ TEST_F(LockUnitTest, testStorageLockContention)
160
+ {
161
+ LCB_TEST_REQUIRE_FEATURE("lock")
162
+
163
+ lcb_t instance;
164
+ HandleWrap hw;
165
+ lcb_error_t err;
166
+
167
+ createConnection(hw, instance);
168
+ Item itm;
169
+ std::string key = "lockedKey", value = "lockedValue",
170
+ newvalue = "newUnlockedValue";
171
+
172
+ /* undo any funny business on our key */
173
+ removeKey(instance, key);
174
+ storeKey(instance, key, value);
175
+
176
+ lcb_set_get_callback(instance, getLockedCallback);
177
+ lcb_set_unlock_callback(instance, unlockCallback);
178
+ lcb_set_store_callback(instance, lockedStorageCallback);
179
+
180
+ /* get the key and lock it */
181
+ lcb_get_cmd_st gcmd(key.c_str(), key.size(), 1, 10);
182
+ lcb_get_cmd_st *cmdlist = &gcmd;
183
+ err = lcb_get(instance, &itm, 1, &cmdlist);
184
+ ASSERT_EQ(LCB_SUCCESS, err);
185
+ lcb_wait(instance);
186
+ ASSERT_EQ(LCB_SUCCESS, itm.err);
187
+ ASSERT_GT(itm.cas, 0);
188
+
189
+ /* now try to set the key, while the lock is still in place */
190
+ lcb_store_cmd_t scmd(LCB_SET, key.c_str(), key.size(),
191
+ newvalue.c_str(), newvalue.size());
192
+ lcb_store_cmd_t *scmdlist = &scmd;
193
+ Item s_itm;
194
+ err = lcb_store(instance, &s_itm, 1, &scmdlist);
195
+ ASSERT_EQ(LCB_SUCCESS, err);
196
+ lcb_wait(instance);
197
+ ASSERT_EQ(LCB_KEY_EEXISTS, s_itm.err);
198
+
199
+ /* verify the value is still the old value */
200
+ Item ritem;
201
+ getKey(instance, key, ritem);
202
+ ASSERT_EQ(ritem.val, value);
203
+
204
+ /* now try to set it with the correct cas, implicitly unlocking the key */
205
+ scmd.v.v0.cas = itm.cas;
206
+ err = lcb_store(instance, &s_itm, 1, &scmdlist);
207
+ ASSERT_EQ(LCB_SUCCESS, err);
208
+ lcb_wait(instance);
209
+ ASSERT_EQ(LCB_SUCCESS, itm.err);
210
+
211
+ /* verify the value is now the new value */
212
+ getKey(instance, key, ritem);
213
+ ASSERT_EQ(ritem.val, newvalue);
214
+ }
215
+
216
+ /**
217
+ * @test
218
+ * Lock (Unlocking)
219
+ *
220
+ * @pre
221
+ * Store a key, get it with the lock option, specifying an expiry of @c 10.
222
+ * Try to unlock the key (using the @c lcb_unlock function) without a valid
223
+ * CAS.
224
+ *
225
+ * @post Unlock fails with @c ETMPFAIL
226
+ *
227
+ * @pre
228
+ * Unlock the key using the valid cas retrieved from the first lock operation.
229
+ * Then try to store the key with a new value.
230
+ *
231
+ * @post Unlock succeeds and retrieval of key yields new value.
232
+ */
233
+ TEST_F(LockUnitTest, testUnlLockContention)
234
+ {
235
+ LCB_TEST_REQUIRE_FEATURE("lock")
236
+
237
+ lcb_t instance;
238
+ HandleWrap hw;
239
+ lcb_error_t err, reserr = LCB_ERROR;
240
+ createConnection(hw, instance);
241
+
242
+ std::string key = "lockedKey2", value = "lockedValue2";
243
+ storeKey(instance, key, value);
244
+ Item gitm;
245
+
246
+ lcb_set_get_callback(instance, getLockedCallback);
247
+ lcb_set_unlock_callback(instance, unlockCallback);
248
+ lcb_set_store_callback(instance, lockedStorageCallback);
249
+
250
+ lcb_get_cmd_t gcmd(key.c_str(), key.size(), 1, 10);
251
+ lcb_get_cmd_t *gcmdlist = &gcmd;
252
+
253
+ err = lcb_get(instance, &gitm, 1, &gcmdlist);
254
+ ASSERT_EQ(LCB_SUCCESS, err);
255
+ lcb_wait(instance);
256
+ ASSERT_EQ(LCB_SUCCESS, gitm.err);
257
+
258
+ lcb_cas_t validCas = gitm.cas;
259
+ err = lcb_get(instance, &gitm, 1, &gcmdlist);
260
+ lcb_wait(instance);
261
+ ASSERT_EQ(LCB_ETMPFAIL, gitm.err);
262
+
263
+ lcb_unlock_cmd_t ucmd(key.c_str(), key.size(), validCas);
264
+ lcb_unlock_cmd_t *ucmdlist = &ucmd;
265
+ err = lcb_unlock(instance, &reserr, 1, &ucmdlist);
266
+ ASSERT_EQ(LCB_SUCCESS, err);
267
+ lcb_wait(instance);
268
+ ASSERT_EQ(reserr, LCB_SUCCESS);
269
+
270
+ std::string newval = "lockedValueNew2";
271
+ storeKey(instance, key, newval);
272
+ getKey(instance, key, gitm);
273
+ ASSERT_EQ(gitm.val, newval);
274
+
275
+ }
@@ -0,0 +1,713 @@
1
+ /* -*- Mode: C++; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Copyright 2012 Couchbase, Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+ #include "config.h"
18
+ #include "iotests.h"
19
+ #include <map>
20
+ #include <climits>
21
+ #include <algorithm>
22
+ #include "internal.h" /* vbucket_* things from lcb_t */
23
+ #include <lcbio/iotable.h>
24
+ #include "bucketconfig/bc_http.h"
25
+
26
+ #define LOGARGS(instance, lvl) \
27
+ instance->settings, "tests-MUT", LCB_LOG_##lvl, __FILE__, __LINE__
28
+
29
+
30
+ extern "C" {
31
+ static void timings_callback(lcb_t, const void *cookie, lcb_timeunit_t,
32
+ lcb_U32, lcb_U32, lcb_U32, lcb_U32)
33
+ {
34
+ bool *bPtr = (bool *)cookie;
35
+ *bPtr = true;
36
+ }
37
+ }
38
+
39
+ TEST_F(MockUnitTest, testTimings)
40
+ {
41
+ lcb_t instance;
42
+ HandleWrap hw;
43
+ bool called = false;
44
+ createConnection(hw, instance);
45
+
46
+ lcb_enable_timings(instance);
47
+
48
+ lcb_store_cmd_t storecmd(LCB_SET, "counter", 7, "0", 1);
49
+ lcb_store_cmd_t *storecmds[] = { &storecmd };
50
+
51
+ lcb_store(instance, NULL, 1, storecmds);
52
+ lcb_wait(instance);
53
+ lcb_get_timings(instance, &called, timings_callback);
54
+ lcb_disable_timings(instance);
55
+ ASSERT_TRUE(called);
56
+ }
57
+
58
+
59
+ namespace {
60
+ struct TimingInfo {
61
+ lcb_U64 ns_start;
62
+ lcb_U64 ns_end;
63
+ size_t count;
64
+
65
+ TimingInfo() : ns_start(-1), ns_end(-1), count(-1) {}
66
+
67
+ bool operator<(const TimingInfo& other) const {
68
+ return other.ns_start > ns_start;
69
+ }
70
+ bool operator>(const TimingInfo& other) const {
71
+ return ns_start > other.ns_start;
72
+ }
73
+
74
+ bool valid() const {
75
+ return count != -1;
76
+ }
77
+ };
78
+
79
+ static lcb_U64 intervalToNsec(lcb_U64 interval, lcb_timeunit_t unit)
80
+ {
81
+ if (unit == LCB_TIMEUNIT_NSEC) {
82
+ return interval;
83
+ } else if (unit == LCB_TIMEUNIT_USEC) {
84
+ return interval * 1000;
85
+ } else if (unit == LCB_TIMEUNIT_MSEC) {
86
+ return interval * 1000000;
87
+ } else if (unit == LCB_TIMEUNIT_SEC) {
88
+ return interval * 1000000000;
89
+ } else {
90
+ return -1;
91
+ }
92
+ }
93
+
94
+ struct LcbTimings {
95
+ LcbTimings() {}
96
+ std::vector<TimingInfo> m_info;
97
+ void load(lcb_t);
98
+ void clear();
99
+
100
+ TimingInfo infoAt(hrtime_t duration, lcb_timeunit_t unit = LCB_TIMEUNIT_NSEC);
101
+ size_t countAt(hrtime_t duration, lcb_timeunit_t unit = LCB_TIMEUNIT_NSEC) {
102
+ return infoAt(duration, unit).count;
103
+ }
104
+
105
+ void dump() const;
106
+ };
107
+
108
+ extern "C" {
109
+ static void load_timings_callback(lcb_t, const void *cookie, lcb_timeunit_t unit,
110
+ lcb_U32 min, lcb_U32 max, lcb_U32 total, lcb_U32 maxtotal)
111
+ {
112
+ lcb_U64 start = intervalToNsec(min, unit);
113
+ lcb_U64 end = intervalToNsec(max, unit);
114
+ LcbTimings *timings = (LcbTimings *)cookie;
115
+ TimingInfo info;
116
+
117
+ info.ns_start = start;
118
+ info.ns_end = end;
119
+ info.count = total;
120
+ timings->m_info.push_back(info);
121
+ }
122
+ } // extern "C"
123
+
124
+ void
125
+ LcbTimings::load(lcb_t instance)
126
+ {
127
+ lcb_get_timings(instance, this, load_timings_callback);
128
+ std::sort(m_info.begin(), m_info.end());
129
+ }
130
+
131
+ TimingInfo
132
+ LcbTimings::infoAt(hrtime_t duration, lcb_timeunit_t unit)
133
+ {
134
+ duration = intervalToNsec(duration, unit);
135
+ std::vector<TimingInfo>::iterator ii;
136
+ for (ii = m_info.begin(); ii != m_info.end(); ++ii) {
137
+ if (ii->ns_start <= duration && ii->ns_end > duration) {
138
+ return *ii;
139
+ }
140
+ }
141
+ return TimingInfo();
142
+ }
143
+
144
+ void
145
+ LcbTimings::dump() const
146
+ {
147
+ std::vector<TimingInfo>::const_iterator ii = m_info.begin();
148
+ for (; ii != m_info.end(); ii++) {
149
+ if (ii->ns_end < 1000) {
150
+ printf("[%llu-%llu ns] %lu\n",
151
+ ii->ns_start, ii->ns_end, ii->count);
152
+ } else if (ii->ns_end < 10000000) {
153
+ printf("[%llu-%llu us] %lu\n",
154
+ ii->ns_start / 1000, ii->ns_end / 1000, ii->count);
155
+ } else {
156
+ printf("[%llu-%llu ms] %lu\n",
157
+ ii->ns_start / 1000000, ii->ns_end / 1000000, ii->count);
158
+ }
159
+ }
160
+ }
161
+
162
+ } // namespace{
163
+
164
+ struct UnitInterval {
165
+ lcb_U64 n;
166
+ lcb_timeunit_t unit;
167
+ UnitInterval(lcb_U64 n, lcb_timeunit_t unit) : n(n), unit(unit) {}
168
+ };
169
+
170
+ static void addTiming(lcb_t instance, const UnitInterval& interval)
171
+ {
172
+ hrtime_t n = intervalToNsec(interval.n, interval.unit);
173
+ lcb_histogram_record(instance->kv_timings, n);
174
+ }
175
+
176
+
177
+ TEST_F(MockUnitTest, testTimingsEx)
178
+ {
179
+ lcb_t instance;
180
+ HandleWrap hw;
181
+
182
+ createConnection(hw, instance);
183
+ lcb_disable_timings(instance);
184
+ lcb_enable_timings(instance);
185
+
186
+ std::vector<UnitInterval> intervals;
187
+ intervals.push_back(UnitInterval(1, LCB_TIMEUNIT_NSEC));
188
+ intervals.push_back(UnitInterval(250, LCB_TIMEUNIT_NSEC));
189
+ intervals.push_back(UnitInterval(4, LCB_TIMEUNIT_USEC));
190
+ intervals.push_back(UnitInterval(32, LCB_TIMEUNIT_USEC));
191
+ intervals.push_back(UnitInterval(942, LCB_TIMEUNIT_USEC));
192
+ intervals.push_back(UnitInterval(1243, LCB_TIMEUNIT_USEC));
193
+ intervals.push_back(UnitInterval(1732, LCB_TIMEUNIT_USEC));
194
+ intervals.push_back(UnitInterval(5630, LCB_TIMEUNIT_USEC));
195
+ intervals.push_back(UnitInterval(42, LCB_TIMEUNIT_MSEC));
196
+ intervals.push_back(UnitInterval(434, LCB_TIMEUNIT_MSEC));
197
+
198
+ intervals.push_back(UnitInterval(8234, LCB_TIMEUNIT_MSEC));
199
+ intervals.push_back(UnitInterval(1294, LCB_TIMEUNIT_MSEC));
200
+ intervals.push_back(UnitInterval(48, LCB_TIMEUNIT_SEC));
201
+
202
+ for (size_t ii = 0; ii < intervals.size(); ++ii) {
203
+ addTiming(instance, intervals[ii]);
204
+ }
205
+
206
+ // Ensure they all exist, at least. Currently we bundle everything
207
+ LcbTimings timings;
208
+ timings.load(instance);
209
+
210
+ //timings.dump();
211
+
212
+ // Measuring in < us
213
+ ASSERT_EQ(2, timings.countAt(50, LCB_TIMEUNIT_NSEC));
214
+
215
+ ASSERT_EQ(1, timings.countAt(4, LCB_TIMEUNIT_USEC));
216
+ ASSERT_EQ(1, timings.countAt(30, LCB_TIMEUNIT_USEC));
217
+ ASSERT_EQ(-1, timings.countAt(900, LCB_TIMEUNIT_USEC));
218
+ ASSERT_EQ(1, timings.countAt(940, LCB_TIMEUNIT_USEC));
219
+ ASSERT_EQ(1, timings.countAt(1200, LCB_TIMEUNIT_USEC));
220
+ ASSERT_EQ(1, timings.countAt(1250, LCB_TIMEUNIT_USEC));
221
+ ASSERT_EQ(1, timings.countAt(5600, LCB_TIMEUNIT_USEC));
222
+ ASSERT_EQ(1, timings.countAt(40, LCB_TIMEUNIT_MSEC));
223
+ ASSERT_EQ(1, timings.countAt(430, LCB_TIMEUNIT_MSEC));
224
+ ASSERT_EQ(1, timings.countAt(1, LCB_TIMEUNIT_SEC));
225
+ ASSERT_EQ(1, timings.countAt(8, LCB_TIMEUNIT_SEC));
226
+ ASSERT_EQ(1, timings.countAt(93, LCB_TIMEUNIT_SEC));
227
+ }
228
+
229
+
230
+ struct async_ctx {
231
+ int count;
232
+ lcbio_pTABLE table;
233
+ };
234
+
235
+ extern "C" {
236
+ static void dtor_callback(const void *cookie)
237
+ {
238
+ async_ctx *ctx = (async_ctx *)cookie;
239
+ ctx->count++;
240
+ IOT_STOP(ctx->table);
241
+ }
242
+ }
243
+
244
+ TEST_F(MockUnitTest, testAsyncDestroy)
245
+ {
246
+ lcb_t instance;
247
+ createConnection(instance);
248
+ lcbio_pTABLE iot = instance->iotable;
249
+ lcb_settings *settings = instance->settings;
250
+
251
+ storeKey(instance, "foo", "bar");
252
+ // Now destroy the instance
253
+ async_ctx ctx;
254
+ ctx.count = 0;
255
+ ctx.table = iot;
256
+ lcb_set_destroy_callback(instance, dtor_callback);
257
+ lcb_destroy_async(instance, &ctx);
258
+ lcb_settings_ref(settings);
259
+ lcbio_table_ref(iot);
260
+ lcb_run_loop(instance);
261
+ lcb_settings_unref(settings);
262
+ lcbio_table_unref(iot);
263
+ ASSERT_EQ(1, ctx.count);
264
+ }
265
+
266
+ TEST_F(MockUnitTest, testGetHostInfo)
267
+ {
268
+ lcb_t instance;
269
+ createConnection(instance);
270
+ lcb_config_transport_t tx;
271
+ const char *hoststr = lcb_get_node(instance, LCB_NODE_HTCONFIG, 0);
272
+ ASSERT_FALSE(hoststr == NULL);
273
+
274
+ hoststr = lcb_get_node(instance, LCB_NODE_HTCONFIG_CONNECTED, 0);
275
+ lcb_error_t err = lcb_cntl(instance, LCB_CNTL_GET, LCB_CNTL_CONFIG_TRANSPORT, &tx);
276
+
277
+ ASSERT_EQ(LCB_SUCCESS, err);
278
+ if (tx == LCB_CONFIG_TRANSPORT_HTTP) {
279
+ ASSERT_FALSE(hoststr == NULL);
280
+ hoststr = lcb_get_node(instance, LCB_NODE_HTCONFIG_CONNECTED, 99);
281
+ ASSERT_FALSE(hoststr == NULL);
282
+ } else {
283
+ if (hoststr) {
284
+ printf("%s\n", hoststr);
285
+ }
286
+ ASSERT_TRUE(hoststr == NULL);
287
+ }
288
+
289
+ // Get any data node
290
+ using std::map;
291
+ using std::string;
292
+ map<string,bool> smap;
293
+
294
+ // Ensure we only get unique nodes
295
+ for (size_t ii = 0; ii < lcb_get_num_nodes(instance); ii++) {
296
+ const char *cur = lcb_get_node(instance, LCB_NODE_DATA, ii);
297
+ ASSERT_FALSE(cur == NULL);
298
+ ASSERT_FALSE(smap[cur]);
299
+ smap[cur] = true;
300
+ }
301
+ lcb_destroy(instance);
302
+
303
+ // Try with no connection
304
+ err = lcb_create(&instance, NULL);
305
+ ASSERT_EQ(LCB_SUCCESS, err);
306
+
307
+ hoststr = lcb_get_node(instance, LCB_NODE_HTCONFIG_CONNECTED, 0);
308
+ ASSERT_TRUE(NULL == hoststr);
309
+
310
+ hoststr = lcb_get_node(instance, LCB_NODE_HTCONFIG, 0);
311
+ ASSERT_TRUE(NULL == hoststr);
312
+
313
+
314
+
315
+ // These older API functions are special as they should never return NULL
316
+ hoststr = lcb_get_host(instance);
317
+ ASSERT_FALSE(hoststr == NULL);
318
+ ASSERT_STREQ("localhost", hoststr);
319
+
320
+ hoststr = lcb_get_port(instance);
321
+ ASSERT_FALSE(hoststr == NULL);
322
+ ASSERT_STREQ("8091", hoststr);
323
+
324
+ lcb_destroy(instance);
325
+ }
326
+
327
+ TEST_F(MockUnitTest, testEmptyKeys)
328
+ {
329
+ lcb_t instance;
330
+ HandleWrap hw;
331
+ createConnection(hw, instance);
332
+
333
+ union {
334
+ lcb_CMDGET get;
335
+ lcb_CMDSTORE store;
336
+ lcb_CMDCOUNTER counter;
337
+ lcb_CMDENDURE endure;
338
+ lcb_CMDOBSERVE observe;
339
+ lcb_CMDTOUCH touch;
340
+ lcb_CMDUNLOCK unlock;
341
+ lcb_CMDGETREPLICA rget;
342
+ lcb_CMDBASE base;
343
+ lcb_CMDSTATS stats;
344
+ } u;
345
+ memset(&u, 0, sizeof u);
346
+
347
+ lcb_sched_enter(instance);
348
+
349
+ ASSERT_EQ(LCB_EMPTY_KEY, lcb_get3(instance, NULL, &u.get));
350
+ ASSERT_EQ(LCB_EMPTY_KEY, lcb_store3(instance, NULL, &u.store));
351
+ ASSERT_EQ(LCB_EMPTY_KEY, lcb_counter3(instance, NULL, &u.counter));
352
+ ASSERT_EQ(LCB_EMPTY_KEY, lcb_touch3(instance, NULL, &u.touch));
353
+ ASSERT_EQ(LCB_EMPTY_KEY, lcb_unlock3(instance, NULL, &u.unlock));
354
+ ASSERT_EQ(LCB_EMPTY_KEY, lcb_rget3(instance, NULL, &u.rget));
355
+
356
+ // Observe and such
357
+ lcb_MULTICMD_CTX *ctx = lcb_observe3_ctxnew(instance);
358
+ ASSERT_EQ(LCB_EMPTY_KEY, ctx->addcmd(ctx, (lcb_CMDBASE*)&u.observe));
359
+ ctx->fail(ctx);
360
+
361
+ lcb_durability_opts_t dopts;
362
+ memset(&dopts, 0, sizeof dopts);
363
+ dopts.v.v0.persist_to = 1;
364
+
365
+ ctx = lcb_endure3_ctxnew(instance, &dopts, NULL);
366
+ ASSERT_TRUE(ctx != NULL);
367
+ ASSERT_EQ(LCB_EMPTY_KEY, ctx->addcmd(ctx, (lcb_CMDBASE*)&u.endure));
368
+ ctx->fail(ctx);
369
+
370
+ ASSERT_EQ(LCB_SUCCESS, lcb_stats3(instance, NULL, &u.stats));
371
+ lcb_sched_fail(instance);
372
+ }
373
+
374
+ template <typename T>
375
+ static bool ctlSet(lcb_t instance, int setting, T val)
376
+ {
377
+ lcb_error_t err = lcb_cntl(instance, LCB_CNTL_SET, setting, &val);
378
+ return err == LCB_SUCCESS;
379
+ }
380
+
381
+ template<>
382
+ bool ctlSet<const char*>(lcb_t instance, int setting, const char *val)
383
+ {
384
+ return lcb_cntl(instance, LCB_CNTL_SET, setting, (void*)val) == LCB_SUCCESS;
385
+ }
386
+
387
+ template <typename T>
388
+ static T ctlGet(lcb_t instance, int setting)
389
+ {
390
+ T tmp;
391
+ lcb_error_t err = lcb_cntl(instance, LCB_CNTL_GET, setting, &tmp);
392
+ EXPECT_EQ(LCB_SUCCESS, err);
393
+ return tmp;
394
+ }
395
+ template <typename T>
396
+ static void ctlGetSet(lcb_t instance, int setting, T val) {
397
+ EXPECT_TRUE(ctlSet<T>(instance, setting, val));
398
+ EXPECT_EQ(val, ctlGet<T>(instance, setting));
399
+ }
400
+
401
+ template <>
402
+ void ctlGetSet<const char*>(lcb_t instance, int setting, const char *val)
403
+ {
404
+ EXPECT_TRUE(ctlSet<const char*>(instance, setting, val));
405
+ EXPECT_STREQ(val, ctlGet<const char*>(instance, setting));
406
+ }
407
+
408
+ static bool ctlSetInt(lcb_t instance, int setting, int val) {
409
+ return ctlSet<int>(instance, setting, val);
410
+ }
411
+ static int ctlGetInt(lcb_t instance, int setting) {
412
+ return ctlGet<int>(instance, setting);
413
+ }
414
+ static bool ctlSetU32(lcb_t instance, int setting, lcb_U32 val) {
415
+ return ctlSet<lcb_U32>(instance, setting, val);
416
+ }
417
+ static lcb_U32 ctlGetU32(lcb_t instance, int setting) {
418
+ return ctlGet<lcb_U32>(instance, setting);
419
+ }
420
+
421
+ TEST_F(MockUnitTest, testCtls)
422
+ {
423
+ lcb_t instance;
424
+ HandleWrap hw;
425
+ lcb_error_t err;
426
+ createConnection(hw, instance);
427
+
428
+ ctlGetSet<lcb_U32>(instance, LCB_CNTL_OP_TIMEOUT, UINT_MAX);
429
+ ctlGetSet<lcb_U32>(instance, LCB_CNTL_VIEW_TIMEOUT, UINT_MAX);
430
+
431
+ ASSERT_EQ(LCB_TYPE_BUCKET, ctlGet<lcb_type_t>(instance, LCB_CNTL_HANDLETYPE));
432
+ ASSERT_FALSE(ctlSet<lcb_type_t>(instance, LCB_CNTL_HANDLETYPE, LCB_TYPE_BUCKET));
433
+
434
+ lcbvb_CONFIG *cfg = ctlGet<lcbvb_CONFIG*>(instance, LCB_CNTL_VBCONFIG);
435
+ // Do we have a way to verify this?
436
+ ASSERT_FALSE(cfg == NULL);
437
+ ASSERT_GT(cfg->nsrv, 0);
438
+
439
+ lcb_io_opt_t io = ctlGet<lcb_io_opt_t>(instance, LCB_CNTL_IOPS);
440
+ ASSERT_TRUE(io == instance->getIOT()->p);
441
+ // Try to set it?
442
+ ASSERT_FALSE(ctlSet<lcb_io_opt_t>(instance, LCB_CNTL_IOPS, (lcb_io_opt_t)"Hello"));
443
+
444
+ // Map a key
445
+ lcb_cntl_vbinfo_t vbi = { 0 };
446
+ vbi.v.v0.key = "123";
447
+ vbi.v.v0.nkey = 3;
448
+ err = lcb_cntl(instance, LCB_CNTL_GET, LCB_CNTL_VBMAP, &vbi);
449
+ ASSERT_EQ(LCB_SUCCESS, err);
450
+
451
+ // Try to modify it?
452
+ err = lcb_cntl(instance, LCB_CNTL_SET, LCB_CNTL_VBMAP, &vbi);
453
+ ASSERT_NE(LCB_SUCCESS, err);
454
+
455
+ ctlGetSet<lcb_ipv6_t>(instance, LCB_CNTL_IP6POLICY, LCB_IPV6_DISABLED);
456
+ ctlGetSet<lcb_ipv6_t>(instance, LCB_CNTL_IP6POLICY, LCB_IPV6_ONLY);
457
+ ctlGetSet<lcb_SIZE>(instance, LCB_CNTL_CONFERRTHRESH, UINT_MAX);
458
+ ctlGetSet<lcb_U32>(instance, LCB_CNTL_DURABILITY_TIMEOUT, UINT_MAX);
459
+ ctlGetSet<lcb_U32>(instance, LCB_CNTL_DURABILITY_INTERVAL, UINT_MAX);
460
+ ctlGetSet<lcb_U32>(instance, LCB_CNTL_HTTP_TIMEOUT, UINT_MAX);
461
+ ctlGetSet<int>(instance, LCB_CNTL_IOPS_DLOPEN_DEBUG, 55);
462
+ ctlGetSet<lcb_U32>(instance, LCB_CNTL_CONFIGURATION_TIMEOUT, UINT_MAX);
463
+
464
+ ctlGetSet<int>(instance, LCB_CNTL_RANDOMIZE_BOOTSTRAP_HOSTS, 1);
465
+ ctlGetSet<int>(instance, LCB_CNTL_RANDOMIZE_BOOTSTRAP_HOSTS, 0);
466
+
467
+ ASSERT_EQ(0, ctlGetInt(instance, LCB_CNTL_CONFIG_CACHE_LOADED));
468
+ ASSERT_FALSE(ctlSetInt(instance, LCB_CNTL_CONFIG_CACHE_LOADED, 99));
469
+
470
+ ctlGetSet<const char*>(instance, LCB_CNTL_FORCE_SASL_MECH, "SECRET");
471
+
472
+ ctlGetSet<int>(instance, LCB_CNTL_MAX_REDIRECTS, SHRT_MAX);
473
+ ctlGetSet<int>(instance, LCB_CNTL_MAX_REDIRECTS, -1);
474
+ ctlGetSet<int>(instance, LCB_CNTL_MAX_REDIRECTS, 0);
475
+
476
+ // LCB_CNTL_LOGGER handled in other tests
477
+
478
+ ctlGetSet<lcb_U32>(instance, LCB_CNTL_CONFDELAY_THRESH, UINT_MAX);
479
+
480
+ // CONFIG_TRANSPORT. Test that we shouldn't be able to set it
481
+ ASSERT_FALSE(ctlSet<lcb_config_transport_t>(
482
+ instance, LCB_CNTL_CONFIG_TRANSPORT, LCB_CONFIG_TRANSPORT_LIST_END));
483
+
484
+ ctlGetSet<lcb_U32>(instance, LCB_CNTL_CONFIG_NODE_TIMEOUT, UINT_MAX);
485
+ ctlGetSet<lcb_U32>(instance, LCB_CNTL_HTCONFIG_IDLE_TIMEOUT, UINT_MAX);
486
+
487
+ ASSERT_FALSE(ctlSet<const char*>(instance, LCB_CNTL_CHANGESET, "deadbeef"));
488
+ ASSERT_FALSE(ctlGet<const char*>(instance, LCB_CNTL_CHANGESET) == NULL);
489
+ ctlGetSet<const char*>(instance, LCB_CNTL_CONFIGCACHE, "/foo/bar/baz");
490
+ ASSERT_FALSE(ctlSetInt(instance, LCB_CNTL_SSL_MODE, 90));
491
+ ASSERT_GE(ctlGetInt(instance, LCB_CNTL_SSL_MODE), 0);
492
+ ASSERT_FALSE(ctlSet<const char*>(instance, LCB_CNTL_SSL_CACERT, "/tmp"));
493
+
494
+ lcb_U32 ro_in, ro_out;
495
+ ro_in = LCB_RETRYOPT_CREATE(LCB_RETRY_ON_SOCKERR, LCB_RETRY_CMDS_GET);
496
+ ASSERT_TRUE(ctlSet<lcb_U32>(instance, LCB_CNTL_RETRYMODE, ro_in));
497
+
498
+ ro_out = LCB_RETRYOPT_CREATE(LCB_RETRY_ON_SOCKERR, 0);
499
+ err = lcb_cntl(instance, LCB_CNTL_GET, LCB_CNTL_RETRYMODE, &ro_out);
500
+ ASSERT_EQ(LCB_SUCCESS, err);
501
+ ASSERT_EQ(LCB_RETRY_CMDS_GET, LCB_RETRYOPT_GETPOLICY(ro_out));
502
+
503
+ ASSERT_EQ(LCB_SUCCESS, lcb_cntl_string(instance, "retry_policy", "topochange:get"));
504
+ ro_out = LCB_RETRYOPT_CREATE(LCB_RETRY_ON_TOPOCHANGE, 0);
505
+ err = lcb_cntl(instance, LCB_CNTL_GET, LCB_CNTL_RETRYMODE, &ro_out);
506
+ ASSERT_EQ(LCB_RETRY_CMDS_GET, LCB_RETRYOPT_GETPOLICY(ro_out));
507
+
508
+
509
+ ctlGetSet<int>(instance, LCB_CNTL_HTCONFIG_URLTYPE, LCB_HTCONFIG_URLTYPE_COMPAT);
510
+ ctlGetSet<int>(instance, LCB_CNTL_COMPRESSION_OPTS, LCB_COMPRESS_FORCE);
511
+
512
+ ctlSetU32(instance, LCB_CNTL_CONLOGGER_LEVEL, 3);
513
+ lcb_U32 tmp;
514
+ err = lcb_cntl(instance, LCB_CNTL_GET, LCB_CNTL_CONLOGGER_LEVEL, &tmp);
515
+ ASSERT_NE(LCB_SUCCESS, err);
516
+
517
+ ctlGetSet<int>(instance, LCB_CNTL_DETAILED_ERRCODES, 1);
518
+ ctlGetSet<lcb_U32>(instance, LCB_CNTL_RETRY_INTERVAL, UINT_MAX);
519
+ ctlGetSet<float>(instance, LCB_CNTL_RETRY_BACKOFF, 3.4);
520
+ ctlGetSet<lcb_SIZE>(instance, LCB_CNTL_HTTP_POOLSIZE, UINT_MAX);
521
+ ctlGetSet<int>(instance, LCB_CNTL_HTTP_REFRESH_CONFIG_ON_ERROR, 0);
522
+
523
+ // Allow timeouts to be expressed as fractional seconds.
524
+ err = lcb_cntl_string(instance, "operation_timeout", "1.0");
525
+ ASSERT_EQ(LCB_SUCCESS, err);
526
+ ASSERT_EQ(1000000, ctlGet<lcb_U32>(instance, LCB_CNTL_OP_TIMEOUT));
527
+ err = lcb_cntl_string(instance, "operation_timeout", "0.255");
528
+ ASSERT_EQ(LCB_SUCCESS, err);
529
+ ASSERT_EQ(255000, ctlGet<lcb_U32>(instance, LCB_CNTL_OP_TIMEOUT));
530
+
531
+ // Test default for nmv retry
532
+ int itmp = ctlGetInt(instance, LCB_CNTL_RETRY_NMV_IMM);
533
+ ASSERT_NE(0, itmp);
534
+
535
+ err = lcb_cntl_string(instance, "retry_nmv_imm", "0");
536
+ ASSERT_EQ(LCB_SUCCESS, err);
537
+ itmp = ctlGetInt(instance, LCB_CNTL_RETRY_NMV_IMM);
538
+ ASSERT_EQ(0, itmp);
539
+ }
540
+
541
+ TEST_F(MockUnitTest, testConflictingOptions)
542
+ {
543
+ HandleWrap hw;
544
+ lcb_t instance;
545
+ createConnection(hw, instance);
546
+
547
+ lcb_sched_enter(instance);
548
+ const char *key = "key";
549
+ size_t nkey = 3;
550
+ const char *value = "value";
551
+ size_t nvalue = 5;
552
+
553
+ lcb_CMDSTORE scmd = { 0 };
554
+ scmd.operation = LCB_APPEND;
555
+ scmd.exptime = 1;
556
+ LCB_CMD_SET_KEY(&scmd, key, nkey);
557
+ LCB_CMD_SET_VALUE(&scmd, value, nvalue);
558
+
559
+ lcb_error_t err;
560
+ err = lcb_store3(instance, NULL, &scmd);
561
+ ASSERT_EQ(LCB_OPTIONS_CONFLICT, err);
562
+ scmd.exptime = 0;
563
+ scmd.flags = 99;
564
+ err = lcb_store3(instance, NULL, &scmd);
565
+ ASSERT_EQ(LCB_OPTIONS_CONFLICT, err);
566
+
567
+ scmd.flags = 0;
568
+ scmd.exptime = 0;
569
+ err = lcb_store3(instance, NULL, &scmd);
570
+ ASSERT_EQ(LCB_SUCCESS, err);
571
+
572
+ scmd.operation = LCB_ADD;
573
+ scmd.cas = 0xdeadbeef;
574
+ err = lcb_store3(instance, NULL, &scmd);
575
+ ASSERT_EQ(LCB_OPTIONS_CONFLICT, err);
576
+
577
+ scmd.cas = 0;
578
+ err = lcb_store3(instance, NULL, &scmd);
579
+ ASSERT_EQ(LCB_SUCCESS, err);
580
+
581
+ lcb_CMDCOUNTER ccmd = { 0 };
582
+ LCB_CMD_SET_KEY(&ccmd, key, nkey);
583
+ ccmd.cas = 0xdeadbeef;
584
+ err = lcb_counter3(instance, NULL, &ccmd);
585
+ ASSERT_EQ(LCB_OPTIONS_CONFLICT, err);
586
+ ccmd.cas = 0;
587
+ err = lcb_counter3(instance, NULL, &ccmd);
588
+ ASSERT_EQ(LCB_SUCCESS, err);
589
+
590
+ ccmd.exptime = 10;
591
+ ccmd.initial = 0;
592
+ ccmd.create = 0;
593
+ err = lcb_counter3(instance, NULL, &ccmd);
594
+ ASSERT_EQ(LCB_OPTIONS_CONFLICT, err);
595
+ ccmd.create = 1;
596
+ err = lcb_counter3(instance, NULL, &ccmd);
597
+ ASSERT_EQ(LCB_SUCCESS, err);
598
+
599
+ lcb_CMDGET gcmd = { 0 };
600
+ LCB_CMD_SET_KEY(&gcmd, key, nkey);
601
+ gcmd.cas = 0xdeadbeef;
602
+ err = lcb_get3(instance, NULL, &gcmd);
603
+ ASSERT_EQ(LCB_OPTIONS_CONFLICT, err);
604
+
605
+ gcmd.cas = 0;
606
+ err = lcb_get3(instance, NULL, &gcmd);
607
+ ASSERT_EQ(LCB_SUCCESS, err);
608
+ lcb_sched_fail(instance);
609
+ }
610
+
611
+ TEST_F(MockUnitTest, testDump)
612
+ {
613
+ const char *fpname;
614
+ #ifdef _WIN32
615
+ fpname = "NUL:";
616
+ #else
617
+ fpname = "/dev/null";
618
+ #endif
619
+ FILE *fp = fopen(fpname, "w");
620
+ if (!fp) {
621
+ perror(fpname);
622
+ return;
623
+ }
624
+
625
+ // Simply try to dump the instance;
626
+ HandleWrap hw;
627
+ lcb_t instance;
628
+ createConnection(hw, instance);
629
+ std::vector<std::string> keys;
630
+ genDistKeys(LCBT_VBCONFIG(instance), keys);
631
+ for (size_t ii = 0; ii < keys.size(); ii++) {
632
+ storeKey(instance, keys[ii], keys[ii]);
633
+ }
634
+ lcb_dump(instance, fp, LCB_DUMP_ALL);
635
+ fclose(fp);
636
+ }
637
+
638
+ TEST_F(MockUnitTest, testRefreshConfig)
639
+ {
640
+ HandleWrap hw;
641
+ lcb_t instance;
642
+ createConnection(hw, instance);
643
+ lcb_refresh_config(instance);
644
+ lcb_wait3(instance, LCB_WAIT_NOCHECK);
645
+ }
646
+
647
+ extern "C" {
648
+ static void tickOpCb(lcb_t, int, const lcb_RESPBASE *rb)
649
+ {
650
+ int *p = (int *)rb->cookie;
651
+ *p -= 1;
652
+ EXPECT_EQ(LCB_SUCCESS, rb->rc);
653
+ }
654
+ }
655
+
656
+ TEST_F(MockUnitTest, testTickLoop)
657
+ {
658
+ HandleWrap hw;
659
+ lcb_t instance;
660
+ lcb_error_t err;
661
+ createConnection(hw, instance);
662
+
663
+ const char *key = "tickKey";
664
+ const char *value = "tickValue";
665
+
666
+ lcb_install_callback3(instance, LCB_CALLBACK_STORE, tickOpCb);
667
+ lcb_CMDSTORE cmd = { 0 };
668
+ cmd.operation = LCB_SET;
669
+ LCB_CMD_SET_KEY(&cmd, key, strlen(key));
670
+ LCB_CMD_SET_VALUE(&cmd, value, strlen(value));
671
+
672
+ err = lcb_tick_nowait(instance);
673
+ if (err == LCB_CLIENT_FEATURE_UNAVAILABLE) {
674
+ fprintf(stderr, "Current event loop does not support tick!");
675
+ return;
676
+ }
677
+
678
+ lcb_sched_enter(instance);
679
+ int counter = 0;
680
+ for (int ii = 0; ii < 10; ii++) {
681
+ err = lcb_store3(instance, &counter, &cmd);
682
+ ASSERT_EQ(LCB_SUCCESS, err);
683
+ counter++;
684
+ }
685
+
686
+ lcb_sched_leave(instance);
687
+ while (counter) {
688
+ lcb_tick_nowait(instance);
689
+ }
690
+ }
691
+
692
+ TEST_F(MockUnitTest, testEmptyCtx)
693
+ {
694
+ HandleWrap hw;
695
+ lcb_t instance;
696
+ lcb_error_t err = LCB_SUCCESS;
697
+ createConnection(hw, instance);
698
+
699
+ lcb_MULTICMD_CTX *mctx;
700
+ lcb_durability_opts_t duropts = { 0 };
701
+ duropts.v.v0.persist_to = 1;
702
+ mctx = lcb_endure3_ctxnew(instance, &duropts, &err);
703
+ ASSERT_EQ(LCB_SUCCESS, err);
704
+ ASSERT_FALSE(mctx == NULL);
705
+
706
+ err = mctx->done(mctx, NULL);
707
+ ASSERT_NE(LCB_SUCCESS, err);
708
+
709
+ mctx = lcb_observe3_ctxnew(instance);
710
+ ASSERT_FALSE(mctx == NULL);
711
+ err = mctx->done(mctx, NULL);
712
+ ASSERT_NE(LCB_SUCCESS, err);
713
+ }