mirror of
				https://github.com/Telecominfraproject/wlan-cloud-lib-cppkafka.git
				synced 2025-11-03 20:18:06 +00:00 
			
		
		
		
	* 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
 | 
						|
 | 
						|
 |