@point3/node-rdkafka 3.6.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 (707) hide show
  1. package/LICENSE.txt +20 -0
  2. package/README.md +636 -0
  3. package/binding.gyp +154 -0
  4. package/deps/librdkafka/.clang-format +136 -0
  5. package/deps/librdkafka/.clang-format-cpp +103 -0
  6. package/deps/librdkafka/.dir-locals.el +10 -0
  7. package/deps/librdkafka/.formatignore +33 -0
  8. package/deps/librdkafka/.gdbmacros +19 -0
  9. package/deps/librdkafka/.github/CODEOWNERS +1 -0
  10. package/deps/librdkafka/.github/ISSUE_TEMPLATE +34 -0
  11. package/deps/librdkafka/.semaphore/run-all-tests.yml +77 -0
  12. package/deps/librdkafka/.semaphore/semaphore-integration.yml +250 -0
  13. package/deps/librdkafka/.semaphore/semaphore.yml +378 -0
  14. package/deps/librdkafka/.semaphore/verify-linux-packages.yml +41 -0
  15. package/deps/librdkafka/CHANGELOG.md +2208 -0
  16. package/deps/librdkafka/CMakeLists.txt +291 -0
  17. package/deps/librdkafka/CODE_OF_CONDUCT.md +46 -0
  18. package/deps/librdkafka/CONFIGURATION.md +209 -0
  19. package/deps/librdkafka/CONTRIBUTING.md +431 -0
  20. package/deps/librdkafka/Doxyfile +2375 -0
  21. package/deps/librdkafka/INTRODUCTION.md +2481 -0
  22. package/deps/librdkafka/LICENSE +26 -0
  23. package/deps/librdkafka/LICENSE.cjson +22 -0
  24. package/deps/librdkafka/LICENSE.crc32c +28 -0
  25. package/deps/librdkafka/LICENSE.fnv1a +18 -0
  26. package/deps/librdkafka/LICENSE.hdrhistogram +27 -0
  27. package/deps/librdkafka/LICENSE.lz4 +26 -0
  28. package/deps/librdkafka/LICENSE.murmur2 +25 -0
  29. package/deps/librdkafka/LICENSE.nanopb +22 -0
  30. package/deps/librdkafka/LICENSE.opentelemetry +203 -0
  31. package/deps/librdkafka/LICENSE.pycrc +23 -0
  32. package/deps/librdkafka/LICENSE.queue +31 -0
  33. package/deps/librdkafka/LICENSE.regexp +5 -0
  34. package/deps/librdkafka/LICENSE.snappy +36 -0
  35. package/deps/librdkafka/LICENSE.tinycthread +26 -0
  36. package/deps/librdkafka/LICENSE.wingetopt +49 -0
  37. package/deps/librdkafka/LICENSES.txt +625 -0
  38. package/deps/librdkafka/Makefile +125 -0
  39. package/deps/librdkafka/README.md +199 -0
  40. package/deps/librdkafka/README.win32 +26 -0
  41. package/deps/librdkafka/STATISTICS.md +624 -0
  42. package/deps/librdkafka/configure +214 -0
  43. package/deps/librdkafka/configure.self +331 -0
  44. package/deps/librdkafka/debian/changelog +111 -0
  45. package/deps/librdkafka/debian/compat +1 -0
  46. package/deps/librdkafka/debian/control +71 -0
  47. package/deps/librdkafka/debian/copyright +99 -0
  48. package/deps/librdkafka/debian/gbp.conf +9 -0
  49. package/deps/librdkafka/debian/librdkafka++1.install +1 -0
  50. package/deps/librdkafka/debian/librdkafka-dev.examples +2 -0
  51. package/deps/librdkafka/debian/librdkafka-dev.install +9 -0
  52. package/deps/librdkafka/debian/librdkafka1.docs +5 -0
  53. package/deps/librdkafka/debian/librdkafka1.install +1 -0
  54. package/deps/librdkafka/debian/librdkafka1.symbols +135 -0
  55. package/deps/librdkafka/debian/rules +19 -0
  56. package/deps/librdkafka/debian/source/format +1 -0
  57. package/deps/librdkafka/debian/watch +2 -0
  58. package/deps/librdkafka/dev-conf.sh +123 -0
  59. package/deps/librdkafka/examples/CMakeLists.txt +79 -0
  60. package/deps/librdkafka/examples/Makefile +167 -0
  61. package/deps/librdkafka/examples/README.md +42 -0
  62. package/deps/librdkafka/examples/alter_consumer_group_offsets.c +338 -0
  63. package/deps/librdkafka/examples/consumer.c +271 -0
  64. package/deps/librdkafka/examples/delete_records.c +233 -0
  65. package/deps/librdkafka/examples/describe_cluster.c +322 -0
  66. package/deps/librdkafka/examples/describe_consumer_groups.c +455 -0
  67. package/deps/librdkafka/examples/describe_topics.c +427 -0
  68. package/deps/librdkafka/examples/elect_leaders.c +317 -0
  69. package/deps/librdkafka/examples/globals.json +11 -0
  70. package/deps/librdkafka/examples/idempotent_producer.c +344 -0
  71. package/deps/librdkafka/examples/incremental_alter_configs.c +347 -0
  72. package/deps/librdkafka/examples/kafkatest_verifiable_client.cpp +945 -0
  73. package/deps/librdkafka/examples/list_consumer_group_offsets.c +359 -0
  74. package/deps/librdkafka/examples/list_consumer_groups.c +365 -0
  75. package/deps/librdkafka/examples/list_offsets.c +327 -0
  76. package/deps/librdkafka/examples/misc.c +287 -0
  77. package/deps/librdkafka/examples/openssl_engine_example.cpp +248 -0
  78. package/deps/librdkafka/examples/producer.c +251 -0
  79. package/deps/librdkafka/examples/producer.cpp +228 -0
  80. package/deps/librdkafka/examples/rdkafka_complex_consumer_example.c +617 -0
  81. package/deps/librdkafka/examples/rdkafka_complex_consumer_example.cpp +467 -0
  82. package/deps/librdkafka/examples/rdkafka_consume_batch.cpp +264 -0
  83. package/deps/librdkafka/examples/rdkafka_example.c +853 -0
  84. package/deps/librdkafka/examples/rdkafka_example.cpp +679 -0
  85. package/deps/librdkafka/examples/rdkafka_performance.c +1781 -0
  86. package/deps/librdkafka/examples/transactions-older-broker.c +668 -0
  87. package/deps/librdkafka/examples/transactions.c +665 -0
  88. package/deps/librdkafka/examples/user_scram.c +491 -0
  89. package/deps/librdkafka/examples/win_ssl_cert_store.cpp +396 -0
  90. package/deps/librdkafka/lds-gen.py +73 -0
  91. package/deps/librdkafka/mainpage.doxy +40 -0
  92. package/deps/librdkafka/mklove/Makefile.base +329 -0
  93. package/deps/librdkafka/mklove/modules/configure.atomics +144 -0
  94. package/deps/librdkafka/mklove/modules/configure.base +2484 -0
  95. package/deps/librdkafka/mklove/modules/configure.builtin +70 -0
  96. package/deps/librdkafka/mklove/modules/configure.cc +186 -0
  97. package/deps/librdkafka/mklove/modules/configure.cxx +8 -0
  98. package/deps/librdkafka/mklove/modules/configure.fileversion +65 -0
  99. package/deps/librdkafka/mklove/modules/configure.gitversion +29 -0
  100. package/deps/librdkafka/mklove/modules/configure.good_cflags +18 -0
  101. package/deps/librdkafka/mklove/modules/configure.host +132 -0
  102. package/deps/librdkafka/mklove/modules/configure.lib +49 -0
  103. package/deps/librdkafka/mklove/modules/configure.libcurl +99 -0
  104. package/deps/librdkafka/mklove/modules/configure.libsasl2 +36 -0
  105. package/deps/librdkafka/mklove/modules/configure.libssl +147 -0
  106. package/deps/librdkafka/mklove/modules/configure.libzstd +58 -0
  107. package/deps/librdkafka/mklove/modules/configure.parseversion +95 -0
  108. package/deps/librdkafka/mklove/modules/configure.pic +16 -0
  109. package/deps/librdkafka/mklove/modules/configure.socket +20 -0
  110. package/deps/librdkafka/mklove/modules/configure.zlib +61 -0
  111. package/deps/librdkafka/mklove/modules/patches/README.md +8 -0
  112. package/deps/librdkafka/mklove/modules/patches/libcurl.0000-no-runtime-linking-check.patch +11 -0
  113. package/deps/librdkafka/mklove/modules/patches/libssl.0000-osx-rand-include-fix-OpenSSL-PR16409.patch +56 -0
  114. package/deps/librdkafka/packaging/RELEASE.md +319 -0
  115. package/deps/librdkafka/packaging/alpine/build-alpine.sh +38 -0
  116. package/deps/librdkafka/packaging/archlinux/PKGBUILD +30 -0
  117. package/deps/librdkafka/packaging/cmake/Config.cmake.in +37 -0
  118. package/deps/librdkafka/packaging/cmake/Modules/FindLZ4.cmake +38 -0
  119. package/deps/librdkafka/packaging/cmake/Modules/FindZSTD.cmake +27 -0
  120. package/deps/librdkafka/packaging/cmake/Modules/LICENSE.FindZstd +178 -0
  121. package/deps/librdkafka/packaging/cmake/README.md +38 -0
  122. package/deps/librdkafka/packaging/cmake/config.h.in +52 -0
  123. package/deps/librdkafka/packaging/cmake/parseversion.cmake +60 -0
  124. package/deps/librdkafka/packaging/cmake/rdkafka.pc.in +12 -0
  125. package/deps/librdkafka/packaging/cmake/try_compile/atomic_32_test.c +8 -0
  126. package/deps/librdkafka/packaging/cmake/try_compile/atomic_64_test.c +8 -0
  127. package/deps/librdkafka/packaging/cmake/try_compile/c11threads_test.c +14 -0
  128. package/deps/librdkafka/packaging/cmake/try_compile/crc32c_hw_test.c +27 -0
  129. package/deps/librdkafka/packaging/cmake/try_compile/dlopen_test.c +11 -0
  130. package/deps/librdkafka/packaging/cmake/try_compile/libsasl2_test.c +7 -0
  131. package/deps/librdkafka/packaging/cmake/try_compile/pthread_setname_darwin_test.c +6 -0
  132. package/deps/librdkafka/packaging/cmake/try_compile/pthread_setname_freebsd_test.c +7 -0
  133. package/deps/librdkafka/packaging/cmake/try_compile/pthread_setname_gnu_test.c +5 -0
  134. package/deps/librdkafka/packaging/cmake/try_compile/rand_r_test.c +7 -0
  135. package/deps/librdkafka/packaging/cmake/try_compile/rdkafka_setup.cmake +122 -0
  136. package/deps/librdkafka/packaging/cmake/try_compile/regex_test.c +10 -0
  137. package/deps/librdkafka/packaging/cmake/try_compile/strndup_test.c +5 -0
  138. package/deps/librdkafka/packaging/cmake/try_compile/sync_32_test.c +8 -0
  139. package/deps/librdkafka/packaging/cmake/try_compile/sync_64_test.c +8 -0
  140. package/deps/librdkafka/packaging/cp/README.md +16 -0
  141. package/deps/librdkafka/packaging/cp/check_features.c +72 -0
  142. package/deps/librdkafka/packaging/cp/verify-deb.sh +33 -0
  143. package/deps/librdkafka/packaging/cp/verify-packages.sh +69 -0
  144. package/deps/librdkafka/packaging/cp/verify-rpm.sh +32 -0
  145. package/deps/librdkafka/packaging/debian/changelog +66 -0
  146. package/deps/librdkafka/packaging/debian/compat +1 -0
  147. package/deps/librdkafka/packaging/debian/control +49 -0
  148. package/deps/librdkafka/packaging/debian/copyright +84 -0
  149. package/deps/librdkafka/packaging/debian/docs +5 -0
  150. package/deps/librdkafka/packaging/debian/gbp.conf +9 -0
  151. package/deps/librdkafka/packaging/debian/librdkafka-dev.dirs +2 -0
  152. package/deps/librdkafka/packaging/debian/librdkafka-dev.examples +2 -0
  153. package/deps/librdkafka/packaging/debian/librdkafka-dev.install +6 -0
  154. package/deps/librdkafka/packaging/debian/librdkafka-dev.substvars +1 -0
  155. package/deps/librdkafka/packaging/debian/librdkafka.dsc +16 -0
  156. package/deps/librdkafka/packaging/debian/librdkafka1-dbg.substvars +1 -0
  157. package/deps/librdkafka/packaging/debian/librdkafka1.dirs +1 -0
  158. package/deps/librdkafka/packaging/debian/librdkafka1.install +2 -0
  159. package/deps/librdkafka/packaging/debian/librdkafka1.postinst.debhelper +5 -0
  160. package/deps/librdkafka/packaging/debian/librdkafka1.postrm.debhelper +5 -0
  161. package/deps/librdkafka/packaging/debian/librdkafka1.symbols +64 -0
  162. package/deps/librdkafka/packaging/debian/rules +19 -0
  163. package/deps/librdkafka/packaging/debian/source/format +1 -0
  164. package/deps/librdkafka/packaging/debian/watch +2 -0
  165. package/deps/librdkafka/packaging/get_version.py +21 -0
  166. package/deps/librdkafka/packaging/homebrew/README.md +15 -0
  167. package/deps/librdkafka/packaging/homebrew/brew-update-pr.sh +31 -0
  168. package/deps/librdkafka/packaging/mingw-w64/configure-build-msys2-mingw-static.sh +52 -0
  169. package/deps/librdkafka/packaging/mingw-w64/configure-build-msys2-mingw.sh +21 -0
  170. package/deps/librdkafka/packaging/mingw-w64/export-variables.sh +13 -0
  171. package/deps/librdkafka/packaging/mingw-w64/run-tests.sh +6 -0
  172. package/deps/librdkafka/packaging/mingw-w64/semaphoreci-build.sh +38 -0
  173. package/deps/librdkafka/packaging/nuget/README.md +84 -0
  174. package/deps/librdkafka/packaging/nuget/artifact.py +177 -0
  175. package/deps/librdkafka/packaging/nuget/cleanup-s3.py +143 -0
  176. package/deps/librdkafka/packaging/nuget/common/p-common__plat-windows__arch-win32__bldtype-Release/msvcr120.zip +0 -0
  177. package/deps/librdkafka/packaging/nuget/common/p-common__plat-windows__arch-win32__bldtype-Release/msvcr140.zip +0 -0
  178. package/deps/librdkafka/packaging/nuget/common/p-common__plat-windows__arch-x64__bldtype-Release/msvcr120.zip +0 -0
  179. package/deps/librdkafka/packaging/nuget/common/p-common__plat-windows__arch-x64__bldtype-Release/msvcr140.zip +0 -0
  180. package/deps/librdkafka/packaging/nuget/nuget.sh +21 -0
  181. package/deps/librdkafka/packaging/nuget/nugetpackage.py +278 -0
  182. package/deps/librdkafka/packaging/nuget/packaging.py +448 -0
  183. package/deps/librdkafka/packaging/nuget/push-to-nuget.sh +21 -0
  184. package/deps/librdkafka/packaging/nuget/release.py +167 -0
  185. package/deps/librdkafka/packaging/nuget/requirements.txt +3 -0
  186. package/deps/librdkafka/packaging/nuget/staticpackage.py +178 -0
  187. package/deps/librdkafka/packaging/nuget/templates/librdkafka.redist.nuspec +21 -0
  188. package/deps/librdkafka/packaging/nuget/templates/librdkafka.redist.props +18 -0
  189. package/deps/librdkafka/packaging/nuget/templates/librdkafka.redist.targets +19 -0
  190. package/deps/librdkafka/packaging/nuget/zfile/__init__.py +0 -0
  191. package/deps/librdkafka/packaging/nuget/zfile/zfile.py +98 -0
  192. package/deps/librdkafka/packaging/rpm/Makefile +92 -0
  193. package/deps/librdkafka/packaging/rpm/README.md +23 -0
  194. package/deps/librdkafka/packaging/rpm/el7-x86_64.cfg +40 -0
  195. package/deps/librdkafka/packaging/rpm/librdkafka.spec +118 -0
  196. package/deps/librdkafka/packaging/rpm/mock-on-docker.sh +96 -0
  197. package/deps/librdkafka/packaging/rpm/tests/Makefile +25 -0
  198. package/deps/librdkafka/packaging/rpm/tests/README.md +8 -0
  199. package/deps/librdkafka/packaging/rpm/tests/run-test.sh +42 -0
  200. package/deps/librdkafka/packaging/rpm/tests/test-on-docker.sh +56 -0
  201. package/deps/librdkafka/packaging/rpm/tests/test.c +77 -0
  202. package/deps/librdkafka/packaging/rpm/tests/test.cpp +34 -0
  203. package/deps/librdkafka/packaging/tools/Dockerfile +31 -0
  204. package/deps/librdkafka/packaging/tools/build-configurations-checks.sh +12 -0
  205. package/deps/librdkafka/packaging/tools/build-deb-package.sh +64 -0
  206. package/deps/librdkafka/packaging/tools/build-debian.sh +65 -0
  207. package/deps/librdkafka/packaging/tools/build-manylinux.sh +68 -0
  208. package/deps/librdkafka/packaging/tools/build-release-artifacts.sh +139 -0
  209. package/deps/librdkafka/packaging/tools/distro-build.sh +38 -0
  210. package/deps/librdkafka/packaging/tools/gh-release-checksums.py +39 -0
  211. package/deps/librdkafka/packaging/tools/rdutcoverage.sh +25 -0
  212. package/deps/librdkafka/packaging/tools/requirements.txt +2 -0
  213. package/deps/librdkafka/packaging/tools/run-in-docker.sh +28 -0
  214. package/deps/librdkafka/packaging/tools/run-integration-tests.sh +31 -0
  215. package/deps/librdkafka/packaging/tools/run-style-check.sh +4 -0
  216. package/deps/librdkafka/packaging/tools/style-format.sh +149 -0
  217. package/deps/librdkafka/packaging/tools/update_rpcs_max_versions.py +100 -0
  218. package/deps/librdkafka/service.yml +172 -0
  219. package/deps/librdkafka/src/CMakeLists.txt +374 -0
  220. package/deps/librdkafka/src/Makefile +103 -0
  221. package/deps/librdkafka/src/README.lz4.md +30 -0
  222. package/deps/librdkafka/src/cJSON.c +2834 -0
  223. package/deps/librdkafka/src/cJSON.h +398 -0
  224. package/deps/librdkafka/src/crc32c.c +430 -0
  225. package/deps/librdkafka/src/crc32c.h +38 -0
  226. package/deps/librdkafka/src/generate_proto.sh +66 -0
  227. package/deps/librdkafka/src/librdkafka_cgrp_synch.png +0 -0
  228. package/deps/librdkafka/src/lz4.c +2727 -0
  229. package/deps/librdkafka/src/lz4.h +842 -0
  230. package/deps/librdkafka/src/lz4frame.c +2078 -0
  231. package/deps/librdkafka/src/lz4frame.h +692 -0
  232. package/deps/librdkafka/src/lz4frame_static.h +47 -0
  233. package/deps/librdkafka/src/lz4hc.c +1631 -0
  234. package/deps/librdkafka/src/lz4hc.h +413 -0
  235. package/deps/librdkafka/src/nanopb/pb.h +917 -0
  236. package/deps/librdkafka/src/nanopb/pb_common.c +388 -0
  237. package/deps/librdkafka/src/nanopb/pb_common.h +49 -0
  238. package/deps/librdkafka/src/nanopb/pb_decode.c +1727 -0
  239. package/deps/librdkafka/src/nanopb/pb_decode.h +193 -0
  240. package/deps/librdkafka/src/nanopb/pb_encode.c +1000 -0
  241. package/deps/librdkafka/src/nanopb/pb_encode.h +185 -0
  242. package/deps/librdkafka/src/opentelemetry/common.pb.c +32 -0
  243. package/deps/librdkafka/src/opentelemetry/common.pb.h +170 -0
  244. package/deps/librdkafka/src/opentelemetry/metrics.options +2 -0
  245. package/deps/librdkafka/src/opentelemetry/metrics.pb.c +67 -0
  246. package/deps/librdkafka/src/opentelemetry/metrics.pb.h +966 -0
  247. package/deps/librdkafka/src/opentelemetry/resource.pb.c +12 -0
  248. package/deps/librdkafka/src/opentelemetry/resource.pb.h +58 -0
  249. package/deps/librdkafka/src/queue.h +850 -0
  250. package/deps/librdkafka/src/rd.h +584 -0
  251. package/deps/librdkafka/src/rdaddr.c +255 -0
  252. package/deps/librdkafka/src/rdaddr.h +202 -0
  253. package/deps/librdkafka/src/rdatomic.h +230 -0
  254. package/deps/librdkafka/src/rdavg.h +260 -0
  255. package/deps/librdkafka/src/rdavl.c +210 -0
  256. package/deps/librdkafka/src/rdavl.h +250 -0
  257. package/deps/librdkafka/src/rdbase64.c +200 -0
  258. package/deps/librdkafka/src/rdbase64.h +43 -0
  259. package/deps/librdkafka/src/rdbuf.c +1884 -0
  260. package/deps/librdkafka/src/rdbuf.h +375 -0
  261. package/deps/librdkafka/src/rdcrc32.c +114 -0
  262. package/deps/librdkafka/src/rdcrc32.h +170 -0
  263. package/deps/librdkafka/src/rddl.c +179 -0
  264. package/deps/librdkafka/src/rddl.h +43 -0
  265. package/deps/librdkafka/src/rdendian.h +175 -0
  266. package/deps/librdkafka/src/rdfloat.h +67 -0
  267. package/deps/librdkafka/src/rdfnv1a.c +113 -0
  268. package/deps/librdkafka/src/rdfnv1a.h +35 -0
  269. package/deps/librdkafka/src/rdgz.c +120 -0
  270. package/deps/librdkafka/src/rdgz.h +46 -0
  271. package/deps/librdkafka/src/rdhdrhistogram.c +721 -0
  272. package/deps/librdkafka/src/rdhdrhistogram.h +87 -0
  273. package/deps/librdkafka/src/rdhttp.c +830 -0
  274. package/deps/librdkafka/src/rdhttp.h +101 -0
  275. package/deps/librdkafka/src/rdinterval.h +177 -0
  276. package/deps/librdkafka/src/rdkafka.c +5505 -0
  277. package/deps/librdkafka/src/rdkafka.h +10686 -0
  278. package/deps/librdkafka/src/rdkafka_admin.c +9794 -0
  279. package/deps/librdkafka/src/rdkafka_admin.h +661 -0
  280. package/deps/librdkafka/src/rdkafka_assignment.c +1010 -0
  281. package/deps/librdkafka/src/rdkafka_assignment.h +73 -0
  282. package/deps/librdkafka/src/rdkafka_assignor.c +1786 -0
  283. package/deps/librdkafka/src/rdkafka_assignor.h +402 -0
  284. package/deps/librdkafka/src/rdkafka_aux.c +409 -0
  285. package/deps/librdkafka/src/rdkafka_aux.h +174 -0
  286. package/deps/librdkafka/src/rdkafka_background.c +221 -0
  287. package/deps/librdkafka/src/rdkafka_broker.c +6337 -0
  288. package/deps/librdkafka/src/rdkafka_broker.h +744 -0
  289. package/deps/librdkafka/src/rdkafka_buf.c +543 -0
  290. package/deps/librdkafka/src/rdkafka_buf.h +1525 -0
  291. package/deps/librdkafka/src/rdkafka_cert.c +576 -0
  292. package/deps/librdkafka/src/rdkafka_cert.h +62 -0
  293. package/deps/librdkafka/src/rdkafka_cgrp.c +7587 -0
  294. package/deps/librdkafka/src/rdkafka_cgrp.h +477 -0
  295. package/deps/librdkafka/src/rdkafka_conf.c +4880 -0
  296. package/deps/librdkafka/src/rdkafka_conf.h +732 -0
  297. package/deps/librdkafka/src/rdkafka_confval.h +97 -0
  298. package/deps/librdkafka/src/rdkafka_coord.c +623 -0
  299. package/deps/librdkafka/src/rdkafka_coord.h +132 -0
  300. package/deps/librdkafka/src/rdkafka_error.c +228 -0
  301. package/deps/librdkafka/src/rdkafka_error.h +80 -0
  302. package/deps/librdkafka/src/rdkafka_event.c +502 -0
  303. package/deps/librdkafka/src/rdkafka_event.h +126 -0
  304. package/deps/librdkafka/src/rdkafka_feature.c +898 -0
  305. package/deps/librdkafka/src/rdkafka_feature.h +104 -0
  306. package/deps/librdkafka/src/rdkafka_fetcher.c +1422 -0
  307. package/deps/librdkafka/src/rdkafka_fetcher.h +44 -0
  308. package/deps/librdkafka/src/rdkafka_header.c +220 -0
  309. package/deps/librdkafka/src/rdkafka_header.h +76 -0
  310. package/deps/librdkafka/src/rdkafka_idempotence.c +807 -0
  311. package/deps/librdkafka/src/rdkafka_idempotence.h +144 -0
  312. package/deps/librdkafka/src/rdkafka_int.h +1260 -0
  313. package/deps/librdkafka/src/rdkafka_interceptor.c +819 -0
  314. package/deps/librdkafka/src/rdkafka_interceptor.h +104 -0
  315. package/deps/librdkafka/src/rdkafka_lz4.c +450 -0
  316. package/deps/librdkafka/src/rdkafka_lz4.h +49 -0
  317. package/deps/librdkafka/src/rdkafka_metadata.c +2209 -0
  318. package/deps/librdkafka/src/rdkafka_metadata.h +345 -0
  319. package/deps/librdkafka/src/rdkafka_metadata_cache.c +1183 -0
  320. package/deps/librdkafka/src/rdkafka_mock.c +3661 -0
  321. package/deps/librdkafka/src/rdkafka_mock.h +610 -0
  322. package/deps/librdkafka/src/rdkafka_mock_cgrp.c +1876 -0
  323. package/deps/librdkafka/src/rdkafka_mock_handlers.c +3113 -0
  324. package/deps/librdkafka/src/rdkafka_mock_int.h +710 -0
  325. package/deps/librdkafka/src/rdkafka_msg.c +2589 -0
  326. package/deps/librdkafka/src/rdkafka_msg.h +614 -0
  327. package/deps/librdkafka/src/rdkafka_msgbatch.h +62 -0
  328. package/deps/librdkafka/src/rdkafka_msgset.h +98 -0
  329. package/deps/librdkafka/src/rdkafka_msgset_reader.c +1806 -0
  330. package/deps/librdkafka/src/rdkafka_msgset_writer.c +1474 -0
  331. package/deps/librdkafka/src/rdkafka_offset.c +1565 -0
  332. package/deps/librdkafka/src/rdkafka_offset.h +150 -0
  333. package/deps/librdkafka/src/rdkafka_op.c +997 -0
  334. package/deps/librdkafka/src/rdkafka_op.h +858 -0
  335. package/deps/librdkafka/src/rdkafka_partition.c +4896 -0
  336. package/deps/librdkafka/src/rdkafka_partition.h +1182 -0
  337. package/deps/librdkafka/src/rdkafka_pattern.c +228 -0
  338. package/deps/librdkafka/src/rdkafka_pattern.h +70 -0
  339. package/deps/librdkafka/src/rdkafka_plugin.c +213 -0
  340. package/deps/librdkafka/src/rdkafka_plugin.h +41 -0
  341. package/deps/librdkafka/src/rdkafka_proto.h +736 -0
  342. package/deps/librdkafka/src/rdkafka_protocol.h +128 -0
  343. package/deps/librdkafka/src/rdkafka_queue.c +1230 -0
  344. package/deps/librdkafka/src/rdkafka_queue.h +1220 -0
  345. package/deps/librdkafka/src/rdkafka_range_assignor.c +1748 -0
  346. package/deps/librdkafka/src/rdkafka_request.c +7089 -0
  347. package/deps/librdkafka/src/rdkafka_request.h +732 -0
  348. package/deps/librdkafka/src/rdkafka_roundrobin_assignor.c +123 -0
  349. package/deps/librdkafka/src/rdkafka_sasl.c +530 -0
  350. package/deps/librdkafka/src/rdkafka_sasl.h +63 -0
  351. package/deps/librdkafka/src/rdkafka_sasl_cyrus.c +722 -0
  352. package/deps/librdkafka/src/rdkafka_sasl_int.h +89 -0
  353. package/deps/librdkafka/src/rdkafka_sasl_oauthbearer.c +1833 -0
  354. package/deps/librdkafka/src/rdkafka_sasl_oauthbearer.h +52 -0
  355. package/deps/librdkafka/src/rdkafka_sasl_oauthbearer_oidc.c +1666 -0
  356. package/deps/librdkafka/src/rdkafka_sasl_oauthbearer_oidc.h +47 -0
  357. package/deps/librdkafka/src/rdkafka_sasl_plain.c +142 -0
  358. package/deps/librdkafka/src/rdkafka_sasl_scram.c +858 -0
  359. package/deps/librdkafka/src/rdkafka_sasl_win32.c +550 -0
  360. package/deps/librdkafka/src/rdkafka_ssl.c +2129 -0
  361. package/deps/librdkafka/src/rdkafka_ssl.h +86 -0
  362. package/deps/librdkafka/src/rdkafka_sticky_assignor.c +4785 -0
  363. package/deps/librdkafka/src/rdkafka_subscription.c +278 -0
  364. package/deps/librdkafka/src/rdkafka_telemetry.c +760 -0
  365. package/deps/librdkafka/src/rdkafka_telemetry.h +52 -0
  366. package/deps/librdkafka/src/rdkafka_telemetry_decode.c +1053 -0
  367. package/deps/librdkafka/src/rdkafka_telemetry_decode.h +59 -0
  368. package/deps/librdkafka/src/rdkafka_telemetry_encode.c +997 -0
  369. package/deps/librdkafka/src/rdkafka_telemetry_encode.h +301 -0
  370. package/deps/librdkafka/src/rdkafka_timer.c +402 -0
  371. package/deps/librdkafka/src/rdkafka_timer.h +117 -0
  372. package/deps/librdkafka/src/rdkafka_topic.c +2161 -0
  373. package/deps/librdkafka/src/rdkafka_topic.h +334 -0
  374. package/deps/librdkafka/src/rdkafka_transport.c +1309 -0
  375. package/deps/librdkafka/src/rdkafka_transport.h +99 -0
  376. package/deps/librdkafka/src/rdkafka_transport_int.h +100 -0
  377. package/deps/librdkafka/src/rdkafka_txnmgr.c +3256 -0
  378. package/deps/librdkafka/src/rdkafka_txnmgr.h +171 -0
  379. package/deps/librdkafka/src/rdkafka_zstd.c +226 -0
  380. package/deps/librdkafka/src/rdkafka_zstd.h +57 -0
  381. package/deps/librdkafka/src/rdlist.c +576 -0
  382. package/deps/librdkafka/src/rdlist.h +434 -0
  383. package/deps/librdkafka/src/rdlog.c +89 -0
  384. package/deps/librdkafka/src/rdlog.h +41 -0
  385. package/deps/librdkafka/src/rdmap.c +508 -0
  386. package/deps/librdkafka/src/rdmap.h +492 -0
  387. package/deps/librdkafka/src/rdmurmur2.c +167 -0
  388. package/deps/librdkafka/src/rdmurmur2.h +35 -0
  389. package/deps/librdkafka/src/rdports.c +61 -0
  390. package/deps/librdkafka/src/rdports.h +38 -0
  391. package/deps/librdkafka/src/rdposix.h +250 -0
  392. package/deps/librdkafka/src/rdrand.c +80 -0
  393. package/deps/librdkafka/src/rdrand.h +43 -0
  394. package/deps/librdkafka/src/rdregex.c +156 -0
  395. package/deps/librdkafka/src/rdregex.h +43 -0
  396. package/deps/librdkafka/src/rdsignal.h +57 -0
  397. package/deps/librdkafka/src/rdstring.c +645 -0
  398. package/deps/librdkafka/src/rdstring.h +98 -0
  399. package/deps/librdkafka/src/rdsysqueue.h +404 -0
  400. package/deps/librdkafka/src/rdtime.h +356 -0
  401. package/deps/librdkafka/src/rdtypes.h +86 -0
  402. package/deps/librdkafka/src/rdunittest.c +549 -0
  403. package/deps/librdkafka/src/rdunittest.h +232 -0
  404. package/deps/librdkafka/src/rdvarint.c +134 -0
  405. package/deps/librdkafka/src/rdvarint.h +165 -0
  406. package/deps/librdkafka/src/rdwin32.h +382 -0
  407. package/deps/librdkafka/src/rdxxhash.c +1030 -0
  408. package/deps/librdkafka/src/rdxxhash.h +328 -0
  409. package/deps/librdkafka/src/regexp.c +1352 -0
  410. package/deps/librdkafka/src/regexp.h +41 -0
  411. package/deps/librdkafka/src/snappy.c +1866 -0
  412. package/deps/librdkafka/src/snappy.h +62 -0
  413. package/deps/librdkafka/src/snappy_compat.h +138 -0
  414. package/deps/librdkafka/src/statistics_schema.json +444 -0
  415. package/deps/librdkafka/src/tinycthread.c +932 -0
  416. package/deps/librdkafka/src/tinycthread.h +503 -0
  417. package/deps/librdkafka/src/tinycthread_extra.c +199 -0
  418. package/deps/librdkafka/src/tinycthread_extra.h +212 -0
  419. package/deps/librdkafka/src/win32_config.h +58 -0
  420. package/deps/librdkafka/src-cpp/CMakeLists.txt +90 -0
  421. package/deps/librdkafka/src-cpp/ConfImpl.cpp +84 -0
  422. package/deps/librdkafka/src-cpp/ConsumerImpl.cpp +244 -0
  423. package/deps/librdkafka/src-cpp/HandleImpl.cpp +436 -0
  424. package/deps/librdkafka/src-cpp/HeadersImpl.cpp +48 -0
  425. package/deps/librdkafka/src-cpp/KafkaConsumerImpl.cpp +296 -0
  426. package/deps/librdkafka/src-cpp/Makefile +55 -0
  427. package/deps/librdkafka/src-cpp/MessageImpl.cpp +38 -0
  428. package/deps/librdkafka/src-cpp/MetadataImpl.cpp +170 -0
  429. package/deps/librdkafka/src-cpp/ProducerImpl.cpp +197 -0
  430. package/deps/librdkafka/src-cpp/QueueImpl.cpp +70 -0
  431. package/deps/librdkafka/src-cpp/README.md +16 -0
  432. package/deps/librdkafka/src-cpp/RdKafka.cpp +59 -0
  433. package/deps/librdkafka/src-cpp/TopicImpl.cpp +124 -0
  434. package/deps/librdkafka/src-cpp/TopicPartitionImpl.cpp +57 -0
  435. package/deps/librdkafka/src-cpp/rdkafkacpp.h +3797 -0
  436. package/deps/librdkafka/src-cpp/rdkafkacpp_int.h +1641 -0
  437. package/deps/librdkafka/tests/0000-unittests.c +72 -0
  438. package/deps/librdkafka/tests/0001-multiobj.c +102 -0
  439. package/deps/librdkafka/tests/0002-unkpart.c +244 -0
  440. package/deps/librdkafka/tests/0003-msgmaxsize.c +173 -0
  441. package/deps/librdkafka/tests/0004-conf.c +934 -0
  442. package/deps/librdkafka/tests/0005-order.c +133 -0
  443. package/deps/librdkafka/tests/0006-symbols.c +163 -0
  444. package/deps/librdkafka/tests/0007-autotopic.c +136 -0
  445. package/deps/librdkafka/tests/0008-reqacks.c +179 -0
  446. package/deps/librdkafka/tests/0009-mock_cluster.c +97 -0
  447. package/deps/librdkafka/tests/0011-produce_batch.c +753 -0
  448. package/deps/librdkafka/tests/0012-produce_consume.c +537 -0
  449. package/deps/librdkafka/tests/0013-null-msgs.c +473 -0
  450. package/deps/librdkafka/tests/0014-reconsume-191.c +512 -0
  451. package/deps/librdkafka/tests/0015-offset_seeks.c +172 -0
  452. package/deps/librdkafka/tests/0016-client_swname.c +181 -0
  453. package/deps/librdkafka/tests/0017-compression.c +140 -0
  454. package/deps/librdkafka/tests/0018-cgrp_term.c +338 -0
  455. package/deps/librdkafka/tests/0019-list_groups.c +289 -0
  456. package/deps/librdkafka/tests/0020-destroy_hang.c +162 -0
  457. package/deps/librdkafka/tests/0021-rkt_destroy.c +72 -0
  458. package/deps/librdkafka/tests/0022-consume_batch.c +279 -0
  459. package/deps/librdkafka/tests/0025-timers.c +147 -0
  460. package/deps/librdkafka/tests/0026-consume_pause.c +547 -0
  461. package/deps/librdkafka/tests/0028-long_topicnames.c +79 -0
  462. package/deps/librdkafka/tests/0029-assign_offset.c +202 -0
  463. package/deps/librdkafka/tests/0030-offset_commit.c +589 -0
  464. package/deps/librdkafka/tests/0031-get_offsets.c +235 -0
  465. package/deps/librdkafka/tests/0033-regex_subscribe.c +536 -0
  466. package/deps/librdkafka/tests/0034-offset_reset.c +398 -0
  467. package/deps/librdkafka/tests/0035-api_version.c +73 -0
  468. package/deps/librdkafka/tests/0036-partial_fetch.c +87 -0
  469. package/deps/librdkafka/tests/0037-destroy_hang_local.c +85 -0
  470. package/deps/librdkafka/tests/0038-performance.c +121 -0
  471. package/deps/librdkafka/tests/0039-event.c +284 -0
  472. package/deps/librdkafka/tests/0040-io_event.c +257 -0
  473. package/deps/librdkafka/tests/0041-fetch_max_bytes.c +97 -0
  474. package/deps/librdkafka/tests/0042-many_topics.c +252 -0
  475. package/deps/librdkafka/tests/0043-no_connection.c +77 -0
  476. package/deps/librdkafka/tests/0044-partition_cnt.c +94 -0
  477. package/deps/librdkafka/tests/0045-subscribe_update.c +1010 -0
  478. package/deps/librdkafka/tests/0046-rkt_cache.c +65 -0
  479. package/deps/librdkafka/tests/0047-partial_buf_tmout.c +98 -0
  480. package/deps/librdkafka/tests/0048-partitioner.c +283 -0
  481. package/deps/librdkafka/tests/0049-consume_conn_close.c +162 -0
  482. package/deps/librdkafka/tests/0050-subscribe_adds.c +145 -0
  483. package/deps/librdkafka/tests/0051-assign_adds.c +126 -0
  484. package/deps/librdkafka/tests/0052-msg_timestamps.c +238 -0
  485. package/deps/librdkafka/tests/0053-stats_cb.cpp +527 -0
  486. package/deps/librdkafka/tests/0054-offset_time.cpp +236 -0
  487. package/deps/librdkafka/tests/0055-producer_latency.c +539 -0
  488. package/deps/librdkafka/tests/0056-balanced_group_mt.c +315 -0
  489. package/deps/librdkafka/tests/0057-invalid_topic.cpp +112 -0
  490. package/deps/librdkafka/tests/0058-log.cpp +123 -0
  491. package/deps/librdkafka/tests/0059-bsearch.cpp +241 -0
  492. package/deps/librdkafka/tests/0060-op_prio.cpp +163 -0
  493. package/deps/librdkafka/tests/0061-consumer_lag.cpp +295 -0
  494. package/deps/librdkafka/tests/0062-stats_event.c +126 -0
  495. package/deps/librdkafka/tests/0063-clusterid.cpp +180 -0
  496. package/deps/librdkafka/tests/0064-interceptors.c +481 -0
  497. package/deps/librdkafka/tests/0065-yield.cpp +140 -0
  498. package/deps/librdkafka/tests/0066-plugins.cpp +129 -0
  499. package/deps/librdkafka/tests/0067-empty_topic.cpp +151 -0
  500. package/deps/librdkafka/tests/0068-produce_timeout.c +136 -0
  501. package/deps/librdkafka/tests/0069-consumer_add_parts.c +119 -0
  502. package/deps/librdkafka/tests/0070-null_empty.cpp +197 -0
  503. package/deps/librdkafka/tests/0072-headers_ut.c +448 -0
  504. package/deps/librdkafka/tests/0073-headers.c +381 -0
  505. package/deps/librdkafka/tests/0074-producev.c +87 -0
  506. package/deps/librdkafka/tests/0075-retry.c +290 -0
  507. package/deps/librdkafka/tests/0076-produce_retry.c +452 -0
  508. package/deps/librdkafka/tests/0077-compaction.c +363 -0
  509. package/deps/librdkafka/tests/0078-c_from_cpp.cpp +96 -0
  510. package/deps/librdkafka/tests/0079-fork.c +93 -0
  511. package/deps/librdkafka/tests/0080-admin_ut.c +3095 -0
  512. package/deps/librdkafka/tests/0081-admin.c +5633 -0
  513. package/deps/librdkafka/tests/0082-fetch_max_bytes.cpp +137 -0
  514. package/deps/librdkafka/tests/0083-cb_event.c +233 -0
  515. package/deps/librdkafka/tests/0084-destroy_flags.c +208 -0
  516. package/deps/librdkafka/tests/0085-headers.cpp +392 -0
  517. package/deps/librdkafka/tests/0086-purge.c +368 -0
  518. package/deps/librdkafka/tests/0088-produce_metadata_timeout.c +162 -0
  519. package/deps/librdkafka/tests/0089-max_poll_interval.c +511 -0
  520. package/deps/librdkafka/tests/0090-idempotence.c +171 -0
  521. package/deps/librdkafka/tests/0091-max_poll_interval_timeout.c +295 -0
  522. package/deps/librdkafka/tests/0092-mixed_msgver.c +103 -0
  523. package/deps/librdkafka/tests/0093-holb.c +200 -0
  524. package/deps/librdkafka/tests/0094-idempotence_msg_timeout.c +231 -0
  525. package/deps/librdkafka/tests/0095-all_brokers_down.cpp +122 -0
  526. package/deps/librdkafka/tests/0097-ssl_verify.cpp +658 -0
  527. package/deps/librdkafka/tests/0098-consumer-txn.cpp +1218 -0
  528. package/deps/librdkafka/tests/0099-commit_metadata.c +194 -0
  529. package/deps/librdkafka/tests/0100-thread_interceptors.cpp +195 -0
  530. package/deps/librdkafka/tests/0101-fetch-from-follower.cpp +446 -0
  531. package/deps/librdkafka/tests/0102-static_group_rebalance.c +836 -0
  532. package/deps/librdkafka/tests/0103-transactions.c +1383 -0
  533. package/deps/librdkafka/tests/0104-fetch_from_follower_mock.c +625 -0
  534. package/deps/librdkafka/tests/0105-transactions_mock.c +3930 -0
  535. package/deps/librdkafka/tests/0106-cgrp_sess_timeout.c +318 -0
  536. package/deps/librdkafka/tests/0107-topic_recreate.c +259 -0
  537. package/deps/librdkafka/tests/0109-auto_create_topics.cpp +278 -0
  538. package/deps/librdkafka/tests/0110-batch_size.cpp +182 -0
  539. package/deps/librdkafka/tests/0111-delay_create_topics.cpp +127 -0
  540. package/deps/librdkafka/tests/0112-assign_unknown_part.c +87 -0
  541. package/deps/librdkafka/tests/0113-cooperative_rebalance.cpp +3473 -0
  542. package/deps/librdkafka/tests/0114-sticky_partitioning.cpp +176 -0
  543. package/deps/librdkafka/tests/0115-producer_auth.cpp +182 -0
  544. package/deps/librdkafka/tests/0116-kafkaconsumer_close.cpp +216 -0
  545. package/deps/librdkafka/tests/0117-mock_errors.c +331 -0
  546. package/deps/librdkafka/tests/0118-commit_rebalance.c +154 -0
  547. package/deps/librdkafka/tests/0119-consumer_auth.cpp +167 -0
  548. package/deps/librdkafka/tests/0120-asymmetric_subscription.c +185 -0
  549. package/deps/librdkafka/tests/0121-clusterid.c +115 -0
  550. package/deps/librdkafka/tests/0122-buffer_cleaning_after_rebalance.c +227 -0
  551. package/deps/librdkafka/tests/0123-connections_max_idle.c +98 -0
  552. package/deps/librdkafka/tests/0124-openssl_invalid_engine.c +69 -0
  553. package/deps/librdkafka/tests/0125-immediate_flush.c +144 -0
  554. package/deps/librdkafka/tests/0126-oauthbearer_oidc.c +528 -0
  555. package/deps/librdkafka/tests/0127-fetch_queue_backoff.cpp +165 -0
  556. package/deps/librdkafka/tests/0128-sasl_callback_queue.cpp +125 -0
  557. package/deps/librdkafka/tests/0129-fetch_aborted_msgs.c +79 -0
  558. package/deps/librdkafka/tests/0130-store_offsets.c +178 -0
  559. package/deps/librdkafka/tests/0131-connect_timeout.c +81 -0
  560. package/deps/librdkafka/tests/0132-strategy_ordering.c +179 -0
  561. package/deps/librdkafka/tests/0133-ssl_keys.c +150 -0
  562. package/deps/librdkafka/tests/0134-ssl_provider.c +92 -0
  563. package/deps/librdkafka/tests/0135-sasl_credentials.cpp +143 -0
  564. package/deps/librdkafka/tests/0136-resolve_cb.c +181 -0
  565. package/deps/librdkafka/tests/0137-barrier_batch_consume.c +619 -0
  566. package/deps/librdkafka/tests/0138-admin_mock.c +281 -0
  567. package/deps/librdkafka/tests/0139-offset_validation_mock.c +950 -0
  568. package/deps/librdkafka/tests/0140-commit_metadata.cpp +108 -0
  569. package/deps/librdkafka/tests/0142-reauthentication.c +515 -0
  570. package/deps/librdkafka/tests/0143-exponential_backoff_mock.c +552 -0
  571. package/deps/librdkafka/tests/0144-idempotence_mock.c +373 -0
  572. package/deps/librdkafka/tests/0145-pause_resume_mock.c +119 -0
  573. package/deps/librdkafka/tests/0146-metadata_mock.c +505 -0
  574. package/deps/librdkafka/tests/0147-consumer_group_consumer_mock.c +952 -0
  575. package/deps/librdkafka/tests/0148-offset_fetch_commit_error_mock.c +563 -0
  576. package/deps/librdkafka/tests/0149-broker-same-host-port.c +140 -0
  577. package/deps/librdkafka/tests/0150-telemetry_mock.c +651 -0
  578. package/deps/librdkafka/tests/0151-purge-brokers.c +566 -0
  579. package/deps/librdkafka/tests/0152-rebootstrap.c +59 -0
  580. package/deps/librdkafka/tests/0153-memberid.c +128 -0
  581. package/deps/librdkafka/tests/1000-unktopic.c +164 -0
  582. package/deps/librdkafka/tests/8000-idle.cpp +60 -0
  583. package/deps/librdkafka/tests/8001-fetch_from_follower_mock_manual.c +113 -0
  584. package/deps/librdkafka/tests/CMakeLists.txt +170 -0
  585. package/deps/librdkafka/tests/LibrdkafkaTestApp.py +291 -0
  586. package/deps/librdkafka/tests/Makefile +182 -0
  587. package/deps/librdkafka/tests/README.md +509 -0
  588. package/deps/librdkafka/tests/autotest.sh +33 -0
  589. package/deps/librdkafka/tests/backtrace.gdb +30 -0
  590. package/deps/librdkafka/tests/broker_version_tests.py +315 -0
  591. package/deps/librdkafka/tests/buildbox.sh +17 -0
  592. package/deps/librdkafka/tests/cleanup-checker-tests.sh +20 -0
  593. package/deps/librdkafka/tests/cluster_testing.py +191 -0
  594. package/deps/librdkafka/tests/delete-test-topics.sh +56 -0
  595. package/deps/librdkafka/tests/fixtures/oauthbearer/jwt_assertion_template.json +10 -0
  596. package/deps/librdkafka/tests/fixtures/ssl/Makefile +8 -0
  597. package/deps/librdkafka/tests/fixtures/ssl/README.md +13 -0
  598. package/deps/librdkafka/tests/fixtures/ssl/client.keystore.intermediate.p12 +0 -0
  599. package/deps/librdkafka/tests/fixtures/ssl/client.keystore.p12 +0 -0
  600. package/deps/librdkafka/tests/fixtures/ssl/client2.certificate.intermediate.pem +72 -0
  601. package/deps/librdkafka/tests/fixtures/ssl/client2.certificate.pem +50 -0
  602. package/deps/librdkafka/tests/fixtures/ssl/client2.intermediate.key +46 -0
  603. package/deps/librdkafka/tests/fixtures/ssl/client2.key +46 -0
  604. package/deps/librdkafka/tests/fixtures/ssl/create_keys.sh +168 -0
  605. package/deps/librdkafka/tests/fuzzers/Makefile +12 -0
  606. package/deps/librdkafka/tests/fuzzers/README.md +31 -0
  607. package/deps/librdkafka/tests/fuzzers/fuzz_regex.c +74 -0
  608. package/deps/librdkafka/tests/fuzzers/helpers.h +90 -0
  609. package/deps/librdkafka/tests/gen-ssl-certs.sh +165 -0
  610. package/deps/librdkafka/tests/interactive_broker_version.py +170 -0
  611. package/deps/librdkafka/tests/interceptor_test/CMakeLists.txt +16 -0
  612. package/deps/librdkafka/tests/interceptor_test/Makefile +22 -0
  613. package/deps/librdkafka/tests/interceptor_test/interceptor_test.c +314 -0
  614. package/deps/librdkafka/tests/interceptor_test/interceptor_test.h +54 -0
  615. package/deps/librdkafka/tests/java/IncrementalRebalanceCli.java +97 -0
  616. package/deps/librdkafka/tests/java/Makefile +13 -0
  617. package/deps/librdkafka/tests/java/Murmur2Cli.java +46 -0
  618. package/deps/librdkafka/tests/java/README.md +14 -0
  619. package/deps/librdkafka/tests/java/TransactionProducerCli.java +162 -0
  620. package/deps/librdkafka/tests/java/run-class.sh +11 -0
  621. package/deps/librdkafka/tests/librdkafka.suppressions +483 -0
  622. package/deps/librdkafka/tests/lz4_manual_test.sh +59 -0
  623. package/deps/librdkafka/tests/multi-broker-version-test.sh +50 -0
  624. package/deps/librdkafka/tests/parse-refcnt.sh +43 -0
  625. package/deps/librdkafka/tests/performance_plot.py +115 -0
  626. package/deps/librdkafka/tests/plugin_test/Makefile +19 -0
  627. package/deps/librdkafka/tests/plugin_test/plugin_test.c +58 -0
  628. package/deps/librdkafka/tests/requirements.txt +2 -0
  629. package/deps/librdkafka/tests/run-all-tests.sh +79 -0
  630. package/deps/librdkafka/tests/run-consumer-tests.sh +16 -0
  631. package/deps/librdkafka/tests/run-producer-tests.sh +16 -0
  632. package/deps/librdkafka/tests/run-test-batches.py +157 -0
  633. package/deps/librdkafka/tests/run-test.sh +140 -0
  634. package/deps/librdkafka/tests/rusage.c +249 -0
  635. package/deps/librdkafka/tests/sasl_test.py +289 -0
  636. package/deps/librdkafka/tests/scenarios/README.md +6 -0
  637. package/deps/librdkafka/tests/scenarios/ak23.json +6 -0
  638. package/deps/librdkafka/tests/scenarios/default.json +5 -0
  639. package/deps/librdkafka/tests/scenarios/noautocreate.json +5 -0
  640. package/deps/librdkafka/tests/sockem.c +801 -0
  641. package/deps/librdkafka/tests/sockem.h +85 -0
  642. package/deps/librdkafka/tests/sockem_ctrl.c +145 -0
  643. package/deps/librdkafka/tests/sockem_ctrl.h +61 -0
  644. package/deps/librdkafka/tests/test.c +7778 -0
  645. package/deps/librdkafka/tests/test.conf.example +27 -0
  646. package/deps/librdkafka/tests/test.h +1028 -0
  647. package/deps/librdkafka/tests/testcpp.cpp +131 -0
  648. package/deps/librdkafka/tests/testcpp.h +388 -0
  649. package/deps/librdkafka/tests/testshared.h +416 -0
  650. package/deps/librdkafka/tests/tools/README.md +4 -0
  651. package/deps/librdkafka/tests/tools/stats/README.md +21 -0
  652. package/deps/librdkafka/tests/tools/stats/filter.jq +42 -0
  653. package/deps/librdkafka/tests/tools/stats/graph.py +150 -0
  654. package/deps/librdkafka/tests/tools/stats/requirements.txt +3 -0
  655. package/deps/librdkafka/tests/tools/stats/to_csv.py +124 -0
  656. package/deps/librdkafka/tests/trivup/trivup-0.14.0.tar.gz +0 -0
  657. package/deps/librdkafka/tests/until-fail.sh +87 -0
  658. package/deps/librdkafka/tests/xxxx-assign_partition.c +122 -0
  659. package/deps/librdkafka/tests/xxxx-metadata.cpp +159 -0
  660. package/deps/librdkafka/vcpkg.json +23 -0
  661. package/deps/librdkafka/win32/README.md +5 -0
  662. package/deps/librdkafka/win32/build-package.bat +3 -0
  663. package/deps/librdkafka/win32/build.bat +19 -0
  664. package/deps/librdkafka/win32/common.vcxproj +84 -0
  665. package/deps/librdkafka/win32/interceptor_test/interceptor_test.vcxproj +87 -0
  666. package/deps/librdkafka/win32/librdkafka.autopkg.template +54 -0
  667. package/deps/librdkafka/win32/librdkafka.master.testing.targets +13 -0
  668. package/deps/librdkafka/win32/librdkafka.sln +226 -0
  669. package/deps/librdkafka/win32/librdkafka.vcxproj +276 -0
  670. package/deps/librdkafka/win32/librdkafkacpp/librdkafkacpp.vcxproj +104 -0
  671. package/deps/librdkafka/win32/msbuild.ps1 +15 -0
  672. package/deps/librdkafka/win32/openssl_engine_example/openssl_engine_example.vcxproj +132 -0
  673. package/deps/librdkafka/win32/package-zip.ps1 +46 -0
  674. package/deps/librdkafka/win32/packages/repositories.config +4 -0
  675. package/deps/librdkafka/win32/push-package.bat +4 -0
  676. package/deps/librdkafka/win32/rdkafka_complex_consumer_example_cpp/rdkafka_complex_consumer_example_cpp.vcxproj +67 -0
  677. package/deps/librdkafka/win32/rdkafka_example/rdkafka_example.vcxproj +97 -0
  678. package/deps/librdkafka/win32/rdkafka_performance/rdkafka_performance.vcxproj +97 -0
  679. package/deps/librdkafka/win32/setup-msys2.ps1 +47 -0
  680. package/deps/librdkafka/win32/setup-vcpkg.ps1 +34 -0
  681. package/deps/librdkafka/win32/tests/test.conf.example +25 -0
  682. package/deps/librdkafka/win32/tests/tests.vcxproj +253 -0
  683. package/deps/librdkafka/win32/win_ssl_cert_store/win_ssl_cert_store.vcxproj +132 -0
  684. package/deps/librdkafka/win32/wingetopt.c +564 -0
  685. package/deps/librdkafka/win32/wingetopt.h +101 -0
  686. package/deps/librdkafka/win32/wintime.h +33 -0
  687. package/deps/librdkafka.gyp +62 -0
  688. package/lib/admin.js +233 -0
  689. package/lib/client.js +573 -0
  690. package/lib/error.js +500 -0
  691. package/lib/index.js +34 -0
  692. package/lib/kafka-consumer-stream.js +397 -0
  693. package/lib/kafka-consumer.js +698 -0
  694. package/lib/producer/high-level-producer.js +323 -0
  695. package/lib/producer-stream.js +307 -0
  696. package/lib/producer.js +375 -0
  697. package/lib/tools/ref-counter.js +52 -0
  698. package/lib/topic-partition.js +88 -0
  699. package/lib/topic.js +42 -0
  700. package/lib/util.js +29 -0
  701. package/package.json +61 -0
  702. package/prebuilds/darwin-arm64/@point3+node-rdkafka.node +0 -0
  703. package/prebuilds/linux-x64/@point3+node-rdkafka.node +0 -0
  704. package/util/configure.js +30 -0
  705. package/util/get-env.js +6 -0
  706. package/util/test-compile.js +11 -0
  707. package/util/test-producer-delivery.js +100 -0
