1 #include <stic.h>
2
3 #include <stdint.h> /* uint64_t */
4 #include <stdio.h> /* remove() */
5
6 #include <sys/stat.h> /* chmod() */
7 #include <unistd.h> /* F_OK access() */
8
9 #include "../../src/io/iop.h"
10 #include "../../src/io/ior.h"
11 #include "../../src/utils/fs.h"
12 #include "../../src/utils/utils.h"
13
14 #include "utils.h"
15
16 static int confirm_overwrite(io_args_t *args, const char src[],
17 const char dst[]);
18 static int deny_overwrite(io_args_t *args, const char src[], const char dst[]);
19
20 static int confirm_called;
21
TEST(confirm_is_not_called_for_no_overwrite)22 TEST(confirm_is_not_called_for_no_overwrite)
23 {
24 create_empty_file(SANDBOX_PATH "/empty");
25
26 {
27 io_args_t args = {
28 .arg1.src = TEST_DATA_PATH "/read/two-lines",
29 .arg2.dst = SANDBOX_PATH "/empty",
30 .arg3.crs = IO_CRS_FAIL,
31
32 .confirm = &confirm_overwrite,
33 };
34 ioe_errlst_init(&args.result.errors);
35
36 confirm_called = 0;
37 assert_failure(ior_mv(&args));
38 assert_int_equal(0, confirm_called);
39
40 assert_true(args.result.errors.error_count != 0);
41 ioe_errlst_free(&args.result.errors);
42 }
43
44 delete_file(SANDBOX_PATH "/empty");
45 }
46
TEST(confirm_is_called_for_file_overwrite)47 TEST(confirm_is_called_for_file_overwrite)
48 {
49 create_empty_file(SANDBOX_PATH "/empty");
50 clone_file(TEST_DATA_PATH "/read/two-lines", SANDBOX_PATH "/two-lines");
51
52 {
53 io_args_t args = {
54 .arg1.src = SANDBOX_PATH "/two-lines",
55 .arg2.dst = SANDBOX_PATH "/empty",
56 .arg3.crs = IO_CRS_REPLACE_FILES,
57
58 .confirm = &confirm_overwrite,
59 };
60 ioe_errlst_init(&args.result.errors);
61
62 confirm_called = 0;
63 assert_success(ior_mv(&args));
64 assert_int_equal(1, confirm_called);
65
66 assert_int_equal(0, args.result.errors.error_count);
67 }
68
69 delete_file(SANDBOX_PATH "/empty");
70 }
71
TEST(confirm_is_called_for_dir_overwrite,IF (not_windows))72 TEST(confirm_is_called_for_dir_overwrite, IF(not_windows))
73 {
74 create_empty_dir(SANDBOX_PATH "/src");
75 create_empty_file(SANDBOX_PATH "/src/file");
76 create_empty_file(SANDBOX_PATH "/file");
77
78 assert_success(chmod(SANDBOX_PATH "/src", 0500));
79
80 {
81 io_args_t args = {
82 .arg1.src = SANDBOX_PATH "/src/file",
83 .arg2.dst = SANDBOX_PATH "/file",
84 .arg3.crs = IO_CRS_REPLACE_FILES,
85
86 .confirm = &confirm_overwrite,
87 };
88 ioe_errlst_init(&args.result.errors);
89
90 confirm_called = 0;
91 assert_failure(ior_mv(&args));
92 assert_int_equal(1, confirm_called);
93
94 assert_int_equal(1, args.result.errors.error_count);
95 ioe_errlst_free(&args.result.errors);
96 }
97
98 assert_success(chmod(SANDBOX_PATH "/src", 0700));
99 delete_tree(SANDBOX_PATH "/src");
100 delete_file(SANDBOX_PATH "/file");
101 }
102
TEST(deny_to_overwrite_is_considered)103 TEST(deny_to_overwrite_is_considered)
104 {
105 create_empty_file(SANDBOX_PATH "/empty");
106
107 {
108 io_args_t args = {
109 .arg1.src = TEST_DATA_PATH "/read/two-lines",
110 .arg2.dst = SANDBOX_PATH "/empty",
111 .arg3.crs = IO_CRS_REPLACE_FILES,
112
113 .confirm = &deny_overwrite,
114 };
115 ioe_errlst_init(&args.result.errors);
116
117 confirm_called = 0;
118 assert_success(ior_mv(&args));
119 assert_int_equal(1, confirm_called);
120
121 assert_int_equal(0, args.result.errors.error_count);
122 }
123
124 assert_true(file_exists(TEST_DATA_PATH "/read/two-lines"));
125
126 delete_file(SANDBOX_PATH "/empty");
127 }
128
129 static int
confirm_overwrite(io_args_t * args,const char src[],const char dst[])130 confirm_overwrite(io_args_t *args, const char src[], const char dst[])
131 {
132 ++confirm_called;
133 return 1;
134 }
135
136 static int
deny_overwrite(io_args_t * args,const char src[],const char dst[])137 deny_overwrite(io_args_t *args, const char src[], const char dst[])
138 {
139 ++confirm_called;
140 return 0;
141 }
142
143 /* vim: set tabstop=2 softtabstop=2 shiftwidth=2 noexpandtab cinoptions-=(0 : */
144 /* vim: set cinoptions+=t0 filetype=c : */
145