1 #include "config.h"
2 
3 #ifdef HAVE_UNISTD_H
4 #include <unistd.h>
5 #endif
6 
7 #include <iostream>
8 #include <string>
9 #include <fstream>
10 #include <iomanip>
11 #include <string>
12 #include <cassert>
13 #include <algorithm>
14 
15 #include "asserts.h"
16 #include "error.h"
17 #include "fs.h"
18 #include "rconfig.h"
19 #include "logger.h"
20 #include "vaulter.h"
21 #include "archiver.h"
22 #include "cataloger.h"
23 #include "reporter.h"
24 #include "test-fs-cwd.h"
25 
26 #define ERR_OUT(e) std::cerr << e
27 // #define ERR_OUT(e)
28 
make_dir(const std::string & path)29 bool make_dir(const std::string& path)
30 {
31 	bool thrown;
32 	bool value;
33 
34 	thrown = false;
35 	try {
36 		mk_dir(path);
37 	}
38 	catch(...) {
39 		thrown = true;
40 	}
41 
42 	value = (thrown == false);
43 
44 	return(value);
45 }
46 
setup(void)47 void setup(void)
48 {
49 	std::ofstream out;
50 
51 	assert(make_dir("./test-rvm.dir"));
52 	assert(make_dir("./test-rvm.dir/vault-1"));
53 	assert(make_dir("./test-rvm.dir/vault-2"));
54 	assert(make_dir("./test-rvm.dir/vault-3"));
55 	assert(make_dir("./test-rvm.dir/log.dir"));
56 	assert(make_dir("./test-rvm.dir/catalog.dir"));
57 
58 	out.open("./test-rvm.dir/file-1.conf");
59 	assert(out.is_open());
60 	out << "link-catalog-dir ./test-rvm.dir/catalog.dir" << std::endl;
61 	out << "log-dir ./test-rvm.dir/log.dir" << std::endl;
62 	out << "logging-level rsync" << std::endl;
63 	out << "rsync-local-path " << LOCAL_RSYNC << std::endl;
64 	out << "rsync-parallel 1" << std::endl;
65 	out << "timestamp-resolution second" << std::endl;
66 	out << "vault ./test-rvm.dir/vault-*" << std::endl;
67 	out << "vault-overflow-behavior quit" << std::endl;
68 	out << "vault-overflow-blocks 0" << std::endl;
69 	out << "vault-overflow-inodes 0" << std::endl;
70 	out << "vault-selection-behavior round-robin" << std::endl;
71 	out << "<job>" << std::endl;
72 	out << "	jobname test-job" << std::endl;
73 	out << "	archive-path jobname/permutation" << std::endl;
74 	out << "	path " << check_cwd << "/" << std::endl;
75 	out << "	rsync-connection-type local" << std::endl;
76 	out << "	rsync-hardlink true" << std::endl;
77 	out << "	<rsync-options>" << std::endl;
78 	out << "		-a -v --progress --stats" << std::endl;
79 	out << "		--exclude '/.svn/'" << std::endl;
80 	out << "		--exclude '/.deps/'" << std::endl;
81 	out << "		--exclude '/autom4te.cache/'" << std::endl;
82 	out << "		--exclude '/test-rvm.dir/'" << std::endl;
83 	out << "	</rsync-options>" << std::endl;
84 	out << "	rsync-retry-count 3" << std::endl;
85 	out << "</job>" << std::endl;
86 	out.close();
87 }
88 
cleanup(void)89 void cleanup(void)
90 {
91 	assert(system("rm -fr ./test-rvm.dir") == 0);
92 }
93 
test_inodes(const std::string & path1,const std::string & path2,const std::string & file)94 bool test_inodes(
95 	const std::string& path1,
96 	const std::string& path2,
97 	const std::string& file
98 	)
99 {
100 	estring p1, p2;
101 	filestatus f1, f2;
102 	bool r;
103 
104 	p1 = path1;
105 	p1 += "/";
106 	p1 += file;
107 	p1 = reform_path(p1);
108 	f1.path(p1);
109 
110 	p2 = path2;
111 	p2 += "/";
112 	p2 += file;
113 	p2 = reform_path(p2);
114 	f2.path(p2);
115 
116 	r = (f1.inode() == f2.inode());
117 
118 	return(r);
119 }
120 
test_rvm(void)121 void test_rvm(void)
122 {
123 	std::string local_rsync;
124 	estring adir[4];
125 	int adirc = 0;
126 
127 	local_rsync = LOCAL_RSYNC;
128 	if (local_rsync.size() == 0) {
129 		char const * text[] = {
130 			"",
131 			"NOTICE: Skipping this test",
132 			"",
133 			"This test cannot be run because no local rsync binary was found during",
134 			"configuration.  This also means that RVM will be compiled with no",
135 			"default value for the rsync-local-path command.",
136 			"",
137 			"To change this, run the configure script with --with-rsync=<path>,",
138 			"where <path> is the absolute path to the rsync binary.",
139 			"",
140 			0
141 		};
142 		int c;
143 
144 		for (c = 0; text[c] != 0; ++c) {
145 			std::cerr << text[c] << std::endl;
146 		}
147 		return;
148 	}
149 
150 	{
151 		char const * argv[256] = { 0 };
152 		int argc = 0;
153 		bool thrown = false;
154 		subdirectory subdir;
155 		estring dir;
156 
157 		argv[argc++] = "<program>";
158 		argv[argc++] = "--archive";
159 
160 		cataloger.clear();
161 		archiver.clear();
162 		reporter.clear();
163 		vaulter.clear();
164 		logger.clear();
165 		config.clear();
166 
167 		config.default_file("./test-rvm.dir/file-1.conf");
168 		try {
169 			timer t;
170 
171 			t.start();
172 
173 			config.init(argc, argv);
174 			logger.init();
175 			vaulter.init();
176 			reporter.init();
177 			archiver.init();
178 			archiver.archive();
179 			cataloger.init();
180 			cataloger.catalog();
181 
182 			t.stop();
183 			reporter.set_total_time(t);
184 
185 			// reporter.print_report();
186 			reporter.file_report();
187 			logger.clear();
188 
189 			// std::cerr << "vaulter.vault() == " << vaulter.vault() << std::endl;
190 			assert(vaulter.vault() == "./test-rvm.dir/vault-1");
191 
192 			dir = vaulter.vault();
193 			dir += "/";
194 			dir += config.timestamp().str();
195 			dir += "/";
196 			dir += config.jobs()[0].generate_archive_path(check_cwd);
197 			adir[adirc++] = dir;
198 
199 			// std::cout << "dir = " << dir << std::endl;
200 
201 			assert(
202 				exists(
203 					config.log_dir()
204 					+ static_cast<std::string>("/")
205 					+ config.timestamp().str()
206 					+ static_cast<std::string>(".log")
207 					)
208 				);
209 			assert(
210 				exists(
211 					config.log_dir()
212 					+ static_cast<std::string>("/")
213 					+ config.timestamp().str()
214 					+ static_cast<std::string>(".report")
215 					)
216 				);
217 
218 			subdir.path(dir);
219 			assert(find(subdir.begin(), subdir.end(), "AUTHORS") != subdir.end());
220 			assert(find(subdir.begin(), subdir.end(), "COPYING") != subdir.end());
221 			assert(find(subdir.begin(), subdir.end(), "INSTALL") != subdir.end());
222 			assert(find(subdir.begin(), subdir.end(), "Makefile") != subdir.end());
223 			assert(find(subdir.begin(), subdir.end(), "Makefile.in") != subdir.end());
224 			assert(find(subdir.begin(), subdir.end(), "README") != subdir.end());
225 			assert(find(subdir.begin(), subdir.end(), "archiver.cc") != subdir.end());
226 			assert(find(subdir.begin(), subdir.end(), "archiver.h") != subdir.end());
227 			assert(find(subdir.begin(), subdir.end(), "config.h") != subdir.end());
228 			assert(find(subdir.begin(), subdir.end(), "config.h.in") != subdir.end());
229 			assert(find(subdir.begin(), subdir.end(), "configure") != subdir.end());
230 			assert(find(subdir.begin(), subdir.end(), "error.cc") != subdir.end());
231 			assert(find(subdir.begin(), subdir.end(), "error.h") != subdir.end());
232 			assert(find(subdir.begin(), subdir.end(), "estring.cc") != subdir.end());
233 			assert(find(subdir.begin(), subdir.end(), "estring.h") != subdir.end());
234 			assert(find(subdir.begin(), subdir.end(), "exec.cc") != subdir.end());
235 			assert(find(subdir.begin(), subdir.end(), "exec.h") != subdir.end());
236 			assert(find(subdir.begin(), subdir.end(), "fs.cc") != subdir.end());
237 			assert(find(subdir.begin(), subdir.end(), "fs.h") != subdir.end());
238 			assert(find(subdir.begin(), subdir.end(), "help.cc") != subdir.end());
239 			assert(find(subdir.begin(), subdir.end(), "help.h") != subdir.end());
240 			assert(find(subdir.begin(), subdir.end(), "logger.cc") != subdir.end());
241 			assert(find(subdir.begin(), subdir.end(), "logger.h") != subdir.end());
242 			assert(find(subdir.begin(), subdir.end(), "make-test-fs-cc") != subdir.end());
243 			assert(find(subdir.begin(), subdir.end(), "rconfig.cc") != subdir.end());
244 			assert(find(subdir.begin(), subdir.end(), "rconfig.h") != subdir.end());
245 			assert(find(subdir.begin(), subdir.end(), "rmath.h") != subdir.end());
246 			assert(find(subdir.begin(), subdir.end(), "rvm.cc") != subdir.end());
247 			assert(find(subdir.begin(), subdir.end(), "rvm.1") != subdir.end());
248 			assert(find(subdir.begin(), subdir.end(), "rvm.1.in") != subdir.end());
249 			assert(find(subdir.begin(), subdir.end(), "test-rvm-001.cc") != subdir.end());
250 			assert(find(subdir.begin(), subdir.end(), "test-error.cc") != subdir.end());
251 			assert(find(subdir.begin(), subdir.end(), "test-estring.cc") != subdir.end());
252 			assert(find(subdir.begin(), subdir.end(), "test-exec.cc") != subdir.end());
253 			assert(find(subdir.begin(), subdir.end(), "test-fs-cwd.cc") != subdir.end());
254 			assert(find(subdir.begin(), subdir.end(), "test-fs.cc") != subdir.end());
255 			// assert(find(subdir.begin(), subdir.end(), "test-job.cc") != subdir.end());
256 			assert(find(subdir.begin(), subdir.end(), "test-logger.cc") != subdir.end());
257 			// assert(find(subdir.begin(), subdir.end(), "test-rconfig.cc") != subdir.end());
258 			assert(find(subdir.begin(), subdir.end(), "test-rmath.cc") != subdir.end());
259 			assert(find(subdir.begin(), subdir.end(), "test-strfmt.cc") != subdir.end());
260 			assert(find(subdir.begin(), subdir.end(), "test-timer.cc") != subdir.end());
261 			assert(find(subdir.begin(), subdir.end(), "test-tstamp.cc") != subdir.end());
262 			assert(find(subdir.begin(), subdir.end(), "test-types.cc") != subdir.end());
263 			assert(find(subdir.begin(), subdir.end(), "timer.cc") != subdir.end());
264 			assert(find(subdir.begin(), subdir.end(), "timer.h") != subdir.end());
265 			assert(find(subdir.begin(), subdir.end(), "tstamp.cc") != subdir.end());
266 			assert(find(subdir.begin(), subdir.end(), "tstamp.h") != subdir.end());
267 			assert(find(subdir.begin(), subdir.end(), "types.h") != subdir.end());
268 			assert(find(subdir.begin(), subdir.end(), "vaulter.cc") != subdir.end());
269 			assert(find(subdir.begin(), subdir.end(), "vaulter.h") != subdir.end());
270 		}
271 		catch(error e) {
272 			ERR_OUT(e);
273 			thrown = true;
274 		}
275 		catch(...) {
276 			ERR_OUT(err_unknown);
277 			assert(0);
278 		}
279 		assert(!thrown);
280 	}
281 
282 	sleep(2);
283 
284 	{
285 		char const * argv[256] = { 0 };
286 		int argc = 0;
287 		bool thrown = false;
288 		subdirectory subdir;
289 		estring dir;
290 
291 		argv[argc++] = "<program>";
292 		argv[argc++] = "--archive";
293 
294 		cataloger.clear();
295 		archiver.clear();
296 		reporter.clear();
297 		vaulter.clear();
298 		logger.clear();
299 		config.clear();
300 
301 		config.default_file("./test-rvm.dir/file-1.conf");
302 		try {
303 			timer t;
304 
305 			t.start();
306 
307 			config.init(argc, argv);
308 			logger.init();
309 			vaulter.init();
310 			reporter.init();
311 			archiver.init();
312 			archiver.archive();
313 			cataloger.init();
314 			cataloger.catalog();
315 
316 			t.stop();
317 			reporter.set_total_time(t);
318 
319 			// reporter.print_report();
320 			reporter.file_report();
321 			logger.clear();
322 
323 			// std::cerr << "vaulter.vault() == " << vaulter.vault() << std::endl;
324 			assert(vaulter.vault() == "./test-rvm.dir/vault-2");
325 
326 			dir = vaulter.vault();
327 			dir += "/";
328 			dir += config.timestamp().str();
329 			dir += "/";
330 			dir += config.jobs()[0].generate_archive_path(check_cwd);
331 			adir[adirc++] = dir;
332 
333 			// std::cout << "dir = " << dir << std::endl;
334 
335 			subdir.path(dir);
336 			assert(find(subdir.begin(), subdir.end(), "AUTHORS") != subdir.end());
337 			assert(find(subdir.begin(), subdir.end(), "COPYING") != subdir.end());
338 			assert(find(subdir.begin(), subdir.end(), "INSTALL") != subdir.end());
339 			assert(find(subdir.begin(), subdir.end(), "Makefile") != subdir.end());
340 			assert(find(subdir.begin(), subdir.end(), "Makefile.in") != subdir.end());
341 			assert(find(subdir.begin(), subdir.end(), "README") != subdir.end());
342 			assert(find(subdir.begin(), subdir.end(), "archiver.cc") != subdir.end());
343 			assert(find(subdir.begin(), subdir.end(), "archiver.h") != subdir.end());
344 			assert(find(subdir.begin(), subdir.end(), "config.h") != subdir.end());
345 			assert(find(subdir.begin(), subdir.end(), "config.h.in") != subdir.end());
346 			assert(find(subdir.begin(), subdir.end(), "configure") != subdir.end());
347 			assert(find(subdir.begin(), subdir.end(), "error.cc") != subdir.end());
348 			assert(find(subdir.begin(), subdir.end(), "error.h") != subdir.end());
349 			assert(find(subdir.begin(), subdir.end(), "estring.cc") != subdir.end());
350 			assert(find(subdir.begin(), subdir.end(), "estring.h") != subdir.end());
351 			assert(find(subdir.begin(), subdir.end(), "exec.cc") != subdir.end());
352 			assert(find(subdir.begin(), subdir.end(), "exec.h") != subdir.end());
353 			assert(find(subdir.begin(), subdir.end(), "fs.cc") != subdir.end());
354 			assert(find(subdir.begin(), subdir.end(), "fs.h") != subdir.end());
355 			assert(find(subdir.begin(), subdir.end(), "help.cc") != subdir.end());
356 			assert(find(subdir.begin(), subdir.end(), "help.h") != subdir.end());
357 			assert(find(subdir.begin(), subdir.end(), "logger.cc") != subdir.end());
358 			assert(find(subdir.begin(), subdir.end(), "logger.h") != subdir.end());
359 			assert(find(subdir.begin(), subdir.end(), "make-test-fs-cc") != subdir.end());
360 			assert(find(subdir.begin(), subdir.end(), "rconfig.cc") != subdir.end());
361 			assert(find(subdir.begin(), subdir.end(), "rconfig.h") != subdir.end());
362 			assert(find(subdir.begin(), subdir.end(), "rmath.h") != subdir.end());
363 			assert(find(subdir.begin(), subdir.end(), "rvm.cc") != subdir.end());
364 			assert(find(subdir.begin(), subdir.end(), "rvm.1") != subdir.end());
365 			assert(find(subdir.begin(), subdir.end(), "rvm.1.in") != subdir.end());
366 			assert(find(subdir.begin(), subdir.end(), "test-rvm-001.cc") != subdir.end());
367 			assert(find(subdir.begin(), subdir.end(), "test-error.cc") != subdir.end());
368 			assert(find(subdir.begin(), subdir.end(), "test-estring.cc") != subdir.end());
369 			assert(find(subdir.begin(), subdir.end(), "test-exec.cc") != subdir.end());
370 			assert(find(subdir.begin(), subdir.end(), "test-fs-cwd.cc") != subdir.end());
371 			assert(find(subdir.begin(), subdir.end(), "test-fs.cc") != subdir.end());
372 			// assert(find(subdir.begin(), subdir.end(), "test-job.cc") != subdir.end());
373 			assert(find(subdir.begin(), subdir.end(), "test-logger.cc") != subdir.end());
374 			// assert(find(subdir.begin(), subdir.end(), "test-rconfig.cc") != subdir.end());
375 			assert(find(subdir.begin(), subdir.end(), "test-rmath.cc") != subdir.end());
376 			assert(find(subdir.begin(), subdir.end(), "test-strfmt.cc") != subdir.end());
377 			assert(find(subdir.begin(), subdir.end(), "test-timer.cc") != subdir.end());
378 			assert(find(subdir.begin(), subdir.end(), "test-tstamp.cc") != subdir.end());
379 			assert(find(subdir.begin(), subdir.end(), "test-types.cc") != subdir.end());
380 			assert(find(subdir.begin(), subdir.end(), "timer.cc") != subdir.end());
381 			assert(find(subdir.begin(), subdir.end(), "timer.h") != subdir.end());
382 			assert(find(subdir.begin(), subdir.end(), "tstamp.cc") != subdir.end());
383 			assert(find(subdir.begin(), subdir.end(), "tstamp.h") != subdir.end());
384 			assert(find(subdir.begin(), subdir.end(), "types.h") != subdir.end());
385 			assert(find(subdir.begin(), subdir.end(), "vaulter.cc") != subdir.end());
386 			assert(find(subdir.begin(), subdir.end(), "vaulter.h") != subdir.end());
387 		}
388 		catch(error e) {
389 			ERR_OUT(e);
390 			thrown = true;
391 		}
392 		catch(...) {
393 			ERR_OUT(err_unknown);
394 			assert(0);
395 		}
396 		assert(!thrown);
397 	}
398 
399 	sleep(2);
400 
401 	{
402 		char const * argv[256] = { 0 };
403 		int argc = 0;
404 		bool thrown = false;
405 		subdirectory subdir;
406 		estring dir;
407 
408 		argv[argc++] = "<program>";
409 		argv[argc++] = "--archive";
410 
411 		cataloger.clear();
412 		archiver.clear();
413 		reporter.clear();
414 		vaulter.clear();
415 		logger.clear();
416 		config.clear();
417 
418 		config.default_file("./test-rvm.dir/file-1.conf");
419 		try {
420 			timer t;
421 
422 			t.start();
423 
424 			config.init(argc, argv);
425 			logger.init();
426 			vaulter.init();
427 			reporter.init();
428 			archiver.init();
429 			archiver.archive();
430 			cataloger.init();
431 			cataloger.catalog();
432 
433 			t.stop();
434 			reporter.set_total_time(t);
435 
436 			// reporter.print_report();
437 			reporter.file_report();
438 			logger.clear();
439 
440 			// std::cerr << "vaulter.vault() == " << vaulter.vault() << std::endl;
441 			assert(vaulter.vault() == "./test-rvm.dir/vault-3");
442 
443 			dir = vaulter.vault();
444 			dir += "/";
445 			dir += config.timestamp().str();
446 			dir += "/";
447 			dir += config.jobs()[0].generate_archive_path(check_cwd);
448 			adir[adirc++] = dir;
449 
450 			// std::cout << "dir = " << dir << std::endl;
451 
452 			subdir.path(dir);
453 			assert(find(subdir.begin(), subdir.end(), "AUTHORS") != subdir.end());
454 			assert(find(subdir.begin(), subdir.end(), "COPYING") != subdir.end());
455 			assert(find(subdir.begin(), subdir.end(), "INSTALL") != subdir.end());
456 			assert(find(subdir.begin(), subdir.end(), "Makefile") != subdir.end());
457 			assert(find(subdir.begin(), subdir.end(), "Makefile.in") != subdir.end());
458 			assert(find(subdir.begin(), subdir.end(), "README") != subdir.end());
459 			assert(find(subdir.begin(), subdir.end(), "archiver.cc") != subdir.end());
460 			assert(find(subdir.begin(), subdir.end(), "archiver.h") != subdir.end());
461 			assert(find(subdir.begin(), subdir.end(), "config.h") != subdir.end());
462 			assert(find(subdir.begin(), subdir.end(), "config.h.in") != subdir.end());
463 			assert(find(subdir.begin(), subdir.end(), "configure") != subdir.end());
464 			assert(find(subdir.begin(), subdir.end(), "error.cc") != subdir.end());
465 			assert(find(subdir.begin(), subdir.end(), "error.h") != subdir.end());
466 			assert(find(subdir.begin(), subdir.end(), "estring.cc") != subdir.end());
467 			assert(find(subdir.begin(), subdir.end(), "estring.h") != subdir.end());
468 			assert(find(subdir.begin(), subdir.end(), "exec.cc") != subdir.end());
469 			assert(find(subdir.begin(), subdir.end(), "exec.h") != subdir.end());
470 			assert(find(subdir.begin(), subdir.end(), "fs.cc") != subdir.end());
471 			assert(find(subdir.begin(), subdir.end(), "fs.h") != subdir.end());
472 			assert(find(subdir.begin(), subdir.end(), "help.cc") != subdir.end());
473 			assert(find(subdir.begin(), subdir.end(), "help.h") != subdir.end());
474 			assert(find(subdir.begin(), subdir.end(), "logger.cc") != subdir.end());
475 			assert(find(subdir.begin(), subdir.end(), "logger.h") != subdir.end());
476 			assert(find(subdir.begin(), subdir.end(), "make-test-fs-cc") != subdir.end());
477 			assert(find(subdir.begin(), subdir.end(), "rconfig.cc") != subdir.end());
478 			assert(find(subdir.begin(), subdir.end(), "rconfig.h") != subdir.end());
479 			assert(find(subdir.begin(), subdir.end(), "rmath.h") != subdir.end());
480 			assert(find(subdir.begin(), subdir.end(), "rvm.cc") != subdir.end());
481 			assert(find(subdir.begin(), subdir.end(), "rvm.1") != subdir.end());
482 			assert(find(subdir.begin(), subdir.end(), "rvm.1.in") != subdir.end());
483 			assert(find(subdir.begin(), subdir.end(), "test-rvm-001.cc") != subdir.end());
484 			assert(find(subdir.begin(), subdir.end(), "test-error.cc") != subdir.end());
485 			assert(find(subdir.begin(), subdir.end(), "test-estring.cc") != subdir.end());
486 			assert(find(subdir.begin(), subdir.end(), "test-exec.cc") != subdir.end());
487 			assert(find(subdir.begin(), subdir.end(), "test-fs-cwd.cc") != subdir.end());
488 			assert(find(subdir.begin(), subdir.end(), "test-fs.cc") != subdir.end());
489 			// assert(find(subdir.begin(), subdir.end(), "test-job.cc") != subdir.end());
490 			assert(find(subdir.begin(), subdir.end(), "test-logger.cc") != subdir.end());
491 			// assert(find(subdir.begin(), subdir.end(), "test-rconfig.cc") != subdir.end());
492 			assert(find(subdir.begin(), subdir.end(), "test-rmath.cc") != subdir.end());
493 			assert(find(subdir.begin(), subdir.end(), "test-strfmt.cc") != subdir.end());
494 			assert(find(subdir.begin(), subdir.end(), "test-timer.cc") != subdir.end());
495 			assert(find(subdir.begin(), subdir.end(), "test-tstamp.cc") != subdir.end());
496 			assert(find(subdir.begin(), subdir.end(), "test-types.cc") != subdir.end());
497 			assert(find(subdir.begin(), subdir.end(), "timer.cc") != subdir.end());
498 			assert(find(subdir.begin(), subdir.end(), "timer.h") != subdir.end());
499 			assert(find(subdir.begin(), subdir.end(), "tstamp.cc") != subdir.end());
500 			assert(find(subdir.begin(), subdir.end(), "tstamp.h") != subdir.end());
501 			assert(find(subdir.begin(), subdir.end(), "types.h") != subdir.end());
502 			assert(find(subdir.begin(), subdir.end(), "vaulter.cc") != subdir.end());
503 			assert(find(subdir.begin(), subdir.end(), "vaulter.h") != subdir.end());
504 		}
505 		catch(error e) {
506 			ERR_OUT(e);
507 			thrown = true;
508 		}
509 		catch(...) {
510 			ERR_OUT(err_unknown);
511 			assert(0);
512 		}
513 		assert(!thrown);
514 	}
515 
516 	sleep(2);
517 
518 	{
519 		char const * argv[256] = { 0 };
520 		int argc = 0;
521 		bool thrown = false;
522 		subdirectory subdir;
523 		estring dir;
524 
525 		argv[argc++] = "<program>";
526 		argv[argc++] = "--archive";
527 
528 		cataloger.clear();
529 		archiver.clear();
530 		reporter.clear();
531 		vaulter.clear();
532 		logger.clear();
533 		config.clear();
534 
535 		config.default_file("./test-rvm.dir/file-1.conf");
536 		try {
537 			timer t;
538 
539 			t.start();
540 
541 			config.init(argc, argv);
542 			logger.init();
543 			vaulter.init();
544 			reporter.init();
545 			archiver.init();
546 			archiver.archive();
547 			estring path;
548 			filestatus fstat1, fstat2;
549 			cataloger.init();
550 			cataloger.catalog();
551 
552 			t.stop();
553 			reporter.set_total_time(t);
554 
555 			// reporter.print_report();
556 			reporter.file_report();
557 			logger.clear();
558 
559 			// std::cerr << "vaulter.vault() == " << vaulter.vault() << std::endl;
560 			assert(vaulter.vault() == "./test-rvm.dir/vault-1");
561 
562 			dir = vaulter.vault();
563 			dir += "/";
564 			dir += config.timestamp().str();
565 			dir += "/";
566 			dir += config.jobs()[0].generate_archive_path(check_cwd);
567 			adir[adirc++] = dir;
568 
569 			// std::cout << "dir = " << dir << std::endl;
570 
571 			subdir.path(dir);
572 			if (subdir.size() == 0) {
573 				std::string filename;
574 				std::string line;
575 				std::ifstream in;
576 				bool found_usage_error = false;
577 				char line_cstr[2048] = { 0 };
578 				int c;
579 
580 				filename = "./test-rvm.dir/log.dir/";
581 				filename += config.timestamp().str();
582 				filename += ".log";
583 				in.open(filename.c_str());
584 				assert(in.is_open());
585 				while (in.getline(line_cstr,2048)) {
586 					line = line_cstr;
587 					if (line.find("Rsync exit code: [1]") != std::string::npos)
588 						found_usage_error = true;
589 					for (c = 0; c < 2048; line_cstr[c++] = 0);
590 				}
591 				in.close();
592 
593 				if (found_usage_error) {
594 					std::cerr
595 						<< "*** NOTICE: One test has failed, the test that uses rsync with"
596 						<< std::endl
597 						<< "            the --hard-links and --link-dest command line"
598 						<< std::endl
599 						<< "            options.  Rsync reported a syntax or usage error,"
600 						<< std::endl
601 						<< "            which may indicate that this version of rsync is"
602 						<< std::endl
603 						<< "            old enough to not have these options."
604 						<< std::endl
605 						<< std::endl
606 						<< "            In order to be able to hard-link files that have"
607 						<< std::endl
608 						<< "            not changed from one archive to the next, you"
609 						<< std::endl
610 						<< "            will have to upgrade rsync."
611 						<< std::endl
612 						;
613 				}
614 				assert(found_usage_error);
615 			}
616 			else {
617 				assert(find(subdir.begin(), subdir.end(), "AUTHORS") != subdir.end());
618 				assert(find(subdir.begin(), subdir.end(), "COPYING") != subdir.end());
619 				assert(find(subdir.begin(), subdir.end(), "INSTALL") != subdir.end());
620 				assert(find(subdir.begin(), subdir.end(), "Makefile") != subdir.end());
621 				assert(find(subdir.begin(), subdir.end(), "Makefile.in") != subdir.end());
622 				assert(find(subdir.begin(), subdir.end(), "README") != subdir.end());
623 				assert(find(subdir.begin(), subdir.end(), "archiver.cc") != subdir.end());
624 				assert(find(subdir.begin(), subdir.end(), "archiver.h") != subdir.end());
625 				assert(find(subdir.begin(), subdir.end(), "config.h") != subdir.end());
626 				assert(find(subdir.begin(), subdir.end(), "config.h.in") != subdir.end());
627 				assert(find(subdir.begin(), subdir.end(), "configure") != subdir.end());
628 				assert(find(subdir.begin(), subdir.end(), "error.cc") != subdir.end());
629 				assert(find(subdir.begin(), subdir.end(), "error.h") != subdir.end());
630 				assert(find(subdir.begin(), subdir.end(), "estring.cc") != subdir.end());
631 				assert(find(subdir.begin(), subdir.end(), "estring.h") != subdir.end());
632 				assert(find(subdir.begin(), subdir.end(), "exec.cc") != subdir.end());
633 				assert(find(subdir.begin(), subdir.end(), "exec.h") != subdir.end());
634 				assert(find(subdir.begin(), subdir.end(), "fs.cc") != subdir.end());
635 				assert(find(subdir.begin(), subdir.end(), "fs.h") != subdir.end());
636 				assert(find(subdir.begin(), subdir.end(), "help.cc") != subdir.end());
637 				assert(find(subdir.begin(), subdir.end(), "help.h") != subdir.end());
638 				assert(find(subdir.begin(), subdir.end(), "logger.cc") != subdir.end());
639 				assert(find(subdir.begin(), subdir.end(), "logger.h") != subdir.end());
640 				assert(find(subdir.begin(), subdir.end(), "make-test-fs-cc") != subdir.end());
641 				assert(find(subdir.begin(), subdir.end(), "rconfig.cc") != subdir.end());
642 				assert(find(subdir.begin(), subdir.end(), "rconfig.h") != subdir.end());
643 				assert(find(subdir.begin(), subdir.end(), "rmath.h") != subdir.end());
644 				assert(find(subdir.begin(), subdir.end(), "rvm.cc") != subdir.end());
645 				assert(find(subdir.begin(), subdir.end(), "rvm.1") != subdir.end());
646 				assert(find(subdir.begin(), subdir.end(), "rvm.1.in") != subdir.end());
647 				assert(find(subdir.begin(), subdir.end(), "test-rvm-001.cc") != subdir.end());
648 				assert(find(subdir.begin(), subdir.end(), "test-error.cc") != subdir.end());
649 				assert(find(subdir.begin(), subdir.end(), "test-estring.cc") != subdir.end());
650 				assert(find(subdir.begin(), subdir.end(), "test-exec.cc") != subdir.end());
651 				assert(find(subdir.begin(), subdir.end(), "test-fs-cwd.cc") != subdir.end());
652 				assert(find(subdir.begin(), subdir.end(), "test-fs.cc") != subdir.end());
653 				// assert(find(subdir.begin(), subdir.end(), "test-job.cc") != subdir.end());
654 				assert(find(subdir.begin(), subdir.end(), "test-logger.cc") != subdir.end());
655 				// assert(find(subdir.begin(), subdir.end(), "test-rconfig.cc") != subdir.end());
656 				assert(find(subdir.begin(), subdir.end(), "test-rmath.cc") != subdir.end());
657 				assert(find(subdir.begin(), subdir.end(), "test-strfmt.cc") != subdir.end());
658 				assert(find(subdir.begin(), subdir.end(), "test-timer.cc") != subdir.end());
659 				assert(find(subdir.begin(), subdir.end(), "test-tstamp.cc") != subdir.end());
660 				assert(find(subdir.begin(), subdir.end(), "test-types.cc") != subdir.end());
661 				assert(find(subdir.begin(), subdir.end(), "timer.cc") != subdir.end());
662 				assert(find(subdir.begin(), subdir.end(), "timer.h") != subdir.end());
663 				assert(find(subdir.begin(), subdir.end(), "tstamp.cc") != subdir.end());
664 				assert(find(subdir.begin(), subdir.end(), "tstamp.h") != subdir.end());
665 				assert(find(subdir.begin(), subdir.end(), "types.h") != subdir.end());
666 				assert(find(subdir.begin(), subdir.end(), "vaulter.cc") != subdir.end());
667 				assert(find(subdir.begin(), subdir.end(), "vaulter.h") != subdir.end());
668 
669 				assert(test_inodes(adir[0], adir[3], "AUTHORS"));
670 			}
671 
672 			// TODO: Check output
673 			assert(
674 				exists(
675 					static_cast<std::string>("./test-rvm.dir/catalog.dir/")
676 					+ config.timestamp().str()
677 				)
678 			);
679 		}
680 		catch(error e) {
681 			ERR_OUT(e);
682 			thrown = true;
683 		}
684 		catch(...) {
685 			ERR_OUT(err_unknown);
686 			assert(0);
687 		}
688 		assert(!thrown);
689 	}
690 }
691 
main(int argc,char const * argv[])692 int main(int argc, char const * argv[])
693 {
694 	cleanup();
695 	setup();
696 	try {
697 		test_rvm();
698 	}
699 	catch(error e) {
700 		std::cerr << e;
701 		assert(0);
702 	}
703 	catch(...) {
704 		std::cerr << err_unknown;
705 		assert(0);
706 	}
707 	cleanup();
708 	return(0);
709 }
710 
711