@platformatic/rdkafka 4.0.1 → 4.1.0-alpha.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 (292) hide show
  1. package/README.md +5 -5
  2. package/bench/seed.sh +0 -0
  3. package/binding.gyp +8 -1
  4. package/ci/prepublish.js +4 -4
  5. package/config.d.ts +126 -10
  6. package/configure +0 -0
  7. package/deps/librdkafka/.semaphore/run-all-tests.yml +77 -0
  8. package/deps/librdkafka/.semaphore/semaphore-integration.yml +250 -0
  9. package/deps/librdkafka/.semaphore/semaphore.yml +67 -44
  10. package/deps/librdkafka/.semaphore/verify-linux-packages.yml +41 -0
  11. package/deps/librdkafka/CHANGELOG.md +471 -1
  12. package/deps/librdkafka/CONFIGURATION.md +29 -9
  13. package/deps/librdkafka/INTRODUCTION.md +909 -601
  14. package/deps/librdkafka/LICENSES.txt +592 -1
  15. package/deps/librdkafka/Makefile +2 -1
  16. package/deps/librdkafka/configure +0 -0
  17. package/deps/librdkafka/debian/rules +0 -0
  18. package/deps/librdkafka/dev-conf.sh +0 -0
  19. package/deps/librdkafka/examples/consumer.c +18 -8
  20. package/deps/librdkafka/examples/describe_consumer_groups.c +25 -6
  21. package/deps/librdkafka/examples/incremental_alter_configs.c +4 -5
  22. package/deps/librdkafka/examples/kafkatest_verifiable_client.cpp +26 -42
  23. package/deps/librdkafka/examples/openssl_engine_example.cpp +3 -4
  24. package/deps/librdkafka/examples/producer.cpp +2 -2
  25. package/deps/librdkafka/examples/user_scram.c +4 -5
  26. package/deps/librdkafka/examples/win_ssl_cert_store.cpp +4 -3
  27. package/deps/librdkafka/lds-gen.py +0 -0
  28. package/deps/librdkafka/mklove/Makefile.base +0 -0
  29. package/deps/librdkafka/packaging/RELEASE.md +8 -0
  30. package/deps/librdkafka/packaging/alpine/build-alpine.sh +0 -0
  31. package/deps/librdkafka/packaging/cp/README.md +4 -1
  32. package/deps/librdkafka/packaging/cp/check_features.c +12 -4
  33. package/deps/librdkafka/packaging/cp/verify-deb.sh +6 -6
  34. package/deps/librdkafka/packaging/cp/verify-packages.sh +52 -31
  35. package/deps/librdkafka/packaging/cp/verify-rpm.sh +6 -13
  36. package/deps/librdkafka/packaging/debian/rules +0 -0
  37. package/deps/librdkafka/packaging/get_version.py +0 -0
  38. package/deps/librdkafka/packaging/homebrew/brew-update-pr.sh +0 -0
  39. package/deps/librdkafka/packaging/mingw-w64/{travis-before-install.sh → export-variables.sh} +0 -7
  40. package/deps/librdkafka/packaging/mingw-w64/semaphoreci-build.sh +1 -1
  41. package/deps/librdkafka/packaging/nuget/artifact.py +0 -0
  42. package/deps/librdkafka/packaging/nuget/cleanup-s3.py +0 -0
  43. package/deps/librdkafka/packaging/nuget/nuget.sh +0 -0
  44. package/deps/librdkafka/packaging/nuget/packaging.py +0 -0
  45. package/deps/librdkafka/packaging/nuget/push-to-nuget.sh +0 -0
  46. package/deps/librdkafka/packaging/nuget/release.py +0 -0
  47. package/deps/librdkafka/packaging/nuget/requirements.txt +3 -3
  48. package/deps/librdkafka/packaging/rpm/mock-on-docker.sh +0 -0
  49. package/deps/librdkafka/packaging/rpm/tests/run-test.sh +0 -0
  50. package/deps/librdkafka/packaging/rpm/tests/test-on-docker.sh +0 -0
  51. package/deps/librdkafka/packaging/tools/build-configurations-checks.sh +3 -1
  52. package/deps/librdkafka/packaging/tools/build-deb-package.sh +0 -0
  53. package/deps/librdkafka/packaging/tools/build-debian.sh +0 -0
  54. package/deps/librdkafka/packaging/tools/build-manylinux.sh +0 -0
  55. package/deps/librdkafka/packaging/tools/build-release-artifacts.sh +0 -0
  56. package/deps/librdkafka/packaging/tools/distro-build.sh +0 -0
  57. package/deps/librdkafka/packaging/tools/gh-release-checksums.py +0 -0
  58. package/deps/librdkafka/packaging/tools/rdutcoverage.sh +0 -0
  59. package/deps/librdkafka/packaging/tools/run-in-docker.sh +28 -0
  60. package/deps/librdkafka/packaging/tools/run-integration-tests.sh +31 -0
  61. package/deps/librdkafka/packaging/tools/run-style-check.sh +4 -0
  62. package/deps/librdkafka/packaging/tools/style-format.sh +6 -5
  63. package/deps/librdkafka/packaging/tools/update_rpcs_max_versions.py +100 -0
  64. package/deps/librdkafka/service.yml +154 -0
  65. package/deps/librdkafka/src/generate_proto.sh +0 -0
  66. package/deps/librdkafka/src/rd.h +145 -2
  67. package/deps/librdkafka/src/rdaddr.h +6 -7
  68. package/deps/librdkafka/src/rdatomic.h +15 -11
  69. package/deps/librdkafka/src/rdavg.h +3 -2
  70. package/deps/librdkafka/src/rdbase64.c +33 -2
  71. package/deps/librdkafka/src/rdbase64.h +2 -0
  72. package/deps/librdkafka/src/rdendian.h +10 -9
  73. package/deps/librdkafka/src/rdhttp.c +418 -100
  74. package/deps/librdkafka/src/rdhttp.h +23 -5
  75. package/deps/librdkafka/src/rdkafka.c +299 -145
  76. package/deps/librdkafka/src/rdkafka.h +89 -6
  77. package/deps/librdkafka/src/rdkafka_admin.c +482 -105
  78. package/deps/librdkafka/src/rdkafka_admin.h +42 -0
  79. package/deps/librdkafka/src/rdkafka_broker.c +463 -312
  80. package/deps/librdkafka/src/rdkafka_broker.h +68 -10
  81. package/deps/librdkafka/src/rdkafka_buf.c +8 -5
  82. package/deps/librdkafka/src/rdkafka_buf.h +4 -3
  83. package/deps/librdkafka/src/rdkafka_cert.c +25 -1
  84. package/deps/librdkafka/src/rdkafka_cert.h +4 -3
  85. package/deps/librdkafka/src/rdkafka_cgrp.c +468 -143
  86. package/deps/librdkafka/src/rdkafka_cgrp.h +36 -2
  87. package/deps/librdkafka/src/rdkafka_conf.c +526 -102
  88. package/deps/librdkafka/src/rdkafka_conf.h +68 -4
  89. package/deps/librdkafka/src/rdkafka_feature.c +472 -35
  90. package/deps/librdkafka/src/rdkafka_feature.h +2 -0
  91. package/deps/librdkafka/src/rdkafka_fetcher.c +22 -2
  92. package/deps/librdkafka/src/rdkafka_fetcher.h +2 -2
  93. package/deps/librdkafka/src/rdkafka_int.h +84 -46
  94. package/deps/librdkafka/src/rdkafka_metadata.c +221 -136
  95. package/deps/librdkafka/src/rdkafka_metadata.h +15 -11
  96. package/deps/librdkafka/src/rdkafka_metadata_cache.c +279 -73
  97. package/deps/librdkafka/src/rdkafka_mock.c +795 -19
  98. package/deps/librdkafka/src/rdkafka_mock.h +119 -0
  99. package/deps/librdkafka/src/rdkafka_mock_cgrp.c +1298 -132
  100. package/deps/librdkafka/src/rdkafka_mock_handlers.c +345 -49
  101. package/deps/librdkafka/src/rdkafka_mock_int.h +180 -61
  102. package/deps/librdkafka/src/rdkafka_msg.c +35 -19
  103. package/deps/librdkafka/src/rdkafka_msg.h +3 -3
  104. package/deps/librdkafka/src/rdkafka_msgset_writer.c +14 -10
  105. package/deps/librdkafka/src/rdkafka_offset.c +33 -5
  106. package/deps/librdkafka/src/rdkafka_op.c +1 -1
  107. package/deps/librdkafka/src/rdkafka_op.h +45 -21
  108. package/deps/librdkafka/src/rdkafka_partition.c +118 -23
  109. package/deps/librdkafka/src/rdkafka_partition.h +16 -7
  110. package/deps/librdkafka/src/rdkafka_proto.h +4 -1
  111. package/deps/librdkafka/src/rdkafka_protocol.h +1 -0
  112. package/deps/librdkafka/src/rdkafka_queue.c +125 -48
  113. package/deps/librdkafka/src/rdkafka_queue.h +19 -0
  114. package/deps/librdkafka/src/rdkafka_range_assignor.c +1 -1
  115. package/deps/librdkafka/src/rdkafka_request.c +336 -64
  116. package/deps/librdkafka/src/rdkafka_request.h +24 -1
  117. package/deps/librdkafka/src/rdkafka_sasl.c +5 -3
  118. package/deps/librdkafka/src/rdkafka_sasl_oauthbearer.c +14 -10
  119. package/deps/librdkafka/src/rdkafka_sasl_oauthbearer_oidc.c +1166 -89
  120. package/deps/librdkafka/src/rdkafka_sasl_oauthbearer_oidc.h +13 -3
  121. package/deps/librdkafka/src/rdkafka_sasl_plain.c +3 -3
  122. package/deps/librdkafka/src/rdkafka_sasl_scram.c +4 -3
  123. package/deps/librdkafka/src/rdkafka_ssl.c +306 -81
  124. package/deps/librdkafka/src/rdkafka_ssl.h +22 -0
  125. package/deps/librdkafka/src/rdkafka_sticky_assignor.c +4 -0
  126. package/deps/librdkafka/src/rdkafka_telemetry.c +80 -23
  127. package/deps/librdkafka/src/rdkafka_telemetry_encode.c +5 -1
  128. package/deps/librdkafka/src/rdkafka_telemetry_encode.h +20 -20
  129. package/deps/librdkafka/src/rdkafka_topic.c +220 -137
  130. package/deps/librdkafka/src/rdkafka_topic.h +14 -8
  131. package/deps/librdkafka/src/rdkafka_transport.c +59 -47
  132. package/deps/librdkafka/src/rdkafka_transport.h +5 -0
  133. package/deps/librdkafka/src/rdkafka_txnmgr.c +6 -1
  134. package/deps/librdkafka/src/rdmap.c +6 -1
  135. package/deps/librdkafka/src/rdrand.c +11 -1
  136. package/deps/librdkafka/src/rdtime.h +48 -17
  137. package/deps/librdkafka/src/rdunittest.c +42 -25
  138. package/deps/librdkafka/src/rdunittest.h +2 -0
  139. package/deps/librdkafka/src/rdwin32.h +1 -1
  140. package/deps/librdkafka/src/regexp.c +47 -42
  141. package/deps/librdkafka/src/tinycthread_extra.c +45 -21
  142. package/deps/librdkafka/src/tinycthread_extra.h +7 -3
  143. package/deps/librdkafka/src-cpp/rdkafkacpp.h +28 -2
  144. package/deps/librdkafka/tests/0001-multiobj.c +4 -0
  145. package/deps/librdkafka/tests/0004-conf.c +103 -36
  146. package/deps/librdkafka/tests/0009-mock_cluster.c +1 -0
  147. package/deps/librdkafka/tests/0011-produce_batch.c +2 -1
  148. package/deps/librdkafka/tests/0016-client_swname.c +18 -3
  149. package/deps/librdkafka/tests/0017-compression.c +6 -8
  150. package/deps/librdkafka/tests/0018-cgrp_term.c +8 -3
  151. package/deps/librdkafka/tests/0021-rkt_destroy.c +1 -0
  152. package/deps/librdkafka/tests/0022-consume_batch.c +4 -1
  153. package/deps/librdkafka/tests/0026-consume_pause.c +12 -14
  154. package/deps/librdkafka/tests/0028-long_topicnames.c +1 -1
  155. package/deps/librdkafka/tests/0029-assign_offset.c +6 -8
  156. package/deps/librdkafka/tests/0030-offset_commit.c +2 -2
  157. package/deps/librdkafka/tests/0033-regex_subscribe.c +33 -17
  158. package/deps/librdkafka/tests/0034-offset_reset.c +25 -4
  159. package/deps/librdkafka/tests/0036-partial_fetch.c +1 -0
  160. package/deps/librdkafka/tests/0038-performance.c +1 -0
  161. package/deps/librdkafka/tests/0040-io_event.c +11 -5
  162. package/deps/librdkafka/tests/0041-fetch_max_bytes.c +1 -0
  163. package/deps/librdkafka/tests/0044-partition_cnt.c +3 -2
  164. package/deps/librdkafka/tests/0045-subscribe_update.c +284 -20
  165. package/deps/librdkafka/tests/0047-partial_buf_tmout.c +1 -0
  166. package/deps/librdkafka/tests/0048-partitioner.c +1 -1
  167. package/deps/librdkafka/tests/0050-subscribe_adds.c +1 -0
  168. package/deps/librdkafka/tests/0051-assign_adds.c +1 -0
  169. package/deps/librdkafka/tests/0052-msg_timestamps.c +22 -4
  170. package/deps/librdkafka/tests/0053-stats_cb.cpp +12 -20
  171. package/deps/librdkafka/tests/0055-producer_latency.c +176 -3
  172. package/deps/librdkafka/tests/0056-balanced_group_mt.c +6 -2
  173. package/deps/librdkafka/tests/0058-log.cpp +3 -3
  174. package/deps/librdkafka/tests/0059-bsearch.cpp +8 -4
  175. package/deps/librdkafka/tests/0061-consumer_lag.cpp +25 -5
  176. package/deps/librdkafka/tests/0067-empty_topic.cpp +3 -0
  177. package/deps/librdkafka/tests/0068-produce_timeout.c +21 -23
  178. package/deps/librdkafka/tests/0069-consumer_add_parts.c +3 -7
  179. package/deps/librdkafka/tests/0075-retry.c +38 -1
  180. package/deps/librdkafka/tests/0076-produce_retry.c +2 -0
  181. package/deps/librdkafka/tests/0077-compaction.c +8 -2
  182. package/deps/librdkafka/tests/0080-admin_ut.c +34 -4
  183. package/deps/librdkafka/tests/0081-admin.c +455 -155
  184. package/deps/librdkafka/tests/0082-fetch_max_bytes.cpp +4 -0
  185. package/deps/librdkafka/tests/0083-cb_event.c +8 -3
  186. package/deps/librdkafka/tests/0084-destroy_flags.c +14 -18
  187. package/deps/librdkafka/tests/0085-headers.cpp +4 -0
  188. package/deps/librdkafka/tests/0086-purge.c +40 -7
  189. package/deps/librdkafka/tests/0088-produce_metadata_timeout.c +1 -1
  190. package/deps/librdkafka/tests/0089-max_poll_interval.c +12 -7
  191. package/deps/librdkafka/tests/0090-idempotence.c +1 -2
  192. package/deps/librdkafka/tests/0091-max_poll_interval_timeout.c +5 -7
  193. package/deps/librdkafka/tests/0092-mixed_msgver.c +6 -0
  194. package/deps/librdkafka/tests/0093-holb.c +8 -5
  195. package/deps/librdkafka/tests/0094-idempotence_msg_timeout.c +1 -0
  196. package/deps/librdkafka/tests/0097-ssl_verify.cpp +262 -70
  197. package/deps/librdkafka/tests/0098-consumer-txn.cpp +16 -16
  198. package/deps/librdkafka/tests/0099-commit_metadata.c +1 -1
  199. package/deps/librdkafka/tests/0101-fetch-from-follower.cpp +1 -1
  200. package/deps/librdkafka/tests/0102-static_group_rebalance.c +317 -16
  201. package/deps/librdkafka/tests/0103-transactions.c +7 -7
  202. package/deps/librdkafka/tests/0104-fetch_from_follower_mock.c +1 -0
  203. package/deps/librdkafka/tests/0105-transactions_mock.c +18 -11
  204. package/deps/librdkafka/tests/0106-cgrp_sess_timeout.c +35 -14
  205. package/deps/librdkafka/tests/0107-topic_recreate.c +2 -2
  206. package/deps/librdkafka/tests/0109-auto_create_topics.cpp +86 -26
  207. package/deps/librdkafka/tests/0110-batch_size.cpp +1 -2
  208. package/deps/librdkafka/tests/0112-assign_unknown_part.c +3 -14
  209. package/deps/librdkafka/tests/0113-cooperative_rebalance.cpp +248 -104
  210. package/deps/librdkafka/tests/0114-sticky_partitioning.cpp +3 -3
  211. package/deps/librdkafka/tests/0115-producer_auth.cpp +4 -1
  212. package/deps/librdkafka/tests/0116-kafkaconsumer_close.cpp +7 -5
  213. package/deps/librdkafka/tests/0117-mock_errors.c +15 -5
  214. package/deps/librdkafka/tests/0118-commit_rebalance.c +41 -8
  215. package/deps/librdkafka/tests/0119-consumer_auth.cpp +20 -1
  216. package/deps/librdkafka/tests/0120-asymmetric_subscription.c +8 -3
  217. package/deps/librdkafka/tests/0125-immediate_flush.c +1 -1
  218. package/deps/librdkafka/tests/0126-oauthbearer_oidc.c +323 -8
  219. package/deps/librdkafka/tests/0129-fetch_aborted_msgs.c +1 -0
  220. package/deps/librdkafka/tests/0132-strategy_ordering.c +12 -4
  221. package/deps/librdkafka/tests/0133-ssl_keys.c +28 -6
  222. package/deps/librdkafka/tests/0137-barrier_batch_consume.c +24 -14
  223. package/deps/librdkafka/tests/0139-offset_validation_mock.c +510 -2
  224. package/deps/librdkafka/tests/0140-commit_metadata.cpp +1 -1
  225. package/deps/librdkafka/tests/0142-reauthentication.c +37 -17
  226. package/deps/librdkafka/tests/0143-exponential_backoff_mock.c +39 -40
  227. package/deps/librdkafka/tests/0146-metadata_mock.c +76 -15
  228. package/deps/librdkafka/tests/0147-consumer_group_consumer_mock.c +952 -0
  229. package/deps/librdkafka/tests/0148-offset_fetch_commit_error_mock.c +563 -0
  230. package/deps/librdkafka/tests/0149-broker-same-host-port.c +140 -0
  231. package/deps/librdkafka/tests/0150-telemetry_mock.c +9 -6
  232. package/deps/librdkafka/tests/0151-purge-brokers.c +566 -0
  233. package/deps/librdkafka/tests/0152-rebootstrap.c +59 -0
  234. package/deps/librdkafka/tests/0153-memberid.c +128 -0
  235. package/deps/librdkafka/tests/CMakeLists.txt +6 -0
  236. package/deps/librdkafka/tests/LibrdkafkaTestApp.py +34 -9
  237. package/deps/librdkafka/tests/autotest.sh +0 -0
  238. package/deps/librdkafka/tests/broker_version_tests.py +0 -0
  239. package/deps/librdkafka/tests/buildbox.sh +0 -0
  240. package/deps/librdkafka/tests/cleanup-checker-tests.sh +0 -0
  241. package/deps/librdkafka/tests/cluster_testing.py +0 -0
  242. package/deps/librdkafka/tests/delete-test-topics.sh +0 -0
  243. package/deps/librdkafka/tests/fixtures/oauthbearer/jwt_assertion_template.json +10 -0
  244. package/deps/librdkafka/tests/fixtures/ssl/client.keystore.intermediate.p12 +0 -0
  245. package/deps/librdkafka/tests/fixtures/ssl/client.keystore.p12 +0 -0
  246. package/deps/librdkafka/tests/fixtures/ssl/client2.certificate.intermediate.pem +72 -0
  247. package/deps/librdkafka/tests/fixtures/ssl/client2.certificate.pem +42 -101
  248. package/deps/librdkafka/tests/fixtures/ssl/client2.intermediate.key +46 -0
  249. package/deps/librdkafka/tests/fixtures/ssl/client2.key +41 -29
  250. package/deps/librdkafka/tests/fixtures/ssl/create_keys.sh +112 -37
  251. package/deps/librdkafka/tests/gen-ssl-certs.sh +0 -0
  252. package/deps/librdkafka/tests/interactive_broker_version.py +0 -0
  253. package/deps/librdkafka/tests/java/Makefile +2 -1
  254. package/deps/librdkafka/tests/java/run-class.sh +0 -0
  255. package/deps/librdkafka/tests/lz4_manual_test.sh +0 -0
  256. package/deps/librdkafka/tests/multi-broker-version-test.sh +0 -0
  257. package/deps/librdkafka/tests/parse-refcnt.sh +0 -0
  258. package/deps/librdkafka/tests/performance_plot.py +0 -0
  259. package/deps/librdkafka/tests/requirements.txt +1 -1
  260. package/deps/librdkafka/tests/run-all-tests.sh +79 -0
  261. package/deps/librdkafka/tests/run-consumer-tests.sh +0 -0
  262. package/deps/librdkafka/tests/run-producer-tests.sh +0 -0
  263. package/deps/librdkafka/tests/run-test-batches.py +157 -0
  264. package/deps/librdkafka/tests/run-test.sh +0 -0
  265. package/deps/librdkafka/tests/sasl_test.py +0 -0
  266. package/deps/librdkafka/tests/test.c +478 -18
  267. package/deps/librdkafka/tests/test.h +62 -13
  268. package/deps/librdkafka/tests/testcpp.cpp +6 -1
  269. package/deps/librdkafka/tests/testcpp.h +30 -2
  270. package/deps/librdkafka/tests/testshared.h +16 -2
  271. package/deps/librdkafka/tests/tools/stats/graph.py +0 -0
  272. package/deps/librdkafka/tests/tools/stats/to_csv.py +1 -1
  273. package/deps/librdkafka/tests/trivup/trivup-0.14.0.tar.gz +0 -0
  274. package/deps/librdkafka/tests/until-fail.sh +0 -0
  275. package/deps/librdkafka/tests/xxxx-metadata.cpp +1 -1
  276. package/deps/librdkafka/vcpkg.json +1 -1
  277. package/deps/librdkafka/win32/setup-msys2.ps1 +24 -8
  278. package/deps/librdkafka/win32/setup-vcpkg.ps1 +28 -6
  279. package/deps/librdkafka/win32/tests/tests.vcxproj +6 -0
  280. package/deps/librdkafka/win32/wingetopt.h +5 -4
  281. package/errors.d.ts +27 -1
  282. package/lib/error.js +29 -3
  283. package/make_docs.sh +0 -0
  284. package/package.json +10 -11
  285. package/run_docker.sh +0 -0
  286. package/src/callbacks.cc +6 -9
  287. package/src/callbacks.h +1 -5
  288. package/test/kafka-consumer-worker.js +10 -7
  289. package/test/kafka-consumer.spec.js +32 -21
  290. package/deps/librdkafka/.semaphore/project.yml +0 -43
  291. package/deps/librdkafka/.semaphore/project_public.yml +0 -20
  292. package/deps/librdkafka/win32/install-openssl.ps1 +0 -33
