libabigail/tests/test-lookup-syms.cc
Dodji Seketeli 322b0e7769 Expose a new libabigail::tools_utils namespace
The utilities present in this namespace were previously living in
tools/abg-tools-utils.h and tools/abg-tools-utils.cc.  They were not
exported and were meant to be useful to the tools writting in the
tools/ directory.  I realized that these utilities might be useful to
clients of the libabigail library in general so I am making them
available generally.  Note that the initial name of the namespace was
libabigail::tools; so renaming it to libabigail::tools_utils required
that I adjust some client code.  I have also cleaned up the code,
interfaces and their apidoc a little bit.

	* include/abg-tools-utils.h: Moved tools/abg-tools-utils.h in
	here.  Renamed the namespace tools into tools_utils.  Inject
	std::ostream, std::istream, std::ifstream, and std::string types
	into the tools_utils namespace.  Adjust the function declarations
	accordingly.  Remove the useless dirname() function declaration.
	* include/Makefile.am: Add abg-tools-utils.h to the list of
	exported headers.
	* src/abg-tools-utils.cc: Moved tools/abg-tools-utils.cc in here.
	Renamed the namespace tools into tools_utils.
	(get_stat): Add apidoc.
	(is_dir): Cleanup apidoc.
	(dir_name); Cleanup parameter name.
	(guess_file_type): Cleanup parameter type.
	* src/Makefile.am: Add abg-tools-utils.cc to the list of exported
	headers.
	* tools/Makefile.am: Do not build the temporary library
	libtoolsutils.la anymore as abg-tools-utils.{h,cc} have moved out
	of this directory.
	* tools/abicompat.cc (parse_command_line, main): Adjust for tools
	-> tools_utils namespace change.
	* tools/abidiff.cc (parse_command_line, main): Likewise.
	* tools/abidw.cc (parse_command_line, main): Likewise.
	* tools/abilint.cc (parse_command_line, main): Likewise.
	* tests/test-abicompat.cc (main): Adjust for tools -> tools_utils
	namespace change.
	* tests/test-abidiff.cc (main): Likewise.
	* tests/test-alt-dwarf-file.cc (main): Likewise.
	* tests/test-core-diff.cc (main): Likewise.
	* tests/test-diff-dwarf.cc (main): Likewise.
	* tests/test-diff-filter.cc (main): Likewise.
	* tests/test-diff-suppr.cc (main): Likewise.
	* tests/test-lookup-syms.cc (main): Likewise.
	* tests/test-read-dwarf.cc (main): Likewise.
	* tests/test-read-write.cc (main): Likewise.
	* tests/Makefile.am: Do not reference the libtoolsutils.la private
	library anymore.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2015-01-08 12:28:14 +01:00

143 lines
3.7 KiB
C++

// -*- Mode: C++ -*-
//
// Copyright (C) 2013-2015 Red Hat, Inc.
//
// This file is part of the GNU Application Binary Interface Generic
// Analysis and Instrumentation Library (libabigail). This library is
// free software; you can redistribute it and/or modify it under the
// terms of the GNU Lesser General Public License as published by the
// Free Software Foundation; either version 3, or (at your option) any
// later version.
// This library is distributed in the hope that it will be useful, but
// WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// General Lesser Public License for more details.
// You should have received a copy of the GNU Lesser General Public
// License along with this program; see the file COPYING-LGPLV3. If
// not, see <http://www.gnu.org/licenses/>.
// Author: Dodji Seketeli
/// @file
///
/// This program tests the ELF symbols lookup APIs from
/// abigail::dwarf_reader. It uses the lookupsym tool from the
/// libabigail distribution.
#include <iostream>
#include <cstdlib>
#include "abg-tools-utils.h"
#include "test-utils.h"
using std::cerr;
using std::string;
struct InOutSpec
{
const char* in_elf_path;
const char* symbol;
const char* abisym_options;
const char* in_report_path;
const char* out_report_path;
}; // end struct InOutSpec
InOutSpec in_out_specs[] =
{
{
"data/test-lookup-syms/test0.o",
"main",
"",
"data/test-lookup-syms/test0-report.txt",
"output/test-lookup-syms/test0-report.txt"
},
{
"data/test-lookup-syms/test0.o",
"foo",
"",
"data/test-lookup-syms/test01-report.txt",
"output/test-lookup-syms/test01-report.txt"
},
{
"data/test-lookup-syms/test0.o",
"\"bar(char)\"",
"--demangle",
"data/test-lookup-syms/test02-report.txt",
"output/test-lookup-syms/test02-report.txt"
},
{
"data/test-lookup-syms/test1.so",
"foo",
"",
"data/test-lookup-syms/test1-1-report.txt",
"output/test-lookup-syms/test1-1-report.txt"
},
{
"data/test-lookup-syms/test1.so",
"_foo1",
"--no-absolute-path",
"data/test-lookup-syms/test1-2-report.txt",
"output/test-lookup-syms/test-2-report.txt"
},
{
"data/test-lookup-syms/test1.so",
"_foo2",
"--no-absolute-path",
"data/test-lookup-syms/test1-3-report.txt",
"output/test-lookup-syms/test-3-report.txt"
},
// This should always be the last entry.
{NULL, NULL, NULL, NULL, NULL}
};
int
main()
{
using abigail::tests::get_src_dir;
using abigail::tests::get_build_dir;
using abigail::tools_utils::ensure_parent_dir_created;
bool is_ok = true;
string in_elf_path, symbol, abisym, abisym_options,
ref_report_path, out_report_path;
for (InOutSpec* s = in_out_specs; s->in_elf_path; ++s)
{
in_elf_path = get_src_dir() + "/tests/" + s->in_elf_path;
symbol = s->symbol;
abisym_options = s->abisym_options;
ref_report_path = get_src_dir() + "/tests/" + s->in_report_path;
out_report_path = get_build_dir() + "/tests/" + s->out_report_path;
if (!ensure_parent_dir_created(out_report_path))
{
cerr << "could not create parent directory for "
<< out_report_path;
is_ok = false;
continue;
}
abisym = get_build_dir() + "/tools/abisym";
abisym += " " + abisym_options;
string cmd = abisym + " " + in_elf_path + " " + symbol;
cmd += " > " + out_report_path;
bool abisym_ok = true;
if (system(cmd.c_str()))
abisym_ok = false;
if (abisym_ok)
{
cmd = "diff -u " + ref_report_path + " "+ out_report_path;
if (system(cmd.c_str()))
is_ok = false;
}
else
is_ok = false;
}
return !is_ok;
}