/**
* @file file_manip_tests.cpp
*
* @remark Copyright 2003 OProfile authors
* @remark Read the file COPYING
*
* @author John Levon
* @author Philippe Elie
*/
#include <unistd.h>
#include <stdlib.h>
#include <string>
#include <iostream>
#include <list>
#include "file_manip.h"
using namespace std;
template <typename Input, typename Output>
struct input_output {
Input input;
Output output;
};
template <typename Input, typename Output, typename Result>
static void check_result(char const * fct_name, Input const & input,
Output const & output, Result const & result)
{
if (result != output) {
cerr << fct_name << " "
<< "for:\n\"" << input << "\"\n"
<< "expect:\n\"" << output << "\"\n"
<< "found:\n\"" << result << "\"\n";
exit(EXIT_FAILURE);
}
}
template <typename Input, typename Output, typename Result>
static void check_result(char const * fct_name, Input const & input1,
Input input2, Output const & output, Result const & result)
{
if (result != output) {
cerr << fct_name << ": \n"
<< "for:\n\"" << input1 << "\"\n"
<< "\"" << input2 << "\"\n"
<< "expect:\n\"" << output << "\"\n"
<< "found:\n\"" << result << "\"\n";
exit(EXIT_FAILURE);
}
}
static input_output<char const *, char const *> expect_dirname[] =
{
{ "/", "/" },
{ "//////", "/" },
{ "/usr", "/" },
{ "///usr", "/" },
// suprising but conform to dirname(1)
{ "///usr/dir", "///usr" },
{ "usr/dir", "usr" },
{ "usr", "." },
{ "n", "." },
{ "../..", ".." },
{ "/../..", "/.." },
{ "./..", "." },
{ "./.", "." },
{ "..", "." },
{ ".", "." },
{ "", "." },
{ 0, 0 }
};
static void dirname_tests()
{
input_output<char const *, char const *> const * cur;
for (cur = expect_dirname; cur->input; ++cur) {
string result = op_dirname(cur->input);
check_result("dirname", cur->input, cur->output, result);
}
}
static input_output<char const *, char const*> expect_basename[] =
{
{ "/", "/" },
{ "//////", "/" },
{ "/usr", "usr" },
{ "///usr", "usr" },
{ "///usr/dir", "dir" },
{ "///usr//dir", "dir" },
{ "usr/dir", "dir" },
{ "usr", "usr" },
{ "../..", ".." },
{ "/../..", ".." },
{ "./..", ".." },
{ "./.", "." },
{ ".", "." },
{ 0, 0 }
};
static void basename_tests()
{
input_output<char const *, char const *> const * cur;
for (cur = expect_basename; cur->input; ++cur) {
string result = op_basename(cur->input);
check_result("basename", cur->input, cur->output, result);
}
}
static input_output<char const *, bool> expect_is_directory[] =
{
{ ".", true },
{ "/.", true },
{ "./", true },
{ "/", true },
{ "../", true },
{ "../.", true },
{ "non_existing_dir", false },
{ 0, 0 }
};
static void is_directory_tests()
{
input_output<char const *, bool> const * cur;
for (cur = expect_is_directory; cur->input; ++cur) {
bool result = is_directory(cur->input);
check_result("is_directory", cur->input, cur->output, result);
}
}
static input_output<pair<string, string>, bool>
expect_is_files_identical[] = {
#define MAKE_PAIR(a, b) make_pair(string(a), string(b))
{ MAKE_PAIR(__FILE__, __FILE__), true },
{ MAKE_PAIR(__FILE__, "not_existing"), false },
{ MAKE_PAIR("not_exisiting", __FILE__), false },
{ MAKE_PAIR("not_exisiting", "not_existing"), false },
{ MAKE_PAIR("", ""), false }
#undef MAKE_PAIR
};
void is_files_identical_tests(char const * prog_name)
{
check_result("is_files_identical", prog_name, prog_name,
is_files_identical(prog_name, prog_name), true);
input_output<pair<string, string>, bool> const * cur;
for (cur = expect_is_files_identical; !cur->input.first.empty(); ++cur) {
bool result = is_files_identical(cur->input.first,
cur->input.second);
check_result("is_files_identical", cur->input.first,
cur->input.second, cur->output, result);
}
}
static input_output<char const *, bool> expect_op_file_readable[] =
{
{ __FILE__, true },
{ "./" __FILE__, true },
{ ".", false },
{ "/.", false },
{ "./", false },
{ "/", false },
{ "../", false },
{ "../.", false },
{ "non_existing_file", false },
{ 0, 0 }
};
static void op_file_readable_tests()
{
input_output<char const *, bool> const * cur;
for (cur = expect_op_file_readable; cur->input; ++cur) {
bool result = op_file_readable(cur->input);
check_result("op_file_readable", cur->input, cur->output, result);
}
}
static input_output<string, string> expect_realpath[] =
{
// realpath() file argument must exists.
{ "file_manip_tests.o", "file_manip_tests.o" },
{ "../tests/" "file_manip_tests.o", "file_manip_tests.o" },
{ ".//.//" "file_manip_tests.o", "file_manip_tests.o" },
// POSIX namespaces ignored by realpath(3)
{ "//", "/" },
{ "//usr", "/usr" },
{ "///", "/" },
{ "", "" }
};
// FIXME: useful to test symlinks too
static void realpath_tests()
{
input_output<string, string> const * cur;
for (cur = expect_realpath; !cur->input.empty(); ++cur) {
string result = op_realpath(cur->input);
string expect = cur->output;
if (cur->input[0] != '/')
expect = SRCDIR + expect;
check_result("op_realpath", cur->input,
expect, result);
}
}
void create_file_list_tests()
{
list<string> result;
if (!create_file_list(result, ".")) {
cerr << "create_file_list() fail\n";
exit(EXIT_FAILURE);
}
if (result.empty()) {
cerr << "create_file_list(); empty result\n";
exit(EXIT_FAILURE);
}
}
int main(int, char * argv[])
{
dirname_tests();
basename_tests();
is_directory_tests();
is_files_identical_tests(argv[0]);
op_file_readable_tests();
realpath_tests();
create_file_list_tests();
return EXIT_SUCCESS;
}