Add mocks for blockstore integration tests: timerfd, ring_loop_mock_t and disk_mock_t

This commit is contained in:
Vitaliy Filippov
2025-12-02 01:52:12 +03:00
parent bcde273ca1
commit b599334c4a
10 changed files with 401 additions and 36 deletions
+70 -2
View File
@@ -32,7 +32,27 @@ struct ring_consumer_t
std::function<void(void)> loop;
};
class __attribute__((visibility("default"))) ring_loop_t
class __attribute__((visibility("default"))) ring_loop_i
{
public:
virtual ~ring_loop_i() = default;
virtual void register_consumer(ring_consumer_t *consumer) = 0;
virtual void unregister_consumer(ring_consumer_t *consumer) = 0;
virtual int register_eventfd() = 0;
virtual io_uring_sqe* get_sqe() = 0;
virtual void set_immediate(const std::function<void()> & cb) = 0;
virtual int submit() = 0;
virtual int wait() = 0;
virtual unsigned space_left() = 0;
virtual bool has_work() = 0;
virtual bool has_sendmsg_zc() = 0;
virtual void loop() = 0;
virtual void wakeup() = 0;
virtual unsigned save() = 0;
virtual void restore(unsigned sqe_tail) = 0;
};
class __attribute__((visibility("default"))) ring_loop_t: public ring_loop_i
{
std::vector<std::function<void()>> immediate_queue, immediate_queue2;
std::vector<ring_consumer_t*> consumers;
@@ -54,7 +74,7 @@ public:
int register_eventfd();
io_uring_sqe* get_sqe();
inline void set_immediate(const std::function<void()> cb)
inline void set_immediate(const std::function<void()> & cb)
{
immediate_queue.push_back(cb);
wakeup();
@@ -84,3 +104,51 @@ public:
unsigned save();
void restore(unsigned sqe_tail);
};
class ring_loop_mock_t: public ring_loop_i
{
std::vector<std::function<void()>> immediate_queue, immediate_queue2;
std::vector<ring_consumer_t*> consumers;
std::vector<io_uring_sqe> sqes;
std::vector<ring_data_t> ring_datas;
std::vector<ring_data_t *> free_ring_datas;
std::vector<ring_data_t *> submit_ring_datas;
std::vector<ring_data_t *> completed_ring_datas;
std::function<void(io_uring_sqe *)> submit_cb;
bool in_loop;
bool loop_again;
bool support_zc = false;
public:
ring_loop_mock_t(int qd, std::function<void(io_uring_sqe *)> submit_cb);
void register_consumer(ring_consumer_t *consumer);
void unregister_consumer(ring_consumer_t *consumer);
void wakeup();
void set_immediate(const std::function<void()> & cb);
unsigned space_left();
bool has_work();
bool has_sendmsg_zc();
int register_eventfd();
io_uring_sqe* get_sqe();
int submit();
int wait();
void loop();
unsigned save();
void restore(unsigned sqe_tail);
void mark_completed(ring_data_t *data);
};
class disk_mock_t
{
uint8_t *data = NULL;
size_t size = 0;
ring_loop_mock_t *loop = NULL;
public:
bool trace = false;
disk_mock_t(ring_loop_mock_t *loop, size_t size);
~disk_mock_t();
bool submit(io_uring_sqe *sqe);
};