1*cdebaff8SEnji Cooper /* $NetBSD: t_usbhid.c,v 1.12 2016/08/17 12:10:42 jakllsch Exp $ */ 2640235e2SEnji Cooper 3640235e2SEnji Cooper /* 4640235e2SEnji Cooper * Copyright (c) 2016 Jonathan A. Kollasch 5640235e2SEnji Cooper * All rights reserved. 6640235e2SEnji Cooper * 7640235e2SEnji Cooper * Redistribution and use in source and binary forms, with or without 8640235e2SEnji Cooper * modification, are permitted provided that the following conditions 9640235e2SEnji Cooper * are met: 10640235e2SEnji Cooper * 1. Redistributions of source code must retain the above copyright 11640235e2SEnji Cooper * notice, this list of conditions and the following disclaimer. 12640235e2SEnji Cooper * 2. Redistributions in binary form must reproduce the above copyright 13640235e2SEnji Cooper * notice, this list of conditions and the following disclaimer in the 14640235e2SEnji Cooper * documentation and/or other materials provided with the distribution. 15640235e2SEnji Cooper * 16640235e2SEnji Cooper * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17640235e2SEnji Cooper * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 18640235e2SEnji Cooper * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 19640235e2SEnji Cooper * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR 20640235e2SEnji Cooper * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 21640235e2SEnji Cooper * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 22640235e2SEnji Cooper * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 23640235e2SEnji Cooper * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 24640235e2SEnji Cooper * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 25640235e2SEnji Cooper * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 26640235e2SEnji Cooper * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27640235e2SEnji Cooper */ 28640235e2SEnji Cooper 29640235e2SEnji Cooper #include <sys/cdefs.h> 30*cdebaff8SEnji Cooper __RCSID("$NetBSD: t_usbhid.c,v 1.12 2016/08/17 12:10:42 jakllsch Exp $"); 31640235e2SEnji Cooper 32640235e2SEnji Cooper #include <atf-c.h> 33640235e2SEnji Cooper 34640235e2SEnji Cooper #include <inttypes.h> 35640235e2SEnji Cooper #include <usbhid.h> 36640235e2SEnji Cooper #include <string.h> 37640235e2SEnji Cooper 38640235e2SEnji Cooper #include <stdio.h> 39640235e2SEnji Cooper #include <stdlib.h> 40640235e2SEnji Cooper 41640235e2SEnji Cooper #include <limits.h> 42640235e2SEnji Cooper 43640235e2SEnji Cooper ATF_TC(check_hid_logical_range); 44640235e2SEnji Cooper ATF_TC(check_hid_physical_range); 45640235e2SEnji Cooper ATF_TC(check_hid_usage); 46640235e2SEnji Cooper ATF_TC(check_hid_get_data); 47640235e2SEnji Cooper ATF_TC(check_hid_set_data); 48640235e2SEnji Cooper ATF_TC(check_parse_just_pop); 49640235e2SEnji Cooper 50640235e2SEnji Cooper #define MYd_ATF_CHECK_EQ(d, v) \ 51640235e2SEnji Cooper ATF_CHECK_EQ_MSG(d, v, "== %d", (d)) 52640235e2SEnji Cooper 53640235e2SEnji Cooper #define MYu_ATF_CHECK_EQ(d, v) \ 54640235e2SEnji Cooper ATF_CHECK_EQ_MSG(d, v, "== %u", (d)) 55640235e2SEnji Cooper 56640235e2SEnji Cooper #define MYx_ATF_CHECK_EQ(d, v) \ 57640235e2SEnji Cooper ATF_CHECK_EQ_MSG(d, v, "== 0x%x", (d)) 58640235e2SEnji Cooper 59640235e2SEnji Cooper #include "hid_test_data.c" 60640235e2SEnji Cooper 61640235e2SEnji Cooper ATF_TC_HEAD(check_hid_usage, tc) 62640235e2SEnji Cooper { 63640235e2SEnji Cooper 64640235e2SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test libusbhid usage.c"); 65640235e2SEnji Cooper } 66640235e2SEnji Cooper 67640235e2SEnji Cooper ATF_TC_BODY(check_hid_usage, tc) 68640235e2SEnji Cooper { 69640235e2SEnji Cooper char usages_path[PATH_MAX]; 70640235e2SEnji Cooper 71640235e2SEnji Cooper (void)strlcpy(usages_path, atf_tc_get_config_var(tc, "srcdir"), 72640235e2SEnji Cooper sizeof(usages_path)); 73640235e2SEnji Cooper (void)strlcat(usages_path, "/test_usb_hid_usages", 74640235e2SEnji Cooper sizeof(usages_path)); 75640235e2SEnji Cooper 76640235e2SEnji Cooper hid_init(usages_path); 77640235e2SEnji Cooper 78640235e2SEnji Cooper ATF_CHECK_STREQ("t_usbhid_page", hid_usage_page(0xff1b)); 79640235e2SEnji Cooper ATF_CHECK_EQ((uint32_t)hid_parse_usage_page("t_usbhid_page"), 0xff1b); 80640235e2SEnji Cooper 81640235e2SEnji Cooper ATF_CHECK_STREQ("t_usbhid_usage", hid_usage_in_page(0xff1bff2a)); 82640235e2SEnji Cooper ATF_CHECK_EQ((uint32_t)hid_parse_usage_in_page( 83640235e2SEnji Cooper "t_usbhid_page:t_usbhid_usage"), 0xff1bff2a); 84640235e2SEnji Cooper 85640235e2SEnji Cooper ATF_CHECK_STREQ("Quick_zephyrs_blow_vexing_daft_Jim_", 86640235e2SEnji Cooper hid_usage_page(0xff2a)); 87640235e2SEnji Cooper ATF_CHECK_EQ((uint32_t)hid_parse_usage_page( 88640235e2SEnji Cooper "Quick_zephyrs_blow_vexing_daft_Jim_"), 0xff2a); 89640235e2SEnji Cooper 90640235e2SEnji Cooper ATF_CHECK_STREQ("Usage_ID_Zero_%", hid_usage_in_page(0xff2a0000)); 91640235e2SEnji Cooper ATF_CHECK_EQ((uint32_t)hid_parse_usage_in_page( 92640235e2SEnji Cooper "Quick_zephyrs_blow_vexing_daft_Jim_:Usage_ID_Zero_%"), 93640235e2SEnji Cooper 0xff2a0000); 94640235e2SEnji Cooper 95640235e2SEnji Cooper //ATF_CHECK_STREQ("Usage_ID_0_%", hid_usage_in_page(0xff2a0000)); 96640235e2SEnji Cooper ATF_CHECK_EQ((uint32_t)hid_parse_usage_in_page( 97640235e2SEnji Cooper "Quick_zephyrs_blow_vexing_daft_Jim_:Usage_ID_0_%"), 0xff2a0000); 98640235e2SEnji Cooper 99640235e2SEnji Cooper ATF_CHECK_STREQ("Usage_ID_65535_%", hid_usage_in_page(0xff2affff)); 100640235e2SEnji Cooper ATF_CHECK_EQ((uint32_t)hid_parse_usage_in_page( 101640235e2SEnji Cooper "Quick_zephyrs_blow_vexing_daft_Jim_:Usage_ID_65535_%"), 102640235e2SEnji Cooper 0xff2affff); 103640235e2SEnji Cooper 104640235e2SEnji Cooper MYx_ATF_CHECK_EQ((uint32_t)hid_parse_usage_in_page("0xff2a:0xff1b"), 105640235e2SEnji Cooper 0xff2aff1b); 106640235e2SEnji Cooper } 107640235e2SEnji Cooper 108640235e2SEnji Cooper ATF_TC_HEAD(check_hid_logical_range, tc) 109640235e2SEnji Cooper { 110640235e2SEnji Cooper 111640235e2SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test hid_get_item " 112640235e2SEnji Cooper "Logical Minimum/Maximum results"); 113640235e2SEnji Cooper } 114640235e2SEnji Cooper 115640235e2SEnji Cooper ATF_TC_BODY(check_hid_logical_range, tc) 116640235e2SEnji Cooper { 117640235e2SEnji Cooper report_desc_t hrd; 118640235e2SEnji Cooper hid_item_t hi; 119640235e2SEnji Cooper uint32_t minimum, maximum; 120640235e2SEnji Cooper 121640235e2SEnji Cooper atf_tc_expect_fail("only the 32-bit opcode works, " 122640235e2SEnji Cooper "8 and 16-bit is broken"); 123640235e2SEnji Cooper 124640235e2SEnji Cooper ATF_REQUIRE((hrd = hid_use_report_desc(range_test_report_descriptor, 125640235e2SEnji Cooper __arraycount(range_test_report_descriptor))) != NULL); 126640235e2SEnji Cooper ATF_REQUIRE(hid_locate(hrd, 0xff000001U, hid_input, &hi, 127640235e2SEnji Cooper NO_REPORT_ID) > 0); 128640235e2SEnji Cooper MYd_ATF_CHECK_EQ(hi.logical_minimum, -128); 129640235e2SEnji Cooper MYd_ATF_CHECK_EQ(hi.logical_maximum, 127); 130640235e2SEnji Cooper ATF_REQUIRE(hid_locate(hrd, 0xff000002U, hid_input, &hi, 131640235e2SEnji Cooper NO_REPORT_ID) > 0); 132640235e2SEnji Cooper MYd_ATF_CHECK_EQ(hi.logical_minimum, -32768); 133640235e2SEnji Cooper MYd_ATF_CHECK_EQ(hi.logical_maximum, 32767); 134640235e2SEnji Cooper ATF_REQUIRE(hid_locate(hrd, 0xff000003U, hid_input, &hi, 135640235e2SEnji Cooper NO_REPORT_ID) > 0); 136640235e2SEnji Cooper MYd_ATF_CHECK_EQ(hi.logical_minimum, -2147483648); 137640235e2SEnji Cooper MYd_ATF_CHECK_EQ(hi.logical_maximum, 2147483647); 138640235e2SEnji Cooper 139640235e2SEnji Cooper hid_dispose_report_desc(hrd); 140640235e2SEnji Cooper hrd = NULL; 141640235e2SEnji Cooper 142640235e2SEnji Cooper ATF_REQUIRE((hrd = hid_use_report_desc( 143640235e2SEnji Cooper unsigned_range_test_report_descriptor, 144640235e2SEnji Cooper __arraycount(unsigned_range_test_report_descriptor))) != NULL); 145640235e2SEnji Cooper ATF_REQUIRE(hid_locate(hrd, 0xff000011U, hid_input, &hi, 146640235e2SEnji Cooper NO_REPORT_ID) > 0); 147640235e2SEnji Cooper ATF_CHECK(hi.logical_minimum > hi.logical_maximum); 148640235e2SEnji Cooper minimum = (uint32_t)hi.logical_minimum & ((1ULL<<hi.report_size)-1); 149640235e2SEnji Cooper MYu_ATF_CHECK_EQ(minimum, 0); 150640235e2SEnji Cooper maximum = (uint32_t)hi.logical_maximum & ((1ULL<<hi.report_size)-1); 151640235e2SEnji Cooper MYu_ATF_CHECK_EQ(maximum, 255); 152640235e2SEnji Cooper ATF_REQUIRE(hid_locate(hrd, 0xff000012U, hid_input, &hi, 153640235e2SEnji Cooper NO_REPORT_ID) > 0); 154640235e2SEnji Cooper ATF_CHECK(hi.logical_minimum > hi.logical_maximum); 155640235e2SEnji Cooper minimum = hi.logical_minimum & ((1ULL<<hi.report_size)-1); 156640235e2SEnji Cooper MYu_ATF_CHECK_EQ(minimum, 0); 157640235e2SEnji Cooper maximum = hi.logical_maximum & ((1ULL<<hi.report_size)-1); 158640235e2SEnji Cooper MYu_ATF_CHECK_EQ(maximum, 65535); 159640235e2SEnji Cooper ATF_REQUIRE(hid_locate(hrd, 0xff000013U, hid_input, &hi, 160640235e2SEnji Cooper NO_REPORT_ID) > 0); 161640235e2SEnji Cooper ATF_CHECK(hi.logical_minimum > hi.logical_maximum); 162640235e2SEnji Cooper minimum = hi.logical_minimum & ((1ULL<<hi.report_size)-1); 163640235e2SEnji Cooper MYu_ATF_CHECK_EQ(minimum, 0); 164640235e2SEnji Cooper maximum = hi.logical_maximum & ((1ULL<<hi.report_size)-1); 165640235e2SEnji Cooper MYu_ATF_CHECK_EQ(maximum, 4294967295); 166640235e2SEnji Cooper 167640235e2SEnji Cooper hid_dispose_report_desc(hrd); 168640235e2SEnji Cooper hrd = NULL; 169640235e2SEnji Cooper } 170640235e2SEnji Cooper 171640235e2SEnji Cooper ATF_TC_HEAD(check_hid_physical_range, tc) 172640235e2SEnji Cooper { 173640235e2SEnji Cooper 174640235e2SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test hid_get_item " 175640235e2SEnji Cooper "Physical Minimum/Maximum results"); 176640235e2SEnji Cooper } 177640235e2SEnji Cooper 178640235e2SEnji Cooper ATF_TC_BODY(check_hid_physical_range, tc) 179640235e2SEnji Cooper { 180640235e2SEnji Cooper report_desc_t hrd; 181640235e2SEnji Cooper hid_item_t hi; 182640235e2SEnji Cooper uint32_t minimum, maximum; 183640235e2SEnji Cooper 184640235e2SEnji Cooper atf_tc_expect_fail("only the 32-bit opcode works, " 185640235e2SEnji Cooper "8 and 16-bit is broken"); 186640235e2SEnji Cooper 187640235e2SEnji Cooper ATF_REQUIRE((hrd = hid_use_report_desc(range_test_report_descriptor, 188640235e2SEnji Cooper __arraycount(range_test_report_descriptor))) != NULL); 189640235e2SEnji Cooper ATF_REQUIRE(hid_locate(hrd, 0xff000001U, hid_input, &hi, 190640235e2SEnji Cooper NO_REPORT_ID) > 0); 191640235e2SEnji Cooper MYd_ATF_CHECK_EQ(hi.physical_minimum, -128); 192640235e2SEnji Cooper MYd_ATF_CHECK_EQ(hi.physical_maximum, 127); 193640235e2SEnji Cooper ATF_REQUIRE(hid_locate(hrd, 0xff000002U, hid_input, &hi, 194640235e2SEnji Cooper NO_REPORT_ID) > 0); 195640235e2SEnji Cooper MYd_ATF_CHECK_EQ(hi.physical_minimum, -32768); 196640235e2SEnji Cooper MYd_ATF_CHECK_EQ(hi.physical_maximum, 32767); 197640235e2SEnji Cooper ATF_REQUIRE(hid_locate(hrd, 0xff000003U, hid_input, &hi, 198640235e2SEnji Cooper NO_REPORT_ID) > 0); 199640235e2SEnji Cooper MYd_ATF_CHECK_EQ(hi.physical_minimum, -2147483648); 200640235e2SEnji Cooper MYd_ATF_CHECK_EQ(hi.physical_maximum, 2147483647); 201640235e2SEnji Cooper 202640235e2SEnji Cooper hid_dispose_report_desc(hrd); 203640235e2SEnji Cooper hrd = NULL; 204640235e2SEnji Cooper 205640235e2SEnji Cooper ATF_REQUIRE((hrd = hid_use_report_desc( 206640235e2SEnji Cooper unsigned_range_test_report_descriptor, 207640235e2SEnji Cooper __arraycount(unsigned_range_test_report_descriptor))) != NULL); 208640235e2SEnji Cooper ATF_REQUIRE(hid_locate(hrd, 0xff000011U, hid_input, &hi, 209640235e2SEnji Cooper NO_REPORT_ID) > 0); 210640235e2SEnji Cooper ATF_CHECK(hi.physical_minimum > hi.physical_maximum); 211640235e2SEnji Cooper minimum = (uint32_t)hi.physical_minimum & ((1ULL<<hi.report_size)-1); 212640235e2SEnji Cooper MYu_ATF_CHECK_EQ(minimum, 0); 213640235e2SEnji Cooper maximum = (uint32_t)hi.physical_maximum & ((1ULL<<hi.report_size)-1); 214640235e2SEnji Cooper MYu_ATF_CHECK_EQ(maximum, 255); 215640235e2SEnji Cooper ATF_REQUIRE(hid_locate(hrd, 0xff000012U, hid_input, &hi, 216640235e2SEnji Cooper NO_REPORT_ID) > 0); 217640235e2SEnji Cooper ATF_CHECK(hi.physical_minimum > hi.physical_maximum); 218640235e2SEnji Cooper minimum = hi.physical_minimum & ((1ULL<<hi.report_size)-1); 219640235e2SEnji Cooper MYu_ATF_CHECK_EQ(minimum, 0); 220640235e2SEnji Cooper maximum = hi.physical_maximum & ((1ULL<<hi.report_size)-1); 221640235e2SEnji Cooper MYu_ATF_CHECK_EQ(maximum, 65535); 222640235e2SEnji Cooper ATF_REQUIRE(hid_locate(hrd, 0xff000013U, hid_input, &hi, 223640235e2SEnji Cooper NO_REPORT_ID) > 0); 224640235e2SEnji Cooper ATF_CHECK(hi.physical_minimum > hi.physical_maximum); 225640235e2SEnji Cooper minimum = hi.physical_minimum & ((1ULL<<hi.report_size)-1); 226640235e2SEnji Cooper MYu_ATF_CHECK_EQ(minimum, 0); 227640235e2SEnji Cooper maximum = hi.physical_maximum & ((1ULL<<hi.report_size)-1); 228640235e2SEnji Cooper MYu_ATF_CHECK_EQ(maximum, 4294967295); 229640235e2SEnji Cooper 230640235e2SEnji Cooper hid_dispose_report_desc(hrd); 231640235e2SEnji Cooper hrd = NULL; 232640235e2SEnji Cooper } 233640235e2SEnji Cooper 234640235e2SEnji Cooper ATF_TC_HEAD(check_hid_get_data, tc) 235640235e2SEnji Cooper { 236640235e2SEnji Cooper 237640235e2SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test hid_get_data results"); 238640235e2SEnji Cooper } 239640235e2SEnji Cooper 240640235e2SEnji Cooper ATF_TC_BODY(check_hid_get_data, tc) 241640235e2SEnji Cooper { 242640235e2SEnji Cooper report_desc_t hrd; 243640235e2SEnji Cooper hid_item_t hi; 244640235e2SEnji Cooper int32_t data; 245640235e2SEnji Cooper uint32_t udat; 246640235e2SEnji Cooper 247*cdebaff8SEnji Cooper atf_tc_expect_fail("only the 32-bit opcode works, " 248*cdebaff8SEnji Cooper "8 and 16-bit is broken"); 249*cdebaff8SEnji Cooper 250640235e2SEnji Cooper ATF_REQUIRE((hrd = hid_use_report_desc( 251640235e2SEnji Cooper range_test_report_descriptor, 252640235e2SEnji Cooper __arraycount(range_test_report_descriptor))) != NULL); 253640235e2SEnji Cooper 254640235e2SEnji Cooper ATF_REQUIRE(hid_locate(hrd, 0xff000001U, hid_input, &hi, 255640235e2SEnji Cooper NO_REPORT_ID) > 0); 256640235e2SEnji Cooper data = hid_get_data(range_test_minimum_report, &hi); 257640235e2SEnji Cooper MYd_ATF_CHECK_EQ(data, -128); 258640235e2SEnji Cooper data = hid_get_data(range_test_negative_one_report, &hi); 259640235e2SEnji Cooper MYd_ATF_CHECK_EQ(data, -1); 260640235e2SEnji Cooper data = hid_get_data(range_test_positive_one_report, &hi); 261640235e2SEnji Cooper MYd_ATF_CHECK_EQ(data, 1); 262640235e2SEnji Cooper data = hid_get_data(range_test_maximum_report, &hi); 263640235e2SEnji Cooper MYd_ATF_CHECK_EQ(data, 127); 264640235e2SEnji Cooper 265640235e2SEnji Cooper ATF_REQUIRE(hid_locate(hrd, 0xff000002U, hid_input, &hi, 266640235e2SEnji Cooper NO_REPORT_ID) > 0); 267640235e2SEnji Cooper data = hid_get_data(range_test_minimum_report, &hi); 268640235e2SEnji Cooper MYd_ATF_CHECK_EQ(data, -32768); 269640235e2SEnji Cooper data = hid_get_data(range_test_negative_one_report, &hi); 270640235e2SEnji Cooper MYd_ATF_CHECK_EQ(data, -1); 271640235e2SEnji Cooper data = hid_get_data(range_test_positive_one_report, &hi); 272640235e2SEnji Cooper MYd_ATF_CHECK_EQ(data, 1); 273640235e2SEnji Cooper data = hid_get_data(range_test_maximum_report, &hi); 274640235e2SEnji Cooper MYd_ATF_CHECK_EQ(data, 32767); 275640235e2SEnji Cooper 276640235e2SEnji Cooper ATF_REQUIRE(hid_locate(hrd, 0xff000003U, hid_input, &hi, 277640235e2SEnji Cooper NO_REPORT_ID) > 0); 278640235e2SEnji Cooper data = hid_get_data(range_test_minimum_report, &hi); 279640235e2SEnji Cooper MYd_ATF_CHECK_EQ(data, -2147483648); 280640235e2SEnji Cooper data = hid_get_data(range_test_negative_one_report, &hi); 281640235e2SEnji Cooper MYd_ATF_CHECK_EQ(data, -1); 282640235e2SEnji Cooper data = hid_get_data(range_test_positive_one_report, &hi); 283640235e2SEnji Cooper MYd_ATF_CHECK_EQ(data, 1); 284640235e2SEnji Cooper data = hid_get_data(range_test_maximum_report, &hi); 285640235e2SEnji Cooper MYd_ATF_CHECK_EQ(data, 2147483647); 286640235e2SEnji Cooper 287640235e2SEnji Cooper hid_dispose_report_desc(hrd); 288640235e2SEnji Cooper hrd = NULL; 289640235e2SEnji Cooper 290640235e2SEnji Cooper ATF_REQUIRE((hrd = hid_use_report_desc( 291640235e2SEnji Cooper unsigned_range_test_report_descriptor, 292640235e2SEnji Cooper __arraycount(unsigned_range_test_report_descriptor))) != NULL); 293640235e2SEnji Cooper ATF_REQUIRE(hid_locate(hrd, 0xff000011U, hid_input, &hi, 294640235e2SEnji Cooper NO_REPORT_ID) > 0); 295640235e2SEnji Cooper udat = hid_get_data(unsigned_range_test_minimum_report, &hi); 296640235e2SEnji Cooper MYu_ATF_CHECK_EQ(udat, 0); 297640235e2SEnji Cooper udat = hid_get_data(unsigned_range_test_positive_one_report, &hi); 298640235e2SEnji Cooper MYu_ATF_CHECK_EQ(udat, 1); 299640235e2SEnji Cooper udat = hid_get_data(unsigned_range_test_negative_one_report, &hi); 300640235e2SEnji Cooper MYu_ATF_CHECK_EQ(udat, 254); 301640235e2SEnji Cooper udat = hid_get_data(unsigned_range_test_maximum_report, &hi); 302640235e2SEnji Cooper MYu_ATF_CHECK_EQ(udat, 255); 303640235e2SEnji Cooper 304640235e2SEnji Cooper ATF_REQUIRE(hid_locate(hrd, 0xff000012U, hid_input, &hi, 305640235e2SEnji Cooper NO_REPORT_ID) > 0); 306640235e2SEnji Cooper udat = hid_get_data(unsigned_range_test_minimum_report, &hi); 307640235e2SEnji Cooper MYu_ATF_CHECK_EQ(udat, 0); 308640235e2SEnji Cooper udat = hid_get_data(unsigned_range_test_positive_one_report, &hi); 309640235e2SEnji Cooper MYu_ATF_CHECK_EQ(udat, 1); 310640235e2SEnji Cooper udat = hid_get_data(unsigned_range_test_negative_one_report, &hi); 311640235e2SEnji Cooper MYu_ATF_CHECK_EQ(udat, 65534); 312640235e2SEnji Cooper udat = hid_get_data(unsigned_range_test_maximum_report, &hi); 313640235e2SEnji Cooper MYu_ATF_CHECK_EQ(udat, 65535); 314640235e2SEnji Cooper 315640235e2SEnji Cooper ATF_REQUIRE(hid_locate(hrd, 0xff000013U, hid_input, &hi, 316640235e2SEnji Cooper NO_REPORT_ID) > 0); 317640235e2SEnji Cooper udat = hid_get_data(unsigned_range_test_minimum_report, &hi); 318640235e2SEnji Cooper MYu_ATF_CHECK_EQ(udat, 0); 319640235e2SEnji Cooper udat = hid_get_data(unsigned_range_test_positive_one_report, &hi); 320640235e2SEnji Cooper MYu_ATF_CHECK_EQ(udat, 1); 321640235e2SEnji Cooper udat = hid_get_data(unsigned_range_test_negative_one_report, &hi); 322640235e2SEnji Cooper MYu_ATF_CHECK_EQ(udat, 4294967294); 323640235e2SEnji Cooper udat = hid_get_data(unsigned_range_test_maximum_report, &hi); 324640235e2SEnji Cooper MYu_ATF_CHECK_EQ(udat, 4294967295); 325640235e2SEnji Cooper 326640235e2SEnji Cooper hid_dispose_report_desc(hrd); 327640235e2SEnji Cooper hrd = NULL; 328640235e2SEnji Cooper } 329640235e2SEnji Cooper 330640235e2SEnji Cooper ATF_TC_HEAD(check_hid_set_data, tc) 331640235e2SEnji Cooper { 332640235e2SEnji Cooper 333640235e2SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test hid_set_data results"); 334640235e2SEnji Cooper } 335640235e2SEnji Cooper 336640235e2SEnji Cooper ATF_TC_BODY(check_hid_set_data, tc) 337640235e2SEnji Cooper { 338640235e2SEnji Cooper report_desc_t hrd; 339640235e2SEnji Cooper hid_item_t hi; 340640235e2SEnji Cooper uint8_t test_data_minimum[7]; 341640235e2SEnji Cooper uint8_t test_data_negative_one[7]; 342640235e2SEnji Cooper uint8_t test_data_positive_one[7]; 343640235e2SEnji Cooper uint8_t test_data_maximum[7]; 344640235e2SEnji Cooper 345640235e2SEnji Cooper ATF_REQUIRE((hrd = hid_use_report_desc( 346640235e2SEnji Cooper range_test_report_descriptor, 347640235e2SEnji Cooper __arraycount(range_test_report_descriptor))) != NULL); 348640235e2SEnji Cooper ATF_REQUIRE(hid_locate(hrd, 0xff000001U, hid_input, &hi, 349640235e2SEnji Cooper NO_REPORT_ID) > 0); 350640235e2SEnji Cooper hid_set_data(test_data_minimum, &hi, -128); 351640235e2SEnji Cooper hid_set_data(test_data_negative_one, &hi, -1); 352640235e2SEnji Cooper hid_set_data(test_data_positive_one, &hi, 1); 353640235e2SEnji Cooper hid_set_data(test_data_maximum, &hi, 127); 354640235e2SEnji Cooper ATF_REQUIRE(hid_locate(hrd, 0xff000002U, hid_input, &hi, 355640235e2SEnji Cooper NO_REPORT_ID) > 0); 356640235e2SEnji Cooper hid_set_data(test_data_minimum, &hi, -32768); 357640235e2SEnji Cooper hid_set_data(test_data_negative_one, &hi, -1); 358640235e2SEnji Cooper hid_set_data(test_data_positive_one, &hi, 1); 359640235e2SEnji Cooper hid_set_data(test_data_maximum, &hi, 32767); 360640235e2SEnji Cooper ATF_REQUIRE(hid_locate(hrd, 0xff000003U, hid_input, &hi, 361640235e2SEnji Cooper NO_REPORT_ID) > 0); 362640235e2SEnji Cooper hid_set_data(test_data_minimum, &hi, -2147483648); 363640235e2SEnji Cooper hid_set_data(test_data_negative_one, &hi, -1); 364640235e2SEnji Cooper hid_set_data(test_data_positive_one, &hi, 1); 365640235e2SEnji Cooper hid_set_data(test_data_maximum, &hi, 2147483647); 366640235e2SEnji Cooper ATF_CHECK(memcmp(test_data_minimum, range_test_minimum_report, 367640235e2SEnji Cooper sizeof test_data_minimum) == 0); 368640235e2SEnji Cooper ATF_CHECK(memcmp(test_data_negative_one, 369640235e2SEnji Cooper range_test_negative_one_report, 370640235e2SEnji Cooper sizeof test_data_negative_one) == 0); 371640235e2SEnji Cooper ATF_CHECK(memcmp(test_data_positive_one, 372640235e2SEnji Cooper range_test_positive_one_report, 373640235e2SEnji Cooper sizeof test_data_positive_one) == 0); 374640235e2SEnji Cooper ATF_CHECK(memcmp(test_data_maximum, range_test_maximum_report, 375640235e2SEnji Cooper sizeof test_data_maximum) == 0); 376640235e2SEnji Cooper 377640235e2SEnji Cooper hid_dispose_report_desc(hrd); 378640235e2SEnji Cooper hrd = NULL; 379640235e2SEnji Cooper 380640235e2SEnji Cooper ATF_REQUIRE((hrd = hid_use_report_desc( 381640235e2SEnji Cooper unsigned_range_test_report_descriptor, 382640235e2SEnji Cooper __arraycount(range_test_report_descriptor))) != NULL); 383640235e2SEnji Cooper ATF_REQUIRE(hid_locate(hrd, 0xff000011U, hid_input, &hi, 384640235e2SEnji Cooper NO_REPORT_ID) > 0); 385640235e2SEnji Cooper hid_set_data(test_data_minimum, &hi, 0); 386640235e2SEnji Cooper hid_set_data(test_data_positive_one, &hi, 1); 387640235e2SEnji Cooper hid_set_data(test_data_negative_one, &hi, 0xfffffffe); 388640235e2SEnji Cooper hid_set_data(test_data_maximum, &hi, 0xffffffff); 389640235e2SEnji Cooper ATF_REQUIRE(hid_locate(hrd, 0xff000012U, hid_input, &hi, 390640235e2SEnji Cooper NO_REPORT_ID) > 0); 391640235e2SEnji Cooper hid_set_data(test_data_minimum, &hi, 0); 392640235e2SEnji Cooper hid_set_data(test_data_positive_one, &hi, 1); 393640235e2SEnji Cooper hid_set_data(test_data_negative_one, &hi, 0xfffe); 394640235e2SEnji Cooper hid_set_data(test_data_maximum, &hi, 0xffff); 395640235e2SEnji Cooper ATF_REQUIRE(hid_locate(hrd, 0xff000013U, hid_input, &hi, 396640235e2SEnji Cooper NO_REPORT_ID) > 0); 397640235e2SEnji Cooper hid_set_data(test_data_minimum, &hi, 0); 398640235e2SEnji Cooper hid_set_data(test_data_positive_one, &hi, 1); 399640235e2SEnji Cooper hid_set_data(test_data_negative_one, &hi, 0xfffffffe); 400640235e2SEnji Cooper hid_set_data(test_data_maximum, &hi, 0xffffffff); 401640235e2SEnji Cooper ATF_CHECK(memcmp(test_data_minimum, 402640235e2SEnji Cooper unsigned_range_test_minimum_report, 403640235e2SEnji Cooper sizeof test_data_minimum) == 0); 404640235e2SEnji Cooper ATF_CHECK(memcmp(test_data_negative_one, 405640235e2SEnji Cooper unsigned_range_test_negative_one_report, 406640235e2SEnji Cooper sizeof test_data_negative_one) == 0); 407640235e2SEnji Cooper ATF_CHECK(memcmp(test_data_positive_one, 408640235e2SEnji Cooper unsigned_range_test_positive_one_report, 409640235e2SEnji Cooper sizeof test_data_positive_one) == 0); 410640235e2SEnji Cooper ATF_CHECK(memcmp(test_data_maximum, 411640235e2SEnji Cooper unsigned_range_test_maximum_report, 412640235e2SEnji Cooper sizeof test_data_maximum) == 0); 413640235e2SEnji Cooper 414640235e2SEnji Cooper hid_dispose_report_desc(hrd); 415640235e2SEnji Cooper hrd = NULL; 416640235e2SEnji Cooper } 417640235e2SEnji Cooper 418640235e2SEnji Cooper ATF_TC_HEAD(check_parse_just_pop, tc) 419640235e2SEnji Cooper { 420640235e2SEnji Cooper 421640235e2SEnji Cooper atf_tc_set_md_var(tc, "descr", "check Pop on empty stack bug"); 422640235e2SEnji Cooper } 423640235e2SEnji Cooper 424640235e2SEnji Cooper ATF_TC_BODY(check_parse_just_pop, tc) 425640235e2SEnji Cooper { 426640235e2SEnji Cooper report_desc_t hrd; 427640235e2SEnji Cooper hid_data_t hd; 428640235e2SEnji Cooper hid_item_t hi; 429640235e2SEnji Cooper 430640235e2SEnji Cooper ATF_REQUIRE((hrd = hid_use_report_desc( 431640235e2SEnji Cooper just_pop_report_descriptor, 432640235e2SEnji Cooper sizeof just_pop_report_descriptor)) != NULL); 433640235e2SEnji Cooper hd = hid_start_parse(hrd, 0, NO_REPORT_ID); 434640235e2SEnji Cooper while (hid_get_item(hd, &hi) > 0) { 435640235e2SEnji Cooper } 436640235e2SEnji Cooper hid_end_parse(hd); 437640235e2SEnji Cooper hid_dispose_report_desc(hrd); 438640235e2SEnji Cooper hrd = NULL; 439640235e2SEnji Cooper } 440640235e2SEnji Cooper 441640235e2SEnji Cooper ATF_TP_ADD_TCS(tp) 442640235e2SEnji Cooper { 443640235e2SEnji Cooper 444640235e2SEnji Cooper ATF_TP_ADD_TC(tp, check_hid_logical_range); 445640235e2SEnji Cooper ATF_TP_ADD_TC(tp, check_hid_physical_range); 446640235e2SEnji Cooper ATF_TP_ADD_TC(tp, check_hid_usage); 447640235e2SEnji Cooper ATF_TP_ADD_TC(tp, check_hid_get_data); 448640235e2SEnji Cooper ATF_TP_ADD_TC(tp, check_hid_set_data); 449640235e2SEnji Cooper ATF_TP_ADD_TC(tp, check_parse_just_pop); 450640235e2SEnji Cooper 451640235e2SEnji Cooper return atf_no_error(); 452640235e2SEnji Cooper } 453