]>
Commit | Line | Data |
---|---|---|
87d2c1ff LP |
1 | /*** |
2 | This file is part of systemd. | |
3 | ||
4 | Copyright 2011 Lennart Poettering | |
5 | ||
6 | systemd is free software; you can redistribute it and/or modify it | |
5430f7f2 LP |
7 | under the terms of the GNU Lesser General Public License as published by |
8 | the Free Software Foundation; either version 2.1 of the License, or | |
87d2c1ff LP |
9 | (at your option) any later version. |
10 | ||
11 | systemd is distributed in the hope that it will be useful, but | |
12 | WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
5430f7f2 | 14 | Lesser General Public License for more details. |
87d2c1ff | 15 | |
5430f7f2 | 16 | You should have received a copy of the GNU Lesser General Public License |
87d2c1ff LP |
17 | along with systemd; If not, see <http://www.gnu.org/licenses/>. |
18 | ***/ | |
19 | ||
20 | #include <fcntl.h> | |
0ac38b70 | 21 | #include <unistd.h> |
87d2c1ff | 22 | |
0284adc6 | 23 | #include "journal-authenticate.h" |
cf0fbc49 | 24 | #include "journal-file.h" |
0284adc6 | 25 | #include "journal-vacuum.h" |
cf0fbc49 TA |
26 | #include "log.h" |
27 | #include "rm-rf.h" | |
87d2c1ff | 28 | |
6eb7a9a0 ZJS |
29 | static bool arg_keep = false; |
30 | ||
31 | static void test_non_empty(void) { | |
87d2c1ff LP |
32 | dual_timestamp ts; |
33 | JournalFile *f; | |
34 | struct iovec iovec; | |
3c1668da | 35 | static const char test[] = "TEST1=1", test2[] = "TEST2=2"; |
87d2c1ff | 36 | Object *o; |
de190aef | 37 | uint64_t p; |
95ea1b90 | 38 | char t[] = "/tmp/journal-XXXXXX"; |
87d2c1ff LP |
39 | |
40 | log_set_max_level(LOG_DEBUG); | |
41 | ||
95ea1b90 LP |
42 | assert_se(mkdtemp(t)); |
43 | assert_se(chdir(t) >= 0); | |
0ac38b70 | 44 | |
5d1ce257 | 45 | assert_se(journal_file_open(-1, "test.journal", O_RDWR|O_CREAT, 0666, true, true, NULL, NULL, NULL, NULL, &f) == 0); |
87d2c1ff LP |
46 | |
47 | dual_timestamp_get(&ts); | |
48 | ||
49 | iovec.iov_base = (void*) test; | |
50 | iovec.iov_len = strlen(test); | |
c2373f84 | 51 | assert_se(journal_file_append_entry(f, &ts, &iovec, 1, NULL, NULL, NULL) == 0); |
87d2c1ff LP |
52 | |
53 | iovec.iov_base = (void*) test2; | |
54 | iovec.iov_len = strlen(test2); | |
c2373f84 | 55 | assert_se(journal_file_append_entry(f, &ts, &iovec, 1, NULL, NULL, NULL) == 0); |
87d2c1ff LP |
56 | |
57 | iovec.iov_base = (void*) test; | |
58 | iovec.iov_len = strlen(test); | |
c2373f84 | 59 | assert_se(journal_file_append_entry(f, &ts, &iovec, 1, NULL, NULL, NULL) == 0); |
87d2c1ff | 60 | |
349cc4a5 | 61 | #if HAVE_GCRYPT |
b0af6f41 | 62 | journal_file_append_tag(f); |
feb12d3e | 63 | #endif |
87d2c1ff LP |
64 | journal_file_dump(f); |
65 | ||
f534928a | 66 | assert_se(journal_file_next_entry(f, 0, DIRECTION_DOWN, &o, &p) == 1); |
787784c4 | 67 | assert_se(le64toh(o->entry.seqnum) == 1); |
87d2c1ff | 68 | |
f534928a | 69 | assert_se(journal_file_next_entry(f, p, DIRECTION_DOWN, &o, &p) == 1); |
787784c4 | 70 | assert_se(le64toh(o->entry.seqnum) == 2); |
87d2c1ff | 71 | |
f534928a | 72 | assert_se(journal_file_next_entry(f, p, DIRECTION_DOWN, &o, &p) == 1); |
787784c4 | 73 | assert_se(le64toh(o->entry.seqnum) == 3); |
87d2c1ff | 74 | |
f534928a | 75 | assert_se(journal_file_next_entry(f, p, DIRECTION_DOWN, &o, &p) == 0); |
87d2c1ff | 76 | |
f534928a | 77 | assert_se(journal_file_next_entry(f, 0, DIRECTION_DOWN, &o, &p) == 1); |
787784c4 | 78 | assert_se(le64toh(o->entry.seqnum) == 1); |
87d2c1ff | 79 | |
787784c4 RC |
80 | assert_se(journal_file_find_data_object(f, test, strlen(test), NULL, &p) == 1); |
81 | assert_se(journal_file_next_entry_for_data(f, NULL, 0, p, DIRECTION_DOWN, &o, NULL) == 1); | |
82 | assert_se(le64toh(o->entry.seqnum) == 1); | |
de190aef | 83 | |
787784c4 RC |
84 | assert_se(journal_file_next_entry_for_data(f, NULL, 0, p, DIRECTION_UP, &o, NULL) == 1); |
85 | assert_se(le64toh(o->entry.seqnum) == 3); | |
de190aef | 86 | |
787784c4 RC |
87 | assert_se(journal_file_find_data_object(f, test2, strlen(test2), NULL, &p) == 1); |
88 | assert_se(journal_file_next_entry_for_data(f, NULL, 0, p, DIRECTION_UP, &o, NULL) == 1); | |
89 | assert_se(le64toh(o->entry.seqnum) == 2); | |
87d2c1ff | 90 | |
787784c4 RC |
91 | assert_se(journal_file_next_entry_for_data(f, NULL, 0, p, DIRECTION_DOWN, &o, NULL) == 1); |
92 | assert_se(le64toh(o->entry.seqnum) == 2); | |
87d2c1ff | 93 | |
787784c4 | 94 | assert_se(journal_file_find_data_object(f, "quux", 4, NULL, &p) == 0); |
87d2c1ff | 95 | |
787784c4 RC |
96 | assert_se(journal_file_move_to_entry_by_seqnum(f, 1, DIRECTION_DOWN, &o, NULL) == 1); |
97 | assert_se(le64toh(o->entry.seqnum) == 1); | |
87d2c1ff | 98 | |
787784c4 RC |
99 | assert_se(journal_file_move_to_entry_by_seqnum(f, 3, DIRECTION_DOWN, &o, NULL) == 1); |
100 | assert_se(le64toh(o->entry.seqnum) == 3); | |
87d2c1ff | 101 | |
787784c4 RC |
102 | assert_se(journal_file_move_to_entry_by_seqnum(f, 2, DIRECTION_DOWN, &o, NULL) == 1); |
103 | assert_se(le64toh(o->entry.seqnum) == 2); | |
87d2c1ff | 104 | |
787784c4 | 105 | assert_se(journal_file_move_to_entry_by_seqnum(f, 10, DIRECTION_DOWN, &o, NULL) == 0); |
87d2c1ff | 106 | |
b58c888f VC |
107 | journal_file_rotate(&f, true, true, NULL); |
108 | journal_file_rotate(&f, true, true, NULL); | |
0ac38b70 | 109 | |
69a3a6fd | 110 | (void) journal_file_close(f); |
87d2c1ff | 111 | |
6eb7a9a0 ZJS |
112 | log_info("Done..."); |
113 | ||
114 | if (arg_keep) | |
115 | log_info("Not removing %s", t); | |
116 | else { | |
8580d1f7 | 117 | journal_directory_vacuum(".", 3000000, 0, 0, NULL, true); |
6eb7a9a0 | 118 | |
c6878637 | 119 | assert_se(rm_rf(t, REMOVE_ROOT|REMOVE_PHYSICAL) >= 0); |
6eb7a9a0 ZJS |
120 | } |
121 | ||
122 | puts("------------------------------------------------------------"); | |
123 | } | |
124 | ||
125 | static void test_empty(void) { | |
126 | JournalFile *f1, *f2, *f3, *f4; | |
127 | char t[] = "/tmp/journal-XXXXXX"; | |
128 | ||
129 | log_set_max_level(LOG_DEBUG); | |
0ac38b70 | 130 | |
6eb7a9a0 ZJS |
131 | assert_se(mkdtemp(t)); |
132 | assert_se(chdir(t) >= 0); | |
133 | ||
5d1ce257 | 134 | assert_se(journal_file_open(-1, "test.journal", O_RDWR|O_CREAT, 0666, false, false, NULL, NULL, NULL, NULL, &f1) == 0); |
6eb7a9a0 | 135 | |
5d1ce257 | 136 | assert_se(journal_file_open(-1, "test-compress.journal", O_RDWR|O_CREAT, 0666, true, false, NULL, NULL, NULL, NULL, &f2) == 0); |
6eb7a9a0 | 137 | |
5d1ce257 | 138 | assert_se(journal_file_open(-1, "test-seal.journal", O_RDWR|O_CREAT, 0666, false, true, NULL, NULL, NULL, NULL, &f3) == 0); |
6eb7a9a0 | 139 | |
5d1ce257 | 140 | assert_se(journal_file_open(-1, "test-seal-compress.journal", O_RDWR|O_CREAT, 0666, true, true, NULL, NULL, NULL, NULL, &f4) == 0); |
6eb7a9a0 ZJS |
141 | |
142 | journal_file_print_header(f1); | |
143 | puts(""); | |
144 | journal_file_print_header(f2); | |
145 | puts(""); | |
146 | journal_file_print_header(f3); | |
147 | puts(""); | |
148 | journal_file_print_header(f4); | |
149 | puts(""); | |
150 | ||
151 | log_info("Done..."); | |
152 | ||
153 | if (arg_keep) | |
154 | log_info("Not removing %s", t); | |
155 | else { | |
8580d1f7 | 156 | journal_directory_vacuum(".", 3000000, 0, 0, NULL, true); |
6eb7a9a0 | 157 | |
c6878637 | 158 | assert_se(rm_rf(t, REMOVE_ROOT|REMOVE_PHYSICAL) >= 0); |
6eb7a9a0 | 159 | } |
510b857f | 160 | |
69a3a6fd VC |
161 | (void) journal_file_close(f1); |
162 | (void) journal_file_close(f2); | |
163 | (void) journal_file_close(f3); | |
164 | (void) journal_file_close(f4); | |
6eb7a9a0 ZJS |
165 | } |
166 | ||
167 | int main(int argc, char *argv[]) { | |
168 | arg_keep = argc > 1; | |
6ad1d1c3 | 169 | |
143bfdaf HHPF |
170 | /* journal_file_open requires a valid machine id */ |
171 | if (access("/etc/machine-id", F_OK) != 0) | |
172 | return EXIT_TEST_SKIP; | |
173 | ||
6eb7a9a0 ZJS |
174 | test_non_empty(); |
175 | test_empty(); | |
95ea1b90 | 176 | |
87d2c1ff LP |
177 | return 0; |
178 | } |