2323#include < string.h>
2424#include < time.h>
2525
26+ #include < future>
27+
2628static const char *lookup_url = " pulsar://localhost:6650" ;
2729
30+ struct batch_receive_ctx {
31+ pulsar_consumer_t *consumer;
32+ std::promise<pulsar_result> *promise;
33+ int expect_receive_num;
34+ };
35+
36+ static void batch_receive_callback (pulsar_result async_result, pulsar_messages_t *msgs, void *ctx) {
37+ struct batch_receive_ctx *receive_ctx = (struct batch_receive_ctx *)ctx;
38+ receive_ctx->promise ->set_value (async_result);
39+ if (async_result == pulsar_result_Ok) {
40+ ASSERT_EQ (pulsar_messages_size (msgs), receive_ctx->expect_receive_num );
41+ for (int i = 0 ; i < pulsar_messages_size (msgs); i++) {
42+ pulsar_message_t *msg = pulsar_messages_get (msgs, i);
43+ size_t length = pulsar_message_get_length (msg);
44+ char *str = (char *)malloc (pulsar_message_get_length (msg));
45+ strncpy (str, (const char *)pulsar_message_get_data (msg), length);
46+
47+ char expected_str[128 ];
48+ snprintf (expected_str, sizeof (expected_str), " msg-%d" , 10 + i);
49+ printf (" %d received: %s (%zd), expected: %s (%zd)\n " , i, str, strlen (str), expected_str,
50+ strlen (expected_str));
51+ ASSERT_EQ (strcmp (str, expected_str), 0 );
52+ free (str);
53+ }
54+ pulsar_messages_free (msgs);
55+ }
56+ }
57+
2858TEST (c_ConsumerTest, testBatchReceive) {
2959 pulsar_client_configuration_t *conf = pulsar_client_configuration_create ();
3060 pulsar_client_t *client = pulsar_client_create (lookup_url, conf);
@@ -39,11 +69,16 @@ TEST(c_ConsumerTest, testBatchReceive) {
3969
4070 pulsar_consumer_configuration_t *consumer_conf = pulsar_consumer_configuration_create ();
4171 pulsar_consumer_t *consumer;
72+
73+ const int batch_receive_max_size = 10 ;
74+ pulsar_consumer_batch_receive_policy_t batch_receive_policy{batch_receive_max_size, -1 , -1 };
75+ pulsar_consumer_configuration_set_batch_receive_policy (consumer_conf, &batch_receive_policy);
76+
4277 result = pulsar_client_subscribe (client, topic, " sub" , consumer_conf, &consumer);
4378 ASSERT_EQ (pulsar_result_Ok, result);
4479
45- const int num_messages = 10 ;
46- for (int i = 0 ; i < num_messages ; i++) {
80+ // Sending two more messages proves that the batch_receive_policy works.
81+ for (int i = 0 ; i < batch_receive_max_size * 2 ; i++) {
4782 pulsar_message_t *msg = pulsar_message_create ();
4883 char buf[128 ];
4984 snprintf (buf, sizeof (buf), " msg-%d" , i);
@@ -54,8 +89,8 @@ TEST(c_ConsumerTest, testBatchReceive) {
5489
5590 pulsar_messages_t *msgs = NULL ;
5691 ASSERT_EQ (pulsar_result_Ok, pulsar_consumer_batch_receive (consumer, &msgs));
57- ASSERT_EQ (pulsar_messages_size (msgs), num_messages );
58- for (int i = 0 ; i < num_messages ; i++) {
92+ ASSERT_EQ (pulsar_messages_size (msgs), batch_receive_max_size );
93+ for (int i = 0 ; i < batch_receive_max_size ; i++) {
5994 pulsar_message_t *msg = pulsar_messages_get (msgs, i);
6095 size_t length = pulsar_message_get_length (msg);
6196 char *str = (char *)malloc (pulsar_message_get_length (msg));
@@ -69,9 +104,16 @@ TEST(c_ConsumerTest, testBatchReceive) {
69104
70105 free (str);
71106 }
107+ pulsar_messages_free (msgs);
108+
109+ std::promise<pulsar_result> receive_promise;
110+ std::future<pulsar_result> receive_future = receive_promise.get_future ();
111+ struct batch_receive_ctx batch_receive_ctx = {consumer, &receive_promise, batch_receive_max_size};
112+ pulsar_consumer_batch_receive_async (consumer, batch_receive_callback, &batch_receive_ctx);
113+ pulsar_client_close (client);
114+ ASSERT_EQ (pulsar_result_Ok, receive_future.get ());
72115
73116 pulsar_client_close (client);
74- pulsar_messages_free (msgs);
75117 pulsar_consumer_free (consumer);
76118 pulsar_consumer_configuration_free (consumer_conf);
77119 pulsar_producer_free (producer);
0 commit comments