diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/plugins/unittest/bitmap_test.c | 50 | ||||
-rw-r--r-- | src/vppinfra/bitmap.h | 2 |
2 files changed, 51 insertions, 1 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 |