1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
// -*- Mode: C++ -*-
//
// Copyright (C) 2013-2025 Red Hat, Inc.
//
// Author: Dodji Seketeli
/// @file
///
/// This test harness program runs a diff between the output of
/// abinilint on an ini file and a reference expected output.
#include <sys/wait.h>
#include <cstring>
#include <string>
#include <fstream>
#include <iostream>
#include <cstdlib>
#include "abg-tools-utils.h"
#include "test-utils.h"
using std::string;
using std::cerr;
using abigail::tests::emit_test_status_and_update_counters;
using abigail::tests::emit_test_summary;
/// This is an aggregate that specifies where a test shall get its
/// input from and where it shall write its ouput to.
struct InOutSpec
{
// Where to read the ini file from, with abinilint.
const char* in_ini_path;
// Where to get the expected output from abinilint.
const char* in_reference_output_path;
// Where to emit the output of abinilint to.
const char* out_init_path;
// The options to use with abinilint.
const char* abinilint_options;
}; // end struct InOutSpec;
// An array of test specifications listing the ini files to read and
// their expected output.
InOutSpec in_out_specs[] =
{
{
"data/test-ini/test01-equal-in-property-string.abignore",
"data/test-ini/test01-equal-in-property-string.abignore.expected",
"output/test-ini/test01-equal-in-property-string.abignore",
""
},
{
"data/test-ini/test02-buggy-property-value.abignore",
"data/test-ini/test02-buggy-property-value.abignore.expected",
"output/test-ini/test02-buggy-property-value.abignore",
""
}
,
// This one must always remain the last one.
{0, 0, 0, 0}
};
/// @return the test source directory.
static string
get_test_src_dir()
{
using abigail::tests::get_src_dir;
return string(get_src_dir()) + "/tests";
}
/// @return the test build directory.
static string
get_test_build_dir()
{
using abigail::tests::get_build_dir;
return string(get_build_dir()) + "/tests";
}
/// @return the tools directory under the build directory;
static string
get_tools_build_dir()
{
using abigail::tests::get_build_dir;
return string(get_build_dir()) + "/tools";
}
int
main()
{
using abigail::tests::get_build_dir;
using abigail::tools_utils::ensure_parent_dir_created;
using abigail::tools_utils::abidiff_status;
unsigned int total_count = 0, passed_count = 0, failed_count = 0;
string in_ini_path, in_reference_output_path, out_ini_path, cmd, diff_cmd;
for (InOutSpec *s = in_out_specs; s->in_ini_path; ++s)
{
bool is_ok = true;
in_ini_path = get_test_src_dir() + "/" + s->in_ini_path;
in_reference_output_path =
get_test_src_dir() + "/" + s->in_reference_output_path;
out_ini_path = get_test_build_dir() + "/" + s->out_init_path;
if (!ensure_parent_dir_created(out_ini_path))
{
cerr << "could not create parent directory for "
<< out_ini_path;
is_ok = false;
continue;
}
cmd = get_tools_build_dir() + "/abinilint";
if (s->abinilint_options && strcmp(s->abinilint_options, ""))
cmd += " " + string(s->abinilint_options);
cmd += " " + in_ini_path + " > " + out_ini_path;
bool cmd_is_ok = true;
int code = system(cmd.c_str());
if (!WIFEXITED(code))
cmd_is_ok = false;
else
{
abigail::tools_utils::abidiff_status status =
static_cast<abidiff_status>(WEXITSTATUS(code));
if (abigail::tools_utils::abidiff_status_has_error(status))
cmd_is_ok = false;
}
if (cmd_is_ok)
{
diff_cmd = "diff -u " + in_reference_output_path + " " + out_ini_path;
if (system(diff_cmd.c_str()))
is_ok = false;
}
else
is_ok = false;
emit_test_status_and_update_counters(is_ok, cmd, passed_count,
failed_count, total_count);
}
emit_test_summary(total_count, passed_count, failed_count);
return failed_count;
}
|