@@ -39,6 +39,9 @@
39
39
  static int32_t *avail_brokers;
40
40
  static size_t avail_broker_cnt;
41
41
 
42
+ #define group_configs_supported() \
43
+ (test_broker_version >= TEST_BRKVER(4, 0, 0, 0))
44
+
42
45
 
43
46
 
44
47
  static void do_test_CreateTopics(const char *what,
@@ -781,7 +784,7 @@ static void do_test_AlterConfigs(rd_kafka_t *rk, rd_kafka_queue_t *rkqu) {
781
784
  TEST_ASSERT(!err, "%s", rd_kafka_err2str(err));
782
785
 
783
786
  err = rd_kafka_ConfigResource_set_config(
784
- configs[ci], "offset.metadata.max.bytes", "12345");
787
+ configs[ci], "max.compaction.lag.ms", "3600000");
785
788
  TEST_ASSERT(!err, "%s", rd_kafka_err2str(err));
786
789
 
787
790
  if (test_broker_version >= TEST_BRKVER(2, 7, 0, 0))
@@ -902,7 +905,7 @@ static void do_test_AlterConfigs(rd_kafka_t *rk, rd_kafka_queue_t *rkqu) {
902
905
  */
903
906
  static void do_test_IncrementalAlterConfigs(rd_kafka_t *rk,
904
907
  rd_kafka_queue_t *rkqu) {
905
- #define MY_CONFRES_CNT 3
908
+ #define MY_CONFRES_CNT 4
906
909
  char *topics[MY_CONFRES_CNT];
907
910
  rd_kafka_ConfigResource_t *configs[MY_CONFRES_CNT];
908
911
  rd_kafka_AdminOptions_t *options;
@@ -935,6 +938,7 @@ static void do_test_IncrementalAlterConfigs(rd_kafka_t *rk,
935
938
  /** Test the test helper, for use in other tests. */
936
939
  do {
937
940
  const char *broker_id = tsprintf("%d", avail_brokers[0]);
941
+ const char *group_id = topics[0];
938
942
  const char *confs_set_append[] = {
939
943
  "compression.type", "SET", "lz4",
940
944
  "cleanup.policy", "APPEND", "compact"};
@@ -947,6 +951,10 @@ static void do_test_IncrementalAlterConfigs(rd_kafka_t *rk,
947
951
  const char *confs_delete_subtract_broker[] = {
948
952
  "background.threads", "DELETE", "",
949
953
  "log.cleanup.policy", "SUBTRACT", "compact"};
954
+ const char *confs_set_group[] = {"consumer.session.timeout.ms",
955
+ "SET", "50000"};
956
+ const char *confs_delete_group[] = {
957
+ "consumer.session.timeout.ms", "DELETE", ""};
950
958
 
951
959
  TEST_SAY("Testing test helper with SET and APPEND\n");
952
960
  test_IncrementalAlterConfigs_simple(rk, RD_KAFKA_RESOURCE_TOPIC,
@@ -969,6 +977,16 @@ static void do_test_IncrementalAlterConfigs(rd_kafka_t *rk,
969
977
  test_IncrementalAlterConfigs_simple(
970
978
  rk, RD_KAFKA_RESOURCE_BROKER, broker_id,
971
979
  confs_delete_subtract_broker, 2);
980
+ TEST_SAY(
981
+ "Testing test helper with SET with GROUP resource type\n");
982
+ test_IncrementalAlterConfigs_simple(
983
+ rk, RD_KAFKA_RESOURCE_GROUP, group_id, confs_set_group, 1);
984
+ TEST_SAY(
985
+ "Testing test helper with DELETE with GROUP resource "
986
+ "type\n");
987
+ test_IncrementalAlterConfigs_simple(rk, RD_KAFKA_RESOURCE_GROUP,
988
+ group_id,
989
+ confs_delete_group, 1);
972
990
  TEST_SAY("End testing test helper\n");
973
991
  } while (0);
974
992
 
@@ -1025,8 +1043,8 @@ static void do_test_IncrementalAlterConfigs(rd_kafka_t *rk,
1025
1043
  TEST_ASSERT(!error, "%s", rd_kafka_error_string(error));
1026
1044
 
1027
1045
  error = rd_kafka_ConfigResource_add_incremental_config(
1028
- configs[ci], "offset.metadata.max.bytes",
1029
- RD_KAFKA_ALTER_CONFIG_OP_TYPE_SET, "12345");
1046
+ configs[ci], "max.compaction.lag.ms",
1047
+ RD_KAFKA_ALTER_CONFIG_OP_TYPE_SET, "3600000");
1030
1048
  TEST_ASSERT(!error, "%s", rd_kafka_error_string(error));
1031
1049
 
1032
1050
  if (test_broker_version >= TEST_BRKVER(2, 7, 0, 0))
@@ -1035,6 +1053,23 @@ static void do_test_IncrementalAlterConfigs(rd_kafka_t *rk,
1035
1053
  exp_err[ci] = RD_KAFKA_RESP_ERR_UNKNOWN;
1036
1054
  ci++;
1037
1055
 
1056
+ /**
1057
+ * ConfigResource #3: valid group config
1058
+ */
1059
+ configs[ci] =
1060
+ rd_kafka_ConfigResource_new(RD_KAFKA_RESOURCE_GROUP, "my-group");
1061
+
1062
+ error = rd_kafka_ConfigResource_add_incremental_config(
1063
+ configs[ci], "consumer.session.timeout.ms",
1064
+ RD_KAFKA_ALTER_CONFIG_OP_TYPE_SET, "50000");
1065
+ TEST_ASSERT(!error, "%s", rd_kafka_error_string(error));
1066
+ if (group_configs_supported()) {
1067
+ exp_err[ci] = RD_KAFKA_RESP_ERR_NO_ERROR;
1068
+ } else {
1069
+ exp_err[ci] = RD_KAFKA_RESP_ERR_INVALID_REQUEST;
1070
+ }
1071
+ ci++;
1072
+
1038
1073
  /*
1039
1074
  * Timeout options
1040
1075
  */
@@ -1334,6 +1369,148 @@ retry_describe:
1334
1369
  SUB_TEST_PASS();
1335
1370
  }
1336
1371
 
1372
+ /**
1373
+ * @brief Test DescribeConfigs for groups
1374
+ */
1375
+ static void do_test_DescribeConfigs_groups(rd_kafka_t *rk,
1376
+ rd_kafka_queue_t *rkqu) {
1377
+ #define MY_CONFRES_CNT 1
1378
+ rd_kafka_ConfigResource_t *configs[MY_CONFRES_CNT];
1379
+ rd_kafka_AdminOptions_t *options;
1380
+ rd_kafka_resp_err_t exp_err[MY_CONFRES_CNT];
1381
+ rd_kafka_event_t *rkev;
1382
+ rd_kafka_resp_err_t err;
1383
+ const rd_kafka_DescribeConfigs_result_t *res;
1384
+ const rd_kafka_ConfigResource_t **rconfigs;
1385
+ char *group;
1386
+ size_t rconfig_cnt;
1387
+ char errstr[128];
1388
+ const char *errstr2;
1389
+ int ci = 0;
1390
+ int i;
1391
+ int fails = 0;
1392
+
1393
+ SUB_TEST_QUICK();
1394
+
1395
+ group = rd_strdup(test_mk_topic_name(__FUNCTION__, 1));
1396
+
1397
+ /*
1398
+ * ConfigResource #0: group config, for a non-existent group.
1399
+ */
1400
+ configs[ci] =
1401
+ rd_kafka_ConfigResource_new(RD_KAFKA_RESOURCE_GROUP, group);
1402
+ if (group_configs_supported()) {
1403
+ exp_err[ci] = RD_KAFKA_RESP_ERR_NO_ERROR;
1404
+ } else {
1405
+ exp_err[ci] = RD_KAFKA_RESP_ERR_INVALID_REQUEST;
1406
+ }
1407
+ ci++;
1408
+
1409
+ /*
1410
+ * Timeout options
1411
+ */
1412
+ options = rd_kafka_AdminOptions_new(rk, RD_KAFKA_ADMIN_OP_ANY);
1413
+ err = rd_kafka_AdminOptions_set_request_timeout(options, 10000, errstr,
1414
+ sizeof(errstr));
1415
+ TEST_ASSERT(!err, "%s", errstr);
1416
+
1417
+ /*
1418
+ * Fire off request
1419
+ */
1420
+ rd_kafka_DescribeConfigs(rk, configs, ci, options, rkqu);
1421
+
1422
+ /*
1423
+ * Wait for result
1424
+ */
1425
+ rkev = test_wait_admin_result(
1426
+ rkqu, RD_KAFKA_EVENT_DESCRIBECONFIGS_RESULT, 10000 + 1000);
1427
+
1428
+ /*
1429
+ * Extract result
1430
+ */
1431
+ res = rd_kafka_event_DescribeConfigs_result(rkev);
1432
+ TEST_ASSERT(res, "Expected DescribeConfigs result, not %s",
1433
+ rd_kafka_event_name(rkev));
1434
+
1435
+ err = rd_kafka_event_error(rkev);
1436
+ errstr2 = rd_kafka_event_error_string(rkev);
1437
+ TEST_ASSERT(!err, "Expected success, not %s: %s",
1438
+ rd_kafka_err2name(err), errstr2);
1439
+
1440
+ rconfigs = rd_kafka_DescribeConfigs_result_resources(res, &rconfig_cnt);
1441
+ TEST_ASSERT((int)rconfig_cnt == ci,
1442
+ "Expected %d result resources, got %" PRIusz "\n", ci,
1443
+ rconfig_cnt);
1444
+
1445
+ /*
1446
+ * Verify status per resource
1447
+ */
1448
+ for (i = 0; i < (int)rconfig_cnt; i++) {
1449
+ const rd_kafka_ConfigEntry_t **entries;
1450
+ size_t entry_cnt;
1451
+
1452
+ err = rd_kafka_ConfigResource_error(rconfigs[i]);
1453
+ errstr2 = rd_kafka_ConfigResource_error_string(rconfigs[i]);
1454
+
1455
+ entries =
1456
+ rd_kafka_ConfigResource_configs(rconfigs[i], &entry_cnt);
1457
+
1458
+ TEST_SAY(
1459
+ "ConfigResource #%d: type %s (%d), \"%s\": "
1460
+ "%" PRIusz " ConfigEntries, error %s (%s)\n",
1461
+ i,
1462
+ rd_kafka_ResourceType_name(
1463
+ rd_kafka_ConfigResource_type(rconfigs[i])),
1464
+ rd_kafka_ConfigResource_type(rconfigs[i]),
1465
+ rd_kafka_ConfigResource_name(rconfigs[i]), entry_cnt,
1466
+ rd_kafka_err2name(err), errstr2 ? errstr2 : "");
1467
+
1468
+ test_print_ConfigEntry_array(entries, entry_cnt, 1);
1469
+
1470
+ if (rd_kafka_ConfigResource_type(rconfigs[i]) !=
1471
+ rd_kafka_ConfigResource_type(configs[i]) ||
1472
+ strcmp(rd_kafka_ConfigResource_name(rconfigs[i]),
1473
+ rd_kafka_ConfigResource_name(configs[i]))) {
1474
+ TEST_FAIL_LATER(
1475
+ "ConfigResource #%d: "
1476
+ "expected type %s name %s, "
1477
+ "got type %s name %s",
1478
+ i,
1479
+ rd_kafka_ResourceType_name(
1480
+ rd_kafka_ConfigResource_type(configs[i])),
1481
+ rd_kafka_ConfigResource_name(configs[i]),
1482
+ rd_kafka_ResourceType_name(
1483
+ rd_kafka_ConfigResource_type(rconfigs[i])),
1484
+ rd_kafka_ConfigResource_name(rconfigs[i]));
1485
+ fails++;
1486
+ }
1487
+
1488
+ if (err != exp_err[i]) {
1489
+ TEST_FAIL_LATER(
1490
+ "ConfigResource #%d: "
1491
+ "expected %s (%d), got %s (%s)",
1492
+ i, rd_kafka_err2name(exp_err[i]), exp_err[i],
1493
+ rd_kafka_err2name(err), errstr2 ? errstr2 : "");
1494
+ fails++;
1495
+ }
1496
+ }
1497
+
1498
+ TEST_ASSERT(!fails, "See %d previous failure(s)", fails);
1499
+
1500
+ rd_kafka_event_destroy(rkev);
1501
+
1502
+ rd_kafka_ConfigResource_destroy_array(configs, ci);
1503
+
1504
+ rd_kafka_AdminOptions_destroy(options);
1505
+
1506
+ rd_free(group);
1507
+
1508
+ TEST_LATER_CHECK();
1509
+ #undef MY_CONFRES_CNT
1510
+
1511
+ SUB_TEST_PASS();
1512
+ }
1513
+
1337
1514
  /**
1338
1515
  * @brief Test CreateAcls
1339
1516
  */
@@ -1515,6 +1692,9 @@ do_test_DescribeAcls(rd_kafka_t *rk, rd_kafka_queue_t *useq, int version) {
1515
1692
  create_err =
1516
1693
  test_CreateAcls_simple(rk, NULL, acl_bindings_create, 2, NULL);
1517
1694
 
1695
+ /* Wait for ACL propagation. */
1696
+ rd_sleep(tmout_multip(2));
1697
+
1518
1698
  TEST_ASSERT(!create_err, "create error: %s",
1519
1699
  rd_kafka_err2str(create_err));
1520
1700
 
@@ -1927,6 +2107,9 @@ do_test_DeleteAcls(rd_kafka_t *rk, rd_kafka_queue_t *useq, int version) {
1927
2107
  create_err =
1928
2108
  test_CreateAcls_simple(rk, NULL, acl_bindings_create, 3, NULL);
1929
2109
 
2110
+ /* Wait for ACL propagation. */
2111
+ rd_sleep(tmout_multip(2));
2112
+
1930
2113
  TEST_ASSERT(!create_err, "create error: %s",
1931
2114
  rd_kafka_err2str(create_err));
1932
2115
 
@@ -1946,6 +2129,9 @@ do_test_DeleteAcls(rd_kafka_t *rk, rd_kafka_queue_t *useq, int version) {
1946
2129
  q);
1947
2130
  TIMING_ASSERT_LATER(&timing, 0, 50);
1948
2131
 
2132
+ /* Wait for ACL propagation. */
2133
+ rd_sleep(tmout_multip(2));
2134
+
1949
2135
  /*
1950
2136
  * Wait for result
1951
2137
  */
@@ -2062,6 +2248,9 @@ do_test_DeleteAcls(rd_kafka_t *rk, rd_kafka_queue_t *useq, int version) {
2062
2248
  q);
2063
2249
  TIMING_ASSERT_LATER(&timing, 0, 50);
2064
2250
 
2251
+ /* Wait for ACL propagation. */
2252
+ rd_sleep(1);
2253
+
2065
2254
  /*
2066
2255
  * Wait for result
2067
2256
  */
@@ -2634,135 +2823,63 @@ static void do_test_DeleteGroups(const char *what,
2634
2823
  }
2635
2824
 
2636
2825
  /**
2637
- * @brief Test list groups, creating consumers for a set of groups,
2638
- * listing and deleting them at the end.
2826
+ * @brief Helper for do_test_ListConsumerGroups, makes ListConsumerGroups call
2827
+ * and checks returned group count equals to \p exp_found.
2828
+ *
2829
+ * Parameter \p exp_type, if not UNKNOWN, needs to match
2830
+ * returned groups type.
2831
+ *
2832
+ * If \p match_states is true, then the state of the
2833
+ * returned groups is checked and expected to be `EMPTY`.
2639
2834
  */
2640
- static void do_test_ListConsumerGroups(const char *what,
2641
- rd_kafka_t *rk,
2642
- rd_kafka_queue_t *useq,
2643
- int request_timeout,
2644
- rd_bool_t match_states) {
2645
- #define TEST_LIST_CONSUMER_GROUPS_CNT 4
2646
- rd_kafka_queue_t *q;
2647
- rd_kafka_AdminOptions_t *options = NULL;
2648
- rd_kafka_event_t *rkev = NULL;
2649
- rd_kafka_resp_err_t err;
2650
- size_t valid_cnt, error_cnt;
2651
- rd_bool_t is_simple_consumer_group;
2652
- rd_kafka_consumer_group_state_t state;
2653
- char errstr[512];
2654
- const char *errstr2, *group_id;
2655
- char *list_consumer_groups[TEST_LIST_CONSUMER_GROUPS_CNT];
2656
- const int partitions_cnt = 1;
2657
- const int msgs_cnt = 100;
2658
- size_t i, found;
2659
- char *topic;
2660
- rd_kafka_metadata_topic_t exp_mdtopic = {0};
2661
- int64_t testid = test_id_generate();
2662
- test_timing_t timing;
2663
- rd_kafka_resp_err_t exp_err = RD_KAFKA_RESP_ERR_NO_ERROR;
2664
- const rd_kafka_ListConsumerGroups_result_t *res;
2665
- const rd_kafka_ConsumerGroupListing_t **groups;
2666
- rd_bool_t has_match_states =
2667
- test_broker_version >= TEST_BRKVER(2, 7, 0, 0);
2668
-
2669
- SUB_TEST_QUICK(
2670
- "%s ListConsumerGroups with %s, request_timeout %d"
2671
- ", match_states %s",
2672
- rd_kafka_name(rk), what, request_timeout, RD_STR_ToF(match_states));
2673
-
2674
- q = useq ? useq : rd_kafka_queue_new(rk);
2675
-
2676
- if (request_timeout != -1) {
2677
- options = rd_kafka_AdminOptions_new(
2678
- rk, RD_KAFKA_ADMIN_OP_LISTCONSUMERGROUPS);
2679
-
2680
- if (match_states) {
2681
- rd_kafka_consumer_group_state_t empty =
2682
- RD_KAFKA_CONSUMER_GROUP_STATE_EMPTY;
2683
-
2684
- TEST_CALL_ERROR__(
2685
- rd_kafka_AdminOptions_set_match_consumer_group_states(
2686
- options, &empty, 1));
2687
- }
2688
-
2689
- TEST_CALL_ERR__(rd_kafka_AdminOptions_set_request_timeout(
2690
- options, request_timeout, errstr, sizeof(errstr)));
2691
- }
2692
-
2693
-
2694
- topic = rd_strdup(test_mk_topic_name(__FUNCTION__, 1));
2695
- exp_mdtopic.topic = topic;
2696
-
2697
- /* Create the topics first. */
2698
- test_CreateTopics_simple(rk, NULL, &topic, 1, partitions_cnt, NULL);
2699
-
2700
- /* Verify that topics are reported by metadata */
2701
- test_wait_metadata_update(rk, &exp_mdtopic, 1, NULL, 0, 15 * 1000);
2702
-
2703
- /* Produce 100 msgs */
2704
- test_produce_msgs_easy(topic, testid, 0, msgs_cnt);
2705
-
2706
- for (i = 0; i < TEST_LIST_CONSUMER_GROUPS_CNT; i++) {
2707
- char *group = rd_strdup(test_mk_topic_name(__FUNCTION__, 1));
2708
- test_consume_msgs_easy(group, topic, testid, -1, msgs_cnt,
2709
- NULL);
2710
- list_consumer_groups[i] = group;
2711
- }
2835
+ static void
2836
+ test_ListConsumerGroups_helper(rd_kafka_t *rk,
2837
+ rd_kafka_AdminOptions_t *option,
2838
+ rd_kafka_queue_t *q,
2839
+ char **list_consumer_groups,
2840
+ size_t list_consumer_groups_cnt,
2841
+ size_t exp_found,
2842
+ rd_kafka_consumer_group_type_t exp_type,
2843
+ rd_bool_t match_states) {
2844
+ rd_kafka_event_t *rkev = NULL;
2845
+ const rd_kafka_ListConsumerGroups_result_t *result = NULL;
2846
+ size_t group_cnt;
2847
+ size_t error_cnt;
2848
+ size_t found;
2849
+ size_t i, j;
2850
+ const rd_kafka_ConsumerGroupListing_t **groups = NULL;
2712
2851
 
2713
- TIMING_START(&timing, "ListConsumerGroups");
2714
2852
  TEST_SAY("Call ListConsumerGroups\n");
2715
- rd_kafka_ListConsumerGroups(rk, options, q);
2716
- TIMING_ASSERT_LATER(&timing, 0, 50);
2717
-
2718
- TIMING_START(&timing, "ListConsumerGroups.queue_poll");
2719
-
2853
+ rd_kafka_ListConsumerGroups(rk, option, q);
2720
2854
  /* Poll result queue for ListConsumerGroups result.
2721
2855
  * Print but otherwise ignore other event types
2722
2856
  * (typically generic Error events). */
2723
2857
  while (1) {
2724
2858
  rkev = rd_kafka_queue_poll(q, tmout_multip(20 * 1000));
2725
- TEST_SAY("ListConsumerGroups: got %s in %.3fms\n",
2726
- rd_kafka_event_name(rkev),
2727
- TIMING_DURATION(&timing) / 1000.0f);
2728
2859
  if (rkev == NULL)
2729
2860
  continue;
2861
+
2730
2862
  if (rd_kafka_event_error(rkev))
2731
2863
  TEST_SAY("%s: %s\n", rd_kafka_event_name(rkev),
2732
2864
  rd_kafka_event_error_string(rkev));
2733
2865
 
2734
2866
  if (rd_kafka_event_type(rkev) ==
2735
- RD_KAFKA_EVENT_LISTCONSUMERGROUPS_RESULT) {
2867
+ RD_KAFKA_EVENT_LISTCONSUMERGROUPS_RESULT)
2736
2868
  break;
2737
- }
2738
2869
 
2739
2870
  rd_kafka_event_destroy(rkev);
2740
2871
  }
2741
2872
  /* Convert event to proper result */
2742
- res = rd_kafka_event_ListConsumerGroups_result(rkev);
2743
- TEST_ASSERT(res, "expected ListConsumerGroups_result, got %s",
2873
+ result = rd_kafka_event_ListConsumerGroups_result(rkev);
2874
+ TEST_ASSERT(result, "expected ListConsumerGroups_result, got %s",
2744
2875
  rd_kafka_event_name(rkev));
2745
2876
 
2746
- /* Expecting error */
2747
- err = rd_kafka_event_error(rkev);
2748
- errstr2 = rd_kafka_event_error_string(rkev);
2749
- TEST_ASSERT(err == exp_err,
2750
- "expected ListConsumerGroups to return %s, got %s (%s)",
2751
- rd_kafka_err2str(exp_err), rd_kafka_err2str(err),
2752
- err ? errstr2 : "n/a");
2753
-
2754
- TEST_SAY("ListConsumerGroups: returned %s (%s)\n",
2755
- rd_kafka_err2str(err), err ? errstr2 : "n/a");
2756
-
2757
- groups = rd_kafka_ListConsumerGroups_result_valid(res, &valid_cnt);
2758
- rd_kafka_ListConsumerGroups_result_errors(res, &error_cnt);
2877
+ if (rd_kafka_event_error(rkev))
2878
+ TEST_FAIL("ListConsumerGroups failed with %s",
2879
+ rd_kafka_event_error_string(rkev));
2759
2880
 
2760
- /* Other tests could be running */
2761
- TEST_ASSERT(valid_cnt >= TEST_LIST_CONSUMER_GROUPS_CNT,
2762
- "expected ListConsumerGroups to return at least %" PRId32
2763
- " valid groups,"
2764
- " got %zu",
2765
- TEST_LIST_CONSUMER_GROUPS_CNT, valid_cnt);
2881
+ groups = rd_kafka_ListConsumerGroups_result_valid(result, &group_cnt);
2882
+ rd_kafka_ListConsumerGroups_result_errors(result, &error_cnt);
2766
2883
 
2767
2884
  TEST_ASSERT(error_cnt == 0,
2768
2885
  "expected ListConsumerGroups to return 0 errors,"
@@ -2770,23 +2887,32 @@ static void do_test_ListConsumerGroups(const char *what,
2770
2887
  error_cnt);
2771
2888
 
2772
2889
  found = 0;
2773
- for (i = 0; i < valid_cnt; i++) {
2774
- int j;
2775
- const rd_kafka_ConsumerGroupListing_t *group;
2776
- group = groups[i];
2777
- group_id = rd_kafka_ConsumerGroupListing_group_id(group);
2778
- is_simple_consumer_group =
2890
+ for (i = 0; i < group_cnt; i++) {
2891
+ const rd_kafka_ConsumerGroupListing_t *group = groups[i];
2892
+ const char *group_id =
2893
+ rd_kafka_ConsumerGroupListing_group_id(group);
2894
+ int is_simple_consumer_group =
2779
2895
  rd_kafka_ConsumerGroupListing_is_simple_consumer_group(
2780
2896
  group);
2781
- state = rd_kafka_ConsumerGroupListing_state(group);
2782
- for (j = 0; j < TEST_LIST_CONSUMER_GROUPS_CNT; j++) {
2897
+ rd_kafka_consumer_group_state_t state =
2898
+ rd_kafka_ConsumerGroupListing_state(group);
2899
+ rd_kafka_consumer_group_type_t type =
2900
+ rd_kafka_ConsumerGroupListing_type(group);
2901
+ for (j = 0; j < list_consumer_groups_cnt; j++) {
2783
2902
  if (!strcmp(list_consumer_groups[j], group_id)) {
2784
2903
  found++;
2785
2904
  TEST_ASSERT(!is_simple_consumer_group,
2786
2905
  "expected a normal group,"
2787
2906
  " got a simple group");
2907
+ if (exp_type !=
2908
+ RD_KAFKA_CONSUMER_GROUP_TYPE_UNKNOWN) {
2909
+ TEST_ASSERT(
2910
+ type == exp_type,
2911
+ "Expected the Consumer Group Type "
2912
+ "to be set by the Broker.");
2913
+ }
2788
2914
 
2789
- if (!has_match_states)
2915
+ if (!match_states)
2790
2916
  break;
2791
2917
 
2792
2918
  TEST_ASSERT(
@@ -2799,13 +2925,137 @@ static void do_test_ListConsumerGroups(const char *what,
2799
2925
  }
2800
2926
  }
2801
2927
  }
2802
- TEST_ASSERT(found == TEST_LIST_CONSUMER_GROUPS_CNT,
2803
- "expected to find %d"
2804
- " started groups,"
2928
+
2929
+ TEST_ASSERT(found == exp_found,
2930
+ "expected to find %" PRIusz
2931
+ " consumer groups,"
2805
2932
  " got %" PRIusz,
2806
- TEST_LIST_CONSUMER_GROUPS_CNT, found);
2933
+ exp_found, found);
2807
2934
 
2808
2935
  rd_kafka_event_destroy(rkev);
2936
+ }
2937
+
2938
+ /**
2939
+ * @brief Test list groups, creating consumers for a set of groups,
2940
+ * listing and deleting them at the end.
2941
+ */
2942
+ static void do_test_ListConsumerGroups(const char *what,
2943
+ rd_kafka_t *rk,
2944
+ rd_kafka_queue_t *useq,
2945
+ int request_timeout,
2946
+ rd_bool_t match_states,
2947
+ rd_bool_t match_types) {
2948
+ #define TEST_LIST_CONSUMER_GROUPS_CNT 4
2949
+ rd_kafka_queue_t *q;
2950
+ rd_kafka_AdminOptions_t *options;
2951
+ char errstr[512];
2952
+ char *list_consumer_groups[TEST_LIST_CONSUMER_GROUPS_CNT];
2953
+ const int partitions_cnt = 1;
2954
+ const int msgs_cnt = 100;
2955
+ char *topic;
2956
+ size_t i;
2957
+ rd_kafka_metadata_topic_t exp_mdtopic = {0};
2958
+ int64_t testid = test_id_generate();
2959
+ rd_bool_t has_match_states =
2960
+ test_broker_version >= TEST_BRKVER(2, 7, 0, 0);
2961
+ rd_bool_t has_match_types =
2962
+ test_broker_version >= TEST_BRKVER(3, 8, 0, 0);
2963
+
2964
+ rd_kafka_consumer_group_type_t group_protocol_in_use =
2965
+ RD_KAFKA_CONSUMER_GROUP_TYPE_UNKNOWN;
2966
+ rd_kafka_consumer_group_type_t group_protocol_not_in_use =
2967
+ RD_KAFKA_CONSUMER_GROUP_TYPE_UNKNOWN;
2968
+
2969
+ SUB_TEST_QUICK(
2970
+ "%s ListConsumerGroups with %s, request_timeout %d"
2971
+ ", match_states %s, match_types %s",
2972
+ rd_kafka_name(rk), what, request_timeout, RD_STR_ToF(match_states),
2973
+ RD_STR_ToF(match_types));
2974
+
2975
+ /* match_states would not work if broker version is below 2.7.0 */
2976
+ if (!has_match_states)
2977
+ match_states = rd_false;
2978
+
2979
+ /* match_types would not work if broker version is below 3.8.0 */
2980
+ if (!has_match_types)
2981
+ match_types = rd_false;
2982
+
2983
+ q = useq ? useq : rd_kafka_queue_new(rk);
2984
+
2985
+ options =
2986
+ rd_kafka_AdminOptions_new(rk, RD_KAFKA_ADMIN_OP_LISTCONSUMERGROUPS);
2987
+
2988
+ if (request_timeout != -1) {
2989
+ TEST_CALL_ERR__(rd_kafka_AdminOptions_set_request_timeout(
2990
+ options, request_timeout, errstr, sizeof(errstr)));
2991
+ }
2992
+
2993
+ if (match_states) {
2994
+ rd_kafka_consumer_group_state_t empty =
2995
+ RD_KAFKA_CONSUMER_GROUP_STATE_EMPTY;
2996
+
2997
+ TEST_CALL_ERROR__(
2998
+ rd_kafka_AdminOptions_set_match_consumer_group_states(
2999
+ options, &empty, 1));
3000
+ }
3001
+
3002
+ if (match_types) {
3003
+ if (test_consumer_group_protocol_classic()) {
3004
+ group_protocol_in_use =
3005
+ RD_KAFKA_CONSUMER_GROUP_TYPE_CLASSIC;
3006
+ group_protocol_not_in_use =
3007
+ RD_KAFKA_CONSUMER_GROUP_TYPE_CONSUMER;
3008
+ } else {
3009
+ group_protocol_in_use =
3010
+ RD_KAFKA_CONSUMER_GROUP_TYPE_CONSUMER;
3011
+ group_protocol_not_in_use =
3012
+ RD_KAFKA_CONSUMER_GROUP_TYPE_CLASSIC;
3013
+ }
3014
+ TEST_CALL_ERROR__(
3015
+ rd_kafka_AdminOptions_set_match_consumer_group_types(
3016
+ options, &group_protocol_in_use, 1));
3017
+ }
3018
+
3019
+ topic = rd_strdup(test_mk_topic_name(__FUNCTION__, 1));
3020
+ exp_mdtopic.topic = topic;
3021
+
3022
+ /* Create the topics first. */
3023
+ test_CreateTopics_simple(rk, NULL, &topic, 1, partitions_cnt, NULL);
3024
+
3025
+ /* Verify that topics are reported by metadata */
3026
+ test_wait_metadata_update(rk, &exp_mdtopic, 1, NULL, 0, 15 * 1000);
3027
+
3028
+ /* Produce 100 msgs */
3029
+ test_produce_msgs_easy(topic, testid, 0, msgs_cnt);
3030
+
3031
+ for (i = 0; i < TEST_LIST_CONSUMER_GROUPS_CNT; i++) {
3032
+ char *group = rd_strdup(test_mk_topic_name(__FUNCTION__, 1));
3033
+ test_consume_msgs_easy(group, topic, testid, -1, msgs_cnt,
3034
+ NULL);
3035
+ list_consumer_groups[i] = group;
3036
+ }
3037
+
3038
+ test_ListConsumerGroups_helper(rk, options, q, list_consumer_groups,
3039
+ TEST_LIST_CONSUMER_GROUPS_CNT,
3040
+ TEST_LIST_CONSUMER_GROUPS_CNT,
3041
+ group_protocol_in_use, has_match_states);
3042
+
3043
+ if (match_types) {
3044
+ /* Simply test with the option of protocol not in use */
3045
+ rd_kafka_AdminOptions_t *option_group_protocol_not_in_use =
3046
+ rd_kafka_AdminOptions_new(
3047
+ rk, RD_KAFKA_ADMIN_OP_LISTCONSUMERGROUPS);
3048
+ rd_kafka_AdminOptions_set_match_consumer_group_types(
3049
+ option_group_protocol_not_in_use,
3050
+ &group_protocol_not_in_use, 1);
3051
+
3052
+ test_ListConsumerGroups_helper(
3053
+ rk, option_group_protocol_not_in_use, q,
3054
+ list_consumer_groups, TEST_LIST_CONSUMER_GROUPS_CNT, 0,
3055
+ group_protocol_not_in_use, rd_false);
3056
+
3057
+ rd_kafka_AdminOptions_destroy(option_group_protocol_not_in_use);
3058
+ }
2809
3059
 
2810
3060
  test_DeleteGroups_simple(rk, NULL, (char **)list_consumer_groups,
2811
3061
  TEST_LIST_CONSUMER_GROUPS_CNT, NULL);
@@ -2816,8 +3066,7 @@ static void do_test_ListConsumerGroups(const char *what,
2816
3066
 
2817
3067
  rd_free(topic);
2818
3068
 
2819
- if (options)
2820
- rd_kafka_AdminOptions_destroy(options);
3069
+ rd_kafka_AdminOptions_destroy(options);
2821
3070
 
2822
3071
  if (!useq)
2823
3072
  rd_kafka_queue_destroy(q);
@@ -3363,6 +3612,9 @@ static void do_test_DescribeTopics(const char *what,
3363
3612
  test_CreateAcls_simple(rk, NULL, acl_bindings, 1, NULL));
3364
3613
  rd_kafka_AclBinding_destroy(acl_bindings[0]);
3365
3614
 
3615
+ /* Wait for ACL propagation. */
3616
+ rd_sleep(tmout_multip(2));
3617
+
3366
3618
  /* Call DescribeTopics. */
3367
3619
  options =
3368
3620
  rd_kafka_AdminOptions_new(rk, RD_KAFKA_ADMIN_OP_DESCRIBETOPICS);
@@ -3422,19 +3674,21 @@ static void do_test_DescribeTopics(const char *what,
3422
3674
  rd_kafka_event_destroy(rkev);
3423
3675
 
3424
3676
  /*
3425
- * Allow RD_KAFKA_ACL_OPERATION_DELETE to allow deletion
3426
- * of the created topic as currently our principal only has read
3427
- * and describe.
3677
+ * Remove create ACLs to allow deletion
3678
+ * of the created topic.
3428
3679
  */
3429
3680
  acl_bindings[0] = rd_kafka_AclBinding_new(
3430
3681
  RD_KAFKA_RESOURCE_TOPIC, topic_names[0],
3431
3682
  RD_KAFKA_RESOURCE_PATTERN_LITERAL, principal, "*",
3432
- RD_KAFKA_ACL_OPERATION_DELETE, RD_KAFKA_ACL_PERMISSION_TYPE_ALLOW,
3683
+ RD_KAFKA_ACL_OPERATION_READ, RD_KAFKA_ACL_PERMISSION_TYPE_ALLOW,
3433
3684
  NULL, 0);
3434
3685
  TEST_CALL_ERR__(
3435
- test_CreateAcls_simple(rk, NULL, acl_bindings, 1, NULL));
3686
+ test_DeleteAcls_simple(rk, NULL, acl_bindings, 1, NULL));
3436
3687
  rd_kafka_AclBinding_destroy(acl_bindings[0]);
3437
3688
 
3689
+ /* Wait for ACL propagation. */
3690
+ rd_sleep(tmout_multip(2));
3691
+
3438
3692
  done:
3439
3693
  test_DeleteTopics_simple(rk, NULL, topic_names, 1, NULL);
3440
3694
  if (!rkqu)
@@ -3585,6 +3839,9 @@ static void do_test_DescribeCluster(const char *what,
3585
3839
  test_CreateAcls_simple(rk, NULL, acl_bindings, 1, NULL);
3586
3840
  rd_kafka_AclBinding_destroy(acl_bindings[0]);
3587
3841
 
3842
+ /* Wait for ACL propagation. */
3843
+ rd_sleep(tmout_multip(2));
3844
+
3588
3845
  /* Call DescribeCluster. */
3589
3846
  options =
3590
3847
  rd_kafka_AdminOptions_new(rk, RD_KAFKA_ADMIN_OP_DESCRIBECLUSTER);
@@ -3646,6 +3903,9 @@ static void do_test_DescribeCluster(const char *what,
3646
3903
  test_DeleteAcls_simple(rk, NULL, &acl_bindings_delete, 1, NULL);
3647
3904
  rd_kafka_AclBinding_destroy(acl_bindings_delete);
3648
3905
 
3906
+ /* Wait for ACL propagation. */
3907
+ rd_sleep(tmout_multip(2));
3908
+
3649
3909
  done:
3650
3910
  TEST_LATER_CHECK();
3651
3911
 
@@ -3752,16 +4012,27 @@ do_test_DescribeConsumerGroups_with_authorized_ops(const char *what,
3752
4012
  rd_kafka_error_string(error));
3753
4013
 
3754
4014
  {
3755
- const rd_kafka_AclOperation_t expected[] = {
4015
+ const rd_kafka_AclOperation_t expected_ak3[] = {
3756
4016
  RD_KAFKA_ACL_OPERATION_DELETE,
3757
4017
  RD_KAFKA_ACL_OPERATION_DESCRIBE,
3758
4018
  RD_KAFKA_ACL_OPERATION_READ};
4019
+ const rd_kafka_AclOperation_t expected_ak4[] = {
4020
+ RD_KAFKA_ACL_OPERATION_DELETE,
4021
+ RD_KAFKA_ACL_OPERATION_DESCRIBE,
4022
+ RD_KAFKA_ACL_OPERATION_READ,
4023
+ RD_KAFKA_ACL_OPERATION_DESCRIBE_CONFIGS,
4024
+ RD_KAFKA_ACL_OPERATION_ALTER_CONFIGS};
3759
4025
  authorized_operations =
3760
4026
  rd_kafka_ConsumerGroupDescription_authorized_operations(
3761
4027
  results[0], &authorized_operations_cnt);
3762
- test_match_authorized_operations(expected, 3,
3763
- authorized_operations,
3764
- authorized_operations_cnt);
4028
+ if (test_broker_version < TEST_BRKVER(4, 0, 0, 0))
4029
+ test_match_authorized_operations(
4030
+ expected_ak3, 3, authorized_operations,
4031
+ authorized_operations_cnt);
4032
+ else
4033
+ test_match_authorized_operations(
4034
+ expected_ak4, 5, authorized_operations,
4035
+ authorized_operations_cnt);
3765
4036
  }
3766
4037
 
3767
4038
  rd_kafka_event_destroy(rkev);
@@ -3835,13 +4106,12 @@ do_test_DescribeConsumerGroups_with_authorized_ops(const char *what,
3835
4106
  acl_bindings[0] = rd_kafka_AclBinding_new(
3836
4107
  RD_KAFKA_RESOURCE_GROUP, group_id,
3837
4108
  RD_KAFKA_RESOURCE_PATTERN_LITERAL, principal, "*",
3838
- RD_KAFKA_ACL_OPERATION_DELETE, RD_KAFKA_ACL_PERMISSION_TYPE_ALLOW,
4109
+ RD_KAFKA_ACL_OPERATION_READ, RD_KAFKA_ACL_PERMISSION_TYPE_ALLOW,
3839
4110
  NULL, 0);
3840
- test_CreateAcls_simple(rk, NULL, acl_bindings, 1, NULL);
4111
+ test_DeleteAcls_simple(rk, NULL, acl_bindings, 1, NULL);
3841
4112
  rd_kafka_AclBinding_destroy(acl_bindings[0]);
3842
4113
 
3843
- /* It seems to be taking some time on the cluster for the ACLs to
3844
- * propagate for a group.*/
4114
+ /* Wait for ACL propagation. */
3845
4115
  rd_sleep(tmout_multip(2));
3846
4116
 
3847
4117
  test_DeleteGroups_simple(rk, NULL, &group_id, 1, NULL);
@@ -3938,8 +4208,6 @@ static void do_test_DeleteConsumerGroupOffsets(const char *what,
3938
4208
  test_wait_metadata_update(rk, exp_mdtopics, exp_mdtopic_cnt, NULL, 0,
3939
4209
  15 * 1000);
3940
4210
 
3941
- rd_sleep(1); /* Additional wait time for cluster propagation */
3942
-
3943
4211
  consumer = test_create_consumer(groupid, NULL, NULL, NULL);
3944
4212
 
3945
4213
  if (sub_consumer) {
@@ -4215,8 +4483,6 @@ static void do_test_AlterConsumerGroupOffsets(const char *what,
4215
4483
  test_wait_metadata_update(rk, exp_mdtopics, exp_mdtopic_cnt,
4216
4484
  NULL, 0, 15 * 1000);
4217
4485
 
4218
- rd_sleep(1); /* Additional wait time for cluster propagation */
4219
-
4220
4486
  consumer = test_create_consumer(group_id, NULL, NULL, NULL);
4221
4487
 
4222
4488
  if (sub_consumer) {
@@ -4499,8 +4765,6 @@ static void do_test_ListConsumerGroupOffsets(const char *what,
4499
4765
  test_wait_metadata_update(rk, exp_mdtopics, exp_mdtopic_cnt, NULL, 0,
4500
4766
  15 * 1000);
4501
4767
 
4502
- rd_sleep(1); /* Additional wait time for cluster propagation */
4503
-
4504
4768
  consumer = test_create_consumer(group_id, NULL, NULL, NULL);
4505
4769
 
4506
4770
  if (sub_consumer) {
@@ -4681,7 +4945,7 @@ static void do_test_UserScramCredentials(const char *what,
4681
4945
  size_t password_size = 8;
4682
4946
  rd_kafka_queue_t *queue;
4683
4947
  const char *users[1];
4684
- users[0] = "testuserforscram";
4948
+ users[0] = test_mk_topic_name("testuserforscram", 1);
4685
4949
 
4686
4950
  if (null_bytes) {
4687
4951
  salt[1] = '\0';
@@ -4801,6 +5065,9 @@ static void do_test_UserScramCredentials(const char *what,
4801
5065
  rd_kafka_event_destroy(event);
4802
5066
  #endif
4803
5067
 
5068
+ /* Wait for user propagation. */
5069
+ rd_sleep(tmout_multip(2));
5070
+
4804
5071
  /* Credential should be retrieved */
4805
5072
  options = rd_kafka_AdminOptions_new(
4806
5073
  rk, RD_KAFKA_ADMIN_OP_DESCRIBEUSERSCRAMCREDENTIALS);
@@ -4913,6 +5180,9 @@ static void do_test_UserScramCredentials(const char *what,
4913
5180
  final_checks:
4914
5181
  #endif
4915
5182
 
5183
+ /* Wait for user propagation. */
5184
+ rd_sleep(tmout_multip(2));
5185
+
4916
5186
  /* Credential doesn't exist anymore for this user */
4917
5187
 
4918
5188
  options = rd_kafka_AdminOptions_new(
@@ -5013,6 +5283,8 @@ static void do_test_ListOffsets(const char *what,
5013
5283
 
5014
5284
  test_CreateTopics_simple(rk, NULL, (char **)&topic, 1, 1, NULL);
5015
5285
 
5286
+ test_wait_topic_exists(rk, topic, 5000);
5287
+
5016
5288
  p = test_create_producer();
5017
5289
  for (i = 0; i < RD_ARRAY_SIZE(timestamps); i++) {
5018
5290
  rd_kafka_producev(
@@ -5081,6 +5353,15 @@ static void do_test_ListOffsets(const char *what,
5081
5353
  test_fixture.query);
5082
5354
  continue;
5083
5355
  }
5356
+ if (test_fixture.query == RD_KAFKA_OFFSET_SPEC_MAX_TIMESTAMP &&
5357
+ test_broker_version >= TEST_BRKVER(3, 7, 0, 0) &&
5358
+ test_broker_version < TEST_BRKVER(3, 8, 0, 0)) {
5359
+ /* 3.8.0 released fix for KAFKA-16310 */
5360
+ TEST_SAY(
5361
+ "Skipping offset MAX_TIMESTAMP,"
5362
+ " as there was a regression in this version\n");
5363
+ continue;
5364
+ }
5084
5365
 
5085
5366
  TEST_SAY("Testing offset %" PRId64 "\n", test_fixture.query);
5086
5367
 
@@ -5171,7 +5452,9 @@ static void do_test_apis(rd_kafka_type_t cltype) {
5171
5452
  mainq = rd_kafka_queue_get_main(rk);
5172
5453
 
5173
5454
  /* Create topics */
5174
- do_test_CreateTopics("temp queue, op timeout 0", rk, NULL, 0, 0);
5455
+ /* FIXME: KRaft async CreateTopics is working differently than
5456
+ * wth Zookeeper
5457
+ * do_test_CreateTopics("temp queue, op timeout 0", rk, NULL, 0, 0); */
5175
5458
  do_test_CreateTopics("temp queue, op timeout 15000", rk, NULL, 15000,
5176
5459
  0);
5177
5460
  do_test_CreateTopics(
@@ -5183,15 +5466,20 @@ static void do_test_apis(rd_kafka_type_t cltype) {
5183
5466
  do_test_CreateTopics("main queue, options", rk, mainq, -1, 0);
5184
5467
 
5185
5468
  /* Delete topics */
5186
- do_test_DeleteTopics("temp queue, op timeout 0", rk, NULL, 0);
5469
+ /* FIXME: KRaft async DeleteTopics is working differently than
5470
+ * with Zookeeper
5471
+ * do_test_DeleteTopics("temp queue, op timeout 0", rk, NULL, 0); */
5187
5472
  do_test_DeleteTopics("main queue, op timeout 15000", rk, mainq, 1500);
5188
5473
 
5189
5474
  if (test_broker_version >= TEST_BRKVER(1, 0, 0, 0)) {
5190
5475
  /* Create Partitions */
5191
5476
  do_test_CreatePartitions("temp queue, op timeout 6500", rk,
5192
5477
  NULL, 6500);
5193
- do_test_CreatePartitions("main queue, op timeout 0", rk, mainq,
5194
- 0);
5478
+ /* FIXME: KRaft async CreatePartitions is working differently
5479
+ * than with Zookeeper
5480
+ * do_test_CreatePartitions("main queue, op timeout 0", rk,
5481
+ * mainq, 0);
5482
+ */
5195
5483
  }
5196
5484
 
5197
5485
  /* CreateAcls */
@@ -5216,18 +5504,29 @@ static void do_test_apis(rd_kafka_type_t cltype) {
5216
5504
 
5217
5505
  /* DescribeConfigs */
5218
5506
  do_test_DescribeConfigs(rk, mainq);
5507
+ do_test_DescribeConfigs_groups(rk, mainq);
5219
5508
 
5220
5509
  /* Delete records */
5221
5510
  do_test_DeleteRecords("temp queue, op timeout 0", rk, NULL, 0);
5222
5511
  do_test_DeleteRecords("main queue, op timeout 1500", rk, mainq, 1500);
5223
5512
 
5224
5513
  /* List groups */
5225
- do_test_ListConsumerGroups("temp queue", rk, NULL, -1, rd_false);
5226
- do_test_ListConsumerGroups("main queue", rk, mainq, 1500, rd_true);
5227
-
5228
- /* Describe groups */
5229
- do_test_DescribeConsumerGroups("temp queue", rk, NULL, -1);
5230
- do_test_DescribeConsumerGroups("main queue", rk, mainq, 1500);
5514
+ do_test_ListConsumerGroups("temp queue", rk, NULL, -1, rd_false,
5515
+ rd_true);
5516
+ do_test_ListConsumerGroups("temp queue", rk, NULL, -1, rd_false,
5517
+ rd_false);
5518
+ do_test_ListConsumerGroups("main queue", rk, mainq, 1500, rd_true,
5519
+ rd_true);
5520
+ do_test_ListConsumerGroups("main queue", rk, mainq, 1500, rd_true,
5521
+ rd_false);
5522
+
5523
+ /* TODO: check this test after KIP-848 admin operation
5524
+ * implementation */
5525
+ if (test_consumer_group_protocol_classic()) {
5526
+ /* Describe groups */
5527
+ do_test_DescribeConsumerGroups("temp queue", rk, NULL, -1);
5528
+ do_test_DescribeConsumerGroups("main queue", rk, mainq, 1500);
5529
+ }
5231
5530
 
5232
5531
  /* Describe topics */
5233
5532
  do_test_DescribeTopics("temp queue", rk, NULL, 15000, rd_false);
@@ -5279,6 +5578,7 @@ static void do_test_apis(rd_kafka_type_t cltype) {
5279
5578
  do_test_AlterConsumerGroupOffsets(
5280
5579
  "main queue, nonexistent topics", rk, mainq, 1500, rd_false,
5281
5580
  rd_false /* don't create topics */);
5581
+
5282
5582
  do_test_AlterConsumerGroupOffsets(
5283
5583
  "main queue", rk, mainq, 1500,
5284
5584
  rd_true, /*with subscribing consumer*/