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