From patchwork Sat Nov 4 11:45:50 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Steffan Karger X-Patchwork-Id: 46 Return-Path: Delivered-To: patchwork@openvpn.net Delivered-To: patchwork@openvpn.net Received: from director2.mail.ord1d.rsapps.net ([172.28.255.1]) by backend31.mail.ord1d.rsapps.net (Dovecot) with LMTP id yyttMFND/lmlEAAAgoeIoA for ; Sat, 04 Nov 2017 18:46:43 -0400 Received: from director9.mail.ord1c.rsapps.net ([172.28.255.1]) by director2.mail.ord1d.rsapps.net (Dovecot) with LMTP id iTXgD1ND/ll0BgAAgYhSiA ; Sat, 04 Nov 2017 18:46:43 -0400 Received: from smtp16.gate.ord1c ([172.28.255.1]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) by director9.mail.ord1c.rsapps.net (Dovecot) with LMTP id 9CbfB1ND/lmdEQAA4V03VA ; Sat, 04 Nov 2017 18:46:43 -0400 X-Spam-Threshold: 95 X-Spam-Score: 0 X-Spam-Flag: NO X-Virus-Scanned: OK X-MessageSniffer-Scan-Result: 0 X-MessageSniffer-Rules: 0-298-1214-1423-w 0-298-1214-1787-w 0-298-0-22087-f X-CMAE-Scan-Result: 0 X-CNFS-Analysis: v=2.2 cv=YNPd8lOx c=1 sm=1 tr=0 a=Q8DxjiC8O3VT/NpP1XjEZQ==:117 a=Q8DxjiC8O3VT/NpP1XjEZQ==:17 a=kj9zAlcOel0A:10 a=xqWC_Br6kY4A:10 a=MKtGQD3n3ToA:10 a=1oJP67jkp3AA:10 a=sC3jslCIGhcA:10 a=9hBjR9qptiMA:10 a=WiVod9pSvdkA:10 a=ZZnuYtJkoWoA:10 a=Y4BXLp1PAAAA:8 a=9sSjY8p1AAAA:8 a=P_JWiMecAAAA:8 a=FP58Ms26AAAA:8 a=990ihPT7ISdm3UOO1FAA:9 a=bPaKmlMsd7UaF55c:21 a=cSAhOVYWi6RVjJHX:21 a=CjuIK1q_8ugA:10 a=-FEs8UIgK8oA:10 a=NWVoK91CQyQA:10 a=byfke0vc68LhOSAAcvKj:22 a=ub54wNWiXv_DzeFsgEJW:22 a=D0-HAvA3Hk9NMREbgwuX:22 X-Orig-To: openvpnslackdevel@openvpn.net X-Originating-Ip: [216.34.181.88] Authentication-Results: smtp16.gate.ord1c.rsapps.net; iprev=pass policy.iprev="216.34.181.88"; spf=pass smtp.mailfrom="openvpn-devel-bounces@lists.sourceforge.net" smtp.helo="lists.sourceforge.net"; dkim=fail (signature verification failed) header.d=sourceforge.net; dkim=fail (signature verification failed) header.d=sf.net; dkim=fail (signature verification failed) header.d=karger-me.20150623.gappssmtp.com; dmarc=none (p=nil; dis=none) header.from=karger.me X-Classification-ID: 077a211e-c1b2-11e7-aca7-bc305bf036a4-1-1 Received: from [216.34.181.88] ([216.34.181.88:65436] helo=lists.sourceforge.net) by smtp16.gate.ord1c.rsapps.net (envelope-from ) (ecelerity 4.2.1.56364 r(Core:4.2.1.14)) with ESMTPS (cipher=DHE-RSA-AES256-GCM-SHA384) id 77/59-21063-3534EF95; Sat, 04 Nov 2017 18:46:43 -0400 Received: from localhost ([127.0.0.1] helo=sfs-ml-1.v29.ch3.sourceforge.com) by sfs-ml-1.v29.ch3.sourceforge.com with esmtp (Exim 4.89) (envelope-from ) id 1eB7CY-0002Q1-KF; Sat, 04 Nov 2017 22:46:06 +0000 Received: from sog-mx-3.v43.ch3.sourceforge.com ([172.29.43.193] helo=mx.sourceforge.net) by sfs-ml-1.v29.ch3.sourceforge.com with esmtps (TLSv1:DHE-RSA-AES256-SHA:256) (Exim 4.89) (envelope-from ) id 1eB7CX-0002Pu-5f for openvpn-devel@lists.sourceforge.net; Sat, 04 Nov 2017 22:46:05 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=sourceforge.net; s=x; h=References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From; bh=yK0gTO9b/hmj9lP2CQMPBQOFK2JBPwKS/S6eTaGidMw=; b=Md7ZdiuJCZTJlCVbjZFoCuHNGA4EThshEcrck2EcDN+eeLlb5ujd4XjBBf21hp/Gnns5qVNcbR0grZtZPI0mjOzc8jZ1zHdx9s4jTBD8M9xdONDi4oWM89FbF4WHtFp43eMFtzT3CD0r8oiwsirqwtZ+Wh2i59IltVNY7ZZp+so=; DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=sf.net; s=x; h=References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From; bh=yK0gTO9b/hmj9lP2CQMPBQOFK2JBPwKS/S6eTaGidMw=; b=CD9nvbjhgXLMdhy9gTlvy/IblQPVv0fbt1Rg69jAk9Cg55tN/WUstkgtk4GBoAPobxlcyEU4ydms3MiOUP5axZ2h2LCkhDaaQ661XOKJu/7C6+YPraBKG6+ATIHz0zKW64Qwn0vgMEEyDEoEoOAJff848GqaWJho8wLPIvG4iE0=; Received-SPF: pass (sog-mx-3.v43.ch3.sourceforge.com: domain of karger.me designates 74.125.82.65 as permitted sender) client-ip=74.125.82.65; envelope-from=steffan@karger.me; helo=mail-wm0-f65.google.com; Received: from mail-wm0-f65.google.com ([74.125.82.65]) by sog-mx-3.v43.ch3.sourceforge.com with esmtps (TLSv1:AES128-SHA:128) (Exim 4.76) id 1eB7CU-0001QM-Ti for openvpn-devel@lists.sourceforge.net; Sat, 04 Nov 2017 22:46:05 +0000 Received: by mail-wm0-f65.google.com with SMTP id y80so7421601wmd.0 for ; Sat, 04 Nov 2017 15:46:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=karger-me.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=yK0gTO9b/hmj9lP2CQMPBQOFK2JBPwKS/S6eTaGidMw=; b=fGwPAamUjq8KLOBCSjGnPRNcAJ5f8UGfVO0lBhEDqbgzQA8SiYpm2fsQyzrcH79J9b lJIXUORygoEt2JwYpUc6wePEngbt4r4Dmg9iXfm+ZfGl6OpxQi/OpV8Ib8SSGrtZ9oFU daLnBWGG6gWR8EOd7D01aS9LuNqVXfKi9YvDJcUHUqQC57xHeRMEydyfPsqkbrP51Hj3 nnthX1zSuFBqrXJwYMaCjqM7VX50M32OBT0MIpDBU5gQM3yfV1Wcj/cxCNIM2CsIXOvk I3rGLyr5E7BgGTzsxRNK9rbs6fUb9WryjKQtSMvG2tgYoJ2AKz7iVxlHmAeTUGKyOPOp thCQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=yK0gTO9b/hmj9lP2CQMPBQOFK2JBPwKS/S6eTaGidMw=; b=QvVhE9pmdLFFKH0RzPu38ohSVHyM12uOB9jTcr8jE90KoC6JDkrGIMMiX2pNRvAiu/ 8k5Sz0NtLqEOcWVE4R8jFpRSZSQG8nuCwheG6Dw8Ygxlj1Rqzz+74ghY03axsRZ9H+dk ev1jIPkEpBd6X2ioT3yoFVvbxLuaMjcIJ4Td9DCDaJ7xChE7Hx94NN9l9LqLorWItewS LMI8uvAJtLeY6YryrinjmhJw46PP82NlFeN3KBsdBGbIv9pJcPXQmNE/ixGA5/nkph26 pgCBc8sRPXZWSN5RkPtJ4ER5Z4ZMgzPR6rEdLTQWCvxh9jzIDiTeaZfHoIcr5kqFlW5m iGkw== X-Gm-Message-State: AMCzsaV5+cvg/pmdaHK+ZWY1Kc4pTUWLK1v0GI8irxGzF6kXhfDp/IuA wr/SwF2pusxGVFoWH8hhoCkeiigsfgs= X-Google-Smtp-Source: ABhQp+SzAUdhGu4r9qPTRiNosIH3Az1ss4ss84aUdJy/0qJtMgejp5UwNC8YKsao4sWzX9xudKgg+Q== X-Received: by 10.80.195.4 with SMTP id a4mr14243489edb.142.1509835555860; Sat, 04 Nov 2017 15:45:55 -0700 (PDT) Received: from vesta.fritz.box ([2001:985:e54:1:7860:e181:e877:af4d]) by smtp.gmail.com with ESMTPSA id v17sm8382548eda.70.2017.11.04.15.45.54 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 04 Nov 2017 15:45:54 -0700 (PDT) From: Steffan Karger To: openvpn-devel@lists.sourceforge.net Date: Sat, 4 Nov 2017 23:45:50 +0100 Message-Id: <20171104224551.3079-1-steffan@karger.me> X-Mailer: git-send-email 2.14.1 In-Reply-To: <20171104174756.GX958@greenie.muc.de> References: <20171104174756.GX958@greenie.muc.de> X-Spam-Report: Spam Filtering performed by mx.sourceforge.net. See http://spamassassin.org/tag/ for more details. -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at http://www.dnswl.org/, no trust [74.125.82.65 listed in list.dnswl.org] -1.5 SPF_CHECK_PASS SPF reports sender host as permitted sender for sender-domain 0.5 RCVD_IN_SORBS_SPAM RBL: SORBS: sender is a spam source [74.125.82.65 listed in dnsbl.sorbs.net] -0.0 SPF_PASS SPF: sender matches SPF record 0.1 DKIM_SIGNED Message has a DKIM or DK signature, not necessarily valid -0.1 DKIM_VALID Message has at least one valid DKIM or DK signature -0.0 AWL AWL: Adjusted score from AWL reputation of From: address X-Headers-End: 1eB7CU-0001QM-Ti Subject: [Openvpn-devel] [PATCH v2] buffer_list_aggregate_separator(): add unit tests X-BeenThere: openvpn-devel@lists.sourceforge.net X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: openvpn-devel-bounces@lists.sourceforge.net X-getmail-retrieved-from-mailbox: Inbox From: Steffan Karger Before refactoring this function, add tests to verify the new implementation. While writing the tests, it became clear that this function is not behaving very well. We'll fix that in follow-up commits. Signed-off-by: Steffan Karger --- v2: add assert_buf_equals_str macro, and use that to compare (not zero- terminated) buffer contents with expected strings. tests/unit_tests/openvpn/test_buffer.c | 184 ++++++++++++++++++++++++++++++++- 1 file changed, 182 insertions(+), 2 deletions(-) diff --git a/tests/unit_tests/openvpn/test_buffer.c b/tests/unit_tests/openvpn/test_buffer.c index 69bb2e58..ba5aa670 100644 --- a/tests/unit_tests/openvpn/test_buffer.c +++ b/tests/unit_tests/openvpn/test_buffer.c @@ -35,7 +35,7 @@ #include "buffer.h" static void -buffer_strprefix(void **state) +test_buffer_strprefix(void **state) { assert_true(strprefix("123456", "123456")); assert_true(strprefix("123456", "123")); @@ -44,11 +44,191 @@ buffer_strprefix(void **state) assert_false(strprefix("12", "123")); } +#define testsep "," +#define testnosep "" +#define teststr1 "one" +#define teststr2 "two" +#define teststr3 "three" +#define teststr4 "four" + +#define assert_buf_equals_str(buf, str) \ + assert_int_equal(BLEN(buf), strlen(str)); \ + assert_memory_equal(BPTR(buf), str, BLEN(buf)); + +struct test_buffer_list_aggregate_ctx { + struct buffer_list *empty; + struct buffer_list *one_two_three; + struct buffer_list *zero_length_strings; + struct buffer_list *empty_buffers; +}; + +static int test_buffer_list_setup(void **state) +{ + struct test_buffer_list_aggregate_ctx *ctx = calloc(1, sizeof(*ctx)); + ctx->empty = buffer_list_new(0); + + ctx->one_two_three = buffer_list_new(3); + buffer_list_push(ctx->one_two_three, teststr1); + buffer_list_push(ctx->one_two_three, teststr2); + buffer_list_push(ctx->one_two_three, teststr3); + + ctx->zero_length_strings = buffer_list_new(2); + buffer_list_push(ctx->zero_length_strings, ""); + buffer_list_push(ctx->zero_length_strings, ""); + + ctx->empty_buffers = buffer_list_new(2); + uint8_t *data1 = malloc(1); + uint8_t *data2 = malloc(1); + buffer_list_push_data(ctx->empty_buffers, data1, 0); + buffer_list_push_data(ctx->empty_buffers, data2, 0); + + *state = ctx; + return 0; +} + +static int test_buffer_list_teardown(void **state) +{ + struct test_buffer_list_aggregate_ctx *ctx = *state; + + buffer_list_free(ctx->empty); + buffer_list_free(ctx->one_two_three); + buffer_list_free(ctx->zero_length_strings); + buffer_list_free(ctx->empty_buffers); + free(ctx); + return 0; +} + +static void +test_buffer_list_full(void **state) +{ + struct test_buffer_list_aggregate_ctx *ctx = *state; + + /* list full */ + assert_int_equal(ctx->one_two_three->size, 3); + buffer_list_push(ctx->one_two_three, teststr4); + assert_int_equal(ctx->one_two_three->size, 3); +} + +static void +test_buffer_list_aggregate_separator_empty(void **state) +{ + struct test_buffer_list_aggregate_ctx *ctx = *state; + + /* aggregating an empty buffer list results in an empty buffer list */ + buffer_list_aggregate_separator(ctx->empty, 3, testsep); + assert_null(ctx->empty->head); +} + +static void +test_buffer_list_aggregate_separator_noop(void **state) +{ + struct test_buffer_list_aggregate_ctx *ctx = *state; + + /* With a max length of 2, no aggregation should take place */ + buffer_list_aggregate_separator(ctx->one_two_three, 2, testsep); + assert_int_equal(ctx->one_two_three->size, 3); + struct buffer *buf = buffer_list_peek(ctx->one_two_three); + assert_buf_equals_str(buf, teststr1); +} + +static void +test_buffer_list_aggregate_separator_two(void **state) +{ + struct test_buffer_list_aggregate_ctx *ctx = *state; + + /* Aggregate the first two elements */ + /* FIXME this exceeds the supplied max */ + buffer_list_aggregate_separator(ctx->one_two_three, 4, testsep); + /* FIXME size does not get adjusted after aggregating */ + assert_int_equal(ctx->one_two_three->size, 3); + struct buffer *buf = buffer_list_peek(ctx->one_two_three); + assert_buf_equals_str(buf, teststr1 testsep teststr2 testsep); +} + +static void +test_buffer_list_aggregate_separator_all(void **state) +{ + struct test_buffer_list_aggregate_ctx *ctx = *state; + + /* Aggregate all */ + buffer_list_aggregate_separator(ctx->one_two_three, 1<<16, testsep); + /* FIXME size does not get adjusted after aggregating */ + assert_int_equal(ctx->one_two_three->size, 3); + struct buffer *buf = buffer_list_peek(ctx->one_two_three); + assert_buf_equals_str(buf, + teststr1 testsep teststr2 testsep teststr3 testsep); +} + +static void +test_buffer_list_aggregate_separator_nosep(void **state) +{ + struct test_buffer_list_aggregate_ctx *ctx = *state; + + /* Aggregate all */ + buffer_list_aggregate_separator(ctx->one_two_three, 1<<16, testnosep); + /* FIXME size does not get adjusted after aggregating */ + assert_int_equal(ctx->one_two_three->size, 3); + struct buffer *buf = buffer_list_peek(ctx->one_two_three); + assert_buf_equals_str(buf, teststr1 teststr2 teststr3); +} + +static void +test_buffer_list_aggregate_separator_zerolen(void **state) +{ + struct test_buffer_list_aggregate_ctx *ctx = *state; + struct buffer_list *bl_zerolen = ctx->zero_length_strings; + + /* Aggregate all */ + buffer_list_aggregate_separator(bl_zerolen, 1<<16, testnosep); + /* FIXME size does not get adjusted after aggregating */ + assert_int_equal(bl_zerolen->size, 2); + struct buffer *buf = buffer_list_peek(bl_zerolen); + assert_buf_equals_str(buf, ""); +} + +static void +test_buffer_list_aggregate_separator_emptybuffers(void **state) +{ + struct test_buffer_list_aggregate_ctx *ctx = *state; + struct buffer_list *bl_emptybuffers = ctx->empty_buffers; + + /* Aggregate all */ + buffer_list_aggregate_separator(bl_emptybuffers, 1<<16, testnosep); + /* FIXME size does not get adjusted after aggregating */ + assert_int_equal(bl_emptybuffers->size, 2); + struct buffer *buf = buffer_list_peek(bl_emptybuffers); + assert_int_equal(BLEN(buf), 0); +} + int main(void) { const struct CMUnitTest tests[] = { - cmocka_unit_test(buffer_strprefix), + cmocka_unit_test(test_buffer_strprefix), + cmocka_unit_test_setup_teardown(test_buffer_list_full, + test_buffer_list_setup, + test_buffer_list_teardown), + cmocka_unit_test_setup_teardown(test_buffer_list_aggregate_separator_empty, + test_buffer_list_setup, + test_buffer_list_teardown), + cmocka_unit_test_setup_teardown(test_buffer_list_aggregate_separator_noop, + test_buffer_list_setup, + test_buffer_list_teardown), + cmocka_unit_test_setup_teardown(test_buffer_list_aggregate_separator_two, + test_buffer_list_setup, + test_buffer_list_teardown), + cmocka_unit_test_setup_teardown(test_buffer_list_aggregate_separator_all, + test_buffer_list_setup, + test_buffer_list_teardown), + cmocka_unit_test_setup_teardown(test_buffer_list_aggregate_separator_nosep, + test_buffer_list_setup, + test_buffer_list_teardown), + cmocka_unit_test_setup_teardown(test_buffer_list_aggregate_separator_zerolen, + test_buffer_list_setup, + test_buffer_list_teardown), + cmocka_unit_test_setup_teardown(test_buffer_list_aggregate_separator_emptybuffers, + test_buffer_list_setup, + test_buffer_list_teardown), }; return cmocka_run_group_tests_name("buffer", tests, NULL, NULL);