Skip to content

Commit fe053f4

Browse files
committed
Add initial producer mock code
1 parent 5ec8dfd commit fe053f4

25 files changed

+596
-102
lines changed
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
#ifndef CPPKAFKA_MOCKING_EVENT_PROCESSOR_
2+
#define CPPKAFKA_MOCKING_EVENT_PROCESSOR_
3+
4+
#include <thread>
5+
#include <mutex>
6+
#include <queue>
7+
#include <condition_variable>
8+
#include <memory>
9+
#include <cppkafka/mocking/events/event_base.h>
10+
11+
namespace cppkafka {
12+
namespace mocking {
13+
14+
class EventProcessor {
15+
public:
16+
using EventPtr = std::unique_ptr<EventBase>;
17+
18+
EventProcessor();
19+
EventProcessor(const EventProcessor&) = delete;
20+
EventProcessor& operator=(const EventProcessor&) = delete;
21+
~EventProcessor();
22+
23+
void add_event(EventPtr event);
24+
private:
25+
void process_events();
26+
27+
std::thread processing_thread_;
28+
std::mutex events_mutex_;
29+
std::condition_variable events_condition_;
30+
std::queue<EventPtr> events_;
31+
bool running_{true};
32+
};
33+
34+
} // mocking
35+
} // cppkafka
36+
37+
#endif // CPPKAFKA_MOCKING_EVENT_PROCESSOR_
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
#ifndef CPPKAFKA_MOCKING_EVENT_BASE_H
2+
#define CPPKAFKA_MOCKING_EVENT_BASE_H
3+
4+
#include <memory>
5+
#include <string>
6+
7+
namespace cppkafka {
8+
namespace mocking {
9+
10+
class KafkaCluster;
11+
12+
class EventBase {
13+
public:
14+
using ClusterPtr = std::shared_ptr<KafkaCluster>;
15+
16+
EventBase(ClusterPtr cluster);
17+
virtual ~EventBase() = default;
18+
19+
void execute();
20+
virtual std::string get_type() const = 0;
21+
private:
22+
virtual void execute_event(KafkaCluster& cluster) = 0;
23+
24+
ClusterPtr cluster_;
25+
};
26+
27+
} // mocking
28+
} // cppkafka
29+
30+
#endif // CPPKAFKA_MOCKING_EVENT_BASE_H
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
#ifndef CPPKAFKA_MOCKING_PRODUCE_MESSAGE_EVENT_H
2+
#define CPPKAFKA_MOCKING_PRODUCE_MESSAGE_EVENT_H
3+
4+
#include <memory>
5+
#include <librdkafka/rdkafka.h>
6+
#include <cppkafka/mocking/events/event_base.h>
7+
#include <cppkafka/mocking/message_handle.h>
8+
9+
namespace cppkafka {
10+
namespace mocking {
11+
12+
class ProduceMessageEvent : public EventBase {
13+
public:
14+
ProduceMessageEvent(ClusterPtr cluster, MessageHandle message_handle);
15+
16+
std::string get_type() const;
17+
private:
18+
void execute_event(KafkaCluster& cluster);
19+
20+
MessageHandle message_handle_;
21+
std::string topic_;
22+
unsigned partition_;
23+
};
24+
25+
} // mocking
26+
} // cppkafka
27+
28+
#endif // CPPKAFKA_MOCKING_PRODUCE_MESSAGE_EVENT_H
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
#ifndef CPPKAFKA_MOCKING_HANDLE_MOCK_H
2+
#define CPPKAFKA_MOCKING_HANDLE_MOCK_H
3+
4+
#include <memory>
5+
#include <utility>
6+
#include <cppkafka/mocking/event_processor.h>
7+
8+
namespace cppkafka {
9+
namespace mocking {
10+
11+
class KafkaCluster;
12+
13+
class HandleMock {
14+
public:
15+
using ClusterPtr = std::shared_ptr<KafkaCluster>;
16+
using EventProcessorPtr = std::shared_ptr<EventProcessor>;
17+
18+
HandleMock(EventProcessorPtr processor);
19+
HandleMock(EventProcessorPtr processor, ClusterPtr cluster);
20+
virtual ~HandleMock() = default;
21+
22+
void set_cluster(ClusterPtr cluster);
23+
protected:
24+
using EventPtr = EventProcessor::EventPtr;
25+
26+
KafkaCluster& get_cluster();
27+
const KafkaCluster& get_cluster() const;
28+
void generate_event(EventPtr event);
29+
template <typename T, typename... Args>
30+
void generate_event(Args&&... args) {
31+
generate_event(EventPtr(new T(cluster_, std::forward<Args>(args)...)));
32+
}
33+
private:
34+
EventProcessorPtr processor_;
35+
ClusterPtr cluster_;
36+
};
37+
38+
} // mocking
39+
} // cppkafka
40+
41+
#endif // CPPKAFKA_MOCKING_HANDLE_MOCK_H

