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: Blue Swirl <blauwirbel@gmail.com>
This commit is contained in:
parent
0c3c89d649
commit
3f0f31a0f1
|
@ -165,6 +165,53 @@ static void test_visitor_in_enum(TestInputVisitorData *data,
|
||||||
data->siv = NULL;
|
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,
|
static void input_visitor_test_add(const char *testpath,
|
||||||
TestInputVisitorData *data,
|
TestInputVisitorData *data,
|
||||||
void (*test_func)(TestInputVisitorData *data, const void *user_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);
|
&in_visitor_data, test_visitor_in_string);
|
||||||
input_visitor_test_add("/string-visitor/input/enum",
|
input_visitor_test_add("/string-visitor/input/enum",
|
||||||
&in_visitor_data, test_visitor_in_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();
|
g_test_run();
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue