3 #include <queued_entry.h>
5 #include <dlog-internal.h>
6 #include <sort_vector.h>
7 #include "../libdlogutil/fd_info.h"
9 bool process_log(const dlogutil_entry_s *e, struct timespec reference_ts, dlogutil_sorting_order_e stamp_type, long timeout, int *callback_ret);
10 struct fd_info *find_earliest_log(struct fd_info **data_fds, int fd_count, dlogutil_sorting_order_e sort_by);
11 int put_logs_into_vector(struct fd_info **data_fds, int fd_count, struct sort_vector *logs, struct log_filter *filter, bool limited_dump, bool *at_least_one_buffer_drained, bool *all_buffers_empty, dlogutil_entry_s **entry_out);
13 int __wrap_clock_gettime(clockid_t clk_id, struct timespec *tp)
15 assert(clk_id == CLOCK_MONOTONIC);
18 tp->tv_nsec = 900000000;
22 bool __wrap_log_should_print_line(struct log_filter *p_filter, const dlogutil_entry_s *entry)
30 const dlogutil_entry_s *ent;
33 bool test_has_log(struct fd_info *fdi)
35 struct fdi_internal *ii = fdi->priv_data;
39 const dlogutil_entry_s *test_peek_entry(const struct fd_info *fdi)
41 struct fdi_internal *ii = fdi->priv_data;
45 int fdi_push_log_ret = 0;
46 int __wrap_fdi_push_log(struct fd_info *fdi, struct sort_vector *logs, bool limited_dump, dlogutil_entry_s **entry_out, struct log_filter *filter)
48 assert(filter == (struct log_filter *)0xEEE);
49 if (fdi_push_log_ret != 0)
50 return fdi_push_log_ret;
51 dlogutil_entry_s *ent = calloc(1, sizeof(*ent));
53 memcpy(ent, fdi->ops->peek_entry(fdi), sizeof(*ent));
54 struct fdi_internal *ii = fdi->priv_data;
58 if (sort_vector_full(logs)) {
60 *entry_out = sort_vector_pop_ret(logs);
62 sort_vector_pop(logs);
64 sort_vector_push(logs, ent);
70 struct sort_vector sv;
71 sort_vector_init(&sv);
72 sv.sort_by = DLOGUTIL_SORT_SENT_MONO;
74 sv.size = DEFAULT_SORT_BUFFER_SIZE;
75 sort_vector_finalize(&sv);
76 assert(sort_vector_time_span(&sv, (struct timespec) { .tv_nsec = -1, }) == 0);
78 for (int i = 0; i < 10; ++i) {
79 dlogutil_entry_s *ent2 = calloc(1, sizeof(*ent2));
81 ent2->sec_sent_mono = 1;
82 ent2->nsec_sent_mono = (79 + i) * 10000000;
83 sort_vector_push(&sv, ent2);
86 assert(sort_vector_time_span(&sv, (struct timespec) { .tv_nsec = -1, }) == 110);
88 dlogutil_entry_s *ent3 = calloc(1, sizeof(*ent3));
90 ent3->sec_sent_mono = 0;
91 ent3->nsec_sent_mono = 999999999;
92 sort_vector_push(&sv, ent3);
93 assert(sort_vector_time_span(&sv, (struct timespec) { .tv_nsec = -1, }) == 900);
95 struct fd_ops test_ops = {
96 .has_log = test_has_log,
97 .peek_entry = test_peek_entry,
100 struct fd_info fd_stor[10] = {};
101 struct fdi_internal ii_stor[10] = {};
102 dlogutil_entry_s ent_stor[10 - 3] = {};
103 for (int i = 0; i < 10; ++i) {
105 ii_stor[i].has_log = false;
107 ent_stor[i - 3].sec_sent_mono = i % 2;
108 ent_stor[i - 3].nsec_sent_mono = i;
110 ii_stor[i].has_log = true;
111 ii_stor[i].ent = &ent_stor[i - 3];
115 fd_stor[i].ops = &test_ops;
116 fd_stor[i].priv_data = &ii_stor[t];
119 struct fd_info *fds[10] = {};
120 for (int i = 0; i < 10; ++i) {
121 fds[i] = &fd_stor[i];
123 assert(!find_earliest_log(fds, 0, DLOGUTIL_SORT_SENT_MONO));
124 assert(find_earliest_log(fds, 10, DLOGUTIL_SORT_SENT_MONO) == fds[8]);
126 while (!sort_vector_empty(&sv))
127 sort_vector_pop(&sv);
129 dlogutil_entry_s *vector_overflown = NULL;
130 bool need_epoll = false, all_drained = false;
131 assert(put_logs_into_vector(fds, 0, &sv, (struct log_filter *)0xEEE, false, &need_epoll, &all_drained, &vector_overflown) == 0);
132 assert(!vector_overflown);
136 fdi_push_log_ret = -EIO;
137 assert(put_logs_into_vector(fds, 10, &sv, (struct log_filter *)0xEEE, false, &need_epoll, &all_drained, &vector_overflown) == -EIO);
138 assert(!vector_overflown);
140 fdi_push_log_ret = 0;
143 assert(put_logs_into_vector(fds, 10, &sv, (struct log_filter *)0xEEE, false, &need_epoll, &all_drained, &vector_overflown) == 0);
144 assert(!vector_overflown);
145 assert(sort_vector_used_size(&sv) == 1);
146 assert(!all_drained);
149 sort_vector_free(&sv);