mirror of
				https://github.com/Telecominfraproject/wlan-cloud-lib-cppkafka.git
				synced 2025-10-31 02:27:46 +00:00 
			
		
		
		
	 fbe3759fed
			
		
	
	fbe3759fed
	
	
	
		
			
			* header support implementation * Fixed issue when ptr is null and doesn't have a cloner function * Code complete with test cases updated travis file with v0.11.5 * Added compile time check for rdkafka header support version * Changes per last code review * Using brace list initializers
		
			
				
	
	
		
			227 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			227 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #include <vector>
 | |
| #include <thread>
 | |
| #include <set>
 | |
| #include <mutex>
 | |
| #include <chrono>
 | |
| #include <iterator>
 | |
| #include <condition_variable>
 | |
| #include <catch.hpp>
 | |
| #include "cppkafka/consumer.h"
 | |
| #include "cppkafka/producer.h"
 | |
| #include "cppkafka/header_list.h"
 | |
| #include "test_utils.h"
 | |
| 
 | |
| using std::vector;
 | |
| using std::move;
 | |
| using std::string;
 | |
| using std::thread;
 | |
| using std::set;
 | |
| using std::mutex;
 | |
| using std::tie;
 | |
| using std::condition_variable;
 | |
| using std::lock_guard;
 | |
| using std::unique_lock;
 | |
| using std::make_move_iterator;
 | |
| using std::chrono::seconds;
 | |
| using std::chrono::milliseconds;
 | |
| using std::chrono::system_clock;
 | |
| 
 | |
| #if (RD_KAFKA_VERSION >= RD_KAFKA_HEADERS_SUPPORT_VERSION)
 | |
| 
 | |
| using namespace cppkafka;
 | |
| using StringHeader = Header<std::string>;
 | |
| using BufferHeader = Header<Buffer>;
 | |
| 
 | |
| TEST_CASE("creation", "[headers]") {
 | |
|     SECTION("empty") {
 | |
|         HeaderList<StringHeader> list;
 | |
|         REQUIRE(!!list == false);
 | |
|     }
 | |
|     
 | |
|     SECTION("default") {
 | |
|         HeaderList<StringHeader> list(2);
 | |
|         REQUIRE(!!list == true);
 | |
|         REQUIRE(list.size() == 0);
 | |
|         REQUIRE(list.empty() == true);
 | |
|         REQUIRE(list.get_handle() != nullptr);
 | |
|     }
 | |
|     
 | |
|     SECTION("from handle") {
 | |
|         HeaderList<StringHeader> list(rd_kafka_headers_new(1));
 | |
|         REQUIRE(!!list == true);
 | |
|         REQUIRE(list.size() == 0);
 | |
|         REQUIRE(list.empty() == true);
 | |
|         REQUIRE(list.get_handle() != nullptr);
 | |
|     }
 | |
| }
 | |
| 
 | |
| TEST_CASE("release", "[headers]") {
 | |
|     HeaderList<StringHeader> list(2);
 | |
|     auto handle = list.release_handle();
 | |
|     REQUIRE(handle != nullptr);
 | |
|     REQUIRE(list.release_handle() == nullptr); //release again
 | |
|     REQUIRE(!!list == false);
 | |
|     rd_kafka_headers_destroy(handle);
 | |
| }
 | |
| 
 | |
| TEST_CASE("modify", "[headers]") {
 | |
|     SECTION("add") {
 | |
|         HeaderList<StringHeader> list(10);
 | |
|         //empty header name
 | |
|         list.add({{}, "payload1"});
 | |
|         //empty payload
 | |
|         list.add({"header2", {}});
 | |
|         list.add({"header3", "payload3"});
 | |
|         //both null
 | |
|         list.add({{}, {}});
 | |
|         //both empty (0-length strings)
 | |
|         list.add({"", ""});
 | |
|         
 | |
|         //validate
 | |
|         REQUIRE(list.size() == 5);
 | |
|         REQUIRE_FALSE(list.empty());
 | |
|         
 | |
|         //access a header
 | |
|         REQUIRE(list.at(1).get_name() == "header2");
 | |
|         REQUIRE(list.at(1).get_value().empty());
 | |
|         REQUIRE(list.at(2).get_value() == "payload3");
 | |
|     }
 | |
|     
 | |
|     SECTION("remove") {
 | |
|         HeaderList<StringHeader> list(10);
 | |
|         //empty header name
 | |
|         list.add({{}, "payload1"});
 | |
|         //empty payload
 | |
|         list.add({"header2", {}});
 | |
|         list.add({"header3", "payload3"});
 | |
|         //both null
 | |
|         list.add({{}, {}});
 | |
|         //both empty (0 length strings)
 | |
|         list.add({"", ""});
 | |
|         
 | |
|         //Remove a bogus name
 | |
|         Error err = list.remove("bogus");
 | |
|         REQUIRE(err.get_error() == RD_KAFKA_RESP_ERR__NOENT);
 | |
|         //Remove header with name
 | |
|         list.remove("header2");
 | |
|         REQUIRE(list.size() == 4);
 | |
|         list.remove("header3");
 | |
|         REQUIRE(list.size() == 3);
 | |
|         //Remove headers without name
 | |
|         list.remove({});
 | |
|         REQUIRE(list.size() == 0);
 | |
|     }
 | |
| }
 | |
| 
 | |
