Commit 3f0f31a0 authored by Blue Swirl's avatar Blue Swirl
Browse files

tests: add fuzzing to visitor tests



Perform input tests on random data.

Improvement to code coverage for qapi/string-input-visitor.c
is about 3 percentage points.

Signed-off-by: default avatarBlue Swirl <blauwirbel@gmail.com>
parent 0c3c89d6
Loading
Loading
Loading
Loading
+49 −0
Original line number Diff line number Diff line
@@ -165,6 +165,53 @@ static void test_visitor_in_enum(TestInputVisitorData *data,
    data->siv = NULL;
}

/* Try to crash the visitors */
static void test_visitor_in_fuzz(TestInputVisitorData *data,
                                 const void *unused)
{
    int64_t ires;
    bool bres;
    double nres;
    char *sres;
    EnumOne eres;
    Error *errp = NULL;
    Visitor *v;
    unsigned int i;
    char buf[10000];

    for (i = 0; i < 100; i++) {
        unsigned int j;

        j = g_test_rand_int_range(0, sizeof(buf) - 1);

        buf[j] = '\0';

        if (j != 0) {
            for (j--; j != 0; j--) {
                buf[j - 1] = (char)g_test_rand_int_range(0, 256);
            }
        }

        v = visitor_input_test_init(data, buf);
        visit_type_int(v, &ires, NULL, &errp);

        v = visitor_input_test_init(data, buf);
        visit_type_bool(v, &bres, NULL, &errp);
        visitor_input_teardown(data, NULL);

        v = visitor_input_test_init(data, buf);
        visit_type_number(v, &nres, NULL, &errp);

        v = visitor_input_test_init(data, buf);
        visit_type_str(v, &sres, NULL, &errp);
        g_free(sres);

        v = visitor_input_test_init(data, buf);
        visit_type_EnumOne(v, &eres, NULL, &errp);
        visitor_input_teardown(data, NULL);
    }
}

static void input_visitor_test_add(const char *testpath,
                                   TestInputVisitorData *data,
                                   void (*test_func)(TestInputVisitorData *data, const void *user_data))
@@ -189,6 +236,8 @@ int main(int argc, char **argv)
                            &in_visitor_data, test_visitor_in_string);
    input_visitor_test_add("/string-visitor/input/enum",
                            &in_visitor_data, test_visitor_in_enum);
    input_visitor_test_add("/string-visitor/input/fuzz",
                            &in_visitor_data, test_visitor_in_fuzz);

    g_test_run();