mirror of
git://sourceware.org/git/libabigail.git
synced 2024-12-15 14:34:38 +00:00
c45d70d08d
This patch adds the Catch [1] unit test framework in version v1.12.2 [2] along with its integration into the existing build and test definition. While there is version v2 available, v1 still supports C++98, hence we can make use of it. The framework is distributed as a single header file. And since it is less then 500k and it comes with a permissive license, I decided to directly add the file rather than requiring users/developers/distributors to satisfy the new dependency. The integration is fairly simple: A new library libcatch.a provides the `main` for the tests that run with Catch. The tests themselves require to include the header as well and to link against said library. As an example I migrated the test-kmi-whitelist test to Catch. The test becomes a bit more structured and error reporting significantly improved. E.g. see this intentional breakage: | --- a/tests/test-kmi-whitelist.cc | +++ b/tests/test-kmi-whitelist.cc | @@ -140,5 +140,5 @@ TEST_CASE("WhitelistWithTwoSections", "[whitelists]") | suppressions_type suppr | = gen_suppr_spec_from_kernel_abi_whitelists(abi_whitelist_paths); | REQUIRE(!suppr.empty()); | - test_suppressions_are_consistent(suppr, "^test_symbol1$|^test_symbol2$"); | + test_suppressions_are_consistent(suppr, "^test_symbol$|^test_symbol2$"); It leads to this test output: | --------------------------------------------------------------------------- | WhitelistWithTwoSections | --------------------------------------------------------------------------- | ../../tests/test-kmi-whitelist.cc:136 | ........................................................................... | | ../../tests/test-kmi-whitelist.cc:81: FAILED: | REQUIRE( left->get_symbol_name_not_regex_str() == expr ) | with expansion: | "^test_symbol1$|^test_symbol2$" | == | "^test_symbol$|^test_symbol2$" | | =========================================================================== | test cases: 6 | 5 passed | 1 failed | assertions: 41 | 40 passed | 1 failed [1] https://github.com/catchorg/Catch2 [2] https://github.com/catchorg/Catch2/releases/tag/v1.12.2 * tests/.gitignore: Add entry for .dirstamp * tests/Makefile.am: Add libcatch test library and use it for runtestkmiwhitelist. * tests/lib/catch.cc: New test driver implementation. * tests/lib/catch.hpp: Add Catch v1.12.2 header only test library. * tests/test-kmi-whitelist.cc: Migrate to use Catch test framework. Reviewed-by: Dodji Seketeli <dodji@seketeli.org> Signed-off-by: Matthias Maennich <maennich@google.com>
145 lines
5.0 KiB
C++
145 lines
5.0 KiB
C++
// -*- Mode: C++ -*-
|
|
//
|
|
// Copyright (C) 2020 Google, 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: Matthias Maennich
|
|
|
|
/// @file
|
|
///
|
|
/// This program tests suppression generation from KMI whitelists.
|
|
|
|
#include <string>
|
|
|
|
#include "lib/catch.hpp"
|
|
|
|
#include "abg-fwd.h"
|
|
#include "abg-suppression.h"
|
|
#include "abg-tools-utils.h"
|
|
#include "test-utils.h"
|
|
|
|
using abigail::tools_utils::gen_suppr_spec_from_kernel_abi_whitelists;
|
|
using abigail::suppr::suppression_sptr;
|
|
using abigail::suppr::suppressions_type;
|
|
using abigail::suppr::function_suppression_sptr;
|
|
using abigail::suppr::variable_suppression_sptr;
|
|
using abigail::suppr::is_function_suppression;
|
|
using abigail::suppr::is_variable_suppression;
|
|
|
|
const static std::string whitelist_with_single_entry
|
|
= std::string(abigail::tests::get_src_dir())
|
|
+ "/tests/data/test-kmi-whitelist/whitelist-with-single-entry";
|
|
|
|
const static std::string whitelist_with_another_single_entry
|
|
= std::string(abigail::tests::get_src_dir())
|
|
+ "/tests/data/test-kmi-whitelist/whitelist-with-another-single-entry";
|
|
|
|
const static std::string whitelist_with_two_sections
|
|
= std::string(abigail::tests::get_src_dir())
|
|
+ "/tests/data/test-kmi-whitelist/whitelist-with-two-sections";
|
|
|
|
const static std::string whitelist_with_duplicate_entry
|
|
= std::string(abigail::tests::get_src_dir())
|
|
+ "/tests/data/test-kmi-whitelist/whitelist-with-duplicate-entry";
|
|
|
|
void
|
|
test_suppressions_are_consistent(const suppressions_type& suppr,
|
|
const std::string& expr)
|
|
{
|
|
REQUIRE(suppr.size() == 2);
|
|
|
|
function_suppression_sptr left = is_function_suppression(suppr[0]);
|
|
variable_suppression_sptr right = is_variable_suppression(suppr[1]);
|
|
|
|
// correctly casted
|
|
REQUIRE(left);
|
|
REQUIRE(right);
|
|
// same label
|
|
REQUIRE(left->get_label() == right->get_label());
|
|
// same mode
|
|
REQUIRE(left->get_drops_artifact_from_ir()
|
|
== right->get_drops_artifact_from_ir());
|
|
// same regex
|
|
REQUIRE(left->get_symbol_name_not_regex_str()
|
|
== right->get_symbol_name_not_regex_str());
|
|
// regex as expected
|
|
REQUIRE(left->get_symbol_name_not_regex_str() == expr);
|
|
}
|
|
|
|
TEST_CASE("NoWhitelists", "[whitelists]")
|
|
{
|
|
const std::vector<std::string> abi_whitelist_paths;
|
|
suppressions_type suppr =
|
|
gen_suppr_spec_from_kernel_abi_whitelists(abi_whitelist_paths);
|
|
REQUIRE(suppr.empty());
|
|
}
|
|
|
|
TEST_CASE("WhitelistWithASingleEntry", "[whitelists]")
|
|
{
|
|
std::vector<std::string> abi_whitelist_paths;
|
|
abi_whitelist_paths.push_back(whitelist_with_single_entry);
|
|
suppressions_type suppr
|
|
= gen_suppr_spec_from_kernel_abi_whitelists(abi_whitelist_paths);
|
|
REQUIRE(!suppr.empty());
|
|
test_suppressions_are_consistent(suppr, "^test_symbol$");
|
|
}
|
|
|
|
TEST_CASE("WhitelistWithADuplicateEntry", "[whitelists]")
|
|
{
|
|
std::vector<std::string> abi_whitelist_paths;
|
|
abi_whitelist_paths.push_back(whitelist_with_duplicate_entry);
|
|
suppressions_type suppr
|
|
= gen_suppr_spec_from_kernel_abi_whitelists(abi_whitelist_paths);
|
|
REQUIRE(!suppr.empty());
|
|
test_suppressions_are_consistent(suppr, "^test_symbol$");
|
|
}
|
|
|
|
TEST_CASE("TwoWhitelists", "[whitelists]")
|
|
{
|
|
std::vector<std::string> abi_whitelist_paths;
|
|
abi_whitelist_paths.push_back(whitelist_with_single_entry);
|
|
abi_whitelist_paths.push_back(whitelist_with_another_single_entry);
|
|
suppressions_type suppr =
|
|
gen_suppr_spec_from_kernel_abi_whitelists(abi_whitelist_paths);
|
|
REQUIRE(!suppr.empty());
|
|
test_suppressions_are_consistent(suppr,
|
|
"^test_another_symbol$|^test_symbol$");
|
|
}
|
|
|
|
TEST_CASE("TwoWhitelistsWithDuplicates", "[whitelists]")
|
|
{
|
|
std::vector<std::string> abi_whitelist_paths;
|
|
abi_whitelist_paths.push_back(whitelist_with_duplicate_entry);
|
|
abi_whitelist_paths.push_back(whitelist_with_another_single_entry);
|
|
suppressions_type suppr
|
|
= gen_suppr_spec_from_kernel_abi_whitelists(abi_whitelist_paths);
|
|
REQUIRE(!suppr.empty());
|
|
test_suppressions_are_consistent(suppr,
|
|
"^test_another_symbol$|^test_symbol$");
|
|
}
|
|
|
|
TEST_CASE("WhitelistWithTwoSections", "[whitelists]")
|
|
{
|
|
std::vector<std::string> abi_whitelist_paths;
|
|
abi_whitelist_paths.push_back(whitelist_with_two_sections);
|
|
suppressions_type suppr
|
|
= gen_suppr_spec_from_kernel_abi_whitelists(abi_whitelist_paths);
|
|
REQUIRE(!suppr.empty());
|
|
test_suppressions_are_consistent(suppr, "^test_symbol1$|^test_symbol2$");
|
|
}
|