void __test_seeks(Journald *journald) { gint result = journald_seek_head(journald); assert_gint(result, 0, ASSERTION_ERROR("Can't seek in empty journald mock")); result = journald_next(journald); assert_gint(result, 0, ASSERTION_ERROR("Bad next step result")); MockEntry *entry = mock_entry_new("test_data1"); mock_entry_add_data(entry, "MESSAGE=test message"); mock_entry_add_data(entry, "KEY=VALUE"); mock_entry_add_data(entry, "HOST=testhost"); journald_mock_add_entry(journald, entry); entry = mock_entry_new("test_data2"); mock_entry_add_data(entry, "MESSAGE=test message2"); mock_entry_add_data(entry, "KEY=VALUE2"); mock_entry_add_data(entry, "HOST=testhost2"); journald_mock_add_entry(journald, entry); result = journald_seek_head(journald); assert_gint(result, 0, ASSERTION_ERROR("Can't seek in journald mock")); result = journald_next(journald); assert_gint(result, 1, ASSERTION_ERROR("Bad next step result")); }
void __test_cursors(Journald *journald) { gchar *cursor; gint result = journald_get_cursor(journald, &cursor); assert_string(cursor, "test_data1", ASSERTION_ERROR("Bad cursor fetched"));\ g_free(cursor); result = journald_next(journald); assert_gint(result, 1, ASSERTION_ERROR("Bad next step result")); result = journald_get_cursor(journald, &cursor); assert_string(cursor, "test_data2", ASSERTION_ERROR("Bad cursor fetched")); g_free(cursor); result = journald_next(journald); assert_gint(result, 0, ASSERTION_ERROR("Should not contain more elements")); result = journald_seek_cursor(journald, "test_data1"); assert_gint(result, 0, ASSERTION_ERROR("Should find cursor")); result = journald_next(journald); assert_gint(result, 1, ASSERTION_ERROR("Bad next step result")); result = journald_get_cursor(journald, &cursor); assert_string(cursor, "test_data1", ASSERTION_ERROR("Bad cursor fetched")); g_free(cursor); result = journald_seek_cursor(journald, "test_data2"); assert_gint(result, 0, ASSERTION_ERROR("Should find cursor")); result = journald_next(journald); assert_gint(result, 1, ASSERTION_ERROR("Bad next step result")); result = journald_get_cursor(journald, &cursor); assert_string(cursor, "test_data2", ASSERTION_ERROR("Bad cursor fetched")); g_free(cursor); }
static gint _fetch_log(JournalReader *self) { gint msg_count = 0; gint result = 0; self->immediate_check = TRUE; while (msg_count < self->options->fetch_limit && !main_loop_worker_job_quit()) { gint rc = journald_next(self->journal); if (rc > 0) { Bookmark *bookmark = ack_tracker_request_bookmark(self->super.ack_tracker); _fill_bookmark(self, bookmark); msg_count++; if (!_handle_message(self)) { break; } } else { self->immediate_check = FALSE; /* rc == 0 means EOF */ if (rc < 0) { msg_error("Error occurred while getting next message from journal", evt_tag_errno("error", errno)); result = NC_READ_ERROR; } break; } } return result; }
void test_journald_helper() { Journald *journald = journald_mock_new(); journald_open(journald, 0); MockEntry *entry = mock_entry_new("test_data1"); mock_entry_add_data(entry, "MESSAGE=test message"); mock_entry_add_data(entry, "KEY=VALUE"); mock_entry_add_data(entry, "HOST=testhost"); journald_mock_add_entry(journald, entry); journald_seek_head(journald); journald_next(journald); GHashTable *result = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); journald_foreach_data(journald, __helper_test, result); gchar *message = g_hash_table_lookup(result, "MESSAGE"); gchar *key = g_hash_table_lookup(result, "KEY"); gchar *host = g_hash_table_lookup(result, "HOST"); assert_string(message, "test message", ASSERTION_ERROR("Bad item")); assert_string(key, "VALUE", ASSERTION_ERROR("Bad item")); assert_string(host, "testhost", ASSERTION_ERROR("Bad item")); journald_close(journald); journald_free(journald); g_hash_table_unref(result); }
void __test_enumerate(Journald *journald) { const void *data; const void *prev_data; gsize length; gsize prev_len; gint result; journald_restart_data(journald); result = journald_enumerate_data(journald, &data, &length); assert_gint(result, 1, ASSERTION_ERROR("Data should exist")); prev_data = data; prev_len = length; result = journald_enumerate_data(journald, &data, &length); assert_gint(result, 1, ASSERTION_ERROR("Data should exist")); result = journald_enumerate_data(journald, &data, &length); assert_gint(result, 1, ASSERTION_ERROR("Data should exist")); result = journald_enumerate_data(journald, &data, &length); assert_gint(result, 0, ASSERTION_ERROR("Data should not exist")); journald_restart_data(journald); result = journald_enumerate_data(journald, &data, &length); assert_gint(result, 1, ASSERTION_ERROR("Data should exist")); assert_gpointer((gpointer )data, (gpointer )prev_data, ASSERTION_ERROR("restart data should seek the start of the data")); assert_gint(length, prev_len, ASSERTION_ERROR("Bad length after restart data")); result = journald_next(journald); assert_gint(result, 0, ASSERTION_ERROR("Should not contain more elements")); }
Test(systemd_journal, test_journald_helper) { const gchar *persist_file = "test_systemd_journal2.persist"; _init_cfg_with_persist_file(persist_file); Journald *journald = journald_mock_new(); journald_open(journald, 0); MockEntry *entry = mock_entry_new("test_data1"); mock_entry_add_data(entry, "MESSAGE=test message"); mock_entry_add_data(entry, "KEY=VALUE"); mock_entry_add_data(entry, "HOST=testhost"); journald_mock_add_entry(journald, entry); journald_seek_head(journald); journald_next(journald); GHashTable *result = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); journald_foreach_data(journald, __helper_test, result); gchar *message = g_hash_table_lookup(result, "MESSAGE"); gchar *key = g_hash_table_lookup(result, "KEY"); gchar *host = g_hash_table_lookup(result, "HOST"); cr_assert_str_eq(message, "test message", "%s", "Bad item"); cr_assert_str_eq(key, "VALUE", "%s", "Bad item"); cr_assert_str_eq(host, "testhost", "%s", "Bad item"); journald_close(journald); journald_free(journald); g_hash_table_unref(result); _deinit_cfg(persist_file); }
void __test_enumerate(Journald *journald) { const void *data; const void *prev_data; gsize length; gsize prev_len; gint result; journald_restart_data(journald); result = journald_enumerate_data(journald, &data, &length); cr_assert_eq(result, 1, "%s", "Data should exist"); prev_data = data; prev_len = length; result = journald_enumerate_data(journald, &data, &length); cr_assert_eq(result, 1, "%s", "Data should exist"); result = journald_enumerate_data(journald, &data, &length); cr_assert_eq(result, 1, "%s", "Data should exist"); result = journald_enumerate_data(journald, &data, &length); cr_assert_eq(result, 0, "%s", "Data should not exist"); journald_restart_data(journald); result = journald_enumerate_data(journald, &data, &length); cr_assert_eq(result, 1, "%s", "Data should exist"); cr_assert_eq((gpointer )data, (gpointer )prev_data, "%s", "restart data should seek the start of the data"); cr_assert_eq(length, prev_len, "%s", "Bad length after restart data"); result = journald_next(journald); cr_assert_eq(result, 0, "%s", "Should not contain more elements"); }
void __test_cursors(Journald *journald) { gchar *cursor; journald_seek_head(journald); journald_next(journald); gint result = journald_get_cursor(journald, &cursor); cr_assert_str_eq(cursor, "test_data1", "%s", "Bad cursor fetched"); \ g_free(cursor); result = journald_next(journald); cr_assert_eq(result, 1, "%s", "Bad next step result"); result = journald_get_cursor(journald, &cursor); cr_assert_str_eq(cursor, "test_data2", "%s", "Bad cursor fetched"); g_free(cursor); result = journald_next(journald); cr_assert_eq(result, 0, "%s", "Should not contain more elements"); result = journald_seek_cursor(journald, "test_data1"); cr_assert_eq(result, 0, "%s", "Should find cursor"); result = journald_next(journald); cr_assert_eq(result, 1, "%s", "Bad next step result"); result = journald_get_cursor(journald, &cursor); cr_assert_str_eq(cursor, "test_data1", "%s", "Bad cursor fetched"); g_free(cursor); result = journald_seek_cursor(journald, "test_data2"); cr_assert_eq(result, 0, "%s", "Should find cursor"); result = journald_next(journald); cr_assert_eq(result, 1, "%s", "Bad next step result"); result = journald_get_cursor(journald, &cursor); cr_assert_str_eq(cursor, "test_data2", "%s", "Bad cursor fetched"); g_free(cursor); }
static inline gboolean _seek_to_saved_state(JournalReader *self) { JournalReaderState *state = persist_state_map_entry(self->persist_state, self->persist_handle); gint rc = journald_seek_cursor(self->journal, state->cursor); persist_state_unmap_entry(self->persist_state, self->persist_handle); if (rc != 0) { msg_warning("Failed to seek journal to the saved cursor position", evt_tag_str("cursor", state->cursor), evt_tag_errno("error", errno)); return _seek_to_head(self); } else { msg_debug("Seeking the journal to the last cursor position", evt_tag_str("cursor", state->cursor)); } journald_next(self->journal); return TRUE; }