chiark / gitweb /
tests: add test-copy
[elogind.git] / src / test / test-copy.c
1 /***
2   This file is part of systemd
3
4   Copyright 2014 Ronny Chevalier
5
6   systemd is free software; you can redistribute it and/or modify it
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
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
14   Lesser General Public License for more details.
15
16   You should have received a copy of the GNU Lesser General Public License
17   along with systemd; If not, see <http://www.gnu.org/licenses/>.
18 ***/
19
20 #include <unistd.h>
21
22 #include "copy.h"
23 #include "path-util.h"
24 #include "fileio.h"
25 #include "mkdir.h"
26 #include "strv.h"
27 #include "macro.h"
28 #include "util.h"
29
30 static void test_copy_file(void) {
31         _cleanup_free_ char *buf = NULL;
32         char fn[] = "/tmp/test-copy_file.XXXXXX";
33         char fn_copy[] = "/tmp/test-copy_file.XXXXXX";
34         size_t sz = 0;
35         int fd;
36
37         fd = mkostemp_safe(fn, O_RDWR|O_CLOEXEC);
38         assert_se(fd >= 0);
39         close(fd);
40
41         fd = mkostemp_safe(fn_copy, O_RDWR|O_CLOEXEC);
42         assert_se(fd >= 0);
43         close(fd);
44
45         assert_se(write_string_file(fn, "foo bar bar bar foo") == 0);
46
47         assert_se(copy_file(fn, fn_copy, 0, 0644) == 0);
48
49         assert_se(read_full_file(fn_copy, &buf, &sz) == 0);
50         assert_se(streq(buf, "foo bar bar bar foo\n"));
51
52         unlink(fn);
53         unlink(fn_copy);
54 }
55
56 static void test_copy_tree(void) {
57         char original_dir[] = "/tmp/test-copy_tree/";
58         char copy_dir[] = "/tmp/test-copy_tree-copy/";
59         char **files = STRV_MAKE("file", "dir1/file", "dir1/dir2/file", "dir1/dir2/dir3/dir4/dir5/file");
60         char **links = STRV_MAKE("link", "file",
61                                  "link2", "dir1/file");
62         char **p, **link;
63
64         rm_rf_dangerous(copy_dir, false, true, false);
65         rm_rf_dangerous(original_dir, false, true, false);
66
67         STRV_FOREACH(p, files) {
68                 char *f = strappenda(original_dir, *p);
69
70                 assert_se(mkdir_parents(f, 0755) >= 0);
71                 assert_se(write_string_file(f, "file") == 0);
72         }
73
74         STRV_FOREACH_PAIR(link, p, links) {
75                 char *f = strappenda(original_dir, *p);
76                 char *l = strappenda(original_dir, *link);
77
78                 assert_se(mkdir_parents(l, 0755) >= 0);
79                 assert_se(symlink(f, l) == 0);
80         }
81
82         assert_se(copy_tree(original_dir, copy_dir, true) == 0);
83
84         STRV_FOREACH(p, files) {
85                 _cleanup_free_ char *buf = NULL;
86                 size_t sz = 0;
87                 char *f = strappenda(copy_dir, *p);
88
89                 assert_se(access(f, F_OK) == 0);
90                 assert_se(read_full_file(f, &buf, &sz) == 0);
91                 assert_se(streq(buf, "file\n"));
92         }
93
94         STRV_FOREACH_PAIR(link, p, links) {
95                 _cleanup_free_ char *target = NULL;
96                 char *f = strappenda(original_dir, *p);
97                 char *l = strappenda(copy_dir, *link);
98
99                 assert_se(readlink_and_canonicalize(l, &target) == 0);
100                 assert_se(path_equal(f, target));
101         }
102
103         assert_se(copy_tree(original_dir, copy_dir, false) < 0);
104         assert_se(copy_tree("/tmp/inexistent/foo/bar/fsdoi", copy_dir, false) < 0);
105
106         rm_rf_dangerous(copy_dir, false, true, false);
107         rm_rf_dangerous(original_dir, false, true, false);
108 }
109
110 int main(int argc, char *argv[]) {
111         test_copy_file();
112         test_copy_tree();
113
114         return 0;
115 }