]>
Commit | Line | Data |
---|---|---|
87d2c1ff LP |
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 | |
5430f7f2 LP |
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 | |
87d2c1ff LP |
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 | |
5430f7f2 | 16 | Lesser General Public License for more details. |
87d2c1ff | 17 | |
5430f7f2 | 18 | You should have received a copy of the GNU Lesser General Public License |
87d2c1ff LP |
19 | along with systemd; If not, see <http://www.gnu.org/licenses/>. |
20 | ***/ | |
21 | ||
22 | #include <fcntl.h> | |
0ac38b70 | 23 | #include <unistd.h> |
87d2c1ff | 24 | |
81527be1 LP |
25 | #include <systemd/sd-journal.h> |
26 | ||
87d2c1ff | 27 | #include "log.h" |
0284adc6 LP |
28 | #include "journal-file.h" |
29 | #include "journal-authenticate.h" | |
30 | #include "journal-vacuum.h" | |
87d2c1ff | 31 | |
6eb7a9a0 ZJS |
32 | static bool arg_keep = false; |
33 | ||
34 | static void test_non_empty(void) { | |
87d2c1ff LP |
35 | dual_timestamp ts; |
36 | JournalFile *f; | |
37 | struct iovec iovec; | |
3c1668da | 38 | static const char test[] = "TEST1=1", test2[] = "TEST2=2"; |
87d2c1ff | 39 | Object *o; |
de190aef | 40 | uint64_t p; |
95ea1b90 | 41 | char t[] = "/tmp/journal-XXXXXX"; |
87d2c1ff LP |
42 | |
43 | log_set_max_level(LOG_DEBUG); | |
44 | ||
95ea1b90 LP |
45 | assert_se(mkdtemp(t)); |
46 | assert_se(chdir(t) >= 0); | |
0ac38b70 | 47 | |
16e9f408 | 48 | assert_se(journal_file_open("test.journal", O_RDWR|O_CREAT, 0666, true, true, NULL, NULL, NULL, &f) == 0); |
87d2c1ff LP |
49 | |
50 | dual_timestamp_get(&ts); | |
51 | ||
52 | iovec.iov_base = (void*) test; | |
53 | iovec.iov_len = strlen(test); | |
c2373f84 | 54 | assert_se(journal_file_append_entry(f, &ts, &iovec, 1, NULL, NULL, NULL) == 0); |
87d2c1ff LP |
55 | |
56 | iovec.iov_base = (void*) test2; | |
57 | iovec.iov_len = strlen(test2); | |
c2373f84 | 58 | assert_se(journal_file_append_entry(f, &ts, &iovec, 1, NULL, NULL, NULL) == 0); |
87d2c1ff LP |
59 | |
60 | iovec.iov_base = (void*) test; | |
61 | iovec.iov_len = strlen(test); | |
c2373f84 | 62 | assert_se(journal_file_append_entry(f, &ts, &iovec, 1, NULL, NULL, NULL) == 0); |
87d2c1ff | 63 | |
feb12d3e | 64 | #ifdef HAVE_GCRYPT |
b0af6f41 | 65 | journal_file_append_tag(f); |
feb12d3e | 66 | #endif |
87d2c1ff LP |
67 | journal_file_dump(f); |
68 | ||
de190aef | 69 | assert(journal_file_next_entry(f, NULL, 0, DIRECTION_DOWN, &o, &p) == 1); |
87d2c1ff LP |
70 | assert(le64toh(o->entry.seqnum) == 1); |
71 | ||
de190aef | 72 | assert(journal_file_next_entry(f, o, p, DIRECTION_DOWN, &o, &p) == 1); |
87d2c1ff LP |
73 | assert(le64toh(o->entry.seqnum) == 2); |
74 | ||
de190aef | 75 | assert(journal_file_next_entry(f, o, p, DIRECTION_DOWN, &o, &p) == 1); |
87d2c1ff LP |
76 | assert(le64toh(o->entry.seqnum) == 3); |
77 | ||
de190aef | 78 | assert(journal_file_next_entry(f, o, p, DIRECTION_DOWN, &o, &p) == 0); |
87d2c1ff | 79 | |
de190aef | 80 | assert(journal_file_next_entry(f, NULL, 0, DIRECTION_DOWN, &o, &p) == 1); |
87d2c1ff LP |
81 | assert(le64toh(o->entry.seqnum) == 1); |
82 | ||
de190aef | 83 | assert(journal_file_skip_entry(f, o, p, 2, &o, &p) == 1); |
87d2c1ff LP |
84 | assert(le64toh(o->entry.seqnum) == 3); |
85 | ||
de190aef LP |
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); | |
87d2c1ff LP |
101 | assert(le64toh(o->entry.seqnum) == 2); |
102 | ||
de190aef | 103 | assert(journal_file_next_entry_for_data(f, NULL, 0, p, DIRECTION_DOWN, &o, NULL) == 1); |
87d2c1ff LP |
104 | assert(le64toh(o->entry.seqnum) == 2); |
105 | ||
de190aef | 106 | assert(journal_file_find_data_object(f, "quux", 4, NULL, &p) == 0); |
87d2c1ff | 107 | |
de190aef | 108 | assert(journal_file_move_to_entry_by_seqnum(f, 1, DIRECTION_DOWN, &o, NULL) == 1); |
87d2c1ff LP |
109 | assert(le64toh(o->entry.seqnum) == 1); |
110 | ||
de190aef | 111 | assert(journal_file_move_to_entry_by_seqnum(f, 3, DIRECTION_DOWN, &o, NULL) == 1); |
87d2c1ff LP |
112 | assert(le64toh(o->entry.seqnum) == 3); |
113 | ||
de190aef | 114 | assert(journal_file_move_to_entry_by_seqnum(f, 2, DIRECTION_DOWN, &o, NULL) == 1); |
87d2c1ff LP |
115 | assert(le64toh(o->entry.seqnum) == 2); |
116 | ||
de190aef | 117 | assert(journal_file_move_to_entry_by_seqnum(f, 10, DIRECTION_DOWN, &o, NULL) == 0); |
87d2c1ff | 118 | |
7560fffc LP |
119 | journal_file_rotate(&f, true, true); |
120 | journal_file_rotate(&f, true, true); | |
0ac38b70 | 121 | |
87d2c1ff LP |
122 | journal_file_close(f); |
123 | ||
6eb7a9a0 ZJS |
124 | log_info("Done..."); |
125 | ||
126 | if (arg_keep) | |
127 | log_info("Not removing %s", t); | |
128 | else { | |
348ced90 | 129 | journal_directory_vacuum(".", 3000000, 0, NULL); |
6eb7a9a0 ZJS |
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); | |
0ac38b70 | 142 | |
6eb7a9a0 ZJS |
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 { | |
348ced90 | 168 | journal_directory_vacuum(".", 3000000, 0, NULL); |
6eb7a9a0 ZJS |
169 | |
170 | assert_se(rm_rf_dangerous(t, false, true, false) >= 0); | |
171 | } | |
510b857f LP |
172 | |
173 | journal_file_close(f1); | |
174 | journal_file_close(f2); | |
175 | journal_file_close(f3); | |
176 | journal_file_close(f4); | |
6eb7a9a0 ZJS |
177 | } |
178 | ||
179 | int main(int argc, char *argv[]) { | |
180 | arg_keep = argc > 1; | |
6ad1d1c3 | 181 | |
143bfdaf HHPF |
182 | /* journal_file_open requires a valid machine id */ |
183 | if (access("/etc/machine-id", F_OK) != 0) | |
184 | return EXIT_TEST_SKIP; | |
185 | ||
6eb7a9a0 ZJS |
186 | test_non_empty(); |
187 | test_empty(); | |
95ea1b90 | 188 | |
87d2c1ff LP |
189 | return 0; |
190 | } |