| TEST_CASE("copy and move", "[headers]") {
 | |
|     SECTION("copy owning") {
 | |
|         //Create an owning header list and copy it
 | |
|         HeaderList<StringHeader> list(3), list2(3);
 | |
|         list.add({"header1", "payload1"});
 | |
|         list.add({"header2", "payload2"});
 | |
|         list.add({"header3", "payload3"});
 | |
|         REQUIRE(list2.size() == 0);
 | |
|         list2 = list;
 | |
|         REQUIRE(list2.size() == 3);
 | |
|         REQUIRE(list2.size() == list.size());
 | |
|         //make sure the handles are different
 | |
|         CHECK(list.get_handle() != list2.get_handle());
 | |
|         CHECK(list.at(0) == list2.at(0));
 | |
|         CHECK(list.at(1) == list2.at(1));
 | |
|         CHECK(list.at(2) == list2.at(2));
 | |
|         CHECK(list == list2);
 | |
|     }
 | |
|     
 | |
|     SECTION("copy owning with buffers") {
 | |
|         //Create an owning header list and copy it
 | |
|         HeaderList<BufferHeader> list(3), list2(3);
 | |
|         string payload1 = "payload1", payload2 = "payload2", payload3 = "payload3";
 | |
|         list.add({"header1", payload1});
 | |
|         list.add({"header2", payload2});
 | |
|         list.add({"header3", payload3});
 | |
|         REQUIRE(list2.size() == 0);
 | |
|         list2 = list;
 | |
|         REQUIRE(list2.size() == 3);
 | |
|         REQUIRE(list2.size() == list.size());
 | |
|         //make sure the handles are different
 | |
|         CHECK(list.get_handle() != list2.get_handle());
 | |
|         CHECK(list.at(0) == list2.at(0));
 | |
|         CHECK(list.at(1) == list2.at(1));
 | |
|         CHECK(list.at(2) == list2.at(2));
 | |
|         CHECK(list == list2);
 | |
|     }
 | |
|     
 | |
|     SECTION("copy non-owning") {
 | |
|         //Create an owning header list and copy it
 | |
|         HeaderList<StringHeader> list(3), list2(3), list3(HeaderList<StringHeader>::make_non_owning(list.get_handle()));
 | |
|         list.add({"header1", "payload1"});
 | |
|         list.add({"header2", "payload2"});
 | |
|         list.add({"header3", "payload3"});
 | |
|         list2 = list3; //copy non-owning list
 | |
|         REQUIRE(list.size() == 3);
 | |
|         REQUIRE(list3.size() == list.size());
 | |
|         REQUIRE(list2.size() == list.size());
 | |
|         //make sure the handles are the same
 | |
|         CHECK(list2.get_handle() == list3.get_handle());
 | |
|         CHECK(list2.at(0) == list3.at(0));
 | |
|         CHECK(list2.at(1) == list3.at(1));
 | |
|         CHECK(list2.at(2) == list3.at(2));
 | |
|         CHECK(list2 == list3);
 | |
|     }
 | |
|     
 | |
|     SECTION("move") {
 | |
|         HeaderList<StringHeader> list(3), list2;
 | |
|         list.add({"header1", "payload1"});
 | |
|         list.add({"header2", "payload2"});
 | |
|         list.add({"header3", "payload3"});
 | |
|         auto handle = list.get_handle();
 | |
|         list2 = std::move(list);
 | |
|         CHECK_FALSE(!!list);
 | |
|         CHECK(!!list2);
 | |
|         CHECK(list2.size() == 3);
 | |
|         CHECK(handle == list2.get_handle());
 | |
|     }
 | |
| }
 | |
| 
 | |
| TEST_CASE("access", "[headers]") {
 | |
|     HeaderList<StringHeader> list(3);
 | |
|     list.add({"header1", "payload1"});
 | |
|     list.add({"header2", "payload2"});
 | |
|     list.add({"header3", "payload3"});
 | |
|     CHECK(list.at(0).get_value() == "payload1");
 | |
|     CHECK(list.at(1).get_value() == "payload2");
 | |
|     CHECK(list.at(2).get_value() == "payload3");
 | |
|     CHECK_THROWS_AS(list.at(3), Exception);
 | |
|     CHECK(list.front() == list.at(0));
 | |
|     CHECK(list.back() == list.at(2));
 | |
| }
 | |
| 
 | |
| TEST_CASE("iterate", "[headers]") {
 | |
|     HeaderList<StringHeader> list(3);
 | |
|     REQUIRE(list.begin() == list.end());
 | |
|     list.add({"header1", "payload1"});
 | |
|     REQUIRE(list.begin() != list.end());
 | |
|     CHECK(++list.begin() == list.end());
 | |
|     list.add({"header2", "payload2"});
 | |
|     list.add({"header3", "payload3"});
 | |
|     int i = 0;
 | |
|     for (auto it = list.begin(); it != list.end(); ++it, ++i) {
 | |
|         CHECK(it->get_name().length() == 7);
 | |
|         if (i == 0) {
 | |
|             CHECK(it->get_name() == "header1");
 | |
|         }
 | |
|         else if (i == 1) {
 | |
|             CHECK(it->get_name() == "header2");
 | |
|         }
 | |
|         else if (i == 2) {
 | |
|             CHECK(it->get_name() == "header3");
 | |
|         }
 | |
|     }
 | |
|     //rewind end() iterator
 | |
|     CHECK((--list.end())->get_name() == "header3");
 | |
| }
 | |
| 
 | |
| #endif //RD_KAFKA_HEADERS_SUPPORT_VERSION
 | |
| 
 | |
| 
 |