get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/139863/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 139863,
    "url": "http://patchwork.dpdk.org/api/patches/139863/?format=api",
    "web_url": "http://patchwork.dpdk.org/project/dpdk/patch/20240505073313.118515-2-mattias.ronnblom@ericsson.com/",
    "project": {
        "id": 1,
        "url": "http://patchwork.dpdk.org/api/projects/1/?format=api",
        "name": "DPDK",
        "link_name": "dpdk",
        "list_id": "dev.dpdk.org",
        "list_email": "dev@dpdk.org",
        "web_url": "http://core.dpdk.org",
        "scm_url": "git://dpdk.org/dpdk",
        "webscm_url": "http://git.dpdk.org/dpdk",
        "list_archive_url": "https://inbox.dpdk.org/dev",
        "list_archive_url_format": "https://inbox.dpdk.org/dev/{}",
        "commit_url_format": ""
    },
    "msgid": "<20240505073313.118515-2-mattias.ronnblom@ericsson.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20240505073313.118515-2-mattias.ronnblom@ericsson.com",
    "date": "2024-05-05T07:33:09",
    "name": "[RFC,v5,2/6] eal: add bitset test suite",
    "commit_ref": null,
    "pull_url": null,
    "state": "new",
    "archived": false,
    "hash": "3da77b978d38b1606a66ed2cdef86b1fc990e67f",
    "submitter": {
        "id": 1077,
        "url": "http://patchwork.dpdk.org/api/people/1077/?format=api",
        "name": "Mattias Rönnblom",
        "email": "mattias.ronnblom@ericsson.com"
    },
    "delegate": {
        "id": 1,
        "url": "http://patchwork.dpdk.org/api/users/1/?format=api",
        "username": "tmonjalo",
        "first_name": "Thomas",
        "last_name": "Monjalon",
        "email": "thomas@monjalon.net"
    },
    "mbox": "http://patchwork.dpdk.org/project/dpdk/patch/20240505073313.118515-2-mattias.ronnblom@ericsson.com/mbox/",
    "series": [
        {
            "id": 31128,
            "url": "http://patchwork.dpdk.org/api/series/31128/?format=api",
            "web_url": "http://patchwork.dpdk.org/project/dpdk/list/?series=31128",
            "date": "2024-02-16T10:23:45",
            "name": "[RFC,v4,1/4] eal: add bitset type",
            "version": 4,
            "mbox": "http://patchwork.dpdk.org/series/31128/mbox/"
        }
    ],
    "comments": "http://patchwork.dpdk.org/api/patches/139863/comments/",
    "check": "warning",
    "checks": "http://patchwork.dpdk.org/api/patches/139863/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@inbox.dpdk.org",
        "Delivered-To": "patchwork@inbox.dpdk.org",
        "Received": [
            "from mails.dpdk.org (mails.dpdk.org [217.70.189.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id A7BC243FAC;\n\tSun,  5 May 2024 09:43:52 +0200 (CEST)",
            "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id A3789402F2;\n\tSun,  5 May 2024 09:43:40 +0200 (CEST)",
            "from EUR02-DB5-obe.outbound.protection.outlook.com\n (mail-db5eur02on2071.outbound.protection.outlook.com [40.107.249.71])\n by mails.dpdk.org (Postfix) with ESMTP id 1FCE24025D\n for <dev@dpdk.org>; Sun,  5 May 2024 09:43:37 +0200 (CEST)",
            "from AM5PR0101CA0011.eurprd01.prod.exchangelabs.com\n (2603:10a6:206:16::24) by PAXPR07MB8471.eurprd07.prod.outlook.com\n (2603:10a6:102:2b7::11) with Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7544.39; Sun, 5 May\n 2024 07:43:35 +0000",
            "from AM3PEPF00009B9C.eurprd04.prod.outlook.com\n (2603:10a6:206:16:cafe::21) by AM5PR0101CA0011.outlook.office365.com\n (2603:10a6:206:16::24) with Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7544.40 via Frontend\n Transport; Sun, 5 May 2024 07:43:34 +0000",
            "from oa.msg.ericsson.com (192.176.1.74) by\n AM3PEPF00009B9C.mail.protection.outlook.com (10.167.16.21) with Microsoft\n SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id\n 15.20.7544.18 via Frontend Transport; Sun, 5 May 2024 07:43:34 +0000",
            "from seliicinfr00049.seli.gic.ericsson.se (153.88.142.248) by\n smtp-central.internal.ericsson.com (100.87.178.66) with Microsoft SMTP Server\n id 15.2.1544.9; Sun, 5 May 2024 09:43:32 +0200",
            "from breslau.. (seliicwb00002.seli.gic.ericsson.se [10.156.25.100])\n by seliicinfr00049.seli.gic.ericsson.se (Postfix) with ESMTP id\n AD9DD38007A; Sun,  5 May 2024 09:43:32 +0200 (CEST)"
        ],
        "ARC-Seal": "i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none;\n b=CU6/l40190e0wzTcYqYZ6GMIHiClQfjOzuVk3Vzq8IEhjDbgezMy0sWZssyWAEJ4qNOTZqXLKERX99m8Q/zPDsR5sdnXjjBH/cHgLDDAeZ1Y892XQx1iDZ8Sl240oeB9dC4OofcdSwv0SXa6q+4M8WKO5JW8Azjk58LcGgVeJy5ZOkSCxwwKH3KsYmwDQxTF3TFwqVVdRagf7mY/0hrBJUZoV83K9snebPoLqDwbwYIFGH1lBW3Ous5GzWWMA6TaOyHc71xmmDXNHBW+k4joXUZU1YCdsq3zxxZC0h4D0vxMc81E63lkOQ9KckzSi9eRqdEbZb8XZ3AlflZr0On9Tw==",
        "ARC-Message-Signature": "i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com;\n s=arcselector9901;\n 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;\n bh=oaVwGNpBSY3m97DQec8v9JHEuk4A+Xw7OeMp/v5XVe0=;\n b=fBJH1ZPPvhMtRAUxsJMxHqnjOXttpM3TiWq/Cig6CUEJvamMhDNiEToHNE81LuMbuSYhpkmeYefz575rjq1UeRLFe7sDQRNGgP6XSxLMUwd1DozFVHfxQaYm4YUt97/nVE6QJUWSkKP2bUVHWw2CtJ7EtOw4JzTUc8QWbqCZtuNvC5UOWOK8GFBLmKSv8qRHG2HBpagKLkOg8aKaMCDBnNZDyu6I6ip4TEes4bItDKcRsQGLwIItaq4dnjtYdeNwOhXwFIt7ObB2gklGC6erIIu49PZR19uB0iE8mhuRpvcO0SnRa+HHsinNK7vFVPbIyp9QJiY3tLfKNmpFoHvIDA==",
        "ARC-Authentication-Results": "i=1; mx.microsoft.com 1; spf=pass (sender ip is\n 192.176.1.74) smtp.rcpttodomain=dpdk.org smtp.mailfrom=ericsson.com;\n dmarc=pass (p=reject sp=reject pct=100) action=none header.from=ericsson.com;\n dkim=none (message not signed); arc=none (0)",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=ericsson.com;\n s=selector1;\n h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;\n bh=oaVwGNpBSY3m97DQec8v9JHEuk4A+Xw7OeMp/v5XVe0=;\n b=QtZGh/Xjwer3xevZnPQiTO/sAsGFcjzxFlxJkTuxHpNAFLgwcen+xTALbkWK1p6bXJmSur9PmS83w08DmCi3YK8VN1ecDloZV21/p8r0gEM7//Lfgw5cTq1H+APrCafUlG0Hqmbd3pWkja8d/DH3HaAjfThEQZHwRnoRhb/Cyue4z/DnHNKdjH6z3PW78zb+MNmsd3LcKl9dEEJfYoiBEVyp/D2J1B0fwP/2en0hiX7GAKuaFx9j6DKzZWkgOdf3pIAvEBjhLdt+O/6JUWAvOh1ctClPP/W6mg7CZogTlOq8s0O2qKM36j4IKvVGC2y1wi0hgzIGrQs6R9cfp8MAFw==",
        "X-MS-Exchange-Authentication-Results": "spf=pass (sender IP is 192.176.1.74)\n smtp.mailfrom=ericsson.com; dkim=none (message not signed)\n header.d=none;dmarc=pass action=none header.from=ericsson.com;",
        "Received-SPF": "Pass (protection.outlook.com: domain of ericsson.com designates\n 192.176.1.74 as permitted sender)\n receiver=protection.outlook.com;\n client-ip=192.176.1.74; helo=oa.msg.ericsson.com; pr=C",
        "From": "=?utf-8?q?Mattias_R=C3=B6nnblom?= <mattias.ronnblom@ericsson.com>",
        "To": "<dev@dpdk.org>",
        "CC": "<hofors@lysator.liu.se>,\n =?utf-8?q?Morten_Br=C3=B8rup?= <mb@smartsharesystems.com>,\n Tyler Retzlaff <roretzla@linux.microsoft.com>,\n Stephen Hemminger <stephen@networkplumber.org>,\n Harry van Haaren <harry.van.haaren@intel.com>, =?utf-8?q?Mattias_R=C3=B6nnb?=\n\t=?utf-8?q?lom?= <mattias.ronnblom@ericsson.com>",
        "Subject": "[RFC v5 2/6] eal: add bitset test suite",
        "Date": "Sun, 5 May 2024 09:33:09 +0200",
        "Message-ID": "<20240505073313.118515-2-mattias.ronnblom@ericsson.com>",
        "X-Mailer": "git-send-email 2.34.1",
        "In-Reply-To": "<20240505073313.118515-1-mattias.ronnblom@ericsson.com>",
        "References": "<20240216102348.480407-1-mattias.ronnblom@ericsson.com>\n <20240505073313.118515-1-mattias.ronnblom@ericsson.com>",
        "MIME-Version": "1.0",
        "Content-Type": "text/plain; charset=\"UTF-8\"",
        "Content-Transfer-Encoding": "8bit",
        "X-EOPAttributedMessage": "0",
        "X-MS-PublicTrafficType": "Email",
        "X-MS-TrafficTypeDiagnostic": "AM3PEPF00009B9C:EE_|PAXPR07MB8471:EE_",
        "X-MS-Office365-Filtering-Correlation-Id": "44d3e3f4-2a48-4a41-d02f-08dc6cd711a7",
        "X-MS-Exchange-SenderADCheck": "1",
        "X-MS-Exchange-AntiSpam-Relay": "0",
        "X-Microsoft-Antispam": "BCL:0;\n ARA:13230031|1800799015|376005|36860700004|82310400017;",
        "X-Microsoft-Antispam-Message-Info": "=?utf-8?q?yPRwWhsFqILFl3iJ8MPPgzuzhUKIw/t?=\n\t=?utf-8?q?OO49Pc2V7WX+KJdKAFb5c2NBM+tn5n72jFHQ6gkFAF18WQXXlNvXcxIcEXYk17Ntv?=\n\t=?utf-8?q?vTpugSP2lzpAOGKs4Ze2OXlpfG4oQnsBA32TxTXUikSX3fLuuKmGQsz9gEEIRFMln?=\n\t=?utf-8?q?0VPVVZY4Nq78hPrjhTDx8iwdJtPJrz1cC/5ZIX0RJm1IISqAJX5bDzM5h+5aEjwq+?=\n\t=?utf-8?q?pdvP6C6DnvwmKgBaiTywFBKyWkus+X1pyYb89kt0ZI0kDXZnLovT0Re53PJoD4QG+?=\n\t=?utf-8?q?YWEjfzQRheQJlg2cSeIPTUPBj5vkzYkWIJTVWgMu/TNBKM0BEvGjskSXFT89bPn2N?=\n\t=?utf-8?q?dUTKtRLFQhgdXLe36H4QCybgr2t+yIMS9yNnG7Z53PuTcPK8LncfdLLhaywyTe1g3?=\n\t=?utf-8?q?CTRJs/DPZmjClVjGXXsP0kwYYu8w1ZOjlHW4TfZHSBndAf2s0iz1doOkbaqDKVb6H?=\n\t=?utf-8?q?kGZYUixkJYx6MPc7niKEZNW78toahZTH0IIksg+FTavHH18ZjBAD58G7xVvZqtbG0?=\n\t=?utf-8?q?X2TIkFoUbNIY/d8/2OWgKauMTR5PFjG+BnkixGHkxmEFM3xrjT6ErtG/eQlFkbLNT?=\n\t=?utf-8?q?naVROf6wIh612t82hJNHpJxXaN7sV4P+mVJ8ozp39G4gi0oDukdQeNb6eNUJPtvVD?=\n\t=?utf-8?q?yvovAFCLxNWnfQbHqjVKFN7+MOKy6Vvnbyn/QeoqtSuQeeVNj+EI5mb7LrrcbpSOB?=\n\t=?utf-8?q?MNyPxal1E9+qw9quisVYfZvNZdd65t7Pw9pZjedm6T/oMnep8qXbmcT730/sK33Z2?=\n\t=?utf-8?q?XtzRapaGlvcdTDAw/U+BoOSDOR7aKbXc2Pw2S6PkoiqmmSO4LUYtE4KzbYv/Sf6Rq?=\n\t=?utf-8?q?h0iCO7ThscnYtsCdTwu3KUEkM3FPARDCgxaz8LfZ0fCCJ9EnIJ6EOgqdAhamKxTGy?=\n\t=?utf-8?q?XY4thZEPNIgSum9LCe95Lx5am2m94dmBH8c6Gu3jLZyR6OkmQ9QuU3IGR6MObTMgV?=\n\t=?utf-8?q?867F4GfPCGaumAXCfO+tbtxtJS0O7nX0jkTCdW7V+bIGH5k8QNf+SfPdsE1+FoV8p?=\n\t=?utf-8?q?MNqc95H6bCLyNQw16frOBPsodptgWaOtnkez93UNGjQylxBiEYuALn2KgfQtSoB/3?=\n\t=?utf-8?q?B55IeBEm+brsa3qs3rVWHSwk8ASzaePLsf7QBCbWY9nZVYw8teZbE6BGLYhJv06vp?=\n\t=?utf-8?q?pGoQtJXfzYxQe9jZLmcj6i01bj76X+OyNtLBCCazLiiQRLcuO14e8Us1pIUg7A0wU?=\n\t=?utf-8?q?GPzIqvoDPYWrc6gBk2AfOpYhd18fRQJzqjXV74cKkIF9SP986AAx1QmGecwFLvv4w?=\n\t=?utf-8?q?FIUThpXzCoVS0Ew4o5UxhUvYCUkTV7GZx/bXZo8uTXEDyxlbt8sDV/JWBZlCnKh3m?=\n\t=?utf-8?q?gz0uTZh8OBGs?=",
        "X-Forefront-Antispam-Report": "CIP:192.176.1.74; CTRY:SE; LANG:en; SCL:1; SRV:;\n IPV:NLI; SFV:NSPM; H:oa.msg.ericsson.com; PTR:office365.se.ericsson.net;\n CAT:NONE; SFS:(13230031)(1800799015)(376005)(36860700004)(82310400017);\n DIR:OUT; SFP:1101;",
        "X-OriginatorOrg": "ericsson.com",
        "X-MS-Exchange-CrossTenant-OriginalArrivalTime": "05 May 2024 07:43:34.8653 (UTC)",
        "X-MS-Exchange-CrossTenant-Network-Message-Id": "\n 44d3e3f4-2a48-4a41-d02f-08dc6cd711a7",
        "X-MS-Exchange-CrossTenant-Id": "92e84ceb-fbfd-47ab-be52-080c6b87953f",
        "X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp": "\n TenantId=92e84ceb-fbfd-47ab-be52-080c6b87953f; Ip=[192.176.1.74];\n Helo=[oa.msg.ericsson.com]",
        "X-MS-Exchange-CrossTenant-AuthSource": "\n AM3PEPF00009B9C.eurprd04.prod.outlook.com",
        "X-MS-Exchange-CrossTenant-AuthAs": "Anonymous",
        "X-MS-Exchange-CrossTenant-FromEntityHeader": "HybridOnPrem",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "PAXPR07MB8471",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.29",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n <mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://mails.dpdk.org/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n <mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org"
    },
    "content": "Add test suite to exercise <rte_bitset.h>.\n\nRFC v5:\n * Parameterize tests to allow reuse across both atomic and non-atomic\n   functions.\n\nRFC v4:\n * Fix signed char issue in test cases. (Stephen Hemminger)\n * Add test cases for logic operations.\n * Use the unit test suite runner helper.\n\nSigned-off-by: Mattias Rönnblom <mattias.ronnblom@ericsson.com>\n---\n app/test/meson.build   |   1 +\n app/test/test_bitset.c | 894 +++++++++++++++++++++++++++++++++++++++++\n 2 files changed, 895 insertions(+)\n create mode 100644 app/test/test_bitset.c",
    "diff": "diff --git a/app/test/meson.build b/app/test/meson.build\nindex 7d909039ae..633af5ce05 100644\n--- a/app/test/meson.build\n+++ b/app/test/meson.build\n@@ -33,6 +33,7 @@ source_file_deps = {\n     'test_bitcount.c': [],\n     'test_bitmap.c': [],\n     'test_bitops.c': [],\n+    'test_bitset.c': [],\n     'test_bitratestats.c': ['metrics', 'bitratestats', 'ethdev'] + sample_packet_forward_deps,\n     'test_bpf.c': ['bpf', 'net'],\n     'test_byteorder.c': [],\ndiff --git a/app/test/test_bitset.c b/app/test/test_bitset.c\nnew file mode 100644\nindex 0000000000..b3496df1c0\n--- /dev/null\n+++ b/app/test/test_bitset.c\n@@ -0,0 +1,894 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright(c) 2023 Ericsson AB\n+ */\n+\n+#include <stdlib.h>\n+#include <inttypes.h>\n+\n+#include <rte_random.h>\n+\n+#include <rte_bitset.h>\n+\n+#include \"test.h\"\n+\n+#define MAGIC UINT64_C(0xdeadbeefdeadbeef)\n+\n+static void\n+rand_buf(void *buf, size_t n)\n+{\n+\tsize_t i;\n+\n+\tfor (i = 0; i < n; i++)\n+\t\t((unsigned char *)buf)[i] = rte_rand();\n+}\n+\n+static uint64_t *\n+alloc_bitset(size_t size)\n+{\n+\tuint64_t *p;\n+\n+\tp = malloc(RTE_BITSET_SIZE(size) + 2 * sizeof(uint64_t));\n+\n+\tif (p == NULL)\n+\t\trte_panic(\"Unable to allocate memory\\n\");\n+\n+\trand_buf(&p[0], RTE_BITSET_SIZE(size));\n+\n+\tp[0] = MAGIC;\n+\tp[RTE_BITSET_NUM_WORDS(size) + 1] = MAGIC;\n+\n+\treturn p + 1;\n+}\n+\n+\n+static int\n+free_bitset(uint64_t *bitset, size_t size)\n+{\n+\tuint64_t *p;\n+\n+\tp = bitset - 1;\n+\n+\tif (p[0] != MAGIC)\n+\t\treturn TEST_FAILED;\n+\n+\tif (p[RTE_BITSET_NUM_WORDS(size) + 1] != MAGIC)\n+\t\treturn TEST_FAILED;\n+\n+\tfree(p);\n+\n+\treturn TEST_SUCCESS;\n+}\n+\n+static bool\n+rand_bool(void)\n+{\n+\treturn rte_rand_max(2);\n+}\n+\n+static void\n+rand_bool_ary(bool *ary, size_t len)\n+{\n+\tsize_t i;\n+\n+\tfor (i = 0; i < len; i++)\n+\t\tary[i] = rand_bool();\n+}\n+\n+static void\n+rand_unused_bits(uint64_t *bitset, size_t size)\n+{\n+\tuint64_t bits = rte_rand() & ~__RTE_BITSET_USED_MASK(size);\n+\n+\tbitset[RTE_BITSET_NUM_WORDS(size) - 1] |= bits;\n+}\n+\n+static void\n+rand_bitset(uint64_t *bitset, size_t size)\n+{\n+\tsize_t i;\n+\n+\trte_bitset_init(bitset, size);\n+\n+\tfor (i = 0; i < size; i++)\n+\t\trte_bitset_assign(bitset, i, rand_bool());\n+\n+\trand_unused_bits(bitset, size);\n+}\n+\n+typedef bool test_fun(const uint64_t *bitset, size_t bit_num);\n+typedef void set_fun(uint64_t *bitset, size_t bit_num);\n+typedef void clear_fun(uint64_t *bitset, size_t bit_num);\n+typedef void assign_fun(uint64_t *bitset, size_t bit_num, bool value);\n+typedef void flip_fun(uint64_t *bitset, size_t bit_num);\n+\n+static int\n+test_set_clear_size(test_fun test_fun, set_fun set_fun, clear_fun clear_fun,\n+\t\t    size_t size)\n+{\n+\tsize_t i;\n+\tbool reference[size];\n+\tuint64_t *bitset;\n+\n+\trand_bool_ary(reference, size);\n+\n+\tbitset = alloc_bitset(size);\n+\n+\tTEST_ASSERT(bitset != NULL, \"Failed to allocate memory\");\n+\n+\trte_bitset_init(bitset, size);\n+\n+\tfor (i = 0; i < size; i++) {\n+\t\tif (reference[i])\n+\t\t\tset_fun(bitset, i);\n+\t\telse\n+\t\t\tclear_fun(bitset, i);\n+\t}\n+\n+\tfor (i = 0; i < size; i++)\n+\t\tif (reference[i] != test_fun(bitset, i))\n+\t\t\treturn TEST_FAILED;\n+\n+\tTEST_ASSERT_EQUAL(free_bitset(bitset, size), TEST_SUCCESS,\n+\t\t\t  \"Buffer over- or underrun detected\");\n+\n+\treturn TEST_SUCCESS;\n+}\n+\n+#define RAND_ITERATIONS (10000)\n+#define RAND_SET_MAX_SIZE (1000)\n+\n+static int\n+test_set_clear_fun(test_fun test_fun, set_fun set_fun, clear_fun clear_fun)\n+{\n+\tsize_t i;\n+\n+\tfor (i = 0; i < RAND_ITERATIONS; i++) {\n+\t\tsize_t size = 1 + rte_rand_max(RAND_SET_MAX_SIZE - 1);\n+\n+\t\tif (test_set_clear_size(test_fun, set_fun, clear_fun,\n+\t\t\t\t\tsize) != TEST_SUCCESS)\n+\t\t\treturn TEST_FAILED;\n+\t}\n+\n+\treturn TEST_SUCCESS;\n+}\n+\n+static int\n+test_set_clear(void)\n+{\n+\treturn test_set_clear_fun(rte_bitset_test, rte_bitset_set,\n+\t\t\t\t  rte_bitset_clear);\n+}\n+\n+static int\n+test_flip_size(test_fun test_fun, assign_fun assign_fun, flip_fun flip_fun,\n+\t       size_t size)\n+{\n+\tsize_t i;\n+\tuint64_t *bitset;\n+\n+\tbitset = alloc_bitset(size);\n+\n+\tTEST_ASSERT(bitset != NULL, \"Failed to allocate memory\");\n+\n+\trand_bitset(bitset, size);\n+\n+\tfor (i = 0; i < size; i++) {\n+\t\tRTE_BITSET_DECLARE(reference, size);\n+\n+\t\trte_bitset_copy(reference, bitset, size);\n+\n+\t\tbool value = test_fun(bitset, i);\n+\n+\t\tflip_fun(bitset, i);\n+\n+\t\tTEST_ASSERT(test_fun(bitset, i) != value,\n+\t\t\t    \"Bit %zd was not flipped\", i);\n+\n+\t\tassign_fun(reference, i, !value);\n+\n+\t\tTEST_ASSERT(rte_bitset_equal(bitset, reference, size),\n+\t\t\t    \"Not only the target bit %zd was flipped\", i);\n+\n+\n+\t}\n+\n+\tTEST_ASSERT_EQUAL(free_bitset(bitset, size), TEST_SUCCESS,\n+\t\t\t  \"Buffer over- or underrun detected\");\n+\n+\treturn TEST_SUCCESS;\n+}\n+\n+static int\n+test_flip_fun(test_fun test_fun, assign_fun assign_fun, flip_fun flip_fun)\n+{\n+\tsize_t i;\n+\n+\tfor (i = 0; i < RAND_ITERATIONS; i++) {\n+\t\tsize_t size = 1 + rte_rand_max(RAND_SET_MAX_SIZE - 1);\n+\n+\t\tif (test_flip_size(test_fun, assign_fun, flip_fun,\n+\t\t\t\t   size) != TEST_SUCCESS)\n+\t\t\treturn TEST_FAILED;\n+\t}\n+\n+\treturn TEST_SUCCESS;\n+}\n+\n+static int\n+test_flip(void)\n+{\n+\treturn test_flip_fun(rte_bitset_test, rte_bitset_assign,\n+\t\t\t     rte_bitset_flip);\n+}\n+\n+static ssize_t\n+find(const bool *ary, size_t num_bools, size_t start, size_t len, bool set)\n+{\n+\tsize_t i;\n+\n+\tfor (i = 0; i < len; i++) {\n+\t\tssize_t idx = (start + i) % num_bools;\n+\n+\t\tif (ary[idx] == set)\n+\t\t\treturn idx;\n+\t}\n+\n+\treturn -1;\n+}\n+\n+static ssize_t\n+find_set(const bool *ary, size_t num_bools, size_t start, size_t len)\n+{\n+\treturn find(ary, num_bools, start, len, true);\n+}\n+\n+static ssize_t\n+find_clear(const bool *ary, size_t num_bools, size_t start, size_t len)\n+{\n+\treturn find(ary, num_bools, start, len, false);\n+}\n+\n+#define FFS_ITERATIONS (100)\n+\n+static int\n+test_find_size(size_t size, bool set)\n+{\n+\tuint64_t *bitset;\n+\tbool reference[size];\n+\tsize_t i;\n+\n+\tbitset = alloc_bitset(size);\n+\n+\tTEST_ASSERT(bitset != NULL, \"Failed to allocate memory\");\n+\n+\trte_bitset_init(bitset, size);\n+\n+\tfor (i = 0; i < size; i++) {\n+\t\tbool bit = rand_bool();\n+\t\treference[i] = bit;\n+\n+\t\tif (bit)\n+\t\t\trte_bitset_set(bitset, i);\n+\t\telse /* redundant, still useful for testing */\n+\t\t\trte_bitset_clear(bitset, i);\n+\t}\n+\n+\tfor (i = 0; i < FFS_ITERATIONS; i++) {\n+\t\tsize_t start_bit = rte_rand_max(size);\n+\t\tsize_t len = rte_rand_max(size + 1);\n+\t\tbool full_range = len == size && start_bit == 0;\n+\t\tbool wraps = start_bit + len > size;\n+\t\tssize_t rc;\n+\n+\t\tif (set) {\n+\t\t\tif (full_range && rand_bool())\n+\t\t\t\trc = rte_bitset_find_first_set(bitset,\n+\t\t\t\t\t\t\t       size);\n+\t\t\telse if (wraps || rand_bool()) {\n+\t\t\t\trc = rte_bitset_find_set_wrap(bitset, size,\n+\t\t\t\t\t\t\t      start_bit, len);\n+\n+\t\t\t} else\n+\t\t\t\trc = rte_bitset_find_set(bitset, size,\n+\t\t\t\t\t\t\t start_bit, len);\n+\n+\t\t\tif (rc != find_set(reference, size, start_bit,\n+\t\t\t\t\t   len))\n+\t\t\t\treturn TEST_FAILED;\n+\t\t} else {\n+\t\t\tif (full_range && rand_bool())\n+\t\t\t\trc = rte_bitset_find_first_clear(bitset,\n+\t\t\t\t\t\t\t\t size);\n+\t\t\telse if (wraps || rand_bool())\n+\t\t\t\trc = rte_bitset_find_clear_wrap(bitset,\n+\t\t\t\t\t\t\t\tsize,\n+\t\t\t\t\t\t\t\tstart_bit, len);\n+\t\t\telse\n+\t\t\t\trc = rte_bitset_find_clear(bitset, size,\n+\t\t\t\t\t\t\t   start_bit, len);\n+\n+\t\t\tif (rc != find_clear(reference, size, start_bit,\n+\t\t\t\t\t     len))\n+\t\t\t\treturn TEST_FAILED;\n+\t\t}\n+\n+\t}\n+\n+\tTEST_ASSERT_EQUAL(free_bitset(bitset, size), TEST_SUCCESS,\n+\t\t\t  \"Buffer over- or underrun detected\");\n+\n+\treturn TEST_SUCCESS;\n+}\n+\n+static int\n+test_find_set_size(size_t size)\n+{\n+\treturn test_find_size(size, true);\n+}\n+\n+static int\n+test_find_clear_size(size_t size)\n+{\n+\treturn test_find_size(size, false);\n+}\n+\n+static int\n+test_find(void)\n+{\n+\tsize_t i;\n+\n+\tfor (i = 0; i < RAND_ITERATIONS; i++) {\n+\t\tsize_t size = 2 + rte_rand_max(RAND_SET_MAX_SIZE - 2);\n+\n+\t\tif (test_find_set_size(size) != TEST_SUCCESS)\n+\t\t\treturn TEST_FAILED;\n+\n+\t\tif (test_find_clear_size(size) != TEST_SUCCESS)\n+\t\t\treturn TEST_FAILED;\n+\t}\n+\n+\treturn TEST_SUCCESS;\n+}\n+\n+static int\n+record_match(ssize_t match_idx, size_t size, int *calls)\n+{\n+\tif (match_idx < 0 || (size_t)match_idx >= size)\n+\t\treturn TEST_FAILED;\n+\n+\tcalls[match_idx]++;\n+\n+\treturn TEST_SUCCESS;\n+}\n+\n+static int\n+test_foreach_size(ssize_t size, bool may_wrap, bool set)\n+{\n+\tbool reference[size];\n+\tint calls[size];\n+\tuint64_t *bitset;\n+\tssize_t i;\n+\tssize_t start_bit;\n+\tssize_t len;\n+\tbool full_range;\n+\tsize_t total_calls = 0;\n+\n+\trand_bool_ary(reference, size);\n+\n+\tbitset = alloc_bitset(size);\n+\n+\tTEST_ASSERT(bitset != NULL, \"Failed to allocate memory\");\n+\n+\tmemset(calls, 0, sizeof(calls));\n+\n+\tstart_bit = rte_rand_max(size);\n+\tlen = may_wrap ? rte_rand_max(size + 1) :\n+\t\trte_rand_max(size - start_bit + 1);\n+\n+\trte_bitset_init(bitset, size);\n+\n+\t/* random data in the unused bits should not matter */\n+\trand_buf(bitset, RTE_BITSET_SIZE(size));\n+\n+\tfor (i = start_bit; i < start_bit + len; i++) {\n+\t\tsize_t idx = i % size;\n+\n+\t\tif (reference[idx])\n+\t\t\trte_bitset_set(bitset, idx);\n+\t\telse\n+\t\t\trte_bitset_clear(bitset, idx);\n+\n+\t\tif (rte_bitset_test(bitset, idx) != reference[idx])\n+\t\t\treturn TEST_FAILED;\n+\t}\n+\n+\tfull_range = (len == size && start_bit == 0);\n+\n+\t/* XXX: verify iteration order as well */\n+\tif (set) {\n+\t\tif (full_range && rand_bool()) {\n+\t\t\tRTE_BITSET_FOREACH_SET(i, bitset, size) {\n+\t\t\t\tif (record_match(i, size, calls) !=\n+\t\t\t\t    TEST_SUCCESS)\n+\t\t\t\t\treturn TEST_FAILED;\n+\t\t\t}\n+\t\t} else if (may_wrap) {\n+\t\t\tRTE_BITSET_FOREACH_SET_WRAP(i, bitset, size,\n+\t\t\t\t\t\t    start_bit, len) {\n+\t\t\t\tif (record_match(i, size, calls) !=\n+\t\t\t\t    TEST_SUCCESS) {\n+\t\t\t\t\tprintf(\"failed\\n\");\n+\t\t\t\t\treturn TEST_FAILED;\n+\t\t\t\t}\n+\t\t\t}\n+\t\t} else {\n+\t\t\tRTE_BITSET_FOREACH_SET_RANGE(i, bitset, size,\n+\t\t\t\t\t\t     start_bit, len) {\n+\t\t\t\tif (record_match(i, size, calls) !=\n+\t\t\t\t    TEST_SUCCESS)\n+\t\t\t\t\treturn TEST_FAILED;\n+\t\t\t}\n+\t\t}\n+\t} else {\n+\t\tif (full_range && rand_bool()) {\n+\t\t\tRTE_BITSET_FOREACH_CLEAR(i, bitset, size)\n+\t\t\t\tif (record_match(i, size, calls) !=\n+\t\t\t\t    TEST_SUCCESS)\n+\t\t\t\t\treturn TEST_FAILED;\n+\t\t} else if (may_wrap) {\n+\t\t\tRTE_BITSET_FOREACH_CLEAR_WRAP(i, bitset, size,\n+\t\t\t\t\t\t      start_bit, len) {\n+\t\t\t\tif (record_match(i, size, calls) !=\n+\t\t\t\t    TEST_SUCCESS)\n+\t\t\t\t\treturn TEST_FAILED;\n+\t\t\t}\n+\t\t} else {\n+\t\t\tRTE_BITSET_FOREACH_CLEAR_RANGE(i, bitset, size,\n+\t\t\t\t\t\t       start_bit, len)\n+\t\t\t\tif (record_match(i, size, calls) !=\n+\t\t\t\t    TEST_SUCCESS)\n+\t\t\t\t\treturn TEST_FAILED;\n+\t\t}\n+\t}\n+\n+\tfor (i = 0; i < len; i++) {\n+\t\tsize_t idx = (start_bit + i) % size;\n+\n+\t\tif (reference[idx] == set && calls[idx] != 1) {\n+\t\t\tprintf(\"bit %zd shouldn't have been found %d \"\n+\t\t\t       \"times\\n\", idx, calls[idx]);\n+\t\t\treturn TEST_FAILED;\n+\t\t}\n+\n+\t\tif (reference[idx] != set && calls[idx] != 0) {\n+\t\t\tputs(\"bar\");\n+\t\t\treturn TEST_FAILED;\n+\t\t}\n+\n+\t\ttotal_calls += calls[idx];\n+\t}\n+\n+\tif (full_range) {\n+\t\tsize_t count;\n+\n+\t\tcount = set ? rte_bitset_count_set(bitset, size) :\n+\t\t\trte_bitset_count_clear(bitset, size);\n+\n+\t\tif (count != total_calls)\n+\t\t\treturn TEST_FAILED;\n+\t}\n+\n+\tTEST_ASSERT_EQUAL(free_bitset(bitset, size), TEST_SUCCESS,\n+\t\t\t  \"Buffer over- or underrun detected\");\n+\n+\treturn TEST_SUCCESS;\n+}\n+\n+static int\n+test_foreach(void)\n+{\n+\tsize_t i;\n+\n+\tfor (i = 0; i < RAND_ITERATIONS; i++) {\n+\t\tsize_t size = 1 + rte_rand_max(RAND_SET_MAX_SIZE - 1);\n+\n+\t\tif (test_foreach_size(size, false, true) != TEST_SUCCESS)\n+\t\t\treturn TEST_FAILED;\n+\n+\t\tif (test_foreach_size(size, false, false) != TEST_SUCCESS)\n+\t\t\treturn TEST_FAILED;\n+\n+\t\tif (test_foreach_size(size, true, true) != TEST_SUCCESS)\n+\t\t\treturn TEST_FAILED;\n+\n+\t\tif (test_foreach_size(size, true, false) != TEST_SUCCESS)\n+\t\t\treturn TEST_FAILED;\n+\t}\n+\n+\treturn TEST_SUCCESS;\n+}\n+\n+static int\n+test_count_size(size_t size)\n+{\n+\tuint64_t *bitset;\n+\n+\tbitset = alloc_bitset(size);\n+\n+\tTEST_ASSERT(bitset != NULL, \"Failed to allocate memory\");\n+\n+\trte_bitset_init(bitset, size);\n+\n+\trand_unused_bits(bitset, size);\n+\n+\tif (rte_bitset_count_set(bitset, size) != 0)\n+\t\treturn TEST_FAILED;\n+\n+\tif (rte_bitset_count_clear(bitset, size) != size)\n+\t\treturn TEST_FAILED;\n+\n+\trte_bitset_set_all(bitset, size);\n+\n+\tif (rte_bitset_count_set(bitset, size) != size)\n+\t\treturn TEST_FAILED;\n+\n+\tif (rte_bitset_count_clear(bitset, size) != 0)\n+\t\treturn TEST_FAILED;\n+\n+\trte_bitset_clear_all(bitset, size);\n+\n+\tif (rte_bitset_count_set(bitset, size) != 0)\n+\t\treturn TEST_FAILED;\n+\n+\tif (rte_bitset_count_clear(bitset, size) != size)\n+\t\treturn TEST_FAILED;\n+\n+\trte_bitset_set(bitset, rte_rand_max(size));\n+\n+\tif (rte_bitset_count_set(bitset, size) != 1)\n+\t\treturn TEST_FAILED;\n+\n+\tif (rte_bitset_count_clear(bitset, size) != (size - 1))\n+\t\treturn TEST_FAILED;\n+\n+\trte_bitset_clear_all(bitset, size);\n+\tif (rte_bitset_count_set(bitset, size) != 0)\n+\t\treturn TEST_FAILED;\n+\tif (rte_bitset_count_clear(bitset, size) != size)\n+\t\treturn TEST_FAILED;\n+\n+\trte_bitset_set_all(bitset, size);\n+\tif (rte_bitset_count_set(bitset, size) != size)\n+\t\treturn TEST_FAILED;\n+\tif (rte_bitset_count_clear(bitset, size) != 0)\n+\t\treturn TEST_FAILED;\n+\n+\tTEST_ASSERT_EQUAL(free_bitset(bitset, size), TEST_SUCCESS,\n+\t\t\t  \"Buffer over- or underrun detected\");\n+\n+\treturn TEST_SUCCESS;\n+}\n+\n+static int\n+test_count(void)\n+{\n+\tsize_t i;\n+\n+\tif (test_count_size(128) != TEST_SUCCESS)\n+\t\treturn TEST_FAILED;\n+\tif (test_count_size(1) != TEST_SUCCESS)\n+\t\treturn TEST_FAILED;\n+\tif (test_count_size(63) != TEST_SUCCESS)\n+\t\treturn TEST_FAILED;\n+\tif (test_count_size(64) != TEST_SUCCESS)\n+\t\treturn TEST_FAILED;\n+\tif (test_count_size(65) != TEST_SUCCESS)\n+\t\treturn TEST_FAILED;\n+\n+\tfor (i = 0; i < RAND_ITERATIONS; i++) {\n+\t\tsize_t size = 1 + rte_rand_max(RAND_SET_MAX_SIZE - 1);\n+\n+\t\tif (test_count_size(size) != TEST_SUCCESS)\n+\t\t\treturn TEST_FAILED;\n+\t}\n+\n+\treturn TEST_SUCCESS;\n+}\n+\n+#define GEN_DECLARE(size)\t\t\t\t\t\t\\\n+\t{\t\t\t\t\t\t\t\t\\\n+\t\tRTE_BITSET_DECLARE(bitset, size);\t\t\t\\\n+\t\tsize_t idx;\t\t\t\t\t\t\\\n+\t\t\t\t\t\t\t\t\t\\\n+\t\tidx = rte_rand_max(size);\t\t\t\t\\\n+\t\trte_bitset_init(bitset, size);\t\t\t\t\\\n+\t\t\t\t\t\t\t\t\t\\\n+\t\trte_bitset_set(bitset, idx);\t\t\t\t\\\n+\t\tif (!rte_bitset_test(bitset, idx))\t\t\t\\\n+\t\t\treturn TEST_FAILED;\t\t\t\t\\\n+\t\tif (rte_bitset_count_set(bitset, size) != 1)\t\t\\\n+\t\t\treturn TEST_FAILED;\t\t\t\t\\\n+\t\treturn TEST_SUCCESS;\t\t\t\t\t\\\n+\t}\n+\n+static int\n+test_define(void)\n+{\n+\tGEN_DECLARE(1);\n+\tGEN_DECLARE(64);\n+\tGEN_DECLARE(65);\n+\tGEN_DECLARE(4097);\n+}\n+\n+static int test_logic_op(void (*bitset_op)(uint64_t *, const uint64_t *,\n+\t\t\t\t\t   const uint64_t *, size_t),\n+\t\t\t bool (*bool_op)(bool, bool))\n+{\n+\tconst size_t size = 1 + rte_rand_max(200);\n+\tRTE_BITSET_DECLARE(bitset_a, size);\n+\tRTE_BITSET_DECLARE(bitset_b, size);\n+\tRTE_BITSET_DECLARE(bitset_d, size);\n+\n+\tbool ary_a[size];\n+\tbool ary_b[size];\n+\tbool ary_d[size];\n+\n+\trand_bool_ary(ary_a, size);\n+\trand_bool_ary(ary_b, size);\n+\n+\tsize_t i;\n+\tfor (i = 0; i < size; i++) {\n+\t\trte_bitset_assign(bitset_a, i, ary_a[i]);\n+\t\trte_bitset_assign(bitset_b, i, ary_b[i]);\n+\t\tary_d[i] = bool_op(ary_a[i], ary_b[i]);\n+\t}\n+\n+\tbitset_op(bitset_d, bitset_a, bitset_b, size);\n+\n+\tfor (i = 0; i < size; i++)\n+\t\tTEST_ASSERT_EQUAL(rte_bitset_test(bitset_d, i),\n+\t\t\t\t  ary_d[i], \"Unexpected value of bit %zd\", i);\n+\n+\treturn TEST_SUCCESS;\n+}\n+\n+static bool\n+bool_or(bool a, bool b)\n+{\n+\treturn a || b;\n+}\n+\n+static int\n+test_or(void)\n+{\n+\treturn test_logic_op(rte_bitset_or, bool_or);\n+}\n+\n+static bool\n+bool_and(bool a, bool b)\n+{\n+\treturn a && b;\n+}\n+\n+static int\n+test_and(void)\n+{\n+\treturn test_logic_op(rte_bitset_and, bool_and);\n+}\n+\n+static bool\n+bool_xor(bool a, bool b)\n+{\n+\treturn a != b;\n+}\n+\n+static int\n+test_xor(void)\n+{\n+\treturn test_logic_op(rte_bitset_xor, bool_xor);\n+}\n+\n+static int\n+test_complement(void)\n+{\n+\tint i;\n+\n+\tfor (i = 0; i < RAND_ITERATIONS; i++) {\n+\t\tconst size_t size = 1 + rte_rand_max(RAND_SET_MAX_SIZE - 1);\n+\n+\t\tRTE_BITSET_DECLARE(src, size);\n+\n+\t\trand_bitset(src, size);\n+\n+\t\tbool bit_idx = rte_rand_max(size);\n+\t\tbool bit_value = rte_bitset_test(src, bit_idx);\n+\n+\t\tRTE_BITSET_DECLARE(dst, size);\n+\n+\t\trte_bitset_complement(dst, src, size);\n+\n+\t\tTEST_ASSERT(bit_value != rte_bitset_test(dst, bit_idx),\n+\t\t\t    \"Bit %d was not flipped\", bit_idx);\n+\t}\n+\n+\treturn TEST_SUCCESS;\n+}\n+\n+static int\n+test_shift(bool right)\n+{\n+\tint i;\n+\n+\tconst char *direction = right ? \"right\" : \"left\";\n+\n+\tfor (i = 0; i < 10000; i++) {\n+\t\tconst int size = 1 + (int)rte_rand_max(500);\n+\t\tconst int shift_count = (int)rte_rand_max(1.5 * size);\n+\t\tint src_idx;\n+\n+\t\tRTE_BITSET_DECLARE(src, size);\n+\t\tRTE_BITSET_DECLARE(reference, size);\n+\n+\t\trte_bitset_init(src, size);\n+\t\trte_bitset_init(reference, size);\n+\n+\t\trand_unused_bits(src, size);\n+\t\trand_unused_bits(reference, size);\n+\n+\t\tfor (src_idx = 0; src_idx < size; src_idx++) {\n+\t\t\tbool value = rand_bool();\n+\n+\t\t\trte_bitset_assign(src, src_idx, value);\n+\n+\t\t\tint dst_idx = right ? src_idx - shift_count :\n+\t\t\t\tsrc_idx + shift_count;\n+\n+\t\t\tif (dst_idx >= 0 && dst_idx < size)\n+\t\t\t\trte_bitset_assign(reference, dst_idx, value);\n+\t\t}\n+\n+\t\tuint64_t *dst = alloc_bitset(size);\n+\n+\t\tif (right)\n+\t\t\trte_bitset_shift_right(dst, src, size, shift_count);\n+\t\telse\n+\t\t\trte_bitset_shift_left(dst, src, size, shift_count);\n+\n+\t\tTEST_ASSERT(rte_bitset_equal(dst, reference, size),\n+\t\t\t    \"Unexpected result from shifting bitset of size \"\n+\t\t\t    \"%d bits %d bits %s\", size, shift_count, direction);\n+\n+\t\tTEST_ASSERT_EQUAL(free_bitset(dst, size), TEST_SUCCESS,\n+\t\t\t\t  \"Shift %s operation overwrote buffer\",\n+\t\t\t\t  direction);\n+\t}\n+\n+\treturn TEST_SUCCESS;\n+}\n+\n+static int\n+test_shift_right(void)\n+{\n+\treturn test_shift(true);\n+}\n+\n+static int\n+test_shift_left(void)\n+{\n+\treturn test_shift(false);\n+}\n+\n+static int\n+test_equal(void)\n+{\n+\tconst size_t size = 100;\n+\tRTE_BITSET_DECLARE(bitset_a, size);\n+\tRTE_BITSET_DECLARE(bitset_b, size);\n+\n+\trand_buf(bitset_a, RTE_BITSET_SIZE(size));\n+\trand_buf(bitset_b, RTE_BITSET_SIZE(size));\n+\n+\trte_bitset_init(bitset_a, size);\n+\trte_bitset_init(bitset_b, size);\n+\n+\trte_bitset_set(bitset_a, 9);\n+\trte_bitset_set(bitset_b, 9);\n+\trte_bitset_set(bitset_a, 90);\n+\trte_bitset_set(bitset_b, 90);\n+\n+\tif (!rte_bitset_equal(bitset_a, bitset_b, size))\n+\t\treturn TEST_FAILED;\n+\n+\t/* set unused bit, which should be ignored */\n+\trte_bitset_set(&bitset_a[1], 60);\n+\n+\tif (!rte_bitset_equal(bitset_a, bitset_b, size))\n+\t\treturn TEST_FAILED;\n+\n+\treturn TEST_SUCCESS;\n+}\n+\n+static int\n+test_copy(void)\n+{\n+\tconst size_t size = 100;\n+\tRTE_BITSET_DECLARE(bitset_a, size);\n+\tRTE_BITSET_DECLARE(bitset_b, size);\n+\n+\trand_buf(bitset_a, RTE_BITSET_SIZE(size));\n+\trand_buf(bitset_b, RTE_BITSET_SIZE(size));\n+\n+\trte_bitset_copy(bitset_a, bitset_b, size);\n+\n+\tif (!rte_bitset_equal(bitset_a, bitset_b, size))\n+\t\treturn TEST_FAILED;\n+\n+\treturn TEST_SUCCESS;\n+}\n+\n+static int\n+test_to_str(void)\n+{\n+\tchar buf[1024];\n+\tRTE_BITSET_DECLARE(bitset, 128);\n+\n+\trte_bitset_init(bitset, 128);\n+\trte_bitset_set(bitset, 1);\n+\n+\tif (rte_bitset_to_str(bitset, 2, buf, 3) != 3)\n+\t\treturn TEST_FAILED;\n+\tif (strcmp(buf, \"10\") != 0)\n+\t\treturn TEST_FAILED;\n+\n+\trte_bitset_set(bitset, 0);\n+\n+\tif (rte_bitset_to_str(bitset, 1, buf, sizeof(buf)) != 2)\n+\t\treturn TEST_FAILED;\n+\tif (strcmp(buf, \"1\") != 0)\n+\t\treturn TEST_FAILED;\n+\n+\trte_bitset_init(bitset, 99);\n+\trte_bitset_set(bitset, 98);\n+\n+\tif (rte_bitset_to_str(bitset, 99, buf, sizeof(buf)) != 100)\n+\t\treturn TEST_FAILED;\n+\n+\tif (buf[0] != '1' || strchr(&buf[1], '1') != NULL)\n+\t\treturn TEST_FAILED;\n+\n+\tif (rte_bitset_to_str(bitset, 128, buf, 64) != -EINVAL)\n+\t\treturn TEST_FAILED;\n+\n+\treturn TEST_SUCCESS;\n+}\n+\n+static struct unit_test_suite bitset_tests  = {\n+\t.suite_name = \"bitset test suite\",\n+\t.unit_test_cases = {\n+\t\tTEST_CASE_ST(NULL, NULL, test_set_clear),\n+\t\tTEST_CASE_ST(NULL, NULL, test_flip),\n+\t\tTEST_CASE_ST(NULL, NULL, test_find),\n+\t\tTEST_CASE_ST(NULL, NULL, test_foreach),\n+\t\tTEST_CASE_ST(NULL, NULL, test_count),\n+\t\tTEST_CASE_ST(NULL, NULL, test_define),\n+\t\tTEST_CASE_ST(NULL, NULL, test_or),\n+\t\tTEST_CASE_ST(NULL, NULL, test_and),\n+\t\tTEST_CASE_ST(NULL, NULL, test_xor),\n+\t\tTEST_CASE_ST(NULL, NULL, test_complement),\n+\t\tTEST_CASE_ST(NULL, NULL, test_shift_right),\n+\t\tTEST_CASE_ST(NULL, NULL, test_shift_left),\n+\t\tTEST_CASE_ST(NULL, NULL, test_equal),\n+\t\tTEST_CASE_ST(NULL, NULL, test_copy),\n+\t\tTEST_CASE_ST(NULL, NULL, test_to_str),\n+\t\tTEST_CASES_END()\n+\t}\n+};\n+\n+static int\n+test_bitset(void)\n+{\n+\treturn unit_test_suite_runner(&bitset_tests);\n+}\n+\n+REGISTER_FAST_TEST(bitset_autotest, true, true, test_bitset);\n",
    "prefixes": [
        "RFC",
        "v5",
        "2/6"
    ]
}