summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/plugins/unittest/bitmap_test.c50
-rw-r--r--src/vppinfra/bitmap.h2
-rw-r--r--test/asf/test_vppinfra.py15
3 files changed, 57 insertions, 10 deletions
diff --git a/src/plugins/unittest/bitmap_test.c b/src/plugins/unittest/bitmap_test.c
index f01b8bb6811..eb232bd11e5 100644
--- a/src/plugins/unittest/bitmap_test.c
+++ b/src/plugins/unittest/bitmap_test.c
@@ -12,6 +12,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+#include <stdbool.h>
#include <vlib/vlib.h>
#include <vppinfra/bitmap.h>
@@ -52,12 +53,42 @@ done:
}
static clib_error_t *
+check_bitmap_will_expand (const char *test_name, uword **bm, uword index,
+ bool expected_will_expand)
+{
+ uword max_bytes = vec_max_bytes (*bm);
+ bool result;
+
+ result = clib_bitmap_will_expand (*bm, index);
+ if (result != expected_will_expand)
+ {
+ return clib_error_create (
+ "%s failed, wrong "
+ "bitmap's expansion before set (%u != %u expected)",
+ test_name, result, expected_will_expand);
+ }
+
+ *bm = clib_bitmap_set (*bm, index, 1);
+ result = vec_max_bytes (*bm) > max_bytes;
+ if (result != expected_will_expand)
+ {
+ return clib_error_create (
+ "%s failed, wrong "
+ "bitmap's expansion after set (%u != %u expected)",
+ test_name, result, expected_will_expand);
+ }
+
+ return 0;
+}
+
+static clib_error_t *
test_bitmap_command_fn (vlib_main_t * vm,
unformat_input_t * input, vlib_cli_command_t * cmd)
{
clib_error_t *error = 0;
uword *bm = 0;
uword *bm2 = 0;
+ uword *bm3 = 0;
uword *dup = 0;
/* bm should look like:
@@ -162,9 +193,28 @@ test_bitmap_command_fn (vlib_main_t * vm,
if (error != 0)
goto done;
+ error = check_bitmap_will_expand ("clib_bitmap_will_expand 1", &bm, 0, 0);
+ if (error != 0)
+ goto done;
+
+ error = check_bitmap_will_expand ("clib_bitmap_will_expand 2", &bm,
+ vec_max_len (bm) * BITS (uword) - 1, 0);
+ if (error != 0)
+ goto done;
+
+ error = check_bitmap_will_expand ("clib_bitmap_will_expand 3", &bm,
+ vec_max_len (bm) * BITS (uword), 1);
+ if (error != 0)
+ goto done;
+
+ error = check_bitmap_will_expand ("clib_bitmap_will_expand 4", &bm3, 0, 1);
+ if (error != 0)
+ goto done;
+
done:
vec_free (bm);
vec_free (bm2);
+ vec_free (bm3);
vec_free (dup);
return error;
diff --git a/src/vppinfra/bitmap.h b/src/vppinfra/bitmap.h
index d579afd9979..abb1405d3a2 100644
--- a/src/vppinfra/bitmap.h
+++ b/src/vppinfra/bitmap.h
@@ -208,7 +208,7 @@ clib_bitmap_set (uword * ai, uword i, uword value)
always_inline u8
clib_bitmap_will_expand (uword *ai, uword i)
{
- return (i / BITS (ai[0])) < vec_max_len (ai);
+ return (i / BITS (ai[0])) >= vec_max_len (ai);
}
/** Gets the ith bit value from a bitmap
diff --git a/test/asf/test_vppinfra.py b/test/asf/test_vppinfra.py
index 9151eb12c4d..4b49628cf58 100644
--- a/test/asf/test_vppinfra.py
+++ b/test/asf/test_vppinfra.py
@@ -8,8 +8,6 @@ from asfframework import VppTestCase, VppTestRunner
class TestVppinfra(VppTestCase):
"""Vppinfra Unit Test Cases"""
- vpp_worker_count = 1
-
@classmethod
def setUpClass(cls):
super(TestVppinfra, cls).setUpClass()
@@ -25,16 +23,15 @@ class TestVppinfra(VppTestCase):
super(TestVppinfra, self).tearDown()
def test_bitmap_unittest(self):
- """Bitmap Code Coverage Test"""
+ """Bitmap unit tests"""
+
cmds = ["test bitmap"]
for cmd in cmds:
- r = self.vapi.cli_return_response(cmd)
- if r.retval != 0:
- if hasattr(r, "reply"):
- self.logger.info(cmd + " FAIL reply " + r.reply)
- else:
- self.logger.info(cmd + " FAIL retval " + str(r.retval))
+ error = self.vapi.cli(cmd)
+ if error:
+ self.logger.critical(error)
+ self.assertNotIn("failed", error)
if __name__ == "__main__":