chiark / gitweb /
sd-journal: verify that object start with the field name
[elogind.git] / src / journal / test-journal.c
1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
2
3 /***
4   This file is part of systemd.
5
6   Copyright 2011 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 <fcntl.h>
23 #include <unistd.h>
24
25 #include "systemd/sd-journal.h"
26
27 #include "log.h"
28 #include "journal-file.h"
29 #include "journal-authenticate.h"
30 #include "journal-vacuum.h"
31
32 static bool arg_keep = false;
33
34 static void test_non_empty(void) {
35         dual_timestamp ts;
36         JournalFile *f;
37         struct iovec iovec;
38         static const char test[] = "TEST1=1", test2[] = "TEST2=2";
39         Object *o;
40         uint64_t p;
41         char t[] = "/tmp/journal-XXXXXX";
42
43         log_set_max_level(LOG_DEBUG);
44
45         assert_se(mkdtemp(t));
46         assert_se(chdir(t) >= 0);
47
48         assert_se(journal_file_open("test.journal", O_RDWR|O_CREAT, 0666, true, true, NULL, NULL, NULL, &f) == 0);
49
50         dual_timestamp_get(&ts);
51
52         iovec.iov_base = (void*) test;
53         iovec.iov_len = strlen(test);
54         assert_se(journal_file_append_entry(f, &ts, &iovec, 1, NULL, NULL, NULL) == 0);
55
56         iovec.iov_base = (void*) test2;
57         iovec.iov_len = strlen(test2);
58         assert_se(journal_file_append_entry(f, &ts, &iovec, 1, NULL, NULL, NULL) == 0);
59
60         iovec.iov_base = (void*) test;
61         iovec.iov_len = strlen(test);
62         assert_se(journal_file_append_entry(f, &ts, &iovec, 1, NULL, NULL, NULL) == 0);
63
64 #ifdef HAVE_GCRYPT
65         journal_file_append_tag(f);
66 #endif
67         journal_file_dump(f);
68
69         assert(journal_file_next_entry(f, NULL, 0, DIRECTION_DOWN, &o, &p) == 1);
70         assert(le64toh(o->entry.seqnum) == 1);
71
72         assert(journal_file_next_entry(f, o, p, DIRECTION_DOWN, &o, &p) == 1);
73         assert(le64toh(o->entry.seqnum) == 2);
74
75         assert(journal_file_next_entry(f, o, p, DIRECTION_DOWN, &o, &p) == 1);
76         assert(le64toh(o->entry.seqnum) == 3);
77
78         assert(journal_file_next_entry(f, o, p, DIRECTION_DOWN, &o, &p) == 0);
79
80         assert(journal_file_next_entry(f, NULL, 0, DIRECTION_DOWN, &o, &p) == 1);
81         assert(le64toh(o->entry.seqnum) == 1);
82
83         assert(journal_file_skip_entry(f, o, p, 2, &o, &p) == 1);
84         assert(le64toh(o->entry.seqnum) == 3);
85
86         assert(journal_file_skip_entry(f, o, p, -2, &o, &p) == 1);
87         assert(le64toh(o->entry.seqnum) == 1);
88
89         assert(journal_file_skip_entry(f, o, p, -2, &o, &p) == 1);
90         assert(le64toh(o->entry.seqnum) == 1);
91
92         assert(journal_file_find_data_object(f, test, strlen(test), NULL, &p) == 1);
93         assert(journal_file_next_entry_for_data(f, NULL, 0, p, DIRECTION_DOWN, &o, NULL) == 1);
94         assert(le64toh(o->entry.seqnum) == 1);
95
96         assert(journal_file_next_entry_for_data(f, NULL, 0, p, DIRECTION_UP, &o, NULL) == 1);
97         assert(le64toh(o->entry.seqnum) == 3);
98
99         assert(journal_file_find_data_object(f, test2, strlen(test2), NULL, &p) == 1);
100         assert(journal_file_next_entry_for_data(f, NULL, 0, p, DIRECTION_UP, &o, NULL) == 1);
101         assert(le64toh(o->entry.seqnum) == 2);
102
103         assert(journal_file_next_entry_for_data(f, NULL, 0, p, DIRECTION_DOWN, &o, NULL) == 1);
104         assert(le64toh(o->entry.seqnum) == 2);
105
106         assert(journal_file_find_data_object(f, "quux", 4, NULL, &p) == 0);
107
108         assert(journal_file_move_to_entry_by_seqnum(f, 1, DIRECTION_DOWN, &o, NULL) == 1);
109         assert(le64toh(o->entry.seqnum) == 1);
110
111         assert(journal_file_move_to_entry_by_seqnum(f, 3, DIRECTION_DOWN, &o, NULL) == 1);
112         assert(le64toh(o->entry.seqnum) == 3);
113
114         assert(journal_file_move_to_entry_by_seqnum(f, 2, DIRECTION_DOWN, &o, NULL) == 1);
115         assert(le64toh(o->entry.seqnum) == 2);
116
117         assert(journal_file_move_to_entry_by_seqnum(f, 10, DIRECTION_DOWN, &o, NULL) == 0);
118
119         journal_file_rotate(&f, true, true);
120         journal_file_rotate(&f, true, true);
121
122         journal_file_close(f);
123
124         log_info("Done...");
125
126         if (arg_keep)
127                 log_info("Not removing %s", t);
128         else {
129                 journal_directory_vacuum(".", 3000000, 0, NULL);
130
131                 assert_se(rm_rf_dangerous(t, false, true, false) >= 0);
132         }
133
134         puts("------------------------------------------------------------");
135 }
136
137 static void test_empty(void) {
138         JournalFile *f1, *f2, *f3, *f4;
139         char t[] = "/tmp/journal-XXXXXX";
140
141         log_set_max_level(LOG_DEBUG);
142
143         assert_se(mkdtemp(t));
144         assert_se(chdir(t) >= 0);
145
146         assert_se(journal_file_open("test.journal", O_RDWR|O_CREAT, 0666, false, false, NULL, NULL, NULL, &f1) == 0);
147
148         assert_se(journal_file_open("test-compress.journal", O_RDWR|O_CREAT, 0666, true, false, NULL, NULL, NULL, &f2) == 0);
149
150         assert_se(journal_file_open("test-seal.journal", O_RDWR|O_CREAT, 0666, false, true, NULL, NULL, NULL, &f3) == 0);
151
152         assert_se(journal_file_open("test-seal-compress.journal", O_RDWR|O_CREAT, 0666, true, true, NULL, NULL, NULL, &f4) == 0);
153
154         journal_file_print_header(f1);
155         puts("");
156         journal_file_print_header(f2);
157         puts("");
158         journal_file_print_header(f3);
159         puts("");
160         journal_file_print_header(f4);
161         puts("");
162
163         log_info("Done...");
164
165         if (arg_keep)
166                 log_info("Not removing %s", t);
167         else {
168                 journal_directory_vacuum(".", 3000000, 0, NULL);
169
170                 assert_se(rm_rf_dangerous(t, false, true, false) >= 0);
171         }
172
173         journal_file_close(f1);
174         journal_file_close(f2);
175         journal_file_close(f3);
176         journal_file_close(f4);
177 }
178
179 int main(int argc, char *argv[]) {
180         arg_keep = argc > 1;
181
182         /* journal_file_open requires a valid machine id */
183         if (access("/etc/machine-id", F_OK) != 0)
184                 return EXIT_TEST_SKIP;
185
186         test_non_empty();
187         test_empty();
188
189         return 0;
190 }