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