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