@@ -0,0 +1,3095 @@
1
+ /*
2
+ * librdkafka - Apache Kafka C library
3
+ *
4
+ * Copyright (c) 2012-2022, Magnus Edenhill
5
+ * 2023, Confluent Inc.
6
+ * All rights reserved.
7
+ *
8
+ * Redistribution and use in source and binary forms, with or without
9
+ * modification, are permitted provided that the following conditions are met:
10
+ *
11
+ * 1. Redistributions of source code must retain the above copyright notice,
12
+ * this list of conditions and the following disclaimer.
13
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
14
+ * this list of conditions and the following disclaimer in the documentation
15
+ * and/or other materials provided with the distribution.
16
+ *
17
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
21
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27
+ * POSSIBILITY OF SUCH DAMAGE.
28
+ */
29
+
30
+ #include "test.h"
31
+ #include "rdkafka.h"
32
+
33
+ /**
34
+ * @brief Admin API local dry-run unit-tests.
35
+ */
36
+
37
+ #define MY_SOCKET_TIMEOUT_MS 100
38
+ #define MY_SOCKET_TIMEOUT_MS_STR "100"
39
+
40
+
41
+
42
+ static mtx_t last_event_lock;
43
+ static cnd_t last_event_cnd;
44
+ static rd_kafka_event_t *last_event = NULL;
45
+
46
+ /**
47
+ * @brief The background event callback is called automatically
48
+ * by librdkafka from a background thread.
49
+ */
50
+ static void
51
+ background_event_cb(rd_kafka_t *rk, rd_kafka_event_t *rkev, void *opaque) {
52
+ mtx_lock(&last_event_lock);
53
+ TEST_ASSERT(!last_event,
54
+ "Multiple events seen in background_event_cb "
55
+ "(existing %s, new %s)",
56
+ rd_kafka_event_name(last_event), rd_kafka_event_name(rkev));
57
+ last_event = rkev;
58
+ mtx_unlock(&last_event_lock);
59
+ cnd_broadcast(&last_event_cnd);
60
+ rd_sleep(1);
61
+ }
62
+
63
+ static rd_kafka_event_t *wait_background_event_cb(void) {
64
+ rd_kafka_event_t *rkev;
65
+ mtx_lock(&last_event_lock);
66
+ while (!(rkev = last_event))
67
+ cnd_wait(&last_event_cnd, &last_event_lock);
68
+ last_event = NULL;
69
+ mtx_unlock(&last_event_lock);
70
+
71
+ return rkev;
72
+ }
73
+
74
+
75
+ /**
76
+ * @brief CreateTopics tests
77
+ *
78
+ *
79
+ *
80
+ */
81
+ static void do_test_CreateTopics(const char *what,
82
+ rd_kafka_t *rk,
83
+ rd_kafka_queue_t *useq,
84
+ int with_background_event_cb,
85
+ int with_options) {
86
+ rd_kafka_queue_t *q;
87
+ #define MY_NEW_TOPICS_CNT 6
88
+ rd_kafka_NewTopic_t *new_topics[MY_NEW_TOPICS_CNT];
89
+ rd_kafka_AdminOptions_t *options = NULL;
90
+ int exp_timeout = MY_SOCKET_TIMEOUT_MS;
91
+ int i;
92
+ char errstr[512];
93
+ const char *errstr2;
94
+ rd_kafka_resp_err_t err;
95
+ test_timing_t timing;
96
+ rd_kafka_event_t *rkev;
97
+ const rd_kafka_CreateTopics_result_t *res;
98
+ const rd_kafka_topic_result_t **restopics;
99
+ size_t restopic_cnt;
100
+ void *my_opaque = NULL, *opaque;
101
+
102
+ SUB_TEST_QUICK("%s CreateTopics with %s, timeout %dms",
103
+ rd_kafka_name(rk), what, exp_timeout);
104
+
105
+ q = useq ? useq : rd_kafka_queue_new(rk);
106
+
107
+ /**
108
+ * Construct NewTopic array with different properties for
109
+ * different partitions.
110
+ */
111
+ for (i = 0; i < MY_NEW_TOPICS_CNT; i++) {
112
+ const char *topic = test_mk_topic_name(__FUNCTION__, 1);
113
+ int num_parts = i * 51 + 1;
114
+ int num_replicas = jitter(1, MY_NEW_TOPICS_CNT - 1);
115
+ int set_config = (i & 2);
116
+ int set_replicas = !(i % 1);
117
+
118
+ new_topics[i] = rd_kafka_NewTopic_new(
119
+ topic, num_parts, set_replicas ? -1 : num_replicas, NULL,
120
+ 0);
121
+
122
+ if (set_config) {
123
+ /*
124
+ * Add various (unverified) configuration properties
125
+ */
126
+ err = rd_kafka_NewTopic_set_config(new_topics[i],
127
+ "dummy.doesntexist",
128
+ "butThere'sNothing "
129
+ "to verify that");
130
+ TEST_ASSERT(!err, "%s", rd_kafka_err2str(err));
131
+
132
+ err = rd_kafka_NewTopic_set_config(
133
+ new_topics[i], "try.a.null.value", NULL);
134
+ TEST_ASSERT(!err, "%s", rd_kafka_err2str(err));
135
+
136
+ err = rd_kafka_NewTopic_set_config(new_topics[i],
137
+ "or.empty", "");
138
+ TEST_ASSERT(!err, "%s", rd_kafka_err2str(err));
139
+ }
140
+
141
+
142
+ if (set_replicas) {
143
+ int32_t p;
144
+ int32_t replicas[MY_NEW_TOPICS_CNT];
145
+ int j;
146
+
147
+ for (j = 0; j < num_replicas; j++)
148
+ replicas[j] = j;
149
+
150
+ /*
151
+ * Set valid replica assignments
152
+ */
153
+ for (p = 0; p < num_parts; p++) {
154
+ /* Try adding an existing out of order,
155
+ * should fail */
156
+ if (p == 1) {
157
+ err =
158
+ rd_kafka_NewTopic_set_replica_assignment(
159
+ new_topics[i], p + 1, replicas,
160
+ num_replicas, errstr,
161
+ sizeof(errstr));
162
+ TEST_ASSERT(
163
+ err ==
164
+ RD_KAFKA_RESP_ERR__INVALID_ARG,
165
+ "%s", rd_kafka_err2str(err));
166
+ }
167
+
168
+ err = rd_kafka_NewTopic_set_replica_assignment(
169
+ new_topics[i], p, replicas, num_replicas,
170
+ errstr, sizeof(errstr));
171
+ TEST_ASSERT(!err, "%s", errstr);
172
+ }
173
+
174
+ /* Try to add an existing partition, should fail */
175
+ err = rd_kafka_NewTopic_set_replica_assignment(
176
+ new_topics[i], 0, replicas, num_replicas, NULL, 0);
177
+ TEST_ASSERT(err == RD_KAFKA_RESP_ERR__INVALID_ARG, "%s",
178
+ rd_kafka_err2str(err));
179
+
180
+ } else {
181
+ int32_t dummy_replicas[1] = {1};
182
+
183
+ /* Test invalid partition */
184
+ err = rd_kafka_NewTopic_set_replica_assignment(
185
+ new_topics[i], num_parts + 1, dummy_replicas, 1,
186
+ errstr, sizeof(errstr));
187
+ TEST_ASSERT(err == RD_KAFKA_RESP_ERR__INVALID_ARG,
188
+ "%s: %s", rd_kafka_err2str(err),
189
+ err == RD_KAFKA_RESP_ERR_NO_ERROR ? ""
190
+ : errstr);
191
+
192
+ /* Setting replicas with with default replicas != -1
193
+ * is an error. */
194
+ err = rd_kafka_NewTopic_set_replica_assignment(
195
+ new_topics[i], 0, dummy_replicas, 1, errstr,
196
+ sizeof(errstr));
197
+ TEST_ASSERT(err == RD_KAFKA_RESP_ERR__INVALID_ARG,
198
+ "%s: %s", rd_kafka_err2str(err),
199
+ err == RD_KAFKA_RESP_ERR_NO_ERROR ? ""
200
+ : errstr);
201
+ }
202
+ }
203
+
204
+ if (with_options) {
205
+ options = rd_kafka_AdminOptions_new(rk, RD_KAFKA_ADMIN_OP_ANY);
206
+
207
+ exp_timeout = MY_SOCKET_TIMEOUT_MS * 2;
208
+ err = rd_kafka_AdminOptions_set_request_timeout(
209
+ options, exp_timeout, errstr, sizeof(errstr));
210
+ TEST_ASSERT(!err, "%s", rd_kafka_err2str(err));
211
+
212
+ my_opaque = (void *)123;
213
+ rd_kafka_AdminOptions_set_opaque(options, my_opaque);
214
+ }
215
+
216
+ TIMING_START(&timing, "CreateTopics");
217
+ TEST_SAY("Call CreateTopics, timeout is %dms\n", exp_timeout);
218
+ rd_kafka_CreateTopics(rk, new_topics, MY_NEW_TOPICS_CNT, options, q);
219
+ TIMING_ASSERT_LATER(&timing, 0, 50);
220
+
221
+ if (with_background_event_cb) {
222
+ /* Result event will be triggered by callback from
223
+ * librdkafka background queue thread. */
224
+ TIMING_START(&timing, "CreateTopics.wait_background_event_cb");
225
+ rkev = wait_background_event_cb();
226
+ } else {
227
+ /* Poll result queue */
228
+ TIMING_START(&timing, "CreateTopics.queue_poll");
229
+ rkev = rd_kafka_queue_poll(q, exp_timeout + 1000);
230
+ }
231
+
232
+ TIMING_ASSERT_LATER(&timing, exp_timeout - 100, exp_timeout + 100);
233
+ TEST_ASSERT(rkev != NULL, "expected result in %dms", exp_timeout);
234
+ TEST_SAY("CreateTopics: got %s in %.3fs\n", rd_kafka_event_name(rkev),
235
+ TIMING_DURATION(&timing) / 1000.0f);
236
+
237
+ /* Convert event to proper result */
238
+ res = rd_kafka_event_CreateTopics_result(rkev);
239
+ TEST_ASSERT(res, "expected CreateTopics_result, not %s",
240
+ rd_kafka_event_name(rkev));
241
+
242
+ opaque = rd_kafka_event_opaque(rkev);
243
+ TEST_ASSERT(opaque == my_opaque, "expected opaque to be %p, not %p",
244
+ my_opaque, opaque);
245
+
246
+ /* Expecting error */
247
+ err = rd_kafka_event_error(rkev);
248
+ errstr2 = rd_kafka_event_error_string(rkev);
249
+ TEST_ASSERT(err == RD_KAFKA_RESP_ERR__TIMED_OUT,
250
+ "expected CreateTopics to return error %s, not %s (%s)",
251
+ rd_kafka_err2str(RD_KAFKA_RESP_ERR__TIMED_OUT),
252
+ rd_kafka_err2str(err), err ? errstr2 : "n/a");
253
+
254
+ /* Attempt to extract topics anyway, should return NULL. */
255
+ restopics = rd_kafka_CreateTopics_result_topics(res, &restopic_cnt);
256
+ TEST_ASSERT(!restopics && restopic_cnt == 0,
257
+ "expected no result_topics, got %p cnt %" PRIusz, restopics,
258
+ restopic_cnt);
259
+
260
+ rd_kafka_event_destroy(rkev);
261
+
262
+ rd_kafka_NewTopic_destroy_array(new_topics, MY_NEW_TOPICS_CNT);
263
+
264
+ if (options)
265
+ rd_kafka_AdminOptions_destroy(options);
266
+
267
+ if (!useq)
268
+ rd_kafka_queue_destroy(q);
269
+
270
+ SUB_TEST_PASS();
271
+ }
272
+
273
+
274
+
275
+ /**
276
+ * @brief DeleteTopics tests
277
+ *
278
+ *
279
+ *
280
+ */
281
+ static void do_test_DeleteTopics(const char *what,
282
+ rd_kafka_t *rk,
283
+ rd_kafka_queue_t *useq,
284
+ int with_options) {
285
+ rd_kafka_queue_t *q;
286
+ #define MY_DEL_TOPICS_CNT 4
287
+ rd_kafka_DeleteTopic_t *del_topics[MY_DEL_TOPICS_CNT];
288
+ rd_kafka_AdminOptions_t *options = NULL;
289
+ int exp_timeout = MY_SOCKET_TIMEOUT_MS;
290
+ int i;
291
+ char errstr[512];
292
+ const char *errstr2;
293
+ rd_kafka_resp_err_t err;
294
+ test_timing_t timing;
295
+ rd_kafka_event_t *rkev;
296
+ const rd_kafka_DeleteTopics_result_t *res;
297
+ const rd_kafka_topic_result_t **restopics;
298
+ size_t restopic_cnt;
299
+ void *my_opaque = NULL, *opaque;
300
+
301
+ SUB_TEST_QUICK("%s DeleteTopics with %s, timeout %dms",
302
+ rd_kafka_name(rk), what, exp_timeout);
303
+
304
+ q = useq ? useq : rd_kafka_queue_new(rk);
305
+
306
+ for (i = 0; i < MY_DEL_TOPICS_CNT; i++)
307
+ del_topics[i] = rd_kafka_DeleteTopic_new(
308
+ test_mk_topic_name(__FUNCTION__, 1));
309
+
310
+ if (with_options) {
311
+ options = rd_kafka_AdminOptions_new(
312
+ rk, RD_KAFKA_ADMIN_OP_DELETETOPICS);
313
+
314
+ exp_timeout = MY_SOCKET_TIMEOUT_MS * 2;
315
+ err = rd_kafka_AdminOptions_set_request_timeout(
316
+ options, exp_timeout, errstr, sizeof(errstr));
317
+ TEST_ASSERT(!err, "%s", rd_kafka_err2str(err));
318
+
319
+ if (useq) {
320
+ my_opaque = (void *)456;
321
+ rd_kafka_AdminOptions_set_opaque(options, my_opaque);
322
+ }
323
+ }
324
+
325
+ TIMING_START(&timing, "DeleteTopics");
326
+ TEST_SAY("Call DeleteTopics, timeout is %dms\n", exp_timeout);
327
+ rd_kafka_DeleteTopics(rk, del_topics, MY_DEL_TOPICS_CNT, options, q);
328
+ TIMING_ASSERT_LATER(&timing, 0, 50);
329
+
330
+ /* Poll result queue */
331
+ TIMING_START(&timing, "DeleteTopics.queue_poll");
332
+ rkev = rd_kafka_queue_poll(q, exp_timeout + 1000);
333
+ TIMING_ASSERT_LATER(&timing, exp_timeout - 100, exp_timeout + 100);
334
+ TEST_ASSERT(rkev != NULL, "expected result in %dms", exp_timeout);
335
+ TEST_SAY("DeleteTopics: got %s in %.3fs\n", rd_kafka_event_name(rkev),
336
+ TIMING_DURATION(&timing) / 1000.0f);
337
+
338
+ /* Convert event to proper result */
339
+ res = rd_kafka_event_DeleteTopics_result(rkev);
340
+ TEST_ASSERT(res, "expected DeleteTopics_result, not %s",
341
+ rd_kafka_event_name(rkev));
342
+
343
+ opaque = rd_kafka_event_opaque(rkev);
344
+ TEST_ASSERT(opaque == my_opaque, "expected opaque to be %p, not %p",
345
+ my_opaque, opaque);
346
+
347
+ /* Expecting error */
348
+ err = rd_kafka_event_error(rkev);
349
+ errstr2 = rd_kafka_event_error_string(rkev);
350
+ TEST_ASSERT(err == RD_KAFKA_RESP_ERR__TIMED_OUT,
351
+ "expected DeleteTopics to return error %s, not %s (%s)",
352
+ rd_kafka_err2str(RD_KAFKA_RESP_ERR__TIMED_OUT),
353
+ rd_kafka_err2str(err), err ? errstr2 : "n/a");
354
+
355
+ /* Attempt to extract topics anyway, should return NULL. */
356
+ restopics = rd_kafka_DeleteTopics_result_topics(res, &restopic_cnt);
357
+ TEST_ASSERT(!restopics && restopic_cnt == 0,
358
+ "expected no result_topics, got %p cnt %" PRIusz, restopics,
359
+ restopic_cnt);
360
+
361
+ rd_kafka_event_destroy(rkev);
362
+
363
+ rd_kafka_DeleteTopic_destroy_array(del_topics, MY_DEL_TOPICS_CNT);
364
+
365
+ if (options)
366
+ rd_kafka_AdminOptions_destroy(options);
367
+
368
+ if (!useq)
369
+ rd_kafka_queue_destroy(q);
370
+ #undef MY_DEL_TOPICS_CNT
371
+
372
+ SUB_TEST_QUICK();
373
+ }
374
+
375
+ /**
376
+ * @brief DeleteGroups tests
377
+ *
378
+ *
379
+ *
380
+ */
381
+ static void do_test_DeleteGroups(const char *what,
382
+ rd_kafka_t *rk,
383
+ rd_kafka_queue_t *useq,
384
+ int with_options,
385
+ rd_bool_t destroy) {
386
+ rd_kafka_queue_t *q;
387
+ #define MY_DEL_GROUPS_CNT 4
388
+ char *group_names[MY_DEL_GROUPS_CNT];
389
+ rd_kafka_DeleteGroup_t *del_groups[MY_DEL_GROUPS_CNT];
390
+ rd_kafka_AdminOptions_t *options = NULL;
391
+ int exp_timeout = MY_SOCKET_TIMEOUT_MS;
392
+ int i;
393
+ char errstr[512];
394
+ const char *errstr2;
395
+ rd_kafka_resp_err_t err;
396
+ test_timing_t timing;
397
+ rd_kafka_event_t *rkev;
398
+ const rd_kafka_DeleteGroups_result_t *res;
399
+ const rd_kafka_group_result_t **resgroups;
400
+ size_t resgroup_cnt;
401
+ void *my_opaque = NULL, *opaque;
402
+
403
+ SUB_TEST_QUICK("%s DeleteGroups with %s, timeout %dms",
404
+ rd_kafka_name(rk), what, exp_timeout);
405
+
406
+ q = useq ? useq : rd_kafka_queue_new(rk);
407
+
408
+ for (i = 0; i < MY_DEL_GROUPS_CNT; i++) {
409
+ group_names[i] = rd_strdup(test_mk_topic_name(__FUNCTION__, 1));
410
+ del_groups[i] = rd_kafka_DeleteGroup_new(group_names[i]);
411
+ }
412
+
413
+ if (with_options) {
414
+ options = rd_kafka_AdminOptions_new(
415
+ rk, RD_KAFKA_ADMIN_OP_DELETEGROUPS);
416
+
417
+ exp_timeout = MY_SOCKET_TIMEOUT_MS * 2;
418
+ err = rd_kafka_AdminOptions_set_request_timeout(
419
+ options, exp_timeout, errstr, sizeof(errstr));
420
+ TEST_ASSERT(!err, "%s", rd_kafka_err2str(err));
421
+
422
+ if (useq) {
423
+ my_opaque = (void *)456;
424
+ rd_kafka_AdminOptions_set_opaque(options, my_opaque);
425
+ }
426
+ }
427
+
428
+ TIMING_START(&timing, "DeleteGroups");
429
+ TEST_SAY("Call DeleteGroups, timeout is %dms\n", exp_timeout);
430
+ rd_kafka_DeleteGroups(rk, del_groups, MY_DEL_GROUPS_CNT, options, q);
431
+ TIMING_ASSERT_LATER(&timing, 0, 50);
432
+
433
+ if (destroy)
434
+ goto destroy;
435
+
436
+ /* Poll result queue */
437
+ TIMING_START(&timing, "DeleteGroups.queue_poll");
438
+ rkev = rd_kafka_queue_poll(q, exp_timeout + 1000);
439
+ TIMING_ASSERT_LATER(&timing, exp_timeout - 100, exp_timeout + 100);
440
+ TEST_ASSERT(rkev != NULL, "expected result in %dms", exp_timeout);
441
+ TEST_SAY("DeleteGroups: got %s in %.3fs\n", rd_kafka_event_name(rkev),
442
+ TIMING_DURATION(&timing) / 1000.0f);
443
+
444
+ /* Convert event to proper result */
445
+ res = rd_kafka_event_DeleteGroups_result(rkev);
446
+ TEST_ASSERT(res, "expected DeleteGroups_result, not %s",
447
+ rd_kafka_event_name(rkev));
448
+
449
+ opaque = rd_kafka_event_opaque(rkev);
450
+ TEST_ASSERT(opaque == my_opaque, "expected opaque to be %p, not %p",
451
+ my_opaque, opaque);
452
+
453
+ /* Expecting no error (errors will be per-group) */
454
+ err = rd_kafka_event_error(rkev);
455
+ errstr2 = rd_kafka_event_error_string(rkev);
456
+ TEST_ASSERT(err == RD_KAFKA_RESP_ERR_NO_ERROR,
457
+ "expected DeleteGroups to return error %s, not %s (%s)",
458
+ rd_kafka_err2str(RD_KAFKA_RESP_ERR_NO_ERROR),
459
+ rd_kafka_err2str(err), err ? errstr2 : "n/a");
460
+
461
+ /* Extract groups, should return MY_DEL_GROUPS_CNT groups. */
462
+ resgroups = rd_kafka_DeleteGroups_result_groups(res, &resgroup_cnt);
463
+ TEST_ASSERT(resgroups && resgroup_cnt == MY_DEL_GROUPS_CNT,
464
+ "expected %d result_groups, got %p cnt %" PRIusz,
465
+ MY_DEL_GROUPS_CNT, resgroups, resgroup_cnt);
466
+
467
+ /* The returned groups should be in the original order, and
468
+ * should all have timed out. */
469
+ for (i = 0; i < MY_DEL_GROUPS_CNT; i++) {
470
+ TEST_ASSERT(!strcmp(group_names[i],
471
+ rd_kafka_group_result_name(resgroups[i])),
472
+ "expected group '%s' at position %d, not '%s'",
473
+ group_names[i], i,
474
+ rd_kafka_group_result_name(resgroups[i]));
475
+ TEST_ASSERT(rd_kafka_error_code(rd_kafka_group_result_error(
476
+ resgroups[i])) == RD_KAFKA_RESP_ERR__TIMED_OUT,
477
+ "expected group '%s' to have timed out, got %s",
478
+ group_names[i],
479
+ rd_kafka_error_string(
480
+ rd_kafka_group_result_error(resgroups[i])));
481
+ }
482
+
483
+ rd_kafka_event_destroy(rkev);
484
+
485
+ destroy:
486
+ for (i = 0; i < MY_DEL_GROUPS_CNT; i++) {
487
+ rd_kafka_DeleteGroup_destroy(del_groups[i]);
488
+ rd_free(group_names[i]);
489
+ }
490
+
491
+ if (options)
492
+ rd_kafka_AdminOptions_destroy(options);
493
+
494
+ if (!useq)
495
+ rd_kafka_queue_destroy(q);
496
+ #undef MY_DEL_GROUPS_CNT
497
+
498
+ SUB_TEST_QUICK();
499
+ }
500
+
501
+ /**
502
+ * @brief ListConsumerGroups tests
503
+ *
504
+ *
505
+ *
506
+ */
507
+ static void do_test_ListConsumerGroups(const char *what,
508
+ rd_kafka_t *rk,
509
+ rd_kafka_queue_t *useq,
510
+ int with_options,
511
+ rd_bool_t destroy) {
512
+ rd_kafka_queue_t *q;
513
+ rd_kafka_AdminOptions_t *options = NULL;
514
+ int exp_timeout = MY_SOCKET_TIMEOUT_MS;
515
+ char errstr[512];
516
+ const char *errstr2;
517
+ rd_kafka_resp_err_t err;
518
+ test_timing_t timing;
519
+ rd_kafka_event_t *rkev;
520
+ const rd_kafka_ListConsumerGroups_result_t *res;
521
+ const rd_kafka_error_t **errors;
522
+ size_t errors_cnt, valid_cnt;
523
+ void *my_opaque = NULL, *opaque;
524
+
525
+ SUB_TEST_QUICK("%s ListConsumerGroups with %s, timeout %dms",
526
+ rd_kafka_name(rk), what, exp_timeout);
527
+
528
+ q = useq ? useq : rd_kafka_queue_new(rk);
529
+
530
+ if (with_options) {
531
+ rd_kafka_error_t *error;
532
+ rd_kafka_consumer_group_state_t duplicate_states[2] = {
533
+ RD_KAFKA_CONSUMER_GROUP_STATE_EMPTY,
534
+ RD_KAFKA_CONSUMER_GROUP_STATE_EMPTY};
535
+ rd_kafka_consumer_group_type_t duplicate_types[2] = {
536
+ RD_KAFKA_CONSUMER_GROUP_TYPE_CLASSIC,
537
+ RD_KAFKA_CONSUMER_GROUP_TYPE_CLASSIC};
538
+ rd_kafka_consumer_group_type_t unknown_type[1] = {
539
+ RD_KAFKA_CONSUMER_GROUP_TYPE_UNKNOWN};
540
+
541
+ options = rd_kafka_AdminOptions_new(
542
+ rk, RD_KAFKA_ADMIN_OP_LISTCONSUMERGROUPS);
543
+
544
+ /* Test duplicate error on match states */
545
+ error = rd_kafka_AdminOptions_set_match_consumer_group_states(
546
+ options, duplicate_states, 2);
547
+ TEST_ASSERT(error && rd_kafka_error_code(error), "%s",
548
+ "Expected error on duplicate states,"
549
+ " got no error");
550
+ rd_kafka_error_destroy(error);
551
+
552
+ /* Test duplicate error on match group types */
553
+ error = rd_kafka_AdminOptions_set_match_consumer_group_types(
554
+ options, duplicate_types, 2);
555
+ TEST_ASSERT(error && rd_kafka_error_code(error), "%s",
556
+ "Expected error on duplicate group types,"
557
+ " got no error");
558
+ rd_kafka_error_destroy(error);
559
+
560
+ /* Test invalid args error on setting UNKNOWN group type in
561
+ * match group types */
562
+ error = rd_kafka_AdminOptions_set_match_consumer_group_types(
563
+ options, unknown_type, 1);
564
+ TEST_ASSERT(error && rd_kafka_error_code(error), "%s",
565
+ "Expected error on Unknown group type,"
566
+ " got no error");
567
+ rd_kafka_error_destroy(error);
568
+
569
+ exp_timeout = MY_SOCKET_TIMEOUT_MS * 2;
570
+ TEST_CALL_ERR__(rd_kafka_AdminOptions_set_request_timeout(
571
+ options, exp_timeout, errstr, sizeof(errstr)));
572
+
573
+ if (useq) {
574
+ my_opaque = (void *)456;
575
+ rd_kafka_AdminOptions_set_opaque(options, my_opaque);
576
+ }
577
+ }
578
+
579
+ TIMING_START(&timing, "ListConsumerGroups");
580
+ TEST_SAY("Call ListConsumerGroups, timeout is %dms\n", exp_timeout);
581
+ rd_kafka_ListConsumerGroups(rk, options, q);
582
+ TIMING_ASSERT_LATER(&timing, 0, 50);
583
+
584
+ if (destroy)
585
+ goto destroy;
586
+
587
+ /* Poll result queue */
588
+ TIMING_START(&timing, "ListConsumerGroups.queue_poll");
589
+ rkev = rd_kafka_queue_poll(q, exp_timeout + 1000);
590
+ TIMING_ASSERT_LATER(&timing, exp_timeout - 100, exp_timeout + 100);
591
+ TEST_ASSERT(rkev != NULL, "expected result in %dms", exp_timeout);
592
+ TEST_SAY("ListConsumerGroups: got %s in %.3fs\n",
593
+ rd_kafka_event_name(rkev), TIMING_DURATION(&timing) / 1000.0f);
594
+
595
+ /* Convert event to proper result */
596
+ res = rd_kafka_event_ListConsumerGroups_result(rkev);
597
+ TEST_ASSERT(res, "expected ListConsumerGroups_result, not %s",
598
+ rd_kafka_event_name(rkev));
599
+
600
+ opaque = rd_kafka_event_opaque(rkev);
601
+ TEST_ASSERT(opaque == my_opaque, "expected opaque to be %p, not %p",
602
+ my_opaque, opaque);
603
+
604
+ /* Expecting no error here, the real error will be in the error array */
605
+ err = rd_kafka_event_error(rkev);
606
+ errstr2 = rd_kafka_event_error_string(rkev);
607
+ TEST_ASSERT(
608
+ err == RD_KAFKA_RESP_ERR_NO_ERROR,
609
+ "expected ListConsumerGroups to return error %s, not %s (%s)",
610
+ rd_kafka_err2str(RD_KAFKA_RESP_ERR_NO_ERROR), rd_kafka_err2str(err),
611
+ err ? errstr2 : "n/a");
612
+
613
+ errors = rd_kafka_ListConsumerGroups_result_errors(rkev, &errors_cnt);
614
+ TEST_ASSERT(errors_cnt == 1, "expected one error, got %" PRIusz,
615
+ errors_cnt);
616
+ rd_kafka_ListConsumerGroups_result_valid(rkev, &valid_cnt);
617
+ TEST_ASSERT(valid_cnt == 0, "expected zero valid groups, got %" PRIusz,
618
+ valid_cnt);
619
+
620
+ err = rd_kafka_error_code(errors[0]);
621
+ errstr2 = rd_kafka_error_string(errors[0]);
622
+ TEST_ASSERT(
623
+ err == RD_KAFKA_RESP_ERR__TIMED_OUT,
624
+ "expected ListConsumerGroups to return error %s, not %s (%s)",
625
+ rd_kafka_err2str(RD_KAFKA_RESP_ERR__TIMED_OUT),
626
+ rd_kafka_err2str(err), err ? errstr2 : "n/a");
627
+
628
+ rd_kafka_event_destroy(rkev);
629
+
630
+ destroy:
631
+ if (options)
632
+ rd_kafka_AdminOptions_destroy(options);
633
+
634
+ if (!useq)
635
+ rd_kafka_queue_destroy(q);
636
+ SUB_TEST_PASS();
637
+ }
638
+
639
+ /**
640
+ * @brief DescribeConsumerGroups tests
641
+ *
642
+ *
643
+ *
644
+ */
645
+ static void do_test_DescribeConsumerGroups(const char *what,
646
+ rd_kafka_t *rk,
647
+ rd_kafka_queue_t *useq,
648
+ int with_options,
649
+ rd_bool_t destroy) {
650
+ rd_kafka_queue_t *q;
651
+ #define TEST_DESCRIBE_CONSUMER_GROUPS_CNT 4
652
+ const char *group_names[TEST_DESCRIBE_CONSUMER_GROUPS_CNT];
653
+ rd_kafka_AdminOptions_t *options = NULL;
654
+ int exp_timeout = MY_SOCKET_TIMEOUT_MS;
655
+ int i;
656
+ char errstr[512];
657
+ const char *errstr2;
658
+ rd_kafka_resp_err_t err;
659
+ rd_kafka_error_t *error;
660
+ test_timing_t timing;
661
+ rd_kafka_event_t *rkev;
662
+ const rd_kafka_DescribeConsumerGroups_result_t *res;
663
+ const rd_kafka_ConsumerGroupDescription_t **resgroups;
664
+ size_t resgroup_cnt;
665
+ void *my_opaque = NULL, *opaque;
666
+
667
+ SUB_TEST_QUICK("%s DescribeConsumerGroups with %s, timeout %dms",
668
+ rd_kafka_name(rk), what, exp_timeout);
669
+
670
+ q = useq ? useq : rd_kafka_queue_new(rk);
671
+
672
+ for (i = 0; i < TEST_DESCRIBE_CONSUMER_GROUPS_CNT; i++) {
673
+ group_names[i] = rd_strdup(test_mk_topic_name(__FUNCTION__, 1));
674
+ }
675
+
676
+ if (with_options) {
677
+ options = rd_kafka_AdminOptions_new(
678
+ rk, RD_KAFKA_ADMIN_OP_DESCRIBECONSUMERGROUPS);
679
+
680
+ exp_timeout = MY_SOCKET_TIMEOUT_MS * 2;
681
+ err = rd_kafka_AdminOptions_set_request_timeout(
682
+ options, exp_timeout, errstr, sizeof(errstr));
683
+ TEST_ASSERT(!err, "%s", rd_kafka_err2str(err));
684
+ if ((error =
685
+ rd_kafka_AdminOptions_set_include_authorized_operations(
686
+ options, 0))) {
687
+ fprintf(stderr,
688
+ "%% Failed to set require authorized "
689
+ "operations: %s\n",
690
+ rd_kafka_error_string(error));
691
+ rd_kafka_error_destroy(error);
692
+ TEST_FAIL(
693
+ "Failed to set include authorized operations\n");
694
+ }
695
+
696
+ if (useq) {
697
+ my_opaque = (void *)456;
698
+ rd_kafka_AdminOptions_set_opaque(options, my_opaque);
699
+ }
700
+ }
701
+
702
+ TIMING_START(&timing, "DescribeConsumerGroups");
703
+ TEST_SAY("Call DescribeConsumerGroups, timeout is %dms\n", exp_timeout);
704
+ rd_kafka_DescribeConsumerGroups(
705
+ rk, group_names, TEST_DESCRIBE_CONSUMER_GROUPS_CNT, options, q);
706
+ TIMING_ASSERT_LATER(&timing, 0, 50);
707
+
708
+ if (destroy)
709
+ goto destroy;
710
+
711
+ /* Poll result queue */
712
+ TIMING_START(&timing, "DescribeConsumerGroups.queue_poll");
713
+ rkev = rd_kafka_queue_poll(q, exp_timeout + 1000);
714
+ TIMING_ASSERT_LATER(&timing, exp_timeout - 100, exp_timeout + 100);
715
+ TEST_ASSERT(rkev != NULL, "expected result in %dms", exp_timeout);
716
+ TEST_SAY("DescribeConsumerGroups: got %s in %.3fs\n",
717
+ rd_kafka_event_name(rkev), TIMING_DURATION(&timing) / 1000.0f);
718
+
719
+ /* Convert event to proper result */
720
+ res = rd_kafka_event_DescribeConsumerGroups_result(rkev);
721
+ TEST_ASSERT(res, "expected DescribeConsumerGroups_result, not %s",
722
+ rd_kafka_event_name(rkev));
723
+
724
+ opaque = rd_kafka_event_opaque(rkev);
725
+ TEST_ASSERT(opaque == my_opaque, "expected opaque to be %p, not %p",
726
+ my_opaque, opaque);
727
+
728
+ /* Expecting no error (errors will be per-group) */
729
+ err = rd_kafka_event_error(rkev);
730
+ errstr2 = rd_kafka_event_error_string(rkev);
731
+ TEST_ASSERT(
732
+ err == RD_KAFKA_RESP_ERR_NO_ERROR,
733
+ "expected DescribeConsumerGroups to return error %s, not %s (%s)",
734
+ rd_kafka_err2str(RD_KAFKA_RESP_ERR_NO_ERROR), rd_kafka_err2str(err),
735
+ err ? errstr2 : "n/a");
736
+
737
+ /* Extract groups, should return TEST_DESCRIBE_GROUPS_CNT groups. */
738
+ resgroups =
739
+ rd_kafka_DescribeConsumerGroups_result_groups(res, &resgroup_cnt);
740
+ TEST_ASSERT(resgroups &&
741
+ resgroup_cnt == TEST_DESCRIBE_CONSUMER_GROUPS_CNT,
742
+ "expected %d result_groups, got %p cnt %" PRIusz,
743
+ TEST_DESCRIBE_CONSUMER_GROUPS_CNT, resgroups, resgroup_cnt);
744
+
745
+ /* The returned groups should be in the original order, and
746
+ * should all have timed out. */
747
+ for (i = 0; i < TEST_DESCRIBE_CONSUMER_GROUPS_CNT; i++) {
748
+ size_t authorized_operation_cnt;
749
+ TEST_ASSERT(
750
+ !strcmp(group_names[i],
751
+ rd_kafka_ConsumerGroupDescription_group_id(
752
+ resgroups[i])),
753
+ "expected group '%s' at position %d, not '%s'",
754
+ group_names[i], i,
755
+ rd_kafka_ConsumerGroupDescription_group_id(resgroups[i]));
756
+ TEST_ASSERT(
757
+ rd_kafka_error_code(rd_kafka_ConsumerGroupDescription_error(
758
+ resgroups[i])) == RD_KAFKA_RESP_ERR__TIMED_OUT,
759
+ "expected group '%s' to have timed out, got %s",
760
+ group_names[i],
761
+ rd_kafka_error_string(
762
+ rd_kafka_ConsumerGroupDescription_error(resgroups[i])));
763
+
764
+ rd_kafka_ConsumerGroupDescription_authorized_operations(
765
+ resgroups[i], &authorized_operation_cnt);
766
+ TEST_ASSERT(authorized_operation_cnt == 0,
767
+ "Got authorized operations"
768
+ "when not requested");
769
+ }
770
+
771
+ rd_kafka_event_destroy(rkev);
772
+
773
+ destroy:
774
+ for (i = 0; i < TEST_DESCRIBE_CONSUMER_GROUPS_CNT; i++) {
775
+ rd_free((char *)group_names[i]);
776
+ }
777
+
778
+ if (options)
779
+ rd_kafka_AdminOptions_destroy(options);
780
+
781
+ if (!useq)
782
+ rd_kafka_queue_destroy(q);
783
+ #undef TEST_DESCRIBE_CONSUMER_GROUPS_CNT
784
+
785
+ SUB_TEST_PASS();
786
+ }
787
+
788
+ /**
789
+ * @brief DescribeTopics tests
790
+ *
791
+ *
792
+ *
793
+ */
794
+ static void do_test_DescribeTopics(const char *what,
795
+ rd_kafka_t *rk,
796
+ rd_kafka_queue_t *useq,
797
+ int with_options) {
798
+ rd_kafka_queue_t *q;
799
+ #define TEST_DESCRIBE_TOPICS_CNT 4
800
+ const char *topic_names[TEST_DESCRIBE_TOPICS_CNT];
801
+ rd_kafka_TopicCollection_t *topics;
802
+ rd_kafka_AdminOptions_t *options = NULL;
803
+ int exp_timeout = MY_SOCKET_TIMEOUT_MS;
804
+ int i;
805
+ char errstr[512];
806
+ const char *errstr2;
807
+ rd_kafka_resp_err_t err;
808
+ rd_kafka_error_t *error;
809
+ test_timing_t timing;
810
+ rd_kafka_event_t *rkev;
811
+ const rd_kafka_DescribeTopics_result_t *res;
812
+ const rd_kafka_TopicDescription_t **restopics;
813
+ size_t restopic_cnt;
814
+ void *my_opaque = NULL, *opaque;
815
+
816
+ SUB_TEST_QUICK("%s DescribeTopics with %s, timeout %dms",
817
+ rd_kafka_name(rk), what, exp_timeout);
818
+
819
+ q = useq ? useq : rd_kafka_queue_new(rk);
820
+
821
+ for (i = 0; i < TEST_DESCRIBE_TOPICS_CNT; i++) {
822
+ topic_names[i] = rd_strdup(test_mk_topic_name(__FUNCTION__, 1));
823
+ }
824
+
825
+ topics = rd_kafka_TopicCollection_of_topic_names(
826
+ topic_names, TEST_DESCRIBE_TOPICS_CNT);
827
+
828
+ if (with_options) {
829
+ options = rd_kafka_AdminOptions_new(
830
+ rk, RD_KAFKA_ADMIN_OP_DESCRIBETOPICS);
831
+
832
+ exp_timeout = MY_SOCKET_TIMEOUT_MS * 2;
833
+ err = rd_kafka_AdminOptions_set_request_timeout(
834
+ options, exp_timeout, errstr, sizeof(errstr));
835
+ TEST_ASSERT(!err, "%s", rd_kafka_err2str(err));
836
+ if ((error =
837
+ rd_kafka_AdminOptions_set_include_authorized_operations(
838
+ options, 0))) {
839
+ fprintf(stderr,
840
+ "%% Failed to set topic authorized operations: "
841
+ "%s\n",
842
+ rd_kafka_error_string(error));
843
+ rd_kafka_error_destroy(error);
844
+ TEST_FAIL(
845
+ "Failed to set topic authorized operations\n");
846
+ }
847
+
848
+ if (useq) {
849
+ my_opaque = (void *)456;
850
+ rd_kafka_AdminOptions_set_opaque(options, my_opaque);
851
+ }
852
+ }
853
+
854
+ TIMING_START(&timing, "DescribeTopics");
855
+ TEST_SAY("Call DescribeTopics, timeout is %dms\n", exp_timeout);
856
+ rd_kafka_DescribeTopics(rk, topics, options, q);
857
+ TIMING_ASSERT_LATER(&timing, 0, 50);
858
+
859
+ /* Poll result queue */
860
+ TIMING_START(&timing, "DescribeTopics.queue_poll");
861
+ rkev = rd_kafka_queue_poll(q, exp_timeout + 1000);
862
+ TIMING_ASSERT_LATER(&timing, exp_timeout - 100, exp_timeout + 100);
863
+ TEST_ASSERT(rkev != NULL, "expected result in %dms", exp_timeout);
864
+ TEST_SAY("DescribeTopics: got %s in %.3fs\n", rd_kafka_event_name(rkev),
865
+ TIMING_DURATION(&timing) / 1000.0f);
866
+
867
+ /* Convert event to proper result */
868
+ res = rd_kafka_event_DescribeTopics_result(rkev);
869
+ TEST_ASSERT(res, "expected DescribeTopics_result, not %s",
870
+ rd_kafka_event_name(rkev));
871
+
872
+ opaque = rd_kafka_event_opaque(rkev);
873
+ TEST_ASSERT(opaque == my_opaque, "expected opaque to be %p, not %p",
874
+ my_opaque, opaque);
875
+
876
+ /* Expecting error (Fail while waiting for controller)*/
877
+ err = rd_kafka_event_error(rkev);
878
+ errstr2 = rd_kafka_event_error_string(rkev);
879
+ TEST_ASSERT(err == RD_KAFKA_RESP_ERR__TIMED_OUT,
880
+ "expected DescribeTopics to return error %s, not %s (%s)",
881
+ rd_kafka_err2str(RD_KAFKA_RESP_ERR__TIMED_OUT),
882
+ rd_kafka_err2str(err), err ? errstr2 : "n/a");
883
+
884
+ /* Extract topics, should return 0 topics. */
885
+ restopics = rd_kafka_DescribeTopics_result_topics(res, &restopic_cnt);
886
+ TEST_ASSERT(!restopics && restopic_cnt == 0,
887
+ "expected no result topics, got %p cnt %" PRIusz, restopics,
888
+ restopic_cnt);
889
+
890
+ rd_kafka_event_destroy(rkev);
891
+
892
+ for (i = 0; i < TEST_DESCRIBE_TOPICS_CNT; i++) {
893
+ rd_free((char *)topic_names[i]);
894
+ }
895
+ rd_kafka_TopicCollection_destroy(topics);
896
+
897
+ if (options)
898
+ rd_kafka_AdminOptions_destroy(options);
899
+
900
+ if (!useq)
901
+ rd_kafka_queue_destroy(q);
902
+ #undef TEST_DESCRIBE_TOPICS_CNT
903
+
904
+ SUB_TEST_PASS();
905
+ }
906
+
907
+ /**
908
+ * @brief DescribeCluster tests
909
+ *
910
+ *
911
+ *
912
+ */
913
+ static void do_test_DescribeCluster(const char *what,
914
+ rd_kafka_t *rk,
915
+ rd_kafka_queue_t *useq,
916
+ int with_options) {
917
+ rd_kafka_queue_t *q;
918
+ rd_kafka_AdminOptions_t *options = NULL;
919
+ int exp_timeout = MY_SOCKET_TIMEOUT_MS;
920
+ char errstr[512];
921
+ const char *errstr2;
922
+ rd_kafka_resp_err_t err;
923
+ rd_kafka_error_t *error;
924
+ test_timing_t timing;
925
+ rd_kafka_event_t *rkev;
926
+ const rd_kafka_DescribeCluster_result_t *res;
927
+ void *my_opaque = NULL, *opaque;
928
+
929
+ SUB_TEST_QUICK("%s DescribeCluster with %s, timeout %dms",
930
+ rd_kafka_name(rk), what, exp_timeout);
931
+
932
+ q = useq ? useq : rd_kafka_queue_new(rk);
933
+
934
+ if (with_options) {
935
+ options = rd_kafka_AdminOptions_new(
936
+ rk, RD_KAFKA_ADMIN_OP_DESCRIBECLUSTER);
937
+
938
+ exp_timeout = MY_SOCKET_TIMEOUT_MS * 2;
939
+ err = rd_kafka_AdminOptions_set_request_timeout(
940
+ options, exp_timeout, errstr, sizeof(errstr));
941
+ TEST_ASSERT(!err, "%s", rd_kafka_err2str(err));
942
+ if ((error =
943
+ rd_kafka_AdminOptions_set_include_authorized_operations(
944
+ options, 0))) {
945
+ fprintf(stderr,
946
+ "%% Failed to set cluster authorized "
947
+ "operations: %s\n",
948
+ rd_kafka_error_string(error));
949
+ rd_kafka_error_destroy(error);
950
+ TEST_FAIL(
951
+ "Failed to set cluster authorized operations\n");
952
+ }
953
+
954
+ if (useq) {
955
+ my_opaque = (void *)456;
956
+ rd_kafka_AdminOptions_set_opaque(options, my_opaque);
957
+ }
958
+ }
959
+
960
+ TIMING_START(&timing, "DescribeCluster");
961
+ TEST_SAY("Call DescribeCluster, timeout is %dms\n", exp_timeout);
962
+ rd_kafka_DescribeCluster(rk, options, q);
963
+ TIMING_ASSERT_LATER(&timing, 0, 50);
964
+
965
+ /* Poll result queue */
966
+ TIMING_START(&timing, "DescribeCluster.queue_poll");
967
+ rkev = rd_kafka_queue_poll(q, exp_timeout + 1000);
968
+ TIMING_ASSERT_LATER(&timing, exp_timeout - 100, exp_timeout + 100);
969
+ TEST_ASSERT(rkev != NULL, "expected result in %dms", exp_timeout);
970
+ TEST_SAY("DescribeCluster: got %s in %.3fs\n",
971
+ rd_kafka_event_name(rkev), TIMING_DURATION(&timing) / 1000.0f);
972
+
973
+ /* Convert event to proper result */
974
+ res = rd_kafka_event_DescribeCluster_result(rkev);
975
+ TEST_ASSERT(res, "expected DescribeCluster_result, not %s",
976
+ rd_kafka_event_name(rkev));
977
+
978
+ opaque = rd_kafka_event_opaque(rkev);
979
+ TEST_ASSERT(opaque == my_opaque, "expected opaque to be %p, not %p",
980
+ my_opaque, opaque);
981
+
982
+ /* Expecting error (Fail while waiting for controller)*/
983
+ err = rd_kafka_event_error(rkev);
984
+ errstr2 = rd_kafka_event_error_string(rkev);
985
+ TEST_ASSERT(err == RD_KAFKA_RESP_ERR__TIMED_OUT,
986
+ "expected DescribeCluster to return error %s, not %s (%s)",
987
+ rd_kafka_err2str(RD_KAFKA_RESP_ERR__TIMED_OUT),
988
+ rd_kafka_err2str(err), err ? errstr2 : "n/a");
989
+
990
+ rd_kafka_event_destroy(rkev);
991
+
992
+ if (options)
993
+ rd_kafka_AdminOptions_destroy(options);
994
+
995
+ if (!useq)
996
+ rd_kafka_queue_destroy(q);
997
+
998
+ SUB_TEST_PASS();
999
+ }
1000
+
1001
+ static void do_test_DeleteRecords(const char *what,
1002
+ rd_kafka_t *rk,
1003
+ rd_kafka_queue_t *useq,
1004
+ int with_options,
1005
+ rd_bool_t destroy) {
1006
+ rd_kafka_queue_t *q;
1007
+ #define MY_DEL_RECORDS_CNT 4
1008
+ rd_kafka_AdminOptions_t *options = NULL;
1009
+ rd_kafka_topic_partition_list_t *offsets = NULL;
1010
+ rd_kafka_DeleteRecords_t *del_records;
1011
+ const rd_kafka_DeleteRecords_result_t *res;
1012
+ char *topics[MY_DEL_RECORDS_CNT];
1013
+ int exp_timeout = MY_SOCKET_TIMEOUT_MS;
1014
+ int i;
1015
+ char errstr[512];
1016
+ rd_kafka_resp_err_t err;
1017
+ test_timing_t timing;
1018
+ rd_kafka_event_t *rkev;
1019
+ void *my_opaque = NULL, *opaque;
1020
+
1021
+ SUB_TEST_QUICK("%s DeleteRecords with %s, timeout %dms",
1022
+ rd_kafka_name(rk), what, exp_timeout);
1023
+
1024
+ q = useq ? useq : rd_kafka_queue_new(rk);
1025
+
1026
+ for (i = 0; i < MY_DEL_RECORDS_CNT; i++) {
1027
+ topics[i] = rd_strdup(test_mk_topic_name(__FUNCTION__, 1));
1028
+ }
1029
+
1030
+ if (with_options) {
1031
+ options = rd_kafka_AdminOptions_new(
1032
+ rk, RD_KAFKA_ADMIN_OP_DELETERECORDS);
1033
+
1034
+ exp_timeout = MY_SOCKET_TIMEOUT_MS * 2;
1035
+
1036
+ err = rd_kafka_AdminOptions_set_request_timeout(
1037
+ options, exp_timeout, errstr, sizeof(errstr));
1038
+ TEST_ASSERT(!err, "%s", rd_kafka_err2str(err));
1039
+
1040
+ if (useq) {
1041
+ my_opaque = (void *)4567;
1042
+ rd_kafka_AdminOptions_set_opaque(options, my_opaque);
1043
+ }
1044
+ }
1045
+
1046
+ offsets = rd_kafka_topic_partition_list_new(MY_DEL_RECORDS_CNT);
1047
+
1048
+ for (i = 0; i < MY_DEL_RECORDS_CNT; i++)
1049
+ rd_kafka_topic_partition_list_add(offsets, topics[i], i)
1050
+ ->offset = RD_KAFKA_OFFSET_END;
1051
+
1052
+ del_records = rd_kafka_DeleteRecords_new(offsets);
1053
+ rd_kafka_topic_partition_list_destroy(offsets);
1054
+
1055
+ TIMING_START(&timing, "DeleteRecords");
1056
+ TEST_SAY("Call DeleteRecords, timeout is %dms\n", exp_timeout);
1057
+ rd_kafka_DeleteRecords(rk, &del_records, 1, options, q);
1058
+ TIMING_ASSERT_LATER(&timing, 0, 10);
1059
+
1060
+ rd_kafka_DeleteRecords_destroy(del_records);
1061
+
1062
+ if (destroy)
1063
+ goto destroy;
1064
+
1065
+ /* Poll result queue */
1066
+ TIMING_START(&timing, "DeleteRecords.queue_poll");
1067
+ rkev = rd_kafka_queue_poll(q, exp_timeout + 1000);
1068
+ TIMING_ASSERT(&timing, exp_timeout - 100, exp_timeout + 100);
1069
+ TEST_ASSERT(rkev != NULL, "expected result in %dms", exp_timeout);
1070
+ TEST_SAY("DeleteRecords: got %s in %.3fs\n", rd_kafka_event_name(rkev),
1071
+ TIMING_DURATION(&timing) / 1000.0f);
1072
+
1073
+ /* Convert event to proper result */
1074
+ res = rd_kafka_event_DeleteRecords_result(rkev);
1075
+ TEST_ASSERT(res, "expected DeleteRecords_result, not %s",
1076
+ rd_kafka_event_name(rkev));
1077
+
1078
+ opaque = rd_kafka_event_opaque(rkev);
1079
+ TEST_ASSERT(opaque == my_opaque, "expected opaque to be %p, not %p",
1080
+ my_opaque, opaque);
1081
+
1082
+ /* Expecting error (pre-fanout leader_req will fail) */
1083
+ err = rd_kafka_event_error(rkev);
1084
+ TEST_ASSERT(err, "expected DeleteRecords to fail");
1085
+
1086
+ rd_kafka_event_destroy(rkev);
1087
+
1088
+ destroy:
1089
+
1090
+ if (options)
1091
+ rd_kafka_AdminOptions_destroy(options);
1092
+
1093
+ if (!useq)
1094
+ rd_kafka_queue_destroy(q);
1095
+
1096
+ for (i = 0; i < MY_DEL_RECORDS_CNT; i++)
1097
+ rd_free(topics[i]);
1098
+
1099
+ #undef MY_DEL_RECORDS_CNT
1100
+
1101
+ SUB_TEST_PASS();
1102
+ }
1103
+
1104
+
1105
+ static void do_test_DeleteConsumerGroupOffsets(const char *what,
1106
+ rd_kafka_t *rk,
1107
+ rd_kafka_queue_t *useq,
1108
+ int with_options) {
1109
+ rd_kafka_queue_t *q;
1110
+ #define MY_DEL_CGRPOFFS_CNT 1
1111
+ rd_kafka_AdminOptions_t *options = NULL;
1112
+ const rd_kafka_DeleteConsumerGroupOffsets_result_t *res;
1113
+ rd_kafka_DeleteConsumerGroupOffsets_t *cgoffsets[MY_DEL_CGRPOFFS_CNT];
1114
+ int exp_timeout = MY_SOCKET_TIMEOUT_MS;
1115
+ int i;
1116
+ char errstr[512];
1117
+ rd_kafka_resp_err_t err;
1118
+ test_timing_t timing;
1119
+ rd_kafka_event_t *rkev;
1120
+ void *my_opaque = NULL, *opaque;
1121
+
1122
+ SUB_TEST_QUICK("%s DeleteConsumerGroupOffsets with %s, timeout %dms",
1123
+ rd_kafka_name(rk), what, exp_timeout);
1124
+
1125
+ q = useq ? useq : rd_kafka_queue_new(rk);
1126
+
1127
+ for (i = 0; i < MY_DEL_CGRPOFFS_CNT; i++) {
1128
+ rd_kafka_topic_partition_list_t *partitions =
1129
+ rd_kafka_topic_partition_list_new(3);
1130
+ rd_kafka_topic_partition_list_add(partitions, "topic1", 9);
1131
+ rd_kafka_topic_partition_list_add(partitions, "topic3", 15);
1132
+ rd_kafka_topic_partition_list_add(partitions, "topic1", 1);
1133
+ cgoffsets[i] = rd_kafka_DeleteConsumerGroupOffsets_new(
1134
+ "mygroup", partitions);
1135
+ rd_kafka_topic_partition_list_destroy(partitions);
1136
+ }
1137
+
1138
+ if (with_options) {
1139
+ options = rd_kafka_AdminOptions_new(
1140
+ rk, RD_KAFKA_ADMIN_OP_DELETECONSUMERGROUPOFFSETS);
1141
+
1142
+ exp_timeout = MY_SOCKET_TIMEOUT_MS * 2;
1143
+
1144
+ err = rd_kafka_AdminOptions_set_request_timeout(
1145
+ options, exp_timeout, errstr, sizeof(errstr));
1146
+ TEST_ASSERT(!err, "%s", rd_kafka_err2str(err));
1147
+
1148
+ if (useq) {
1149
+ my_opaque = (void *)99981;
1150
+ rd_kafka_AdminOptions_set_opaque(options, my_opaque);
1151
+ }
1152
+ }
1153
+
1154
+ TIMING_START(&timing, "DeleteConsumerGroupOffsets");
1155
+ TEST_SAY("Call DeleteConsumerGroupOffsets, timeout is %dms\n",
1156
+ exp_timeout);
1157
+ rd_kafka_DeleteConsumerGroupOffsets(rk, cgoffsets, MY_DEL_CGRPOFFS_CNT,
1158
+ options, q);
1159
+ TIMING_ASSERT_LATER(&timing, 0, 10);
1160
+
1161
+ /* Poll result queue */
1162
+ TIMING_START(&timing, "DeleteConsumerGroupOffsets.queue_poll");
1163
+ rkev = rd_kafka_queue_poll(q, exp_timeout + 1000);
1164
+ TIMING_ASSERT(&timing, exp_timeout - 100, exp_timeout + 100);
1165
+ TEST_ASSERT(rkev != NULL, "expected result in %dms", exp_timeout);
1166
+ TEST_SAY("DeleteConsumerGroupOffsets: got %s in %.3fs\n",
1167
+ rd_kafka_event_name(rkev), TIMING_DURATION(&timing) / 1000.0f);
1168
+
1169
+ /* Convert event to proper result */
1170
+ res = rd_kafka_event_DeleteConsumerGroupOffsets_result(rkev);
1171
+ TEST_ASSERT(res, "expected DeleteConsumerGroupOffsets_result, not %s",
1172
+ rd_kafka_event_name(rkev));
1173
+
1174
+ opaque = rd_kafka_event_opaque(rkev);
1175
+ TEST_ASSERT(opaque == my_opaque, "expected opaque to be %p, not %p",
1176
+ my_opaque, opaque);
1177
+
1178
+ /* Expecting error */
1179
+ err = rd_kafka_event_error(rkev);
1180
+ TEST_ASSERT(err, "expected DeleteConsumerGroupOffsets to fail");
1181
+
1182
+ rd_kafka_event_destroy(rkev);
1183
+
1184
+ if (options)
1185
+ rd_kafka_AdminOptions_destroy(options);
1186
+
1187
+ if (!useq)
1188
+ rd_kafka_queue_destroy(q);
1189
+
1190
+ rd_kafka_DeleteConsumerGroupOffsets_destroy_array(cgoffsets,
1191
+ MY_DEL_CGRPOFFS_CNT);
1192
+
1193
+ #undef MY_DEL_CGRPOFFS_CNT
1194
+
1195
+ SUB_TEST_PASS();
1196
+ }
1197
+
1198
+ /**
1199
+ * @brief AclBinding tests
1200
+ *
1201
+ *
1202
+ *
1203
+ */
1204
+ static void do_test_AclBinding() {
1205
+ int i;
1206
+ char errstr[512];
1207
+ rd_kafka_AclBinding_t *new_acl;
1208
+
1209
+ rd_bool_t valid_resource_types[] = {
1210
+ rd_false, rd_false, rd_true, rd_true, rd_true, rd_true, rd_false};
1211
+ rd_bool_t valid_resource_pattern_types[] = {
1212
+ rd_false, rd_false, rd_false, rd_true, rd_true, rd_false};
1213
+ rd_bool_t valid_acl_operation[] = {
1214
+ rd_false, rd_false, rd_true, rd_true, rd_true, rd_true, rd_true,
1215
+ rd_true, rd_true, rd_true, rd_true, rd_true, rd_true, rd_false};
1216
+ rd_bool_t valid_acl_permission_type[] = {rd_false, rd_false, rd_true,
1217
+ rd_true, rd_false};
1218
+ const char *topic = test_mk_topic_name(__FUNCTION__, 1);
1219
+ const char *principal = "User:test";
1220
+ const char *host = "*";
1221
+
1222
+ SUB_TEST_QUICK();
1223
+
1224
+ // Valid acl binding
1225
+ *errstr = '\0';
1226
+ new_acl = rd_kafka_AclBinding_new(
1227
+ RD_KAFKA_RESOURCE_TOPIC, topic, RD_KAFKA_RESOURCE_PATTERN_LITERAL,
1228
+ principal, host, RD_KAFKA_ACL_OPERATION_ALL,
1229
+ RD_KAFKA_ACL_PERMISSION_TYPE_ALLOW, errstr, sizeof(errstr));
1230
+ TEST_ASSERT(new_acl, "expected AclBinding");
1231
+ rd_kafka_AclBinding_destroy(new_acl);
1232
+
1233
+ *errstr = '\0';
1234
+ new_acl = rd_kafka_AclBinding_new(
1235
+ RD_KAFKA_RESOURCE_TOPIC, NULL, RD_KAFKA_RESOURCE_PATTERN_LITERAL,
1236
+ principal, host, RD_KAFKA_ACL_OPERATION_ALL,
1237
+ RD_KAFKA_ACL_PERMISSION_TYPE_ALLOW, errstr, sizeof(errstr));
1238
+ TEST_ASSERT(!new_acl && !strcmp(errstr, "Invalid resource name"),
1239
+ "expected error string \"Invalid resource name\", not %s",
1240
+ errstr);
1241
+
1242
+ *errstr = '\0';
1243
+ new_acl = rd_kafka_AclBinding_new(
1244
+ RD_KAFKA_RESOURCE_TOPIC, topic, RD_KAFKA_RESOURCE_PATTERN_LITERAL,
1245
+ NULL, host, RD_KAFKA_ACL_OPERATION_ALL,
1246
+ RD_KAFKA_ACL_PERMISSION_TYPE_ALLOW, errstr, sizeof(errstr));
1247
+ TEST_ASSERT(!new_acl && !strcmp(errstr, "Invalid principal"),
1248
+ "expected error string \"Invalid principal\", not %s",
1249
+ errstr);
1250
+
1251
+ *errstr = '\0';
1252
+ new_acl = rd_kafka_AclBinding_new(
1253
+ RD_KAFKA_RESOURCE_TOPIC, topic, RD_KAFKA_RESOURCE_PATTERN_LITERAL,
1254
+ principal, NULL, RD_KAFKA_ACL_OPERATION_ALL,
1255
+ RD_KAFKA_ACL_PERMISSION_TYPE_ALLOW, errstr, sizeof(errstr));
1256
+ TEST_ASSERT(!new_acl && !strcmp(errstr, "Invalid host"),
1257
+ "expected error string \"Invalid host\", not %s", errstr);
1258
+
1259
+ for (i = -1; i <= RD_KAFKA_RESOURCE__CNT; i++) {
1260
+ *errstr = '\0';
1261
+ new_acl = rd_kafka_AclBinding_new(
1262
+ i, topic, RD_KAFKA_RESOURCE_PATTERN_LITERAL, principal,
1263
+ host, RD_KAFKA_ACL_OPERATION_ALL,
1264
+ RD_KAFKA_ACL_PERMISSION_TYPE_ALLOW, errstr, sizeof(errstr));
1265
+ if (i >= 0 && valid_resource_types[i]) {
1266
+ TEST_ASSERT(new_acl, "expected AclBinding");
1267
+ rd_kafka_AclBinding_destroy(new_acl);
1268
+ } else
1269
+ TEST_ASSERT(
1270
+ !new_acl &&
1271
+ !strcmp(errstr, "Invalid resource type"),
1272
+ "expected error string \"Invalid resource type\", "
1273
+ "not %s",
1274
+ errstr);
1275
+ }
1276
+ for (i = -1; i <= RD_KAFKA_RESOURCE_PATTERN_TYPE__CNT; i++) {
1277
+ *errstr = '\0';
1278
+ new_acl = rd_kafka_AclBinding_new(
1279
+ RD_KAFKA_RESOURCE_TOPIC, topic, i, principal, host,
1280
+ RD_KAFKA_ACL_OPERATION_ALL,
1281
+ RD_KAFKA_ACL_PERMISSION_TYPE_ALLOW, errstr, sizeof(errstr));
1282
+ if (i >= 0 && valid_resource_pattern_types[i]) {
1283
+ TEST_ASSERT(new_acl, "expected AclBinding");
1284
+ rd_kafka_AclBinding_destroy(new_acl);
1285
+ } else
1286
+ TEST_ASSERT(
1287
+ !new_acl &&
1288
+ !strcmp(errstr,
1289
+ "Invalid resource pattern type"),
1290
+ "expected error string \"Invalid resource pattern "
1291
+ "type\", not %s",
1292
+ errstr);
1293
+ }
1294
+ for (i = -1; i <= RD_KAFKA_ACL_OPERATION__CNT; i++) {
1295
+ *errstr = '\0';
1296
+ new_acl = rd_kafka_AclBinding_new(
1297
+ RD_KAFKA_RESOURCE_TOPIC, topic,
1298
+ RD_KAFKA_RESOURCE_PATTERN_LITERAL, principal, host, i,
1299
+ RD_KAFKA_ACL_PERMISSION_TYPE_ALLOW, errstr, sizeof(errstr));
1300
+ if (i >= 0 && valid_acl_operation[i]) {
1301
+ TEST_ASSERT(new_acl, "expected AclBinding");
1302
+ rd_kafka_AclBinding_destroy(new_acl);
1303
+ } else
1304
+ TEST_ASSERT(!new_acl &&
1305
+ !strcmp(errstr, "Invalid operation"),
1306
+ "expected error string \"Invalid "
1307
+ "operation\", not %s",
1308
+ errstr);
1309
+ }
1310
+ for (i = -1; i <= RD_KAFKA_ACL_PERMISSION_TYPE__CNT; i++) {
1311
+ *errstr = '\0';
1312
+ new_acl = rd_kafka_AclBinding_new(
1313
+ RD_KAFKA_RESOURCE_TOPIC, topic,
1314
+ RD_KAFKA_RESOURCE_PATTERN_LITERAL, principal, host,
1315
+ RD_KAFKA_ACL_OPERATION_ALL, i, errstr, sizeof(errstr));
1316
+ if (i >= 0 && valid_acl_permission_type[i]) {
1317
+ TEST_ASSERT(new_acl, "expected AclBinding");
1318
+ rd_kafka_AclBinding_destroy(new_acl);
1319
+ } else
1320
+ TEST_ASSERT(
1321
+ !new_acl &&
1322
+ !strcmp(errstr, "Invalid permission type"),
1323
+ "expected error string \"permission type\", not %s",
1324
+ errstr);
1325
+ }
1326
+
1327
+ SUB_TEST_PASS();
1328
+ }
1329
+
1330
+ /**
1331
+ * @brief AclBindingFilter tests
1332
+ *
1333
+ *
1334
+ *
1335
+ */
1336
+ static void do_test_AclBindingFilter() {
1337
+ int i;
1338
+ char errstr[512];
1339
+ rd_kafka_AclBindingFilter_t *new_acl_filter;
1340
+
1341
+ rd_bool_t valid_resource_types[] = {rd_false, rd_true, rd_true, rd_true,
1342
+ rd_true, rd_true, rd_false};
1343
+ rd_bool_t valid_resource_pattern_types[] = {
1344
+ rd_false, rd_true, rd_true, rd_true, rd_true, rd_false};
1345
+ rd_bool_t valid_acl_operation[] = {
1346
+ rd_false, rd_true, rd_true, rd_true, rd_true, rd_true, rd_true,
1347
+ rd_true, rd_true, rd_true, rd_true, rd_true, rd_true, rd_false};
1348
+ rd_bool_t valid_acl_permission_type[] = {rd_false, rd_true, rd_true,
1349
+ rd_true, rd_false};
1350
+ const char *topic = test_mk_topic_name(__FUNCTION__, 1);
1351
+ const char *principal = "User:test";
1352
+ const char *host = "*";
1353
+
1354
+ SUB_TEST_QUICK();
1355
+
1356
+ // Valid acl binding
1357
+ *errstr = '\0';
1358
+ new_acl_filter = rd_kafka_AclBindingFilter_new(
1359
+ RD_KAFKA_RESOURCE_TOPIC, topic, RD_KAFKA_RESOURCE_PATTERN_LITERAL,
1360
+ principal, host, RD_KAFKA_ACL_OPERATION_ALL,
1361
+ RD_KAFKA_ACL_PERMISSION_TYPE_ALLOW, errstr, sizeof(errstr));
1362
+ TEST_ASSERT(new_acl_filter, "expected AclBindingFilter");
1363
+ rd_kafka_AclBinding_destroy(new_acl_filter);
1364
+
1365
+ *errstr = '\0';
1366
+ new_acl_filter = rd_kafka_AclBindingFilter_new(
1367
+ RD_KAFKA_RESOURCE_TOPIC, NULL, RD_KAFKA_RESOURCE_PATTERN_LITERAL,
1368
+ principal, host, RD_KAFKA_ACL_OPERATION_ALL,
1369
+ RD_KAFKA_ACL_PERMISSION_TYPE_ALLOW, errstr, sizeof(errstr));
1370
+ TEST_ASSERT(new_acl_filter, "expected AclBindingFilter");
1371
+ rd_kafka_AclBinding_destroy(new_acl_filter);
1372
+
1373
+ *errstr = '\0';
1374
+ new_acl_filter = rd_kafka_AclBindingFilter_new(
1375
+ RD_KAFKA_RESOURCE_TOPIC, topic, RD_KAFKA_RESOURCE_PATTERN_LITERAL,
1376
+ NULL, host, RD_KAFKA_ACL_OPERATION_ALL,
1377
+ RD_KAFKA_ACL_PERMISSION_TYPE_ALLOW, errstr, sizeof(errstr));
1378
+ TEST_ASSERT(new_acl_filter, "expected AclBindingFilter");
1379
+ rd_kafka_AclBinding_destroy(new_acl_filter);
1380
+
1381
+ *errstr = '\0';
1382
+ new_acl_filter = rd_kafka_AclBindingFilter_new(
1383
+ RD_KAFKA_RESOURCE_TOPIC, topic, RD_KAFKA_RESOURCE_PATTERN_LITERAL,
1384
+ principal, NULL, RD_KAFKA_ACL_OPERATION_ALL,
1385
+ RD_KAFKA_ACL_PERMISSION_TYPE_ALLOW, errstr, sizeof(errstr));
1386
+ TEST_ASSERT(new_acl_filter, "expected AclBindingFilter");
1387
+ rd_kafka_AclBinding_destroy(new_acl_filter);
1388
+
1389
+ for (i = -1; i <= RD_KAFKA_RESOURCE__CNT; i++) {
1390
+ *errstr = '\0';
1391
+ new_acl_filter = rd_kafka_AclBindingFilter_new(
1392
+ i, topic, RD_KAFKA_RESOURCE_PATTERN_LITERAL, principal,
1393
+ host, RD_KAFKA_ACL_OPERATION_ALL,
1394
+ RD_KAFKA_ACL_PERMISSION_TYPE_ALLOW, errstr, sizeof(errstr));
1395
+ if (i >= 0 && valid_resource_types[i]) {
1396
+ TEST_ASSERT(new_acl_filter,
1397
+ "expected AclBindingFilter");
1398
+ rd_kafka_AclBinding_destroy(new_acl_filter);
1399
+ } else
1400
+ TEST_ASSERT(
1401
+ !new_acl_filter &&
1402
+ !strcmp(errstr, "Invalid resource type"),
1403
+ "expected error string \"Invalid resource type\", "
1404
+ "not %s",
1405
+ errstr);
1406
+ }
1407
+ for (i = -1; i <= RD_KAFKA_RESOURCE_PATTERN_TYPE__CNT; i++) {
1408
+ *errstr = '\0';
1409
+ new_acl_filter = rd_kafka_AclBindingFilter_new(
1410
+ RD_KAFKA_RESOURCE_TOPIC, topic, i, principal, host,
1411
+ RD_KAFKA_ACL_OPERATION_ALL,
1412
+ RD_KAFKA_ACL_PERMISSION_TYPE_ALLOW, errstr, sizeof(errstr));
1413
+ if (i >= 0 && valid_resource_pattern_types[i]) {
1414
+ TEST_ASSERT(new_acl_filter,
1415
+ "expected AclBindingFilter");
1416
+ rd_kafka_AclBinding_destroy(new_acl_filter);
1417
+ } else
1418
+ TEST_ASSERT(
1419
+ !new_acl_filter &&
1420
+ !strcmp(errstr,
1421
+ "Invalid resource pattern type"),
1422
+ "expected error string \"Invalid resource pattern "
1423
+ "type\", not %s",
1424
+ errstr);
1425
+ }
1426
+ for (i = -1; i <= RD_KAFKA_ACL_OPERATION__CNT; i++) {
1427
+ *errstr = '\0';
1428
+ new_acl_filter = rd_kafka_AclBindingFilter_new(
1429
+ RD_KAFKA_RESOURCE_TOPIC, topic,
1430
+ RD_KAFKA_RESOURCE_PATTERN_LITERAL, principal, host, i,
1431
+ RD_KAFKA_ACL_PERMISSION_TYPE_ALLOW, errstr, sizeof(errstr));
1432
+ if (i >= 0 && valid_acl_operation[i]) {
1433
+ TEST_ASSERT(new_acl_filter,
1434
+ "expected AclBindingFilter");
1435
+ rd_kafka_AclBinding_destroy(new_acl_filter);
1436
+ } else
1437
+ TEST_ASSERT(!new_acl_filter &&
1438
+ !strcmp(errstr, "Invalid operation"),
1439
+ "expected error string \"Invalid "
1440
+ "operation\", not %s",
1441
+ errstr);
1442
+ }
1443
+ for (i = -1; i <= RD_KAFKA_ACL_PERMISSION_TYPE__CNT; i++) {
1444
+ *errstr = '\0';
1445
+ new_acl_filter = rd_kafka_AclBindingFilter_new(
1446
+ RD_KAFKA_RESOURCE_TOPIC, topic,
1447
+ RD_KAFKA_RESOURCE_PATTERN_LITERAL, principal, host,
1448
+ RD_KAFKA_ACL_OPERATION_ALL, i, errstr, sizeof(errstr));
1449
+ if (i >= 0 && valid_acl_permission_type[i]) {
1450
+ TEST_ASSERT(new_acl_filter,
1451
+ "expected AclBindingFilter");
1452
+ rd_kafka_AclBinding_destroy(new_acl_filter);
1453
+ } else
1454
+ TEST_ASSERT(
1455
+ !new_acl_filter &&
1456
+ !strcmp(errstr, "Invalid permission type"),
1457
+ "expected error string \"permission type\", not %s",
1458
+ errstr);
1459
+ }
1460
+
1461
+ SUB_TEST_PASS();
1462
+ }
1463
+
1464
+
1465
+ /**
1466
+ * @brief CreateAcls tests
1467
+ *
1468
+ *
1469
+ *
1470
+ */
1471
+ static void do_test_CreateAcls(const char *what,
1472
+ rd_kafka_t *rk,
1473
+ rd_kafka_queue_t *useq,
1474
+ rd_bool_t with_background_event_cb,
1475
+ rd_bool_t with_options) {
1476
+ rd_kafka_queue_t *q;
1477
+ #define MY_NEW_ACLS_CNT 2
1478
+ rd_kafka_AclBinding_t *new_acls[MY_NEW_ACLS_CNT];
1479
+ rd_kafka_AdminOptions_t *options = NULL;
1480
+ int exp_timeout = MY_SOCKET_TIMEOUT_MS;
1481
+ int i;
1482
+ char errstr[512];
1483
+ const char *errstr2;
1484
+ rd_kafka_resp_err_t err;
1485
+ test_timing_t timing;
1486
+ rd_kafka_event_t *rkev;
1487
+ const rd_kafka_CreateAcls_result_t *res;
1488
+ const rd_kafka_acl_result_t **resacls;
1489
+ size_t resacls_cnt;
1490
+ void *my_opaque = NULL, *opaque;
1491
+ const char *principal = "User:test";
1492
+ const char *host = "*";
1493
+
1494
+ SUB_TEST_QUICK("%s CreaetAcls with %s, timeout %dms", rd_kafka_name(rk),
1495
+ what, exp_timeout);
1496
+
1497
+ q = useq ? useq : rd_kafka_queue_new(rk);
1498
+
1499
+ /**
1500
+ * Construct AclBinding array
1501
+ */
1502
+ for (i = 0; i < MY_NEW_ACLS_CNT; i++) {
1503
+ const char *topic = test_mk_topic_name(__FUNCTION__, 1);
1504
+ new_acls[i] = rd_kafka_AclBinding_new(
1505
+ RD_KAFKA_RESOURCE_TOPIC, topic,
1506
+ RD_KAFKA_RESOURCE_PATTERN_LITERAL, principal, host,
1507
+ RD_KAFKA_ACL_OPERATION_ALL,
1508
+ RD_KAFKA_ACL_PERMISSION_TYPE_ALLOW, errstr, sizeof(errstr));
1509
+ }
1510
+
1511
+ if (with_options) {
1512
+ options = rd_kafka_AdminOptions_new(rk, RD_KAFKA_ADMIN_OP_ANY);
1513
+
1514
+ exp_timeout = MY_SOCKET_TIMEOUT_MS * 2;
1515
+ err = rd_kafka_AdminOptions_set_request_timeout(
1516
+ options, exp_timeout, errstr, sizeof(errstr));
1517
+ TEST_ASSERT(!err, "%s", rd_kafka_err2str(err));
1518
+
1519
+ my_opaque = (void *)123;
1520
+ rd_kafka_AdminOptions_set_opaque(options, my_opaque);
1521
+ }
1522
+
1523
+ TIMING_START(&timing, "CreateAcls");
1524
+ TEST_SAY("Call CreateAcls, timeout is %dms\n", exp_timeout);
1525
+ rd_kafka_CreateAcls(rk, new_acls, MY_NEW_ACLS_CNT, options, q);
1526
+ TIMING_ASSERT_LATER(&timing, 0, 50);
1527
+
1528
+ if (with_background_event_cb) {
1529
+ /* Result event will be triggered by callback from
1530
+ * librdkafka background queue thread. */
1531
+ TIMING_START(&timing, "CreateAcls.wait_background_event_cb");
1532
+ rkev = wait_background_event_cb();
1533
+ } else {
1534
+ /* Poll result queue */
1535
+ TIMING_START(&timing, "CreateAcls.queue_poll");
1536
+ rkev = rd_kafka_queue_poll(q, exp_timeout + 1000);
1537
+ }
1538
+
1539
+ TIMING_ASSERT_LATER(&timing, exp_timeout - 100, exp_timeout + 100);
1540
+ TEST_ASSERT(rkev != NULL, "expected result in %dms", exp_timeout);
1541
+ TEST_SAY("CreateAcls: got %s in %.3fs\n", rd_kafka_event_name(rkev),
1542
+ TIMING_DURATION(&timing) / 1000.0f);
1543
+
1544
+ /* Convert event to proper result */
1545
+ res = rd_kafka_event_CreateAcls_result(rkev);
1546
+ TEST_ASSERT(res, "expected CreateAcls_result, not %s",
1547
+ rd_kafka_event_name(rkev));
1548
+
1549
+ opaque = rd_kafka_event_opaque(rkev);
1550
+ TEST_ASSERT(opaque == my_opaque, "expected opaque to be %p, not %p",
1551
+ my_opaque, opaque);
1552
+
1553
+ /* Expecting error */
1554
+ err = rd_kafka_event_error(rkev);
1555
+ errstr2 = rd_kafka_event_error_string(rkev);
1556
+ TEST_ASSERT(err == RD_KAFKA_RESP_ERR__TIMED_OUT,
1557
+ "expected CreateAcls to return error %s, not %s (%s)",
1558
+ rd_kafka_err2str(RD_KAFKA_RESP_ERR__TIMED_OUT),
1559
+ rd_kafka_err2str(err), err ? errstr2 : "n/a");
1560
+
1561
+ /* Attempt to extract acls results anyway, should return NULL. */
1562
+ resacls = rd_kafka_CreateAcls_result_acls(res, &resacls_cnt);
1563
+ TEST_ASSERT(!resacls && resacls_cnt == 0,
1564
+ "expected no acl result, got %p cnt %" PRIusz, resacls,
1565
+ resacls_cnt);
1566
+
1567
+ rd_kafka_event_destroy(rkev);
1568
+
1569
+ rd_kafka_AclBinding_destroy_array(new_acls, MY_NEW_ACLS_CNT);
1570
+
1571
+ if (options)
1572
+ rd_kafka_AdminOptions_destroy(options);
1573
+
1574
+ if (!useq)
1575
+ rd_kafka_queue_destroy(q);
1576
+
1577
+ #undef MY_NEW_ACLS_CNT
1578
+
1579
+ SUB_TEST_PASS();
1580
+ }
1581
+
1582
+ /**
1583
+ * @brief DescribeAcls tests
1584
+ *
1585
+ *
1586
+ *
1587
+ */
1588
+ static void do_test_DescribeAcls(const char *what,
1589
+ rd_kafka_t *rk,
1590
+ rd_kafka_queue_t *useq,
1591
+ rd_bool_t with_background_event_cb,
1592
+ rd_bool_t with_options) {
1593
+ rd_kafka_queue_t *q;
1594
+ rd_kafka_AclBindingFilter_t *describe_acls;
1595
+ rd_kafka_AdminOptions_t *options = NULL;
1596
+ int exp_timeout = MY_SOCKET_TIMEOUT_MS;
1597
+ char errstr[512];
1598
+ const char *errstr2;
1599
+ rd_kafka_resp_err_t err;
1600
+ test_timing_t timing;
1601
+ rd_kafka_event_t *rkev;
1602
+ const rd_kafka_DescribeAcls_result_t *res;
1603
+ const rd_kafka_AclBinding_t **res_acls;
1604
+ size_t res_acls_cnt;
1605
+ void *my_opaque = NULL, *opaque;
1606
+ const char *principal = "User:test";
1607
+ const char *host = "*";
1608
+
1609
+ SUB_TEST_QUICK("%s DescribeAcls with %s, timeout %dms",
1610
+ rd_kafka_name(rk), what, exp_timeout);
1611
+
1612
+ q = useq ? useq : rd_kafka_queue_new(rk);
1613
+
1614
+ /**
1615
+ * Construct AclBindingFilter
1616
+ */
1617
+ const char *topic = test_mk_topic_name(__FUNCTION__, 1);
1618
+ describe_acls = rd_kafka_AclBindingFilter_new(
1619
+ RD_KAFKA_RESOURCE_TOPIC, topic, RD_KAFKA_RESOURCE_PATTERN_PREFIXED,
1620
+ principal, host, RD_KAFKA_ACL_OPERATION_ALL,
1621
+ RD_KAFKA_ACL_PERMISSION_TYPE_ALLOW, errstr, sizeof(errstr));
1622
+
1623
+ if (with_options) {
1624
+ options = rd_kafka_AdminOptions_new(rk, RD_KAFKA_ADMIN_OP_ANY);
1625
+
1626
+ exp_timeout = MY_SOCKET_TIMEOUT_MS * 2;
1627
+ err = rd_kafka_AdminOptions_set_request_timeout(
1628
+ options, exp_timeout, errstr, sizeof(errstr));
1629
+ TEST_ASSERT(!err, "%s", rd_kafka_err2str(err));
1630
+
1631
+ my_opaque = (void *)123;
1632
+ rd_kafka_AdminOptions_set_opaque(options, my_opaque);
1633
+ }
1634
+
1635
+ TIMING_START(&timing, "DescribeAcls");
1636
+ TEST_SAY("Call DescribeAcls, timeout is %dms\n", exp_timeout);
1637
+ rd_kafka_DescribeAcls(rk, describe_acls, options, q);
1638
+ TIMING_ASSERT_LATER(&timing, 0, 50);
1639
+
1640
+ if (with_background_event_cb) {
1641
+ /* Result event will be triggered by callback from
1642
+ * librdkafka background queue thread. */
1643
+ TIMING_START(&timing, "DescribeAcls.wait_background_event_cb");
1644
+ rkev = wait_background_event_cb();
1645
+ } else {
1646
+ /* Poll result queue */
1647
+ TIMING_START(&timing, "DescribeAcls.queue_poll");
1648
+ rkev = rd_kafka_queue_poll(q, exp_timeout + 1000);
1649
+ }
1650
+
1651
+ TIMING_ASSERT_LATER(&timing, exp_timeout - 100, exp_timeout + 100);
1652
+ TEST_ASSERT(rkev != NULL, "expected result in %dms", exp_timeout);
1653
+ TEST_SAY("DescribeAcls: got %s in %.3fs\n", rd_kafka_event_name(rkev),
1654
+ TIMING_DURATION(&timing) / 1000.0f);
1655
+
1656
+ /* Convert event to proper result */
1657
+ res = rd_kafka_event_DescribeAcls_result(rkev);
1658
+ TEST_ASSERT(res, "expected DescribeAcls_result, not %s",
1659
+ rd_kafka_event_name(rkev));
1660
+
1661
+ opaque = rd_kafka_event_opaque(rkev);
1662
+ TEST_ASSERT(opaque == my_opaque, "expected opaque to be %p, not %p",
1663
+ my_opaque, opaque);
1664
+
1665
+ /* Expecting error */
1666
+ err = rd_kafka_event_error(rkev);
1667
+ errstr2 = rd_kafka_event_error_string(rkev);
1668
+ TEST_ASSERT(err == RD_KAFKA_RESP_ERR__TIMED_OUT,
1669
+ "expected DescribeAcls to return error %s, not %s (%s)",
1670
+ rd_kafka_err2str(RD_KAFKA_RESP_ERR__TIMED_OUT),
1671
+ rd_kafka_err2str(err), err ? errstr2 : "n/a");
1672
+
1673
+ /* Attempt to extract result acls anyway, should return NULL. */
1674
+ res_acls = rd_kafka_DescribeAcls_result_acls(res, &res_acls_cnt);
1675
+ TEST_ASSERT(!res_acls && res_acls_cnt == 0,
1676
+ "expected no result acls, got %p cnt %" PRIusz, res_acls,
1677
+ res_acls_cnt);
1678
+
1679
+ rd_kafka_event_destroy(rkev);
1680
+
1681
+ rd_kafka_AclBinding_destroy(describe_acls);
1682
+
1683
+ if (options)
1684
+ rd_kafka_AdminOptions_destroy(options);
1685
+
1686
+ if (!useq)
1687
+ rd_kafka_queue_destroy(q);
1688
+
1689
+ SUB_TEST_PASS();
1690
+ }
1691
+
1692
+
1693
+ /**
1694
+ * @brief DeleteAcls tests
1695
+ *
1696
+ *
1697
+ *
1698
+ */
1699
+ static void do_test_DeleteAcls(const char *what,
1700
+ rd_kafka_t *rk,
1701
+ rd_kafka_queue_t *useq,
1702
+ rd_bool_t with_background_event_cb,
1703
+ rd_bool_t with_options) {
1704
+ #define DELETE_ACLS_FILTERS_CNT 2
1705
+ rd_kafka_queue_t *q;
1706
+ rd_kafka_AclBindingFilter_t *delete_acls[DELETE_ACLS_FILTERS_CNT];
1707
+ rd_kafka_AdminOptions_t *options = NULL;
1708
+ int exp_timeout = MY_SOCKET_TIMEOUT_MS;
1709
+ int i;
1710
+ char errstr[512];
1711
+ const char *errstr2;
1712
+ rd_kafka_resp_err_t err;
1713
+ test_timing_t timing;
1714
+ rd_kafka_event_t *rkev;
1715
+ const rd_kafka_DeleteAcls_result_t *res;
1716
+ const rd_kafka_DeleteAcls_result_response_t **res_response;
1717
+ size_t res_response_cnt;
1718
+ void *my_opaque = NULL, *opaque;
1719
+ const char *principal = "User:test";
1720
+ const char *host = "*";
1721
+
1722
+ SUB_TEST_QUICK("%s DeleteAcls with %s, timeout %dms", rd_kafka_name(rk),
1723
+ what, exp_timeout);
1724
+
1725
+ q = useq ? useq : rd_kafka_queue_new(rk);
1726
+
1727
+ /**
1728
+ * Construct AclBindingFilter array
1729
+ */
1730
+ for (i = 0; i < DELETE_ACLS_FILTERS_CNT; i++) {
1731
+ const char *topic = test_mk_topic_name(__FUNCTION__, 1);
1732
+ delete_acls[i] = rd_kafka_AclBindingFilter_new(
1733
+ RD_KAFKA_RESOURCE_TOPIC, topic,
1734
+ RD_KAFKA_RESOURCE_PATTERN_PREFIXED, principal, host,
1735
+ RD_KAFKA_ACL_OPERATION_ALL,
1736
+ RD_KAFKA_ACL_PERMISSION_TYPE_ALLOW, errstr, sizeof(errstr));
1737
+ }
1738
+
1739
+ if (with_options) {
1740
+ options = rd_kafka_AdminOptions_new(rk, RD_KAFKA_ADMIN_OP_ANY);
1741
+
1742
+ exp_timeout = MY_SOCKET_TIMEOUT_MS * 2;
1743
+ err = rd_kafka_AdminOptions_set_request_timeout(
1744
+ options, exp_timeout, errstr, sizeof(errstr));
1745
+ TEST_ASSERT(!err, "%s", rd_kafka_err2str(err));
1746
+
1747
+ my_opaque = (void *)123;
1748
+ rd_kafka_AdminOptions_set_opaque(options, my_opaque);
1749
+ }
1750
+
1751
+ TIMING_START(&timing, "DeleteAcls");
1752
+ TEST_SAY("Call DeleteAcls, timeout is %dms\n", exp_timeout);
1753
+ rd_kafka_DeleteAcls(rk, delete_acls, DELETE_ACLS_FILTERS_CNT, options,
1754
+ q);
1755
+ TIMING_ASSERT_LATER(&timing, 0, 50);
1756
+
1757
+ if (with_background_event_cb) {
1758
+ /* Result event will be triggered by callback from
1759
+ * librdkafka background queue thread. */
1760
+ TIMING_START(&timing, "DeleteAcls.wait_background_event_cb");
1761
+ rkev = wait_background_event_cb();
1762
+ } else {
1763
+ /* Poll result queue */
1764
+ TIMING_START(&timing, "DeleteAcls.queue_poll");
1765
+ rkev = rd_kafka_queue_poll(q, exp_timeout + 1000);
1766
+ }
1767
+
1768
+ TIMING_ASSERT_LATER(&timing, exp_timeout - 100, exp_timeout + 100);
1769
+ TEST_ASSERT(rkev != NULL, "expected result in %dms", exp_timeout);
1770
+ TEST_SAY("DeleteAcls: got %s in %.3fs\n", rd_kafka_event_name(rkev),
1771
+ TIMING_DURATION(&timing) / 1000.0f);
1772
+
1773
+ /* Convert event to proper result */
1774
+ res = rd_kafka_event_DeleteAcls_result(rkev);
1775
+ TEST_ASSERT(res, "expected DeleteAcls_result, not %s",
1776
+ rd_kafka_event_name(rkev));
1777
+
1778
+ opaque = rd_kafka_event_opaque(rkev);
1779
+ TEST_ASSERT(opaque == my_opaque, "expected opaque to be %p, not %p",
1780
+ my_opaque, opaque);
1781
+
1782
+ /* Expecting error */
1783
+ err = rd_kafka_event_error(rkev);
1784
+ errstr2 = rd_kafka_event_error_string(rkev);
1785
+ TEST_ASSERT(err == RD_KAFKA_RESP_ERR__TIMED_OUT,
1786
+ "expected DeleteAcls to return error %s, not %s (%s)",
1787
+ rd_kafka_err2str(RD_KAFKA_RESP_ERR__TIMED_OUT),
1788
+ rd_kafka_err2str(err), err ? errstr2 : "n/a");
1789
+
1790
+ /* Attempt to extract result responses anyway, should return NULL. */
1791
+ res_response =
1792
+ rd_kafka_DeleteAcls_result_responses(res, &res_response_cnt);
1793
+ TEST_ASSERT(!res_response && res_response_cnt == 0,
1794
+ "expected no result response, got %p cnt %" PRIusz,
1795
+ res_response, res_response_cnt);
1796
+
1797
+ rd_kafka_event_destroy(rkev);
1798
+
1799
+ rd_kafka_AclBinding_destroy_array(delete_acls, DELETE_ACLS_FILTERS_CNT);
1800
+
1801
+ if (options)
1802
+ rd_kafka_AdminOptions_destroy(options);
1803
+
1804
+ if (!useq)
1805
+ rd_kafka_queue_destroy(q);
1806
+
1807
+ #undef DELETE_ACLS_FILTERS_CNT
1808
+
1809
+ SUB_TEST_PASS();
1810
+ }
1811
+
1812
+
1813
+ static void do_test_AlterConsumerGroupOffsets(const char *what,
1814
+ rd_kafka_t *rk,
1815
+ rd_kafka_queue_t *useq,
1816
+ int with_options) {
1817
+ rd_kafka_queue_t *q;
1818
+ #define MY_ALTER_CGRPOFFS_CNT 1
1819
+ rd_kafka_AdminOptions_t *options = NULL;
1820
+ const rd_kafka_AlterConsumerGroupOffsets_result_t *res;
1821
+ rd_kafka_AlterConsumerGroupOffsets_t *cgoffsets[MY_ALTER_CGRPOFFS_CNT];
1822
+ rd_kafka_AlterConsumerGroupOffsets_t
1823
+ *cgoffsets_empty[MY_ALTER_CGRPOFFS_CNT];
1824
+ rd_kafka_AlterConsumerGroupOffsets_t
1825
+ *cgoffsets_negative[MY_ALTER_CGRPOFFS_CNT];
1826
+ rd_kafka_AlterConsumerGroupOffsets_t
1827
+ *cgoffsets_duplicate[MY_ALTER_CGRPOFFS_CNT];
1828
+ int exp_timeout = MY_SOCKET_TIMEOUT_MS;
1829
+ int i;
1830
+ char errstr[512];
1831
+ rd_kafka_resp_err_t err;
1832
+ test_timing_t timing;
1833
+ rd_kafka_event_t *rkev;
1834
+ void *my_opaque = NULL, *opaque;
1835
+
1836
+ SUB_TEST_QUICK("%s AlterConsumerGroupOffsets with %s, timeout %dms",
1837
+ rd_kafka_name(rk), what, exp_timeout);
1838
+
1839
+ q = useq ? useq : rd_kafka_queue_new(rk);
1840
+
1841
+ for (i = 0; i < MY_ALTER_CGRPOFFS_CNT; i++) {
1842
+ /* Call with three correct topic partitions. */
1843
+ rd_kafka_topic_partition_list_t *partitions =
1844
+ rd_kafka_topic_partition_list_new(3);
1845
+ rd_kafka_topic_partition_list_add(partitions, "topic1", 9)
1846
+ ->offset = 9;
1847
+ rd_kafka_topic_partition_list_add(partitions, "topic3", 15)
1848
+ ->offset = 15;
1849
+ rd_kafka_topic_partition_list_add(partitions, "topic1", 1)
1850
+ ->offset = 1;
1851
+ cgoffsets[i] = rd_kafka_AlterConsumerGroupOffsets_new(
1852
+ "mygroup", partitions);
1853
+ rd_kafka_topic_partition_list_destroy(partitions);
1854
+
1855
+ /* Call with empty topic-partition list. */
1856
+ rd_kafka_topic_partition_list_t *partitions_empty =
1857
+ rd_kafka_topic_partition_list_new(0);
1858
+ cgoffsets_empty[i] = rd_kafka_AlterConsumerGroupOffsets_new(
1859
+ "mygroup", partitions_empty);
1860
+ rd_kafka_topic_partition_list_destroy(partitions_empty);
1861
+
1862
+ /* Call with a topic-partition having negative offset. */
1863
+ rd_kafka_topic_partition_list_t *partitions_negative =
1864
+ rd_kafka_topic_partition_list_new(4);
1865
+ rd_kafka_topic_partition_list_add(partitions_negative, "topic1",
1866
+ 9)
1867
+ ->offset = 9;
1868
+ rd_kafka_topic_partition_list_add(partitions_negative, "topic3",
1869
+ 15)
1870
+ ->offset = 15;
1871
+ rd_kafka_topic_partition_list_add(partitions_negative, "topic1",
1872
+ 1)
1873
+ ->offset = 1;
1874
+ rd_kafka_topic_partition_list_add(partitions_negative, "topic1",
1875
+ 2)
1876
+ ->offset = -3;
1877
+ cgoffsets_negative[i] = rd_kafka_AlterConsumerGroupOffsets_new(
1878
+ "mygroup", partitions_negative);
1879
+ rd_kafka_topic_partition_list_destroy(partitions_negative);
1880
+
1881
+ /* Call with duplicate partitions. */
1882
+ rd_kafka_topic_partition_list_t *partitions_duplicate =
1883
+ rd_kafka_topic_partition_list_new(3);
1884
+ rd_kafka_topic_partition_list_add(partitions_duplicate,
1885
+ "topic1", 9)
1886
+ ->offset = 9;
1887
+ rd_kafka_topic_partition_list_add(partitions_duplicate,
1888
+ "topic3", 15)
1889
+ ->offset = 15;
1890
+ rd_kafka_topic_partition_list_add(partitions_duplicate,
1891
+ "topic1", 9)
1892
+ ->offset = 1;
1893
+
1894
+ cgoffsets_duplicate[i] = rd_kafka_AlterConsumerGroupOffsets_new(
1895
+ "mygroup", partitions_duplicate);
1896
+ rd_kafka_topic_partition_list_destroy(partitions_duplicate);
1897
+ }
1898
+
1899
+ if (with_options) {
1900
+ options = rd_kafka_AdminOptions_new(
1901
+ rk, RD_KAFKA_ADMIN_OP_ALTERCONSUMERGROUPOFFSETS);
1902
+
1903
+ exp_timeout = MY_SOCKET_TIMEOUT_MS * 2;
1904
+
1905
+ err = rd_kafka_AdminOptions_set_request_timeout(
1906
+ options, exp_timeout, errstr, sizeof(errstr));
1907
+ TEST_ASSERT(!err, "%s", rd_kafka_err2str(err));
1908
+
1909
+ if (useq) {
1910
+ my_opaque = (void *)99981;
1911
+ rd_kafka_AdminOptions_set_opaque(options, my_opaque);
1912
+ }
1913
+ }
1914
+
1915
+ /* Empty topic-partition list */
1916
+ TIMING_START(&timing, "AlterConsumerGroupOffsets");
1917
+ TEST_SAY("Call AlterConsumerGroupOffsets, timeout is %dms\n",
1918
+ exp_timeout);
1919
+ rd_kafka_AlterConsumerGroupOffsets(rk, cgoffsets_empty,
1920
+ MY_ALTER_CGRPOFFS_CNT, options, q);
1921
+ TIMING_ASSERT_LATER(&timing, 0, 10);
1922
+ rd_kafka_AlterConsumerGroupOffsets_destroy_array(cgoffsets_empty,
1923
+ MY_ALTER_CGRPOFFS_CNT);
1924
+
1925
+ /* Poll result queue */
1926
+ TIMING_START(&timing, "AlterConsumerGroupOffsets.queue_poll");
1927
+ rkev = rd_kafka_queue_poll(q, exp_timeout + 1000);
1928
+ TIMING_ASSERT(&timing, 0, 10);
1929
+ TEST_ASSERT(rkev != NULL, "expected result in %dms", exp_timeout);
1930
+ TEST_SAY("AlterConsumerGroupOffsets: got %s in %.3fs\n",
1931
+ rd_kafka_event_name(rkev), TIMING_DURATION(&timing) / 1000.0f);
1932
+ /* Convert event to proper result */
1933
+ res = rd_kafka_event_AlterConsumerGroupOffsets_result(rkev);
1934
+ TEST_ASSERT(res, "expected AlterConsumerGroupOffsets_result, not %s",
1935
+ rd_kafka_event_name(rkev));
1936
+ /* Expecting error */
1937
+ err = rd_kafka_event_error(rkev);
1938
+ const char *event_errstr_empty = rd_kafka_event_error_string(rkev);
1939
+ TEST_ASSERT(err, "expected AlterConsumerGroupOffsets to fail");
1940
+ TEST_ASSERT(err == RD_KAFKA_RESP_ERR__INVALID_ARG,
1941
+ "expected RD_KAFKA_RESP_ERR__INVALID_ARG, not %s",
1942
+ rd_kafka_err2name(err));
1943
+ TEST_ASSERT(strcmp(event_errstr_empty,
1944
+ "Non-empty topic partition list must be present") ==
1945
+ 0,
1946
+ "expected \"Non-empty topic partition list must be "
1947
+ "present\", not \"%s\"",
1948
+ event_errstr_empty);
1949
+ rd_kafka_event_destroy(rkev);
1950
+
1951
+ /* Negative topic-partition offset */
1952
+ TIMING_START(&timing, "AlterConsumerGroupOffsets");
1953
+ TEST_SAY("Call AlterConsumerGroupOffsets, timeout is %dms\n",
1954
+ exp_timeout);
1955
+ rd_kafka_AlterConsumerGroupOffsets(rk, cgoffsets_negative,
1956
+ MY_ALTER_CGRPOFFS_CNT, options, q);
1957
+ TIMING_ASSERT_LATER(&timing, 0, 10);
1958
+ rd_kafka_AlterConsumerGroupOffsets_destroy_array(cgoffsets_negative,
1959
+ MY_ALTER_CGRPOFFS_CNT);
1960
+ /* Poll result queue */
1961
+ TIMING_START(&timing, "AlterConsumerGroupOffsets.queue_poll");
1962
+ rkev = rd_kafka_queue_poll(q, exp_timeout + 1000);
1963
+ TIMING_ASSERT(&timing, 0, 10);
1964
+ TEST_ASSERT(rkev != NULL, "expected result in %dms", exp_timeout);
1965
+ TEST_SAY("AlterConsumerGroupOffsets: got %s in %.3fs\n",
1966
+ rd_kafka_event_name(rkev), TIMING_DURATION(&timing) / 1000.0f);
1967
+ /* Convert event to proper result */
1968
+ res = rd_kafka_event_AlterConsumerGroupOffsets_result(rkev);
1969
+ TEST_ASSERT(res, "expected AlterConsumerGroupOffsets_result, not %s",
1970
+ rd_kafka_event_name(rkev));
1971
+ /* Expecting error */
1972
+ err = rd_kafka_event_error(rkev);
1973
+ const char *event_errstr_negative = rd_kafka_event_error_string(rkev);
1974
+ TEST_ASSERT(err, "expected AlterConsumerGroupOffsets to fail");
1975
+ TEST_ASSERT(err == RD_KAFKA_RESP_ERR__INVALID_ARG,
1976
+ "expected RD_KAFKA_RESP_ERR__INVALID_ARG, not %s",
1977
+ rd_kafka_err2name(err));
1978
+ TEST_ASSERT(
1979
+ strcmp(event_errstr_negative,
1980
+ "All topic-partition offsets must be >= 0") == 0,
1981
+ "expected \"All topic-partition offsets must be >= 0\", not \"%s\"",
1982
+ event_errstr_negative);
1983
+ rd_kafka_event_destroy(rkev);
1984
+
1985
+ /* Duplicate topic-partition offset */
1986
+ TIMING_START(&timing, "AlterConsumerGroupOffsets");
1987
+ TEST_SAY("Call AlterConsumerGroupOffsets, timeout is %dms\n",
1988
+ exp_timeout);
1989
+ rd_kafka_AlterConsumerGroupOffsets(rk, cgoffsets_duplicate,
1990
+ MY_ALTER_CGRPOFFS_CNT, options, q);
1991
+ TIMING_ASSERT_LATER(&timing, 0, 10);
1992
+ rd_kafka_AlterConsumerGroupOffsets_destroy_array(cgoffsets_duplicate,
1993
+ MY_ALTER_CGRPOFFS_CNT);
1994
+ /* Poll result queue */
1995
+ TIMING_START(&timing, "AlterConsumerGroupOffsets.queue_poll");
1996
+ rkev = rd_kafka_queue_poll(q, exp_timeout + 1000);
1997
+ TIMING_ASSERT(&timing, 0, 10);
1998
+ TEST_ASSERT(rkev != NULL, "expected result in %dms", exp_timeout);
1999
+ TEST_SAY("AlterConsumerGroupOffsets: got %s in %.3fs\n",
2000
+ rd_kafka_event_name(rkev), TIMING_DURATION(&timing) / 1000.0f);
2001
+ /* Convert event to proper result */
2002
+ res = rd_kafka_event_AlterConsumerGroupOffsets_result(rkev);
2003
+ TEST_ASSERT(res, "expected AlterConsumerGroupOffsets_result, not %s",
2004
+ rd_kafka_event_name(rkev));
2005
+ /* Expecting error */
2006
+ err = rd_kafka_event_error(rkev);
2007
+ const char *event_errstr_duplicate = rd_kafka_event_error_string(rkev);
2008
+ TEST_ASSERT(err, "expected AlterConsumerGroupOffsets to fail");
2009
+ TEST_ASSERT(err == RD_KAFKA_RESP_ERR__INVALID_ARG,
2010
+ "expected RD_KAFKA_RESP_ERR__INVALID_ARG, not %s",
2011
+ rd_kafka_err2name(err));
2012
+ TEST_ASSERT(strcmp(event_errstr_duplicate,
2013
+ "Duplicate partitions not allowed") == 0,
2014
+ "expected \"Duplicate partitions not allowed\", not \"%s\"",
2015
+ event_errstr_duplicate);
2016
+ rd_kafka_event_destroy(rkev);
2017
+
2018
+ /* Correct topic-partition list, local timeout */
2019
+ TIMING_START(&timing, "AlterConsumerGroupOffsets");
2020
+ TEST_SAY("Call AlterConsumerGroupOffsets, timeout is %dms\n",
2021
+ exp_timeout);
2022
+ rd_kafka_AlterConsumerGroupOffsets(rk, cgoffsets, MY_ALTER_CGRPOFFS_CNT,
2023
+ options, q);
2024
+ TIMING_ASSERT_LATER(&timing, 0, 10);
2025
+ /* Poll result queue */
2026
+ TIMING_START(&timing, "AlterConsumerGroupOffsets.queue_poll");
2027
+ rkev = rd_kafka_queue_poll(q, exp_timeout + 1000);
2028
+ TIMING_ASSERT(&timing, exp_timeout - 100, exp_timeout + 100);
2029
+ TEST_ASSERT(rkev != NULL, "expected result in %dms", exp_timeout);
2030
+ TEST_SAY("AlterConsumerGroupOffsets: got %s in %.3fs\n",
2031
+ rd_kafka_event_name(rkev), TIMING_DURATION(&timing) / 1000.0f);
2032
+ /* Convert event to proper result */
2033
+ res = rd_kafka_event_AlterConsumerGroupOffsets_result(rkev);
2034
+ TEST_ASSERT(res, "expected AlterConsumerGroupOffsets_result, not %s",
2035
+ rd_kafka_event_name(rkev));
2036
+ opaque = rd_kafka_event_opaque(rkev);
2037
+ TEST_ASSERT(opaque == my_opaque, "expected opaque to be %p, not %p",
2038
+ my_opaque, opaque);
2039
+ /* Expecting error */
2040
+ err = rd_kafka_event_error(rkev);
2041
+ const char *event_errstr = rd_kafka_event_error_string(rkev);
2042
+ TEST_ASSERT(err, "expected AlterConsumerGroupOffsets to fail");
2043
+ TEST_ASSERT(err == RD_KAFKA_RESP_ERR__TIMED_OUT,
2044
+ "expected RD_KAFKA_RESP_ERR__TIMED_OUT, not %s",
2045
+ rd_kafka_err2name(err));
2046
+ TEST_ASSERT(strcmp(event_errstr,
2047
+ "Failed while waiting for response from broker: "
2048
+ "Local: Timed out") == 0,
2049
+ "expected \"Failed while waiting for response from broker: "
2050
+ "Local: Timed out\", not \"%s\"",
2051
+ event_errstr);
2052
+ rd_kafka_event_destroy(rkev);
2053
+
2054
+ if (options)
2055
+ rd_kafka_AdminOptions_destroy(options);
2056
+
2057
+ if (!useq)
2058
+ rd_kafka_queue_destroy(q);
2059
+
2060
+ rd_kafka_AlterConsumerGroupOffsets_destroy_array(cgoffsets,
2061
+ MY_ALTER_CGRPOFFS_CNT);
2062
+
2063
+ #undef MY_ALTER_CGRPOFFS_CNT
2064
+
2065
+ SUB_TEST_PASS();
2066
+ }
2067
+
2068
+
2069
+ static void do_test_ListConsumerGroupOffsets(const char *what,
2070
+ rd_kafka_t *rk,
2071
+ rd_kafka_queue_t *useq,
2072
+ int with_options,
2073
+ rd_bool_t null_toppars) {
2074
+ rd_kafka_queue_t *q;
2075
+ #define MY_LIST_CGRPOFFS_CNT 1
2076
+ rd_kafka_AdminOptions_t *options = NULL;
2077
+ const rd_kafka_ListConsumerGroupOffsets_result_t *res;
2078
+ rd_kafka_ListConsumerGroupOffsets_t *cgoffsets[MY_LIST_CGRPOFFS_CNT];
2079
+ rd_kafka_ListConsumerGroupOffsets_t
2080
+ *cgoffsets_empty[MY_LIST_CGRPOFFS_CNT];
2081
+ rd_kafka_ListConsumerGroupOffsets_t
2082
+ *cgoffsets_duplicate[MY_LIST_CGRPOFFS_CNT];
2083
+ int exp_timeout = MY_SOCKET_TIMEOUT_MS;
2084
+ int i;
2085
+ char errstr[512];
2086
+ rd_kafka_resp_err_t err;
2087
+ test_timing_t timing;
2088
+ rd_kafka_event_t *rkev;
2089
+ void *my_opaque = NULL, *opaque;
2090
+ const char *errstr_ptr;
2091
+
2092
+ SUB_TEST_QUICK("%s ListConsumerGroupOffsets with %s, timeout %dms",
2093
+ rd_kafka_name(rk), what, exp_timeout);
2094
+
2095
+ q = useq ? useq : rd_kafka_queue_new(rk);
2096
+
2097
+ for (i = 0; i < MY_LIST_CGRPOFFS_CNT; i++) {
2098
+ rd_kafka_topic_partition_list_t *partitions =
2099
+ rd_kafka_topic_partition_list_new(3);
2100
+ rd_kafka_topic_partition_list_add(partitions, "topic1", 9);
2101
+ rd_kafka_topic_partition_list_add(partitions, "topic3", 15);
2102
+ rd_kafka_topic_partition_list_add(partitions, "topic1", 1);
2103
+ if (null_toppars) {
2104
+ cgoffsets[i] = rd_kafka_ListConsumerGroupOffsets_new(
2105
+ "mygroup", NULL);
2106
+ } else {
2107
+ cgoffsets[i] = rd_kafka_ListConsumerGroupOffsets_new(
2108
+ "mygroup", partitions);
2109
+ }
2110
+ rd_kafka_topic_partition_list_destroy(partitions);
2111
+
2112
+ rd_kafka_topic_partition_list_t *partitions_empty =
2113
+ rd_kafka_topic_partition_list_new(0);
2114
+ cgoffsets_empty[i] = rd_kafka_ListConsumerGroupOffsets_new(
2115
+ "mygroup", partitions_empty);
2116
+ rd_kafka_topic_partition_list_destroy(partitions_empty);
2117
+
2118
+ partitions = rd_kafka_topic_partition_list_new(3);
2119
+ rd_kafka_topic_partition_list_add(partitions, "topic1", 9);
2120
+ rd_kafka_topic_partition_list_add(partitions, "topic3", 15);
2121
+ rd_kafka_topic_partition_list_add(partitions, "topic1", 9);
2122
+ cgoffsets_duplicate[i] = rd_kafka_ListConsumerGroupOffsets_new(
2123
+ "mygroup", partitions);
2124
+ rd_kafka_topic_partition_list_destroy(partitions);
2125
+ }
2126
+
2127
+ if (with_options) {
2128
+ options = rd_kafka_AdminOptions_new(
2129
+ rk, RD_KAFKA_ADMIN_OP_LISTCONSUMERGROUPOFFSETS);
2130
+
2131
+ exp_timeout = MY_SOCKET_TIMEOUT_MS * 2;
2132
+
2133
+ err = rd_kafka_AdminOptions_set_request_timeout(
2134
+ options, exp_timeout, errstr, sizeof(errstr));
2135
+ TEST_ASSERT(!err, "%s", rd_kafka_err2str(err));
2136
+
2137
+ if (useq) {
2138
+ my_opaque = (void *)99981;
2139
+ rd_kafka_AdminOptions_set_opaque(options, my_opaque);
2140
+ }
2141
+ }
2142
+
2143
+ TEST_SAY(
2144
+ "Call ListConsumerGroupOffsets with empty topic-partition list.\n");
2145
+ rd_kafka_ListConsumerGroupOffsets(rk, cgoffsets_empty,
2146
+ MY_LIST_CGRPOFFS_CNT, options, q);
2147
+ rd_kafka_ListConsumerGroupOffsets_destroy_array(cgoffsets_empty,
2148
+ MY_LIST_CGRPOFFS_CNT);
2149
+ /* Poll result queue */
2150
+ rkev = rd_kafka_queue_poll(q, exp_timeout + 1000);
2151
+ TEST_SAY("ListConsumerGroupOffsets: got %s\n",
2152
+ rd_kafka_event_name(rkev));
2153
+
2154
+ /* Expecting error */
2155
+ err = rd_kafka_event_error(rkev);
2156
+ TEST_ASSERT(err, "expected ListConsumerGroupOffsets to fail");
2157
+
2158
+ errstr_ptr = rd_kafka_event_error_string(rkev);
2159
+ TEST_ASSERT(
2160
+ !strcmp(errstr_ptr,
2161
+ "NULL or non-empty topic partition list must be passed"),
2162
+ "expected error string \"NULL or non-empty topic partition list "
2163
+ "must be passed\", not %s",
2164
+ errstr_ptr);
2165
+
2166
+ rd_kafka_event_destroy(rkev);
2167
+
2168
+
2169
+ TEST_SAY(
2170
+ "Call ListConsumerGroupOffsets with topic-partition list"
2171
+ "containing duplicates.\n");
2172
+ rd_kafka_ListConsumerGroupOffsets(rk, cgoffsets_duplicate, 1, options,
2173
+ q);
2174
+ rd_kafka_ListConsumerGroupOffsets_destroy_array(cgoffsets_duplicate,
2175
+ MY_LIST_CGRPOFFS_CNT);
2176
+ /* Poll result queue */
2177
+ rkev = rd_kafka_queue_poll(q, exp_timeout + 1000);
2178
+ TEST_SAY("ListConsumerGroupOffsets: got %s\n",
2179
+ rd_kafka_event_name(rkev));
2180
+
2181
+ /* Expecting error */
2182
+ err = rd_kafka_event_error(rkev);
2183
+ TEST_ASSERT(err, "expected ListConsumerGroupOffsets to fail");
2184
+
2185
+ errstr_ptr = rd_kafka_event_error_string(rkev);
2186
+ TEST_ASSERT(!strcmp(errstr_ptr, "Duplicate partitions not allowed"),
2187
+ "expected error string \"Duplicate partitions not allowed\""
2188
+ ", not %s",
2189
+ errstr_ptr);
2190
+
2191
+ rd_kafka_event_destroy(rkev);
2192
+
2193
+
2194
+ TIMING_START(&timing, "ListConsumerGroupOffsets");
2195
+ TEST_SAY("Call ListConsumerGroupOffsets, timeout is %dms\n",
2196
+ exp_timeout);
2197
+ rd_kafka_ListConsumerGroupOffsets(rk, cgoffsets, MY_LIST_CGRPOFFS_CNT,
2198
+ options, q);
2199
+ rd_kafka_ListConsumerGroupOffsets_destroy_array(cgoffsets,
2200
+ MY_LIST_CGRPOFFS_CNT);
2201
+ TIMING_ASSERT_LATER(&timing, 0, 10);
2202
+
2203
+ /* Poll result queue */
2204
+ TIMING_START(&timing, "ListConsumerGroupOffsets.queue_poll");
2205
+ rkev = rd_kafka_queue_poll(q, exp_timeout + 1000);
2206
+ TIMING_ASSERT(&timing, exp_timeout - 100, exp_timeout + 100);
2207
+ TEST_ASSERT(rkev != NULL, "expected result in %dms", exp_timeout);
2208
+ TEST_SAY("ListConsumerGroupOffsets: got %s in %.3fs\n",
2209
+ rd_kafka_event_name(rkev), TIMING_DURATION(&timing) / 1000.0f);
2210
+
2211
+ /* Convert event to proper result */
2212
+ res = rd_kafka_event_ListConsumerGroupOffsets_result(rkev);
2213
+ TEST_ASSERT(res, "expected ListConsumerGroupOffsets_result, not %s",
2214
+ rd_kafka_event_name(rkev));
2215
+
2216
+ opaque = rd_kafka_event_opaque(rkev);
2217
+ TEST_ASSERT(opaque == my_opaque, "expected opaque to be %p, not %p",
2218
+ my_opaque, opaque);
2219
+
2220
+ /* Expecting error */
2221
+ err = rd_kafka_event_error(rkev);
2222
+ TEST_ASSERT(err, "expected ListConsumerGroupOffsets to fail");
2223
+
2224
+ errstr_ptr = rd_kafka_event_error_string(rkev);
2225
+ TEST_ASSERT(!strcmp(errstr_ptr,
2226
+ "Failed while waiting for response from broker: "
2227
+ "Local: Timed out"),
2228
+ "expected error string \"Failed while waiting for response "
2229
+ "from broker: Local: Timed out\", not %s",
2230
+ errstr_ptr);
2231
+
2232
+ rd_kafka_event_destroy(rkev);
2233
+
2234
+ if (options)
2235
+ rd_kafka_AdminOptions_destroy(options);
2236
+
2237
+ if (!useq)
2238
+ rd_kafka_queue_destroy(q);
2239
+
2240
+ #undef MY_LIST_CGRPOFFS_CNT
2241
+
2242
+ SUB_TEST_PASS();
2243
+ }
2244
+
2245
+ static void do_test_DescribeUserScramCredentials(const char *what,
2246
+ rd_kafka_t *rk,
2247
+ rd_kafka_queue_t *useq) {
2248
+ char errstr[512];
2249
+ rd_kafka_AdminOptions_t *options;
2250
+ rd_kafka_event_t *rkev;
2251
+ rd_kafka_queue_t *rkqu;
2252
+
2253
+ SUB_TEST_QUICK("%s", what);
2254
+
2255
+ rkqu = useq ? useq : rd_kafka_queue_new(rk);
2256
+
2257
+ const char *users[2];
2258
+ users[0] = "Sam";
2259
+ users[1] = "Sam";
2260
+
2261
+ /* Whenever a duplicate user is passed,
2262
+ * the request should fail with error code
2263
+ * RD_KAFKA_RESP_ERR__INVALID_ARG */
2264
+ options = rd_kafka_AdminOptions_new(
2265
+ rk, RD_KAFKA_ADMIN_OP_DESCRIBEUSERSCRAMCREDENTIALS);
2266
+ TEST_CALL_ERR__(rd_kafka_AdminOptions_set_request_timeout(
2267
+ options, 30 * 1000 /* 30s */, errstr, sizeof(errstr)));
2268
+
2269
+ rd_kafka_DescribeUserScramCredentials(rk, users, RD_ARRAY_SIZE(users),
2270
+ options, rkqu);
2271
+ rd_kafka_AdminOptions_destroy(options);
2272
+
2273
+ rkev = test_wait_admin_result(
2274
+ rkqu, RD_KAFKA_EVENT_DESCRIBEUSERSCRAMCREDENTIALS_RESULT, 2000);
2275
+
2276
+ TEST_ASSERT(
2277
+ rd_kafka_event_error(rkev) == RD_KAFKA_RESP_ERR__INVALID_ARG,
2278
+ "Expected \"Local: Invalid argument or configuration\", not %s",
2279
+ rd_kafka_err2str(rd_kafka_event_error(rkev)));
2280
+
2281
+ rd_kafka_event_destroy(rkev);
2282
+
2283
+ if (!useq)
2284
+ rd_kafka_queue_destroy(rkqu);
2285
+
2286
+ SUB_TEST_PASS();
2287
+ }
2288
+
2289
+ static void do_test_AlterUserScramCredentials(const char *what,
2290
+ rd_kafka_t *rk,
2291
+ rd_kafka_queue_t *useq) {
2292
+ char errstr[512];
2293
+ rd_kafka_AdminOptions_t *options;
2294
+ rd_kafka_event_t *rkev;
2295
+ rd_kafka_queue_t *rkqu;
2296
+
2297
+ SUB_TEST_QUICK("%s", what);
2298
+
2299
+ rkqu = useq ? useq : rd_kafka_queue_new(rk);
2300
+
2301
+ #if !WITH_SSL
2302
+ /* Whenever librdkafka wasn't built with OpenSSL,
2303
+ * the request should fail with error code
2304
+ * RD_KAFKA_RESP_ERR__INVALID_ARG */
2305
+ rd_kafka_UserScramCredentialAlteration_t *alterations_ssl[1];
2306
+ alterations_ssl[0] = rd_kafka_UserScramCredentialUpsertion_new(
2307
+ "user", RD_KAFKA_SCRAM_MECHANISM_SHA_256, 10000,
2308
+ (unsigned char *)"password", 8, (unsigned char *)"salt", 4);
2309
+ options = rd_kafka_AdminOptions_new(
2310
+ rk, RD_KAFKA_ADMIN_OP_ALTERUSERSCRAMCREDENTIALS);
2311
+ TEST_CALL_ERR__(rd_kafka_AdminOptions_set_request_timeout(
2312
+ options, 30 * 1000 /* 30s */, errstr, sizeof(errstr)));
2313
+
2314
+ rd_kafka_AlterUserScramCredentials(rk, alterations_ssl, 1, options,
2315
+ rkqu);
2316
+ rd_kafka_UserScramCredentialAlteration_destroy_array(
2317
+ alterations_ssl, RD_ARRAY_SIZE(alterations_ssl));
2318
+ rd_kafka_AdminOptions_destroy(options);
2319
+
2320
+ rkev = test_wait_admin_result(
2321
+ rkqu, RD_KAFKA_EVENT_ALTERUSERSCRAMCREDENTIALS_RESULT, 2000);
2322
+
2323
+ TEST_ASSERT(
2324
+ rd_kafka_event_error(rkev) == RD_KAFKA_RESP_ERR__INVALID_ARG,
2325
+ "Expected \"Local: Invalid argument or configuration\", not %s",
2326
+ rd_kafka_err2str(rd_kafka_event_error(rkev)));
2327
+
2328
+ rd_kafka_event_destroy(rkev);
2329
+ #endif
2330
+
2331
+ rd_kafka_UserScramCredentialAlteration_t *alterations[1];
2332
+ alterations[0] = rd_kafka_UserScramCredentialDeletion_new(
2333
+ "", RD_KAFKA_SCRAM_MECHANISM_SHA_256);
2334
+ options = rd_kafka_AdminOptions_new(
2335
+ rk, RD_KAFKA_ADMIN_OP_ALTERUSERSCRAMCREDENTIALS);
2336
+ TEST_CALL_ERR__(rd_kafka_AdminOptions_set_request_timeout(
2337
+ options, 30 * 1000 /* 30s */, errstr, sizeof(errstr)));
2338
+
2339
+ /* Whenever an empty array is passed,
2340
+ * the request should fail with error code
2341
+ * RD_KAFKA_RESP_ERR__INVALID_ARG */
2342
+ rd_kafka_AlterUserScramCredentials(rk, alterations, 0, options, rkqu);
2343
+
2344
+ rkev = test_wait_admin_result(
2345
+ rkqu, RD_KAFKA_EVENT_ALTERUSERSCRAMCREDENTIALS_RESULT, 2000);
2346
+
2347
+ TEST_ASSERT(
2348
+ rd_kafka_event_error(rkev) == RD_KAFKA_RESP_ERR__INVALID_ARG,
2349
+ "Expected \"Local: Invalid argument or configuration\", not %s",
2350
+ rd_kafka_err2str(rd_kafka_event_error(rkev)));
2351
+
2352
+ rd_kafka_event_destroy(rkev);
2353
+
2354
+ /* Whenever an empty user is passed,
2355
+ * the request should fail with error code
2356
+ * RD_KAFKA_RESP_ERR__INVALID_ARG */
2357
+ rd_kafka_AlterUserScramCredentials(
2358
+ rk, alterations, RD_ARRAY_SIZE(alterations), options, rkqu);
2359
+ rkev = test_wait_admin_result(
2360
+ rkqu, RD_KAFKA_EVENT_ALTERUSERSCRAMCREDENTIALS_RESULT, 2000);
2361
+
2362
+ TEST_ASSERT(
2363
+ rd_kafka_event_error(rkev) == RD_KAFKA_RESP_ERR__INVALID_ARG,
2364
+ "Expected \"Local: Invalid argument or configuration\", not %s",
2365
+ rd_kafka_err2str(rd_kafka_event_error(rkev)));
2366
+
2367
+ rd_kafka_event_destroy(rkev);
2368
+
2369
+
2370
+ rd_kafka_UserScramCredentialAlteration_destroy_array(
2371
+ alterations, RD_ARRAY_SIZE(alterations));
2372
+ rd_kafka_AdminOptions_destroy(options);
2373
+
2374
+ if (!useq)
2375
+ rd_kafka_queue_destroy(rkqu);
2376
+
2377
+ SUB_TEST_PASS();
2378
+ }
2379
+
2380
+ static void do_test_ElectLeaders(const char *what,
2381
+ rd_kafka_t *rk,
2382
+ rd_kafka_queue_t *useq,
2383
+ int with_options,
2384
+ rd_kafka_ElectionType_t election_type) {
2385
+ rd_kafka_queue_t *q;
2386
+ rd_kafka_AdminOptions_t *options = NULL;
2387
+ rd_kafka_event_t *rkev;
2388
+ rd_kafka_resp_err_t err;
2389
+ const rd_kafka_ElectLeaders_result_t *res;
2390
+ rd_kafka_ElectLeaders_t *duplicate_elect_leaders;
2391
+ rd_kafka_ElectLeaders_t *elect_leaders;
2392
+ int exp_timeout = MY_SOCKET_TIMEOUT_MS;
2393
+ test_timing_t timing;
2394
+ rd_kafka_topic_partition_list_t *partitions;
2395
+ char errstr[512];
2396
+ void *my_opaque = NULL, *opaque;
2397
+
2398
+ SUB_TEST_QUICK("%s ElectLeaders with %s, timeout %dms",
2399
+ rd_kafka_name(rk), what, exp_timeout);
2400
+
2401
+ q = useq ? useq : rd_kafka_queue_new(rk);
2402
+
2403
+ partitions = rd_kafka_topic_partition_list_new(3);
2404
+ rd_kafka_topic_partition_list_add(partitions, "topic1", 9);
2405
+ rd_kafka_topic_partition_list_add(partitions, "topic3", 15);
2406
+ rd_kafka_topic_partition_list_add(partitions, "topic1", 1);
2407
+ elect_leaders = rd_kafka_ElectLeaders_new(election_type, partitions);
2408
+ rd_kafka_topic_partition_list_destroy(partitions);
2409
+
2410
+ partitions = rd_kafka_topic_partition_list_new(3);
2411
+ rd_kafka_topic_partition_list_add(partitions, "topic1", 9);
2412
+ rd_kafka_topic_partition_list_add(partitions, "topic3", 15);
2413
+ rd_kafka_topic_partition_list_add(partitions, "topic1", 9);
2414
+ duplicate_elect_leaders =
2415
+ rd_kafka_ElectLeaders_new(election_type, partitions);
2416
+ rd_kafka_topic_partition_list_destroy(partitions);
2417
+
2418
+ if (with_options) {
2419
+ options = rd_kafka_AdminOptions_new(
2420
+ rk, RD_KAFKA_ADMIN_OP_ELECTLEADERS);
2421
+
2422
+ exp_timeout = MY_SOCKET_TIMEOUT_MS * 2;
2423
+
2424
+ err = rd_kafka_AdminOptions_set_request_timeout(
2425
+ options, exp_timeout, errstr, sizeof(errstr));
2426
+ TEST_ASSERT(!err, "%s", rd_kafka_err2str(err));
2427
+
2428
+ if (useq) {
2429
+ my_opaque = (void *)99981;
2430
+ rd_kafka_AdminOptions_set_opaque(options, my_opaque);
2431
+ }
2432
+ }
2433
+
2434
+ /*Duplicate topic-partition list*/
2435
+ TIMING_START(&timing, "ElectLeaders");
2436
+ TEST_SAY("Call ElectLeaders, timeout is %dms\n", exp_timeout);
2437
+ rd_kafka_ElectLeaders(rk, duplicate_elect_leaders, options, q);
2438
+ TIMING_ASSERT_LATER(&timing, 0, 10);
2439
+ rd_kafka_ElectLeaders_destroy(duplicate_elect_leaders);
2440
+
2441
+ /* Poll result queue */
2442
+ TIMING_START(&timing, "ElectLeaders.queue_poll");
2443
+ rkev = rd_kafka_queue_poll(q, exp_timeout + 1000);
2444
+ TIMING_ASSERT(&timing, 0, exp_timeout + 100);
2445
+ TEST_ASSERT(rkev != NULL, "expected result in %dms", exp_timeout);
2446
+ TEST_SAY("ElectLeaders: got %s in %.3fs\n", rd_kafka_event_name(rkev),
2447
+ TIMING_DURATION(&timing) / 1000.0f);
2448
+
2449
+ /* Convert event to proper result */
2450
+ res = rd_kafka_event_ElectLeaders_result(rkev);
2451
+ TEST_ASSERT(res, "expected ElectLeaders_result, not %s",
2452
+ rd_kafka_event_name(rkev));
2453
+ /*Expecting error*/
2454
+ err = rd_kafka_event_error(rkev);
2455
+ const char *event_errstr_duplicate = rd_kafka_event_error_string(rkev);
2456
+ TEST_ASSERT(err, "expected ElectLeaders to fail");
2457
+ TEST_ASSERT(err == RD_KAFKA_RESP_ERR__INVALID_ARG,
2458
+ "expected RD_KAFKA_RESP_ERR__INVALID_ARG, not %s",
2459
+ rd_kafka_err2name(err));
2460
+ TEST_ASSERT(strcmp(event_errstr_duplicate,
2461
+ "Duplicate partitions specified") == 0,
2462
+ "expected \"Duplicate partitions specified\", not \"%s\"",
2463
+ event_errstr_duplicate);
2464
+ rd_kafka_event_destroy(rkev);
2465
+
2466
+ /*Correct topic-partition list*/
2467
+ TIMING_START(&timing, "ElectLeaders");
2468
+ TEST_SAY("Call ElectLeaders, timeout is %dms\n", exp_timeout);
2469
+ rd_kafka_ElectLeaders(rk, elect_leaders, options, q);
2470
+ TIMING_ASSERT_LATER(&timing, 0, 10);
2471
+ rd_kafka_ElectLeaders_destroy(elect_leaders);
2472
+
2473
+ /* Poll result queue */
2474
+ TIMING_START(&timing, "ElectLeaders.queue_poll");
2475
+ rkev = rd_kafka_queue_poll(q, exp_timeout + 1000);
2476
+ TIMING_ASSERT(&timing, exp_timeout - 100, exp_timeout + 100);
2477
+ TEST_ASSERT(rkev != NULL, "expected result in %dms", exp_timeout);
2478
+ TEST_SAY("ElectLeaders: got %s in %.3fs\n", rd_kafka_event_name(rkev),
2479
+ TIMING_DURATION(&timing) / 1000.0f);
2480
+
2481
+ /* Convert event to proper result */
2482
+ res = rd_kafka_event_ElectLeaders_result(rkev);
2483
+ TEST_ASSERT(res, "expected ElectLeaders_result, not %s",
2484
+ rd_kafka_event_name(rkev));
2485
+ opaque = rd_kafka_event_opaque(rkev);
2486
+ TEST_ASSERT(opaque == my_opaque, "expected opaque to be %p, not %p",
2487
+ my_opaque, opaque);
2488
+ /*Expecting error*/
2489
+ err = rd_kafka_event_error(rkev);
2490
+ const char *event_err = rd_kafka_event_error_string(rkev);
2491
+ TEST_ASSERT(err, "expected ElectLeaders to fail");
2492
+ TEST_ASSERT(err == RD_KAFKA_RESP_ERR__TIMED_OUT,
2493
+ "expected RD_KAFKA_RESP_ERR__TIMED_OUT, not %s",
2494
+ rd_kafka_err2name(err));
2495
+ TEST_ASSERT(strcmp(event_err,
2496
+ "Failed while waiting for controller: "
2497
+ "Local: Timed out") == 0,
2498
+ "expected \"Failed while waiting for controller: "
2499
+ "Local: Timed out\", not \"%s\"",
2500
+ event_err);
2501
+ rd_kafka_event_destroy(rkev);
2502
+
2503
+ if (options)
2504
+ rd_kafka_AdminOptions_destroy(options);
2505
+ if (!useq)
2506
+ rd_kafka_queue_destroy(q);
2507
+
2508
+ SUB_TEST_PASS();
2509
+ }
2510
+
2511
+ /**
2512
+ * @brief Test a mix of APIs using the same replyq.
2513
+ *
2514
+ * - Create topics A,B
2515
+ * - Delete topic B
2516
+ * - Create topic C
2517
+ * - Delete groups A,B,C
2518
+ * - Delete records from A,B,C
2519
+ * - Create extra partitions for topic D
2520
+ */
2521
+ static void do_test_mix(rd_kafka_t *rk, rd_kafka_queue_t *rkqu) {
2522
+ char *topics[] = {"topicA", "topicB", "topicC"};
2523
+ int cnt = 0;
2524
+ struct waiting {
2525
+ rd_kafka_event_type_t evtype;
2526
+ int seen;
2527
+ };
2528
+ struct waiting id1 = {RD_KAFKA_EVENT_CREATETOPICS_RESULT};
2529
+ struct waiting id2 = {RD_KAFKA_EVENT_DELETETOPICS_RESULT};
2530
+ struct waiting id3 = {RD_KAFKA_EVENT_CREATETOPICS_RESULT};
2531
+ struct waiting id4 = {RD_KAFKA_EVENT_DELETEGROUPS_RESULT};
2532
+ struct waiting id5 = {RD_KAFKA_EVENT_DELETERECORDS_RESULT};
2533
+ struct waiting id6 = {RD_KAFKA_EVENT_CREATEPARTITIONS_RESULT};
2534
+ struct waiting id7 = {RD_KAFKA_EVENT_DELETECONSUMERGROUPOFFSETS_RESULT};
2535
+ struct waiting id8 = {RD_KAFKA_EVENT_DELETECONSUMERGROUPOFFSETS_RESULT};
2536
+ struct waiting id9 = {RD_KAFKA_EVENT_CREATETOPICS_RESULT};
2537
+ rd_kafka_topic_partition_list_t *offsets;
2538
+
2539
+
2540
+ SUB_TEST_QUICK();
2541
+
2542
+ offsets = rd_kafka_topic_partition_list_new(3);
2543
+ rd_kafka_topic_partition_list_add(offsets, topics[0], 0)->offset =
2544
+ RD_KAFKA_OFFSET_END;
2545
+ rd_kafka_topic_partition_list_add(offsets, topics[1], 0)->offset =
2546
+ RD_KAFKA_OFFSET_END;
2547
+ rd_kafka_topic_partition_list_add(offsets, topics[2], 0)->offset =
2548
+ RD_KAFKA_OFFSET_END;
2549
+
2550
+ test_CreateTopics_simple(rk, rkqu, topics, 2, 1, &id1);
2551
+ test_DeleteTopics_simple(rk, rkqu, &topics[1], 1, &id2);
2552
+ test_CreateTopics_simple(rk, rkqu, &topics[2], 1, 1, &id3);
2553
+ test_DeleteGroups_simple(rk, rkqu, topics, 3, &id4);
2554
+ test_DeleteRecords_simple(rk, rkqu, offsets, &id5);
2555
+ test_CreatePartitions_simple(rk, rkqu, "topicD", 15, &id6);
2556
+ test_DeleteConsumerGroupOffsets_simple(rk, rkqu, "mygroup", offsets,
2557
+ &id7);
2558
+ test_DeleteConsumerGroupOffsets_simple(rk, rkqu, NULL, NULL, &id8);
2559
+ /* Use broker-side defaults for partition count */
2560
+ test_CreateTopics_simple(rk, rkqu, topics, 2, -1, &id9);
2561
+
2562
+ rd_kafka_topic_partition_list_destroy(offsets);
2563
+
2564
+ while (cnt < 9) {
2565
+ rd_kafka_event_t *rkev;
2566
+ struct waiting *w;
2567
+
2568
+ rkev = rd_kafka_queue_poll(rkqu, -1);
2569
+ TEST_ASSERT(rkev);
2570
+
2571
+ TEST_SAY("Got event %s: %s\n", rd_kafka_event_name(rkev),
2572
+ rd_kafka_event_error_string(rkev));
2573
+
2574
+ w = rd_kafka_event_opaque(rkev);
2575
+ TEST_ASSERT(w);
2576
+
2577
+ TEST_ASSERT(w->evtype == rd_kafka_event_type(rkev),
2578
+ "Expected evtype %d, not %d (%s)", w->evtype,
2579
+ rd_kafka_event_type(rkev),
2580
+ rd_kafka_event_name(rkev));
2581
+
2582
+ TEST_ASSERT(w->seen == 0, "Duplicate results");
2583
+
2584
+ w->seen++;
2585
+ cnt++;
2586
+
2587
+ rd_kafka_event_destroy(rkev);
2588
+ }
2589
+
2590
+ SUB_TEST_PASS();
2591
+ }
2592
+
2593
+
2594
+ /**
2595
+ * @brief Test AlterConfigs and DescribeConfigs
2596
+ */
2597
+ static void do_test_configs(rd_kafka_t *rk, rd_kafka_queue_t *rkqu) {
2598
+ #define MY_CONFRES_CNT RD_KAFKA_RESOURCE__CNT + 2
2599
+ rd_kafka_ConfigResource_t *configs[MY_CONFRES_CNT];
2600
+ rd_kafka_AdminOptions_t *options;
2601
+ rd_kafka_event_t *rkev;
2602
+ rd_kafka_resp_err_t err;
2603
+ const rd_kafka_AlterConfigs_result_t *res;
2604
+ const rd_kafka_ConfigResource_t **rconfigs;
2605
+ size_t rconfig_cnt;
2606
+ char errstr[128];
2607
+ int i;
2608
+
2609
+ SUB_TEST_QUICK();
2610
+
2611
+ /* Check invalids */
2612
+ configs[0] = rd_kafka_ConfigResource_new((rd_kafka_ResourceType_t)-1,
2613
+ "something");
2614
+ TEST_ASSERT(!configs[0]);
2615
+
2616
+ configs[0] =
2617
+ rd_kafka_ConfigResource_new((rd_kafka_ResourceType_t)0, NULL);
2618
+ TEST_ASSERT(!configs[0]);
2619
+
2620
+
2621
+ for (i = 0; i < MY_CONFRES_CNT; i++) {
2622
+ int set_config = !(i % 2);
2623
+
2624
+ /* librdkafka shall not limit the use of illogical
2625
+ * or unknown settings, they are enforced by the broker. */
2626
+ configs[i] = rd_kafka_ConfigResource_new(
2627
+ (rd_kafka_ResourceType_t)i, "3");
2628
+ TEST_ASSERT(configs[i] != NULL);
2629
+
2630
+ if (set_config) {
2631
+ rd_kafka_ConfigResource_set_config(configs[i],
2632
+ "some.conf",
2633
+ "which remains "
2634
+ "unchecked");
2635
+ rd_kafka_ConfigResource_set_config(
2636
+ configs[i], "some.conf.null", NULL);
2637
+ }
2638
+ }
2639
+
2640
+
2641
+ options = rd_kafka_AdminOptions_new(rk, RD_KAFKA_ADMIN_OP_ANY);
2642
+ err = rd_kafka_AdminOptions_set_request_timeout(options, 1000, errstr,
2643
+ sizeof(errstr));
2644
+ TEST_ASSERT(!err, "%s", errstr);
2645
+
2646
+ /* AlterConfigs */
2647
+ rd_kafka_AlterConfigs(rk, configs, MY_CONFRES_CNT, options, rkqu);
2648
+
2649
+ rkev = test_wait_admin_result(rkqu, RD_KAFKA_EVENT_ALTERCONFIGS_RESULT,
2650
+ 2000);
2651
+
2652
+ TEST_ASSERT(rd_kafka_event_error(rkev) == RD_KAFKA_RESP_ERR__TIMED_OUT,
2653
+ "Expected timeout, not %s",
2654
+ rd_kafka_event_error_string(rkev));
2655
+
2656
+ res = rd_kafka_event_AlterConfigs_result(rkev);
2657
+ TEST_ASSERT(res);
2658
+
2659
+ rconfigs = rd_kafka_AlterConfigs_result_resources(res, &rconfig_cnt);
2660
+ TEST_ASSERT(!rconfigs && !rconfig_cnt,
2661
+ "Expected no result resources, got %" PRIusz, rconfig_cnt);
2662
+
2663
+ rd_kafka_event_destroy(rkev);
2664
+
2665
+ /* DescribeConfigs: reuse same configs and options */
2666
+ rd_kafka_DescribeConfigs(rk, configs, MY_CONFRES_CNT, options, rkqu);
2667
+
2668
+ rd_kafka_AdminOptions_destroy(options);
2669
+ rd_kafka_ConfigResource_destroy_array(configs, MY_CONFRES_CNT);
2670
+
2671
+ rkev = test_wait_admin_result(
2672
+ rkqu, RD_KAFKA_EVENT_DESCRIBECONFIGS_RESULT, 2000);
2673
+
2674
+ TEST_ASSERT(rd_kafka_event_error(rkev) == RD_KAFKA_RESP_ERR__TIMED_OUT,
2675
+ "Expected timeout, not %s",
2676
+ rd_kafka_event_error_string(rkev));
2677
+
2678
+ res = rd_kafka_event_DescribeConfigs_result(rkev);
2679
+ TEST_ASSERT(res);
2680
+
2681
+ rconfigs = rd_kafka_DescribeConfigs_result_resources(res, &rconfig_cnt);
2682
+ TEST_ASSERT(!rconfigs && !rconfig_cnt,
2683
+ "Expected no result resources, got %" PRIusz, rconfig_cnt);
2684
+
2685
+ rd_kafka_event_destroy(rkev);
2686
+
2687
+ SUB_TEST_PASS();
2688
+ }
2689
+
2690
+
2691
+ /**
2692
+ * @brief Verify that an unclean rd_kafka_destroy() does not hang or crash.
2693
+ */
2694
+ static void do_test_unclean_destroy(rd_kafka_type_t cltype, int with_mainq) {
2695
+ rd_kafka_t *rk;
2696
+ char errstr[512];
2697
+ rd_kafka_conf_t *conf;
2698
+ rd_kafka_queue_t *q;
2699
+ rd_kafka_event_t *rkev;
2700
+ rd_kafka_DeleteTopic_t *topic;
2701
+ test_timing_t t_destroy;
2702
+
2703
+ SUB_TEST_QUICK("Test unclean destroy using %s",
2704
+ with_mainq ? "mainq" : "tempq");
2705
+
2706
+ test_conf_init(&conf, NULL, 0);
2707
+ /* Remove brokers, if any, since this is a local test and we
2708
+ * rely on the controller not being found. */
2709
+ test_conf_set(conf, "bootstrap.servers", "");
2710
+ test_conf_set(conf, "socket.timeout.ms", "60000");
2711
+ if (test_consumer_group_protocol()) {
2712
+ test_conf_set(conf, "group.protocol",
2713
+ test_consumer_group_protocol());
2714
+ }
2715
+
2716
+ rk = rd_kafka_new(cltype, conf, errstr, sizeof(errstr));
2717
+ TEST_ASSERT(rk, "kafka_new(%d): %s", cltype, errstr);
2718
+
2719
+ if (with_mainq)
2720
+ q = rd_kafka_queue_get_main(rk);
2721
+ else
2722
+ q = rd_kafka_queue_new(rk);
2723
+
2724
+ topic = rd_kafka_DeleteTopic_new("test");
2725
+ rd_kafka_DeleteTopics(rk, &topic, 1, NULL, q);
2726
+ rd_kafka_DeleteTopic_destroy(topic);
2727
+
2728
+ /* We're not expecting a result yet since DeleteTopics will attempt
2729
+ * to look up the controller for socket.timeout.ms (1 minute). */
2730
+ rkev = rd_kafka_queue_poll(q, 100);
2731
+ TEST_ASSERT(!rkev, "Did not expect result: %s",
2732
+ rd_kafka_event_name(rkev));
2733
+
2734
+ rd_kafka_queue_destroy(q);
2735
+
2736
+ TEST_SAY(
2737
+ "Giving rd_kafka_destroy() 5s to finish, "
2738
+ "despite Admin API request being processed\n");
2739
+ test_timeout_set(5);
2740
+ TIMING_START(&t_destroy, "rd_kafka_destroy()");
2741
+ rd_kafka_destroy(rk);
2742
+ TIMING_STOP(&t_destroy);
2743
+
2744
+ SUB_TEST_PASS();
2745
+
2746
+ /* Restore timeout */
2747
+ test_timeout_set(60);
2748
+ }
2749
+
2750
+
2751
+ /**
2752
+ * @brief Test AdminOptions
2753
+ */
2754
+ static void do_test_options(rd_kafka_t *rk) {
2755
+ #define _all_apis \
2756
+ { \
2757
+ RD_KAFKA_ADMIN_OP_CREATETOPICS, \
2758
+ RD_KAFKA_ADMIN_OP_DELETETOPICS, \
2759
+ RD_KAFKA_ADMIN_OP_CREATEPARTITIONS, \
2760
+ RD_KAFKA_ADMIN_OP_ALTERCONFIGS, \
2761
+ RD_KAFKA_ADMIN_OP_DESCRIBECONFIGS, \
2762
+ RD_KAFKA_ADMIN_OP_DELETERECORDS, \
2763
+ RD_KAFKA_ADMIN_OP_CREATEACLS, \
2764
+ RD_KAFKA_ADMIN_OP_DESCRIBEACLS, \
2765
+ RD_KAFKA_ADMIN_OP_DELETEACLS, \
2766
+ RD_KAFKA_ADMIN_OP_LISTCONSUMERGROUPS, \
2767
+ RD_KAFKA_ADMIN_OP_DESCRIBECONSUMERGROUPS, \
2768
+ RD_KAFKA_ADMIN_OP_DELETEGROUPS, \
2769
+ RD_KAFKA_ADMIN_OP_LISTCONSUMERGROUPOFFSETS, \
2770
+ RD_KAFKA_ADMIN_OP_ALTERCONSUMERGROUPOFFSETS, \
2771
+ RD_KAFKA_ADMIN_OP_DELETECONSUMERGROUPOFFSETS, \
2772
+ RD_KAFKA_ADMIN_OP_ELECTLEADERS, \
2773
+ RD_KAFKA_ADMIN_OP_ANY /* Must be last */ \
2774
+ }
2775
+ struct {
2776
+ const char *setter;
2777
+ const rd_kafka_admin_op_t valid_apis[17];
2778
+ } matrix[] = {
2779
+ {"request_timeout", _all_apis},
2780
+ {"operation_timeout",
2781
+ {RD_KAFKA_ADMIN_OP_CREATETOPICS, RD_KAFKA_ADMIN_OP_DELETETOPICS,
2782
+ RD_KAFKA_ADMIN_OP_CREATEPARTITIONS,
2783
+ RD_KAFKA_ADMIN_OP_DELETERECORDS, RD_KAFKA_ADMIN_OP_ELECTLEADERS}},
2784
+ {"validate_only",
2785
+ {RD_KAFKA_ADMIN_OP_CREATETOPICS,
2786
+ RD_KAFKA_ADMIN_OP_CREATEPARTITIONS,
2787
+ RD_KAFKA_ADMIN_OP_ALTERCONFIGS}},
2788
+ {"broker", _all_apis},
2789
+ {"require_stable_offsets",
2790
+ {RD_KAFKA_ADMIN_OP_LISTCONSUMERGROUPOFFSETS}},
2791
+ {"match_consumer_group_states",
2792
+ {RD_KAFKA_ADMIN_OP_LISTCONSUMERGROUPS}},
2793
+ {"opaque", _all_apis},
2794
+ {NULL},
2795
+ };
2796
+ int i;
2797
+ rd_kafka_AdminOptions_t *options;
2798
+ rd_kafka_consumer_group_state_t state[1] = {
2799
+ RD_KAFKA_CONSUMER_GROUP_STATE_STABLE};
2800
+
2801
+ SUB_TEST_QUICK();
2802
+
2803
+ for (i = 0; matrix[i].setter; i++) {
2804
+ static const rd_kafka_admin_op_t all_apis[] = _all_apis;
2805
+ const rd_kafka_admin_op_t *for_api;
2806
+
2807
+ for (for_api = all_apis;; for_api++) {
2808
+ rd_kafka_resp_err_t err = RD_KAFKA_RESP_ERR_NO_ERROR;
2809
+ rd_kafka_resp_err_t exp_err =
2810
+ RD_KAFKA_RESP_ERR_NO_ERROR;
2811
+ rd_kafka_error_t *error = NULL;
2812
+ char errstr[512];
2813
+ int fi;
2814
+
2815
+ options = rd_kafka_AdminOptions_new(rk, *for_api);
2816
+ TEST_ASSERT(options, "AdminOptions_new(%d) failed",
2817
+ *for_api);
2818
+
2819
+ if (!strcmp(matrix[i].setter, "request_timeout"))
2820
+ err = rd_kafka_AdminOptions_set_request_timeout(
2821
+ options, 1234, errstr, sizeof(errstr));
2822
+ else if (!strcmp(matrix[i].setter, "operation_timeout"))
2823
+ err =
2824
+ rd_kafka_AdminOptions_set_operation_timeout(
2825
+ options, 12345, errstr, sizeof(errstr));
2826
+ else if (!strcmp(matrix[i].setter, "validate_only"))
2827
+ err = rd_kafka_AdminOptions_set_validate_only(
2828
+ options, 1, errstr, sizeof(errstr));
2829
+ else if (!strcmp(matrix[i].setter, "broker"))
2830
+ err = rd_kafka_AdminOptions_set_broker(
2831
+ options, 5, errstr, sizeof(errstr));
2832
+ else if (!strcmp(matrix[i].setter,
2833
+ "require_stable_offsets"))
2834
+ error =
2835
+ rd_kafka_AdminOptions_set_require_stable_offsets(
2836
+ options, 0);
2837
+ else if (!strcmp(matrix[i].setter,
2838
+ "match_consumer_group_states"))
2839
+ error =
2840
+ rd_kafka_AdminOptions_set_match_consumer_group_states(
2841
+ options, state, 1);
2842
+ else if (!strcmp(matrix[i].setter, "opaque")) {
2843
+ rd_kafka_AdminOptions_set_opaque(
2844
+ options, (void *)options);
2845
+ err = RD_KAFKA_RESP_ERR_NO_ERROR;
2846
+ } else
2847
+ TEST_FAIL("Invalid setter: %s",
2848
+ matrix[i].setter);
2849
+
2850
+ if (error) {
2851
+ err = rd_kafka_error_code(error);
2852
+ snprintf(errstr, sizeof(errstr), "%s",
2853
+ rd_kafka_error_string(error));
2854
+ rd_kafka_error_destroy(error);
2855
+ }
2856
+
2857
+
2858
+ TEST_SAYL(3,
2859
+ "AdminOptions_set_%s on "
2860
+ "RD_KAFKA_ADMIN_OP_%d options "
2861
+ "returned %s: %s\n",
2862
+ matrix[i].setter, *for_api,
2863
+ rd_kafka_err2name(err),
2864
+ err ? errstr : "success");
2865
+
2866
+ /* Scan matrix valid_apis to see if this
2867
+ * setter should be accepted or not. */
2868
+ if (exp_err) {
2869
+ /* An expected error is already set */
2870
+ } else if (*for_api != RD_KAFKA_ADMIN_OP_ANY) {
2871
+ exp_err = RD_KAFKA_RESP_ERR__INVALID_ARG;
2872
+
2873
+ for (fi = 0; matrix[i].valid_apis[fi]; fi++) {
2874
+ if (matrix[i].valid_apis[fi] ==
2875
+ *for_api)
2876
+ exp_err =
2877
+ RD_KAFKA_RESP_ERR_NO_ERROR;
2878
+ }
2879
+ } else {
2880
+ exp_err = RD_KAFKA_RESP_ERR_NO_ERROR;
2881
+ }
2882
+
2883
+ if (err != exp_err)
2884
+ TEST_FAIL_LATER(
2885
+ "Expected AdminOptions_set_%s "
2886
+ "for RD_KAFKA_ADMIN_OP_%d "
2887
+ "options to return %s, "
2888
+ "not %s",
2889
+ matrix[i].setter, *for_api,
2890
+ rd_kafka_err2name(exp_err),
2891
+ rd_kafka_err2name(err));
2892
+
2893
+ rd_kafka_AdminOptions_destroy(options);
2894
+
2895
+ if (*for_api == RD_KAFKA_ADMIN_OP_ANY)
2896
+ break; /* This was the last one */
2897
+ }
2898
+ }
2899
+
2900
+ /* Try an invalid for_api */
2901
+ options = rd_kafka_AdminOptions_new(rk, (rd_kafka_admin_op_t)1234);
2902
+ TEST_ASSERT(!options,
2903
+ "Expected AdminOptions_new() to fail "
2904
+ "with an invalid for_api, didn't.");
2905
+
2906
+ TEST_LATER_CHECK();
2907
+
2908
+ SUB_TEST_PASS();
2909
+ }
2910
+
2911
+
2912
+ static rd_kafka_t *create_admin_client(rd_kafka_type_t cltype) {
2913
+ rd_kafka_t *rk;
2914
+ char errstr[512];
2915
+ rd_kafka_conf_t *conf;
2916
+
2917
+ test_conf_init(&conf, NULL, 0);
2918
+ /* Remove brokers, if any, since this is a local test and we
2919
+ * rely on the controller not being found. */
2920
+ test_conf_set(conf, "bootstrap.servers", "");
2921
+ test_conf_set(conf, "socket.timeout.ms", MY_SOCKET_TIMEOUT_MS_STR);
2922
+ if (test_consumer_group_protocol()) {
2923
+ test_conf_set(conf, "group.protocol",
2924
+ test_consumer_group_protocol());
2925
+ }
2926
+ /* For use with the background queue */
2927
+ rd_kafka_conf_set_background_event_cb(conf, background_event_cb);
2928
+
2929
+ rk = rd_kafka_new(cltype, conf, errstr, sizeof(errstr));
2930
+ TEST_ASSERT(rk, "kafka_new(%d): %s", cltype, errstr);
2931
+
2932
+ return rk;
2933
+ }
2934
+
2935
+
2936
+ static void do_test_apis(rd_kafka_type_t cltype) {
2937
+ rd_kafka_t *rk;
2938
+ rd_kafka_queue_t *mainq, *backgroundq;
2939
+
2940
+ mtx_init(&last_event_lock, mtx_plain);
2941
+ cnd_init(&last_event_cnd);
2942
+
2943
+ do_test_unclean_destroy(cltype, 0 /*tempq*/);
2944
+ do_test_unclean_destroy(cltype, 1 /*mainq*/);
2945
+
2946
+ rk = create_admin_client(cltype);
2947
+
2948
+ mainq = rd_kafka_queue_get_main(rk);
2949
+ backgroundq = rd_kafka_queue_get_background(rk);
2950
+
2951
+ do_test_options(rk);
2952
+
2953
+ do_test_CreateTopics("temp queue, no options", rk, NULL, 0, 0);
2954
+ do_test_CreateTopics("temp queue, no options, background_event_cb", rk,
2955
+ backgroundq, 1, 0);
2956
+ do_test_CreateTopics("temp queue, options", rk, NULL, 0, 1);
2957
+ do_test_CreateTopics("main queue, options", rk, mainq, 0, 1);
2958
+
2959
+ do_test_DeleteTopics("temp queue, no options", rk, NULL, 0);
2960
+ do_test_DeleteTopics("temp queue, options", rk, NULL, 1);
2961
+ do_test_DeleteTopics("main queue, options", rk, mainq, 1);
2962
+
2963
+ do_test_ListConsumerGroups("temp queue, no options", rk, NULL, 0,
2964
+ rd_false);
2965
+ do_test_ListConsumerGroups("temp queue, options", rk, NULL, 1,
2966
+ rd_false);
2967
+ do_test_ListConsumerGroups("main queue", rk, mainq, 0, rd_false);
2968
+
2969
+ do_test_DescribeConsumerGroups("temp queue, no options", rk, NULL, 0,
2970
+ rd_false);
2971
+ do_test_DescribeConsumerGroups("temp queue, options", rk, NULL, 1,
2972
+ rd_false);
2973
+ do_test_DescribeConsumerGroups("main queue, options", rk, mainq, 1,
2974
+ rd_false);
2975
+
2976
+ do_test_DescribeTopics("temp queue, no options", rk, NULL, 0);
2977
+ do_test_DescribeTopics("temp queue, options", rk, NULL, 1);
2978
+ do_test_DescribeTopics("main queue, options", rk, mainq, 1);
2979
+
2980
+ do_test_DescribeCluster("temp queue, no options", rk, NULL, 0);
2981
+ do_test_DescribeCluster("temp queue, options", rk, NULL, 1);
2982
+ do_test_DescribeCluster("main queue, options", rk, mainq, 1);
2983
+
2984
+ do_test_DeleteGroups("temp queue, no options", rk, NULL, 0, rd_false);
2985
+ do_test_DeleteGroups("temp queue, options", rk, NULL, 1, rd_false);
2986
+ do_test_DeleteGroups("main queue, options", rk, mainq, 1, rd_false);
2987
+
2988
+ do_test_DeleteRecords("temp queue, no options", rk, NULL, 0, rd_false);
2989
+ do_test_DeleteRecords("temp queue, options", rk, NULL, 1, rd_false);
2990
+ do_test_DeleteRecords("main queue, options", rk, mainq, 1, rd_false);
2991
+
2992
+ do_test_DeleteConsumerGroupOffsets("temp queue, no options", rk, NULL,
2993
+ 0);
2994
+ do_test_DeleteConsumerGroupOffsets("temp queue, options", rk, NULL, 1);
2995
+ do_test_DeleteConsumerGroupOffsets("main queue, options", rk, mainq, 1);
2996
+
2997
+ do_test_AclBinding();
2998
+ do_test_AclBindingFilter();
2999
+
3000
+ do_test_CreateAcls("temp queue, no options", rk, NULL, rd_false,
3001
+ rd_false);
3002
+ do_test_CreateAcls("temp queue, options", rk, NULL, rd_false, rd_true);
3003
+ do_test_CreateAcls("main queue, options", rk, mainq, rd_false, rd_true);
3004
+
3005
+ do_test_DescribeAcls("temp queue, no options", rk, NULL, rd_false,
3006
+ rd_false);
3007
+ do_test_DescribeAcls("temp queue, options", rk, NULL, rd_false,
3008
+ rd_true);
3009
+ do_test_DescribeAcls("main queue, options", rk, mainq, rd_false,
3010
+ rd_true);
3011
+
3012
+ do_test_DeleteAcls("temp queue, no options", rk, NULL, rd_false,
3013
+ rd_false);
3014
+ do_test_DeleteAcls("temp queue, options", rk, NULL, rd_false, rd_true);
3015
+ do_test_DeleteAcls("main queue, options", rk, mainq, rd_false, rd_true);
3016
+
3017
+ do_test_AlterConsumerGroupOffsets("temp queue, no options", rk, NULL,
3018
+ 0);
3019
+ do_test_AlterConsumerGroupOffsets("temp queue, options", rk, NULL, 1);
3020
+ do_test_AlterConsumerGroupOffsets("main queue, options", rk, mainq, 1);
3021
+
3022
+ do_test_ListConsumerGroupOffsets("temp queue, no options", rk, NULL, 0,
3023
+ rd_false);
3024
+ do_test_ListConsumerGroupOffsets("temp queue, options", rk, NULL, 1,
3025
+ rd_false);
3026
+ do_test_ListConsumerGroupOffsets("main queue, options", rk, mainq, 1,
3027
+ rd_false);
3028
+ do_test_ListConsumerGroupOffsets("temp queue, no options", rk, NULL, 0,
3029
+ rd_true);
3030
+ do_test_ListConsumerGroupOffsets("temp queue, options", rk, NULL, 1,
3031
+ rd_true);
3032
+ do_test_ListConsumerGroupOffsets("main queue, options", rk, mainq, 1,
3033
+ rd_true);
3034
+
3035
+ do_test_DescribeUserScramCredentials("main queue", rk, mainq);
3036
+ do_test_DescribeUserScramCredentials("temp queue", rk, NULL);
3037
+
3038
+ do_test_AlterUserScramCredentials("main queue", rk, mainq);
3039
+ do_test_AlterUserScramCredentials("temp queue", rk, NULL);
3040
+
3041
+ do_test_ElectLeaders("main queue, options, Preffered Elections", rk,
3042
+ mainq, 1, RD_KAFKA_ELECTION_TYPE_PREFERRED);
3043
+ do_test_ElectLeaders("main queue, options, Unclean Elections", rk,
3044
+ mainq, 1, RD_KAFKA_ELECTION_TYPE_UNCLEAN);
3045
+ do_test_ElectLeaders("main queue, no options, Preffered Elections", rk,
3046
+ mainq, 0, RD_KAFKA_ELECTION_TYPE_PREFERRED);
3047
+ do_test_ElectLeaders("main queue, no options, Unclean Elections", rk,
3048
+ mainq, 0, RD_KAFKA_ELECTION_TYPE_UNCLEAN);
3049
+ do_test_ElectLeaders("temp queue, options, Preffered Elections", rk,
3050
+ NULL, 1, RD_KAFKA_ELECTION_TYPE_PREFERRED);
3051
+ do_test_ElectLeaders("temp queue, options, Unclean Elections", rk, NULL,
3052
+ 1, RD_KAFKA_ELECTION_TYPE_UNCLEAN);
3053
+ do_test_ElectLeaders("temp queue, no options, Preffered Elections", rk,
3054
+ NULL, 0, RD_KAFKA_ELECTION_TYPE_PREFERRED);
3055
+ do_test_ElectLeaders("temp queue, no options, Unclean Elections", rk,
3056
+ NULL, 0, RD_KAFKA_ELECTION_TYPE_UNCLEAN);
3057
+
3058
+ do_test_mix(rk, mainq);
3059
+
3060
+ do_test_configs(rk, mainq);
3061
+
3062
+ rd_kafka_queue_destroy(backgroundq);
3063
+ rd_kafka_queue_destroy(mainq);
3064
+
3065
+ rd_kafka_destroy(rk);
3066
+
3067
+ /*
3068
+ * Tests which require a unique unused client instance.
3069
+ */
3070
+ rk = create_admin_client(cltype);
3071
+ mainq = rd_kafka_queue_get_main(rk);
3072
+ do_test_DeleteRecords("main queue, options, destroy", rk, mainq, 1,
3073
+ rd_true /*destroy instance before finishing*/);
3074
+ rd_kafka_queue_destroy(mainq);
3075
+ rd_kafka_destroy(rk);
3076
+
3077
+ rk = create_admin_client(cltype);
3078
+ mainq = rd_kafka_queue_get_main(rk);
3079
+ do_test_DeleteGroups("main queue, options, destroy", rk, mainq, 1,
3080
+ rd_true /*destroy instance before finishing*/);
3081
+ rd_kafka_queue_destroy(mainq);
3082
+ rd_kafka_destroy(rk);
3083
+
3084
+
3085
+ /* Done */
3086
+ mtx_destroy(&last_event_lock);
3087
+ cnd_destroy(&last_event_cnd);
3088
+ }
3089
+
3090
+
3091
+ int main_0080_admin_ut(int argc, char **argv) {
3092
+ do_test_apis(RD_KAFKA_PRODUCER);
3093
+ do_test_apis(RD_KAFKA_CONSUMER);
3094
+ return 0;
3095
+ }