From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from NAM02-BL2-obe.outbound.protection.outlook.com (mail-bl2nam02on0078.outbound.protection.outlook.com [104.47.38.78]) by dpdk.org (Postfix) with ESMTP id 3F1A62C2E for ; Thu, 11 Jan 2018 11:29:25 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=CAVIUMNETWORKS.onmicrosoft.com; s=selector1-cavium-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=FIdOjXQZRuFlRx4ZAcWMmiB6E/Af4H+rlai/iOq3JBY=; b=Sx0aPT/uqSxakFKhbCOuCwsjS4XxIXwgAXeRwhr9EsCJYq10Gx9aTimylMnYyU2NLnsf+ppn0l7GArynSYAeqGj2JG3h9S7EvkgB91JaUs1kv6qlhgGpkkz6YarLF3n43044T7DyClYRCIxg+qaiaP0xNV8gIRZTkLO19RCPCJQ= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Pavan.Bhagavatula@cavium.com; Received: from Pavan-LT (111.93.218.67) by DM5PR07MB3467.namprd07.prod.outlook.com (10.164.153.22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.386.5; Thu, 11 Jan 2018 10:29:22 +0000 Date: Thu, 11 Jan 2018 15:59:11 +0530 From: Pavan Nikhilesh To: thomas@monjalon.net Cc: dev@dpdk.org Message-ID: <20180111102910.fchcf42jm6usbz2l@Pavan-LT> References: <20171212192713.17620-1-pbhagavatula@caviumnetworks.com> <20180111102156.12726-1-pbhagavatula@caviumnetworks.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20180111102156.12726-1-pbhagavatula@caviumnetworks.com> User-Agent: NeoMutt/20170609 (1.8.3) X-Originating-IP: [111.93.218.67] X-ClientProxiedBy: BN6PR16CA0018.namprd16.prod.outlook.com (10.172.212.156) To DM5PR07MB3467.namprd07.prod.outlook.com (10.164.153.22) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 34285644-028d-44f4-a3b6-08d558de2f30 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(4534020)(4602075)(4627115)(201703031133081)(201702281549075)(5600026)(4604075)(2017052603307)(7153060)(7193020); SRVR:DM5PR07MB3467; X-Microsoft-Exchange-Diagnostics: 1; DM5PR07MB3467; 3:mT/HRHYFn8UbXI0thH7N038Vx1sCZwd201gbabbFRl6Bjbp9ms+DhsZcPvvsPOAd2nrfNfDWODFj/uyculdITsLHG2GCYi5kHMWsbByJ16YVf2hyA2Qr3+fanZZ51LLtvl5/XppvtjQD0k3OUx486h2Puq5PB2MxOEetKDDga4uyPMWTIllY5t81Mz/IFaF+Violrom6WZhXQBedui8MBHzpumpn45cGtbILnBmImLw9OaTdDWiY+cTKMfs1+99U; 25:7qUGVUr144JJF3U+JpgcShZYRVqPF3CFAoA1S3PWSA4+vhHX/U3y3akkUH7RhTac5X3FgOQQyE745WlMaJpK33Ghj68P2cMSXgx/gLOYNmfl0b6POufNJ6mPWlda2EcJjciJwh2Kzt55yXkWaEO3Usny7w3gJmZ6bNz84B7a+OTN4F4buvOfBc+mA12xJhs3fOw0I7IixiSpaPD4QgMV2ibJeCbPN+Axz8YzOYu45/21ZbHyt3xPA3OvCp7im6BFU3VKUl/P9nlGVr+/TM2qE2y5EuAaLpRsqiyhPO/05bwm/kqheFVyXYG8Wmh49byNyU9uZBaj6NzQCSXo+OjdgQ==; 31:XaI60G7Exzc/dPgWElD1yp+jIfIyght2g5V2BcMu93DuTOBKBfaX4N10VezNSulsKEJzord30o5ggRdKYrDxzkzFRQ3btaK6fFZ2tCQU7dUwA0qHpKWnZzOBlM9oQu6+VtJmiyouVls4BgwYxhnt3mPFWrp/1LxtNshXAXNeZycEJyzS8/LZunAb9hs/ank4DLGQtbiZISnyhNjNO84zhwNpZ+mpcFhKg3/tq16l5SE= X-MS-TrafficTypeDiagnostic: DM5PR07MB3467: X-Microsoft-Exchange-Diagnostics: 1; DM5PR07MB3467; 20:Bgt1/dbsdiHXoR7/ki/HfXeoyV0rL4AjMLtTXP8ANY1xCXGMVxsa76PA17/YAaTZDXbCmIqA6EBlOf5smVOOosE4ZXjjZtICDfto30418AfQzE0p4AohAVumdS3cUDIDoVGQYOYnV/V7fugRnE4tvgbifNutaekqOwByXp7JzfYZCorQgmMuKRRALfnaSygJ8oNcLRo8SnSqJqu6zPLQhl+0pqfmMnel2ZGU/rBQd+aDFhbKAG3ibsDL2/62t5aCwsJf8bO2FBpSJ4DasV6xwyuFymeeY2Hf357roEhXsKQsZ4e1xJcg2pndc1tj6h3iLKMRPQ98RpYMd2TL6FnDvCXIaXgzA9YNErXzyBKPfu2PX1Xoh+3Lja0+eAvZ7FeCQ+OAns0RxspT5NR7ass0p8k6AydCNmSjMHJGstoe/GXIdIojKXlemY2VG+zcOBcm2i4SFsFvTSqkKlNUIGzc6pDB4CntU2kLPoCcurys6uvkYuLUG3Mj5ylLrQIN7B/sfdyLbdG97kLULPvgn87osRyzplFyNExgwakYT/Bl5DaJ/bnc0JWCX76zGx6lnRmc96yV0rNk67i5bOS2mCvjK74cxLNgq6J60XGBvL09Tqs=; 4:nPmXmD6PorQL2KqkLy1XJ/iTft1xW4sZ+eaQMU3ElxdBWQaXF1Sk+BhVS46lQipdTzBSsOu8pk70DDYoQvu+qxEecZHyhEYcJYDJPC5LE4e76Ob78TWAbtn4q47ERturrnSps6gUvDb7xhpgycDiqgcg03lnz+nhUadGgfplszHrhi6SJQl4rUV76mR6CcVbaH9ymd2eHLyaFPO0e3D5n0hFiGIP7vgCID6iq5Iz0cP7kTlmi+PjJducSvXxpKidLhIPshQuGFup8d210OlTiA== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040470)(2401047)(8121501046)(5005006)(3231023)(944501075)(3002001)(10201501046)(93006095)(6041268)(20161123560045)(20161123562045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123558120)(20161123564045)(6072148)(201708071742011); SRVR:DM5PR07MB3467; BCL:0; PCL:0; RULEID:(100000803101)(100110400095); SRVR:DM5PR07MB3467; X-Forefront-PRVS: 0549E6FD50 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(39380400002)(346002)(39860400002)(376002)(396003)(366004)(24454002)(189003)(199004)(2351001)(6916009)(55016002)(575784001)(50466002)(229853002)(5009440100003)(305945005)(7736002)(16586007)(6496006)(316002)(83506002)(2950100002)(2361001)(9686003)(47776003)(6666003)(58126008)(16526018)(4326008)(6246003)(42882006)(52116002)(97736004)(66066001)(33896004)(8936002)(59450400001)(6116002)(2906002)(25786009)(81166006)(3846002)(53936002)(81156014)(76176011)(386003)(33716001)(68736007)(106356001)(8676002)(23726003)(105586002)(5660300001)(478600001)(1076002)(72206003)(107986001)(42262002); DIR:OUT; SFP:1101; SCL:1; SRVR:DM5PR07MB3467; H:Pavan-LT; FPR:; SPF:None; PTR:InfoNoRecords; MX:1; A:1; LANG:en; Received-SPF: None (protection.outlook.com: cavium.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; DM5PR07MB3467; 23:KaHq/DrvmwIACuZq7C6oYtD0UDaUmoYxZaXt5PWpy?= =?us-ascii?Q?DUyv9E7PiVAGgDR75TwyRWbuZvBQ6Kvch2NqTECA1qLt9kBDJ61ssfOQ5ucF?= =?us-ascii?Q?4n09g/J+lJk1T4MsYwWQJXuLO1sgyVrdKJaLTpQ2HeomyQKux8XqTyIY/1Hy?= =?us-ascii?Q?QA+MVyqjyRcS1DsgDLVwhLYo4NnlrBfuUvO12aC76ptvbOCJcx1pGZGQYNbX?= =?us-ascii?Q?qqKkWbAudV+MHuTcil8EJYUEf+YBaEoGS7JaJTngNPFAhQxfhXy4fN70e0qs?= =?us-ascii?Q?SA6J4o/db2YJuggVAZ4xgmBZ2PPJtfl2IzYmUv0StPYA7Ntc6e+Cz2X9ld24?= =?us-ascii?Q?mVGOL3ECc8LFH5b0GeAYRqAOa9f6ghYMjpNYOnZ7LL1r/FY0BpKkFxdJYbJO?= =?us-ascii?Q?vUHZUW0tuU4jN01VU3AZmD9IY4Kl7AEdYIOlt3RlozXJ+eC1eFx92SUkDC8/?= =?us-ascii?Q?SVS11cm03UwGZfbwEJval2YKKLhx8qVj1SViOV7p68bDT86r/cpAWApEZlk9?= =?us-ascii?Q?RdNHaV4A+5s+GDxK9oY+1sNNHidrfaa0GtG4zXLHhOgkxE9cYkV5cevo6TPd?= =?us-ascii?Q?jxsZ+JhGiRmt1pUcObB76u79YsG9mJWn/HHdv4GIjZri3n/AcVxb1DO371nS?= =?us-ascii?Q?+EbJGc9q/9CyPBBQPRau/EnpNFQ0/HNnwCOQEuyqbws2gXK49CGKXu6JsFS4?= =?us-ascii?Q?5f0C6gRfR03djNAagUPHksDa2cyQEDpEEf6xuZGikhB4fTV9dTeP+vfO8ipI?= =?us-ascii?Q?JQSrLH4MGNTSOOyjFPTIiYDHD9oRd+cLepRwyzknkDmnuFocQjsAfC+EH6e0?= =?us-ascii?Q?1ybPOdbZHArfmGDLPdLAeorNq2vr9N4wqdES219Q0LdhzajcjcxsR2kDzlSE?= =?us-ascii?Q?Dz7xrZOweTvPz9A2LiC9dI3NiCow9bl/wf88xvRCl9c07zLV+6qcCkjgkS77?= =?us-ascii?Q?IdSj83XTI1zx6bwEI4TmsmzmZr2usz7PIPbzN+sp/8xQ+Hq7334Yldl8K885?= =?us-ascii?Q?3IpZ1MlEMSi8eVzEFXEb3VBqON1KncXoTtmIWP6RRrEiet4qM2DCDQBw1MXM?= =?us-ascii?Q?G794PX7GO+MgaUdQpj3/r6bPNQau//w5dfRYegnTIusMZ1ahY6KrYkaewmhc?= =?us-ascii?Q?nv+M2ycRRgwMRsurBpHcu2Cmb85WFPWr+cC+JlDnvafd3GbUlhrOYqYpK/Hn?= =?us-ascii?Q?1fvhjFd13CAOidMmD+4XJy+JCa9V6qmadEeL7mPHYkaMBuK+rSR3LAsJvwQl?= =?us-ascii?Q?Ojxg71cJAaOqdgUmvgfHJUSnAvj9bGah4rawF7UvLiEgidiDuMJzwXJHUX1Q?= =?us-ascii?Q?+E3P/Q2pH07B/3UGtbgqWu2/Ur5NFRCaQ0sD8QI2JqqWjRcn+Z0CramFlbE6?= =?us-ascii?Q?8PIKA=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1; DM5PR07MB3467; 6:2wQaB8teHm+uBiVtEo5FYVATS3bMYXGx0QZl+0F2gilrKSvbplSJGeuNAebNBncFQZzF40jTbRSpQqGHlSWNJNPjy1yTpO9yrdH/mSh6/Zb7ppL2gITBAXBKLyFNByLlIRaa5M1Qp2ZUiSLQhisK8lGffeJ6okO3egn73IycgqUPcsEM+6n8huVJFMJQQiidI5Bf3wjb/nOiuamMhZAdK7HHIhkyAfZcEtL0W8ijQytJyDdUtiUO02Bx/QMGo6/DlsuLbhWNvipQ9xsN6mF/u6u+6n+z0N6XjxcRe3D59wqkFufAL6C9a4DUTSbV2Zr4L9hAKyY6OBlU2TYgCfYasxXatrzi52x47NZpCc4T1jc=; 5:iR4RsLLzyUdKB6XDMqTpVAWGIsHQ4VOWj7uDrDJkD9xN9dgzx2pq3LnQpccDqy/k7pASAJtzX8u2rAczghCpD6CItFlZGWQrAF9QOTgsmyJw4Xw1vkqll76AGnPOrdY6JieZlNx67oKbdRkytZ68iVb9i5bbL3ODH3v/YZ8CEVE=; 24:PLQzsrh1nt0+aqUGXRz9Qq1tXD3/IlaM1pwfWJNWB0IfeOSGmDd3iL2ZX5Ly1RPxjbBsNC28TO03kLlSHKs8iRXlloF7lFKjLJOv3r9Ng9w=; 7:KabvnYvxu/bVpwOasAUWcU7sY8tXfQT+XZEaXckF7HJQf75ckw05beEAN056JLLtOgVX7HiIMVMi35xuI+CXR67pR1mwK96yNVt4mkLrkgrVCuyPFKOery2xcUt6VJoDncbkWrMQbqLoA4qTHqpmOFo2LscAFmRrXxYLSPBvy7j4uhGukDuuva12eE4XV/zw0SpCNV06d/8LKBT3pCX4wD83B0iv6dx9uXFlaHwl0tOytCf6yxMgiCqWNx/qsx+P SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: caviumnetworks.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 Jan 2018 10:29:22.3150 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 34285644-028d-44f4-a3b6-08d558de2f30 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 711e4ccf-2e9b-4bcf-a551-4094005b6194 X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM5PR07MB3467 Subject: Re: [dpdk-dev] [PATCH v5 01/11] eal: add common test assert macros X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 11 Jan 2018 10:29:25 -0000 +Cc: thomas@monjalon.net On Thu, Jan 11, 2018 at 03:51:46PM +0530, Pavan Nikhilesh wrote: > Adding common test assertion macros for unit testing. > Replaced common macros in test/test.h with new RTE_TEST_ASSERT_* macros. > > Signed-off-by: Pavan Nikhilesh > Acked-by: Jerin Jacob > --- > > v5 Changes: > - rebase patchset > - remove duplication between test/test/test.h and rte_test.h by mapping > RTE_TEST_ASSERT* macros to test.h > > v4 Changes: > - add SPDX licence tags. > - change octeontx selftest name to 'ssovf_evdev_selftest' > > v3 Changes: > - add eventdev driver specific selftest to test/test > > v2 Changes: > - remove duplications of test macros. > - add selftest to test/test. > - remove selftest devargs from sw eventdev. > > lib/librte_eal/common/Makefile | 2 +- > lib/librte_eal/common/include/rte_test.h | 46 +++++++++++++++++++++ > test/test/test.h | 70 +++++--------------------------- > 3 files changed, 58 insertions(+), 60 deletions(-) > create mode 100644 lib/librte_eal/common/include/rte_test.h > > diff --git a/lib/librte_eal/common/Makefile b/lib/librte_eal/common/Makefile > index 9effd0d45..eba1059f2 100644 > --- a/lib/librte_eal/common/Makefile > +++ b/lib/librte_eal/common/Makefile > @@ -43,7 +43,7 @@ INC += rte_hexdump.h rte_devargs.h rte_bus.h rte_dev.h > INC += rte_pci_dev_feature_defs.h rte_pci_dev_features.h > INC += rte_malloc.h rte_keepalive.h rte_time.h > INC += rte_service.h rte_service_component.h > -INC += rte_bitmap.h rte_vfio.h > +INC += rte_bitmap.h rte_vfio.h rte_test.h > > GENERIC_INC := rte_atomic.h rte_byteorder.h rte_cycles.h rte_prefetch.h > GENERIC_INC += rte_spinlock.h rte_memcpy.h rte_cpuflags.h rte_rwlock.h > diff --git a/lib/librte_eal/common/include/rte_test.h b/lib/librte_eal/common/include/rte_test.h > new file mode 100644 > index 000000000..89e47f47a > --- /dev/null > +++ b/lib/librte_eal/common/include/rte_test.h > @@ -0,0 +1,46 @@ > +/* SPDX-License-Identifier: BSD-3-Clause > + * Copyright(c) 2015 Cavium, Inc > + */ > + > +#ifndef _RTE_TEST_H_ > +#define _RTE_TEST_H_ > + > +#include > + > +/* Before including rte_test.h file you can define > + * RTE_TEST_TRACE_FAILURE(_file, _line, _func) macro to better trace/debug test > + * failures. Mostly useful in development phase. > + */ > +#ifndef RTE_TEST_TRACE_FAILURE > +#define RTE_TEST_TRACE_FAILURE(_file, _line, _func) > +#endif > + > + > +#define RTE_TEST_ASSERT(cond, msg, ...) do { \ > + if (!(cond)) { \ > + RTE_LOG(DEBUG, EAL, "Test assert %s line %d failed: " \ > + msg "\n", __func__, __LINE__, ##__VA_ARGS__); \ > + RTE_TEST_TRACE_FAILURE(__FILE__, __LINE__, __func__); \ > + return -1; \ > + } \ > +} while (0) > + > +#define RTE_TEST_ASSERT_EQUAL(a, b, msg, ...) \ > + RTE_TEST_ASSERT(a == b, msg, ##__VA_ARGS__) > + > +#define RTE_TEST_ASSERT_NOT_EQUAL(a, b, msg, ...) \ > + RTE_TEST_ASSERT(a != b, msg, ##__VA_ARGS__) > + > +#define RTE_TEST_ASSERT_SUCCESS(val, msg, ...) \ > + RTE_TEST_ASSERT(val == 0, msg, ##__VA_ARGS__) > + > +#define RTE_TEST_ASSERT_FAIL(val, msg, ...) \ > + RTE_TEST_ASSERT(val != 0, msg, ##__VA_ARGS__) > + > +#define RTE_TEST_ASSERT_NULL(val, msg, ...) \ > + RTE_TEST_ASSERT(val == NULL, msg, ##__VA_ARGS__) > + > +#define RTE_TEST_ASSERT_NOT_NULL(val, msg, ...) \ > + RTE_TEST_ASSERT(val != NULL, msg, ##__VA_ARGS__) > + > +#endif /* _RTE_TEST_H_ */ > diff --git a/test/test/test.h b/test/test/test.h > index 08ffe949c..0ea18586c 100644 > --- a/test/test/test.h > +++ b/test/test/test.h > @@ -38,7 +38,6 @@ > #include > > #include > -#include > > #define TEST_SUCCESS (0) > #define TEST_FAILED (-1) > @@ -50,23 +49,13 @@ > # define TEST_TRACE_FAILURE(_file, _line, _func) > #endif > > -#define TEST_ASSERT(cond, msg, ...) do { \ > - if (!(cond)) { \ > - printf("TestCase %s() line %d failed: " \ > - msg "\n", __func__, __LINE__, ##__VA_ARGS__); \ > - TEST_TRACE_FAILURE(__FILE__, __LINE__, __func__); \ > - return TEST_FAILED; \ > - } \ > -} while (0) > +#define RTE_TEST_TRACE_FAILURE TEST_TRACE_FAILURE > > -#define TEST_ASSERT_EQUAL(a, b, msg, ...) do { \ > - if (!(a == b)) { \ > - printf("TestCase %s() line %d failed: " \ > - msg "\n", __func__, __LINE__, ##__VA_ARGS__); \ > - TEST_TRACE_FAILURE(__FILE__, __LINE__, __func__); \ > - return TEST_FAILED; \ > - } \ > -} while (0) > +#include > + > +#define TEST_ASSERT RTE_TEST_ASSERT > + > +#define TEST_ASSERT_EQUAL RTE_TEST_ASSERT_EQUAL > > /* Compare two buffers (length in bytes) */ > #define TEST_ASSERT_BUFFERS_ARE_EQUAL(a, b, len, msg, ...) do { \ > @@ -134,52 +123,15 @@ > } \ > } while (0) > > -#define TEST_ASSERT_NOT_EQUAL(a, b, msg, ...) do { \ > - if (!(a != b)) { \ > - printf("TestCase %s() line %d failed: " \ > - msg "\n", __func__, __LINE__, ##__VA_ARGS__); \ > - TEST_TRACE_FAILURE(__FILE__, __LINE__, __func__); \ > - return TEST_FAILED; \ > - } \ > -} while (0) > +#define TEST_ASSERT_NOT_EQUAL RTE_TEST_ASSERT_NOT_EQUAL > > -#define TEST_ASSERT_SUCCESS(val, msg, ...) do { \ > - typeof(val) _val = (val); \ > - if (!(_val == 0)) { \ > - printf("TestCase %s() line %d failed (err %d): " \ > - msg "\n", __func__, __LINE__, _val, \ > - ##__VA_ARGS__); \ > - TEST_TRACE_FAILURE(__FILE__, __LINE__, __func__); \ > - return TEST_FAILED; \ > - } \ > -} while (0) > +#define TEST_ASSERT_SUCCESS RTE_TEST_ASSERT_SUCCESS > > -#define TEST_ASSERT_FAIL(val, msg, ...) do { \ > - if (!(val != 0)) { \ > - printf("TestCase %s() line %d failed: " \ > - msg "\n", __func__, __LINE__, ##__VA_ARGS__); \ > - TEST_TRACE_FAILURE(__FILE__, __LINE__, __func__); \ > - return TEST_FAILED; \ > - } \ > -} while (0) > +#define TEST_ASSERT_FAIL RTE_TEST_ASSERT_FAIL > > -#define TEST_ASSERT_NULL(val, msg, ...) do { \ > - if (!(val == NULL)) { \ > - printf("TestCase %s() line %d failed: " \ > - msg "\n", __func__, __LINE__, ##__VA_ARGS__); \ > - TEST_TRACE_FAILURE(__FILE__, __LINE__, __func__); \ > - return TEST_FAILED; \ > - } \ > -} while (0) > +#define TEST_ASSERT_NULL RTE_TEST_ASSERT_NULL > > -#define TEST_ASSERT_NOT_NULL(val, msg, ...) do { \ > - if (!(val != NULL)) { \ > - printf("TestCase %s() line %d failed: " \ > - msg "\n", __func__, __LINE__, ##__VA_ARGS__); \ > - TEST_TRACE_FAILURE(__FILE__, __LINE__, __func__); \ > - return TEST_FAILED; \ > - } \ > -} while (0) > +#define TEST_ASSERT_NOT_NULL RTE_TEST_ASSERT_NOT_NULL > > struct unit_test_case { > int (*setup)(void); > -- > 2.15.1 >