chiark / gitweb /
Do no isolate in case of emergency or severe problems
[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 _cleanup_journal_close_ *j = NULL;
79         char *z;
80         const void *data;
81         size_t l;
82
83         log_set_max_level(LOG_DEBUG);
84
85         assert_se(mkdtemp(t));
86         assert_se(chdir(t) >= 0);
87
88         assert_se(journal_file_open("one.journal", O_RDWR|O_CREAT, 0666, true, false, NULL, NULL, NULL, &one) == 0);
89         assert_se(journal_file_open("two.journal", O_RDWR|O_CREAT, 0666, true, false, NULL, NULL, NULL, &two) == 0);
90         assert_se(journal_file_open("three.journal", O_RDWR|O_CREAT, 0666, true, false, NULL, NULL, NULL, &three) == 0);
91
92         for (i = 0; i < N_ENTRIES; i++) {
93                 char *p, *q;
94                 dual_timestamp ts;
95                 struct iovec iovec[2];
96
97                 dual_timestamp_get(&ts);
98
99                 assert_se(asprintf(&p, "NUMBER=%u", i) >= 0);
100                 iovec[0].iov_base = p;
101                 iovec[0].iov_len = strlen(p);
102
103                 assert_se(asprintf(&q, "MAGIC=%s", i % 5 == 0 ? "quux" : "waldo") >= 0);
104
105                 iovec[1].iov_base = q;
106                 iovec[1].iov_len = strlen(q);
107
108                 if (i % 10 == 0)
109                         assert_se(journal_file_append_entry(three, &ts, iovec, 2, NULL, NULL, NULL) == 0);
110                 else {
111                         if (i % 3 == 0)
112                                 assert_se(journal_file_append_entry(two, &ts, iovec, 2, NULL, NULL, NULL) == 0);
113
114                         assert_se(journal_file_append_entry(one, &ts, iovec, 2, NULL, NULL, NULL) == 0);
115                 }
116
117                 free(p);
118                 free(q);
119         }
120
121         journal_file_close(one);
122         journal_file_close(two);
123         journal_file_close(three);
124
125         assert_se(sd_journal_open_directory(&j, t, 0) >= 0);
126
127         assert_se(sd_journal_add_match(j, "MAGIC=quux", 0) >= 0);
128         SD_JOURNAL_FOREACH_BACKWARDS(j) {
129                 char _cleanup_free_ *c;
130
131                 assert_se(sd_journal_get_data(j, "NUMBER", &data, &l) >= 0);
132                 printf("\t%.*s\n", (int) l, (const char*) data);
133
134                 assert_se(sd_journal_get_cursor(j, &c) >= 0);
135                 assert_se(sd_journal_test_cursor(j, c) > 0);
136         }
137
138         SD_JOURNAL_FOREACH(j) {
139                 char _cleanup_free_ *c;
140
141                 assert_se(sd_journal_get_data(j, "NUMBER", &data, &l) >= 0);
142                 printf("\t%.*s\n", (int) l, (const char*) data);
143
144                 assert_se(sd_journal_get_cursor(j, &c) >= 0);
145                 assert_se(sd_journal_test_cursor(j, c) > 0);
146         }
147
148         sd_journal_flush_matches(j);
149
150         verify_contents(j, 1);
151
152         printf("NEXT TEST\n");
153         assert_se(sd_journal_add_match(j, "MAGIC=quux", 0) >= 0);
154
155         assert_se(z = journal_make_match_string(j));
156         printf("resulting match expression is: %s\n", z);
157         free(z);
158
159         verify_contents(j, 5);
160
161         printf("NEXT TEST\n");
162         sd_journal_flush_matches(j);
163         assert_se(sd_journal_add_match(j, "MAGIC=waldo", 0) >= 0);
164         assert_se(sd_journal_add_match(j, "NUMBER=10", 0) >= 0);
165         assert_se(sd_journal_add_match(j, "NUMBER=11", 0) >= 0);
166         assert_se(sd_journal_add_match(j, "NUMBER=12", 0) >= 0);
167
168         assert_se(z = journal_make_match_string(j));
169         printf("resulting match expression is: %s\n", z);
170         free(z);
171
172         verify_contents(j, 0);
173
174         assert_se(sd_journal_query_unique(j, "NUMBER") >= 0);
175         SD_JOURNAL_FOREACH_UNIQUE(j, data, l)
176                 printf("%.*s\n", (int) l, (const char*) data);
177
178         assert_se(rm_rf_dangerous(t, false, true, false) >= 0);
179
180         return 0;
181 }