1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
4 This file is part of systemd.
6 Copyright 2012 Lennart Poettering
8 systemd is free software; you can redistribute it and/or modify it
9 under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 2.1 of the License, or
11 (at your option) any later version.
13 systemd is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
18 You should have received a copy of the GNU Lesser General Public License
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
25 #include "systemd/sd-journal.h"
27 #include "journal-file.h"
28 #include "journal-internal.h"
35 static void verify_contents(sd_journal *j, unsigned skip) {
41 SD_JOURNAL_FOREACH(j) {
47 assert_se(sd_journal_get_cursor(j, &k) >= 0);
48 printf("cursor: %s\n", k);
51 assert_se(sd_journal_get_data(j, "MAGIC", &d, &l) >= 0);
52 printf("\t%.*s\n", (int) l, (const char*) d);
54 assert_se(sd_journal_get_data(j, "NUMBER", &d, &l) >= 0);
55 assert_se(k = strndup(d, l));
59 assert_se(safe_atou(k + 7, &u) >= 0);
66 assert_se(sd_journal_get_cursor(j, &c) >= 0);
67 assert_se(sd_journal_test_cursor(j, c) > 0);
72 assert_se(i == N_ENTRIES);
75 int main(int argc, char *argv[]) {
76 JournalFile *one, *two, *three;
77 char t[] = "/tmp/journal-stream-XXXXXX";
79 _cleanup_journal_close_ sd_journal *j = NULL;
84 /* journal_file_open requires a valid machine id */
85 if (access("/etc/machine-id", F_OK) != 0)
86 return EXIT_TEST_SKIP;
88 log_set_max_level(LOG_DEBUG);
90 assert_se(mkdtemp(t));
91 assert_se(chdir(t) >= 0);
93 assert_se(journal_file_open("one.journal", O_RDWR|O_CREAT, 0666, true, false, NULL, NULL, NULL, &one) == 0);
94 assert_se(journal_file_open("two.journal", O_RDWR|O_CREAT, 0666, true, false, NULL, NULL, NULL, &two) == 0);
95 assert_se(journal_file_open("three.journal", O_RDWR|O_CREAT, 0666, true, false, NULL, NULL, NULL, &three) == 0);
97 for (i = 0; i < N_ENTRIES; i++) {
100 struct iovec iovec[2];
102 dual_timestamp_get(&ts);
104 assert_se(asprintf(&p, "NUMBER=%u", i) >= 0);
105 iovec[0].iov_base = p;
106 iovec[0].iov_len = strlen(p);
108 assert_se(asprintf(&q, "MAGIC=%s", i % 5 == 0 ? "quux" : "waldo") >= 0);
110 iovec[1].iov_base = q;
111 iovec[1].iov_len = strlen(q);
114 assert_se(journal_file_append_entry(three, &ts, iovec, 2, NULL, NULL, NULL) == 0);
117 assert_se(journal_file_append_entry(two, &ts, iovec, 2, NULL, NULL, NULL) == 0);
119 assert_se(journal_file_append_entry(one, &ts, iovec, 2, NULL, NULL, NULL) == 0);
126 journal_file_close(one);
127 journal_file_close(two);
128 journal_file_close(three);
130 assert_se(sd_journal_open_directory(&j, t, 0) >= 0);
132 assert_se(sd_journal_add_match(j, "MAGIC=quux", 0) >= 0);
133 SD_JOURNAL_FOREACH_BACKWARDS(j) {
134 _cleanup_free_ char *c;
136 assert_se(sd_journal_get_data(j, "NUMBER", &data, &l) >= 0);
137 printf("\t%.*s\n", (int) l, (const char*) data);
139 assert_se(sd_journal_get_cursor(j, &c) >= 0);
140 assert_se(sd_journal_test_cursor(j, c) > 0);
143 SD_JOURNAL_FOREACH(j) {
144 _cleanup_free_ char *c;
146 assert_se(sd_journal_get_data(j, "NUMBER", &data, &l) >= 0);
147 printf("\t%.*s\n", (int) l, (const char*) data);
149 assert_se(sd_journal_get_cursor(j, &c) >= 0);
150 assert_se(sd_journal_test_cursor(j, c) > 0);
153 sd_journal_flush_matches(j);
155 verify_contents(j, 1);
157 printf("NEXT TEST\n");
158 assert_se(sd_journal_add_match(j, "MAGIC=quux", 0) >= 0);
160 assert_se(z = journal_make_match_string(j));
161 printf("resulting match expression is: %s\n", z);
164 verify_contents(j, 5);
166 printf("NEXT TEST\n");
167 sd_journal_flush_matches(j);
168 assert_se(sd_journal_add_match(j, "MAGIC=waldo", 0) >= 0);
169 assert_se(sd_journal_add_match(j, "NUMBER=10", 0) >= 0);
170 assert_se(sd_journal_add_match(j, "NUMBER=11", 0) >= 0);
171 assert_se(sd_journal_add_match(j, "NUMBER=12", 0) >= 0);
173 assert_se(z = journal_make_match_string(j));
174 printf("resulting match expression is: %s\n", z);
177 verify_contents(j, 0);
179 assert_se(sd_journal_query_unique(j, "NUMBER") >= 0);
180 SD_JOURNAL_FOREACH_UNIQUE(j, data, l)
181 printf("%.*s\n", (int) l, (const char*) data);
183 assert_se(rm_rf_dangerous(t, false, true, false) >= 0);