From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mx0a-00069f02.pphosted.com (mx0a-00069f02.pphosted.com [205.220.165.32]) by sourceware.org (Postfix) with ESMTPS id E61073858292 for ; Tue, 5 Jul 2022 01:03:24 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org E61073858292 Received: from pps.filterd (m0246629.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.17.1.5/8.17.1.5) with ESMTP id 264M4iFG004824 for ; Tue, 5 Jul 2022 01:03:23 GMT Received: from iadpaimrmta02.imrmtpd1.prodappiadaev1.oraclevcn.com (iadpaimrmta02.appoci.oracle.com [147.154.18.20]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 3h2dwamb3q-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Tue, 05 Jul 2022 01:03:18 +0000 Received: from pps.filterd (iadpaimrmta02.imrmtpd1.prodappiadaev1.oraclevcn.com [127.0.0.1]) by iadpaimrmta02.imrmtpd1.prodappiadaev1.oraclevcn.com (8.16.1.2/8.16.1.2) with SMTP id 26510s7Z010244 for ; Tue, 5 Jul 2022 01:03:17 GMT Received: from nam11-bn8-obe.outbound.protection.outlook.com (mail-bn8nam11lp2169.outbound.protection.outlook.com [104.47.58.169]) by iadpaimrmta02.imrmtpd1.prodappiadaev1.oraclevcn.com with ESMTP id 3h32mhu919-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Tue, 05 Jul 2022 01:03:16 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=TJwqZeDmVFVlYjNiRf9184EeaMuyKJzwQ9Lbr8UcfLW9Q0CePQ7ozEWEd9JeEeIyRXM1G+EVApmc4nS/CoytaerhRXZXKKbSVR+3BIYjSpQCDoyAoQpNARuvOcbEwXo899eaZGCN3DVbPIJ4jfaXYp7YSWYwTTbTjWZ0rhbrlipInl51U2fZnKg+A7Rb9ldSgx57VxLIqrQ7w+00p2V8TD0w0XWh3+19qbNRU1h7tS2ayuW798v0PnWmvpfjLIQSb7MyF980Ra3aAV00bAuHwRDbqn0qBwbQnvd2JoKIXWgCa4GsKq6if1GNp+SpAvSpxkrtYiCk6167xlKvgEkjYA== 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=AwyUktKwZNCleabbBWtM19t+3KyFvNtXiCV4t/9C7Ts=; b=kV4z5JtP/sR2IhA6UjlWsMGwJSHFKQnhV16Rjglf0LVBI2XrTYGQqwUg63TrDOBNo+1cB6CEV5UL7NYj4TyAxIiDQ9Ol8/eNoozKor6KSWvkq4o6SB6nxFvPqaOKIXDxzyW5XDqSCEZurIdHC4U24M17Rn74ZUxEgAiPJ1hTvNwR0Fh8n4tlDwS+knPf8tSqz+kQ/PPH4vCR782cDTpnxdEYvZ+RQEnRjiSnMn21j7jwWkxgSMR4BHN/mShu2UEuKLAs9G4opHX+6tqjDt/HknOAW+fc5z8eMhZfWhXY2kuTPzTIz/FzTiJlpDYtl4cUkHC+e7rfFw7dK6WvwV0+ow== 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 CY4PR10MB1974.namprd10.prod.outlook.com (2603:10b6:903:128::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5395.18; Tue, 5 Jul 2022 01:01:40 +0000 Received: from MWHPR10MB1407.namprd10.prod.outlook.com ([fe80::40f0:f59d:aca7:92ea]) by MWHPR10MB1407.namprd10.prod.outlook.com ([fe80::40f0:f59d:aca7:92ea%3]) with mapi id 15.20.5395.021; Tue, 5 Jul 2022 01:01:39 +0000 From: "Guillermo E. Martinez" To: libabigail@sourceware.org Subject: [PATCH v2] Add regression tests for abipkgdiff using ctf info Date: Mon, 4 Jul 2022 20:00:22 -0500 Message-Id: <20220705010023.349341-1-guillermo.e.martinez@oracle.com> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220623151642.1904752-1-guillermo.e.martinez@oracle.com> References: <20220623151642.1904752-1-guillermo.e.martinez@oracle.com> Content-Transfer-Encoding: 8bit Content-Type: text/plain X-ClientProxiedBy: SN4PR0701CA0043.namprd07.prod.outlook.com (2603:10b6:803:2d::11) 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: 137516e8-b59f-4dd8-90bf-08da5e21c768 X-MS-TrafficTypeDiagnostic: CY4PR10MB1974:EE_ X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?X1TIxYM7K17niLAyA48E8/O9dlyh5/O2/FPDPYA1IxcNj5wL9vrNeRj13jWb?= =?us-ascii?Q?032Fkr8A29bMCdSJQo6JafkKdh3LpOCGBel+Vd1lte8eSGtYCGipFCAz9e9r?= =?us-ascii?Q?Nm4vxks/X3YOkLDNXah4SRy1tK8TayB3pEpZRMsoIBuOYc0sZt2/+zRcYIOi?= =?us-ascii?Q?1AlOqDN7nwZret8Ooyw9h6QQGpRfayUfXuLVV8n499Yle63K4TQULEX7NW9f?= =?us-ascii?Q?XGp+RXouX/VAeWLNpWpRAgkDaTcNNJ6XFZ2xdzH9VOnDOIqGkUBO6FAIYUzm?= =?us-ascii?Q?Fo0/gjrUa9bst4enV7n1XZydl+hfuNwIeDE72haXo1ivVJfeN+wv34n4gvFg?= =?us-ascii?Q?+mUJEN86Go7k66R8oHZwZUSb/gpJknWY+E/cXzdVJf/HtxhHjl4MebznfANu?= =?us-ascii?Q?9IIyKfZo3y43AJT8AsYzxCLQlPRHzwWNxYeJyd8wDx9+pBz+ZpuJgZ5DPL+P?= =?us-ascii?Q?GbbiF7T9r4Gu3SvxukXoimW8eh2CcZQiMbe/HifVpeD+4Mv6F1Ff4xTvpCZB?= =?us-ascii?Q?fR79HWAji4peHIqcAkX9r6us7yAnLLAiU3t1UNc0c2WpXmQrHOw/j3BwVVX/?= =?us-ascii?Q?7xtz90OqBKfWC/qnljtxHFDnneSyHuIqHNJe59LbCF1LRSOcIR+sQoYTv50a?= =?us-ascii?Q?QtZtaxAueiPkqblGY0obTyu+96T0ASN97vbRfBUL8PlTqS1bMQZCV+LSi8qz?= =?us-ascii?Q?GHp5T+NplKzgjaZVaBrpjbFZ7kdIrHGnxKbYZuh3AKb/KSmyqWhRMdsl1cGm?= =?us-ascii?Q?A9OO5/5cfuLXe4frLTqPwYLKhTZFtr4JmyHE+zxuzAa3fCz2uNg128FG76f2?= =?us-ascii?Q?Id12CEypWeZngoyo/ijfthfpIwuAXNpGfFAXHp861HUdRMDBHF1x1J/5qOv5?= =?us-ascii?Q?VyUnXgEccwkLjDraV2Vo0I5RvHZj+SjMsNFbaUUSRxmw94kiMw5UbjJahiyJ?= =?us-ascii?Q?TjkNQsPTrn9rDJjxAM4OkWwx6JADmfxMhprUAhZ/jImXmQYQOWhl7K24ApEx?= =?us-ascii?Q?XtG8+ugHcNfcYl8g3dpcOLkg/LabqCBYce0ggcHCPQ5aF6BuEGWE3KoaVlvR?= =?us-ascii?Q?TqH0igpygaJTDw5zc+JB6Sfo9zRqmjH3QLz7Jse13z3/khq/DqQU7B33zqJJ?= =?us-ascii?Q?w0WbYfRQQmURaG+BbZqzrGaWWePlEzt17g=3D=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)(376002)(39860400002)(366004)(346002)(396003)(136003)(2616005)(186003)(1076003)(66574015)(107886003)(30864003)(4000180100002)(2906002)(8936002)(103116003)(36756003)(5660300002)(316002)(66946007)(66556008)(66476007)(6916009)(8676002)(478600001)(6486002)(4326008)(52116002)(6506007)(41300700001)(6666004)(6512007)(38100700002)(574094003)(45080400002)(86362001)(83380400001)(327674002)(334514002); DIR:OUT; SFP:1501; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?DO4Ecg4d4HAuMUsAPKV3/noCEdGovxQ+fFCSSs12isb9++WNNOQrGP3uU06h?= =?us-ascii?Q?uymPoyUJiozACISGNGbMek+Amu2hQaFrtuYEsf8Z/tpp6HWEU1tYUWyFXZxa?= =?us-ascii?Q?qKnT1n7dlC/r/GOLDb02SnDp03juBumdr2ibf4oMMXw7yyRklpOjt/FETriy?= =?us-ascii?Q?9SBxNWzvReK000OUBbVUilL4CeIqs6cVaWX1MWBHiwti8epAi2qOpHAoJ6mD?= =?us-ascii?Q?3v5kTV7l9F74/fobAw4g9mZVODqWLxzYgLaTdvM3CJ6qy3BxSoOKUs9kx3mu?= =?us-ascii?Q?68fXAcDSzQQO8x9Wm2ueo8VSEGKz+GPpNA8rKVBiFiroDdYZL6vFdjWFNnlw?= =?us-ascii?Q?jMRRUccExNqZt8RoGVJnZ7WyboWsmqo+m//0NB29ulxnd57bimUadJccz3lS?= =?us-ascii?Q?j/SzsdmmEOwpfvpt7Y1QPLhyNA6RlTt/n1e/h9ql2sSL8zQ6YXzyz7xZOdx8?= =?us-ascii?Q?Xw8L5i9ejPRX4NQWaiHMS2bVWDiHy2Rr/BG1uRawvWipNVb4nOw/k+DPKN3I?= =?us-ascii?Q?GgLwK3JWQN4jTCEnsjIviXtoDzVs+waMFbhQK/cd5Ra/h1tawinIkK0Lcs0r?= =?us-ascii?Q?RpoYi22CftzxT/hV3mWhztxI3DEHhW6gU3ondgkzRp9JwmGz0kNooW504w9u?= =?us-ascii?Q?4BOi5WWa3Eq6S4qeZRerLmykvKCgL/To3YKcPzkui+r+D7GxdPVXLcsRhCpg?= =?us-ascii?Q?7FOgAyim92EIhdBrrXFlbRvzJQDOLpiZO/glw1w24hvn4Oklf2SWXuyn6mcG?= =?us-ascii?Q?qhiAWBMmmt6mgrPHNFY5g9D6VmW0TCy9dweY7AypBdSidhXbXsH21Qxz/Ya8?= =?us-ascii?Q?DAO+dpwdxa1IINZxnobbPD9D0JN7n0iJkXvYrkLVKQOKhwWZRPGn5tLiE5jg?= =?us-ascii?Q?4Bb+Lf0trNnaDd31MPw6aO+B1HMrninOL+p3KdTM1FkYjHRjPixK97DusS8N?= =?us-ascii?Q?moIgC0F8ml2M9ESCOexD7a6NjoKv927aO2MTQrFDuK7eyXOEgEKFhgQG8mj3?= =?us-ascii?Q?CDc76F+1blOs6bYvFIGoO0gZXsCI/IgjUz0ICXkMplGficSYN7iy9oAgVlzs?= =?us-ascii?Q?RdyUO8EYe7mcEy0/q2ewU0ElJJKzovWJUSv/QMcqU964QDLH7u66xtZQAjEN?= =?us-ascii?Q?z1kI9aP7h4MONnsrLdqFSSOnGvKS8eXS765mPzH7mxrH9pZV9i1eJGxFMudm?= =?us-ascii?Q?saNcQ5GSNlGAi9GjXpeR8xNrwxchuknBOyie35IUXsledOzsyLg6dyvveNMx?= =?us-ascii?Q?xiR6eb9dv93Bqm1pqGqdkt/0Lt3iTjL5AmmBeAAtJd0TWKnra8G6UI+n2oJ5?= =?us-ascii?Q?ugCxP74bYmIxxLFB4lKMMZ8M5lAqBWVD5BQ/phSmJgqJcma7w9HGZ+M+T2ic?= =?us-ascii?Q?3JGT+kwB6wR1x1GHvvFqc1TKBFHlp5nicnIExQwjQwI8/1pQ5Q05zglKwEvW?= =?us-ascii?Q?fyqCQHO2nXhyGqqmBhYE3bfHHHjbqYONrSxJwRon2m5NAuJOKOZ++HBVjO5T?= =?us-ascii?Q?+/NowgqJ9UZ8bwU9e47FlDk4PmIzjMwVOJlbwboJ7Pvk+tlMGSr5BYDSIL8U?= =?us-ascii?Q?AS9Jr6+ktonjmmWV5JSDv/c/yS5DQXOeajVfllIBC4/KhXIUlmJh3caUTL+n?= =?us-ascii?Q?UqBj54GqwCPSUm4vQKTWxwARTlCx9YhYjMESL4vostuW?= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: 137516e8-b59f-4dd8-90bf-08da5e21c768 X-MS-Exchange-CrossTenant-AuthSource: MWHPR10MB1407.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 05 Jul 2022 01:01:39.5365 (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: 1nG0q9VRig2DyVzife/l1BhHk4bW6Hzyiq2pkiDSyjbzSLT7QUNXkY15s1Sr87yg47aDY4BSSFtVIXFRhz+vpyQeF1fAGtRtmKVgIZE+N3A= X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY4PR10MB1974 X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.517, 18.0.883 definitions=2022-07-04_19:2022-06-28, 2022-07-04 signatures=0 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 spamscore=0 bulkscore=0 suspectscore=0 malwarescore=0 phishscore=0 adultscore=0 impostorscore=0 classifier=parse_limit adjust=0 reason=mlx scancount=1 engine=8.12.0-2204290000 definitions=main-2207050003 X-Proofpoint-ORIG-GUID: ws2ujdaGdwXG-0Giq5PBzF_Fymym7ojT X-Proofpoint-GUID: ws2ujdaGdwXG-0Giq5PBzF_Fymym7ojT X-Mailman-Approved-At: Thu, 07 Jul 2022 09:00:21 +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: Tue, 05 Jul 2022 01:03:35 -0000 Hello, This patch is meant to execute the testsuite for abipkgdiff tool using sources with CTF debug info. Main changes from v1: - Use tests/test-diff-pkg.cc to run both CTF and DWARF testsuite. Comments will be welcomed and appreciated. Regards, 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/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.cc: Add testsuite for ctf packages. * tests/data/test-diff-pkg-ctf/test-*-report-*.txt: Expected testcases results. * doc/manuals/abipkgdiff.rst: Update `abipkgdiff' abstract manual. Signed-off-by: Guillermo E. Martinez --- doc/manuals/abipkgdiff.rst | 2 +- tests/data/Makefile.am | 77 +++++ .../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.cc | 321 ++++++++++++++++++ 80 files changed, 879 insertions(+), 1 deletion(-) 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 diff --git a/doc/manuals/abipkgdiff.rst b/doc/manuals/abipkgdiff.rst index f297c9a8..a096a762 100644 --- a/doc/manuals/abipkgdiff.rst +++ b/doc/manuals/abipkgdiff.rst @@ -13,7 +13,7 @@ binaries. For a comprehensive ABI change report that includes changes about function and variable sub-types, the two input packages must be accompanied with their debug information packages that contain debug -information in `DWARF`_ format. +information in `DWARF`_ and `CTF` format. .. _abipkgdiff_invocation_label: diff --git a/tests/data/Makefile.am b/tests/data/Makefile.am index 3a7f6f67..c7875b01 100644 --- a/tests/data/Makefile.am +++ b/tests/data/Makefile.am @@ -2012,6 +2012,83 @@ test-diff-pkg/wireshark/wireshark-cli-3.4.9-1.fc36.x86_64-self-check-report.txt 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 \ 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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