chiark / gitweb /
journal: when browsing the journal via browse.html allow clicking on entries to show...
[elogind.git] / src / journal / test-journal-stream.c
1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
2
3 /***
4   This file is part of systemd.
5
6   Copyright 2012 Lennart Poettering
7
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.
12
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.
17
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/>.
20 ***/
21
22 #include <unistd.h>
23 #include <fcntl.h>
24
25 #include <systemd/sd-journal.h>
26
27 #include "journal-file.h"
28 #include "journal-internal.h"
29 #include "util.h"
30 #include "log.h"
31
32 #define N_ENTRIES 200
33
34 static void verify_contents(sd_journal *j, unsigned skip) {
35         unsigned i;
36
37         assert(j);
38
39         i = 0;
40         SD_JOURNAL_FOREACH(j) {
41                 const void *d;
42                 char *k, *c;
43                 size_t l;
44                 unsigned u;
45
46                 assert_se(sd_journal_get_cursor(j, &k) >= 0);
47                 printf("cursor: %s\n", k);
48                 free(k);
49
50                 assert_se(sd_journal_get_data(j, "MAGIC", &d, &l) >= 0);
51                 printf("\t%.*s\n", (int) l, (const char*) d);
52
53                 assert_se(sd_journal_get_data(j, "NUMBER", &d, &l) >= 0);
54                 assert_se(k = strndup(d, l));
55                 printf("\t%s\n", k);
56
57                 if (skip > 0) {
58                         assert_se(safe_atou(k + 7, &u) >= 0);
59                         assert_se(i == u);
60                         i += skip;
61                 }
62
63                 free(k);
64
65                 assert_se(sd_journal_get_cursor(j, &c) >= 0);
66                 assert_se(sd_journal_test_cursor(j, c) > 0);
67                 free(c);
68         }
69
70         if (skip > 0)
71                 assert_se(i == N_ENTRIES);
72 }
73
74 int main(int argc, char *argv[]) {
75         JournalFile *one, *two, *three;
76         char t[] = "/tmp/journal-stream-XXXXXX";
77         unsigned i;
78         sd_journal *j;
79         char *z;
80
81         log_set_max_level(LOG_DEBUG);
82
83         assert_se(mkdtemp(t));
84         assert_se(chdir(t) >= 0);
85
86         assert_se(journal_file_open("one.journal", O_RDWR|O_CREAT, 0666, true, false, NULL, NULL, NULL, &one) == 0);
87         assert_se(journal_file_open("two.journal", O_RDWR|O_CREAT, 0666, true, false, NULL, NULL, NULL, &two) == 0);
88         assert_se(journal_file_open("three.journal", O_RDWR|O_CREAT, 0666, true, false, NULL, NULL, NULL, &three) == 0);
89
90         for (i = 0; i < N_ENTRIES; i++) {
91                 char *p, *q;
92                 dual_timestamp ts;
93                 struct iovec iovec[2];
94
95                 dual_timestamp_get(&ts);
96
97                 assert_se(asprintf(&p, "NUMBER=%u", i) >= 0);
98                 iovec[0].iov_base = p;
99                 iovec[0].iov_len = strlen(p);
100
101                 assert_se(asprintf(&q, "MAGIC=%s", i % 5 == 0 ? "quux" : "waldo") >= 0);
102
103                 iovec[1].iov_base = q;
104                 iovec[1].iov_len = strlen(q);
105
106                 if (i % 10 == 0)
107                         assert_se(journal_file_append_entry(three, &ts, iovec, 2, NULL, NULL, NULL) == 0);
108                 else {
109                         if (i % 3 == 0)
110                                 assert_se(journal_file_append_entry(two, &ts, iovec, 2, NULL, NULL, NULL) == 0);
111
112                         assert_se(journal_file_append_entry(one, &ts, iovec, 2, NULL, NULL, NULL) == 0);
113                 }
114
115                 free(p);
116                 free(q);
117         }
118
119         journal_file_close(one);
120         journal_file_close(two);
121         journal_file_close(three);
122
123         assert_se(sd_journal_open_directory(&j, t, 0) >= 0);
124
125         assert_se(sd_journal_add_match(j, "MAGIC=quux", 0) >= 0);
126         SD_JOURNAL_FOREACH_BACKWARDS(j) {
127                 const void *d;
128                 size_t l;
129                 char *c;
130
131                 assert_se(sd_journal_get_data(j, "NUMBER", &d, &l) >= 0);
132                 printf("\t%.*s\n", (int) l, (const char*) d);
133
134                 assert_se(sd_journal_get_cursor(j, &c) >= 0);
135                 assert_se(sd_journal_test_cursor(j, c) > 0);
136                 free(c);
137         }
138
139         SD_JOURNAL_FOREACH(j) {
140                 const void *d;
141                 size_t l;
142                 char *c;
143
144                 assert_se(sd_journal_get_data(j, "NUMBER", &d, &l) >= 0);
145                 printf("\t%.*s\n", (int) l, (const char*) d);
146
147                 assert_se(sd_journal_get_cursor(j, &c) >= 0);
148                 assert_se(sd_journal_test_cursor(j, c) > 0);
149                 free(c);
150         }
151
152         sd_journal_flush_matches(j);
153
154         verify_contents(j, 1);
155
156         printf("NEXT TEST\n");
157         assert_se(sd_journal_add_match(j, "MAGIC=quux", 0) >= 0);
158
159         assert_se(z = journal_make_match_string(j));
160         printf("resulting match expression is: %s\n", z);
161         free(z);
162
163         verify_contents(j, 5);
164
165         printf("NEXT TEST\n");
166         sd_journal_flush_matches(j);
167         assert_se(sd_journal_add_match(j, "MAGIC=waldo", 0) >= 0);
168         assert_se(sd_journal_add_match(j, "NUMBER=10", 0) >= 0);
169         assert_se(sd_journal_add_match(j, "NUMBER=11", 0) >= 0);
170         assert_se(sd_journal_add_match(j, "NUMBER=12", 0) >= 0);
171
172         assert_se(z = journal_make_match_string(j));
173         printf("resulting match expression is: %s\n", z);
174         free(z);
175
176         verify_contents(j, 0);
177
178         sd_journal_close(j);
179
180         assert_se(rm_rf_dangerous(t, false, true, false) >= 0);
181
182         return 0;
183 }