1/* 2 * Copyright © 2019 Red Hat, Inc. 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining a 5 * copy of this software and associated documentation files (the "Software"), 6 * to deal in the Software without restriction, including without limitation 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 * and/or sell copies of the Software, and to permit persons to whom the 9 * Software is furnished to do so, subject to the following conditions: 10 * 11 * The above copyright notice and this permission notice (including the next 12 * paragraph) shall be included in all copies or substantial portions of the 13 * Software. 14 * 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 21 * DEALINGS IN THE SOFTWARE. 22 */ 23 24#include "config.h" 25 26#include <check.h> 27 28/* remove the main() from the included program so we can define our own */ 29#define main __disabled 30int main(int argc, char **argv); 31#include "libinput-fuzz-extract.c" 32#undef main 33 34START_TEST(test_parse_ev_abs) 35{ 36 struct test { 37 uint32_t which; 38 const char *prop; 39 int min, max, res, fuzz, flat; 40 41 } tests[] = { 42 { .which = (MIN|MAX), 43 .prop = "1:2", 44 .min = 1, .max = 2 }, 45 { .which = (MIN|MAX), 46 .prop = "1:2:", 47 .min = 1, .max = 2 }, 48 { .which = (MIN|MAX|RES), 49 .prop = "10:20:30", 50 .min = 10, .max = 20, .res = 30 }, 51 { .which = (RES), 52 .prop = "::100", 53 .res = 100 }, 54 { .which = (MIN), 55 .prop = "10:", 56 .min = 10 }, 57 { .which = (MAX|RES), 58 .prop = ":10:1001", 59 .max = 10, .res = 1001 }, 60 { .which = (MIN|MAX|RES|FUZZ), 61 .prop = "1:2:3:4", 62 .min = 1, .max = 2, .res = 3, .fuzz = 4}, 63 { .which = (MIN|MAX|RES|FUZZ|FLAT), 64 .prop = "1:2:3:4:5", 65 .min = 1, .max = 2, .res = 3, .fuzz = 4, .flat = 5}, 66 { .which = (MIN|RES|FUZZ|FLAT), 67 .prop = "1::3:4:50", 68 .min = 1, .res = 3, .fuzz = 4, .flat = 50}, 69 { .which = FUZZ|FLAT, 70 .prop = ":::5:60", 71 .fuzz = 5, .flat = 60}, 72 { .which = FUZZ, 73 .prop = ":::5:", 74 .fuzz = 5 }, 75 { .which = RES, .prop = "::12::", 76 .res = 12 }, 77 /* Malformed property but parsing this one makes us more 78 * future proof */ 79 { .which = (RES|FUZZ|FLAT), .prop = "::12:1:2:3:4:5:6", 80 .res = 12, .fuzz = 1, .flat = 2 }, 81 { .which = 0, .prop = ":::::" }, 82 { .which = 0, .prop = ":" }, 83 { .which = 0, .prop = "" }, 84 { .which = 0, .prop = ":asb::::" }, 85 { .which = 0, .prop = "foo" }, 86 }; 87 struct test *t; 88 89 ARRAY_FOR_EACH(tests, t) { 90 struct input_absinfo abs; 91 uint32_t mask; 92 93 mask = parse_ev_abs_prop(t->prop, &abs); 94 ck_assert_int_eq(mask, t->which); 95 96 if (t->which & MIN) 97 ck_assert_int_eq(abs.minimum, t->min); 98 if (t->which & MAX) 99 ck_assert_int_eq(abs.maximum, t->max); 100 if (t->which & RES) 101 ck_assert_int_eq(abs.resolution, t->res); 102 if (t->which & FUZZ) 103 ck_assert_int_eq(abs.fuzz, t->fuzz); 104 if (t->which & FLAT) 105 ck_assert_int_eq(abs.flat, t->flat); 106 } 107} 108END_TEST 109 110int main(int argc, char **argv) { 111 112 SRunner *sr = srunner_create(NULL); 113 Suite *s = suite_create("fuzz-override"); 114 TCase *tc = tcase_create("parser"); 115 int nfailed; 116 117 tcase_add_test(tc, test_parse_ev_abs); 118 suite_add_tcase(s, tc); 119 srunner_add_suite(sr, s); 120 121 srunner_run_all(sr, CK_NORMAL); 122 nfailed = srunner_ntests_failed(sr); 123 srunner_free(sr); 124 125 return nfailed; 126} 127