• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /**
2  * @file file_manip_tests.cpp
3  *
4  * @remark Copyright 2003 OProfile authors
5  * @remark Read the file COPYING
6  *
7  * @author John Levon
8  * @author Philippe Elie
9  */
10 
11 #include <unistd.h>
12 #include <stdlib.h>
13 
14 #include <string>
15 #include <iostream>
16 #include <list>
17 
18 #include "file_manip.h"
19 
20 using namespace std;
21 
22 template <typename Input, typename Output>
23 struct input_output {
24 	Input input;
25 	Output output;
26 };
27 
28 
29 template <typename Input, typename Output, typename Result>
check_result(char const * fct_name,Input const & input,Output const & output,Result const & result)30 static void check_result(char const * fct_name, Input const & input,
31 		  Output const & output, Result const & result)
32 {
33 	if (result != output) {
34 		cerr << fct_name << " "
35 		     << "for:\n\"" << input << "\"\n"
36 		     << "expect:\n\"" << output << "\"\n"
37 		     << "found:\n\"" << result << "\"\n";
38 		exit(EXIT_FAILURE);
39 	}
40 }
41 
42 template <typename Input, typename Output, typename Result>
check_result(char const * fct_name,Input const & input1,Input input2,Output const & output,Result const & result)43 static void check_result(char const * fct_name, Input const & input1,
44 	Input input2, Output const & output, Result const & result)
45 {
46 	if (result != output) {
47 		cerr << fct_name << ": \n"
48 		     << "for:\n\"" << input1 << "\"\n"
49 		     << "\"" << input2 << "\"\n"
50 		     << "expect:\n\"" << output << "\"\n"
51 		     << "found:\n\"" << result << "\"\n";
52 		exit(EXIT_FAILURE);
53 	}
54 }
55 
56 
57 static input_output<char const *, char const *> expect_dirname[] =
58 {
59 	{ "/", "/" },
60 	{ "//////", "/" },
61 	{ "/usr", "/" },
62 	{ "///usr", "/" },
63 	// suprising but conform to dirname(1)
64 	{ "///usr/dir", "///usr" },
65 	{ "usr/dir", "usr" },
66 	{ "usr", "." },
67 	{ "n", "." },
68 	{ "../..", ".." },
69 	{ "/../..", "/.." },
70 	{ "./..", "." },
71 	{ "./.", "." },
72 	{ "..", "." },
73 	{ ".", "." },
74 	{ "", "." },
75 	{ 0, 0 }
76 };
77 
dirname_tests()78 static void dirname_tests()
79 {
80 	input_output<char const *, char const *> const * cur;
81 	for (cur = expect_dirname; cur->input; ++cur) {
82 		string result = op_dirname(cur->input);
83 		check_result("dirname", cur->input, cur->output, result);
84 	}
85 }
86 
87 
88 static input_output<char const *, char const*> expect_basename[] =
89 {
90 	{ "/", "/" },
91 	{ "//////", "/" },
92 	{ "/usr", "usr" },
93 	{ "///usr", "usr" },
94 	{ "///usr/dir", "dir" },
95 	{ "///usr//dir", "dir" },
96 	{ "usr/dir", "dir" },
97 	{ "usr", "usr" },
98 	{ "../..", ".." },
99 	{ "/../..", ".." },
100 	{ "./..", ".." },
101 	{ "./.", "." },
102 	{ ".", "." },
103 	{ 0, 0 }
104 };
105 
basename_tests()106 static void basename_tests()
107 {
108 	input_output<char const *, char const *> const * cur;
109 	for (cur = expect_basename; cur->input; ++cur) {
110 		string result = op_basename(cur->input);
111 		check_result("basename", cur->input, cur->output, result);
112 	}
113 }
114 
115 
116 static input_output<char const *, bool> expect_is_directory[] =
117 {
118 	{ ".", true },
119 	{ "/.", true },
120 	{ "./", true },
121 	{ "/", true },
122 	{ "../", true },
123 	{ "../.", true },
124 	{ "non_existing_dir", false },
125 	{ 0, 0 }
126 };
127 
is_directory_tests()128 static void is_directory_tests()
129 {
130 	input_output<char const *, bool> const * cur;
131 	for (cur = expect_is_directory; cur->input; ++cur) {
132 		bool result = is_directory(cur->input);
133 		check_result("is_directory", cur->input, cur->output, result);
134 	}
135 }
136 
137 
138 static input_output<pair<string, string>, bool>
139 expect_is_files_identical[] = {
140 #define MAKE_PAIR(a, b) make_pair(string(a), string(b))
141 	{ MAKE_PAIR(__FILE__, __FILE__), true },
142 	{ MAKE_PAIR(__FILE__, "not_existing"), false },
143 	{ MAKE_PAIR("not_exisiting", __FILE__), false },
144 	{ MAKE_PAIR("not_exisiting", "not_existing"), false },
145 	{ MAKE_PAIR("", ""), false }
146 #undef MAKE_PAIR
147 };
148 
is_files_identical_tests(char const * prog_name)149 void is_files_identical_tests(char const * prog_name)
150 {
151 	check_result("is_files_identical", prog_name, prog_name,
152 	             is_files_identical(prog_name, prog_name), true);
153 
154 	input_output<pair<string, string>, bool> const * cur;
155 	for (cur = expect_is_files_identical; !cur->input.first.empty(); ++cur) {
156 		bool result = is_files_identical(cur->input.first,
157 		                                 cur->input.second);
158 		check_result("is_files_identical", cur->input.first,
159 		             cur->input.second, cur->output, result);
160 	}
161 }
162 
163 
164 static input_output<char const *, bool> expect_op_file_readable[] =
165 {
166 	{ __FILE__, true },
167 	{ "./" __FILE__, true },
168 	{ ".", false },
169 	{ "/.", false },
170 	{ "./", false },
171 	{ "/", false },
172 	{ "../", false },
173 	{ "../.", false },
174 	{ "non_existing_file", false },
175 	{ 0, 0 }
176 };
177 
op_file_readable_tests()178 static void op_file_readable_tests()
179 {
180 	input_output<char const *, bool> const * cur;
181 	for (cur = expect_op_file_readable; cur->input; ++cur) {
182 		bool result = op_file_readable(cur->input);
183 		check_result("op_file_readable", cur->input, cur->output, result);
184 	}
185 }
186 
187 
188 static input_output<string, string> expect_realpath[] =
189 {
190 	// realpath() file argument must exists.
191 	{ "file_manip_tests.o", "file_manip_tests.o" },
192 	{ "../tests/" "file_manip_tests.o", "file_manip_tests.o" },
193 	{ ".//.//" "file_manip_tests.o", "file_manip_tests.o" },
194 	// POSIX namespaces ignored by realpath(3)
195 	{ "//", "/" },
196 	{ "//usr", "/usr" },
197 	{ "///", "/" },
198 	{ "", "" }
199 };
200 
201 
202 // FIXME: useful to test symlinks too
realpath_tests()203 static void realpath_tests()
204 {
205 	input_output<string, string> const * cur;
206 	for (cur = expect_realpath; !cur->input.empty(); ++cur) {
207 		string result = op_realpath(cur->input);
208 		string expect = cur->output;
209 		if (cur->input[0] != '/')
210 			expect = SRCDIR + expect;
211 		check_result("op_realpath", cur->input,
212 		            expect, result);
213 	}
214 }
215 
216 
create_file_list_tests()217 void create_file_list_tests()
218 {
219 	list<string> result;
220 	if (!create_file_list(result, ".")) {
221 		cerr << "create_file_list() fail\n";
222 		exit(EXIT_FAILURE);
223 	}
224 	if (result.empty()) {
225 		cerr << "create_file_list(); empty result\n";
226 		exit(EXIT_FAILURE);
227 	}
228 }
229 
230 
main(int,char * argv[])231 int main(int, char * argv[])
232 {
233 	dirname_tests();
234 	basename_tests();
235 	is_directory_tests();
236 	is_files_identical_tests(argv[0]);
237 	op_file_readable_tests();
238 	realpath_tests();
239 	create_file_list_tests();
240 	return EXIT_SUCCESS;
241 }
242