chiark / gitweb /
bootchart: rename global len to samples_len
[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         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 *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                 free(c);
137         }
138
139         SD_JOURNAL_FOREACH(j) {
140                 char *c;
141
142                 assert_se(sd_journal_get_data(j, "NUMBER", &data, &l) >= 0);
143                 printf("\t%.*s\n", (int) l, (const char*) data);
144
145                 assert_se(sd_journal_get_cursor(j, &c) >= 0);
146                 assert_se(sd_journal_test_cursor(j, c) > 0);
147                 free(c);
148         }
149
150         sd_journal_flush_matches(j);
151
152         verify_contents(j, 1);
153
154         printf("NEXT TEST\n");
155         assert_se(sd_journal_add_match(j, "MAGIC=quux", 0) >= 0);
156
157         assert_se(z = journal_make_match_string(j));
158         printf("resulting match expression is: %s\n", z);
159         free(z);
160
161         verify_contents(j, 5);
162
163         printf("NEXT TEST\n");
164         sd_journal_flush_matches(j);
165         assert_se(sd_journal_add_match(j, "MAGIC=waldo", 0) >= 0);
166         assert_se(sd_journal_add_match(j, "NUMBER=10", 0) >= 0);
167         assert_se(sd_journal_add_match(j, "NUMBER=11", 0) >= 0);
168         assert_se(sd_journal_add_match(j, "NUMBER=12", 0) >= 0);
169
170         assert_se(z = journal_make_match_string(j));
171         printf("resulting match expression is: %s\n", z);
172         free(z);
173
174         verify_contents(j, 0);
175
176         assert_se(sd_journal_query_unique(j, "NUMBER") >= 0);
177         SD_JOURNAL_FOREACH_UNIQUE(j, data, l)
178                 printf("%.*s\n", (int) l, (const char*) data);
179
180         sd_journal_close(j);
181
182         assert_se(rm_rf_dangerous(t, false, true, false) >= 0);
183
184         return 0;
185 }