mocking/include/cppkafka/mocking/kafka_cluster.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33

44
#include <unordered_map>
55
#include <memory>
6-
#include <cppkafka/mocking/topic_mock.h>
7-
#include <cppkafka/mocking/message_mock.h>
6+
#include <cppkafka/mocking/kafka_topic_mock.h>
7+
#include <cppkafka/mocking/kafka_message_mock.h>
88

99
namespace cppkafka {
1010
namespace mocking {
@@ -20,12 +20,12 @@ class KafkaCluster {
2020
const std::string& get_url() const;
2121

2222
void add_topic(const std::string& name, unsigned partitions);
23-
void produce(const std::string& topic, unsigned partition, MessageMock message);
23+
void produce(const std::string& topic, unsigned partition, KafkaMessageMock message);
2424
private:
2525
KafkaCluster(std::string url);
2626

2727
const std::string url_;
28-
std::unordered_map<std::string, TopicMock> topics_;
28+
std::unordered_map<std::string, KafkaTopicMock> topics_;
2929
};
3030

3131
} // mocking

mocking/include/cppkafka/mocking/message_mock.h renamed to mocking/include/cppkafka/mocking/kafka_message_mock.h

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
#ifndef CPPKAFKA_MOCKING_MESSAGE_MOCK_H
2-
#define CPPKAFKA_MOCKING_MESSAGE_MOCK_H
1+
#ifndef CPPKAFKA_MOCKING_KAFKA_MESSAGE_MOCK_H
2+
#define CPPKAFKA_MOCKING_KAFKA_MESSAGE_MOCK_H
33

44
#include <vector>
55
#include <cstdint>
@@ -8,12 +8,12 @@
88
namespace cppkafka {
99
namespace mocking {
1010

11-
class MessageMock {
11+
class KafkaMessageMock {
1212
public:
1313
using Buffer = std::vector<uint8_t>;
1414

15-
MessageMock(Buffer key, Buffer payload, rd_kafka_timestamp_type_t timestamp_type,
16-
int64_t timestamp);
15+
KafkaMessageMock(Buffer key, Buffer payload, rd_kafka_timestamp_type_t timestamp_type,
16+
int64_t timestamp);
1717

1818
const Buffer& get_key() const;
1919
const Buffer& get_payload() const;
@@ -29,4 +29,4 @@ class MessageMock {
2929
} // mocking
3030
} // cppkafka
3131

32-
#endif // CPPKAFKA_MOCKING_MESSAGE_MOCK_H
32+
#endif // CPPKAFKA_MOCKING_KAFKA_MESSAGE_MOCK_H
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
#ifndef CPPKAFKA_MOCKING_KAFKA_PARTITION_MOCK_H
2+
#define CPPKAFKA_MOCKING_KAFKA_PARTITION_MOCK_H
3+
4+
#include <deque>
5+
#include <mutex>
6+
#include <cppkafka/mocking/kafka_message_mock.h>
7+
8+
namespace cppkafka {
9+
namespace mocking {
10+
11+
class KafkaPartitionMock {
12+
public:
13+
void add_message(KafkaMessageMock message);
14+
const KafkaMessageMock& get_message(uint64_t offset) const;
15+
size_t get_message_count() const;
16+
private:
17+
uint64_t base_offset_{0};
18+
std::deque<KafkaMessageMock> messages_;
19+
mutable std::mutex messages_mutex_;
20+
};
21+
22+
} // mocking
23+
} // cppkafka
24+
25+
#endif // CPPKAFKA_MOCKING_KAFKA_PARTITION_MOCK_H
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
#ifndef CPPKAFKA_MOCKING_KAFKA_TOPIC_MOCK_H
2+
#define CPPKAFKA_MOCKING_KAFKA_TOPIC_MOCK_H
3+
4+
#include <string>
5+
#include <vector>
6+
#include <cppkafka/mocking/kafka_partition_mock.h>
7+
8+
namespace cppkafka {
9+
namespace mocking {
10+
11+
class KafkaMessageMock;
12+
13+
class KafkaTopicMock {
14+
public:
15+
KafkaTopicMock(std::string name, unsigned partition_count);
16+
void add_message(unsigned partition, KafkaMessageMock message);
17+
private:
18+
const std::string name_;
19+
std::vector<KafkaPartitionMock> partitions_;
20+
};
21+
22+
} // mocking
23+
} // cppkafka
24+
25+
#endif // CPPKAFKA_MOCKING_KAFKA_TOPIC_MOCK_H
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
#ifndef CPPKAFKA_MOCKING_MESSAGE_HANDLE_H
2+
#define CPPKAFKA_MOCKING_MESSAGE_HANDLE_H
3+
4+
#include <string>
5+
#include <memory>
6+
#include <librdkafka/rdkafka.h>
7+
#include <cppkafka/mocking/topic_handle.h>
8+
9+
namespace cppkafka {
10+
namespace mocking {
11+
12+
class KafkaMessageMock;
13+
14+
class MessageHandlePrivateData {
15+
public:
16+
MessageHandlePrivateData() = default;
17+
MessageHandlePrivateData(rd_kafka_timestamp_type_t timestamp_type, int64_t timestamp);
18+
19+
rd_kafka_timestamp_type_t get_timestamp_type() const;
20+
int64_t get_timestamp() const;
21+
private:
22+
rd_kafka_timestamp_type_t timestamp_type_;
23+
int64_t timestamp_;
24+
};
25+
26+
class MessageHandle {
27+
public:
28+
enum class PointerOwnership {
29+
Owned,
30+
Unowned
31+
};
32+
33+
MessageHandle(std::unique_ptr<TopicHandle> topic, int partition, int64_t offset, void* key,
34+
size_t key_size, void* payload, size_t payload_size, int error_code,
35+
MessageHandlePrivateData private_data, PointerOwnership ownership);
36+
MessageHandle(MessageHandle&& other);
37+
MessageHandle& operator=(MessageHandle&& other);
38+
~MessageHandle();
39+
40+
const TopicHandle& get_topic() const;
41+
const rd_kafka_message_t& get_message() const;
42+
KafkaMessageMock make_message_mock() const;
43+
private:
44+
void set_private_data_pointer();
45+
46+
std::unique_ptr<TopicHandle> topic_;
47+
rd_kafka_message_t message_{};
48+
MessageHandlePrivateData private_data_;
49+
PointerOwnership ownership_;
50+
};
51+
52+
} // mocking
53+
} // cppkafka
54+
55+
#endif // CPPKAFKA_MOCKING_MESSAGE_HANDLE_H

mocking/include/cppkafka/mocking/partition_mock.h

Lines changed: 0 additions & 25 deletions
This file was deleted.

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