From c5b81de47d63aa5515492f51c42b496e490aad26 Mon Sep 17 00:00:00 2001 From: Dodji Seketeli Date: Fri, 29 Nov 2013 13:49:50 +0100 Subject: [PATCH] Add support for bidiff regression testing * tests/data/test-bidiff/test-enum0-v0.cc.bi: New input file. * tests/data/test-bidiff/test-enum0-v1.cc.bi: Likewise. * tests/data/test-bidiff/test-enum0-report.diff: Likewise. * tests/data/test-bidiff/test-enum1-v0.cc.bi: Likewise. * tests/data/test-bidiff/test-enum1-v1.cc.bi: Likewise. * tests/data/test-bidiff/test-enum1-report.txt: Likewise. * tests/data/test-bidiff/test-qual-type0-v0.cc.bi: Likewise. * tests/data/test-bidiff/test-qual-type0-v1.cc.bi: Likewise. * tests/data/test-bidiff/test-qual-type0-report.txt: Likewise. * tests/data/test-bidiff/test-struct0-v0.cc.bi: Likewise. * tests/data/test-bidiff/test-struct0-v1.cc.bi: Likewise. * tests/data/test-bidiff/test-struct0-report.txt: Likewise. * tests/data/test-bidiff/test-struct1-v0.cc.bi: Likewise. * tests/data/test-bidiff/test-struct1-v1.cc.bi: Likewise. * tests/data/test-bidiff/test-struct1-report.txt: Likewise. * tests/data/test-bidiff/test-var0-v0.cc.bi: Likewise. * tests/data/test-bidiff/test-var0-v1.cc.bi: Likewise. * tests/data/test-bidiff/test-var0-report.txt: Likewise. * tests/test-bidiff.cc: New file. * tests/Makefile.am: Build the new runtestbidiff regression test and add the above to the source distribution. Signed-off-by: Dodji Seketeli --- tests/Makefile.am | 26 ++- tests/data/test-bidiff/test-enum0-report.txt | 17 ++ tests/data/test-bidiff/test-enum0-v0.cc.bi | 13 ++ tests/data/test-bidiff/test-enum0-v1.cc.bi | 13 ++ tests/data/test-bidiff/test-enum1-report.txt | 17 ++ tests/data/test-bidiff/test-enum1-v0.cc.bi | 13 ++ tests/data/test-bidiff/test-enum1-v1.cc.bi | 14 ++ .../test-bidiff/test-qual-type0-report.txt | 28 +++ .../data/test-bidiff/test-qual-type0-v0.cc.bi | 19 ++ .../data/test-bidiff/test-qual-type0-v1.cc.bi | 23 +++ .../data/test-bidiff/test-struct0-report.txt | 38 ++++ tests/data/test-bidiff/test-struct0-v0.cc.bi | 21 +++ tests/data/test-bidiff/test-struct0-v1.cc.bi | 25 +++ .../data/test-bidiff/test-struct1-report.txt | 64 +++++++ tests/data/test-bidiff/test-struct1-v0.cc.bi | 70 ++++++++ tests/data/test-bidiff/test-struct1-v1.cc.bi | 88 +++++++++ tests/data/test-bidiff/test-var0-report.txt | 6 + tests/data/test-bidiff/test-var0-v0.cc.bi | 7 + tests/data/test-bidiff/test-var0-v1.cc.bi | 8 + tests/test-bidiff.cc | 170 ++++++++++++++++++ 20 files changed, 679 insertions(+), 1 deletion(-) create mode 100644 tests/data/test-bidiff/test-enum0-report.txt create mode 100644 tests/data/test-bidiff/test-enum0-v0.cc.bi create mode 100644 tests/data/test-bidiff/test-enum0-v1.cc.bi create mode 100644 tests/data/test-bidiff/test-enum1-report.txt create mode 100644 tests/data/test-bidiff/test-enum1-v0.cc.bi create mode 100644 tests/data/test-bidiff/test-enum1-v1.cc.bi create mode 100644 tests/data/test-bidiff/test-qual-type0-report.txt create mode 100644 tests/data/test-bidiff/test-qual-type0-v0.cc.bi create mode 100644 tests/data/test-bidiff/test-qual-type0-v1.cc.bi create mode 100644 tests/data/test-bidiff/test-struct0-report.txt create mode 100644 tests/data/test-bidiff/test-struct0-v0.cc.bi create mode 100644 tests/data/test-bidiff/test-struct0-v1.cc.bi create mode 100644 tests/data/test-bidiff/test-struct1-report.txt create mode 100644 tests/data/test-bidiff/test-struct1-v0.cc.bi create mode 100644 tests/data/test-bidiff/test-struct1-v1.cc.bi create mode 100644 tests/data/test-bidiff/test-var0-report.txt create mode 100644 tests/data/test-bidiff/test-var0-v0.cc.bi create mode 100644 tests/data/test-bidiff/test-var0-v1.cc.bi create mode 100644 tests/test-bidiff.cc diff --git a/tests/Makefile.am b/tests/Makefile.am index 8dd0c0b5..ed543520 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -4,6 +4,7 @@ TESTS= \ runtestreadwrite \ runtestwritereadarchive \ runtestcorediff \ +runtestbidiff \ runtestsvg \ runtestdot @@ -34,6 +35,10 @@ runtestcorediff_SOURCES=$(h)/test-core-diff.cc runtestcorediff_LDADD=libtestutils.la $(top_builddir)/src/libabigail.la runtestcorediff_DEPENDENCIES=libtestutils.la +runtestbidiff_SOURCES = $(h)/test-bidiff.cc +runtestbidiff_LDADD = libtestutils.la $(top_builddir)/src/libabigail.la +runtestbidiff_DEPENDENCIES = libtestutils.la + runtestsvg_SOURCES=$(h)/test-svg.cc runtestsvg_LDADD=$(top_builddir)/src/libabigail.la @@ -78,7 +83,26 @@ data/test-write-read-archive/test0.xml \ data/test-write-read-archive/test1.xml \ data/test-write-read-archive/test2.xml \ data/test-write-read-archive/test3.xml \ -data/test-write-read-archive/test4.xml +data/test-write-read-archive/test4.xml \ +\ +data/test-bidiff/test-enum0-v0.cc.bi \ +data/test-bidiff/test-enum0-v1.cc.bi \ +data/test-bidiff/test-enum0-report.txt \ +data/test-bidiff/test-enum1-v0.cc.bi \ +data/test-bidiff/test-enum1-v1.cc.bi \ +data/test-bidiff/test-enum1-report.txt \ +data/test-bidiff/test-qual-type0-v0.cc.bi \ +data/test-bidiff/test-qual-type0-v1.cc.bi \ +data/test-bidiff/test-qual-type0-report.txt \ +data/test-bidiff/test-struct0-v0.cc.bi \ +data/test-bidiff/test-struct0-v1.cc.bi \ +data/test-bidiff/test-struct0-report.txt \ +data/test-bidiff/test-struct1-v0.cc.bi \ +data/test-bidiff/test-struct1-v1.cc.bi \ +data/test-bidiff/test-struct1-report.txt \ +data/test-bidiff/test-var0-v0.cc.bi \ +data/test-bidiff/test-var0-v1.cc.bi \ +data/test-bidiff/test-var0-report.txt clean-local: clean-local-check .PHONY: clean-local-check diff --git a/tests/data/test-bidiff/test-enum0-report.txt b/tests/data/test-bidiff/test-enum0-report.txt new file mode 100644 index 00000000..aa33379f --- /dev/null +++ b/tests/data/test-bidiff/test-enum0-report.txt @@ -0,0 +1,17 @@ +1 changed type: + 'enum E' changed: + 1 enumerator deletion: + 'E::e2' value '1' + + 1 enumerator insertion: + 'E::e1' value '1' + +1 changed declaration: + 'function void foo(E)' was changed to 'function void foo(E)': + parameter 0 of type 'E' changed: + 1 enumerator deletion: + 'E::e2' value '1' + + 1 enumerator insertion: + 'E::e1' value '1' + diff --git a/tests/data/test-bidiff/test-enum0-v0.cc.bi b/tests/data/test-bidiff/test-enum0-v0.cc.bi new file mode 100644 index 00000000..558593df --- /dev/null +++ b/tests/data/test-bidiff/test-enum0-v0.cc.bi @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/tests/data/test-bidiff/test-enum0-v1.cc.bi b/tests/data/test-bidiff/test-enum0-v1.cc.bi new file mode 100644 index 00000000..b1dd8d49 --- /dev/null +++ b/tests/data/test-bidiff/test-enum0-v1.cc.bi @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/tests/data/test-bidiff/test-enum1-report.txt b/tests/data/test-bidiff/test-enum1-report.txt new file mode 100644 index 00000000..c0e7399c --- /dev/null +++ b/tests/data/test-bidiff/test-enum1-report.txt @@ -0,0 +1,17 @@ +1 changed type: + 'enum E' changed: + 1 enumerator insertion: + 'E::e1' value '1' + + 1 enumerator change: + 'E::e2' from value '1' to '2' + +1 changed declaration: + 'function void foo(E)' was changed to 'function void foo(E)': + parameter 0 of type 'E' changed: + 1 enumerator insertion: + 'E::e1' value '1' + + 1 enumerator change: + 'E::e2' from value '1' to '2' + diff --git a/tests/data/test-bidiff/test-enum1-v0.cc.bi b/tests/data/test-bidiff/test-enum1-v0.cc.bi new file mode 100644 index 00000000..6f0206e7 --- /dev/null +++ b/tests/data/test-bidiff/test-enum1-v0.cc.bi @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/tests/data/test-bidiff/test-enum1-v1.cc.bi b/tests/data/test-bidiff/test-enum1-v1.cc.bi new file mode 100644 index 00000000..ab06c17d --- /dev/null +++ b/tests/data/test-bidiff/test-enum1-v1.cc.bi @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/tests/data/test-bidiff/test-qual-type0-report.txt b/tests/data/test-bidiff/test-qual-type0-report.txt new file mode 100644 index 00000000..db1bd39c --- /dev/null +++ b/tests/data/test-bidiff/test-qual-type0-report.txt @@ -0,0 +1,28 @@ +3 changed types: + 'class S0' changed: + size changed from 32 to 64 bits + 1 data member insertion: + 'char S0::m1', at offset 32 (in bits) + + 'const S0' changed: + in unqualified underlying type 'class S0': + size changed from 32 to 64 bits + 1 data member insertion: + 'char S0::m1', at offset 32 (in bits) + + 'const S0&' changed: + in referenced type 'const S0': + in unqualified underlying type 'class S0': + size changed from 32 to 64 bits + 1 data member insertion: + 'char S0::m1', at offset 32 (in bits) + +1 changed declaration: + 'function void foo(const S0&)' was changed to 'function void foo(const S0&)': + parameter 0 of type 'const S0&' changed: + in referenced type 'const S0': + in unqualified underlying type 'class S0': + size changed from 32 to 64 bits + 1 data member insertion: + 'char S0::m1', at offset 32 (in bits) + diff --git a/tests/data/test-bidiff/test-qual-type0-v0.cc.bi b/tests/data/test-bidiff/test-qual-type0-v0.cc.bi new file mode 100644 index 00000000..e96ed503 --- /dev/null +++ b/tests/data/test-bidiff/test-qual-type0-v0.cc.bi @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/tests/data/test-bidiff/test-qual-type0-v1.cc.bi b/tests/data/test-bidiff/test-qual-type0-v1.cc.bi new file mode 100644 index 00000000..33fb110c --- /dev/null +++ b/tests/data/test-bidiff/test-qual-type0-v1.cc.bi @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/data/test-bidiff/test-struct0-report.txt b/tests/data/test-bidiff/test-struct0-report.txt new file mode 100644 index 00000000..39c570c2 --- /dev/null +++ b/tests/data/test-bidiff/test-struct0-report.txt @@ -0,0 +1,38 @@ +2 changed types: + 'class s0' changed: + size changed from 64 to 96 bits + 1 data member change: + 's0::m1' type changed: + name changed from 'char' to 'unsigned int' + size changed from 8 to 32 bits + alignment changed from 8 to 32 bits + + 1 data member insertion: + 'char s0::m2', at offset 64 (in bits) + + 's0&' changed: + in referenced type 'class s0': + size changed from 64 to 96 bits + 1 data member change: + 's0::m1' type changed: + name changed from 'char' to 'unsigned int' + size changed from 8 to 32 bits + alignment changed from 8 to 32 bits + + 1 data member insertion: + 'char s0::m2', at offset 64 (in bits) + +1 changed declaration: + 'function int foo(s0&)' was changed to 'function int foo(s0&)': + parameter 0 of type 's0&' changed: + in referenced type 'class s0': + size changed from 64 to 96 bits + 1 data member change: + 's0::m1' type changed: + name changed from 'char' to 'unsigned int' + size changed from 8 to 32 bits + alignment changed from 8 to 32 bits + + 1 data member insertion: + 'char s0::m2', at offset 64 (in bits) + diff --git a/tests/data/test-bidiff/test-struct0-v0.cc.bi b/tests/data/test-bidiff/test-struct0-v0.cc.bi new file mode 100644 index 00000000..d9ef77b1 --- /dev/null +++ b/tests/data/test-bidiff/test-struct0-v0.cc.bi @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/data/test-bidiff/test-struct0-v1.cc.bi b/tests/data/test-bidiff/test-struct0-v1.cc.bi new file mode 100644 index 00000000..84e88cd2 --- /dev/null +++ b/tests/data/test-bidiff/test-struct0-v1.cc.bi @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/data/test-bidiff/test-struct1-report.txt b/tests/data/test-bidiff/test-struct1-report.txt new file mode 100644 index 00000000..558865f1 --- /dev/null +++ b/tests/data/test-bidiff/test-struct1-report.txt @@ -0,0 +1,64 @@ +2 changed types: + 'class s0' changed: + size changed from 192 to 256 bits + 1 member type change: + 'typedef s0::number_type' changed: + underlying type changed: + name changed from 'int' to 'char' + size changed from 32 to 8 bits + alignment changed from 32 to 8 bits + + 1 member type insertion: + 'typedef s0::grrr' + + 1 data member deletion: + 'char s0::m1', at offset 96 (in bits) + + 2 data member changes: + 's0::m2' offset changed from 128 to 192 + 's0::m0' type changed: + name changed from 'int' to 'char' + size changed from 32 to 8 bits + alignment changed from 32 to 8 bits + + 1 data member insertion: + 'double s0::m01', at offset 128 (in bits) + + 2 member function insertions: + 'method int s0::foo()' + 'method int s0::foo(int, char) const', virtual at voffset 2/2 + + 's0&' changed: + in referenced type 'class s0': + size changed from 192 to 256 bits + 1 member type change: + 'typedef s0::number_type' changed: + underlying type changed: + name changed from 'int' to 'char' + size changed from 32 to 8 bits + alignment changed from 32 to 8 bits + + 1 member type insertion: + 'typedef s0::grrr' + + 1 data member deletion: + 'char s0::m1', at offset 96 (in bits) + + 2 data member changes: + 's0::m2' offset changed from 128 to 192 + 's0::m0' type changed: + name changed from 'int' to 'char' + size changed from 32 to 8 bits + alignment changed from 32 to 8 bits + + 1 data member insertion: + 'double s0::m01', at offset 128 (in bits) + + 2 member function insertions: + 'method int s0::foo()' + 'method int s0::foo(int, char) const', virtual at voffset 2/2 + + 'function int bar(s0&)' was removed + + 'function int baz(s0&)' was added + diff --git a/tests/data/test-bidiff/test-struct1-v0.cc.bi b/tests/data/test-bidiff/test-struct1-v0.cc.bi new file mode 100644 index 00000000..5a6e7c51 --- /dev/null +++ b/tests/data/test-bidiff/test-struct1-v0.cc.bi @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/data/test-bidiff/test-struct1-v1.cc.bi b/tests/data/test-bidiff/test-struct1-v1.cc.bi new file mode 100644 index 00000000..34540814 --- /dev/null +++ b/tests/data/test-bidiff/test-struct1-v1.cc.bi @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/data/test-bidiff/test-var0-report.txt b/tests/data/test-bidiff/test-var0-report.txt new file mode 100644 index 00000000..fa77a06d --- /dev/null +++ b/tests/data/test-bidiff/test-var0-report.txt @@ -0,0 +1,6 @@ +1 changed declaration: + 'int var' was changed to 'char var': + type of variable changed: + name changed from 'int' to 'char' + size changed from 32 to 8 bits + alignment changed from 32 to 8 bits diff --git a/tests/data/test-bidiff/test-var0-v0.cc.bi b/tests/data/test-bidiff/test-var0-v0.cc.bi new file mode 100644 index 00000000..e40fab8c --- /dev/null +++ b/tests/data/test-bidiff/test-var0-v0.cc.bi @@ -0,0 +1,7 @@ + + + + + + + diff --git a/tests/data/test-bidiff/test-var0-v1.cc.bi b/tests/data/test-bidiff/test-var0-v1.cc.bi new file mode 100644 index 00000000..a2b6c23c --- /dev/null +++ b/tests/data/test-bidiff/test-var0-v1.cc.bi @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/tests/test-bidiff.cc b/tests/test-bidiff.cc new file mode 100644 index 00000000..21138ad3 --- /dev/null +++ b/tests/test-bidiff.cc @@ -0,0 +1,170 @@ +// -*- Mode: C++ -*- +// +// Copyright (C) 2013 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 . + +// Author: Dodji Seketeli + +/// @file +/// +/// This program runs a diff between input files and compares the +/// resulting report with a reference report. If the resulting report +/// is different from the reference report, the test has failed. +/// +/// The set of input files and reference reports to consider should be +/// present in the source distribution. + +#include +#include +#include +#include +#include "abg-tools-utils.h" +#include "test-utils.h" +#include "abg-comparison.h" + +using std::string; +using std::ofstream; +using std::cerr; + +struct InOutSpec +{ + const char* first_in_path; + const char* second_in_path; + const char* ref_diff_path; + const char* out_path; +};// end struct InOutSpec + +static InOutSpec specs[] = +{ + { + "data/test-bidiff/test-enum0-v0.cc.bi", + "data/test-bidiff/test-enum0-v1.cc.bi", + "data/test-bidiff/test-enum0-report.txt", + "output/test-bidiff/test-enum0-report.txt" + }, + { + "data/test-bidiff/test-enum1-v0.cc.bi", + "data/test-bidiff/test-enum1-v1.cc.bi", + "data/test-bidiff/test-enum1-report.txt", + "output/test-bidiff/test-enum1-report.txt" + }, + { + "data/test-bidiff/test-qual-type0-v0.cc.bi", + "data/test-bidiff/test-qual-type0-v1.cc.bi", + "data/test-bidiff/test-qual-type0-report.txt", + "output/test-bidiff/test-qual-type0-report.txt" + }, + { + "data/test-bidiff/test-struct0-v0.cc.bi", + "data/test-bidiff/test-struct0-v1.cc.bi", + "data/test-bidiff/test-struct0-report.txt", + "output/test-bidiff/test-struct0-report.txt" + }, + { + "data/test-bidiff/test-struct1-v0.cc.bi", + "data/test-bidiff/test-struct1-v1.cc.bi", + "data/test-bidiff/test-struct1-report.txt", + "output/test-bidiff/test-struct1-report.txt" + }, + { + "data/test-bidiff/test-var0-v0.cc.bi", + "data/test-bidiff/test-var0-v1.cc.bi", + "data/test-bidiff/test-var0-report.txt", + "output/test-bidiff/test-var0-report.txt" + }, + // This should be the last entry. + {0, 0, 0, 0} +}; + +#define NUM_SPEC_ELEMS \ + ((sizeof(specs) / sizeof(InOutSpec)) - 1) + +using std::string; +using std::cerr; +using std::ofstream; +using abigail::translation_unit; +using abigail::translation_unit_sptr; +using abigail::comparison::translation_unit_diff_sptr; +using abigail::comparison::compute_diff; + +int +main(int, char*[]) +{ + bool is_ok = true; + + string out_path = + abigail::tests::get_build_dir() + "/tests/" + specs->out_path; + if (!abigail::tools::ensure_parent_dir_created(out_path)) + { + cerr << "Could not create parent director for " << out_path; + return 1; + } + + string first_in_path, second_in_path, ref_diff_path; + for (InOutSpec *s = specs; s->first_in_path; ++s) + { + first_in_path = + abigail::tests::get_src_dir() + "/tests/" + s->first_in_path; + second_in_path = + abigail::tests::get_src_dir() + "/tests/" + s->second_in_path; + ref_diff_path = + abigail::tests::get_src_dir() + "/tests/" + s->ref_diff_path; + out_path = + abigail::tests::get_build_dir() + "/tests/" + s->out_path; + + if (!abigail::tools::ensure_parent_dir_created(out_path)) + { + cerr << "Could not create parent director for " << out_path; + continue; + } + + translation_unit_sptr tu1(new translation_unit(first_in_path)); + if (!tu1->read()) + { + cerr << "failed to read " << tu1->get_path() << "\n"; + is_ok = false; + continue; + } + + translation_unit_sptr tu2(new translation_unit(second_in_path)); + if (!tu2->read()) + { + cerr << "failed to read " << tu1->get_path() << "\n"; + is_ok = false; + continue; + } + + translation_unit_diff_sptr d = compute_diff(tu1, tu2); + ofstream of(s->out_path, std::ios_base::trunc); + if (!of.is_open()) + { + cerr << "failed to read " << s->out_path << "\n"; + is_ok = false; + continue; + } + + d->report(of); + of.close(); + + string cmd = "diff -u " + ref_diff_path + " " + out_path; + if (system(cmd.c_str())) + is_ok = false; + } + + return !is_ok; +}