From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mx0b-00069f02.pphosted.com (mx0b-00069f02.pphosted.com [205.220.177.32]) by sourceware.org (Postfix) with ESMTPS id 935C338560AF for ; Thu, 23 Jun 2022 15:19:24 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 935C338560AF Received: from pps.filterd (m0246632.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.17.1.5/8.17.1.5) with ESMTP id 25NE4GJ0021387 for ; Thu, 23 Jun 2022 15:19:24 GMT Received: from iadpaimrmta03.imrmtpd1.prodappiadaev1.oraclevcn.com (iadpaimrmta03.appoci.oracle.com [130.35.103.27]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 3gs6at3fns-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Thu, 23 Jun 2022 15:19:21 +0000 Received: from pps.filterd (iadpaimrmta03.imrmtpd1.prodappiadaev1.oraclevcn.com [127.0.0.1]) by iadpaimrmta03.imrmtpd1.prodappiadaev1.oraclevcn.com (8.16.1.2/8.16.1.2) with SMTP id 25NF6lJd002504 for ; Thu, 23 Jun 2022 15:19:20 GMT Received: from nam11-co1-obe.outbound.protection.outlook.com (mail-co1nam11lp2172.outbound.protection.outlook.com [104.47.56.172]) by iadpaimrmta03.imrmtpd1.prodappiadaev1.oraclevcn.com with ESMTP id 3gtg5wkg08-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Thu, 23 Jun 2022 15:19:18 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=RZgAxuLLI0VtGCsslalbURlzdPNzhk3H/SY8FZ05Rs6C/R0lZVHeEyheP+dDQ66qdmHBrs25s/eUs7HgtZkR7i9upsBkvWmgNx3F0QsNiu+pKSstqUuAiEX930WLpbKOJDJDaqyfMDfCPL30qXn6j2TJyLa6vkvcNCPKTUC8lr8y7LnLRrIsuaOiPDpHkZTGNpzo7gZf3cFvtw1KZWEsWDKJH4E8Ue06DpdRFPVj16W3DVUC4Rwhz5T8BcciZPsTfOk6TGHsoyuRvd7Nnf5FWLsxN+e5OrAt/VssgfMq6VH3ArL1BFbvKc6WyjF/+vwTJaqU84dqQZPxGyIInTTWbw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=qkKSB9nratyeJWYd4jvn0md2nrb6+XNoM0hLpgfiE8k=; b=ZGMniqt000Ufy+lOhMOZnK1Obb+RfIyraV/O6qtH1qxN8S+Muurg+VUqGJgFCP+VrUwrzc4HIwogMBAtgKxGgAdA+kKwnTkWJe1BxED2PdodcZjxtmkAr0CSKPDNHEr5DOmZDvKWf39dl6pCpVMlzvPLC4L3iGyOPnXdEmTT8Vw+lsi5E24RM8eWFYFllY6HBV8leDl7hJ02HWNhJy+TMyhz+bfAgS+yxYEhOQizmwWRYjyfWqIVXQ9nJOyWYWzWtn+mksGqCf8l5pWkvABMsA2k0aiDUnoWgklCv467btIKQE3LRP14P0icBSNkZjrhtN++FjMqHgwF5KMlVj9Mtg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oracle.com; dmarc=pass action=none header.from=oracle.com; dkim=pass header.d=oracle.com; arc=none Received: from MWHPR10MB1407.namprd10.prod.outlook.com (2603:10b6:300:23::20) by BY5PR10MB3937.namprd10.prod.outlook.com (2603:10b6:a03:1fe::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5373.15; Thu, 23 Jun 2022 15:17:34 +0000 Received: from MWHPR10MB1407.namprd10.prod.outlook.com ([fe80::5d6c:93b5:dfd8:c058]) by MWHPR10MB1407.namprd10.prod.outlook.com ([fe80::5d6c:93b5:dfd8:c058%4]) with mapi id 15.20.5373.016; Thu, 23 Jun 2022 15:17:34 +0000 From: "Guillermo E. Martinez" To: libabigail@sourceware.org Subject: [PATCH] Add regression tests for abipkgdiff using ctf info Date: Thu, 23 Jun 2022 10:16:42 -0500 Message-Id: <20220623151642.1904752-1-guillermo.e.martinez@oracle.com> X-Mailer: git-send-email 2.35.1 Content-Transfer-Encoding: 8bit Content-Type: text/plain X-ClientProxiedBy: SN6PR04CA0097.namprd04.prod.outlook.com (2603:10b6:805:f2::38) To MWHPR10MB1407.namprd10.prod.outlook.com (2603:10b6:300:23::20) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 37bc56e3-5ca1-469f-63a8-08da552b6708 X-MS-TrafficTypeDiagnostic: BY5PR10MB3937:EE_ X-Microsoft-Antispam-PRVS: X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?E/mnZpr8myzyGws4I0LI1hezPZ9UHLzMwAWPrImb0v9Wmii0IVW/7Drmx/VA?= =?us-ascii?Q?AkfjyrIw5uL/pXhD9rstikzzww7dXkozzhTKHHJ0DNuURTOTI6LBKQsSJaNa?= =?us-ascii?Q?iz4mhhsZRCfz1mdoxLphmHC95EMr6I8+inw7YtCGPdsofmX1r1OTdibImAyw?= =?us-ascii?Q?NqqzQzTiunD130XuyN2Fy8po3XQJyGeLi50wmguuQK0vCyZUze58oecF54fI?= =?us-ascii?Q?9vgNrho7MVwDJfoQ2w8u2sUY9adUwJQC9hRtRyqe+/HC5ADZiU6G9nFyNBFP?= =?us-ascii?Q?1MEnjKJZ2APzay3qNHc2zIjK+R9WoBWhVKzkv2FT6pyZO8Yj42gtatSss3ME?= =?us-ascii?Q?q417zG/BDyheh/z/auS+6mENcno9udd0qypzHKdCnnDmLUw2viIsTjCAv8pq?= =?us-ascii?Q?HziGVwxFJOrAkD3CM9sqaH9SCTpq3uabH3dO4Dj301Ycmt1XQNSm0/WfEhph?= =?us-ascii?Q?/CW21baD3lAhy6clP1J50TpC5smwcl4cZDwRbiBSTi9FCGDSCkWyDgX/z/mV?= =?us-ascii?Q?i5huOo59GS9iTiui8cGJjyvKQH3gMokoetTVlsgXZoch/0ShB8ePyB19vJ3C?= =?us-ascii?Q?HqMV4Ajh3m6hJNr3LrDZRkSg7+43Igv6/KsmYTdFUN2IDmxoNsoU4uyPRGY2?= =?us-ascii?Q?RT3YDl1DUZPO2r2RjKWh7KVutghhXXqhggEdFwBSuH8bc7MoqqoxepiNrkTK?= =?us-ascii?Q?/pTpN9ZHjLcJJc6/ZDh4sGGhDe1UKNu+NhYjWDyWpqBurvTFIskGhPBfejYr?= =?us-ascii?Q?Cg/FQxsxE7Ur6tCdAfK4tJThflwZQlxcuTS7ajFJ4aDyt7Uyijhm9i118qai?= =?us-ascii?Q?dKKDzVB1YOfzTVdS+2AHOjPNBrSAuLgf8RRN0JhsoUD7TO+BtQSuQVtmmmcy?= =?us-ascii?Q?6KJB+i049SB1EMigJS0+14kv4QkoZpERg/1QnAnLILmW1hrGfr54iRc+kfGi?= =?us-ascii?Q?jR27Q7GcjqujvMb7QS2dBvfeNIybt4gCGTcYp4sz40Z1n5CRqKBpVxpnWbuI?= =?us-ascii?Q?ZOL6SzQls4E/68MiUWBl++9JDFpgIhedAU4JEDpc8Fx+l9vrqvCnK5Kvo7zN?= =?us-ascii?Q?nGmtPqNvIpQMFhd6WOy/1EvuhXne4LHdTFwyf/xnytuNYJStKns=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:5; SRV:; IPV:NLI; SFV:SPM; H:MWHPR10MB1407.namprd10.prod.outlook.com; PTR:; CAT:OSPM; SFS:(13230016)(396003)(346002)(136003)(366004)(39860400002)(376002)(103116003)(6486002)(478600001)(30864003)(8936002)(1076003)(66574015)(6506007)(6512007)(2616005)(26005)(5660300002)(107886003)(52116002)(186003)(4000180100002)(86362001)(83380400001)(574094003)(45080400002)(38350700002)(4326008)(66476007)(8676002)(41300700001)(66556008)(316002)(66946007)(36756003)(2906002)(6666004)(38100700002)(6916009)(327674002)(334514002); DIR:OUT; SFP:1501; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?lC6c4a0sA1TsxgEeQRQ00BK0ObI1qtqgq7G9wyQIs8JfAfM0MK3MsDGRmWkq?= =?us-ascii?Q?A/Tk+5c1keiR8064appovsrAZK19mZl5WZK/0gB3VNeD7QRRhdrOEFTOZPmg?= =?us-ascii?Q?x2N9nxqjy8AON2HFGrUtRZwlg4vfEA9d2Sd8chC0MB6WIFi8C91djzr2to6P?= =?us-ascii?Q?uCbE0ZonAhSt/GdfP7XCxx9ktLhF9uBmx287zhCh6uA3BPHD4fRCxxZFgAU3?= =?us-ascii?Q?c0SgssTNPSG6ES5Zgd3IUVxCdBxGxNI0pXsqEIl3T+UN22r92zbj9krsDdbh?= =?us-ascii?Q?dGVaJg4n/yv30NLc8VOT/C0MWjbltmWHSQPdHw4pVtFoJmKwx7anO6xel6Vb?= =?us-ascii?Q?mWXX6TQ/PckgbvUvIUw5wVf3Q69wHdqJZRLjMGOyTH+yj6/uGQGQWafO/rj9?= =?us-ascii?Q?yk86o3BpfYo4Yw83GN1Yjq+8RZL9HeiID52uGJgyI9w7UL/pKWfBSL9wryud?= =?us-ascii?Q?Gb/0YSoEqOXz7rlNnOP/lVQvKePQWroabm+FerUdDeKwlQXxxI0w4gpg46Ib?= =?us-ascii?Q?eN72jS734gJnB8Qfnn6hhbJ0hcY7exAjrIXfs3kV8PLb3dZ/qGu5WQKjpYMX?= =?us-ascii?Q?tyWMLL83Dk69hEBl2Udz93t/EpKmJMXdTN/QJqY0AdZICJ3exa07cd+59h4Y?= =?us-ascii?Q?0jRG1FGgGjjqPT2FJUOs8aEWzRxG4YphJCXbZFolsfEl/hT7yJZLXZBCLNAK?= =?us-ascii?Q?InhEfm9nka/Ygu3KOBvnquP+FsIcMiPOSVj3MxwsXgUuPQ0ImTkgQhyPB0Ch?= =?us-ascii?Q?Ya+zOB15Qqpu+9meUDnO6ZGfsHuats4woPOibvw1xSv4vEZedBWa/JNmigJB?= =?us-ascii?Q?2qAPA9oFoGAoIsd/L+HqKD5a28pyrmjM87veHwmTHtr/KI3S5nSAXH7lNAYy?= =?us-ascii?Q?Q7zpi+qsW29FwGAp9HbeserypWy8C+R52OVcA151Kj2jQgLQyEA+EdJvIKdr?= =?us-ascii?Q?U9jA2EkB7fE5si1jfoHeWGTNz/ihGM4cT7njouzPS9A/l6wHwW/hRvzQKPcn?= =?us-ascii?Q?0XkuXNkZp2GCBw79xydXgNJ1qb6cHXzqTLkOtFvO+Mr4GJoBU1WgD9OKMSMO?= =?us-ascii?Q?bwxgE7KAlTfiMOlBqcE5ZWp6w8qoMKCOJgMwoBuat/JsHZAtOOLpeCrggtap?= =?us-ascii?Q?MF839fEMoRK7AI2PqECTHWP8PjVWYY24BwuOp8sdiccyBN4sQGCYsUTZbxY3?= =?us-ascii?Q?RTl346ymbYvE2oiCfqAcMAyWqaYKOgNKLszCe3NwkS/Uh5ugbfCqKq9wSELS?= =?us-ascii?Q?KtLvbaGDwPjM3iL5K5Nnprug4nVZsxDvpr/vVL+s9FWfQ8Bm6GY2KRN7RFty?= =?us-ascii?Q?KSWf4eebBaWExFNNXn/8YYofLqvIdtl6Fw8bT5P7K0JzIAgnl5Kd5RV6973K?= =?us-ascii?Q?WVIr08dsws1AgthfshRWlfzovGdAGCzIcPM2knQhIAwG6J6oqkAzxaoDQjnx?= =?us-ascii?Q?ZnObttf8so1ZTZ0SVp003PwspNvSNcEWzxnNh1iiYcmCf5veZ+I7ncBVxp/w?= =?us-ascii?Q?645s3cyTW1KlEAQnnQezdywpfsPADLIrKjNVhr68oxOb1y+ocCmEEid4umWB?= =?us-ascii?Q?X8Z56+vXg/1E30Xk+JjJh1VcVrwqgKox2xKursB6YD6a58nFJ6Uqqv0T6u9p?= =?us-ascii?Q?8888h3koAzI/1f3rvOO+70V9gMbhQJUCl1SMe5p1o0XKq2gv1xXuwPD74A8p?= =?us-ascii?Q?p4Ctn/SI3ywYUen2siSMFljJVJfZswDGmovKNC/hFjUVnDH6sQ3CpJ4gBB4L?= =?us-ascii?Q?EKaMlzd2mL/AMd1MNRahqZnYFMrNNgjbXskpCNNG+rq92fxVSUUQ?= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: 37bc56e3-5ca1-469f-63a8-08da552b6708 X-MS-Exchange-CrossTenant-AuthSource: MWHPR10MB1407.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 23 Jun 2022 15:17:34.3124 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 4e2c6054-71cb-48f1-bd6c-3a9705aca71b X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: IOoZiett5Y/WsgMgGxMjPPLF69flLgT3gLm0Qv3ZhKwny+TjFfy3Wd9st+J4I/cCUvW02rJSxN2UwJnzl3ai37/Fntc+gY1La9u+BDOUuc8= X-MS-Exchange-Transport-CrossTenantHeadersStamped: BY5PR10MB3937 X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.517, 18.0.883 definitions=2022-06-23_06:2022-06-23, 2022-06-23 signatures=0 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 adultscore=0 malwarescore=0 suspectscore=0 bulkscore=0 impostorscore=0 spamscore=0 phishscore=0 classifier=parse_limit adjust=0 reason=mlx scancount=1 engine=8.12.0-2204290000 definitions=main-2206230061 X-Proofpoint-ORIG-GUID: l7zQtX5Jb60AQW5gv0lkMx8Xfc-8cJsQ X-Proofpoint-GUID: l7zQtX5Jb60AQW5gv0lkMx8Xfc-8cJsQ X-Mailman-Approved-At: Tue, 28 Jun 2022 07:58:07 +0000 X-BeenThere: libabigail@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Mailing list of the Libabigail project List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 23 Jun 2022 15:19:33 -0000 Hello libabigail team, This patch is meant to execute the testsuite for abipkgdiff tool using sources with CTF debug info. Comments will be welcomed and appreciated. thanks, guillermo --- This patch implements the regression tests for abipkgdiff tool to help process packages win ctf debug information. Since the code shares lots of functionalities already used with abipkgdiff in comparing packages with dwarf info, a library was built. * tests/Makefile.am: Add new libtestdiffpkgcommon used by runtestdiffpkgctf and runtestdiffpkg tests. * tests/data/Makefile.am: Add test data and expected test files. * tests/data/test-diff-pkg-ctf/cracklib-2.9.6-15-ol8u0.x86_64.rpm: Add new testcase. * tests/data/test-diff-pkg-ctf/cracklib-2.9.6-15-ol8u6.x86_64.rpm: Likewise. * tests/data/test-diff-pkg-ctf/dirpkg-*: Likewise. * tests/data/test-diff-pkg-ctf/elfutils-libelf-0.186-{1,2}.x86_64.rpm: Likewise. * tests/data/test-diff-pkg-ctf/gmp-6.*.2-8-ol8u0.x86_64.rpm: Likewise. * tests/data/test-diff-pkg-ctf/isl-0.16.1-{6,7}.x86_64.rpm: Likewise. * tests/data/test-diff-pkg-ctf/isl-debuginfo-0.16.1-{6,7}.x86_64.rpm: Likewise. * tests/data/test-diff-pkg-ctf/libdwarf-20180129-{4,5}-no-ctf.x86_64.rpm: Likewise. * tests/data/test-diff-pkg-ctf/libdwarf-20180129-{4,5}.x86_64.rpm: Likewise. * tests/data/test-diff-pkg-ctf/symlink-dir-test1/*: Likewise. * tests/data/test-diff-pkg-ctf/tarpkg-*: Likewise. * tests/test-diff-pkg-common.h: Add common test functionality for test-diff-pkg{.-ctf}.cc. * tests/test-diff-pkg-ctf.cc: Testsuite for abipkgdiff --ctf. * tests/test-diff-pkg.cc: Adjust testsuite to use helper classes defined in test-diff-pkg-common.h. * tests/data/test-diff-pkg-ctf/test-*-report-*.txt: Expected testcases results. Signed-off-by: Guillermo E. Martinez --- tests/Makefile.am | 20 +- tests/data/Makefile.am | 78 ++++ .../cracklib-2.9.6-15-ol8.x86_64-report-0.txt | 10 + .../cracklib-2.9.6-15-ol8u0.x86_64.rpm | Bin 0 -> 100854 bytes .../cracklib-2.9.6-15-ol8u6.x86_64.rpm | Bin 0 -> 100854 bytes .../dirpkg-0-dir1/dir.abignore | 4 + .../dirpkg-0-dir1/libobj-v0.so | Bin 0 -> 15520 bytes .../test-diff-pkg-ctf/dirpkg-0-dir1/obj-v0.c | 11 + .../dirpkg-0-dir2/libobj-v0.so | Bin 0 -> 15560 bytes .../test-diff-pkg-ctf/dirpkg-0-dir2/obj-v0.c | 12 + .../test-diff-pkg-ctf/dirpkg-0-report-0.txt | 0 .../dirpkg-1-dir1/libobj-v0.so | Bin 0 -> 15520 bytes .../test-diff-pkg-ctf/dirpkg-1-dir1/obj-v0.c | 11 + .../dirpkg-1-dir2/dir.abignore | 4 + .../dirpkg-1-dir2/libobj-v0.so | Bin 0 -> 15560 bytes .../test-diff-pkg-ctf/dirpkg-1-dir2/obj-v0.c | 12 + .../test-diff-pkg-ctf/dirpkg-1-report-0.txt | 0 .../test-diff-pkg-ctf/dirpkg-1-report-1.txt | 15 + .../dirpkg-2-dir1/libobj-v0.so | Bin 0 -> 15600 bytes .../test-diff-pkg-ctf/dirpkg-2-dir1/obj-v0.c | 19 + .../test-diff-pkg-ctf/dirpkg-2-dir2/.abignore | 2 + .../dirpkg-2-dir2/dir.abignore | 2 + .../dirpkg-2-dir2/libobj-v0.so | Bin 0 -> 15656 bytes .../test-diff-pkg-ctf/dirpkg-2-dir2/obj-v0.c | 21 + .../test-diff-pkg-ctf/dirpkg-2-report-0.txt | 0 .../dirpkg-3-dir1/libobj-v0.so | Bin 0 -> 15600 bytes .../test-diff-pkg-ctf/dirpkg-3-dir1/obj-v0.c | 19 + .../test-diff-pkg-ctf/dirpkg-3-dir2/.abignore | 2 + .../dirpkg-3-dir2/libobj-v0.so | Bin 0 -> 15656 bytes .../test-diff-pkg-ctf/dirpkg-3-dir2/obj-v0.c | 21 + .../test-diff-pkg-ctf/dirpkg-3-report-0.txt | 0 .../test-diff-pkg-ctf/dirpkg-3-report-1.txt | 16 + .../test-diff-pkg-ctf/dirpkg-3-report-2.txt | 0 tests/data/test-diff-pkg-ctf/dirpkg-3.suppr | 2 + .../elfutils-libelf-0.186-1.x86_64.rpm | Bin 0 -> 384365 bytes .../elfutils-libelf-0.186-2.x86_64.rpm | Bin 0 -> 384437 bytes .../elfutils-libelf-0.186-report-0.txt | 0 .../elfutils-libelf-0.186-report-1.txt | 10 + .../gmp-6.1.2-8-ol8u0.x86_64.rpm | Bin 0 -> 349632 bytes .../gmp-6.2.0-10-ol9u0.x86_64.rpm | Bin 0 -> 370863 bytes .../gmp-6.x.x86_64-report-0.txt | 176 +++++++ .../test-diff-pkg-ctf/isl-0.16.1-6.x86_64.rpm | Bin 0 -> 1183693 bytes .../test-diff-pkg-ctf/isl-0.16.1-7.x86_64.rpm | Bin 0 -> 1183717 bytes .../test-diff-pkg-ctf/isl-0.16.1-report-0.txt | 10 + .../isl-debuginfo-0.16.1-6.x86_64.rpm | Bin 0 -> 252918 bytes .../isl-debuginfo-0.16.1-7.x86_64.rpm | Bin 0 -> 252929 bytes .../libdwarf-20180129-4-no-ctf.x86_64.rpm | Bin 0 -> 218575 bytes .../libdwarf-20180129-4.x86_64.rpm | Bin 0 -> 233283 bytes .../libdwarf-20180129-5-no-ctf.x86_64.rpm | Bin 0 -> 218627 bytes .../libdwarf-20180129-5.x86_64.rpm | Bin 0 -> 233330 bytes .../symlink-dir-test1-report0.txt | 15 + .../symlink-dir-test1/dir1/symlinks/foo.o | 1 + .../symlink-dir-test1/dir1/symlinks/libfoo.so | 1 + .../symlink-dir-test1/dir1/targets/foo.c | 10 + .../symlink-dir-test1/dir1/targets/foo.o | Bin 0 -> 3248 bytes .../symlink-dir-test1/dir1/targets/libfoo.so | Bin 0 -> 16552 bytes .../symlink-dir-test1/dir2/symlinks/foo.o | 1 + .../symlink-dir-test1/dir2/symlinks/libfoo.so | 1 + .../symlink-dir-test1/dir2/targets/foo.c | 11 + .../symlink-dir-test1/dir2/targets/foo.o | Bin 0 -> 3328 bytes .../symlink-dir-test1/dir2/targets/libfoo.so | Bin 0 -> 16616 bytes tests/data/test-diff-pkg-ctf/tarpkg-0-dir1.ta | Bin 0 -> 20480 bytes .../data/test-diff-pkg-ctf/tarpkg-0-dir1.tar | Bin 0 -> 20480 bytes .../test-diff-pkg-ctf/tarpkg-0-dir1.tar.bz2 | Bin 0 -> 2194 bytes .../test-diff-pkg-ctf/tarpkg-0-dir1.tar.gz | Bin 0 -> 2151 bytes tests/data/test-diff-pkg-ctf/tarpkg-0-dir2.ta | Bin 0 -> 20480 bytes .../data/test-diff-pkg-ctf/tarpkg-0-dir2.tar | Bin 0 -> 20480 bytes .../test-diff-pkg-ctf/tarpkg-0-dir2.tar.bz2 | Bin 0 -> 2226 bytes .../test-diff-pkg-ctf/tarpkg-0-dir2.tar.gz | Bin 0 -> 2180 bytes .../test-diff-pkg-ctf/tarpkg-0-report-0.txt | 15 + .../test-diff-pkg-ctf/tarpkg-1-dir1.tar.gz | Bin 0 -> 2139 bytes .../test-diff-pkg-ctf/tarpkg-1-dir2.tar.gz | Bin 0 -> 2283 bytes .../test-diff-pkg-ctf/tarpkg-1-report-0.txt | 0 .../test-diff-pkg-ctf/test-rpm-report-0.txt | 10 + .../test-diff-pkg-ctf/test-rpm-report-1.txt | 12 + .../test-diff-pkg-ctf/test-rpm-report-2.txt | 12 + .../test-diff-pkg-ctf/test-rpm-report-3.txt | 12 + .../test-diff-pkg-ctf/test-rpm-report-4.txt | 0 .../test-diff-pkg-ctf/test-rpm-report-5.txt | 0 tests/test-diff-pkg-common.h | 241 ++++++++++ tests/test-diff-pkg-ctf.cc | 430 ++++++++++++++++++ tests/test-diff-pkg.cc | 197 +------- 82 files changed, 1270 insertions(+), 176 deletions(-) create mode 100644 tests/data/test-diff-pkg-ctf/cracklib-2.9.6-15-ol8.x86_64-report-0.txt create mode 100644 tests/data/test-diff-pkg-ctf/cracklib-2.9.6-15-ol8u0.x86_64.rpm create mode 100644 tests/data/test-diff-pkg-ctf/cracklib-2.9.6-15-ol8u6.x86_64.rpm create mode 100644 tests/data/test-diff-pkg-ctf/dirpkg-0-dir1/dir.abignore create mode 100755 tests/data/test-diff-pkg-ctf/dirpkg-0-dir1/libobj-v0.so create mode 100644 tests/data/test-diff-pkg-ctf/dirpkg-0-dir1/obj-v0.c create mode 100755 tests/data/test-diff-pkg-ctf/dirpkg-0-dir2/libobj-v0.so create mode 100644 tests/data/test-diff-pkg-ctf/dirpkg-0-dir2/obj-v0.c create mode 100644 tests/data/test-diff-pkg-ctf/dirpkg-0-report-0.txt create mode 100755 tests/data/test-diff-pkg-ctf/dirpkg-1-dir1/libobj-v0.so create mode 100644 tests/data/test-diff-pkg-ctf/dirpkg-1-dir1/obj-v0.c create mode 100644 tests/data/test-diff-pkg-ctf/dirpkg-1-dir2/dir.abignore create mode 100755 tests/data/test-diff-pkg-ctf/dirpkg-1-dir2/libobj-v0.so create mode 100644 tests/data/test-diff-pkg-ctf/dirpkg-1-dir2/obj-v0.c create mode 100644 tests/data/test-diff-pkg-ctf/dirpkg-1-report-0.txt create mode 100644 tests/data/test-diff-pkg-ctf/dirpkg-1-report-1.txt create mode 100755 tests/data/test-diff-pkg-ctf/dirpkg-2-dir1/libobj-v0.so create mode 100644 tests/data/test-diff-pkg-ctf/dirpkg-2-dir1/obj-v0.c create mode 100644 tests/data/test-diff-pkg-ctf/dirpkg-2-dir2/.abignore create mode 100644 tests/data/test-diff-pkg-ctf/dirpkg-2-dir2/dir.abignore create mode 100755 tests/data/test-diff-pkg-ctf/dirpkg-2-dir2/libobj-v0.so create mode 100644 tests/data/test-diff-pkg-ctf/dirpkg-2-dir2/obj-v0.c create mode 100644 tests/data/test-diff-pkg-ctf/dirpkg-2-report-0.txt create mode 100755 tests/data/test-diff-pkg-ctf/dirpkg-3-dir1/libobj-v0.so create mode 100644 tests/data/test-diff-pkg-ctf/dirpkg-3-dir1/obj-v0.c create mode 100644 tests/data/test-diff-pkg-ctf/dirpkg-3-dir2/.abignore create mode 100755 tests/data/test-diff-pkg-ctf/dirpkg-3-dir2/libobj-v0.so create mode 100644 tests/data/test-diff-pkg-ctf/dirpkg-3-dir2/obj-v0.c create mode 100644 tests/data/test-diff-pkg-ctf/dirpkg-3-report-0.txt create mode 100644 tests/data/test-diff-pkg-ctf/dirpkg-3-report-1.txt create mode 100644 tests/data/test-diff-pkg-ctf/dirpkg-3-report-2.txt create mode 100644 tests/data/test-diff-pkg-ctf/dirpkg-3.suppr create mode 100644 tests/data/test-diff-pkg-ctf/elfutils-libelf-0.186-1.x86_64.rpm create mode 100644 tests/data/test-diff-pkg-ctf/elfutils-libelf-0.186-2.x86_64.rpm create mode 100644 tests/data/test-diff-pkg-ctf/elfutils-libelf-0.186-report-0.txt create mode 100644 tests/data/test-diff-pkg-ctf/elfutils-libelf-0.186-report-1.txt create mode 100644 tests/data/test-diff-pkg-ctf/gmp-6.1.2-8-ol8u0.x86_64.rpm create mode 100644 tests/data/test-diff-pkg-ctf/gmp-6.2.0-10-ol9u0.x86_64.rpm create mode 100644 tests/data/test-diff-pkg-ctf/gmp-6.x.x86_64-report-0.txt create mode 100644 tests/data/test-diff-pkg-ctf/isl-0.16.1-6.x86_64.rpm create mode 100644 tests/data/test-diff-pkg-ctf/isl-0.16.1-7.x86_64.rpm create mode 100644 tests/data/test-diff-pkg-ctf/isl-0.16.1-report-0.txt create mode 100644 tests/data/test-diff-pkg-ctf/isl-debuginfo-0.16.1-6.x86_64.rpm create mode 100644 tests/data/test-diff-pkg-ctf/isl-debuginfo-0.16.1-7.x86_64.rpm create mode 100644 tests/data/test-diff-pkg-ctf/libdwarf-20180129-4-no-ctf.x86_64.rpm create mode 100644 tests/data/test-diff-pkg-ctf/libdwarf-20180129-4.x86_64.rpm create mode 100644 tests/data/test-diff-pkg-ctf/libdwarf-20180129-5-no-ctf.x86_64.rpm create mode 100644 tests/data/test-diff-pkg-ctf/libdwarf-20180129-5.x86_64.rpm create mode 100644 tests/data/test-diff-pkg-ctf/symlink-dir-test1-report0.txt create mode 120000 tests/data/test-diff-pkg-ctf/symlink-dir-test1/dir1/symlinks/foo.o create mode 120000 tests/data/test-diff-pkg-ctf/symlink-dir-test1/dir1/symlinks/libfoo.so create mode 100644 tests/data/test-diff-pkg-ctf/symlink-dir-test1/dir1/targets/foo.c create mode 100644 tests/data/test-diff-pkg-ctf/symlink-dir-test1/dir1/targets/foo.o create mode 100755 tests/data/test-diff-pkg-ctf/symlink-dir-test1/dir1/targets/libfoo.so create mode 120000 tests/data/test-diff-pkg-ctf/symlink-dir-test1/dir2/symlinks/foo.o create mode 120000 tests/data/test-diff-pkg-ctf/symlink-dir-test1/dir2/symlinks/libfoo.so create mode 100644 tests/data/test-diff-pkg-ctf/symlink-dir-test1/dir2/targets/foo.c create mode 100644 tests/data/test-diff-pkg-ctf/symlink-dir-test1/dir2/targets/foo.o create mode 100755 tests/data/test-diff-pkg-ctf/symlink-dir-test1/dir2/targets/libfoo.so create mode 100644 tests/data/test-diff-pkg-ctf/tarpkg-0-dir1.ta create mode 100644 tests/data/test-diff-pkg-ctf/tarpkg-0-dir1.tar create mode 100644 tests/data/test-diff-pkg-ctf/tarpkg-0-dir1.tar.bz2 create mode 100644 tests/data/test-diff-pkg-ctf/tarpkg-0-dir1.tar.gz create mode 100644 tests/data/test-diff-pkg-ctf/tarpkg-0-dir2.ta create mode 100644 tests/data/test-diff-pkg-ctf/tarpkg-0-dir2.tar create mode 100644 tests/data/test-diff-pkg-ctf/tarpkg-0-dir2.tar.bz2 create mode 100644 tests/data/test-diff-pkg-ctf/tarpkg-0-dir2.tar.gz create mode 100644 tests/data/test-diff-pkg-ctf/tarpkg-0-report-0.txt create mode 100644 tests/data/test-diff-pkg-ctf/tarpkg-1-dir1.tar.gz create mode 100644 tests/data/test-diff-pkg-ctf/tarpkg-1-dir2.tar.gz create mode 100644 tests/data/test-diff-pkg-ctf/tarpkg-1-report-0.txt create mode 100644 tests/data/test-diff-pkg-ctf/test-rpm-report-0.txt create mode 100644 tests/data/test-diff-pkg-ctf/test-rpm-report-1.txt create mode 100644 tests/data/test-diff-pkg-ctf/test-rpm-report-2.txt create mode 100644 tests/data/test-diff-pkg-ctf/test-rpm-report-3.txt create mode 100644 tests/data/test-diff-pkg-ctf/test-rpm-report-4.txt create mode 100644 tests/data/test-diff-pkg-ctf/test-rpm-report-5.txt create mode 100644 tests/test-diff-pkg-common.h create mode 100644 tests/test-diff-pkg-ctf.cc diff --git a/tests/Makefile.am b/tests/Makefile.am index 7c515d35..15bdeaab 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -27,7 +27,8 @@ runtestreaddwarf \ runtestcanonicalizetypes.sh if CTF_READER -TESTS += runtestreadctf +TESTS += runtestreadctf \ + runtestdiffpkgctf endif # rather cheap tests @@ -76,7 +77,8 @@ runtestcanonicalizetypes.output.final.txt noinst_PROGRAMS= $(TESTS) testirwalker testdiff2 printdifftree noinst_SCRIPTS = mockfedabipkgdiff -noinst_LTLIBRARIES = libtestutils.la libtestreadcommon.la libcatch.la +noinst_LTLIBRARIES = libtestutils.la libtestreadcommon.la libcatch.la \ + libtestdiffpkgcommon.la libtestutils_la_SOURCES= \ test-utils.h \ @@ -94,6 +96,11 @@ libtestreadcommon_la_CXXFLAGS= \ -DABIGAIL_SRC_DIR=\"${abs_top_srcdir}\" \ -DABIGAIL_BUILD_DIR=\"${abs_top_builddir}\" +libtestdiffpkgcommon_la_SOURCES = test-diff-pkg-common.h +libtestdiffpkgcommon_la_CXXFLAGS= \ +-DABIGAIL_SRC_DIR=\"${abs_top_srcdir}\" \ +-DABIGAIL_BUILD_DIR=\"${abs_top_builddir}\" + libcatch_la_SOURCES = lib/catch.cc lib/catch.hpp runtestreadwrite_SOURCES=test-read-write.cc @@ -145,7 +152,14 @@ runtestabicompat_SOURCES = test-abicompat.cc runtestabicompat_LDADD = libtestutils.la $(top_builddir)/src/libabigail.la runtestdiffpkg_SOURCES = test-diff-pkg.cc -runtestdiffpkg_LDADD = libtestutils.la $(top_builddir)/src/libabigail.la +runtestdiffpkg_LDADD = libtestutils.la libtestdiffpkgcommon.la \ + $(top_builddir)/src/libabigail.la + +if CTF_READER +runtestdiffpkgctf_SOURCES = test-diff-pkg-ctf.cc +runtestdiffpkgctf_LDADD = libtestutils.la libtestdiffpkgcommon.la \ + $(top_builddir)/src/libabigail.la +endif runtesttypesstability_SOURCES = test-types-stability.cc runtesttypesstability_LDADD = libtestutils.la $(top_builddir)/src/libabigail.la diff --git a/tests/data/Makefile.am b/tests/data/Makefile.am index 9300c854..f0e0387c 100644 --- a/tests/data/Makefile.am +++ b/tests/data/Makefile.am @@ -2008,6 +2008,84 @@ test-diff-pkg/wireshark/wireshark-cli-3.4.9-1.fc36.x86_64.rpm \ test-diff-pkg/wireshark/wireshark-cli-debuginfo-3.4.9-1.fc36.x86_64.rpm \ test-diff-pkg/wireshark/wireshark-debuginfo-3.4.9-1.fc36.x86_64.rpm \ \ +test-diff-pkg-ctf/tarpkg-0-dir1.tar \ +test-diff-pkg-ctf/dirpkg-0-report-0.txt \ +test-diff-pkg-ctf/isl-debuginfo-0.16.1-7.x86_64.rpm \ +test-diff-pkg-ctf/tarpkg-1-report-0.txt \ +test-diff-pkg-ctf/elfutils-libelf-0.186-1.x86_64.rpm \ +test-diff-pkg-ctf/tarpkg-0-dir2.ta \ +test-diff-pkg-ctf/elfutils-libelf-0.186-report-0.txt \ +test-diff-pkg-ctf/gmp-6.2.0-10-ol9u0.x86_64.rpm \ +test-diff-pkg-ctf/dirpkg-3-dir1/obj-v0.c \ +test-diff-pkg-ctf/dirpkg-3-dir1/libobj-v0.so \ +test-diff-pkg-ctf/isl-0.16.1-report-0.txt \ +test-diff-pkg-ctf/tarpkg-0-dir2.tar.gz \ +test-diff-pkg-ctf/test-rpm-report-2.txt \ +test-diff-pkg-ctf/dirpkg-3-report-2.txt \ +test-diff-pkg-ctf/libdwarf-20180129-5.x86_64.rpm \ +test-diff-pkg-ctf/test-rpm-report-3.txt \ +test-diff-pkg-ctf/test-rpm-report-1.txt \ +test-diff-pkg-ctf/tarpkg-0-report-0.txt \ +test-diff-pkg-ctf/libdwarf-20180129-4-no-ctf.x86_64.rpm \ +test-diff-pkg-ctf/tarpkg-0-dir1.tar.gz \ +test-diff-pkg-ctf/dirpkg-2-report-0.txt \ +test-diff-pkg-ctf/dirpkg-1-report-1.txt \ +test-diff-pkg-ctf/cracklib-2.9.6-15-ol8.x86_64-report-0.txt \ +test-diff-pkg-ctf/dirpkg-1-report-0.txt \ +test-diff-pkg-ctf/elfutils-libelf-0.186-2.x86_64.rpm \ +test-diff-pkg-ctf/elfutils-libelf-0.186-report-1.txt \ +test-diff-pkg-ctf/gmp-6.x.x86_64-report-0.txt \ +test-diff-pkg-ctf/dirpkg-0-dir2/obj-v0.c \ +test-diff-pkg-ctf/dirpkg-0-dir2/libobj-v0.so \ +test-diff-pkg-ctf/test-rpm-report-5.txt \ +test-diff-pkg-ctf/tarpkg-1-dir2.tar.gz \ +test-diff-pkg-ctf/libdwarf-20180129-5-no-ctf.x86_64.rpm \ +test-diff-pkg-ctf/libdwarf-20180129-4.x86_64.rpm \ +test-diff-pkg-ctf/test-rpm-report-0.txt \ +test-diff-pkg-ctf/tarpkg-0-dir2.tar \ +test-diff-pkg-ctf/isl-0.16.1-6.x86_64.rpm \ +test-diff-pkg-ctf/dirpkg-1-dir2/dir.abignore \ +test-diff-pkg-ctf/dirpkg-1-dir2/obj-v0.c \ +test-diff-pkg-ctf/dirpkg-1-dir2/libobj-v0.so \ +test-diff-pkg-ctf/dirpkg-3-dir2/obj-v0.c \ +test-diff-pkg-ctf/dirpkg-3-dir2/.abignore \ +test-diff-pkg-ctf/dirpkg-3-dir2/libobj-v0.so \ +test-diff-pkg-ctf/test-rpm-report-4.txt \ +test-diff-pkg-ctf/dirpkg-2-dir1/obj-v0.c \ +test-diff-pkg-ctf/dirpkg-2-dir1/libobj-v0.so \ +test-diff-pkg-ctf/dirpkg-3-report-1.txt \ +test-diff-pkg-ctf/tarpkg-0-dir2.tar.bz2 \ +test-diff-pkg-ctf/gmp-6.1.2-8-ol8u0.x86_64.rpm \ +test-diff-pkg-ctf/dirpkg-2-dir2/dir.abignore \ +test-diff-pkg-ctf/dirpkg-2-dir2/obj-v0.c \ +test-diff-pkg-ctf/dirpkg-2-dir2/.abignore \ +test-diff-pkg-ctf/dirpkg-2-dir2/libobj-v0.so \ +test-diff-pkg-ctf/cracklib-2.9.6-15-ol8u6.x86_64.rpm \ +test-diff-pkg-ctf/isl-0.16.1-7.x86_64.rpm \ +test-diff-pkg-ctf/tarpkg-0-dir1.ta \ +test-diff-pkg-ctf/dirpkg-3.suppr \ +test-diff-pkg-ctf/dirpkg-1-dir1/obj-v0.c \ +test-diff-pkg-ctf/dirpkg-1-dir1/libobj-v0.so \ +test-diff-pkg-ctf/tarpkg-0-dir1.tar.bz2 \ +test-diff-pkg-ctf/dirpkg-3-report-0.txt \ +test-diff-pkg-ctf/dirpkg-0-dir1/dir.abignore \ +test-diff-pkg-ctf/dirpkg-0-dir1/obj-v0.c \ +test-diff-pkg-ctf/dirpkg-0-dir1/libobj-v0.so \ +test-diff-pkg-ctf/symlink-dir-test1/dir1/targets/libfoo.so \ +test-diff-pkg-ctf/symlink-dir-test1/dir1/targets/foo.c \ +test-diff-pkg-ctf/symlink-dir-test1/dir1/targets/foo.o \ +test-diff-pkg-ctf/symlink-dir-test1/dir1/symlinks/libfoo.so \ +test-diff-pkg-ctf/symlink-dir-test1/dir1/symlinks/foo.o \ +test-diff-pkg-ctf/symlink-dir-test1/dir2/targets/libfoo.so \ +test-diff-pkg-ctf/symlink-dir-test1/dir2/targets/foo.c \ +test-diff-pkg-ctf/symlink-dir-test1/dir2/targets/foo.o \ +test-diff-pkg-ctf/symlink-dir-test1/dir2/symlinks/libfoo.so \ +test-diff-pkg-ctf/symlink-dir-test1/dir2/symlinks/foo.o \ +test-diff-pkg-ctf/cracklib-2.9.6-15-ol8u0.x86_64.rpm \ +test-diff-pkg-ctf/isl-debuginfo-0.16.1-6.x86_64.rpm \ +test-diff-pkg-ctf/tarpkg-1-dir1.tar.gz \ +test-diff-pkg-ctf/symlink-dir-test1-report0.txt \ +\ test-fedabipkgdiff/dbus-glib-0.104-3.fc23.x86_64.rpm \ test-fedabipkgdiff/dbus-glib-debuginfo-0.104-3.fc23.x86_64.rpm \ test-fedabipkgdiff/dbus-glib-0.80-3.fc12.x86_64.rpm \ diff --git a/tests/data/test-diff-pkg-ctf/cracklib-2.9.6-15-ol8.x86_64-report-0.txt b/tests/data/test-diff-pkg-ctf/cracklib-2.9.6-15-ol8.x86_64-report-0.txt new file mode 100644 index 00000000..2113a646 --- /dev/null +++ b/tests/data/test-diff-pkg-ctf/cracklib-2.9.6-15-ol8.x86_64-report-0.txt @@ -0,0 +1,10 @@ +================ changes of 'libcrack.so.2.9.0'=============== + Functions changes summary: 1 Removed, 0 Changed, 0 Added function + Variables changes summary: 0 Removed, 0 Changed, 0 Added variable + + 1 Removed function: + + [D] 'function char* LowercaseWrapper(char*, char*)' {LowercaseWrapper} + +================ end of changes of 'libcrack.so.2.9.0'=============== + diff --git a/tests/data/test-diff-pkg-ctf/cracklib-2.9.6-15-ol8u0.x86_64.rpm b/tests/data/test-diff-pkg-ctf/cracklib-2.9.6-15-ol8u0.x86_64.rpm new file mode 100644 index 0000000000000000000000000000000000000000..95a19aaca342bcb4989ce55ddc954e5ed30adeec GIT binary patch literal 100854 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