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