xref: /qemu/tests/unit/test-write-threshold.c (revision e2462113b2003085ad16f15e1442ded64e2d9a29)
1*e2462113SFrancesco Romani /*
2*e2462113SFrancesco Romani  * Test block device write threshold
3*e2462113SFrancesco Romani  *
4*e2462113SFrancesco Romani  * This work is licensed under the terms of the GNU LGPL, version 2 or later.
5*e2462113SFrancesco Romani  * See the COPYING.LIB file in the top-level directory.
6*e2462113SFrancesco Romani  *
7*e2462113SFrancesco Romani  */
8*e2462113SFrancesco Romani 
9*e2462113SFrancesco Romani #include <glib.h>
10*e2462113SFrancesco Romani #include <stdint.h>
11*e2462113SFrancesco Romani #include "block/block_int.h"
12*e2462113SFrancesco Romani #include "block/write-threshold.h"
13*e2462113SFrancesco Romani 
14*e2462113SFrancesco Romani 
15*e2462113SFrancesco Romani static void test_threshold_not_set_on_init(void)
16*e2462113SFrancesco Romani {
17*e2462113SFrancesco Romani     uint64_t res;
18*e2462113SFrancesco Romani     BlockDriverState bs;
19*e2462113SFrancesco Romani     memset(&bs, 0, sizeof(bs));
20*e2462113SFrancesco Romani 
21*e2462113SFrancesco Romani     g_assert(!bdrv_write_threshold_is_set(&bs));
22*e2462113SFrancesco Romani 
23*e2462113SFrancesco Romani     res = bdrv_write_threshold_get(&bs);
24*e2462113SFrancesco Romani     g_assert_cmpint(res, ==, 0);
25*e2462113SFrancesco Romani }
26*e2462113SFrancesco Romani 
27*e2462113SFrancesco Romani static void test_threshold_set_get(void)
28*e2462113SFrancesco Romani {
29*e2462113SFrancesco Romani     uint64_t threshold = 4 * 1024 * 1024;
30*e2462113SFrancesco Romani     uint64_t res;
31*e2462113SFrancesco Romani     BlockDriverState bs;
32*e2462113SFrancesco Romani     memset(&bs, 0, sizeof(bs));
33*e2462113SFrancesco Romani 
34*e2462113SFrancesco Romani     bdrv_write_threshold_set(&bs, threshold);
35*e2462113SFrancesco Romani 
36*e2462113SFrancesco Romani     g_assert(bdrv_write_threshold_is_set(&bs));
37*e2462113SFrancesco Romani 
38*e2462113SFrancesco Romani     res = bdrv_write_threshold_get(&bs);
39*e2462113SFrancesco Romani     g_assert_cmpint(res, ==, threshold);
40*e2462113SFrancesco Romani }
41*e2462113SFrancesco Romani 
42*e2462113SFrancesco Romani static void test_threshold_multi_set_get(void)
43*e2462113SFrancesco Romani {
44*e2462113SFrancesco Romani     uint64_t threshold1 = 4 * 1024 * 1024;
45*e2462113SFrancesco Romani     uint64_t threshold2 = 15 * 1024 * 1024;
46*e2462113SFrancesco Romani     uint64_t res;
47*e2462113SFrancesco Romani     BlockDriverState bs;
48*e2462113SFrancesco Romani     memset(&bs, 0, sizeof(bs));
49*e2462113SFrancesco Romani 
50*e2462113SFrancesco Romani     bdrv_write_threshold_set(&bs, threshold1);
51*e2462113SFrancesco Romani     bdrv_write_threshold_set(&bs, threshold2);
52*e2462113SFrancesco Romani     res = bdrv_write_threshold_get(&bs);
53*e2462113SFrancesco Romani     g_assert_cmpint(res, ==, threshold2);
54*e2462113SFrancesco Romani }
55*e2462113SFrancesco Romani 
56*e2462113SFrancesco Romani static void test_threshold_not_trigger(void)
57*e2462113SFrancesco Romani {
58*e2462113SFrancesco Romani     uint64_t amount = 0;
59*e2462113SFrancesco Romani     uint64_t threshold = 4 * 1024 * 1024;
60*e2462113SFrancesco Romani     BlockDriverState bs;
61*e2462113SFrancesco Romani     BdrvTrackedRequest req;
62*e2462113SFrancesco Romani 
63*e2462113SFrancesco Romani     memset(&bs, 0, sizeof(bs));
64*e2462113SFrancesco Romani     memset(&req, 0, sizeof(req));
65*e2462113SFrancesco Romani     req.offset = 1024;
66*e2462113SFrancesco Romani     req.bytes = 1024;
67*e2462113SFrancesco Romani 
68*e2462113SFrancesco Romani     bdrv_write_threshold_set(&bs, threshold);
69*e2462113SFrancesco Romani     amount = bdrv_write_threshold_exceeded(&bs, &req);
70*e2462113SFrancesco Romani     g_assert_cmpuint(amount, ==, 0);
71*e2462113SFrancesco Romani }
72*e2462113SFrancesco Romani 
73*e2462113SFrancesco Romani 
74*e2462113SFrancesco Romani static void test_threshold_trigger(void)
75*e2462113SFrancesco Romani {
76*e2462113SFrancesco Romani     uint64_t amount = 0;
77*e2462113SFrancesco Romani     uint64_t threshold = 4 * 1024 * 1024;
78*e2462113SFrancesco Romani     BlockDriverState bs;
79*e2462113SFrancesco Romani     BdrvTrackedRequest req;
80*e2462113SFrancesco Romani 
81*e2462113SFrancesco Romani     memset(&bs, 0, sizeof(bs));
82*e2462113SFrancesco Romani     memset(&req, 0, sizeof(req));
83*e2462113SFrancesco Romani     req.offset = (4 * 1024 * 1024) - 1024;
84*e2462113SFrancesco Romani     req.bytes = 2 * 1024;
85*e2462113SFrancesco Romani 
86*e2462113SFrancesco Romani     bdrv_write_threshold_set(&bs, threshold);
87*e2462113SFrancesco Romani     amount = bdrv_write_threshold_exceeded(&bs, &req);
88*e2462113SFrancesco Romani     g_assert_cmpuint(amount, >=, 1024);
89*e2462113SFrancesco Romani }
90*e2462113SFrancesco Romani 
91*e2462113SFrancesco Romani typedef struct TestStruct {
92*e2462113SFrancesco Romani     const char *name;
93*e2462113SFrancesco Romani     void (*func)(void);
94*e2462113SFrancesco Romani } TestStruct;
95*e2462113SFrancesco Romani 
96*e2462113SFrancesco Romani 
97*e2462113SFrancesco Romani int main(int argc, char **argv)
98*e2462113SFrancesco Romani {
99*e2462113SFrancesco Romani     size_t i;
100*e2462113SFrancesco Romani     TestStruct tests[] = {
101*e2462113SFrancesco Romani         { "/write-threshold/not-set-on-init",
102*e2462113SFrancesco Romani           test_threshold_not_set_on_init },
103*e2462113SFrancesco Romani         { "/write-threshold/set-get",
104*e2462113SFrancesco Romani           test_threshold_set_get },
105*e2462113SFrancesco Romani         { "/write-threshold/multi-set-get",
106*e2462113SFrancesco Romani           test_threshold_multi_set_get },
107*e2462113SFrancesco Romani         { "/write-threshold/not-trigger",
108*e2462113SFrancesco Romani           test_threshold_not_trigger },
109*e2462113SFrancesco Romani         { "/write-threshold/trigger",
110*e2462113SFrancesco Romani           test_threshold_trigger },
111*e2462113SFrancesco Romani         { NULL, NULL }
112*e2462113SFrancesco Romani     };
113*e2462113SFrancesco Romani 
114*e2462113SFrancesco Romani     g_test_init(&argc, &argv, NULL);
115*e2462113SFrancesco Romani     for (i = 0; tests[i].name != NULL; i++) {
116*e2462113SFrancesco Romani         g_test_add_func(tests[i].name, tests[i].func);
117*e2462113SFrancesco Romani     }
118*e2462113SFrancesco Romani     return g_test_run();
119*e2462113SFrancesco Romani }
120