1*640235e2SEnji Cooper /* $NetBSD: t_usbhid.c,v 1.11 2016/01/07 16:10:49 jakllsch Exp $ */ 2*640235e2SEnji Cooper 3*640235e2SEnji Cooper /* 4*640235e2SEnji Cooper * Copyright (c) 2016 Jonathan A. Kollasch 5*640235e2SEnji Cooper * All rights reserved. 6*640235e2SEnji Cooper * 7*640235e2SEnji Cooper * Redistribution and use in source and binary forms, with or without 8*640235e2SEnji Cooper * modification, are permitted provided that the following conditions 9*640235e2SEnji Cooper * are met: 10*640235e2SEnji Cooper * 1. Redistributions of source code must retain the above copyright 11*640235e2SEnji Cooper * notice, this list of conditions and the following disclaimer. 12*640235e2SEnji Cooper * 2. Redistributions in binary form must reproduce the above copyright 13*640235e2SEnji Cooper * notice, this list of conditions and the following disclaimer in the 14*640235e2SEnji Cooper * documentation and/or other materials provided with the distribution. 15*640235e2SEnji Cooper * 16*640235e2SEnji Cooper * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17*640235e2SEnji Cooper * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 18*640235e2SEnji Cooper * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 19*640235e2SEnji Cooper * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR 20*640235e2SEnji Cooper * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 21*640235e2SEnji Cooper * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 22*640235e2SEnji Cooper * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 23*640235e2SEnji Cooper * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 24*640235e2SEnji Cooper * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 25*640235e2SEnji Cooper * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 26*640235e2SEnji Cooper * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27*640235e2SEnji Cooper */ 28*640235e2SEnji Cooper 29*640235e2SEnji Cooper #include <sys/cdefs.h> 30*640235e2SEnji Cooper __RCSID("$NetBSD: t_usbhid.c,v 1.11 2016/01/07 16:10:49 jakllsch Exp $"); 31*640235e2SEnji Cooper 32*640235e2SEnji Cooper #include <atf-c.h> 33*640235e2SEnji Cooper 34*640235e2SEnji Cooper #include <inttypes.h> 35*640235e2SEnji Cooper #include <usbhid.h> 36*640235e2SEnji Cooper #include <string.h> 37*640235e2SEnji Cooper 38*640235e2SEnji Cooper #include <stdio.h> 39*640235e2SEnji Cooper #include <stdlib.h> 40*640235e2SEnji Cooper 41*640235e2SEnji Cooper #include <limits.h> 42*640235e2SEnji Cooper 43*640235e2SEnji Cooper ATF_TC(check_hid_logical_range); 44*640235e2SEnji Cooper ATF_TC(check_hid_physical_range); 45*640235e2SEnji Cooper ATF_TC(check_hid_usage); 46*640235e2SEnji Cooper ATF_TC(check_hid_get_data); 47*640235e2SEnji Cooper ATF_TC(check_hid_set_data); 48*640235e2SEnji Cooper ATF_TC(check_parse_just_pop); 49*640235e2SEnji Cooper 50*640235e2SEnji Cooper #define MYd_ATF_CHECK_EQ(d, v) \ 51*640235e2SEnji Cooper ATF_CHECK_EQ_MSG(d, v, "== %d", (d)) 52*640235e2SEnji Cooper 53*640235e2SEnji Cooper #define MYu_ATF_CHECK_EQ(d, v) \ 54*640235e2SEnji Cooper ATF_CHECK_EQ_MSG(d, v, "== %u", (d)) 55*640235e2SEnji Cooper 56*640235e2SEnji Cooper #define MYx_ATF_CHECK_EQ(d, v) \ 57*640235e2SEnji Cooper ATF_CHECK_EQ_MSG(d, v, "== 0x%x", (d)) 58*640235e2SEnji Cooper 59*640235e2SEnji Cooper #include "hid_test_data.c" 60*640235e2SEnji Cooper 61*640235e2SEnji Cooper ATF_TC_HEAD(check_hid_usage, tc) 62*640235e2SEnji Cooper { 63*640235e2SEnji Cooper 64*640235e2SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test libusbhid usage.c"); 65*640235e2SEnji Cooper } 66*640235e2SEnji Cooper 67*640235e2SEnji Cooper ATF_TC_BODY(check_hid_usage, tc) 68*640235e2SEnji Cooper { 69*640235e2SEnji Cooper char usages_path[PATH_MAX]; 70*640235e2SEnji Cooper 71*640235e2SEnji Cooper (void)strlcpy(usages_path, atf_tc_get_config_var(tc, "srcdir"), 72*640235e2SEnji Cooper sizeof(usages_path)); 73*640235e2SEnji Cooper (void)strlcat(usages_path, "/test_usb_hid_usages", 74*640235e2SEnji Cooper sizeof(usages_path)); 75*640235e2SEnji Cooper 76*640235e2SEnji Cooper hid_init(usages_path); 77*640235e2SEnji Cooper 78*640235e2SEnji Cooper ATF_CHECK_STREQ("t_usbhid_page", hid_usage_page(0xff1b)); 79*640235e2SEnji Cooper ATF_CHECK_EQ((uint32_t)hid_parse_usage_page("t_usbhid_page"), 0xff1b); 80*640235e2SEnji Cooper 81*640235e2SEnji Cooper ATF_CHECK_STREQ("t_usbhid_usage", hid_usage_in_page(0xff1bff2a)); 82*640235e2SEnji Cooper ATF_CHECK_EQ((uint32_t)hid_parse_usage_in_page( 83*640235e2SEnji Cooper "t_usbhid_page:t_usbhid_usage"), 0xff1bff2a); 84*640235e2SEnji Cooper 85*640235e2SEnji Cooper ATF_CHECK_STREQ("Quick_zephyrs_blow_vexing_daft_Jim_", 86*640235e2SEnji Cooper hid_usage_page(0xff2a)); 87*640235e2SEnji Cooper ATF_CHECK_EQ((uint32_t)hid_parse_usage_page( 88*640235e2SEnji Cooper "Quick_zephyrs_blow_vexing_daft_Jim_"), 0xff2a); 89*640235e2SEnji Cooper 90*640235e2SEnji Cooper ATF_CHECK_STREQ("Usage_ID_Zero_%", hid_usage_in_page(0xff2a0000)); 91*640235e2SEnji Cooper ATF_CHECK_EQ((uint32_t)hid_parse_usage_in_page( 92*640235e2SEnji Cooper "Quick_zephyrs_blow_vexing_daft_Jim_:Usage_ID_Zero_%"), 93*640235e2SEnji Cooper 0xff2a0000); 94*640235e2SEnji Cooper 95*640235e2SEnji Cooper //ATF_CHECK_STREQ("Usage_ID_0_%", hid_usage_in_page(0xff2a0000)); 96*640235e2SEnji Cooper ATF_CHECK_EQ((uint32_t)hid_parse_usage_in_page( 97*640235e2SEnji Cooper "Quick_zephyrs_blow_vexing_daft_Jim_:Usage_ID_0_%"), 0xff2a0000); 98*640235e2SEnji Cooper 99*640235e2SEnji Cooper ATF_CHECK_STREQ("Usage_ID_65535_%", hid_usage_in_page(0xff2affff)); 100*640235e2SEnji Cooper ATF_CHECK_EQ((uint32_t)hid_parse_usage_in_page( 101*640235e2SEnji Cooper "Quick_zephyrs_blow_vexing_daft_Jim_:Usage_ID_65535_%"), 102*640235e2SEnji Cooper 0xff2affff); 103*640235e2SEnji Cooper 104*640235e2SEnji Cooper MYx_ATF_CHECK_EQ((uint32_t)hid_parse_usage_in_page("0xff2a:0xff1b"), 105*640235e2SEnji Cooper 0xff2aff1b); 106*640235e2SEnji Cooper } 107*640235e2SEnji Cooper 108*640235e2SEnji Cooper ATF_TC_HEAD(check_hid_logical_range, tc) 109*640235e2SEnji Cooper { 110*640235e2SEnji Cooper 111*640235e2SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test hid_get_item " 112*640235e2SEnji Cooper "Logical Minimum/Maximum results"); 113*640235e2SEnji Cooper } 114*640235e2SEnji Cooper 115*640235e2SEnji Cooper ATF_TC_BODY(check_hid_logical_range, tc) 116*640235e2SEnji Cooper { 117*640235e2SEnji Cooper report_desc_t hrd; 118*640235e2SEnji Cooper hid_item_t hi; 119*640235e2SEnji Cooper uint32_t minimum, maximum; 120*640235e2SEnji Cooper 121*640235e2SEnji Cooper atf_tc_expect_fail("only the 32-bit opcode works, " 122*640235e2SEnji Cooper "8 and 16-bit is broken"); 123*640235e2SEnji Cooper 124*640235e2SEnji Cooper ATF_REQUIRE((hrd = hid_use_report_desc(range_test_report_descriptor, 125*640235e2SEnji Cooper __arraycount(range_test_report_descriptor))) != NULL); 126*640235e2SEnji Cooper ATF_REQUIRE(hid_locate(hrd, 0xff000001U, hid_input, &hi, 127*640235e2SEnji Cooper NO_REPORT_ID) > 0); 128*640235e2SEnji Cooper MYd_ATF_CHECK_EQ(hi.logical_minimum, -128); 129*640235e2SEnji Cooper MYd_ATF_CHECK_EQ(hi.logical_maximum, 127); 130*640235e2SEnji Cooper ATF_REQUIRE(hid_locate(hrd, 0xff000002U, hid_input, &hi, 131*640235e2SEnji Cooper NO_REPORT_ID) > 0); 132*640235e2SEnji Cooper MYd_ATF_CHECK_EQ(hi.logical_minimum, -32768); 133*640235e2SEnji Cooper MYd_ATF_CHECK_EQ(hi.logical_maximum, 32767); 134*640235e2SEnji Cooper ATF_REQUIRE(hid_locate(hrd, 0xff000003U, hid_input, &hi, 135*640235e2SEnji Cooper NO_REPORT_ID) > 0); 136*640235e2SEnji Cooper MYd_ATF_CHECK_EQ(hi.logical_minimum, -2147483648); 137*640235e2SEnji Cooper MYd_ATF_CHECK_EQ(hi.logical_maximum, 2147483647); 138*640235e2SEnji Cooper 139*640235e2SEnji Cooper hid_dispose_report_desc(hrd); 140*640235e2SEnji Cooper hrd = NULL; 141*640235e2SEnji Cooper 142*640235e2SEnji Cooper ATF_REQUIRE((hrd = hid_use_report_desc( 143*640235e2SEnji Cooper unsigned_range_test_report_descriptor, 144*640235e2SEnji Cooper __arraycount(unsigned_range_test_report_descriptor))) != NULL); 145*640235e2SEnji Cooper ATF_REQUIRE(hid_locate(hrd, 0xff000011U, hid_input, &hi, 146*640235e2SEnji Cooper NO_REPORT_ID) > 0); 147*640235e2SEnji Cooper ATF_CHECK(hi.logical_minimum > hi.logical_maximum); 148*640235e2SEnji Cooper minimum = (uint32_t)hi.logical_minimum & ((1ULL<<hi.report_size)-1); 149*640235e2SEnji Cooper MYu_ATF_CHECK_EQ(minimum, 0); 150*640235e2SEnji Cooper maximum = (uint32_t)hi.logical_maximum & ((1ULL<<hi.report_size)-1); 151*640235e2SEnji Cooper MYu_ATF_CHECK_EQ(maximum, 255); 152*640235e2SEnji Cooper ATF_REQUIRE(hid_locate(hrd, 0xff000012U, hid_input, &hi, 153*640235e2SEnji Cooper NO_REPORT_ID) > 0); 154*640235e2SEnji Cooper ATF_CHECK(hi.logical_minimum > hi.logical_maximum); 155*640235e2SEnji Cooper minimum = hi.logical_minimum & ((1ULL<<hi.report_size)-1); 156*640235e2SEnji Cooper MYu_ATF_CHECK_EQ(minimum, 0); 157*640235e2SEnji Cooper maximum = hi.logical_maximum & ((1ULL<<hi.report_size)-1); 158*640235e2SEnji Cooper MYu_ATF_CHECK_EQ(maximum, 65535); 159*640235e2SEnji Cooper ATF_REQUIRE(hid_locate(hrd, 0xff000013U, hid_input, &hi, 160*640235e2SEnji Cooper NO_REPORT_ID) > 0); 161*640235e2SEnji Cooper ATF_CHECK(hi.logical_minimum > hi.logical_maximum); 162*640235e2SEnji Cooper minimum = hi.logical_minimum & ((1ULL<<hi.report_size)-1); 163*640235e2SEnji Cooper MYu_ATF_CHECK_EQ(minimum, 0); 164*640235e2SEnji Cooper maximum = hi.logical_maximum & ((1ULL<<hi.report_size)-1); 165*640235e2SEnji Cooper MYu_ATF_CHECK_EQ(maximum, 4294967295); 166*640235e2SEnji Cooper 167*640235e2SEnji Cooper hid_dispose_report_desc(hrd); 168*640235e2SEnji Cooper hrd = NULL; 169*640235e2SEnji Cooper } 170*640235e2SEnji Cooper 171*640235e2SEnji Cooper ATF_TC_HEAD(check_hid_physical_range, tc) 172*640235e2SEnji Cooper { 173*640235e2SEnji Cooper 174*640235e2SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test hid_get_item " 175*640235e2SEnji Cooper "Physical Minimum/Maximum results"); 176*640235e2SEnji Cooper } 177*640235e2SEnji Cooper 178*640235e2SEnji Cooper ATF_TC_BODY(check_hid_physical_range, tc) 179*640235e2SEnji Cooper { 180*640235e2SEnji Cooper report_desc_t hrd; 181*640235e2SEnji Cooper hid_item_t hi; 182*640235e2SEnji Cooper uint32_t minimum, maximum; 183*640235e2SEnji Cooper 184*640235e2SEnji Cooper atf_tc_expect_fail("only the 32-bit opcode works, " 185*640235e2SEnji Cooper "8 and 16-bit is broken"); 186*640235e2SEnji Cooper 187*640235e2SEnji Cooper ATF_REQUIRE((hrd = hid_use_report_desc(range_test_report_descriptor, 188*640235e2SEnji Cooper __arraycount(range_test_report_descriptor))) != NULL); 189*640235e2SEnji Cooper ATF_REQUIRE(hid_locate(hrd, 0xff000001U, hid_input, &hi, 190*640235e2SEnji Cooper NO_REPORT_ID) > 0); 191*640235e2SEnji Cooper MYd_ATF_CHECK_EQ(hi.physical_minimum, -128); 192*640235e2SEnji Cooper MYd_ATF_CHECK_EQ(hi.physical_maximum, 127); 193*640235e2SEnji Cooper ATF_REQUIRE(hid_locate(hrd, 0xff000002U, hid_input, &hi, 194*640235e2SEnji Cooper NO_REPORT_ID) > 0); 195*640235e2SEnji Cooper MYd_ATF_CHECK_EQ(hi.physical_minimum, -32768); 196*640235e2SEnji Cooper MYd_ATF_CHECK_EQ(hi.physical_maximum, 32767); 197*640235e2SEnji Cooper ATF_REQUIRE(hid_locate(hrd, 0xff000003U, hid_input, &hi, 198*640235e2SEnji Cooper NO_REPORT_ID) > 0); 199*640235e2SEnji Cooper MYd_ATF_CHECK_EQ(hi.physical_minimum, -2147483648); 200*640235e2SEnji Cooper MYd_ATF_CHECK_EQ(hi.physical_maximum, 2147483647); 201*640235e2SEnji Cooper 202*640235e2SEnji Cooper hid_dispose_report_desc(hrd); 203*640235e2SEnji Cooper hrd = NULL; 204*640235e2SEnji Cooper 205*640235e2SEnji Cooper ATF_REQUIRE((hrd = hid_use_report_desc( 206*640235e2SEnji Cooper unsigned_range_test_report_descriptor, 207*640235e2SEnji Cooper __arraycount(unsigned_range_test_report_descriptor))) != NULL); 208*640235e2SEnji Cooper ATF_REQUIRE(hid_locate(hrd, 0xff000011U, hid_input, &hi, 209*640235e2SEnji Cooper NO_REPORT_ID) > 0); 210*640235e2SEnji Cooper ATF_CHECK(hi.physical_minimum > hi.physical_maximum); 211*640235e2SEnji Cooper minimum = (uint32_t)hi.physical_minimum & ((1ULL<<hi.report_size)-1); 212*640235e2SEnji Cooper MYu_ATF_CHECK_EQ(minimum, 0); 213*640235e2SEnji Cooper maximum = (uint32_t)hi.physical_maximum & ((1ULL<<hi.report_size)-1); 214*640235e2SEnji Cooper MYu_ATF_CHECK_EQ(maximum, 255); 215*640235e2SEnji Cooper ATF_REQUIRE(hid_locate(hrd, 0xff000012U, hid_input, &hi, 216*640235e2SEnji Cooper NO_REPORT_ID) > 0); 217*640235e2SEnji Cooper ATF_CHECK(hi.physical_minimum > hi.physical_maximum); 218*640235e2SEnji Cooper minimum = hi.physical_minimum & ((1ULL<<hi.report_size)-1); 219*640235e2SEnji Cooper MYu_ATF_CHECK_EQ(minimum, 0); 220*640235e2SEnji Cooper maximum = hi.physical_maximum & ((1ULL<<hi.report_size)-1); 221*640235e2SEnji Cooper MYu_ATF_CHECK_EQ(maximum, 65535); 222*640235e2SEnji Cooper ATF_REQUIRE(hid_locate(hrd, 0xff000013U, hid_input, &hi, 223*640235e2SEnji Cooper NO_REPORT_ID) > 0); 224*640235e2SEnji Cooper ATF_CHECK(hi.physical_minimum > hi.physical_maximum); 225*640235e2SEnji Cooper minimum = hi.physical_minimum & ((1ULL<<hi.report_size)-1); 226*640235e2SEnji Cooper MYu_ATF_CHECK_EQ(minimum, 0); 227*640235e2SEnji Cooper maximum = hi.physical_maximum & ((1ULL<<hi.report_size)-1); 228*640235e2SEnji Cooper MYu_ATF_CHECK_EQ(maximum, 4294967295); 229*640235e2SEnji Cooper 230*640235e2SEnji Cooper hid_dispose_report_desc(hrd); 231*640235e2SEnji Cooper hrd = NULL; 232*640235e2SEnji Cooper } 233*640235e2SEnji Cooper 234*640235e2SEnji Cooper ATF_TC_HEAD(check_hid_get_data, tc) 235*640235e2SEnji Cooper { 236*640235e2SEnji Cooper 237*640235e2SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test hid_get_data results"); 238*640235e2SEnji Cooper } 239*640235e2SEnji Cooper 240*640235e2SEnji Cooper ATF_TC_BODY(check_hid_get_data, tc) 241*640235e2SEnji Cooper { 242*640235e2SEnji Cooper report_desc_t hrd; 243*640235e2SEnji Cooper hid_item_t hi; 244*640235e2SEnji Cooper int32_t data; 245*640235e2SEnji Cooper uint32_t udat; 246*640235e2SEnji Cooper 247*640235e2SEnji Cooper ATF_REQUIRE((hrd = hid_use_report_desc( 248*640235e2SEnji Cooper range_test_report_descriptor, 249*640235e2SEnji Cooper __arraycount(range_test_report_descriptor))) != NULL); 250*640235e2SEnji Cooper 251*640235e2SEnji Cooper ATF_REQUIRE(hid_locate(hrd, 0xff000001U, hid_input, &hi, 252*640235e2SEnji Cooper NO_REPORT_ID) > 0); 253*640235e2SEnji Cooper data = hid_get_data(range_test_minimum_report, &hi); 254*640235e2SEnji Cooper MYd_ATF_CHECK_EQ(data, -128); 255*640235e2SEnji Cooper data = hid_get_data(range_test_negative_one_report, &hi); 256*640235e2SEnji Cooper MYd_ATF_CHECK_EQ(data, -1); 257*640235e2SEnji Cooper data = hid_get_data(range_test_positive_one_report, &hi); 258*640235e2SEnji Cooper MYd_ATF_CHECK_EQ(data, 1); 259*640235e2SEnji Cooper data = hid_get_data(range_test_maximum_report, &hi); 260*640235e2SEnji Cooper MYd_ATF_CHECK_EQ(data, 127); 261*640235e2SEnji Cooper 262*640235e2SEnji Cooper ATF_REQUIRE(hid_locate(hrd, 0xff000002U, hid_input, &hi, 263*640235e2SEnji Cooper NO_REPORT_ID) > 0); 264*640235e2SEnji Cooper data = hid_get_data(range_test_minimum_report, &hi); 265*640235e2SEnji Cooper MYd_ATF_CHECK_EQ(data, -32768); 266*640235e2SEnji Cooper data = hid_get_data(range_test_negative_one_report, &hi); 267*640235e2SEnji Cooper MYd_ATF_CHECK_EQ(data, -1); 268*640235e2SEnji Cooper data = hid_get_data(range_test_positive_one_report, &hi); 269*640235e2SEnji Cooper MYd_ATF_CHECK_EQ(data, 1); 270*640235e2SEnji Cooper data = hid_get_data(range_test_maximum_report, &hi); 271*640235e2SEnji Cooper MYd_ATF_CHECK_EQ(data, 32767); 272*640235e2SEnji Cooper 273*640235e2SEnji Cooper ATF_REQUIRE(hid_locate(hrd, 0xff000003U, hid_input, &hi, 274*640235e2SEnji Cooper NO_REPORT_ID) > 0); 275*640235e2SEnji Cooper data = hid_get_data(range_test_minimum_report, &hi); 276*640235e2SEnji Cooper MYd_ATF_CHECK_EQ(data, -2147483648); 277*640235e2SEnji Cooper data = hid_get_data(range_test_negative_one_report, &hi); 278*640235e2SEnji Cooper MYd_ATF_CHECK_EQ(data, -1); 279*640235e2SEnji Cooper data = hid_get_data(range_test_positive_one_report, &hi); 280*640235e2SEnji Cooper MYd_ATF_CHECK_EQ(data, 1); 281*640235e2SEnji Cooper data = hid_get_data(range_test_maximum_report, &hi); 282*640235e2SEnji Cooper MYd_ATF_CHECK_EQ(data, 2147483647); 283*640235e2SEnji Cooper 284*640235e2SEnji Cooper hid_dispose_report_desc(hrd); 285*640235e2SEnji Cooper hrd = NULL; 286*640235e2SEnji Cooper 287*640235e2SEnji Cooper ATF_REQUIRE((hrd = hid_use_report_desc( 288*640235e2SEnji Cooper unsigned_range_test_report_descriptor, 289*640235e2SEnji Cooper __arraycount(unsigned_range_test_report_descriptor))) != NULL); 290*640235e2SEnji Cooper ATF_REQUIRE(hid_locate(hrd, 0xff000011U, hid_input, &hi, 291*640235e2SEnji Cooper NO_REPORT_ID) > 0); 292*640235e2SEnji Cooper udat = hid_get_data(unsigned_range_test_minimum_report, &hi); 293*640235e2SEnji Cooper MYu_ATF_CHECK_EQ(udat, 0); 294*640235e2SEnji Cooper udat = hid_get_data(unsigned_range_test_positive_one_report, &hi); 295*640235e2SEnji Cooper MYu_ATF_CHECK_EQ(udat, 1); 296*640235e2SEnji Cooper udat = hid_get_data(unsigned_range_test_negative_one_report, &hi); 297*640235e2SEnji Cooper MYu_ATF_CHECK_EQ(udat, 254); 298*640235e2SEnji Cooper udat = hid_get_data(unsigned_range_test_maximum_report, &hi); 299*640235e2SEnji Cooper MYu_ATF_CHECK_EQ(udat, 255); 300*640235e2SEnji Cooper 301*640235e2SEnji Cooper ATF_REQUIRE(hid_locate(hrd, 0xff000012U, hid_input, &hi, 302*640235e2SEnji Cooper NO_REPORT_ID) > 0); 303*640235e2SEnji Cooper udat = hid_get_data(unsigned_range_test_minimum_report, &hi); 304*640235e2SEnji Cooper MYu_ATF_CHECK_EQ(udat, 0); 305*640235e2SEnji Cooper udat = hid_get_data(unsigned_range_test_positive_one_report, &hi); 306*640235e2SEnji Cooper MYu_ATF_CHECK_EQ(udat, 1); 307*640235e2SEnji Cooper udat = hid_get_data(unsigned_range_test_negative_one_report, &hi); 308*640235e2SEnji Cooper MYu_ATF_CHECK_EQ(udat, 65534); 309*640235e2SEnji Cooper udat = hid_get_data(unsigned_range_test_maximum_report, &hi); 310*640235e2SEnji Cooper MYu_ATF_CHECK_EQ(udat, 65535); 311*640235e2SEnji Cooper 312*640235e2SEnji Cooper ATF_REQUIRE(hid_locate(hrd, 0xff000013U, hid_input, &hi, 313*640235e2SEnji Cooper NO_REPORT_ID) > 0); 314*640235e2SEnji Cooper udat = hid_get_data(unsigned_range_test_minimum_report, &hi); 315*640235e2SEnji Cooper MYu_ATF_CHECK_EQ(udat, 0); 316*640235e2SEnji Cooper udat = hid_get_data(unsigned_range_test_positive_one_report, &hi); 317*640235e2SEnji Cooper MYu_ATF_CHECK_EQ(udat, 1); 318*640235e2SEnji Cooper udat = hid_get_data(unsigned_range_test_negative_one_report, &hi); 319*640235e2SEnji Cooper MYu_ATF_CHECK_EQ(udat, 4294967294); 320*640235e2SEnji Cooper udat = hid_get_data(unsigned_range_test_maximum_report, &hi); 321*640235e2SEnji Cooper MYu_ATF_CHECK_EQ(udat, 4294967295); 322*640235e2SEnji Cooper 323*640235e2SEnji Cooper hid_dispose_report_desc(hrd); 324*640235e2SEnji Cooper hrd = NULL; 325*640235e2SEnji Cooper } 326*640235e2SEnji Cooper 327*640235e2SEnji Cooper ATF_TC_HEAD(check_hid_set_data, tc) 328*640235e2SEnji Cooper { 329*640235e2SEnji Cooper 330*640235e2SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test hid_set_data results"); 331*640235e2SEnji Cooper } 332*640235e2SEnji Cooper 333*640235e2SEnji Cooper ATF_TC_BODY(check_hid_set_data, tc) 334*640235e2SEnji Cooper { 335*640235e2SEnji Cooper report_desc_t hrd; 336*640235e2SEnji Cooper hid_item_t hi; 337*640235e2SEnji Cooper uint8_t test_data_minimum[7]; 338*640235e2SEnji Cooper uint8_t test_data_negative_one[7]; 339*640235e2SEnji Cooper uint8_t test_data_positive_one[7]; 340*640235e2SEnji Cooper uint8_t test_data_maximum[7]; 341*640235e2SEnji Cooper 342*640235e2SEnji Cooper ATF_REQUIRE((hrd = hid_use_report_desc( 343*640235e2SEnji Cooper range_test_report_descriptor, 344*640235e2SEnji Cooper __arraycount(range_test_report_descriptor))) != NULL); 345*640235e2SEnji Cooper ATF_REQUIRE(hid_locate(hrd, 0xff000001U, hid_input, &hi, 346*640235e2SEnji Cooper NO_REPORT_ID) > 0); 347*640235e2SEnji Cooper hid_set_data(test_data_minimum, &hi, -128); 348*640235e2SEnji Cooper hid_set_data(test_data_negative_one, &hi, -1); 349*640235e2SEnji Cooper hid_set_data(test_data_positive_one, &hi, 1); 350*640235e2SEnji Cooper hid_set_data(test_data_maximum, &hi, 127); 351*640235e2SEnji Cooper ATF_REQUIRE(hid_locate(hrd, 0xff000002U, hid_input, &hi, 352*640235e2SEnji Cooper NO_REPORT_ID) > 0); 353*640235e2SEnji Cooper hid_set_data(test_data_minimum, &hi, -32768); 354*640235e2SEnji Cooper hid_set_data(test_data_negative_one, &hi, -1); 355*640235e2SEnji Cooper hid_set_data(test_data_positive_one, &hi, 1); 356*640235e2SEnji Cooper hid_set_data(test_data_maximum, &hi, 32767); 357*640235e2SEnji Cooper ATF_REQUIRE(hid_locate(hrd, 0xff000003U, hid_input, &hi, 358*640235e2SEnji Cooper NO_REPORT_ID) > 0); 359*640235e2SEnji Cooper hid_set_data(test_data_minimum, &hi, -2147483648); 360*640235e2SEnji Cooper hid_set_data(test_data_negative_one, &hi, -1); 361*640235e2SEnji Cooper hid_set_data(test_data_positive_one, &hi, 1); 362*640235e2SEnji Cooper hid_set_data(test_data_maximum, &hi, 2147483647); 363*640235e2SEnji Cooper ATF_CHECK(memcmp(test_data_minimum, range_test_minimum_report, 364*640235e2SEnji Cooper sizeof test_data_minimum) == 0); 365*640235e2SEnji Cooper ATF_CHECK(memcmp(test_data_negative_one, 366*640235e2SEnji Cooper range_test_negative_one_report, 367*640235e2SEnji Cooper sizeof test_data_negative_one) == 0); 368*640235e2SEnji Cooper ATF_CHECK(memcmp(test_data_positive_one, 369*640235e2SEnji Cooper range_test_positive_one_report, 370*640235e2SEnji Cooper sizeof test_data_positive_one) == 0); 371*640235e2SEnji Cooper ATF_CHECK(memcmp(test_data_maximum, range_test_maximum_report, 372*640235e2SEnji Cooper sizeof test_data_maximum) == 0); 373*640235e2SEnji Cooper 374*640235e2SEnji Cooper hid_dispose_report_desc(hrd); 375*640235e2SEnji Cooper hrd = NULL; 376*640235e2SEnji Cooper 377*640235e2SEnji Cooper ATF_REQUIRE((hrd = hid_use_report_desc( 378*640235e2SEnji Cooper unsigned_range_test_report_descriptor, 379*640235e2SEnji Cooper __arraycount(range_test_report_descriptor))) != NULL); 380*640235e2SEnji Cooper ATF_REQUIRE(hid_locate(hrd, 0xff000011U, hid_input, &hi, 381*640235e2SEnji Cooper NO_REPORT_ID) > 0); 382*640235e2SEnji Cooper hid_set_data(test_data_minimum, &hi, 0); 383*640235e2SEnji Cooper hid_set_data(test_data_positive_one, &hi, 1); 384*640235e2SEnji Cooper hid_set_data(test_data_negative_one, &hi, 0xfffffffe); 385*640235e2SEnji Cooper hid_set_data(test_data_maximum, &hi, 0xffffffff); 386*640235e2SEnji Cooper ATF_REQUIRE(hid_locate(hrd, 0xff000012U, hid_input, &hi, 387*640235e2SEnji Cooper NO_REPORT_ID) > 0); 388*640235e2SEnji Cooper hid_set_data(test_data_minimum, &hi, 0); 389*640235e2SEnji Cooper hid_set_data(test_data_positive_one, &hi, 1); 390*640235e2SEnji Cooper hid_set_data(test_data_negative_one, &hi, 0xfffe); 391*640235e2SEnji Cooper hid_set_data(test_data_maximum, &hi, 0xffff); 392*640235e2SEnji Cooper ATF_REQUIRE(hid_locate(hrd, 0xff000013U, hid_input, &hi, 393*640235e2SEnji Cooper NO_REPORT_ID) > 0); 394*640235e2SEnji Cooper hid_set_data(test_data_minimum, &hi, 0); 395*640235e2SEnji Cooper hid_set_data(test_data_positive_one, &hi, 1); 396*640235e2SEnji Cooper hid_set_data(test_data_negative_one, &hi, 0xfffffffe); 397*640235e2SEnji Cooper hid_set_data(test_data_maximum, &hi, 0xffffffff); 398*640235e2SEnji Cooper ATF_CHECK(memcmp(test_data_minimum, 399*640235e2SEnji Cooper unsigned_range_test_minimum_report, 400*640235e2SEnji Cooper sizeof test_data_minimum) == 0); 401*640235e2SEnji Cooper ATF_CHECK(memcmp(test_data_negative_one, 402*640235e2SEnji Cooper unsigned_range_test_negative_one_report, 403*640235e2SEnji Cooper sizeof test_data_negative_one) == 0); 404*640235e2SEnji Cooper ATF_CHECK(memcmp(test_data_positive_one, 405*640235e2SEnji Cooper unsigned_range_test_positive_one_report, 406*640235e2SEnji Cooper sizeof test_data_positive_one) == 0); 407*640235e2SEnji Cooper ATF_CHECK(memcmp(test_data_maximum, 408*640235e2SEnji Cooper unsigned_range_test_maximum_report, 409*640235e2SEnji Cooper sizeof test_data_maximum) == 0); 410*640235e2SEnji Cooper 411*640235e2SEnji Cooper hid_dispose_report_desc(hrd); 412*640235e2SEnji Cooper hrd = NULL; 413*640235e2SEnji Cooper } 414*640235e2SEnji Cooper 415*640235e2SEnji Cooper ATF_TC_HEAD(check_parse_just_pop, tc) 416*640235e2SEnji Cooper { 417*640235e2SEnji Cooper 418*640235e2SEnji Cooper atf_tc_set_md_var(tc, "descr", "check Pop on empty stack bug"); 419*640235e2SEnji Cooper } 420*640235e2SEnji Cooper 421*640235e2SEnji Cooper ATF_TC_BODY(check_parse_just_pop, tc) 422*640235e2SEnji Cooper { 423*640235e2SEnji Cooper report_desc_t hrd; 424*640235e2SEnji Cooper hid_data_t hd; 425*640235e2SEnji Cooper hid_item_t hi; 426*640235e2SEnji Cooper 427*640235e2SEnji Cooper ATF_REQUIRE((hrd = hid_use_report_desc( 428*640235e2SEnji Cooper just_pop_report_descriptor, 429*640235e2SEnji Cooper sizeof just_pop_report_descriptor)) != NULL); 430*640235e2SEnji Cooper hd = hid_start_parse(hrd, 0, NO_REPORT_ID); 431*640235e2SEnji Cooper while (hid_get_item(hd, &hi) > 0) { 432*640235e2SEnji Cooper } 433*640235e2SEnji Cooper hid_end_parse(hd); 434*640235e2SEnji Cooper hid_dispose_report_desc(hrd); 435*640235e2SEnji Cooper hrd = NULL; 436*640235e2SEnji Cooper } 437*640235e2SEnji Cooper 438*640235e2SEnji Cooper ATF_TP_ADD_TCS(tp) 439*640235e2SEnji Cooper { 440*640235e2SEnji Cooper 441*640235e2SEnji Cooper ATF_TP_ADD_TC(tp, check_hid_logical_range); 442*640235e2SEnji Cooper ATF_TP_ADD_TC(tp, check_hid_physical_range); 443*640235e2SEnji Cooper ATF_TP_ADD_TC(tp, check_hid_usage); 444*640235e2SEnji Cooper ATF_TP_ADD_TC(tp, check_hid_get_data); 445*640235e2SEnji Cooper ATF_TP_ADD_TC(tp, check_hid_set_data); 446*640235e2SEnji Cooper ATF_TP_ADD_TC(tp, check_parse_just_pop); 447*640235e2SEnji Cooper 448*640235e2SEnji Cooper return atf_no_error(); 449*640235e2SEnji Cooper } 450