Skip to content

Commit 7aedcdc

Browse files
committed
Add configuration mocking code
1 parent 0e96f87 commit 7aedcdc

File tree

9 files changed

+523
-1
lines changed

9 files changed

+523
-1
lines changed

CMakeLists.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ find_package(Boost REQUIRED)
4040
find_package(RdKafka REQUIRED)
4141

4242
add_subdirectory(src)
43+
add_subdirectory(mocking)
4344
add_subdirectory(include)
4445

4546
add_subdirectory(examples)
@@ -95,4 +96,4 @@ configure_file(
9596

9697
# Add uninstall target
9798
add_custom_target(uninstall
98-
COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake)
99+
COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake)

include/cppkafka/clonable_ptr.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,13 @@ class ClonablePtr {
8484
T* get() const {
8585
return handle_.get();
8686
}
87+
88+
/**
89+
* Resets the internal pointer
90+
*/
91+
void reset(T* ptr) {
92+
handle_.reset(ptr);
93+
}
8794
private:
8895
std::unique_ptr<T, Deleter> handle_;
8996
Cloner cloner_;

mocking/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
add_subdirectory(src)
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
#ifndef CPPKAFKA_MOCKING_API_H
2+
#define CPPKAFKA_MOCKING_API_H
3+
4+
#include <librdkafka/rdkafka.h>
5+
#include <cppkafka/mocking/handle_wrapper.h>
6+
#include <cppkafka/mocking/configuration_mock.h>
7+
#include <cppkafka/macros.h>
8+
9+
struct rd_kafka_conf_s : cppkafka::mocking::HandleWrapper<cppkafka::mocking::ConfigurationMock> {
10+
using cppkafka::mocking::HandleWrapper<cppkafka::mocking::ConfigurationMock>::HandleWrapper;
11+
};
12+
13+
struct rd_kafka_topic_conf_s : rd_kafka_conf_s {
14+
using rd_kafka_conf_s::rd_kafka_conf_s;
15+
};
16+
17+
// rd_kafka_conf_t
18+
CPPKAFKA_API rd_kafka_conf_t* rd_kafka_conf_new();
19+
CPPKAFKA_API void rd_kafka_conf_destroy(rd_kafka_conf_t* conf);
20+
CPPKAFKA_API rd_kafka_conf_t* rd_kafka_conf_dup(const rd_kafka_conf_t* conf);
21+
CPPKAFKA_API rd_kafka_conf_res_t rd_kafka_conf_set(rd_kafka_conf_t* conf,
22+
const char* name, const char* value,
23+
char* errstr, size_t errstr_size);
24+
CPPKAFKA_API rd_kafka_conf_res_t rd_kafka_conf_get(const rd_kafka_conf_t* conf,
25+
const char* name, char* dest,
26+
size_t* dest_size);
27+
CPPKAFKA_API
28+
void rd_kafka_conf_set_dr_msg_cb(rd_kafka_conf_t* conf,
29+
cppkafka::mocking::ConfigurationMock::DeliveryReportCallback* cb);
30+
CPPKAFKA_API
31+
void rd_kafka_conf_set_rebalance_cb(rd_kafka_conf_t* conf,
32+
cppkafka::mocking::ConfigurationMock::RebalanceCallback* cb);
33+
CPPKAFKA_API
34+
void rd_kafka_conf_set_offset_commit_cb(rd_kafka_conf_t* conf,
35+
cppkafka::mocking::ConfigurationMock::OffsetCommitCallback* cb);
36+
CPPKAFKA_API
37+
void rd_kafka_conf_set_error_cb(rd_kafka_conf_t* conf,
38+
cppkafka::mocking::ConfigurationMock::ErrorCallback* cb);
39+
CPPKAFKA_API
40+
void rd_kafka_conf_set_throttle_cb(rd_kafka_conf_t* conf,
41+
cppkafka::mocking::ConfigurationMock::ThrottleCallback* cb);
42+
CPPKAFKA_API
43+
void rd_kafka_conf_set_log_cb(rd_kafka_conf_t* conf,
44+
cppkafka::mocking::ConfigurationMock::LogCallback* cb);
45+
CPPKAFKA_API
46+
void rd_kafka_conf_set_stats_cb(rd_kafka_conf_t* conf,
47+
cppkafka::mocking::ConfigurationMock::StatsCallback* cb);
48+
CPPKAFKA_API
49+
void rd_kafka_conf_set_socket_cb(rd_kafka_conf_t* conf,
50+
cppkafka::mocking::ConfigurationMock::SocketCallback* cb);
51+
CPPKAFKA_API
52+
void rd_kafka_topic_conf_set_partitioner_cb(rd_kafka_conf_t* conf,
53+
cppkafka::mocking::ConfigurationMock::PartitionerCallback* cb);
54+
CPPKAFKA_API
55+
void rd_kafka_conf_set_default_topic_conf(rd_kafka_conf_t* conf,
56+
rd_kafka_topic_conf_t* tconf);
57+
CPPKAFKA_API void rd_kafka_conf_set_opaque(rd_kafka_conf_t* conf, void* opaque);
58+
CPPKAFKA_API const char** rd_kafka_conf_dump(rd_kafka_conf_t* conf, size_t* cntp);
59+
CPPKAFKA_API void rd_kafka_conf_dump_free(const char** arr, size_t cnt);
60+
61+
// rd_kafka_topic_conf_t
62+
CPPKAFKA_API rd_kafka_topic_conf_t* rd_kafka_topic_conf_new();
63+
CPPKAFKA_API void rd_kafka_topic_conf_destroy(rd_kafka_topic_conf_t* conf);
64+
CPPKAFKA_API rd_kafka_topic_conf_t* rd_kafka_topic_conf_dup(const rd_kafka_topic_conf_t* conf);
65+
CPPKAFKA_API rd_kafka_conf_res_t rd_kafka_topic_conf_set(rd_kafka_topic_conf_t* conf,
66+
const char* name, const char* value,
67+
char* errstr, size_t errstr_size);
68+
CPPKAFKA_API rd_kafka_conf_res_t rd_kafka_topic_conf_get(const rd_kafka_topic_conf_t *conf,
69+
const char *name, char *dest,
70+
size_t *dest_size);
71+
CPPKAFKA_API
72+
const char** rd_kafka_topic_conf_dump(rd_kafka_topic_conf_t* conf, size_t* cntp);
73+
74+
#endif // CPPKAFKA_MOCKING_API_H
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
#ifndef CPPKAFKA_MOCKING_CONFIGURATION_MOCK_H
2+
#define CPPKAFKA_MOCKING_CONFIGURATION_MOCK_H
3+
4+
#include <librdkafka/rdkafka.h>
5+
#include <unordered_map>
6+
#include <string>
7+
#include <cppkafka/clonable_ptr.h>
8+
9+
namespace cppkafka {
10+
namespace mocking {
11+
12+
class ConfigurationMock {
13+
public:
14+
using DeliveryReportCallback = void(rd_kafka_t*, const rd_kafka_message_t*, void *);
15+
using RebalanceCallback = void(rd_kafka_t*, rd_kafka_resp_err_t,
16+
rd_kafka_topic_partition_list_t*, void*);
17+
using OffsetCommitCallback = void(rd_kafka_t*, rd_kafka_resp_err_t,
18+
rd_kafka_topic_partition_list_t*, void*);
19+
using ErrorCallback = void(rd_kafka_t*, int, const char*, void*);
20+
using ThrottleCallback = void(rd_kafka_t*, const char*, int32_t, int, void*);
21+
using LogCallback = void(const rd_kafka_t*, int, const char*, const char*);
22+
using StatsCallback = int(rd_kafka_t*, char*, size_t, void*);
23+
using SocketCallback = int(int, int, int, void*);
24+
using PartitionerCallback = int32_t(const rd_kafka_topic_t*, const void*,
25+
size_t, int32_t, void*, void*);
26+
27+
ConfigurationMock();
28+
29+
void set(std::string key, std::string value);
30+
size_t has_key(const std::string& key) const;
31+
std::string get(const std::string& key) const;
32+
33+
void set_delivery_report_callback(DeliveryReportCallback* callback);
34+
void set_rebalance_callback(RebalanceCallback* callback);
35+
void set_offset_commit_callback(OffsetCommitCallback* callback);
36+
void set_error_callback(ErrorCallback* callback);
37+
void set_throttle_callback(ThrottleCallback* callback);
38+
void set_log_callback(LogCallback* callback);
39+
void set_stats_callback(StatsCallback* callback);
40+
void set_socket_callback(SocketCallback* callback);
41+
void set_partitioner_callback(PartitionerCallback* callback);
42+
void set_default_topic_configuration(const ConfigurationMock& conf);
43+
void set_opaque(void* ptr);
44+
45+
DeliveryReportCallback* get_delivery_report_callback() const;
46+
RebalanceCallback* get_rebalance_callback() const;
47+
OffsetCommitCallback* get_offset_commit_callback() const;
48+
ErrorCallback* get_error_callback() const;
49+
ThrottleCallback* get_throttle_callback() const;
50+
LogCallback* get_log_callback() const;
51+
StatsCallback* get_stats_callback() const;
52+
SocketCallback* get_socket_callback() const;
53+
PartitionerCallback* get_partitioner_callback() const;
54+
const ConfigurationMock* get_default_topic_configuration() const;
55+
void* get_opaque() const;
56+
std::unordered_map<std::string, std::string> get_options() const;
57+
private:
58+
enum class Callback {
59+
DeliveryReport,
60+
Rebalance,
61+
OffsetCommit,
62+
Error,
63+
Throttle,
64+
Log,
65+
Stats,
66+
Socket,
67+
Partitioner
68+
};
69+
70+
struct Hasher {
71+
size_t operator()(Callback c) const {
72+
return static_cast<size_t>(c);
73+
}
74+
};
75+
76+
struct Cloner {
77+
ConfigurationMock* operator()(const ConfigurationMock* ptr) const {
78+
return new ConfigurationMock(*ptr);
79+
}
80+
};
81+
82+
using TopicConfigirationPtr = ClonablePtr<ConfigurationMock,
83+
std::default_delete<ConfigurationMock>,
84+
Cloner>;
85+
86+
template <typename Functor>
87+
void set_callback(Callback type, Functor* ptr);
88+
template <typename Functor>
89+
Functor* get_callback(Callback type) const;
90+
91+
std::unordered_map<std::string, std::string> options_;
92+
std::unordered_map<Callback, void*, Hasher> callbacks_;
93+
TopicConfigirationPtr default_topic_configuration_;
94+
void* opaque_;
95+
};
96+
97+
} // mocking
98+
} // cppkafka
99+
100+
#endif // CPPKAFKA_MOCKING_CONFIGURATION_MOCK_H
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
#ifndef CPPKAFKA_MOCKING_HANDLE_WRAPPER_H
2+
#define CPPKAFKA_MOCKING_HANDLE_WRAPPER_H
3+
4+
#include <utility>
5+
6+
namespace cppkafka {
7+
namespace mocking {
8+
9+
template <typename T>
10+
class HandleWrapper {
11+
public:
12+
template <typename... Args>
13+
HandleWrapper(Args&&... args)
14+
: handle_(std::forward<Args>(args)...) {
15+
16+
}
17+
18+
T& get_handle() {
19+
return handle_;
20+
}
21+
22+
const T& get_handle() const {
23+
return handle_;
24+
}
25+
private:
26+
T handle_;
27+
};
28+
29+
} // mocking
30+
} // cppkafka
31+
32+
#endif // CPPKAFKA_MOCKING_HANDLE_WRAPPER_H

mocking/src/CMakeLists.txt

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
set(SOURCES
2+
configuration_mock.cpp
3+
api.cpp
4+
)
5+
6+
include_directories(${PROJECT_SOURCE_DIR}/mocking/include/
7+
${PROJECT_SOURCE_DIR}/include/)
8+
include_directories(SYSTEM ${Boost_INCLUDE_DIRS} ${RDKAFKA_INCLUDE_DIR})
9+
10+
add_library(cppkafka_mock EXCLUDE_FROM_ALL ${CPPKAFKA_LIBRARY_TYPE} ${SOURCES})
11+
set_target_properties(cppkafka_mock PROPERTIES VERSION ${CPPKAFKA_VERSION}
12+
SOVERSION ${CPPKAFKA_VERSION})
13+
target_link_libraries(cppkafka_mock ${RDKAFKA_LIBRARY})

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy