diff mbox series

[v3,4/8] tests: add tests for hbitmap_next_dirty_area

Message ID 20180814121443.33114-5-vsementsov@virtuozzo.com
State New
Headers show
Series dirty-bitmap: rewrite bdrv_dirty_iter_next_area | expand

Commit Message

Vladimir Sementsov-Ogievskiy Aug. 14, 2018, 12:14 p.m. UTC
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
---
 tests/test-hbitmap.c | 106 +++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 106 insertions(+)

Comments

John Snow Sept. 10, 2018, 8:45 p.m. UTC | #1
On 08/14/2018 08:14 AM, Vladimir Sementsov-Ogievskiy wrote:
> Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>

ACK, and
Tested-by: John Snow <jsnow@redhat.com>

> ---
>  tests/test-hbitmap.c | 106 +++++++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 106 insertions(+)
> 
> diff --git a/tests/test-hbitmap.c b/tests/test-hbitmap.c
> index dddb67c3c5..af5142b481 100644
> --- a/tests/test-hbitmap.c
> +++ b/tests/test-hbitmap.c
> @@ -1016,6 +1016,105 @@ static void test_hbitmap_next_zero_4(TestHBitmapData *data, const void *unused)
>      test_hbitmap_next_zero_do(data, 4);
>  }
>  
> +static void test_hbitmap_next_dirty_area_check(TestHBitmapData *data,
> +                                               uint64_t offset,
> +                                               uint64_t count)
> +{
> +    uint64_t off1, off2;
> +    uint64_t len1 = 0, len2 = 0;
> +    bool ret1, ret2;
> +    int64_t end;
> +
> +    off1 = offset;
> +    end = count ? offset + count : 0;
> +    ret1 = hbitmap_next_dirty_area(data->hb, &off1, end, &len1);
> +
> +    end = count ? offset + count : data->size;
> +
> +    for (off2 = offset; off2 < end && !hbitmap_get(data->hb, off2); off2++) {
> +        ;
> +    }
> +
> +    for (len2 = 1; off2 + len2 < end && hbitmap_get(data->hb, off2 + len2);
> +         len2++)
> +    {
> +    }
> +
> +    ret2 = off2 < end;
> +    if (!ret2) {
> +        /* leave unchanged */
> +        off2 = offset;
> +        len2 = 0;
> +    }
> +
> +    g_assert_cmpint(ret1, ==, ret2);
> +    g_assert_cmpint(off1, ==, off2);
> +    g_assert_cmpint(len1, ==, len2);
> +}
> +
> +static void test_hbitmap_next_dirty_area_do(TestHBitmapData *data,
> +                                            int granularity)
> +{
> +    hbitmap_test_init(data, L3, granularity);
> +    test_hbitmap_next_dirty_area_check(data, 0, 0);
> +    test_hbitmap_next_dirty_area_check(data, 0, 1);
> +    test_hbitmap_next_dirty_area_check(data, L3 - 1, 1);
> +
> +    hbitmap_set(data->hb, L2, 1);
> +    test_hbitmap_next_dirty_area_check(data, 0, 1);
> +    test_hbitmap_next_dirty_area_check(data, 0, L2);
> +    test_hbitmap_next_dirty_area_check(data, 0, 0);
> +    test_hbitmap_next_dirty_area_check(data, L2 - 1, 0);
> +    test_hbitmap_next_dirty_area_check(data, L2 - 1, 1);
> +    test_hbitmap_next_dirty_area_check(data, L2 - 1, 2);
> +    test_hbitmap_next_dirty_area_check(data, L2 - 1, 3);
> +    test_hbitmap_next_dirty_area_check(data, L2, 0);
> +    test_hbitmap_next_dirty_area_check(data, L2, 1);
> +    test_hbitmap_next_dirty_area_check(data, L2 + 1, 1);
> +
> +    hbitmap_set(data->hb, L2 + 5, L1);
> +    test_hbitmap_next_dirty_area_check(data, 0, 0);
> +    test_hbitmap_next_dirty_area_check(data, L2 - 2, 8);
> +    test_hbitmap_next_dirty_area_check(data, L2 + 1, 5);
> +    test_hbitmap_next_dirty_area_check(data, L2 + 1, 3);
> +    test_hbitmap_next_dirty_area_check(data, L2 + 4, L1);
> +    test_hbitmap_next_dirty_area_check(data, L2 + 5, L1);
> +    test_hbitmap_next_dirty_area_check(data, L2 + 7, L1);
> +    test_hbitmap_next_dirty_area_check(data, L2 + L1, L1);
> +    test_hbitmap_next_dirty_area_check(data, L2, 0);
> +    test_hbitmap_next_dirty_area_check(data, L2 + 1, 0);
> +
> +    hbitmap_set(data->hb, L2 * 2, L3 - L2 * 2);
> +    test_hbitmap_next_dirty_area_check(data, 0, 0);
> +    test_hbitmap_next_dirty_area_check(data, L2, 0);
> +    test_hbitmap_next_dirty_area_check(data, L2 + 1, 0);
> +    test_hbitmap_next_dirty_area_check(data, L2 + 5 + L1 - 1, 0);
> +    test_hbitmap_next_dirty_area_check(data, L2 + 5 + L1, 5);
> +    test_hbitmap_next_dirty_area_check(data, L2 * 2 - L1, L1 + 1);
> +    test_hbitmap_next_dirty_area_check(data, L2 * 2, L2);
> +
> +    hbitmap_set(data->hb, 0, L3);
> +    test_hbitmap_next_dirty_area_check(data, 0, 0);
> +}
> +
> +static void test_hbitmap_next_dirty_area_0(TestHBitmapData *data,
> +                                           const void *unused)
> +{
> +    test_hbitmap_next_dirty_area_do(data, 0);
> +}
> +
> +static void test_hbitmap_next_dirty_area_1(TestHBitmapData *data,
> +                                           const void *unused)
> +{
> +    test_hbitmap_next_dirty_area_do(data, 1);
> +}
> +
> +static void test_hbitmap_next_dirty_area_4(TestHBitmapData *data,
> +                                           const void *unused)
> +{
> +    test_hbitmap_next_dirty_area_do(data, 4);
> +}
> +
>  int main(int argc, char **argv)
>  {
>      g_test_init(&argc, &argv, NULL);
> @@ -1082,6 +1181,13 @@ int main(int argc, char **argv)
>      hbitmap_test_add("/hbitmap/next_zero/next_zero_4",
>                       test_hbitmap_next_zero_4);
>  
> +    hbitmap_test_add("/hbitmap/next_dirty_area/next_dirty_area_0",
> +                     test_hbitmap_next_dirty_area_0);
> +    hbitmap_test_add("/hbitmap/next_dirty_area/next_dirty_area_1",
> +                     test_hbitmap_next_dirty_area_1);
> +    hbitmap_test_add("/hbitmap/next_dirty_area/next_dirty_area_4",
> +                     test_hbitmap_next_dirty_area_4);
> +
>      g_test_run();
>  
>      return 0;
>
diff mbox series

Patch

diff --git a/tests/test-hbitmap.c b/tests/test-hbitmap.c
index dddb67c3c5..af5142b481 100644
--- a/tests/test-hbitmap.c
+++ b/tests/test-hbitmap.c
@@ -1016,6 +1016,105 @@  static void test_hbitmap_next_zero_4(TestHBitmapData *data, const void *unused)
     test_hbitmap_next_zero_do(data, 4);
 }
 
+static void test_hbitmap_next_dirty_area_check(TestHBitmapData *data,
+                                               uint64_t offset,
+                                               uint64_t count)
+{
+    uint64_t off1, off2;
+    uint64_t len1 = 0, len2 = 0;
+    bool ret1, ret2;
+    int64_t end;
+
+    off1 = offset;
+    end = count ? offset + count : 0;
+    ret1 = hbitmap_next_dirty_area(data->hb, &off1, end, &len1);
+
+    end = count ? offset + count : data->size;
+
+    for (off2 = offset; off2 < end && !hbitmap_get(data->hb, off2); off2++) {
+        ;
+    }
+
+    for (len2 = 1; off2 + len2 < end && hbitmap_get(data->hb, off2 + len2);
+         len2++)
+    {
+    }
+
+    ret2 = off2 < end;
+    if (!ret2) {
+        /* leave unchanged */
+        off2 = offset;
+        len2 = 0;
+    }
+
+    g_assert_cmpint(ret1, ==, ret2);
+    g_assert_cmpint(off1, ==, off2);
+    g_assert_cmpint(len1, ==, len2);
+}
+
+static void test_hbitmap_next_dirty_area_do(TestHBitmapData *data,
+                                            int granularity)
+{
+    hbitmap_test_init(data, L3, granularity);
+    test_hbitmap_next_dirty_area_check(data, 0, 0);
+    test_hbitmap_next_dirty_area_check(data, 0, 1);
+    test_hbitmap_next_dirty_area_check(data, L3 - 1, 1);
+
+    hbitmap_set(data->hb, L2, 1);
+    test_hbitmap_next_dirty_area_check(data, 0, 1);
+    test_hbitmap_next_dirty_area_check(data, 0, L2);
+    test_hbitmap_next_dirty_area_check(data, 0, 0);
+    test_hbitmap_next_dirty_area_check(data, L2 - 1, 0);
+    test_hbitmap_next_dirty_area_check(data, L2 - 1, 1);
+    test_hbitmap_next_dirty_area_check(data, L2 - 1, 2);
+    test_hbitmap_next_dirty_area_check(data, L2 - 1, 3);
+    test_hbitmap_next_dirty_area_check(data, L2, 0);
+    test_hbitmap_next_dirty_area_check(data, L2, 1);
+    test_hbitmap_next_dirty_area_check(data, L2 + 1, 1);
+
+    hbitmap_set(data->hb, L2 + 5, L1);
+    test_hbitmap_next_dirty_area_check(data, 0, 0);
+    test_hbitmap_next_dirty_area_check(data, L2 - 2, 8);
+    test_hbitmap_next_dirty_area_check(data, L2 + 1, 5);
+    test_hbitmap_next_dirty_area_check(data, L2 + 1, 3);
+    test_hbitmap_next_dirty_area_check(data, L2 + 4, L1);
+    test_hbitmap_next_dirty_area_check(data, L2 + 5, L1);
+    test_hbitmap_next_dirty_area_check(data, L2 + 7, L1);
+    test_hbitmap_next_dirty_area_check(data, L2 + L1, L1);
+    test_hbitmap_next_dirty_area_check(data, L2, 0);
+    test_hbitmap_next_dirty_area_check(data, L2 + 1, 0);
+
+    hbitmap_set(data->hb, L2 * 2, L3 - L2 * 2);
+    test_hbitmap_next_dirty_area_check(data, 0, 0);
+    test_hbitmap_next_dirty_area_check(data, L2, 0);
+    test_hbitmap_next_dirty_area_check(data, L2 + 1, 0);
+    test_hbitmap_next_dirty_area_check(data, L2 + 5 + L1 - 1, 0);
+    test_hbitmap_next_dirty_area_check(data, L2 + 5 + L1, 5);
+    test_hbitmap_next_dirty_area_check(data, L2 * 2 - L1, L1 + 1);
+    test_hbitmap_next_dirty_area_check(data, L2 * 2, L2);
+
+    hbitmap_set(data->hb, 0, L3);
+    test_hbitmap_next_dirty_area_check(data, 0, 0);
+}
+
+static void test_hbitmap_next_dirty_area_0(TestHBitmapData *data,
+                                           const void *unused)
+{
+    test_hbitmap_next_dirty_area_do(data, 0);
+}
+
+static void test_hbitmap_next_dirty_area_1(TestHBitmapData *data,
+                                           const void *unused)
+{
+    test_hbitmap_next_dirty_area_do(data, 1);
+}
+
+static void test_hbitmap_next_dirty_area_4(TestHBitmapData *data,
+                                           const void *unused)
+{
+    test_hbitmap_next_dirty_area_do(data, 4);
+}
+
 int main(int argc, char **argv)
 {
     g_test_init(&argc, &argv, NULL);
@@ -1082,6 +1181,13 @@  int main(int argc, char **argv)
     hbitmap_test_add("/hbitmap/next_zero/next_zero_4",
                      test_hbitmap_next_zero_4);
 
+    hbitmap_test_add("/hbitmap/next_dirty_area/next_dirty_area_0",
+                     test_hbitmap_next_dirty_area_0);
+    hbitmap_test_add("/hbitmap/next_dirty_area/next_dirty_area_1",
+                     test_hbitmap_next_dirty_area_1);
+    hbitmap_test_add("/hbitmap/next_dirty_area/next_dirty_area_4",
+                     test_hbitmap_next_dirty_area_4);
+
     g_test_run();
 
     return 0;