]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/journal/test-journal.c
Merge pull request #1983 from dmedri/master
[thirdparty/systemd.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 "journal-authenticate.h"
26 #include "journal-file.h"
27 #include "journal-vacuum.h"
28 #include "log.h"
29 #include "rm-rf.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, 0, NULL, true);
120
121 assert_se(rm_rf(t, REMOVE_ROOT|REMOVE_PHYSICAL) >= 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, 0, NULL, true);
159
160 assert_se(rm_rf(t, REMOVE_ROOT|REMOVE_PHYSICAL) >= 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 }