@ohos-ports/confluentinc-kafka-javascript 1.10.0-beta.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.
- package/CHANGELOG.md +457 -0
- package/LICENSE.kafkajs +31 -0
- package/LICENSE.node-rdkafka +25 -0
- package/LICENSE.txt +20 -0
- package/README.md +133 -0
- package/binding.gyp +184 -0
- package/build/Release/confluent-kafka-javascript.node +0 -0
- package/build/deps/librdkafka++.so.1 +0 -0
- package/build/deps/librdkafka.Makefile +6 -0
- package/build/deps/librdkafka.so.1 +0 -0
- package/build/deps/librdkafka.target.mk +55 -0
- package/deps/librdkafka/.clang-format +136 -0
- package/deps/librdkafka/.clang-format-cpp +103 -0
- package/deps/librdkafka/.dir-locals.el +10 -0
- package/deps/librdkafka/.formatignore +35 -0
- package/deps/librdkafka/.gdbmacros +19 -0
- package/deps/librdkafka/CHANGELOG.md +2477 -0
- package/deps/librdkafka/CMakeLists.txt +291 -0
- package/deps/librdkafka/CODE_OF_CONDUCT.md +46 -0
- package/deps/librdkafka/CONFIGURATION.md +212 -0
- package/deps/librdkafka/CONTRIBUTING.md +431 -0
- package/deps/librdkafka/Doxyfile +2375 -0
- package/deps/librdkafka/INTRODUCTION.md +2752 -0
- package/deps/librdkafka/LICENSE +26 -0
- package/deps/librdkafka/LICENSE.cjson +22 -0
- package/deps/librdkafka/LICENSE.crc32c +28 -0
- package/deps/librdkafka/LICENSE.fnv1a +18 -0
- package/deps/librdkafka/LICENSE.hdrhistogram +27 -0
- package/deps/librdkafka/LICENSE.lz4 +26 -0
- package/deps/librdkafka/LICENSE.murmur2 +25 -0
- package/deps/librdkafka/LICENSE.nanopb +22 -0
- package/deps/librdkafka/LICENSE.opentelemetry +203 -0
- package/deps/librdkafka/LICENSE.pycrc +23 -0
- package/deps/librdkafka/LICENSE.queue +31 -0
- package/deps/librdkafka/LICENSE.regexp +5 -0
- package/deps/librdkafka/LICENSE.snappy +36 -0
- package/deps/librdkafka/LICENSE.tinycthread +26 -0
- package/deps/librdkafka/LICENSE.wingetopt +49 -0
- package/deps/librdkafka/LICENSES.txt +625 -0
- package/deps/librdkafka/Makefile +125 -0
- package/deps/librdkafka/README.md +201 -0
- package/deps/librdkafka/README.win32 +26 -0
- package/deps/librdkafka/STATISTICS.md +624 -0
- package/deps/librdkafka/configure +214 -0
- package/deps/librdkafka/configure.self +341 -0
- package/deps/librdkafka/dev-conf.sh +123 -0
- package/deps/librdkafka/lds-gen.py +73 -0
- package/deps/librdkafka/mainpage.doxy +40 -0
- package/deps/librdkafka/mklove/Makefile.base +329 -0
- package/deps/librdkafka/mklove/modules/configure.atomics +144 -0
- package/deps/librdkafka/mklove/modules/configure.base +2484 -0
- package/deps/librdkafka/mklove/modules/configure.builtin +70 -0
- package/deps/librdkafka/mklove/modules/configure.cc +186 -0
- package/deps/librdkafka/mklove/modules/configure.cxx +8 -0
- package/deps/librdkafka/mklove/modules/configure.fileversion +65 -0
- package/deps/librdkafka/mklove/modules/configure.gitversion +29 -0
- package/deps/librdkafka/mklove/modules/configure.good_cflags +18 -0
- package/deps/librdkafka/mklove/modules/configure.host +132 -0
- package/deps/librdkafka/mklove/modules/configure.lib +49 -0
- package/deps/librdkafka/mklove/modules/configure.libcurl +99 -0
- package/deps/librdkafka/mklove/modules/configure.libsasl2 +36 -0
- package/deps/librdkafka/mklove/modules/configure.libssl +147 -0
- package/deps/librdkafka/mklove/modules/configure.libzstd +58 -0
- package/deps/librdkafka/mklove/modules/configure.parseversion +95 -0
- package/deps/librdkafka/mklove/modules/configure.pic +16 -0
- package/deps/librdkafka/mklove/modules/configure.socket +20 -0
- package/deps/librdkafka/mklove/modules/configure.zlib +61 -0
- package/deps/librdkafka/mklove/modules/patches/README.md +8 -0
- package/deps/librdkafka/mklove/modules/patches/libcurl.0000-no-runtime-linking-check.patch +11 -0
- package/deps/librdkafka/mklove/modules/patches/libssl.0000-osx-rand-include-fix-OpenSSL-PR16409.patch +56 -0
- package/deps/librdkafka/service.yml +182 -0
- package/deps/librdkafka/src/CMakeLists.txt +379 -0
- package/deps/librdkafka/src/Makefile +105 -0
- package/deps/librdkafka/src/README.lz4.md +30 -0
- package/deps/librdkafka/src/cJSON.c +3191 -0
- package/deps/librdkafka/src/cJSON.h +306 -0
- package/deps/librdkafka/src/crc32c.c +430 -0
- package/deps/librdkafka/src/crc32c.h +38 -0
- package/deps/librdkafka/src/generate_proto.sh +66 -0
- package/deps/librdkafka/src/librdkafka_cgrp_synch.png +0 -0
- package/deps/librdkafka/src/lz4.c +2727 -0
- package/deps/librdkafka/src/lz4.h +842 -0
- package/deps/librdkafka/src/lz4frame.c +2078 -0
- package/deps/librdkafka/src/lz4frame.h +692 -0
- package/deps/librdkafka/src/lz4frame_static.h +47 -0
- package/deps/librdkafka/src/lz4hc.c +1631 -0
- package/deps/librdkafka/src/lz4hc.h +413 -0
- package/deps/librdkafka/src/nanopb/pb.h +917 -0
- package/deps/librdkafka/src/nanopb/pb_common.c +388 -0
- package/deps/librdkafka/src/nanopb/pb_common.h +49 -0
- package/deps/librdkafka/src/nanopb/pb_decode.c +1727 -0
- package/deps/librdkafka/src/nanopb/pb_decode.h +193 -0
- package/deps/librdkafka/src/nanopb/pb_encode.c +1000 -0
- package/deps/librdkafka/src/nanopb/pb_encode.h +185 -0
- package/deps/librdkafka/src/opentelemetry/common.pb.c +32 -0
- package/deps/librdkafka/src/opentelemetry/common.pb.h +170 -0
- package/deps/librdkafka/src/opentelemetry/metrics.options +2 -0
- package/deps/librdkafka/src/opentelemetry/metrics.pb.c +67 -0
- package/deps/librdkafka/src/opentelemetry/metrics.pb.h +966 -0
- package/deps/librdkafka/src/opentelemetry/resource.pb.c +12 -0
- package/deps/librdkafka/src/opentelemetry/resource.pb.h +58 -0
- package/deps/librdkafka/src/queue.h +850 -0
- package/deps/librdkafka/src/rd.h +592 -0
- package/deps/librdkafka/src/rdaddr.c +255 -0
- package/deps/librdkafka/src/rdaddr.h +202 -0
- package/deps/librdkafka/src/rdatomic.h +262 -0
- package/deps/librdkafka/src/rdavg.h +260 -0
- package/deps/librdkafka/src/rdavl.c +210 -0
- package/deps/librdkafka/src/rdavl.h +250 -0
- package/deps/librdkafka/src/rdbase64.c +200 -0
- package/deps/librdkafka/src/rdbase64.h +43 -0
- package/deps/librdkafka/src/rdbuf.c +1884 -0
- package/deps/librdkafka/src/rdbuf.h +375 -0
- package/deps/librdkafka/src/rdcrc32.c +114 -0
- package/deps/librdkafka/src/rdcrc32.h +170 -0
- package/deps/librdkafka/src/rddl.c +179 -0
- package/deps/librdkafka/src/rddl.h +43 -0
- package/deps/librdkafka/src/rdendian.h +175 -0
- package/deps/librdkafka/src/rdfloat.h +67 -0
- package/deps/librdkafka/src/rdfnv1a.c +113 -0
- package/deps/librdkafka/src/rdfnv1a.h +35 -0
- package/deps/librdkafka/src/rdgz.c +120 -0
- package/deps/librdkafka/src/rdgz.h +46 -0
- package/deps/librdkafka/src/rdhdrhistogram.c +721 -0
- package/deps/librdkafka/src/rdhdrhistogram.h +87 -0
- package/deps/librdkafka/src/rdhttp.c +831 -0
- package/deps/librdkafka/src/rdhttp.h +101 -0
- package/deps/librdkafka/src/rdinterval.h +177 -0
- package/deps/librdkafka/src/rdkafka.c +7287 -0
- package/deps/librdkafka/src/rdkafka.h +11795 -0
- package/deps/librdkafka/src/rdkafka_admin.c +10165 -0
- package/deps/librdkafka/src/rdkafka_admin.h +658 -0
- package/deps/librdkafka/src/rdkafka_assignment.c +1282 -0
- package/deps/librdkafka/src/rdkafka_assignment.h +73 -0
- package/deps/librdkafka/src/rdkafka_assignor.c +1800 -0
- package/deps/librdkafka/src/rdkafka_assignor.h +402 -0
- package/deps/librdkafka/src/rdkafka_aux.c +409 -0
- package/deps/librdkafka/src/rdkafka_aux.h +174 -0
- package/deps/librdkafka/src/rdkafka_background.c +222 -0
- package/deps/librdkafka/src/rdkafka_broker.c +6736 -0
- package/deps/librdkafka/src/rdkafka_broker.h +851 -0
- package/deps/librdkafka/src/rdkafka_buf.c +543 -0
- package/deps/librdkafka/src/rdkafka_buf.h +1525 -0
- package/deps/librdkafka/src/rdkafka_cert.c +576 -0
- package/deps/librdkafka/src/rdkafka_cert.h +62 -0
- package/deps/librdkafka/src/rdkafka_cgrp.c +8310 -0
- package/deps/librdkafka/src/rdkafka_cgrp.h +589 -0
- package/deps/librdkafka/src/rdkafka_conf.c +5177 -0
- package/deps/librdkafka/src/rdkafka_conf.h +746 -0
- package/deps/librdkafka/src/rdkafka_confval.h +97 -0
- package/deps/librdkafka/src/rdkafka_coord.c +623 -0
- package/deps/librdkafka/src/rdkafka_coord.h +132 -0
- package/deps/librdkafka/src/rdkafka_error.c +228 -0
- package/deps/librdkafka/src/rdkafka_error.h +80 -0
- package/deps/librdkafka/src/rdkafka_event.c +502 -0
- package/deps/librdkafka/src/rdkafka_event.h +126 -0
- package/deps/librdkafka/src/rdkafka_feature.c +898 -0
- package/deps/librdkafka/src/rdkafka_feature.h +104 -0
- package/deps/librdkafka/src/rdkafka_fetcher.c +3820 -0
- package/deps/librdkafka/src/rdkafka_fetcher.h +62 -0
- package/deps/librdkafka/src/rdkafka_header.c +220 -0
- package/deps/librdkafka/src/rdkafka_header.h +76 -0
- package/deps/librdkafka/src/rdkafka_idempotence.c +807 -0
- package/deps/librdkafka/src/rdkafka_idempotence.h +144 -0
- package/deps/librdkafka/src/rdkafka_int.h +1505 -0
- package/deps/librdkafka/src/rdkafka_interceptor.c +842 -0
- package/deps/librdkafka/src/rdkafka_interceptor.h +104 -0
- package/deps/librdkafka/src/rdkafka_lz4.c +450 -0
- package/deps/librdkafka/src/rdkafka_lz4.h +49 -0
- package/deps/librdkafka/src/rdkafka_metadata.c +2347 -0
- package/deps/librdkafka/src/rdkafka_metadata.h +350 -0
- package/deps/librdkafka/src/rdkafka_metadata_cache.c +1183 -0
- package/deps/librdkafka/src/rdkafka_mock.c +4514 -0
- package/deps/librdkafka/src/rdkafka_mock.h +867 -0
- package/deps/librdkafka/src/rdkafka_mock_cgrp.c +1877 -0
- package/deps/librdkafka/src/rdkafka_mock_handlers.c +5255 -0
- package/deps/librdkafka/src/rdkafka_mock_int.h +1005 -0
- package/deps/librdkafka/src/rdkafka_mock_sharegrp.c +1207 -0
- package/deps/librdkafka/src/rdkafka_msg.c +2619 -0
- package/deps/librdkafka/src/rdkafka_msg.h +629 -0
- package/deps/librdkafka/src/rdkafka_msgbatch.h +62 -0
- package/deps/librdkafka/src/rdkafka_msgset.h +105 -0
- package/deps/librdkafka/src/rdkafka_msgset_reader.c +2099 -0
- package/deps/librdkafka/src/rdkafka_msgset_writer.c +1474 -0
- package/deps/librdkafka/src/rdkafka_offset.c +1565 -0
- package/deps/librdkafka/src/rdkafka_offset.h +150 -0
- package/deps/librdkafka/src/rdkafka_op.c +1219 -0
- package/deps/librdkafka/src/rdkafka_op.h +1065 -0
- package/deps/librdkafka/src/rdkafka_partition.c +5109 -0
- package/deps/librdkafka/src/rdkafka_partition.h +1215 -0
- package/deps/librdkafka/src/rdkafka_pattern.c +228 -0
- package/deps/librdkafka/src/rdkafka_pattern.h +70 -0
- package/deps/librdkafka/src/rdkafka_plugin.c +213 -0
- package/deps/librdkafka/src/rdkafka_plugin.h +41 -0
- package/deps/librdkafka/src/rdkafka_proto.h +739 -0
- package/deps/librdkafka/src/rdkafka_protocol.h +131 -0
- package/deps/librdkafka/src/rdkafka_queue.c +1351 -0
- package/deps/librdkafka/src/rdkafka_queue.h +1235 -0
- package/deps/librdkafka/src/rdkafka_range_assignor.c +1748 -0
- package/deps/librdkafka/src/rdkafka_request.c +7298 -0
- package/deps/librdkafka/src/rdkafka_request.h +761 -0
- package/deps/librdkafka/src/rdkafka_roundrobin_assignor.c +123 -0
- package/deps/librdkafka/src/rdkafka_sasl.c +589 -0
- package/deps/librdkafka/src/rdkafka_sasl.h +63 -0
- package/deps/librdkafka/src/rdkafka_sasl_cyrus.c +722 -0
- package/deps/librdkafka/src/rdkafka_sasl_int.h +89 -0
- package/deps/librdkafka/src/rdkafka_sasl_oauthbearer.c +1833 -0
- package/deps/librdkafka/src/rdkafka_sasl_oauthbearer.h +52 -0
- package/deps/librdkafka/src/rdkafka_sasl_oauthbearer_oidc.c +1827 -0
- package/deps/librdkafka/src/rdkafka_sasl_oauthbearer_oidc.h +52 -0
- package/deps/librdkafka/src/rdkafka_sasl_plain.c +142 -0
- package/deps/librdkafka/src/rdkafka_sasl_scram.c +858 -0
- package/deps/librdkafka/src/rdkafka_sasl_win32.c +550 -0
- package/deps/librdkafka/src/rdkafka_share_acknowledgement.c +1445 -0
- package/deps/librdkafka/src/rdkafka_share_acknowledgement.h +373 -0
- package/deps/librdkafka/src/rdkafka_ssl.c +2235 -0
- package/deps/librdkafka/src/rdkafka_ssl.h +86 -0
- package/deps/librdkafka/src/rdkafka_sticky_assignor.c +4785 -0
- package/deps/librdkafka/src/rdkafka_subscription.c +411 -0
- package/deps/librdkafka/src/rdkafka_telemetry.c +761 -0
- package/deps/librdkafka/src/rdkafka_telemetry.h +52 -0
- package/deps/librdkafka/src/rdkafka_telemetry_decode.c +1307 -0
- package/deps/librdkafka/src/rdkafka_telemetry_decode.h +59 -0
- package/deps/librdkafka/src/rdkafka_telemetry_encode.c +1309 -0
- package/deps/librdkafka/src/rdkafka_telemetry_encode.h +459 -0
- package/deps/librdkafka/src/rdkafka_timer.c +407 -0
- package/deps/librdkafka/src/rdkafka_timer.h +117 -0
- package/deps/librdkafka/src/rdkafka_topic.c +2382 -0
- package/deps/librdkafka/src/rdkafka_topic.h +369 -0
- package/deps/librdkafka/src/rdkafka_transport.c +1309 -0
- package/deps/librdkafka/src/rdkafka_transport.h +99 -0
- package/deps/librdkafka/src/rdkafka_transport_int.h +100 -0
- package/deps/librdkafka/src/rdkafka_txnmgr.c +3256 -0
- package/deps/librdkafka/src/rdkafka_txnmgr.h +171 -0
- package/deps/librdkafka/src/rdkafka_zstd.c +226 -0
- package/deps/librdkafka/src/rdkafka_zstd.h +57 -0
- package/deps/librdkafka/src/rdlist.c +593 -0
- package/deps/librdkafka/src/rdlist.h +444 -0
- package/deps/librdkafka/src/rdlog.c +89 -0
- package/deps/librdkafka/src/rdlog.h +41 -0
- package/deps/librdkafka/src/rdmap.c +508 -0
- package/deps/librdkafka/src/rdmap.h +492 -0
- package/deps/librdkafka/src/rdmurmur2.c +167 -0
- package/deps/librdkafka/src/rdmurmur2.h +35 -0
- package/deps/librdkafka/src/rdports.c +61 -0
- package/deps/librdkafka/src/rdports.h +38 -0
- package/deps/librdkafka/src/rdposix.h +250 -0
- package/deps/librdkafka/src/rdrand.c +151 -0
- package/deps/librdkafka/src/rdrand.h +72 -0
- package/deps/librdkafka/src/rdregex.c +156 -0
- package/deps/librdkafka/src/rdregex.h +43 -0
- package/deps/librdkafka/src/rdsignal.h +57 -0
- package/deps/librdkafka/src/rdstring.c +645 -0
- package/deps/librdkafka/src/rdstring.h +98 -0
- package/deps/librdkafka/src/rdsysqueue.h +404 -0
- package/deps/librdkafka/src/rdtime.h +356 -0
- package/deps/librdkafka/src/rdtypes.h +86 -0
- package/deps/librdkafka/src/rdunittest.c +564 -0
- package/deps/librdkafka/src/rdunittest.h +232 -0
- package/deps/librdkafka/src/rdunittest_acknowledge.c +1177 -0
- package/deps/librdkafka/src/rdunittest_fetcher.c +1211 -0
- package/deps/librdkafka/src/rdunittest_msgset_errors.c +1521 -0
- package/deps/librdkafka/src/rdvarint.c +134 -0
- package/deps/librdkafka/src/rdvarint.h +165 -0
- package/deps/librdkafka/src/rdwin32.h +382 -0
- package/deps/librdkafka/src/rdxxhash.c +1030 -0
- package/deps/librdkafka/src/rdxxhash.h +328 -0
- package/deps/librdkafka/src/regexp.c +1352 -0
- package/deps/librdkafka/src/regexp.h +41 -0
- package/deps/librdkafka/src/snappy.c +1866 -0
- package/deps/librdkafka/src/snappy.h +62 -0
- package/deps/librdkafka/src/snappy_compat.h +138 -0
- package/deps/librdkafka/src/statistics_schema.json +444 -0
- package/deps/librdkafka/src/tinycthread.c +932 -0
- package/deps/librdkafka/src/tinycthread.h +503 -0
- package/deps/librdkafka/src/tinycthread_extra.c +210 -0
- package/deps/librdkafka/src/tinycthread_extra.h +218 -0
- package/deps/librdkafka/src/win32_config.h +58 -0
- package/deps/librdkafka/src-cpp/CMakeLists.txt +90 -0
- package/deps/librdkafka/src-cpp/ConfImpl.cpp +84 -0
- package/deps/librdkafka/src-cpp/ConsumerImpl.cpp +244 -0
- package/deps/librdkafka/src-cpp/HandleImpl.cpp +436 -0
- package/deps/librdkafka/src-cpp/HeadersImpl.cpp +48 -0
- package/deps/librdkafka/src-cpp/KafkaConsumerImpl.cpp +296 -0
- package/deps/librdkafka/src-cpp/Makefile +55 -0
- package/deps/librdkafka/src-cpp/MessageImpl.cpp +38 -0
- package/deps/librdkafka/src-cpp/MetadataImpl.cpp +170 -0
- package/deps/librdkafka/src-cpp/ProducerImpl.cpp +197 -0
- package/deps/librdkafka/src-cpp/QueueImpl.cpp +70 -0
- package/deps/librdkafka/src-cpp/README.md +16 -0
- package/deps/librdkafka/src-cpp/RdKafka.cpp +59 -0
- package/deps/librdkafka/src-cpp/TopicImpl.cpp +124 -0
- package/deps/librdkafka/src-cpp/TopicPartitionImpl.cpp +57 -0
- package/deps/librdkafka/src-cpp/rdkafkacpp.h +3797 -0
- package/deps/librdkafka/src-cpp/rdkafkacpp_int.h +1641 -0
- package/deps/librdkafka/tests/0000-unittests.c +72 -0
- package/deps/librdkafka/tests/0001-multiobj.c +102 -0
- package/deps/librdkafka/tests/0002-unkpart.c +244 -0
- package/deps/librdkafka/tests/0003-msgmaxsize.c +173 -0
- package/deps/librdkafka/tests/0004-conf.c +934 -0
- package/deps/librdkafka/tests/0005-order.c +133 -0
- package/deps/librdkafka/tests/0006-symbols.c +163 -0
- package/deps/librdkafka/tests/0007-autotopic.c +136 -0
- package/deps/librdkafka/tests/0008-reqacks.c +179 -0
- package/deps/librdkafka/tests/0009-mock_cluster.c +272 -0
- package/deps/librdkafka/tests/0011-produce_batch.c +753 -0
- package/deps/librdkafka/tests/0012-produce_consume.c +537 -0
- package/deps/librdkafka/tests/0013-null-msgs.c +473 -0
- package/deps/librdkafka/tests/0014-reconsume-191.c +512 -0
- package/deps/librdkafka/tests/0015-offset_seeks.c +172 -0
- package/deps/librdkafka/tests/0016-client_swname.c +181 -0
- package/deps/librdkafka/tests/0017-compression.c +140 -0
- package/deps/librdkafka/tests/0018-cgrp_term.c +444 -0
- package/deps/librdkafka/tests/0019-list_groups.c +289 -0
- package/deps/librdkafka/tests/0020-destroy_hang.c +162 -0
- package/deps/librdkafka/tests/0021-rkt_destroy.c +72 -0
- package/deps/librdkafka/tests/0022-consume_batch.c +331 -0
- package/deps/librdkafka/tests/0025-timers.c +147 -0
- package/deps/librdkafka/tests/0026-consume_pause.c +547 -0
- package/deps/librdkafka/tests/0028-long_topicnames.c +79 -0
- package/deps/librdkafka/tests/0029-assign_offset.c +202 -0
- package/deps/librdkafka/tests/0030-offset_commit.c +589 -0
- package/deps/librdkafka/tests/0031-get_offsets.c +235 -0
- package/deps/librdkafka/tests/0033-regex_subscribe.c +536 -0
- package/deps/librdkafka/tests/0034-offset_reset.c +398 -0
- package/deps/librdkafka/tests/0035-api_version.c +73 -0
- package/deps/librdkafka/tests/0036-partial_fetch.c +87 -0
- package/deps/librdkafka/tests/0037-destroy_hang_local.c +85 -0
- package/deps/librdkafka/tests/0038-performance.c +121 -0
- package/deps/librdkafka/tests/0039-event.c +284 -0
- package/deps/librdkafka/tests/0040-io_event.c +257 -0
- package/deps/librdkafka/tests/0041-fetch_max_bytes.c +97 -0
- package/deps/librdkafka/tests/0042-many_topics.c +252 -0
- package/deps/librdkafka/tests/0043-no_connection.c +77 -0
- package/deps/librdkafka/tests/0044-partition_cnt.c +94 -0
- package/deps/librdkafka/tests/0045-subscribe_update.c +1010 -0
- package/deps/librdkafka/tests/0046-rkt_cache.c +65 -0
- package/deps/librdkafka/tests/0047-partial_buf_tmout.c +98 -0
- package/deps/librdkafka/tests/0048-partitioner.c +283 -0
- package/deps/librdkafka/tests/0049-consume_conn_close.c +162 -0
- package/deps/librdkafka/tests/0050-subscribe_adds.c +145 -0
- package/deps/librdkafka/tests/0051-assign_adds.c +126 -0
- package/deps/librdkafka/tests/0052-msg_timestamps.c +238 -0
- package/deps/librdkafka/tests/0053-stats_cb.cpp +527 -0
- package/deps/librdkafka/tests/0054-offset_time.cpp +236 -0
- package/deps/librdkafka/tests/0055-producer_latency.c +539 -0
- package/deps/librdkafka/tests/0056-balanced_group_mt.c +315 -0
- package/deps/librdkafka/tests/0057-invalid_topic.cpp +112 -0
- package/deps/librdkafka/tests/0058-log.cpp +123 -0
- package/deps/librdkafka/tests/0059-bsearch.cpp +241 -0
- package/deps/librdkafka/tests/0060-op_prio.cpp +163 -0
- package/deps/librdkafka/tests/0061-consumer_lag.cpp +295 -0
- package/deps/librdkafka/tests/0062-stats_event.c +126 -0
- package/deps/librdkafka/tests/0063-clusterid.cpp +180 -0
- package/deps/librdkafka/tests/0064-interceptors.c +529 -0
- package/deps/librdkafka/tests/0065-yield.cpp +140 -0
- package/deps/librdkafka/tests/0066-plugins.cpp +143 -0
- package/deps/librdkafka/tests/0067-empty_topic.cpp +151 -0
- package/deps/librdkafka/tests/0068-produce_timeout.c +136 -0
- package/deps/librdkafka/tests/0069-consumer_add_parts.c +119 -0
- package/deps/librdkafka/tests/0070-null_empty.cpp +197 -0
- package/deps/librdkafka/tests/0072-headers_ut.c +448 -0
- package/deps/librdkafka/tests/0073-headers.c +381 -0
- package/deps/librdkafka/tests/0074-producev.c +87 -0
- package/deps/librdkafka/tests/0075-retry.c +290 -0
- package/deps/librdkafka/tests/0076-produce_retry.c +452 -0
- package/deps/librdkafka/tests/0077-compaction.c +366 -0
- package/deps/librdkafka/tests/0078-c_from_cpp.cpp +96 -0
- package/deps/librdkafka/tests/0079-fork.c +93 -0
- package/deps/librdkafka/tests/0080-admin_ut.c +3095 -0
- package/deps/librdkafka/tests/0081-admin.c +5633 -0
- package/deps/librdkafka/tests/0082-fetch_max_bytes.cpp +137 -0
- package/deps/librdkafka/tests/0083-cb_event.c +233 -0
- package/deps/librdkafka/tests/0084-destroy_flags.c +208 -0
- package/deps/librdkafka/tests/0085-headers.cpp +392 -0
- package/deps/librdkafka/tests/0086-purge.c +368 -0
- package/deps/librdkafka/tests/0088-produce_metadata_timeout.c +162 -0
- package/deps/librdkafka/tests/0089-max_poll_interval.c +511 -0
- package/deps/librdkafka/tests/0090-idempotence.c +171 -0
- package/deps/librdkafka/tests/0091-max_poll_interval_timeout.c +295 -0
- package/deps/librdkafka/tests/0092-mixed_msgver.c +103 -0
- package/deps/librdkafka/tests/0093-holb.c +200 -0
- package/deps/librdkafka/tests/0094-idempotence_msg_timeout.c +231 -0
- package/deps/librdkafka/tests/0095-all_brokers_down.cpp +122 -0
- package/deps/librdkafka/tests/0097-ssl_verify.cpp +674 -0
- package/deps/librdkafka/tests/0098-consumer-txn.cpp +1218 -0
- package/deps/librdkafka/tests/0099-commit_metadata.c +194 -0
- package/deps/librdkafka/tests/0100-thread_interceptors.cpp +195 -0
- package/deps/librdkafka/tests/0101-fetch-from-follower.cpp +446 -0
- package/deps/librdkafka/tests/0102-static_group_rebalance.c +836 -0
- package/deps/librdkafka/tests/0103-transactions.c +1383 -0
- package/deps/librdkafka/tests/0104-fetch_from_follower_mock.c +625 -0
- package/deps/librdkafka/tests/0105-transactions_mock.c +3930 -0
- package/deps/librdkafka/tests/0106-cgrp_sess_timeout.c +318 -0
- package/deps/librdkafka/tests/0107-topic_recreate.c +259 -0
- package/deps/librdkafka/tests/0109-auto_create_topics.cpp +278 -0
- package/deps/librdkafka/tests/0110-batch_size.cpp +182 -0
- package/deps/librdkafka/tests/0111-delay_create_topics.cpp +127 -0
- package/deps/librdkafka/tests/0112-assign_unknown_part.c +87 -0
- package/deps/librdkafka/tests/0113-cooperative_rebalance.cpp +3473 -0
- package/deps/librdkafka/tests/0114-sticky_partitioning.cpp +176 -0
- package/deps/librdkafka/tests/0115-producer_auth.cpp +182 -0
- package/deps/librdkafka/tests/0116-kafkaconsumer_close.cpp +216 -0
- package/deps/librdkafka/tests/0117-mock_errors.c +331 -0
- package/deps/librdkafka/tests/0118-commit_rebalance.c +154 -0
- package/deps/librdkafka/tests/0119-consumer_auth.cpp +167 -0
- package/deps/librdkafka/tests/0120-asymmetric_subscription.c +185 -0
- package/deps/librdkafka/tests/0121-clusterid.c +115 -0
- package/deps/librdkafka/tests/0122-buffer_cleaning_after_rebalance.c +227 -0
- package/deps/librdkafka/tests/0123-connections_max_idle.c +98 -0
- package/deps/librdkafka/tests/0124-openssl_invalid_engine.c +69 -0
- package/deps/librdkafka/tests/0125-immediate_flush.c +144 -0
- package/deps/librdkafka/tests/0126-oauthbearer_oidc.c +1164 -0
- package/deps/librdkafka/tests/0127-fetch_queue_backoff.cpp +165 -0
- package/deps/librdkafka/tests/0128-sasl_callback_queue.cpp +217 -0
- package/deps/librdkafka/tests/0129-fetch_aborted_msgs.c +79 -0
- package/deps/librdkafka/tests/0130-store_offsets.c +178 -0
- package/deps/librdkafka/tests/0131-connect_timeout.c +81 -0
- package/deps/librdkafka/tests/0132-strategy_ordering.c +179 -0
- package/deps/librdkafka/tests/0133-ssl_keys.c +150 -0
- package/deps/librdkafka/tests/0134-ssl_provider.c +92 -0
- package/deps/librdkafka/tests/0135-sasl_credentials.cpp +279 -0
- package/deps/librdkafka/tests/0136-resolve_cb.c +181 -0
- package/deps/librdkafka/tests/0137-barrier_batch_consume.c +752 -0
- package/deps/librdkafka/tests/0138-admin_mock.c +281 -0
- package/deps/librdkafka/tests/0139-offset_validation_mock.c +950 -0
- package/deps/librdkafka/tests/0140-commit_metadata.cpp +108 -0
- package/deps/librdkafka/tests/0142-reauthentication.c +931 -0
- package/deps/librdkafka/tests/0143-exponential_backoff_mock.c +552 -0
- package/deps/librdkafka/tests/0144-idempotence_mock.c +373 -0
- package/deps/librdkafka/tests/0145-pause_resume_mock.c +119 -0
- package/deps/librdkafka/tests/0146-metadata_mock.c +505 -0
- package/deps/librdkafka/tests/0147-consumer_group_consumer_mock.c +1210 -0
- package/deps/librdkafka/tests/0148-offset_fetch_commit_error_mock.c +569 -0
- package/deps/librdkafka/tests/0149-broker-same-host-port.c +140 -0
- package/deps/librdkafka/tests/0150-telemetry_mock.c +651 -0
- package/deps/librdkafka/tests/0151-purge-brokers.c +566 -0
- package/deps/librdkafka/tests/0152-rebootstrap.c +59 -0
- package/deps/librdkafka/tests/0153-memberid.c +128 -0
- package/deps/librdkafka/tests/0155-share_group_heartbeat_mock.c +2695 -0
- package/deps/librdkafka/tests/0156-share_consumer_fetch_mock.c +1551 -0
- package/deps/librdkafka/tests/0157-share_consumer_ack_mock.c +1788 -0
- package/deps/librdkafka/tests/0158-share_consumer_transactions_mock.c +467 -0
- package/deps/librdkafka/tests/0170-share_consumer_subscription.c +2192 -0
- package/deps/librdkafka/tests/0171-share_consumer_consume.c +2150 -0
- package/deps/librdkafka/tests/0172-share_consumer_acknowledge.c +1919 -0
- package/deps/librdkafka/tests/0173-share_consumer_commit_async.c +2735 -0
- package/deps/librdkafka/tests/0174-share_consumer_concurrency.c +1434 -0
- package/deps/librdkafka/tests/0175-share_consumer_groups.c +574 -0
- package/deps/librdkafka/tests/0176-share_consumer_commit_sync.c +2986 -0
- package/deps/librdkafka/tests/0177-share_consumer_transactions.c +1815 -0
- package/deps/librdkafka/tests/0178-share_consumer_close.c +2102 -0
- package/deps/librdkafka/tests/0179-share_consumer_destroy.c +2482 -0
- package/deps/librdkafka/tests/0180-share_consumer_config.c +1677 -0
- package/deps/librdkafka/tests/0181-share_consumer_topic_delete.c +354 -0
- package/deps/librdkafka/tests/0182-share_consumer_error_handling_mock.c +3358 -0
- package/deps/librdkafka/tests/0183-share_consumer_leader_change_mock.c +1234 -0
- package/deps/librdkafka/tests/0184-share_consumer_topic_recreate.c +1356 -0
- package/deps/librdkafka/tests/0185-share_consumer_max_poll_interval.c +557 -0
- package/deps/librdkafka/tests/0186-share_consumer_fatal_error.c +360 -0
- package/deps/librdkafka/tests/0190-share_consumer_telemetry.c +387 -0
- package/deps/librdkafka/tests/1000-unktopic.c +164 -0
- package/deps/librdkafka/tests/8000-idle.cpp +60 -0
- package/deps/librdkafka/tests/8001-fetch_from_follower_mock_manual.c +113 -0
- package/deps/librdkafka/tests/CMakeLists.txt +193 -0
- package/deps/librdkafka/tests/LibrdkafkaTestApp.py +291 -0
- package/deps/librdkafka/tests/Makefile +182 -0
- package/deps/librdkafka/tests/README.md +514 -0
- package/deps/librdkafka/tests/autotest.sh +33 -0
- package/deps/librdkafka/tests/backtrace.gdb +30 -0
- package/deps/librdkafka/tests/broker_version_tests.py +315 -0
- package/deps/librdkafka/tests/buildbox.sh +17 -0
- package/deps/librdkafka/tests/cleanup-checker-tests.sh +20 -0
- package/deps/librdkafka/tests/cluster_testing.py +203 -0
- package/deps/librdkafka/tests/delete-test-topics.sh +56 -0
- package/deps/librdkafka/tests/fixtures/oauthbearer/jwt_assertion_template.json +10 -0
- package/deps/librdkafka/tests/fixtures/ssl/Makefile +8 -0
- package/deps/librdkafka/tests/fixtures/ssl/README.md +13 -0
- package/deps/librdkafka/tests/fixtures/ssl/client.keystore.intermediate.p12 +0 -0
- package/deps/librdkafka/tests/fixtures/ssl/client.keystore.p12 +0 -0
- package/deps/librdkafka/tests/fixtures/ssl/client2.certificate.intermediate.pem +72 -0
- package/deps/librdkafka/tests/fixtures/ssl/client2.certificate.pem +50 -0
- package/deps/librdkafka/tests/fixtures/ssl/client2.intermediate.key +46 -0
- package/deps/librdkafka/tests/fixtures/ssl/client2.key +46 -0
- package/deps/librdkafka/tests/fixtures/ssl/create_keys.sh +168 -0
- package/deps/librdkafka/tests/fuzzers/Makefile +12 -0
- package/deps/librdkafka/tests/fuzzers/README.md +31 -0
- package/deps/librdkafka/tests/fuzzers/fuzz_regex.c +74 -0
- package/deps/librdkafka/tests/fuzzers/helpers.h +90 -0
- package/deps/librdkafka/tests/gen-ssl-certs.sh +165 -0
- package/deps/librdkafka/tests/interactive_broker_version.py +170 -0
- package/deps/librdkafka/tests/interceptor_test/CMakeLists.txt +16 -0
- package/deps/librdkafka/tests/interceptor_test/Makefile +22 -0
- package/deps/librdkafka/tests/interceptor_test/interceptor_test.c +314 -0
- package/deps/librdkafka/tests/interceptor_test/interceptor_test.h +54 -0
- package/deps/librdkafka/tests/java/IncrementalRebalanceCli.java +97 -0
- package/deps/librdkafka/tests/java/Makefile +13 -0
- package/deps/librdkafka/tests/java/Murmur2Cli.java +46 -0
- package/deps/librdkafka/tests/java/README.md +14 -0
- package/deps/librdkafka/tests/java/TransactionProducerCli.java +162 -0
- package/deps/librdkafka/tests/java/run-class.sh +11 -0
- package/deps/librdkafka/tests/librdkafka.suppressions +483 -0
- package/deps/librdkafka/tests/lz4_manual_test.sh +59 -0
- package/deps/librdkafka/tests/multi-broker-version-test.sh +50 -0
- package/deps/librdkafka/tests/parse-refcnt.sh +43 -0
- package/deps/librdkafka/tests/performance_plot.py +115 -0
- package/deps/librdkafka/tests/plugin_test/Makefile +19 -0
- package/deps/librdkafka/tests/plugin_test/plugin_test.c +58 -0
- package/deps/librdkafka/tests/requirements.txt +2 -0
- package/deps/librdkafka/tests/run-all-tests.sh +81 -0
- package/deps/librdkafka/tests/run-consumer-tests.sh +16 -0
- package/deps/librdkafka/tests/run-producer-tests.sh +16 -0
- package/deps/librdkafka/tests/run-test-batches.py +157 -0
- package/deps/librdkafka/tests/run-test.sh +141 -0
- package/deps/librdkafka/tests/rusage.c +249 -0
- package/deps/librdkafka/tests/sasl_test.py +289 -0
- package/deps/librdkafka/tests/scenarios/README.md +6 -0
- package/deps/librdkafka/tests/scenarios/ak23.json +6 -0
- package/deps/librdkafka/tests/scenarios/default.json +5 -0
- package/deps/librdkafka/tests/scenarios/noautocreate.json +5 -0
- package/deps/librdkafka/tests/share_telemetry_verify/share-otel-collector-config.yaml +28 -0
- package/deps/librdkafka/tests/sockem.c +801 -0
- package/deps/librdkafka/tests/sockem.h +85 -0
- package/deps/librdkafka/tests/sockem_ctrl.c +145 -0
- package/deps/librdkafka/tests/sockem_ctrl.h +61 -0
- package/deps/librdkafka/tests/test.c +8376 -0
- package/deps/librdkafka/tests/test.conf.example +27 -0
- package/deps/librdkafka/tests/test.h +1150 -0
- package/deps/librdkafka/tests/testcpp.cpp +131 -0
- package/deps/librdkafka/tests/testcpp.h +388 -0
- package/deps/librdkafka/tests/testshared.h +416 -0
- package/deps/librdkafka/tests/tools/README.md +4 -0
- package/deps/librdkafka/tests/tools/stats/README.md +21 -0
- package/deps/librdkafka/tests/tools/stats/filter.jq +42 -0
- package/deps/librdkafka/tests/tools/stats/graph.py +150 -0
- package/deps/librdkafka/tests/tools/stats/requirements.txt +3 -0
- package/deps/librdkafka/tests/tools/stats/to_csv.py +124 -0
- package/deps/librdkafka/tests/trivup/trivup-0.15.0.tar.gz +0 -0
- package/deps/librdkafka/tests/until-fail.sh +87 -0
- package/deps/librdkafka/tests/xxxx-assign_partition.c +122 -0
- package/deps/librdkafka/tests/xxxx-metadata.cpp +159 -0
- package/deps/librdkafka/vcpkg.json +23 -0
- package/deps/librdkafka/win32/README.md +5 -0
- package/deps/librdkafka/win32/build-package.bat +3 -0
- package/deps/librdkafka/win32/build.bat +19 -0
- package/deps/librdkafka/win32/common.vcxproj +84 -0
- package/deps/librdkafka/win32/interceptor_test/interceptor_test.vcxproj +87 -0
- package/deps/librdkafka/win32/librdkafka.autopkg.template +54 -0
- package/deps/librdkafka/win32/librdkafka.master.testing.targets +13 -0
- package/deps/librdkafka/win32/librdkafka.sln +226 -0
- package/deps/librdkafka/win32/librdkafka.vcxproj +282 -0
- package/deps/librdkafka/win32/librdkafkacpp/librdkafkacpp.vcxproj +104 -0
- package/deps/librdkafka/win32/msbuild.ps1 +58 -0
- package/deps/librdkafka/win32/openssl_engine_example/openssl_engine_example.vcxproj +132 -0
- package/deps/librdkafka/win32/package-zip.ps1 +46 -0
- package/deps/librdkafka/win32/packages/repositories.config +4 -0
- package/deps/librdkafka/win32/push-package.bat +4 -0
- package/deps/librdkafka/win32/rdkafka_complex_consumer_example_cpp/rdkafka_complex_consumer_example_cpp.vcxproj +67 -0
- package/deps/librdkafka/win32/rdkafka_example/rdkafka_example.vcxproj +97 -0
- package/deps/librdkafka/win32/rdkafka_performance/rdkafka_performance.vcxproj +97 -0
- package/deps/librdkafka/win32/setup-msys2.ps1 +47 -0
- package/deps/librdkafka/win32/setup-vcpkg.ps1 +34 -0
- package/deps/librdkafka/win32/tests/test.conf.example +25 -0
- package/deps/librdkafka/win32/tests/tests.vcxproj +278 -0
- package/deps/librdkafka/win32/win_ssl_cert_store/win_ssl_cert_store.vcxproj +132 -0
- package/deps/librdkafka/win32/wingetopt.c +564 -0
- package/deps/librdkafka/win32/wingetopt.h +101 -0
- package/deps/librdkafka/win32/wintime.h +33 -0
- package/deps/librdkafka.gyp +83 -0
- package/deps/windows-install.py +80 -0
- package/index.d.ts +3 -0
- package/lib/admin.js +732 -0
- package/lib/client.js +679 -0
- package/lib/error.js +501 -0
- package/lib/index.js +8 -0
- package/lib/kafka-consumer-stream.js +399 -0
- package/lib/kafka-consumer.js +798 -0
- package/lib/kafkajs/_admin.js +1052 -0
- package/lib/kafkajs/_common.js +887 -0
- package/lib/kafkajs/_consumer.js +2156 -0
- package/lib/kafkajs/_consumer_cache.js +310 -0
- package/lib/kafkajs/_error.js +298 -0
- package/lib/kafkajs/_kafka.js +125 -0
- package/lib/kafkajs/_linked-list.js +220 -0
- package/lib/kafkajs/_producer.js +863 -0
- package/lib/kafkajs/index.js +5 -0
- package/lib/producer/high-level-producer.js +400 -0
- package/lib/producer-stream.js +337 -0
- package/lib/producer.js +405 -0
- package/lib/rdkafka.js +44 -0
- package/lib/tools/ref-counter.js +53 -0
- package/lib/topic-partition.js +91 -0
- package/lib/topic.js +43 -0
- package/lib/util.js +55 -0
- package/librdkafka.js +12 -0
- package/package.json +85 -0
- package/shim/source_location +54 -0
- package/src/admin.cc +1597 -0
- package/src/admin.h +112 -0
- package/src/binding.cc +76 -0
- package/src/binding.h +25 -0
- package/src/callbacks.cc +676 -0
- package/src/callbacks.h +302 -0
- package/src/common.cc +1628 -0
- package/src/common.h +192 -0
- package/src/config.cc +219 -0
- package/src/config.h +61 -0
- package/src/connection.cc +703 -0
- package/src/connection.h +117 -0
- package/src/errors.cc +119 -0
- package/src/errors.h +60 -0
- package/src/kafka-consumer.cc +1539 -0
- package/src/kafka-consumer.h +147 -0
- package/src/producer.cc +917 -0
- package/src/producer.h +124 -0
- package/src/topic.cc +173 -0
- package/src/topic.h +54 -0
- package/src/workers.cc +1714 -0
- package/src/workers.h +690 -0
- package/types/config.d.ts +1269 -0
- package/types/errors.d.ts +373 -0
- package/types/kafkajs.d.ts +568 -0
- package/types/rdkafka.d.ts +571 -0
- package/util/configure.js +32 -0
- package/util/generate-docs.sh +18 -0
- package/util/get-env.js +6 -0
- package/util/test-compile.js +11 -0
- package/util/test-producer-delivery.js +100 -0
|
@@ -0,0 +1,1177 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* librdkafka - Apache Kafka C library
|
|
3
|
+
*
|
|
4
|
+
* Copyright (c) 2026, Confluent Inc.
|
|
5
|
+
* All rights reserved.
|
|
6
|
+
*
|
|
7
|
+
* Redistribution and use in source and binary forms, with or without
|
|
8
|
+
* modification, are permitted provided that the following conditions are met:
|
|
9
|
+
*
|
|
10
|
+
* 1. Redistributions of source code must retain the above copyright notice,
|
|
11
|
+
* this list of conditions and the following disclaimer.
|
|
12
|
+
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
|
13
|
+
* this list of conditions and the following disclaimer in the documentation
|
|
14
|
+
* and/or other materials provided with the distribution.
|
|
15
|
+
*
|
|
16
|
+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
17
|
+
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
18
|
+
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
19
|
+
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
20
|
+
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
21
|
+
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
22
|
+
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
23
|
+
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
24
|
+
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
25
|
+
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
26
|
+
* POSSIBILITY OF SUCH DAMAGE.
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* @brief Unit tests for Share Consumer acknowledge APIs
|
|
31
|
+
*
|
|
32
|
+
* Tests the following public APIs:
|
|
33
|
+
* 1. rd_kafka_share_acknowledge() - Acknowledge delivered record with ACCEPT
|
|
34
|
+
* 2. rd_kafka_share_acknowledge_type() - Acknowledge delivered record with type
|
|
35
|
+
* 3. rd_kafka_share_acknowledge_offset() - Acknowledge record by offset
|
|
36
|
+
*/
|
|
37
|
+
|
|
38
|
+
#include "rd.h"
|
|
39
|
+
#include "rdunittest.h"
|
|
40
|
+
#include "rdkafka_int.h"
|
|
41
|
+
#include "rdkafka_partition.h"
|
|
42
|
+
|
|
43
|
+
/* Test topic_id for unit tests (non-zero UUID) */
|
|
44
|
+
static const rd_kafka_Uuid_t ut_topic_id_t1 = {.most_significant_bits = 1,
|
|
45
|
+
.least_significant_bits = 1};
|
|
46
|
+
static const rd_kafka_Uuid_t ut_topic_id_t2 = {.most_significant_bits = 2,
|
|
47
|
+
.least_significant_bits = 2};
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* @brief Create a rd_kafka_share_t instance for testing using the proper
|
|
51
|
+
* share consumer API with explicit acknowledgement mode.
|
|
52
|
+
*/
|
|
53
|
+
static rd_kafka_share_t *ut_ack_create_share_consumer(void) {
|
|
54
|
+
rd_kafka_conf_t *conf = rd_kafka_conf_new();
|
|
55
|
+
char errstr[128];
|
|
56
|
+
|
|
57
|
+
if (rd_kafka_conf_set(conf, "group.id", "ut-share-ack", errstr,
|
|
58
|
+
sizeof(errstr)) != RD_KAFKA_CONF_OK) {
|
|
59
|
+
rd_kafka_conf_destroy(conf);
|
|
60
|
+
return NULL;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/* Enable explicit acknowledgement mode for testing acknowledge APIs */
|
|
64
|
+
if (rd_kafka_conf_set(conf, "share.acknowledgement.mode", "explicit",
|
|
65
|
+
errstr, sizeof(errstr)) != RD_KAFKA_CONF_OK) {
|
|
66
|
+
rd_kafka_conf_destroy(conf);
|
|
67
|
+
return NULL;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
rd_kafka_share_t *rkshare =
|
|
71
|
+
rd_kafka_share_consumer_new(conf, errstr, sizeof(errstr));
|
|
72
|
+
/* conf is consumed by rd_kafka_share_consumer_new on success */
|
|
73
|
+
|
|
74
|
+
return rkshare;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* @brief Register a topic with the rd_kafka_t instance and set its topic_id.
|
|
79
|
+
*
|
|
80
|
+
* This is needed for rd_kafka_share_acknowledge_offset() to find the topic
|
|
81
|
+
* by name and resolve its topic_id.
|
|
82
|
+
*/
|
|
83
|
+
static rd_kafka_topic_t *ut_ack_register_topic(rd_kafka_t *rk,
|
|
84
|
+
const char *topic,
|
|
85
|
+
rd_kafka_Uuid_t topic_id) {
|
|
86
|
+
rd_kafka_topic_t *rkt = rd_kafka_topic_new(rk, topic, NULL);
|
|
87
|
+
if (!rkt)
|
|
88
|
+
return NULL;
|
|
89
|
+
|
|
90
|
+
/* Set the topic_id on the registered topic */
|
|
91
|
+
rkt->rkt_topic_id = topic_id;
|
|
92
|
+
|
|
93
|
+
return rkt;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* @brief Clear all entries from the inflight acks map.
|
|
98
|
+
*
|
|
99
|
+
* Used between tests to reset state while keeping the same rkshare.
|
|
100
|
+
*/
|
|
101
|
+
static void ut_ack_clear_inflight_map(rd_kafka_share_t *rkshare) {
|
|
102
|
+
if (!rkshare)
|
|
103
|
+
return;
|
|
104
|
+
|
|
105
|
+
/* RD_MAP_CLEAR will call the free functions for keys and values */
|
|
106
|
+
RD_MAP_CLEAR(&rkshare->rkshare_inflight_acks);
|
|
107
|
+
|
|
108
|
+
/* Reset unacked count */
|
|
109
|
+
rkshare->rkshare_unacked_cnt = 0;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* @brief Add a partition with acquired offsets to the rkshare inflight map.
|
|
114
|
+
*
|
|
115
|
+
* Creates an entry with all offsets in ACQUIRED state (delivered records).
|
|
116
|
+
* Delivered records can be acknowledged via record-based APIs.
|
|
117
|
+
*/
|
|
118
|
+
static void ut_ack_add_partition(rd_kafka_share_t *rkshare,
|
|
119
|
+
const char *topic,
|
|
120
|
+
int32_t partition,
|
|
121
|
+
int64_t start_offset,
|
|
122
|
+
int64_t end_offset) {
|
|
123
|
+
rd_kafka_topic_partition_private_t *parpriv;
|
|
124
|
+
rd_kafka_share_ack_batches_t *batches = rd_calloc(1, sizeof(*batches));
|
|
125
|
+
|
|
126
|
+
batches->rktpar = rd_kafka_topic_partition_new(topic, partition);
|
|
127
|
+
parpriv = rd_kafka_topic_partition_private_new();
|
|
128
|
+
batches->rktpar->_private = parpriv;
|
|
129
|
+
|
|
130
|
+
batches->response_leader_id = 1;
|
|
131
|
+
|
|
132
|
+
int64_t size = end_offset - start_offset + 1;
|
|
133
|
+
batches->response_acquired_offsets_count = (int32_t)size;
|
|
134
|
+
|
|
135
|
+
rd_list_init(&batches->entries, 1, NULL);
|
|
136
|
+
|
|
137
|
+
rd_kafka_share_ack_batch_entry_t *entry = rd_calloc(1, sizeof(*entry));
|
|
138
|
+
entry->start_offset = start_offset;
|
|
139
|
+
entry->end_offset = end_offset;
|
|
140
|
+
entry->size = size;
|
|
141
|
+
entry->types_cnt = (int32_t)size;
|
|
142
|
+
entry->types = rd_calloc(size, sizeof(*entry->types));
|
|
143
|
+
|
|
144
|
+
/* Initialize all offsets to ACQUIRED */
|
|
145
|
+
for (int64_t i = 0; i < size; i++) {
|
|
146
|
+
entry->types[i] = RD_KAFKA_SHARE_INTERNAL_ACK_ACQUIRED;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
rd_list_add(&batches->entries, entry);
|
|
150
|
+
|
|
151
|
+
/* Mark as sorted */
|
|
152
|
+
batches->entries.rl_flags |= RD_LIST_F_SORTED;
|
|
153
|
+
|
|
154
|
+
rd_kafka_topic_partition_t *key =
|
|
155
|
+
rd_kafka_topic_partition_new(topic, partition);
|
|
156
|
+
RD_MAP_SET(&rkshare->rkshare_inflight_acks, key, batches);
|
|
157
|
+
|
|
158
|
+
/* Increment unacked count for all ACQUIRED offsets */
|
|
159
|
+
rkshare->rkshare_unacked_cnt += size;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* @brief Set a specific offset as a GAP record.
|
|
165
|
+
*/
|
|
166
|
+
static void ut_ack_set_gap(rd_kafka_share_t *rkshare,
|
|
167
|
+
const char *topic,
|
|
168
|
+
int32_t partition,
|
|
169
|
+
int64_t offset) {
|
|
170
|
+
rd_kafka_topic_partition_t *lookup_key =
|
|
171
|
+
rd_kafka_topic_partition_new(topic, partition);
|
|
172
|
+
|
|
173
|
+
rd_kafka_share_ack_batches_t *batches =
|
|
174
|
+
RD_MAP_GET(&rkshare->rkshare_inflight_acks, lookup_key);
|
|
175
|
+
rd_kafka_topic_partition_destroy(lookup_key);
|
|
176
|
+
|
|
177
|
+
if (!batches)
|
|
178
|
+
return;
|
|
179
|
+
|
|
180
|
+
rd_kafka_share_ack_batch_entry_t *entry;
|
|
181
|
+
int i;
|
|
182
|
+
RD_LIST_FOREACH(entry, &batches->entries, i) {
|
|
183
|
+
if (offset >= entry->start_offset &&
|
|
184
|
+
offset <= entry->end_offset) {
|
|
185
|
+
int64_t idx = offset - entry->start_offset;
|
|
186
|
+
entry->types[idx] = RD_KAFKA_SHARE_INTERNAL_ACK_GAP;
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* @brief Get the ack type for a specific offset in the inflight map.
|
|
194
|
+
*/
|
|
195
|
+
static rd_kafka_share_internal_acknowledgement_type
|
|
196
|
+
ut_ack_get_type(rd_kafka_share_t *rkshare,
|
|
197
|
+
const char *topic,
|
|
198
|
+
int32_t partition,
|
|
199
|
+
int64_t offset) {
|
|
200
|
+
rd_kafka_topic_partition_t *lookup_key =
|
|
201
|
+
rd_kafka_topic_partition_new(topic, partition);
|
|
202
|
+
|
|
203
|
+
rd_kafka_share_ack_batches_t *batches =
|
|
204
|
+
RD_MAP_GET(&rkshare->rkshare_inflight_acks, lookup_key);
|
|
205
|
+
rd_kafka_topic_partition_destroy(lookup_key);
|
|
206
|
+
|
|
207
|
+
if (!batches)
|
|
208
|
+
return -99; /* Invalid marker */
|
|
209
|
+
|
|
210
|
+
rd_kafka_share_ack_batch_entry_t *entry;
|
|
211
|
+
int i;
|
|
212
|
+
RD_LIST_FOREACH(entry, &batches->entries, i) {
|
|
213
|
+
if (offset >= entry->start_offset &&
|
|
214
|
+
offset <= entry->end_offset) {
|
|
215
|
+
int64_t idx = offset - entry->start_offset;
|
|
216
|
+
return entry->types[idx];
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
return -99; /* Invalid marker */
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
/**
|
|
224
|
+
* @brief Create a mock rd_kafka_message_t for testing.
|
|
225
|
+
*
|
|
226
|
+
* Uses a properly registered rd_kafka_topic_t to avoid issues with
|
|
227
|
+
* rd_kafka_topic_name() when the acknowledge APIs are called.
|
|
228
|
+
*/
|
|
229
|
+
static rd_kafka_message_t *ut_ack_create_message(rd_kafka_topic_t *rkt,
|
|
230
|
+
int32_t partition,
|
|
231
|
+
int64_t offset) {
|
|
232
|
+
rd_kafka_message_t *rkmessage = rd_calloc(1, sizeof(*rkmessage));
|
|
233
|
+
rkmessage->rkt = rkt;
|
|
234
|
+
rkmessage->partition = partition;
|
|
235
|
+
rkmessage->offset = offset;
|
|
236
|
+
return rkmessage;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
/**
|
|
240
|
+
* @brief Destroy a mock rd_kafka_message_t.
|
|
241
|
+
*/
|
|
242
|
+
static void ut_ack_destroy_message(rd_kafka_message_t *rkmessage) {
|
|
243
|
+
if (rkmessage)
|
|
244
|
+
rd_free(rkmessage);
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
/**
|
|
248
|
+
* @brief Test rd_kafka_share_acknowledge() - Basic ACCEPT acknowledgement.
|
|
249
|
+
*
|
|
250
|
+
* Verifies that rd_kafka_share_acknowledge() correctly updates an offset from
|
|
251
|
+
* ACQUIRED to ACCEPT state, and that adjacent offsets remain unchanged.
|
|
252
|
+
*/
|
|
253
|
+
static int ut_case_acknowledge_accept(rd_kafka_share_t *rkshare,
|
|
254
|
+
rd_kafka_topic_t *rkt) {
|
|
255
|
+
const char *topic = rd_kafka_topic_name(rkt);
|
|
256
|
+
|
|
257
|
+
/* Add partition with offsets 0-9 in ACQUIRED state */
|
|
258
|
+
ut_ack_add_partition(rkshare, topic, 0, 0, 9);
|
|
259
|
+
|
|
260
|
+
/* Create a mock message for offset 5 */
|
|
261
|
+
rd_kafka_message_t *msg = ut_ack_create_message(rkt, 0, 5);
|
|
262
|
+
|
|
263
|
+
/* Verify offset 5 is currently ACQUIRED */
|
|
264
|
+
RD_UT_ASSERT(ut_ack_get_type(rkshare, topic, 0, 5) ==
|
|
265
|
+
RD_KAFKA_SHARE_INTERNAL_ACK_ACQUIRED,
|
|
266
|
+
"offset 5 should be ACQUIRED before acknowledge");
|
|
267
|
+
|
|
268
|
+
/* Call rd_kafka_share_acknowledge */
|
|
269
|
+
rd_kafka_resp_err_t err = rd_kafka_share_acknowledge(rkshare, msg);
|
|
270
|
+
RD_UT_ASSERT(err == RD_KAFKA_RESP_ERR_NO_ERROR,
|
|
271
|
+
"acknowledge failed: %s", rd_kafka_err2str(err));
|
|
272
|
+
|
|
273
|
+
/* Verify offset 5 is now ACCEPT */
|
|
274
|
+
RD_UT_ASSERT(ut_ack_get_type(rkshare, topic, 0, 5) ==
|
|
275
|
+
RD_KAFKA_SHARE_INTERNAL_ACK_ACCEPT,
|
|
276
|
+
"offset 5 should be ACCEPT after acknowledge");
|
|
277
|
+
|
|
278
|
+
/* Verify other offsets are still ACQUIRED */
|
|
279
|
+
RD_UT_ASSERT(ut_ack_get_type(rkshare, topic, 0, 4) ==
|
|
280
|
+
RD_KAFKA_SHARE_INTERNAL_ACK_ACQUIRED,
|
|
281
|
+
"offset 4 should still be ACQUIRED");
|
|
282
|
+
RD_UT_ASSERT(ut_ack_get_type(rkshare, topic, 0, 6) ==
|
|
283
|
+
RD_KAFKA_SHARE_INTERNAL_ACK_ACQUIRED,
|
|
284
|
+
"offset 6 should still be ACQUIRED");
|
|
285
|
+
|
|
286
|
+
ut_ack_destroy_message(msg);
|
|
287
|
+
ut_ack_clear_inflight_map(rkshare);
|
|
288
|
+
|
|
289
|
+
RD_UT_PASS();
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
/**
|
|
293
|
+
* @brief Test rd_kafka_share_acknowledge_type() - Acknowledge with various
|
|
294
|
+
* types.
|
|
295
|
+
*
|
|
296
|
+
* Tests that rd_kafka_share_acknowledge_type() correctly updates the offset
|
|
297
|
+
* to the specified type (REJECT or RELEASE).
|
|
298
|
+
*/
|
|
299
|
+
static int ut_case_acknowledge_type_reject(rd_kafka_share_t *rkshare,
|
|
300
|
+
rd_kafka_topic_t *rkt) {
|
|
301
|
+
const char *topic = rd_kafka_topic_name(rkt);
|
|
302
|
+
|
|
303
|
+
ut_ack_add_partition(rkshare, topic, 0, 0, 9);
|
|
304
|
+
|
|
305
|
+
rd_kafka_message_t *msg = ut_ack_create_message(rkt, 0, 3);
|
|
306
|
+
|
|
307
|
+
/* Acknowledge with REJECT */
|
|
308
|
+
rd_kafka_resp_err_t err = rd_kafka_share_acknowledge_type(
|
|
309
|
+
rkshare, msg, RD_KAFKA_SHARE_ACKNOWLEDGE_TYPE_REJECT);
|
|
310
|
+
RD_UT_ASSERT(err == RD_KAFKA_RESP_ERR_NO_ERROR,
|
|
311
|
+
"acknowledge_type REJECT failed: %s",
|
|
312
|
+
rd_kafka_err2str(err));
|
|
313
|
+
|
|
314
|
+
/* Verify type changed to REJECT */
|
|
315
|
+
RD_UT_ASSERT(ut_ack_get_type(rkshare, topic, 0, 3) ==
|
|
316
|
+
RD_KAFKA_SHARE_INTERNAL_ACK_REJECT,
|
|
317
|
+
"offset 3 should be REJECT");
|
|
318
|
+
|
|
319
|
+
ut_ack_destroy_message(msg);
|
|
320
|
+
ut_ack_clear_inflight_map(rkshare);
|
|
321
|
+
|
|
322
|
+
RD_UT_PASS();
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
/**
|
|
326
|
+
* @brief Test rd_kafka_share_acknowledge_type() with RELEASE type.
|
|
327
|
+
*/
|
|
328
|
+
static int ut_case_acknowledge_type_release(rd_kafka_share_t *rkshare,
|
|
329
|
+
rd_kafka_topic_t *rkt) {
|
|
330
|
+
const char *topic = rd_kafka_topic_name(rkt);
|
|
331
|
+
|
|
332
|
+
ut_ack_add_partition(rkshare, topic, 0, 0, 9);
|
|
333
|
+
|
|
334
|
+
rd_kafka_message_t *msg = ut_ack_create_message(rkt, 0, 7);
|
|
335
|
+
|
|
336
|
+
/* Acknowledge with RELEASE */
|
|
337
|
+
rd_kafka_resp_err_t err = rd_kafka_share_acknowledge_type(
|
|
338
|
+
rkshare, msg, RD_KAFKA_SHARE_ACKNOWLEDGE_TYPE_RELEASE);
|
|
339
|
+
RD_UT_ASSERT(err == RD_KAFKA_RESP_ERR_NO_ERROR,
|
|
340
|
+
"acknowledge_type RELEASE failed: %s",
|
|
341
|
+
rd_kafka_err2str(err));
|
|
342
|
+
|
|
343
|
+
/* Verify type changed to RELEASE */
|
|
344
|
+
RD_UT_ASSERT(ut_ack_get_type(rkshare, topic, 0, 7) ==
|
|
345
|
+
RD_KAFKA_SHARE_INTERNAL_ACK_RELEASE,
|
|
346
|
+
"offset 7 should be RELEASE");
|
|
347
|
+
|
|
348
|
+
ut_ack_destroy_message(msg);
|
|
349
|
+
ut_ack_clear_inflight_map(rkshare);
|
|
350
|
+
|
|
351
|
+
RD_UT_PASS();
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
/**
|
|
355
|
+
* @brief Test re-acknowledgement with record-based APIs.
|
|
356
|
+
*
|
|
357
|
+
* Verifies that re-acknowledging a delivered record with record-based APIs
|
|
358
|
+
* succeeds and updates the type. This is allowed before sending the
|
|
359
|
+
* acknowledgement to the broker.
|
|
360
|
+
*/
|
|
361
|
+
static int ut_case_reacknowledge_delivered(rd_kafka_share_t *rkshare,
|
|
362
|
+
rd_kafka_topic_t *rkt) {
|
|
363
|
+
const char *topic = rd_kafka_topic_name(rkt);
|
|
364
|
+
|
|
365
|
+
ut_ack_add_partition(rkshare, topic, 0, 0, 9);
|
|
366
|
+
|
|
367
|
+
rd_kafka_message_t *msg = ut_ack_create_message(rkt, 0, 5);
|
|
368
|
+
|
|
369
|
+
/* First acknowledge with ACCEPT */
|
|
370
|
+
rd_kafka_resp_err_t err = rd_kafka_share_acknowledge_type(
|
|
371
|
+
rkshare, msg, RD_KAFKA_SHARE_ACKNOWLEDGE_TYPE_ACCEPT);
|
|
372
|
+
RD_UT_ASSERT(err == RD_KAFKA_RESP_ERR_NO_ERROR,
|
|
373
|
+
"first acknowledge failed: %s", rd_kafka_err2str(err));
|
|
374
|
+
RD_UT_ASSERT(ut_ack_get_type(rkshare, topic, 0, 5) ==
|
|
375
|
+
RD_KAFKA_SHARE_INTERNAL_ACK_ACCEPT,
|
|
376
|
+
"offset 5 should be ACCEPT");
|
|
377
|
+
|
|
378
|
+
/* Re-acknowledge with REJECT - should succeed */
|
|
379
|
+
err = rd_kafka_share_acknowledge_type(
|
|
380
|
+
rkshare, msg, RD_KAFKA_SHARE_ACKNOWLEDGE_TYPE_REJECT);
|
|
381
|
+
RD_UT_ASSERT(err == RD_KAFKA_RESP_ERR_NO_ERROR,
|
|
382
|
+
"re-acknowledge should succeed, got %s",
|
|
383
|
+
rd_kafka_err2str(err));
|
|
384
|
+
|
|
385
|
+
/* Verify type changed to REJECT */
|
|
386
|
+
RD_UT_ASSERT(ut_ack_get_type(rkshare, topic, 0, 5) ==
|
|
387
|
+
RD_KAFKA_SHARE_INTERNAL_ACK_REJECT,
|
|
388
|
+
"offset 5 should be REJECT after re-acknowledge");
|
|
389
|
+
|
|
390
|
+
/* Re-acknowledge again with RELEASE */
|
|
391
|
+
err = rd_kafka_share_acknowledge_type(
|
|
392
|
+
rkshare, msg, RD_KAFKA_SHARE_ACKNOWLEDGE_TYPE_RELEASE);
|
|
393
|
+
RD_UT_ASSERT(err == RD_KAFKA_RESP_ERR_NO_ERROR,
|
|
394
|
+
"second re-acknowledge should succeed");
|
|
395
|
+
RD_UT_ASSERT(ut_ack_get_type(rkshare, topic, 0, 5) ==
|
|
396
|
+
RD_KAFKA_SHARE_INTERNAL_ACK_RELEASE,
|
|
397
|
+
"offset 5 should be RELEASE after second re-acknowledge");
|
|
398
|
+
|
|
399
|
+
ut_ack_destroy_message(msg);
|
|
400
|
+
ut_ack_clear_inflight_map(rkshare);
|
|
401
|
+
|
|
402
|
+
RD_UT_PASS();
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
/**
|
|
406
|
+
* @brief Test error case - GAP records cannot be acknowledged.
|
|
407
|
+
*
|
|
408
|
+
* Verifies that GAP records cannot be acknowledged by any API.
|
|
409
|
+
*/
|
|
410
|
+
static int ut_case_error_gap_record(rd_kafka_share_t *rkshare,
|
|
411
|
+
rd_kafka_topic_t *rkt) {
|
|
412
|
+
const char *topic = rd_kafka_topic_name(rkt);
|
|
413
|
+
|
|
414
|
+
ut_ack_add_partition(rkshare, topic, 0, 0, 9);
|
|
415
|
+
|
|
416
|
+
/* Set offset 5 as a GAP record */
|
|
417
|
+
ut_ack_set_gap(rkshare, topic, 0, 5);
|
|
418
|
+
|
|
419
|
+
rd_kafka_message_t *msg = ut_ack_create_message(rkt, 0, 5);
|
|
420
|
+
|
|
421
|
+
/* Try to acknowledge GAP with record-based API - should fail */
|
|
422
|
+
rd_kafka_resp_err_t err = rd_kafka_share_acknowledge(rkshare, msg);
|
|
423
|
+
RD_UT_ASSERT(err == RD_KAFKA_RESP_ERR__STATE,
|
|
424
|
+
"expected STATE error for GAP record, got %s",
|
|
425
|
+
rd_kafka_err2str(err));
|
|
426
|
+
|
|
427
|
+
/* Verify GAP record is unchanged */
|
|
428
|
+
RD_UT_ASSERT(ut_ack_get_type(rkshare, topic, 0, 5) ==
|
|
429
|
+
RD_KAFKA_SHARE_INTERNAL_ACK_GAP,
|
|
430
|
+
"offset 5 should still be GAP");
|
|
431
|
+
|
|
432
|
+
ut_ack_destroy_message(msg);
|
|
433
|
+
ut_ack_clear_inflight_map(rkshare);
|
|
434
|
+
|
|
435
|
+
RD_UT_PASS();
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
/**
|
|
439
|
+
* @brief Test error case - Invalid parameters (NULL).
|
|
440
|
+
*
|
|
441
|
+
* Verifies that a NULL rkshare returns RD_KAFKA_RESP_ERR__STATE (rejected
|
|
442
|
+
* by the reentrancy guard), and that NULL message or topic parameters
|
|
443
|
+
* return RD_KAFKA_RESP_ERR__INVALID_ARG.
|
|
444
|
+
*/
|
|
445
|
+
static int ut_case_error_null_parameters(rd_kafka_share_t *rkshare,
|
|
446
|
+
rd_kafka_topic_t *rkt) {
|
|
447
|
+
rd_kafka_message_t *msg = ut_ack_create_message(rkt, 0, 5);
|
|
448
|
+
|
|
449
|
+
/* Test NULL rkshare */
|
|
450
|
+
rd_kafka_resp_err_t err = rd_kafka_share_acknowledge(NULL, msg);
|
|
451
|
+
RD_UT_ASSERT(err == RD_KAFKA_RESP_ERR__STATE,
|
|
452
|
+
"expected STATE for NULL rkshare, got %s",
|
|
453
|
+
rd_kafka_err2str(err));
|
|
454
|
+
|
|
455
|
+
/* Test NULL message */
|
|
456
|
+
err = rd_kafka_share_acknowledge(rkshare, NULL);
|
|
457
|
+
RD_UT_ASSERT(err == RD_KAFKA_RESP_ERR__INVALID_ARG,
|
|
458
|
+
"expected INVALID_ARG for NULL message, got %s",
|
|
459
|
+
rd_kafka_err2str(err));
|
|
460
|
+
|
|
461
|
+
/* Test NULL topic in acknowledge_offset */
|
|
462
|
+
err = rd_kafka_share_acknowledge_offset(
|
|
463
|
+
rkshare, NULL, 0, 5, RD_KAFKA_SHARE_ACKNOWLEDGE_TYPE_ACCEPT);
|
|
464
|
+
RD_UT_ASSERT(err == RD_KAFKA_RESP_ERR__INVALID_ARG,
|
|
465
|
+
"expected INVALID_ARG for NULL topic, got %s",
|
|
466
|
+
rd_kafka_err2str(err));
|
|
467
|
+
|
|
468
|
+
ut_ack_destroy_message(msg);
|
|
469
|
+
|
|
470
|
+
RD_UT_PASS();
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
/**
|
|
474
|
+
* @brief Test error case - Invalid acknowledgement type.
|
|
475
|
+
*
|
|
476
|
+
* Verifies that invalid acknowledgement types (e.g., GAP which is
|
|
477
|
+
* internal-only, or arbitrary values like 99) return
|
|
478
|
+
* RD_KAFKA_RESP_ERR__INVALID_ARG error. Also verifies the offset remains in
|
|
479
|
+
* ACQUIRED state after the failed attempt.
|
|
480
|
+
*/
|
|
481
|
+
static int ut_case_error_invalid_type(rd_kafka_share_t *rkshare,
|
|
482
|
+
rd_kafka_topic_t *rkt) {
|
|
483
|
+
const char *topic = rd_kafka_topic_name(rkt);
|
|
484
|
+
|
|
485
|
+
ut_ack_add_partition(rkshare, topic, 0, 0, 9);
|
|
486
|
+
|
|
487
|
+
rd_kafka_message_t *msg = ut_ack_create_message(rkt, 0, 5);
|
|
488
|
+
|
|
489
|
+
/* Test invalid type value (e.g., 99) */
|
|
490
|
+
rd_kafka_resp_err_t err = rd_kafka_share_acknowledge_type(
|
|
491
|
+
rkshare, msg, (rd_kafka_share_AcknowledgeType_t)99);
|
|
492
|
+
RD_UT_ASSERT(err == RD_KAFKA_RESP_ERR__INVALID_ARG,
|
|
493
|
+
"expected INVALID_ARG for invalid type, got %s",
|
|
494
|
+
rd_kafka_err2str(err));
|
|
495
|
+
|
|
496
|
+
/* Test type 0 (GAP - not allowed in public API) */
|
|
497
|
+
err = rd_kafka_share_acknowledge_type(
|
|
498
|
+
rkshare, msg, (rd_kafka_share_AcknowledgeType_t)0);
|
|
499
|
+
RD_UT_ASSERT(err == RD_KAFKA_RESP_ERR__INVALID_ARG,
|
|
500
|
+
"expected INVALID_ARG for GAP type, got %s",
|
|
501
|
+
rd_kafka_err2str(err));
|
|
502
|
+
|
|
503
|
+
/* Verify offset is still ACQUIRED (not modified) */
|
|
504
|
+
RD_UT_ASSERT(ut_ack_get_type(rkshare, topic, 0, 5) ==
|
|
505
|
+
RD_KAFKA_SHARE_INTERNAL_ACK_ACQUIRED,
|
|
506
|
+
"offset 5 should still be ACQUIRED after invalid type");
|
|
507
|
+
|
|
508
|
+
ut_ack_destroy_message(msg);
|
|
509
|
+
ut_ack_clear_inflight_map(rkshare);
|
|
510
|
+
|
|
511
|
+
RD_UT_PASS();
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
/**
|
|
515
|
+
* @brief Test multiple partitions with record-based APIs.
|
|
516
|
+
*
|
|
517
|
+
* Tests acknowledging delivered records across multiple topics and partitions
|
|
518
|
+
* using record-based APIs. Verifies that each partition's acknowledgements
|
|
519
|
+
* are tracked independently.
|
|
520
|
+
*/
|
|
521
|
+
static int ut_case_acknowledge_multiple_partitions(rd_kafka_share_t *rkshare,
|
|
522
|
+
rd_kafka_topic_t *rkt_t1,
|
|
523
|
+
rd_kafka_topic_t *rkt_t2) {
|
|
524
|
+
const char *topic1 = rd_kafka_topic_name(rkt_t1);
|
|
525
|
+
const char *topic2 = rd_kafka_topic_name(rkt_t2);
|
|
526
|
+
|
|
527
|
+
/* Add multiple partitions with delivered records */
|
|
528
|
+
ut_ack_add_partition(rkshare, topic1, 0, 0, 9);
|
|
529
|
+
ut_ack_add_partition(rkshare, topic1, 1, 100, 109);
|
|
530
|
+
ut_ack_add_partition(rkshare, topic2, 0, 50, 59);
|
|
531
|
+
|
|
532
|
+
rd_kafka_message_t *msg1 = ut_ack_create_message(rkt_t1, 0, 5);
|
|
533
|
+
rd_kafka_message_t *msg2 = ut_ack_create_message(rkt_t1, 1, 105);
|
|
534
|
+
rd_kafka_message_t *msg3 = ut_ack_create_message(rkt_t2, 0, 55);
|
|
535
|
+
|
|
536
|
+
rd_kafka_resp_err_t err;
|
|
537
|
+
|
|
538
|
+
/* Acknowledge across partitions using record-based APIs */
|
|
539
|
+
err = rd_kafka_share_acknowledge_type(
|
|
540
|
+
rkshare, msg1, RD_KAFKA_SHARE_ACKNOWLEDGE_TYPE_ACCEPT);
|
|
541
|
+
RD_UT_ASSERT(err == RD_KAFKA_RESP_ERR_NO_ERROR, "T1-0 offset 5 failed");
|
|
542
|
+
|
|
543
|
+
err = rd_kafka_share_acknowledge_type(
|
|
544
|
+
rkshare, msg2, RD_KAFKA_SHARE_ACKNOWLEDGE_TYPE_REJECT);
|
|
545
|
+
RD_UT_ASSERT(err == RD_KAFKA_RESP_ERR_NO_ERROR,
|
|
546
|
+
"T1-1 offset 105 failed");
|
|
547
|
+
|
|
548
|
+
err = rd_kafka_share_acknowledge_type(
|
|
549
|
+
rkshare, msg3, RD_KAFKA_SHARE_ACKNOWLEDGE_TYPE_RELEASE);
|
|
550
|
+
RD_UT_ASSERT(err == RD_KAFKA_RESP_ERR_NO_ERROR,
|
|
551
|
+
"T2-0 offset 55 failed");
|
|
552
|
+
|
|
553
|
+
/* Verify each partition independently */
|
|
554
|
+
RD_UT_ASSERT(ut_ack_get_type(rkshare, topic1, 0, 5) ==
|
|
555
|
+
RD_KAFKA_SHARE_INTERNAL_ACK_ACCEPT,
|
|
556
|
+
"T1-0 offset 5 should be ACCEPT");
|
|
557
|
+
RD_UT_ASSERT(ut_ack_get_type(rkshare, topic1, 1, 105) ==
|
|
558
|
+
RD_KAFKA_SHARE_INTERNAL_ACK_REJECT,
|
|
559
|
+
"T1-1 offset 105 should be REJECT");
|
|
560
|
+
RD_UT_ASSERT(ut_ack_get_type(rkshare, topic2, 0, 55) ==
|
|
561
|
+
RD_KAFKA_SHARE_INTERNAL_ACK_RELEASE,
|
|
562
|
+
"T2-0 offset 55 should be RELEASE");
|
|
563
|
+
|
|
564
|
+
/* Verify other offsets unchanged */
|
|
565
|
+
RD_UT_ASSERT(ut_ack_get_type(rkshare, topic1, 0, 4) ==
|
|
566
|
+
RD_KAFKA_SHARE_INTERNAL_ACK_ACQUIRED,
|
|
567
|
+
"T1-0 offset 4 should be ACQUIRED");
|
|
568
|
+
RD_UT_ASSERT(ut_ack_get_type(rkshare, topic1, 1, 104) ==
|
|
569
|
+
RD_KAFKA_SHARE_INTERNAL_ACK_ACQUIRED,
|
|
570
|
+
"T1-1 offset 104 should be ACQUIRED");
|
|
571
|
+
|
|
572
|
+
ut_ack_destroy_message(msg1);
|
|
573
|
+
ut_ack_destroy_message(msg2);
|
|
574
|
+
ut_ack_destroy_message(msg3);
|
|
575
|
+
ut_ack_clear_inflight_map(rkshare);
|
|
576
|
+
|
|
577
|
+
RD_UT_PASS();
|
|
578
|
+
}
|
|
579
|
+
|
|
580
|
+
|
|
581
|
+
/**
|
|
582
|
+
* @brief Add a partition with multiple non-contiguous entries for binary search
|
|
583
|
+
* tests.
|
|
584
|
+
*
|
|
585
|
+
* Creates entries at: [0-9], [100-109], [200-209], [500-509]
|
|
586
|
+
* This tests binary search with gaps between entries.
|
|
587
|
+
*/
|
|
588
|
+
static void ut_ack_add_partition_multiple_entries(rd_kafka_share_t *rkshare,
|
|
589
|
+
const char *topic,
|
|
590
|
+
int32_t partition) {
|
|
591
|
+
rd_kafka_topic_partition_private_t *parpriv;
|
|
592
|
+
rd_kafka_share_ack_batches_t *batches = rd_calloc(1, sizeof(*batches));
|
|
593
|
+
|
|
594
|
+
batches->rktpar = rd_kafka_topic_partition_new(topic, partition);
|
|
595
|
+
parpriv = rd_kafka_topic_partition_private_new();
|
|
596
|
+
batches->rktpar->_private = parpriv;
|
|
597
|
+
|
|
598
|
+
batches->response_leader_id = 1;
|
|
599
|
+
batches->response_acquired_offsets_count = 40;
|
|
600
|
+
|
|
601
|
+
rd_list_init(&batches->entries, 4, NULL);
|
|
602
|
+
|
|
603
|
+
/* Entry 1: offsets 0-9 */
|
|
604
|
+
rd_kafka_share_ack_batch_entry_t *entry1 =
|
|
605
|
+
rd_calloc(1, sizeof(*entry1));
|
|
606
|
+
entry1->start_offset = 0;
|
|
607
|
+
entry1->end_offset = 9;
|
|
608
|
+
entry1->size = 10;
|
|
609
|
+
entry1->types_cnt = 10;
|
|
610
|
+
entry1->types = rd_calloc(10, sizeof(*entry1->types));
|
|
611
|
+
for (int i = 0; i < 10; i++)
|
|
612
|
+
entry1->types[i] = RD_KAFKA_SHARE_INTERNAL_ACK_ACQUIRED;
|
|
613
|
+
rd_list_add(&batches->entries, entry1);
|
|
614
|
+
|
|
615
|
+
/* Entry 2: offsets 100-109 */
|
|
616
|
+
rd_kafka_share_ack_batch_entry_t *entry2 =
|
|
617
|
+
rd_calloc(1, sizeof(*entry2));
|
|
618
|
+
entry2->start_offset = 100;
|
|
619
|
+
entry2->end_offset = 109;
|
|
620
|
+
entry2->size = 10;
|
|
621
|
+
entry2->types_cnt = 10;
|
|
622
|
+
entry2->types = rd_calloc(10, sizeof(*entry2->types));
|
|
623
|
+
for (int i = 0; i < 10; i++)
|
|
624
|
+
entry2->types[i] = RD_KAFKA_SHARE_INTERNAL_ACK_ACQUIRED;
|
|
625
|
+
rd_list_add(&batches->entries, entry2);
|
|
626
|
+
|
|
627
|
+
/* Entry 3: offsets 200-209 */
|
|
628
|
+
rd_kafka_share_ack_batch_entry_t *entry3 =
|
|
629
|
+
rd_calloc(1, sizeof(*entry3));
|
|
630
|
+
entry3->start_offset = 200;
|
|
631
|
+
entry3->end_offset = 209;
|
|
632
|
+
entry3->size = 10;
|
|
633
|
+
entry3->types_cnt = 10;
|
|
634
|
+
entry3->types = rd_calloc(10, sizeof(*entry3->types));
|
|
635
|
+
for (int i = 0; i < 10; i++)
|
|
636
|
+
entry3->types[i] = RD_KAFKA_SHARE_INTERNAL_ACK_ACQUIRED;
|
|
637
|
+
rd_list_add(&batches->entries, entry3);
|
|
638
|
+
|
|
639
|
+
/* Entry 4: offsets 500-509 */
|
|
640
|
+
rd_kafka_share_ack_batch_entry_t *entry4 =
|
|
641
|
+
rd_calloc(1, sizeof(*entry4));
|
|
642
|
+
entry4->start_offset = 500;
|
|
643
|
+
entry4->end_offset = 509;
|
|
644
|
+
entry4->size = 10;
|
|
645
|
+
entry4->types_cnt = 10;
|
|
646
|
+
entry4->types = rd_calloc(10, sizeof(*entry4->types));
|
|
647
|
+
for (int i = 0; i < 10; i++)
|
|
648
|
+
entry4->types[i] = RD_KAFKA_SHARE_INTERNAL_ACK_ACQUIRED;
|
|
649
|
+
rd_list_add(&batches->entries, entry4);
|
|
650
|
+
|
|
651
|
+
/* Mark as sorted for binary search */
|
|
652
|
+
batches->entries.rl_flags |= RD_LIST_F_SORTED;
|
|
653
|
+
|
|
654
|
+
rd_kafka_topic_partition_t *key =
|
|
655
|
+
rd_kafka_topic_partition_new(topic, partition);
|
|
656
|
+
RD_MAP_SET(&rkshare->rkshare_inflight_acks, key, batches);
|
|
657
|
+
|
|
658
|
+
/* Increment unacked count for all ACQUIRED offsets (4 entries × 10) */
|
|
659
|
+
rkshare->rkshare_unacked_cnt += 40;
|
|
660
|
+
}
|
|
661
|
+
|
|
662
|
+
/**
|
|
663
|
+
* @brief Test binary search - find offset in first entry.
|
|
664
|
+
*
|
|
665
|
+
* Tests that rd_list_find correctly finds offsets at the beginning of the list.
|
|
666
|
+
*/
|
|
667
|
+
static int ut_case_bsearch_first_entry(rd_kafka_share_t *rkshare,
|
|
668
|
+
rd_kafka_topic_t *rkt) {
|
|
669
|
+
const char *topic = rd_kafka_topic_name(rkt);
|
|
670
|
+
|
|
671
|
+
ut_ack_add_partition_multiple_entries(rkshare, topic, 0);
|
|
672
|
+
|
|
673
|
+
/* Acknowledge offset 5 in first entry [0-9] */
|
|
674
|
+
rd_kafka_resp_err_t err = rd_kafka_share_acknowledge_offset(
|
|
675
|
+
rkshare, topic, 0, 5, RD_KAFKA_SHARE_ACKNOWLEDGE_TYPE_ACCEPT);
|
|
676
|
+
RD_UT_ASSERT(err == RD_KAFKA_RESP_ERR_NO_ERROR,
|
|
677
|
+
"first entry offset 5 failed: %s", rd_kafka_err2str(err));
|
|
678
|
+
|
|
679
|
+
RD_UT_ASSERT(ut_ack_get_type(rkshare, topic, 0, 5) ==
|
|
680
|
+
RD_KAFKA_SHARE_INTERNAL_ACK_ACCEPT,
|
|
681
|
+
"offset 5 should be ACCEPT");
|
|
682
|
+
|
|
683
|
+
/* Also test first offset of first entry */
|
|
684
|
+
err = rd_kafka_share_acknowledge_offset(
|
|
685
|
+
rkshare, topic, 0, 0, RD_KAFKA_SHARE_ACKNOWLEDGE_TYPE_REJECT);
|
|
686
|
+
RD_UT_ASSERT(err == RD_KAFKA_RESP_ERR_NO_ERROR,
|
|
687
|
+
"first entry offset 0 failed: %s", rd_kafka_err2str(err));
|
|
688
|
+
|
|
689
|
+
RD_UT_ASSERT(ut_ack_get_type(rkshare, topic, 0, 0) ==
|
|
690
|
+
RD_KAFKA_SHARE_INTERNAL_ACK_REJECT,
|
|
691
|
+
"offset 0 should be REJECT");
|
|
692
|
+
|
|
693
|
+
ut_ack_clear_inflight_map(rkshare);
|
|
694
|
+
RD_UT_PASS();
|
|
695
|
+
}
|
|
696
|
+
|
|
697
|
+
/**
|
|
698
|
+
* @brief Test binary search - find offset in last entry.
|
|
699
|
+
*
|
|
700
|
+
* Tests that rd_list_find correctly finds offsets at the end of the list.
|
|
701
|
+
*/
|
|
702
|
+
static int ut_case_bsearch_last_entry(rd_kafka_share_t *rkshare,
|
|
703
|
+
rd_kafka_topic_t *rkt) {
|
|
704
|
+
const char *topic = rd_kafka_topic_name(rkt);
|
|
705
|
+
|
|
706
|
+
ut_ack_add_partition_multiple_entries(rkshare, topic, 0);
|
|
707
|
+
|
|
708
|
+
/* Acknowledge offset 505 in last entry [500-509] */
|
|
709
|
+
rd_kafka_resp_err_t err = rd_kafka_share_acknowledge_offset(
|
|
710
|
+
rkshare, topic, 0, 505, RD_KAFKA_SHARE_ACKNOWLEDGE_TYPE_ACCEPT);
|
|
711
|
+
RD_UT_ASSERT(err == RD_KAFKA_RESP_ERR_NO_ERROR,
|
|
712
|
+
"last entry offset 505 failed: %s", rd_kafka_err2str(err));
|
|
713
|
+
|
|
714
|
+
RD_UT_ASSERT(ut_ack_get_type(rkshare, topic, 0, 505) ==
|
|
715
|
+
RD_KAFKA_SHARE_INTERNAL_ACK_ACCEPT,
|
|
716
|
+
"offset 505 should be ACCEPT");
|
|
717
|
+
|
|
718
|
+
/* Also test last offset of last entry */
|
|
719
|
+
err = rd_kafka_share_acknowledge_offset(
|
|
720
|
+
rkshare, topic, 0, 509, RD_KAFKA_SHARE_ACKNOWLEDGE_TYPE_RELEASE);
|
|
721
|
+
RD_UT_ASSERT(err == RD_KAFKA_RESP_ERR_NO_ERROR,
|
|
722
|
+
"last entry offset 509 failed: %s", rd_kafka_err2str(err));
|
|
723
|
+
|
|
724
|
+
RD_UT_ASSERT(ut_ack_get_type(rkshare, topic, 0, 509) ==
|
|
725
|
+
RD_KAFKA_SHARE_INTERNAL_ACK_RELEASE,
|
|
726
|
+
"offset 509 should be RELEASE");
|
|
727
|
+
|
|
728
|
+
ut_ack_clear_inflight_map(rkshare);
|
|
729
|
+
RD_UT_PASS();
|
|
730
|
+
}
|
|
731
|
+
|
|
732
|
+
/**
|
|
733
|
+
* @brief Test binary search - find offset in middle entries.
|
|
734
|
+
*
|
|
735
|
+
* Tests that rd_list_find correctly finds offsets in middle entries.
|
|
736
|
+
*/
|
|
737
|
+
static int ut_case_bsearch_middle_entries(rd_kafka_share_t *rkshare,
|
|
738
|
+
rd_kafka_topic_t *rkt) {
|
|
739
|
+
const char *topic = rd_kafka_topic_name(rkt);
|
|
740
|
+
|
|
741
|
+
ut_ack_add_partition_multiple_entries(rkshare, topic, 0);
|
|
742
|
+
|
|
743
|
+
/* Acknowledge in second entry [100-109] */
|
|
744
|
+
rd_kafka_resp_err_t err = rd_kafka_share_acknowledge_offset(
|
|
745
|
+
rkshare, topic, 0, 105, RD_KAFKA_SHARE_ACKNOWLEDGE_TYPE_ACCEPT);
|
|
746
|
+
RD_UT_ASSERT(err == RD_KAFKA_RESP_ERR_NO_ERROR,
|
|
747
|
+
"second entry offset 105 failed: %s",
|
|
748
|
+
rd_kafka_err2str(err));
|
|
749
|
+
|
|
750
|
+
/* Acknowledge in third entry [200-209] */
|
|
751
|
+
err = rd_kafka_share_acknowledge_offset(
|
|
752
|
+
rkshare, topic, 0, 200, RD_KAFKA_SHARE_ACKNOWLEDGE_TYPE_REJECT);
|
|
753
|
+
RD_UT_ASSERT(err == RD_KAFKA_RESP_ERR_NO_ERROR,
|
|
754
|
+
"third entry offset 200 failed: %s",
|
|
755
|
+
rd_kafka_err2str(err));
|
|
756
|
+
|
|
757
|
+
RD_UT_ASSERT(ut_ack_get_type(rkshare, topic, 0, 105) ==
|
|
758
|
+
RD_KAFKA_SHARE_INTERNAL_ACK_ACCEPT,
|
|
759
|
+
"offset 105 should be ACCEPT");
|
|
760
|
+
RD_UT_ASSERT(ut_ack_get_type(rkshare, topic, 0, 200) ==
|
|
761
|
+
RD_KAFKA_SHARE_INTERNAL_ACK_REJECT,
|
|
762
|
+
"offset 200 should be REJECT");
|
|
763
|
+
|
|
764
|
+
ut_ack_clear_inflight_map(rkshare);
|
|
765
|
+
RD_UT_PASS();
|
|
766
|
+
}
|
|
767
|
+
|
|
768
|
+
/**
|
|
769
|
+
* @brief Test binary search - offset not found (before all entries).
|
|
770
|
+
*
|
|
771
|
+
* Tests that rd_list_find returns NULL for offsets before the first entry.
|
|
772
|
+
* This is a special case where offset < first_entry->start_offset.
|
|
773
|
+
*
|
|
774
|
+
* Note: This test requires a setup where the first entry doesn't start at 0.
|
|
775
|
+
*/
|
|
776
|
+
static int ut_case_bsearch_not_found_before(rd_kafka_share_t *rkshare,
|
|
777
|
+
rd_kafka_topic_t *rkt) {
|
|
778
|
+
const char *topic = rd_kafka_topic_name(rkt);
|
|
779
|
+
|
|
780
|
+
/* Add entries starting at offset 100 */
|
|
781
|
+
ut_ack_add_partition(rkshare, topic, 0, 100, 109);
|
|
782
|
+
|
|
783
|
+
/* Try to acknowledge offset 50 (before all entries) */
|
|
784
|
+
rd_kafka_resp_err_t err = rd_kafka_share_acknowledge_offset(
|
|
785
|
+
rkshare, topic, 0, 50, RD_KAFKA_SHARE_ACKNOWLEDGE_TYPE_ACCEPT);
|
|
786
|
+
RD_UT_ASSERT(err == RD_KAFKA_RESP_ERR__STATE,
|
|
787
|
+
"expected STATE error for offset before entries, got %s",
|
|
788
|
+
rd_kafka_err2str(err));
|
|
789
|
+
|
|
790
|
+
ut_ack_clear_inflight_map(rkshare);
|
|
791
|
+
RD_UT_PASS();
|
|
792
|
+
}
|
|
793
|
+
|
|
794
|
+
/**
|
|
795
|
+
* @brief Test binary search - offset not found (after all entries).
|
|
796
|
+
*
|
|
797
|
+
* Tests that rd_list_find returns NULL for offsets after the last entry.
|
|
798
|
+
*/
|
|
799
|
+
static int ut_case_bsearch_not_found_after(rd_kafka_share_t *rkshare,
|
|
800
|
+
rd_kafka_topic_t *rkt) {
|
|
801
|
+
const char *topic = rd_kafka_topic_name(rkt);
|
|
802
|
+
|
|
803
|
+
ut_ack_add_partition_multiple_entries(rkshare, topic, 0);
|
|
804
|
+
|
|
805
|
+
/* Try to acknowledge offset 600 (after last entry [500-509]) */
|
|
806
|
+
rd_kafka_resp_err_t err = rd_kafka_share_acknowledge_offset(
|
|
807
|
+
rkshare, topic, 0, 600, RD_KAFKA_SHARE_ACKNOWLEDGE_TYPE_ACCEPT);
|
|
808
|
+
RD_UT_ASSERT(err == RD_KAFKA_RESP_ERR__STATE,
|
|
809
|
+
"expected STATE error for offset after entries, got %s",
|
|
810
|
+
rd_kafka_err2str(err));
|
|
811
|
+
|
|
812
|
+
ut_ack_clear_inflight_map(rkshare);
|
|
813
|
+
RD_UT_PASS();
|
|
814
|
+
}
|
|
815
|
+
|
|
816
|
+
/**
|
|
817
|
+
* @brief Test binary search - offset not found (in gap between entries).
|
|
818
|
+
*
|
|
819
|
+
* Tests that rd_list_find returns NULL for offsets in gaps between entries.
|
|
820
|
+
* Entries: [0-9], [100-109], [200-209], [500-509]
|
|
821
|
+
* Gaps: 10-99, 110-199, 210-499
|
|
822
|
+
*/
|
|
823
|
+
static int ut_case_bsearch_not_found_gap(rd_kafka_share_t *rkshare,
|
|
824
|
+
rd_kafka_topic_t *rkt) {
|
|
825
|
+
const char *topic = rd_kafka_topic_name(rkt);
|
|
826
|
+
|
|
827
|
+
ut_ack_add_partition_multiple_entries(rkshare, topic, 0);
|
|
828
|
+
|
|
829
|
+
/* Try to acknowledge offset 50 (in gap between entry 1 and 2) */
|
|
830
|
+
rd_kafka_resp_err_t err = rd_kafka_share_acknowledge_offset(
|
|
831
|
+
rkshare, topic, 0, 50, RD_KAFKA_SHARE_ACKNOWLEDGE_TYPE_ACCEPT);
|
|
832
|
+
RD_UT_ASSERT(err == RD_KAFKA_RESP_ERR__STATE,
|
|
833
|
+
"expected STATE error for offset 50 in gap, got %s",
|
|
834
|
+
rd_kafka_err2str(err));
|
|
835
|
+
|
|
836
|
+
/* Try to acknowledge offset 150 (in gap between entry 2 and 3) */
|
|
837
|
+
err = rd_kafka_share_acknowledge_offset(
|
|
838
|
+
rkshare, topic, 0, 150, RD_KAFKA_SHARE_ACKNOWLEDGE_TYPE_ACCEPT);
|
|
839
|
+
RD_UT_ASSERT(err == RD_KAFKA_RESP_ERR__STATE,
|
|
840
|
+
"expected STATE error for offset 150 in gap, got %s",
|
|
841
|
+
rd_kafka_err2str(err));
|
|
842
|
+
|
|
843
|
+
/* Try to acknowledge offset 300 (in gap between entry 3 and 4) */
|
|
844
|
+
err = rd_kafka_share_acknowledge_offset(
|
|
845
|
+
rkshare, topic, 0, 300, RD_KAFKA_SHARE_ACKNOWLEDGE_TYPE_ACCEPT);
|
|
846
|
+
RD_UT_ASSERT(err == RD_KAFKA_RESP_ERR__STATE,
|
|
847
|
+
"expected STATE error for offset 300 in gap, got %s",
|
|
848
|
+
rd_kafka_err2str(err));
|
|
849
|
+
|
|
850
|
+
ut_ack_clear_inflight_map(rkshare);
|
|
851
|
+
RD_UT_PASS();
|
|
852
|
+
}
|
|
853
|
+
|
|
854
|
+
/**
|
|
855
|
+
* @brief Test binary search - empty entries list.
|
|
856
|
+
*
|
|
857
|
+
* Tests that rd_list_find handles an empty entries list gracefully.
|
|
858
|
+
*/
|
|
859
|
+
static int ut_case_bsearch_empty_entries(rd_kafka_share_t *rkshare,
|
|
860
|
+
rd_kafka_topic_t *rkt) {
|
|
861
|
+
const char *topic = rd_kafka_topic_name(rkt);
|
|
862
|
+
|
|
863
|
+
/* Create a batches entry with empty entries list */
|
|
864
|
+
rd_kafka_topic_partition_private_t *parpriv;
|
|
865
|
+
rd_kafka_share_ack_batches_t *batches = rd_calloc(1, sizeof(*batches));
|
|
866
|
+
|
|
867
|
+
batches->rktpar = rd_kafka_topic_partition_new(topic, 0);
|
|
868
|
+
parpriv = rd_kafka_topic_partition_private_new();
|
|
869
|
+
batches->rktpar->_private = parpriv;
|
|
870
|
+
batches->response_leader_id = 1;
|
|
871
|
+
batches->response_acquired_offsets_count = 0;
|
|
872
|
+
|
|
873
|
+
rd_list_init(&batches->entries, 0, NULL);
|
|
874
|
+
batches->entries.rl_flags |= RD_LIST_F_SORTED;
|
|
875
|
+
|
|
876
|
+
rd_kafka_topic_partition_t *key =
|
|
877
|
+
rd_kafka_topic_partition_new(topic, 0);
|
|
878
|
+
RD_MAP_SET(&rkshare->rkshare_inflight_acks, key, batches);
|
|
879
|
+
|
|
880
|
+
/* Try to acknowledge any offset */
|
|
881
|
+
rd_kafka_resp_err_t err = rd_kafka_share_acknowledge_offset(
|
|
882
|
+
rkshare, topic, 0, 100, RD_KAFKA_SHARE_ACKNOWLEDGE_TYPE_ACCEPT);
|
|
883
|
+
RD_UT_ASSERT(err == RD_KAFKA_RESP_ERR__STATE,
|
|
884
|
+
"expected STATE error for empty entries, got %s",
|
|
885
|
+
rd_kafka_err2str(err));
|
|
886
|
+
|
|
887
|
+
ut_ack_clear_inflight_map(rkshare);
|
|
888
|
+
RD_UT_PASS();
|
|
889
|
+
}
|
|
890
|
+
|
|
891
|
+
/**
|
|
892
|
+
* @brief Test binary search - boundary offsets of entries.
|
|
893
|
+
*
|
|
894
|
+
* Tests that rd_list_find correctly handles the exact start and end offsets
|
|
895
|
+
* of each entry (boundary conditions).
|
|
896
|
+
*/
|
|
897
|
+
static int ut_case_bsearch_boundary_offsets(rd_kafka_share_t *rkshare,
|
|
898
|
+
rd_kafka_topic_t *rkt) {
|
|
899
|
+
const char *topic = rd_kafka_topic_name(rkt);
|
|
900
|
+
|
|
901
|
+
ut_ack_add_partition_multiple_entries(rkshare, topic, 0);
|
|
902
|
+
|
|
903
|
+
rd_kafka_resp_err_t err;
|
|
904
|
+
|
|
905
|
+
/* Test boundary offsets for each entry */
|
|
906
|
+
/* Entry 1: [0-9] - test 0 (start) and 9 (end) */
|
|
907
|
+
err = rd_kafka_share_acknowledge_offset(
|
|
908
|
+
rkshare, topic, 0, 0, RD_KAFKA_SHARE_ACKNOWLEDGE_TYPE_ACCEPT);
|
|
909
|
+
RD_UT_ASSERT(err == RD_KAFKA_RESP_ERR_NO_ERROR, "offset 0 failed");
|
|
910
|
+
|
|
911
|
+
err = rd_kafka_share_acknowledge_offset(
|
|
912
|
+
rkshare, topic, 0, 9, RD_KAFKA_SHARE_ACKNOWLEDGE_TYPE_ACCEPT);
|
|
913
|
+
RD_UT_ASSERT(err == RD_KAFKA_RESP_ERR_NO_ERROR, "offset 9 failed");
|
|
914
|
+
|
|
915
|
+
/* Entry 2: [100-109] - test 100 (start) and 109 (end) */
|
|
916
|
+
err = rd_kafka_share_acknowledge_offset(
|
|
917
|
+
rkshare, topic, 0, 100, RD_KAFKA_SHARE_ACKNOWLEDGE_TYPE_ACCEPT);
|
|
918
|
+
RD_UT_ASSERT(err == RD_KAFKA_RESP_ERR_NO_ERROR, "offset 100 failed");
|
|
919
|
+
|
|
920
|
+
err = rd_kafka_share_acknowledge_offset(
|
|
921
|
+
rkshare, topic, 0, 109, RD_KAFKA_SHARE_ACKNOWLEDGE_TYPE_ACCEPT);
|
|
922
|
+
RD_UT_ASSERT(err == RD_KAFKA_RESP_ERR_NO_ERROR, "offset 109 failed");
|
|
923
|
+
|
|
924
|
+
/* Entry 3: [200-209] - test 200 (start) and 209 (end) */
|
|
925
|
+
err = rd_kafka_share_acknowledge_offset(
|
|
926
|
+
rkshare, topic, 0, 200, RD_KAFKA_SHARE_ACKNOWLEDGE_TYPE_ACCEPT);
|
|
927
|
+
RD_UT_ASSERT(err == RD_KAFKA_RESP_ERR_NO_ERROR, "offset 200 failed");
|
|
928
|
+
|
|
929
|
+
err = rd_kafka_share_acknowledge_offset(
|
|
930
|
+
rkshare, topic, 0, 209, RD_KAFKA_SHARE_ACKNOWLEDGE_TYPE_ACCEPT);
|
|
931
|
+
RD_UT_ASSERT(err == RD_KAFKA_RESP_ERR_NO_ERROR, "offset 209 failed");
|
|
932
|
+
|
|
933
|
+
/* Entry 4: [500-509] - test 500 (start) and 509 (end) */
|
|
934
|
+
err = rd_kafka_share_acknowledge_offset(
|
|
935
|
+
rkshare, topic, 0, 500, RD_KAFKA_SHARE_ACKNOWLEDGE_TYPE_ACCEPT);
|
|
936
|
+
RD_UT_ASSERT(err == RD_KAFKA_RESP_ERR_NO_ERROR, "offset 500 failed");
|
|
937
|
+
|
|
938
|
+
err = rd_kafka_share_acknowledge_offset(
|
|
939
|
+
rkshare, topic, 0, 509, RD_KAFKA_SHARE_ACKNOWLEDGE_TYPE_ACCEPT);
|
|
940
|
+
RD_UT_ASSERT(err == RD_KAFKA_RESP_ERR_NO_ERROR, "offset 509 failed");
|
|
941
|
+
|
|
942
|
+
/* Verify all boundary offsets are ACCEPT */
|
|
943
|
+
RD_UT_ASSERT(ut_ack_get_type(rkshare, topic, 0, 0) ==
|
|
944
|
+
RD_KAFKA_SHARE_INTERNAL_ACK_ACCEPT,
|
|
945
|
+
"offset 0 type");
|
|
946
|
+
RD_UT_ASSERT(ut_ack_get_type(rkshare, topic, 0, 9) ==
|
|
947
|
+
RD_KAFKA_SHARE_INTERNAL_ACK_ACCEPT,
|
|
948
|
+
"offset 9 type");
|
|
949
|
+
RD_UT_ASSERT(ut_ack_get_type(rkshare, topic, 0, 100) ==
|
|
950
|
+
RD_KAFKA_SHARE_INTERNAL_ACK_ACCEPT,
|
|
951
|
+
"offset 100 type");
|
|
952
|
+
RD_UT_ASSERT(ut_ack_get_type(rkshare, topic, 0, 109) ==
|
|
953
|
+
RD_KAFKA_SHARE_INTERNAL_ACK_ACCEPT,
|
|
954
|
+
"offset 109 type");
|
|
955
|
+
|
|
956
|
+
/* Test that offset 10 (just after entry 1) is not found */
|
|
957
|
+
err = rd_kafka_share_acknowledge_offset(
|
|
958
|
+
rkshare, topic, 0, 10, RD_KAFKA_SHARE_ACKNOWLEDGE_TYPE_ACCEPT);
|
|
959
|
+
RD_UT_ASSERT(err == RD_KAFKA_RESP_ERR__STATE,
|
|
960
|
+
"offset 10 should not be found, got %s",
|
|
961
|
+
rd_kafka_err2str(err));
|
|
962
|
+
|
|
963
|
+
/* Test that offset 99 (just before entry 2) is not found */
|
|
964
|
+
err = rd_kafka_share_acknowledge_offset(
|
|
965
|
+
rkshare, topic, 0, 99, RD_KAFKA_SHARE_ACKNOWLEDGE_TYPE_ACCEPT);
|
|
966
|
+
RD_UT_ASSERT(err == RD_KAFKA_RESP_ERR__STATE,
|
|
967
|
+
"offset 99 should not be found, got %s",
|
|
968
|
+
rd_kafka_err2str(err));
|
|
969
|
+
|
|
970
|
+
ut_ack_clear_inflight_map(rkshare);
|
|
971
|
+
RD_UT_PASS();
|
|
972
|
+
}
|
|
973
|
+
|
|
974
|
+
/**
|
|
975
|
+
* @brief Test unacked count tracking.
|
|
976
|
+
*
|
|
977
|
+
* Verifies that rkshare_unacked_cnt is properly:
|
|
978
|
+
* - Incremented when ACQUIRED records are added
|
|
979
|
+
* - Decremented when records are acknowledged
|
|
980
|
+
* - Not decremented for GAP records or re-acknowledgements
|
|
981
|
+
*/
|
|
982
|
+
static int ut_case_unacked_count(rd_kafka_share_t *rkshare,
|
|
983
|
+
rd_kafka_topic_t *rkt) {
|
|
984
|
+
const char *topic = rd_kafka_topic_name(rkt);
|
|
985
|
+
rd_kafka_resp_err_t err;
|
|
986
|
+
|
|
987
|
+
/* Start with clean state */
|
|
988
|
+
RD_UT_ASSERT(rkshare->rkshare_unacked_cnt == 0,
|
|
989
|
+
"initial unacked count should be 0, got %" PRId64,
|
|
990
|
+
rkshare->rkshare_unacked_cnt);
|
|
991
|
+
|
|
992
|
+
/* Add partition with 10 offsets (0-9) - all ACQUIRED */
|
|
993
|
+
ut_ack_add_partition(rkshare, topic, 0, 0, 9);
|
|
994
|
+
RD_UT_ASSERT(rkshare->rkshare_unacked_cnt == 10,
|
|
995
|
+
"unacked count after adding 10 offsets should be 10, "
|
|
996
|
+
"got %" PRId64,
|
|
997
|
+
rkshare->rkshare_unacked_cnt);
|
|
998
|
+
|
|
999
|
+
/* Acknowledge offset 5 - should decrement count */
|
|
1000
|
+
err = rd_kafka_share_acknowledge_offset(
|
|
1001
|
+
rkshare, topic, 0, 5, RD_KAFKA_SHARE_ACKNOWLEDGE_TYPE_ACCEPT);
|
|
1002
|
+
RD_UT_ASSERT(err == RD_KAFKA_RESP_ERR_NO_ERROR,
|
|
1003
|
+
"acknowledge offset 5 failed: %s", rd_kafka_err2str(err));
|
|
1004
|
+
RD_UT_ASSERT(rkshare->rkshare_unacked_cnt == 9,
|
|
1005
|
+
"unacked count after acking offset 5 should be 9, "
|
|
1006
|
+
"got %" PRId64,
|
|
1007
|
+
rkshare->rkshare_unacked_cnt);
|
|
1008
|
+
|
|
1009
|
+
/* Re-acknowledge same offset - should NOT decrement (already acked) */
|
|
1010
|
+
err = rd_kafka_share_acknowledge_offset(
|
|
1011
|
+
rkshare, topic, 0, 5, RD_KAFKA_SHARE_ACKNOWLEDGE_TYPE_REJECT);
|
|
1012
|
+
RD_UT_ASSERT(err == RD_KAFKA_RESP_ERR_NO_ERROR,
|
|
1013
|
+
"re-acknowledge offset 5 failed: %s",
|
|
1014
|
+
rd_kafka_err2str(err));
|
|
1015
|
+
RD_UT_ASSERT(rkshare->rkshare_unacked_cnt == 9,
|
|
1016
|
+
"unacked count after re-acking should still be 9, "
|
|
1017
|
+
"got %" PRId64,
|
|
1018
|
+
rkshare->rkshare_unacked_cnt);
|
|
1019
|
+
|
|
1020
|
+
/* Set offset 3 as GAP */
|
|
1021
|
+
ut_ack_set_gap(rkshare, topic, 0, 3);
|
|
1022
|
+
|
|
1023
|
+
/* Try to acknowledge GAP - should fail and NOT change count */
|
|
1024
|
+
int64_t count_before = rkshare->rkshare_unacked_cnt;
|
|
1025
|
+
err = rd_kafka_share_acknowledge_offset(
|
|
1026
|
+
rkshare, topic, 0, 3, RD_KAFKA_SHARE_ACKNOWLEDGE_TYPE_ACCEPT);
|
|
1027
|
+
RD_UT_ASSERT(err == RD_KAFKA_RESP_ERR__STATE,
|
|
1028
|
+
"GAP acknowledge should fail");
|
|
1029
|
+
RD_UT_ASSERT(rkshare->rkshare_unacked_cnt == count_before,
|
|
1030
|
+
"unacked count should not change for GAP, "
|
|
1031
|
+
"expected %" PRId64 " got %" PRId64,
|
|
1032
|
+
count_before, rkshare->rkshare_unacked_cnt);
|
|
1033
|
+
|
|
1034
|
+
/* Acknowledge multiple offsets */
|
|
1035
|
+
err = rd_kafka_share_acknowledge_offset(
|
|
1036
|
+
rkshare, topic, 0, 0, RD_KAFKA_SHARE_ACKNOWLEDGE_TYPE_ACCEPT);
|
|
1037
|
+
RD_UT_ASSERT(err == RD_KAFKA_RESP_ERR_NO_ERROR, "ack offset 0 failed");
|
|
1038
|
+
err = rd_kafka_share_acknowledge_offset(
|
|
1039
|
+
rkshare, topic, 0, 1, RD_KAFKA_SHARE_ACKNOWLEDGE_TYPE_RELEASE);
|
|
1040
|
+
RD_UT_ASSERT(err == RD_KAFKA_RESP_ERR_NO_ERROR, "ack offset 1 failed");
|
|
1041
|
+
err = rd_kafka_share_acknowledge_offset(
|
|
1042
|
+
rkshare, topic, 0, 2, RD_KAFKA_SHARE_ACKNOWLEDGE_TYPE_REJECT);
|
|
1043
|
+
RD_UT_ASSERT(err == RD_KAFKA_RESP_ERR_NO_ERROR, "ack offset 2 failed");
|
|
1044
|
+
|
|
1045
|
+
/* 9 - 3 = 6 remaining (offsets 4,6,7,8,9 are ACQUIRED, 3 is GAP) */
|
|
1046
|
+
RD_UT_ASSERT(rkshare->rkshare_unacked_cnt == 6,
|
|
1047
|
+
"unacked count after acking 0,1,2 should be 6, "
|
|
1048
|
+
"got %" PRId64,
|
|
1049
|
+
rkshare->rkshare_unacked_cnt);
|
|
1050
|
+
|
|
1051
|
+
ut_ack_clear_inflight_map(rkshare);
|
|
1052
|
+
|
|
1053
|
+
/* After clear, count should be 0 */
|
|
1054
|
+
RD_UT_ASSERT(rkshare->rkshare_unacked_cnt == 0,
|
|
1055
|
+
"unacked count after clear should be 0, got %" PRId64,
|
|
1056
|
+
rkshare->rkshare_unacked_cnt);
|
|
1057
|
+
|
|
1058
|
+
RD_UT_PASS();
|
|
1059
|
+
}
|
|
1060
|
+
|
|
1061
|
+
|
|
1062
|
+
/**
|
|
1063
|
+
* @brief Main entry point for Share Consumer acknowledge API unit tests.
|
|
1064
|
+
*/
|
|
1065
|
+
int unittest_share_acknowledge(void) {
|
|
1066
|
+
rd_kafka_share_t *rkshare;
|
|
1067
|
+
rd_kafka_t *rk;
|
|
1068
|
+
rd_kafka_topic_t *rkt_t1, *rkt_t2;
|
|
1069
|
+
|
|
1070
|
+
RD_UT_SAY("===============================================");
|
|
1071
|
+
RD_UT_SAY("Share Consumer Acknowledge API Unit Tests");
|
|
1072
|
+
RD_UT_SAY("===============================================");
|
|
1073
|
+
|
|
1074
|
+
rkshare = ut_ack_create_share_consumer();
|
|
1075
|
+
RD_UT_ASSERT(rkshare != NULL, "Failed to create rd_kafka_share_t");
|
|
1076
|
+
|
|
1077
|
+
rk = rkshare->rkshare_rk;
|
|
1078
|
+
|
|
1079
|
+
/* Register topics T1 and T2 upfront for all tests that need them.
|
|
1080
|
+
* These will be destroyed at the end of the test suite. */
|
|
1081
|
+
rkt_t1 = ut_ack_register_topic(rk, "T1", ut_topic_id_t1);
|
|
1082
|
+
RD_UT_ASSERT(rkt_t1 != NULL, "Failed to register topic T1");
|
|
1083
|
+
rkt_t2 = ut_ack_register_topic(rk, "T2", ut_topic_id_t2);
|
|
1084
|
+
RD_UT_ASSERT(rkt_t2 != NULL, "Failed to register topic T2");
|
|
1085
|
+
|
|
1086
|
+
/* Macro for test cleanup on failure */
|
|
1087
|
+
#define UT_ACK_CLEANUP_AND_FAIL() \
|
|
1088
|
+
do { \
|
|
1089
|
+
rd_kafka_topic_destroy(rkt_t1); \
|
|
1090
|
+
rd_kafka_topic_destroy(rkt_t2); \
|
|
1091
|
+
rd_kafka_share_consumer_close(rkshare); \
|
|
1092
|
+
rd_kafka_share_destroy(rkshare); \
|
|
1093
|
+
return 1; \
|
|
1094
|
+
} while (0)
|
|
1095
|
+
|
|
1096
|
+
/* Record-based API tests (delivered records) */
|
|
1097
|
+
RD_UT_SAY("Testing rd_kafka_share_acknowledge() (ACCEPT)...");
|
|
1098
|
+
if (ut_case_acknowledge_accept(rkshare, rkt_t1))
|
|
1099
|
+
UT_ACK_CLEANUP_AND_FAIL();
|
|
1100
|
+
|
|
1101
|
+
RD_UT_SAY("Testing rd_kafka_share_acknowledge_type() (REJECT)...");
|
|
1102
|
+
if (ut_case_acknowledge_type_reject(rkshare, rkt_t1))
|
|
1103
|
+
UT_ACK_CLEANUP_AND_FAIL();
|
|
1104
|
+
|
|
1105
|
+
RD_UT_SAY("Testing rd_kafka_share_acknowledge_type() (RELEASE)...");
|
|
1106
|
+
if (ut_case_acknowledge_type_release(rkshare, rkt_t1))
|
|
1107
|
+
UT_ACK_CLEANUP_AND_FAIL();
|
|
1108
|
+
|
|
1109
|
+
/* Re-acknowledgement tests */
|
|
1110
|
+
RD_UT_SAY("Testing re-acknowledgement of delivered records...");
|
|
1111
|
+
if (ut_case_reacknowledge_delivered(rkshare, rkt_t1))
|
|
1112
|
+
UT_ACK_CLEANUP_AND_FAIL();
|
|
1113
|
+
|
|
1114
|
+
/* Error case tests */
|
|
1115
|
+
RD_UT_SAY("Testing error: GAP records cannot be acknowledged...");
|
|
1116
|
+
if (ut_case_error_gap_record(rkshare, rkt_t1))
|
|
1117
|
+
UT_ACK_CLEANUP_AND_FAIL();
|
|
1118
|
+
|
|
1119
|
+
RD_UT_SAY("Testing error: NULL parameters...");
|
|
1120
|
+
if (ut_case_error_null_parameters(rkshare, rkt_t1))
|
|
1121
|
+
UT_ACK_CLEANUP_AND_FAIL();
|
|
1122
|
+
|
|
1123
|
+
RD_UT_SAY("Testing error: invalid type...");
|
|
1124
|
+
if (ut_case_error_invalid_type(rkshare, rkt_t1))
|
|
1125
|
+
UT_ACK_CLEANUP_AND_FAIL();
|
|
1126
|
+
|
|
1127
|
+
/* Multi-partition test */
|
|
1128
|
+
RD_UT_SAY("Testing multiple partitions...");
|
|
1129
|
+
if (ut_case_acknowledge_multiple_partitions(rkshare, rkt_t1, rkt_t2))
|
|
1130
|
+
UT_ACK_CLEANUP_AND_FAIL();
|
|
1131
|
+
|
|
1132
|
+
/* Binary search tests (multiple entries) */
|
|
1133
|
+
RD_UT_SAY("Testing binary search: first entry...");
|
|
1134
|
+
if (ut_case_bsearch_first_entry(rkshare, rkt_t1))
|
|
1135
|
+
UT_ACK_CLEANUP_AND_FAIL();
|
|
1136
|
+
|
|
1137
|
+
RD_UT_SAY("Testing binary search: last entry...");
|
|
1138
|
+
if (ut_case_bsearch_last_entry(rkshare, rkt_t1))
|
|
1139
|
+
UT_ACK_CLEANUP_AND_FAIL();
|
|
1140
|
+
|
|
1141
|
+
RD_UT_SAY("Testing binary search: middle entries...");
|
|
1142
|
+
if (ut_case_bsearch_middle_entries(rkshare, rkt_t1))
|
|
1143
|
+
UT_ACK_CLEANUP_AND_FAIL();
|
|
1144
|
+
|
|
1145
|
+
RD_UT_SAY("Testing binary search: offset before all entries...");
|
|
1146
|
+
if (ut_case_bsearch_not_found_before(rkshare, rkt_t1))
|
|
1147
|
+
UT_ACK_CLEANUP_AND_FAIL();
|
|
1148
|
+
|
|
1149
|
+
RD_UT_SAY("Testing binary search: offset after all entries...");
|
|
1150
|
+
if (ut_case_bsearch_not_found_after(rkshare, rkt_t1))
|
|
1151
|
+
UT_ACK_CLEANUP_AND_FAIL();
|
|
1152
|
+
|
|
1153
|
+
RD_UT_SAY("Testing binary search: offset in gap between entries...");
|
|
1154
|
+
if (ut_case_bsearch_not_found_gap(rkshare, rkt_t1))
|
|
1155
|
+
UT_ACK_CLEANUP_AND_FAIL();
|
|
1156
|
+
|
|
1157
|
+
RD_UT_SAY("Testing binary search: empty entries list...");
|
|
1158
|
+
if (ut_case_bsearch_empty_entries(rkshare, rkt_t1))
|
|
1159
|
+
UT_ACK_CLEANUP_AND_FAIL();
|
|
1160
|
+
|
|
1161
|
+
RD_UT_SAY("Testing binary search: boundary offsets...");
|
|
1162
|
+
if (ut_case_bsearch_boundary_offsets(rkshare, rkt_t1))
|
|
1163
|
+
UT_ACK_CLEANUP_AND_FAIL();
|
|
1164
|
+
|
|
1165
|
+
/* Unacked count tracking test */
|
|
1166
|
+
RD_UT_SAY("Testing unacked count tracking...");
|
|
1167
|
+
if (ut_case_unacked_count(rkshare, rkt_t1))
|
|
1168
|
+
UT_ACK_CLEANUP_AND_FAIL();
|
|
1169
|
+
|
|
1170
|
+
#undef UT_ACK_CLEANUP_AND_FAIL
|
|
1171
|
+
|
|
1172
|
+
rd_kafka_topic_destroy(rkt_t1);
|
|
1173
|
+
rd_kafka_topic_destroy(rkt_t2);
|
|
1174
|
+
rd_kafka_share_consumer_close(rkshare);
|
|
1175
|
+
rd_kafka_share_destroy(rkshare);
|
|
1176
|
+
RD_UT_PASS();
|
|
1177
|
+
}
|