chiark / gitweb /
Advertise hibernation only if there's enough free swap
[elogind.git] / src / test / test-fileio.c
1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
2
3 /***
4   This file is part of systemd.
5
6   Copyright 2013 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 <stdio.h>
23 #include <fcntl.h>
24 #include <unistd.h>
25
26 #include "util.h"
27 #include "fileio.h"
28 #include "strv.h"
29 #include "env-util.h"
30
31 static void test_parse_env_file(void) {
32         char    t[] = "/tmp/test-fileio-in-XXXXXX",
33                 p[] = "/tmp/test-fileio-out-XXXXXX";
34         int fd, r;
35         FILE *f;
36         _cleanup_free_ char *one = NULL, *two = NULL, *three = NULL, *four = NULL, *five = NULL,
37                         *six = NULL, *seven = NULL, *eight = NULL, *nine = NULL, *ten = NULL;
38         _cleanup_strv_free_ char **a = NULL, **b = NULL;
39         char **i;
40         unsigned k;
41
42         assert_se(mktemp(p));
43
44         fd = mkostemp(t, O_CLOEXEC);
45         assert_se(fd >= 0);
46
47         f = fdopen(fd, "w");
48         assert_se(f);
49
50         fputs("one=BAR   \n"
51               "# comment\n"
52               " # comment \n"
53               " ; comment \n"
54               "  two   =   bar    \n"
55               "invalid line\n"
56               "invalid line #comment\n"
57               "three = \"333\n"
58               "xxxx\"\n"
59               "four = \'44\\\"44\'\n"
60               "five = \'55\\\'55\' \"FIVE\" cinco   \n"
61               "six = seis sechs\\\n"
62               " sis\n"
63               "seven=\"sevenval\" #nocomment\n"
64               "eight=eightval #nocomment\n"
65               "export nine=nineval\n"
66               "ten=", f);
67
68         fflush(f);
69         fclose(f);
70
71         r = load_env_file(t, NULL, &a);
72         assert_se(r >= 0);
73
74         STRV_FOREACH(i, a)
75                 log_info("Got: <%s>", *i);
76
77         assert_se(streq(a[0], "one=BAR"));
78         assert_se(streq(a[1], "two=bar"));
79         assert_se(streq(a[2], "three=333\nxxxx"));
80         assert_se(streq(a[3], "four=44\"44"));
81         assert_se(streq(a[4], "five=55\'55FIVEcinco"));
82         assert_se(streq(a[5], "six=seis sechs sis"));
83         assert_se(streq(a[6], "seven=sevenval#nocomment"));
84         assert_se(streq(a[7], "eight=eightval #nocomment"));
85         assert_se(streq(a[8], "export nine=nineval"));
86         assert_se(streq(a[9], "ten="));
87         assert_se(a[10] == NULL);
88
89         strv_env_clean_log(a, "test");
90
91         k = 0;
92         STRV_FOREACH(i, b) {
93                 log_info("Got2: <%s>", *i);
94                 assert_se(streq(*i, a[k++]));
95         }
96
97         r = parse_env_file(
98                         t, NULL,
99                        "one", &one,
100                        "two", &two,
101                        "three", &three,
102                        "four", &four,
103                        "five", &five,
104                        "six", &six,
105                        "seven", &seven,
106                        "eight", &eight,
107                        "export nine", &nine,
108                        "ten", &ten,
109                        NULL);
110
111         assert_se(r >= 0);
112
113         log_info("one=[%s]", strna(one));
114         log_info("two=[%s]", strna(two));
115         log_info("three=[%s]", strna(three));
116         log_info("four=[%s]", strna(four));
117         log_info("five=[%s]", strna(five));
118         log_info("six=[%s]", strna(six));
119         log_info("seven=[%s]", strna(seven));
120         log_info("eight=[%s]", strna(eight));
121         log_info("export nine=[%s]", strna(nine));
122         log_info("ten=[%s]", strna(nine));
123
124         assert_se(streq(one, "BAR"));
125         assert_se(streq(two, "bar"));
126         assert_se(streq(three, "333\nxxxx"));
127         assert_se(streq(four, "44\"44"));
128         assert_se(streq(five, "55\'55FIVEcinco"));
129         assert_se(streq(six, "seis sechs sis"));
130         assert_se(streq(seven, "sevenval#nocomment"));
131         assert_se(streq(eight, "eightval #nocomment"));
132         assert_se(streq(nine, "nineval"));
133         assert_se(ten == NULL);
134
135         r = write_env_file(p, a);
136         assert_se(r >= 0);
137
138         r = load_env_file(p, NULL, &b);
139         assert_se(r >= 0);
140
141         unlink(t);
142         unlink(p);
143 }
144
145 static void test_parse_multiline_env_file(void) {
146         char    t[] = "/tmp/test-fileio-in-XXXXXX",
147                 p[] = "/tmp/test-fileio-out-XXXXXX";
148         int fd, r;
149         FILE *f;
150         _cleanup_strv_free_ char **a = NULL, **b = NULL;
151         char **i;
152
153         assert_se(mktemp(p));
154
155         fd = mkostemp(t, O_CLOEXEC);
156         assert_se(fd >= 0);
157
158         f = fdopen(fd, "w");
159         assert_se(f);
160
161         fputs("one=BAR\\\n"
162               "    VAR\\\n"
163               "\tGAR\n"
164               "#comment\n"
165               "two=\"bar\\\n"
166               "    var\\\n"
167               "\tgar\"\n"
168               "#comment\n"
169               "tri=\"bar \\\n"
170               "    var \\\n"
171               "\tgar \"\n", f);
172
173         fflush(f);
174         fclose(f);
175
176         r = load_env_file(t, NULL, &a);
177         assert_se(r >= 0);
178
179         STRV_FOREACH(i, a)
180                 log_info("Got: <%s>", *i);
181
182         assert_se(streq(a[0], "one=BAR    VAR\tGAR"));
183         assert_se(streq(a[1], "two=bar    var\tgar"));
184         assert_se(streq(a[2], "tri=bar     var \tgar "));
185         assert_se(a[3] == NULL);
186
187         r = write_env_file(p, a);
188         assert_se(r >= 0);
189
190         r = load_env_file(p, NULL, &b);
191         assert_se(r >= 0);
192
193         unlink(t);
194         unlink(p);
195 }
196
197
198 static void test_executable_is_script(void) {
199         char t[] = "/tmp/test-executable-XXXXXX";
200         int fd, r;
201         FILE *f;
202         char *command;
203
204         fd = mkostemp(t, O_CLOEXEC);
205         assert_se(fd >= 0);
206
207         f = fdopen(fd, "w");
208         assert_se(f);
209
210         fputs("#! /bin/script -a -b \ngoo goo", f);
211         fflush(f);
212
213         r = executable_is_script(t, &command);
214         assert_se(r > 0);
215         assert_se(streq(command, "/bin/script"));
216         free(command);
217
218         r = executable_is_script("/bin/sh", &command);
219         assert_se(r == 0);
220
221         r = executable_is_script("/usr/bin/yum", &command);
222         assert_se(r > 0 || r == -ENOENT);
223         if (r > 0) {
224                 assert_se(startswith(command, "/"));
225                 free(command);
226         }
227
228         fclose(f);
229         unlink(t);
230 }
231
232 static void test_status_field(void) {
233         _cleanup_free_ char *t = NULL, *p = NULL, *s = NULL;
234         unsigned long long total, buffers;
235
236         assert_se(get_status_field("/proc/self/status", "\nThreads:", &t) == 0);
237         puts(t);
238         assert_se(streq(t, "1"));
239
240         assert_se(get_status_field("/proc/meminfo", "MemTotal:", &p) == 0);
241         puts(p);
242         assert_se(safe_atollu(p, &total) == 0);
243
244         assert_se(get_status_field("/proc/meminfo", "\nBuffers:", &s) == 0);
245         puts(s);
246         assert_se(safe_atollu(s, &buffers) == 0);
247
248         assert(buffers < total);
249 }
250
251 int main(int argc, char *argv[]) {
252         test_parse_env_file();
253         test_parse_multiline_env_file();
254         test_executable_is_script();
255         test_status_field();
256         return 0;
257 }