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