chiark / gitweb /
230d26596aa99a33a2e246646eb3207025ddd391
[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_se(journal_file_next_entry(f, 0, DIRECTION_DOWN, &o, &p) == 1);
70         assert_se(le64toh(o->entry.seqnum) == 1);
71
72         assert_se(journal_file_next_entry(f, p, DIRECTION_DOWN, &o, &p) == 1);
73         assert_se(le64toh(o->entry.seqnum) == 2);
74
75         assert_se(journal_file_next_entry(f, p, DIRECTION_DOWN, &o, &p) == 1);
76         assert_se(le64toh(o->entry.seqnum) == 3);
77
78         assert_se(journal_file_next_entry(f, p, DIRECTION_DOWN, &o, &p) == 0);
79
80         assert_se(journal_file_next_entry(f, 0, DIRECTION_DOWN, &o, &p) == 1);
81         assert_se(le64toh(o->entry.seqnum) == 1);
82
83         assert_se(journal_file_find_data_object(f, test, strlen(test), NULL, &p) == 1);
84         assert_se(journal_file_next_entry_for_data(f, NULL, 0, p, DIRECTION_DOWN, &o, NULL) == 1);
85         assert_se(le64toh(o->entry.seqnum) == 1);
86
87         assert_se(journal_file_next_entry_for_data(f, NULL, 0, p, DIRECTION_UP, &o, NULL) == 1);
88         assert_se(le64toh(o->entry.seqnum) == 3);
89
90         assert_se(journal_file_find_data_object(f, test2, strlen(test2), NULL, &p) == 1);
91         assert_se(journal_file_next_entry_for_data(f, NULL, 0, p, DIRECTION_UP, &o, NULL) == 1);
92         assert_se(le64toh(o->entry.seqnum) == 2);
93
94         assert_se(journal_file_next_entry_for_data(f, NULL, 0, p, DIRECTION_DOWN, &o, NULL) == 1);
95         assert_se(le64toh(o->entry.seqnum) == 2);
96
97         assert_se(journal_file_find_data_object(f, "quux", 4, NULL, &p) == 0);
98
99         assert_se(journal_file_move_to_entry_by_seqnum(f, 1, DIRECTION_DOWN, &o, NULL) == 1);
100         assert_se(le64toh(o->entry.seqnum) == 1);
101
102         assert_se(journal_file_move_to_entry_by_seqnum(f, 3, DIRECTION_DOWN, &o, NULL) == 1);
103         assert_se(le64toh(o->entry.seqnum) == 3);
104
105         assert_se(journal_file_move_to_entry_by_seqnum(f, 2, DIRECTION_DOWN, &o, NULL) == 1);
106         assert_se(le64toh(o->entry.seqnum) == 2);
107
108         assert_se(journal_file_move_to_entry_by_seqnum(f, 10, DIRECTION_DOWN, &o, NULL) == 0);
109
110         journal_file_rotate(&f, true, true);
111         journal_file_rotate(&f, true, true);
112
113         journal_file_close(f);
114
115         log_info("Done...");
116
117         if (arg_keep)
118                 log_info("Not removing %s", t);
119         else {
120                 journal_directory_vacuum(".", 3000000, 0, NULL, true);
121
122                 assert_se(rm_rf_dangerous(t, false, true, false) >= 0);
123         }
124
125         puts("------------------------------------------------------------");
126 }
127
128 static void test_empty(void) {
129         JournalFile *f1, *f2, *f3, *f4;
130         char t[] = "/tmp/journal-XXXXXX";
131
132         log_set_max_level(LOG_DEBUG);
133
134         assert_se(mkdtemp(t));
135         assert_se(chdir(t) >= 0);
136
137         assert_se(journal_file_open("test.journal", O_RDWR|O_CREAT, 0666, false, false, NULL, NULL, NULL, &f1) == 0);
138
139         assert_se(journal_file_open("test-compress.journal", O_RDWR|O_CREAT, 0666, true, false, NULL, NULL, NULL, &f2) == 0);
140
141         assert_se(journal_file_open("test-seal.journal", O_RDWR|O_CREAT, 0666, false, true, NULL, NULL, NULL, &f3) == 0);
142
143         assert_se(journal_file_open("test-seal-compress.journal", O_RDWR|O_CREAT, 0666, true, true, NULL, NULL, NULL, &f4) == 0);
144
145         journal_file_print_header(f1);
146         puts("");
147         journal_file_print_header(f2);
148         puts("");
149         journal_file_print_header(f3);
150         puts("");
151         journal_file_print_header(f4);
152         puts("");
153
154         log_info("Done...");
155
156         if (arg_keep)
157                 log_info("Not removing %s", t);
158         else {
159                 journal_directory_vacuum(".", 3000000, 0, NULL, true);
160
161                 assert_se(rm_rf_dangerous(t, false, true, false) >= 0);
162         }
163
164         journal_file_close(f1);
165         journal_file_close(f2);
166         journal_file_close(f3);
167         journal_file_close(f4);
168 }
169
170 int main(int argc, char *argv[]) {
171         arg_keep = argc > 1;
172
173         /* journal_file_open requires a valid machine id */
174         if (access("/etc/machine-id", F_OK) != 0)
175                 return EXIT_TEST_SKIP;
176
177         test_non_empty();
178         test_empty();
179
180         return 0;
181 }