1251881Speter/* $NetBSD: t_usbhid.c,v 1.12 2016/08/17 12:10:42 jakllsch Exp $ */ 2251881Speter 3251881Speter/* 4251881Speter * Copyright (c) 2016 Jonathan A. Kollasch 5251881Speter * All rights reserved. 6251881Speter * 7251881Speter * Redistribution and use in source and binary forms, with or without 8251881Speter * modification, are permitted provided that the following conditions 9251881Speter * are met: 10251881Speter * 1. Redistributions of source code must retain the above copyright 11251881Speter * notice, this list of conditions and the following disclaimer. 12251881Speter * 2. Redistributions in binary form must reproduce the above copyright 13251881Speter * notice, this list of conditions and the following disclaimer in the 14251881Speter * documentation and/or other materials provided with the distribution. 15251881Speter * 16251881Speter * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17251881Speter * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 18251881Speter * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 19251881Speter * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR 20251881Speter * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 21251881Speter * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 22251881Speter * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 23251881Speter * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 24251881Speter * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 25251881Speter * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 26251881Speter * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27251881Speter */ 28251881Speter 29251881Speter#include <sys/cdefs.h> 30251881Speter__RCSID("$NetBSD: t_usbhid.c,v 1.12 2016/08/17 12:10:42 jakllsch Exp $"); 31251881Speter 32251881Speter#include <atf-c.h> 33251881Speter 34251881Speter#include <inttypes.h> 35251881Speter#include <usbhid.h> 36251881Speter#include <string.h> 37251881Speter 38251881Speter#include <stdio.h> 39251881Speter#include <stdlib.h> 40251881Speter 41251881Speter#include <limits.h> 42251881Speter 43251881SpeterATF_TC(check_hid_logical_range); 44251881SpeterATF_TC(check_hid_physical_range); 45251881SpeterATF_TC(check_hid_usage); 46251881SpeterATF_TC(check_hid_get_data); 47251881SpeterATF_TC(check_hid_set_data); 48251881SpeterATF_TC(check_parse_just_pop); 49251881Speter 50251881Speter#define MYd_ATF_CHECK_EQ(d, v) \ 51299742Sdim ATF_CHECK_EQ_MSG(d, v, "== %d", (d)) 52251881Speter 53251881Speter#define MYu_ATF_CHECK_EQ(d, v) \ 54251881Speter ATF_CHECK_EQ_MSG(d, v, "== %u", (d)) 55251881Speter 56251881Speter#define MYx_ATF_CHECK_EQ(d, v) \ 57251881Speter ATF_CHECK_EQ_MSG(d, v, "== 0x%x", (d)) 58251881Speter 59251881Speter#include "hid_test_data.c" 60251881Speter 61251881SpeterATF_TC_HEAD(check_hid_usage, tc) 62251881Speter{ 63251881Speter 64251881Speter atf_tc_set_md_var(tc, "descr", "Test libusbhid usage.c"); 65251881Speter} 66251881Speter 67251881SpeterATF_TC_BODY(check_hid_usage, tc) 68251881Speter{ 69251881Speter char usages_path[PATH_MAX]; 70251881Speter 71251881Speter (void)strlcpy(usages_path, atf_tc_get_config_var(tc, "srcdir"), 72251881Speter sizeof(usages_path)); 73251881Speter (void)strlcat(usages_path, "/test_usb_hid_usages", 74251881Speter sizeof(usages_path)); 75251881Speter 76251881Speter hid_init(usages_path); 77251881Speter 78251881Speter ATF_CHECK_STREQ("t_usbhid_page", hid_usage_page(0xff1b)); 79251881Speter ATF_CHECK_EQ((uint32_t)hid_parse_usage_page("t_usbhid_page"), 0xff1b); 80251881Speter 81251881Speter ATF_CHECK_STREQ("t_usbhid_usage", hid_usage_in_page(0xff1bff2a)); 82251881Speter ATF_CHECK_EQ((uint32_t)hid_parse_usage_in_page( 83251881Speter "t_usbhid_page:t_usbhid_usage"), 0xff1bff2a); 84251881Speter 85251881Speter ATF_CHECK_STREQ("Quick_zephyrs_blow_vexing_daft_Jim_", 86251881Speter hid_usage_page(0xff2a)); 87251881Speter ATF_CHECK_EQ((uint32_t)hid_parse_usage_page( 88251881Speter "Quick_zephyrs_blow_vexing_daft_Jim_"), 0xff2a); 89251881Speter 90251881Speter ATF_CHECK_STREQ("Usage_ID_Zero_%", hid_usage_in_page(0xff2a0000)); 91251881Speter ATF_CHECK_EQ((uint32_t)hid_parse_usage_in_page( 92251881Speter "Quick_zephyrs_blow_vexing_daft_Jim_:Usage_ID_Zero_%"), 93251881Speter 0xff2a0000); 94251881Speter 95251881Speter //ATF_CHECK_STREQ("Usage_ID_0_%", hid_usage_in_page(0xff2a0000)); 96251881Speter ATF_CHECK_EQ((uint32_t)hid_parse_usage_in_page( 97251881Speter "Quick_zephyrs_blow_vexing_daft_Jim_:Usage_ID_0_%"), 0xff2a0000); 98251881Speter 99251881Speter ATF_CHECK_STREQ("Usage_ID_65535_%", hid_usage_in_page(0xff2affff)); 100251881Speter ATF_CHECK_EQ((uint32_t)hid_parse_usage_in_page( 101251881Speter "Quick_zephyrs_blow_vexing_daft_Jim_:Usage_ID_65535_%"), 102251881Speter 0xff2affff); 103251881Speter 104251881Speter MYx_ATF_CHECK_EQ((uint32_t)hid_parse_usage_in_page("0xff2a:0xff1b"), 105251881Speter 0xff2aff1b); 106251881Speter} 107251881Speter 108251881SpeterATF_TC_HEAD(check_hid_logical_range, tc) 109251881Speter{ 110251881Speter 111251881Speter atf_tc_set_md_var(tc, "descr", "Test hid_get_item " 112251881Speter "Logical Minimum/Maximum results"); 113251881Speter} 114251881Speter 115251881SpeterATF_TC_BODY(check_hid_logical_range, tc) 116251881Speter{ 117251881Speter report_desc_t hrd; 118251881Speter hid_item_t hi; 119251881Speter uint32_t minimum, maximum; 120251881Speter 121251881Speter atf_tc_expect_fail("only the 32-bit opcode works, " 122251881Speter "8 and 16-bit is broken"); 123251881Speter 124251881Speter ATF_REQUIRE((hrd = hid_use_report_desc(range_test_report_descriptor, 125251881Speter __arraycount(range_test_report_descriptor))) != NULL); 126251881Speter ATF_REQUIRE(hid_locate(hrd, 0xff000001U, hid_input, &hi, 127251881Speter NO_REPORT_ID) > 0); 128251881Speter MYd_ATF_CHECK_EQ(hi.logical_minimum, -128); 129251881Speter MYd_ATF_CHECK_EQ(hi.logical_maximum, 127); 130251881Speter ATF_REQUIRE(hid_locate(hrd, 0xff000002U, hid_input, &hi, 131251881Speter NO_REPORT_ID) > 0); 132251881Speter MYd_ATF_CHECK_EQ(hi.logical_minimum, -32768); 133251881Speter MYd_ATF_CHECK_EQ(hi.logical_maximum, 32767); 134251881Speter ATF_REQUIRE(hid_locate(hrd, 0xff000003U, hid_input, &hi, 135251881Speter NO_REPORT_ID) > 0); 136251881Speter MYd_ATF_CHECK_EQ(hi.logical_minimum, -2147483648); 137251881Speter MYd_ATF_CHECK_EQ(hi.logical_maximum, 2147483647); 138251881Speter 139251881Speter hid_dispose_report_desc(hrd); 140251881Speter hrd = NULL; 141251881Speter 142251881Speter ATF_REQUIRE((hrd = hid_use_report_desc( 143251881Speter unsigned_range_test_report_descriptor, 144251881Speter __arraycount(unsigned_range_test_report_descriptor))) != NULL); 145251881Speter ATF_REQUIRE(hid_locate(hrd, 0xff000011U, hid_input, &hi, 146251881Speter NO_REPORT_ID) > 0); 147251881Speter ATF_CHECK(hi.logical_minimum > hi.logical_maximum); 148251881Speter minimum = (uint32_t)hi.logical_minimum & ((1ULL<<hi.report_size)-1); 149251881Speter MYu_ATF_CHECK_EQ(minimum, 0); 150251881Speter maximum = (uint32_t)hi.logical_maximum & ((1ULL<<hi.report_size)-1); 151251881Speter MYu_ATF_CHECK_EQ(maximum, 255); 152251881Speter ATF_REQUIRE(hid_locate(hrd, 0xff000012U, hid_input, &hi, 153251881Speter NO_REPORT_ID) > 0); 154251881Speter ATF_CHECK(hi.logical_minimum > hi.logical_maximum); 155251881Speter minimum = hi.logical_minimum & ((1ULL<<hi.report_size)-1); 156251881Speter MYu_ATF_CHECK_EQ(minimum, 0); 157251881Speter maximum = hi.logical_maximum & ((1ULL<<hi.report_size)-1); 158251881Speter MYu_ATF_CHECK_EQ(maximum, 65535); 159251881Speter ATF_REQUIRE(hid_locate(hrd, 0xff000013U, hid_input, &hi, 160251881Speter NO_REPORT_ID) > 0); 161251881Speter ATF_CHECK(hi.logical_minimum > hi.logical_maximum); 162251881Speter minimum = hi.logical_minimum & ((1ULL<<hi.report_size)-1); 163251881Speter MYu_ATF_CHECK_EQ(minimum, 0); 164251881Speter maximum = hi.logical_maximum & ((1ULL<<hi.report_size)-1); 165251881Speter MYu_ATF_CHECK_EQ(maximum, 4294967295); 166251881Speter 167251881Speter hid_dispose_report_desc(hrd); 168251881Speter hrd = NULL; 169251881Speter} 170251881Speter 171251881SpeterATF_TC_HEAD(check_hid_physical_range, tc) 172299742Sdim{ 173299742Sdim 174251881Speter atf_tc_set_md_var(tc, "descr", "Test hid_get_item " 175251881Speter "Physical Minimum/Maximum results"); 176251881Speter} 177251881Speter 178251881SpeterATF_TC_BODY(check_hid_physical_range, tc) 179251881Speter{ 180251881Speter report_desc_t hrd; 181251881Speter hid_item_t hi; 182251881Speter uint32_t minimum, maximum; 183251881Speter 184251881Speter atf_tc_expect_fail("only the 32-bit opcode works, " 185251881Speter "8 and 16-bit is broken"); 186251881Speter 187251881Speter ATF_REQUIRE((hrd = hid_use_report_desc(range_test_report_descriptor, 188251881Speter __arraycount(range_test_report_descriptor))) != NULL); 189251881Speter ATF_REQUIRE(hid_locate(hrd, 0xff000001U, hid_input, &hi, 190251881Speter NO_REPORT_ID) > 0); 191251881Speter MYd_ATF_CHECK_EQ(hi.physical_minimum, -128); 192251881Speter MYd_ATF_CHECK_EQ(hi.physical_maximum, 127); 193251881Speter ATF_REQUIRE(hid_locate(hrd, 0xff000002U, hid_input, &hi, 194251881Speter NO_REPORT_ID) > 0); 195251881Speter MYd_ATF_CHECK_EQ(hi.physical_minimum, -32768); 196251881Speter MYd_ATF_CHECK_EQ(hi.physical_maximum, 32767); 197251881Speter ATF_REQUIRE(hid_locate(hrd, 0xff000003U, hid_input, &hi, 198251881Speter NO_REPORT_ID) > 0); 199251881Speter MYd_ATF_CHECK_EQ(hi.physical_minimum, -2147483648); 200251881Speter MYd_ATF_CHECK_EQ(hi.physical_maximum, 2147483647); 201251881Speter 202251881Speter hid_dispose_report_desc(hrd); 203251881Speter hrd = NULL; 204251881Speter 205251881Speter ATF_REQUIRE((hrd = hid_use_report_desc( 206251881Speter unsigned_range_test_report_descriptor, 207251881Speter __arraycount(unsigned_range_test_report_descriptor))) != NULL); 208251881Speter ATF_REQUIRE(hid_locate(hrd, 0xff000011U, hid_input, &hi, 209251881Speter NO_REPORT_ID) > 0); 210299742Sdim ATF_CHECK(hi.physical_minimum > hi.physical_maximum); 211299742Sdim minimum = (uint32_t)hi.physical_minimum & ((1ULL<<hi.report_size)-1); 212251881Speter MYu_ATF_CHECK_EQ(minimum, 0); 213251881Speter maximum = (uint32_t)hi.physical_maximum & ((1ULL<<hi.report_size)-1); 214251881Speter MYu_ATF_CHECK_EQ(maximum, 255); 215251881Speter ATF_REQUIRE(hid_locate(hrd, 0xff000012U, hid_input, &hi, 216251881Speter NO_REPORT_ID) > 0); 217251881Speter ATF_CHECK(hi.physical_minimum > hi.physical_maximum); 218251881Speter minimum = hi.physical_minimum & ((1ULL<<hi.report_size)-1); 219251881Speter MYu_ATF_CHECK_EQ(minimum, 0); 220251881Speter maximum = hi.physical_maximum & ((1ULL<<hi.report_size)-1); 221251881Speter MYu_ATF_CHECK_EQ(maximum, 65535); 222251881Speter ATF_REQUIRE(hid_locate(hrd, 0xff000013U, hid_input, &hi, 223251881Speter NO_REPORT_ID) > 0); 224251881Speter ATF_CHECK(hi.physical_minimum > hi.physical_maximum); 225251881Speter minimum = hi.physical_minimum & ((1ULL<<hi.report_size)-1); 226251881Speter MYu_ATF_CHECK_EQ(minimum, 0); 227251881Speter maximum = hi.physical_maximum & ((1ULL<<hi.report_size)-1); 228251881Speter MYu_ATF_CHECK_EQ(maximum, 4294967295); 229251881Speter 230251881Speter hid_dispose_report_desc(hrd); 231251881Speter hrd = NULL; 232251881Speter} 233251881Speter 234251881SpeterATF_TC_HEAD(check_hid_get_data, tc) 235251881Speter{ 236251881Speter 237251881Speter atf_tc_set_md_var(tc, "descr", "Test hid_get_data results"); 238251881Speter} 239251881Speter 240251881SpeterATF_TC_BODY(check_hid_get_data, tc) 241251881Speter{ 242251881Speter report_desc_t hrd; 243251881Speter hid_item_t hi; 244251881Speter int32_t data; 245251881Speter uint32_t udat; 246251881Speter 247251881Speter atf_tc_expect_fail("only the 32-bit opcode works, " 248251881Speter "8 and 16-bit is broken"); 249251881Speter 250251881Speter ATF_REQUIRE((hrd = hid_use_report_desc( 251251881Speter range_test_report_descriptor, 252251881Speter __arraycount(range_test_report_descriptor))) != NULL); 253251881Speter 254251881Speter ATF_REQUIRE(hid_locate(hrd, 0xff000001U, hid_input, &hi, 255251881Speter NO_REPORT_ID) > 0); 256251881Speter data = hid_get_data(range_test_minimum_report, &hi); 257251881Speter MYd_ATF_CHECK_EQ(data, -128); 258251881Speter data = hid_get_data(range_test_negative_one_report, &hi); 259251881Speter MYd_ATF_CHECK_EQ(data, -1); 260251881Speter data = hid_get_data(range_test_positive_one_report, &hi); 261251881Speter MYd_ATF_CHECK_EQ(data, 1); 262251881Speter data = hid_get_data(range_test_maximum_report, &hi); 263251881Speter MYd_ATF_CHECK_EQ(data, 127); 264251881Speter 265251881Speter ATF_REQUIRE(hid_locate(hrd, 0xff000002U, hid_input, &hi, 266251881Speter NO_REPORT_ID) > 0); 267251881Speter data = hid_get_data(range_test_minimum_report, &hi); 268251881Speter MYd_ATF_CHECK_EQ(data, -32768); 269251881Speter data = hid_get_data(range_test_negative_one_report, &hi); 270251881Speter MYd_ATF_CHECK_EQ(data, -1); 271251881Speter data = hid_get_data(range_test_positive_one_report, &hi); 272251881Speter MYd_ATF_CHECK_EQ(data, 1); 273251881Speter data = hid_get_data(range_test_maximum_report, &hi); 274251881Speter MYd_ATF_CHECK_EQ(data, 32767); 275251881Speter 276251881Speter ATF_REQUIRE(hid_locate(hrd, 0xff000003U, hid_input, &hi, 277251881Speter NO_REPORT_ID) > 0); 278251881Speter data = hid_get_data(range_test_minimum_report, &hi); 279251881Speter MYd_ATF_CHECK_EQ(data, -2147483648); 280251881Speter data = hid_get_data(range_test_negative_one_report, &hi); 281251881Speter MYd_ATF_CHECK_EQ(data, -1); 282251881Speter data = hid_get_data(range_test_positive_one_report, &hi); 283251881Speter MYd_ATF_CHECK_EQ(data, 1); 284251881Speter data = hid_get_data(range_test_maximum_report, &hi); 285251881Speter MYd_ATF_CHECK_EQ(data, 2147483647); 286251881Speter 287251881Speter hid_dispose_report_desc(hrd); 288251881Speter hrd = NULL; 289251881Speter 290251881Speter ATF_REQUIRE((hrd = hid_use_report_desc( 291251881Speter unsigned_range_test_report_descriptor, 292251881Speter __arraycount(unsigned_range_test_report_descriptor))) != NULL); 293251881Speter ATF_REQUIRE(hid_locate(hrd, 0xff000011U, hid_input, &hi, 294251881Speter NO_REPORT_ID) > 0); 295251881Speter udat = hid_get_data(unsigned_range_test_minimum_report, &hi); 296251881Speter MYu_ATF_CHECK_EQ(udat, 0); 297251881Speter udat = hid_get_data(unsigned_range_test_positive_one_report, &hi); 298251881Speter MYu_ATF_CHECK_EQ(udat, 1); 299251881Speter udat = hid_get_data(unsigned_range_test_negative_one_report, &hi); 300251881Speter MYu_ATF_CHECK_EQ(udat, 254); 301251881Speter udat = hid_get_data(unsigned_range_test_maximum_report, &hi); 302251881Speter MYu_ATF_CHECK_EQ(udat, 255); 303251881Speter 304251881Speter ATF_REQUIRE(hid_locate(hrd, 0xff000012U, hid_input, &hi, 305251881Speter NO_REPORT_ID) > 0); 306251881Speter udat = hid_get_data(unsigned_range_test_minimum_report, &hi); 307251881Speter MYu_ATF_CHECK_EQ(udat, 0); 308251881Speter udat = hid_get_data(unsigned_range_test_positive_one_report, &hi); 309251881Speter MYu_ATF_CHECK_EQ(udat, 1); 310251881Speter udat = hid_get_data(unsigned_range_test_negative_one_report, &hi); 311251881Speter MYu_ATF_CHECK_EQ(udat, 65534); 312251881Speter udat = hid_get_data(unsigned_range_test_maximum_report, &hi); 313251881Speter MYu_ATF_CHECK_EQ(udat, 65535); 314251881Speter 315251881Speter ATF_REQUIRE(hid_locate(hrd, 0xff000013U, hid_input, &hi, 316251881Speter NO_REPORT_ID) > 0); 317251881Speter udat = hid_get_data(unsigned_range_test_minimum_report, &hi); 318251881Speter MYu_ATF_CHECK_EQ(udat, 0); 319251881Speter udat = hid_get_data(unsigned_range_test_positive_one_report, &hi); 320299742Sdim MYu_ATF_CHECK_EQ(udat, 1); 321299742Sdim udat = hid_get_data(unsigned_range_test_negative_one_report, &hi); 322251881Speter MYu_ATF_CHECK_EQ(udat, 4294967294); 323251881Speter udat = hid_get_data(unsigned_range_test_maximum_report, &hi); 324251881Speter MYu_ATF_CHECK_EQ(udat, 4294967295); 325251881Speter 326251881Speter hid_dispose_report_desc(hrd); 327251881Speter hrd = NULL; 328251881Speter} 329251881Speter 330251881SpeterATF_TC_HEAD(check_hid_set_data, tc) 331251881Speter{ 332251881Speter 333251881Speter atf_tc_set_md_var(tc, "descr", "Test hid_set_data results"); 334251881Speter} 335251881Speter 336251881SpeterATF_TC_BODY(check_hid_set_data, tc) 337251881Speter{ 338251881Speter report_desc_t hrd; 339251881Speter hid_item_t hi; 340251881Speter uint8_t test_data_minimum[7]; 341251881Speter uint8_t test_data_negative_one[7]; 342251881Speter uint8_t test_data_positive_one[7]; 343251881Speter uint8_t test_data_maximum[7]; 344251881Speter 345251881Speter ATF_REQUIRE((hrd = hid_use_report_desc( 346251881Speter range_test_report_descriptor, 347251881Speter __arraycount(range_test_report_descriptor))) != NULL); 348251881Speter ATF_REQUIRE(hid_locate(hrd, 0xff000001U, hid_input, &hi, 349251881Speter NO_REPORT_ID) > 0); 350251881Speter hid_set_data(test_data_minimum, &hi, -128); 351251881Speter hid_set_data(test_data_negative_one, &hi, -1); 352251881Speter hid_set_data(test_data_positive_one, &hi, 1); 353251881Speter hid_set_data(test_data_maximum, &hi, 127); 354251881Speter ATF_REQUIRE(hid_locate(hrd, 0xff000002U, hid_input, &hi, 355251881Speter NO_REPORT_ID) > 0); 356251881Speter hid_set_data(test_data_minimum, &hi, -32768); 357251881Speter hid_set_data(test_data_negative_one, &hi, -1); 358251881Speter hid_set_data(test_data_positive_one, &hi, 1); 359251881Speter hid_set_data(test_data_maximum, &hi, 32767); 360251881Speter ATF_REQUIRE(hid_locate(hrd, 0xff000003U, hid_input, &hi, 361251881Speter NO_REPORT_ID) > 0); 362251881Speter hid_set_data(test_data_minimum, &hi, -2147483648); 363251881Speter hid_set_data(test_data_negative_one, &hi, -1); 364251881Speter hid_set_data(test_data_positive_one, &hi, 1); 365251881Speter hid_set_data(test_data_maximum, &hi, 2147483647); 366251881Speter ATF_CHECK(memcmp(test_data_minimum, range_test_minimum_report, 367251881Speter sizeof test_data_minimum) == 0); 368251881Speter ATF_CHECK(memcmp(test_data_negative_one, 369251881Speter range_test_negative_one_report, 370251881Speter sizeof test_data_negative_one) == 0); 371251881Speter ATF_CHECK(memcmp(test_data_positive_one, 372251881Speter range_test_positive_one_report, 373251881Speter sizeof test_data_positive_one) == 0); 374251881Speter ATF_CHECK(memcmp(test_data_maximum, range_test_maximum_report, 375251881Speter sizeof test_data_maximum) == 0); 376251881Speter 377251881Speter hid_dispose_report_desc(hrd); 378251881Speter hrd = NULL; 379251881Speter 380251881Speter ATF_REQUIRE((hrd = hid_use_report_desc( 381251881Speter unsigned_range_test_report_descriptor, 382251881Speter __arraycount(range_test_report_descriptor))) != NULL); 383299742Sdim ATF_REQUIRE(hid_locate(hrd, 0xff000011U, hid_input, &hi, 384299742Sdim NO_REPORT_ID) > 0); 385251881Speter hid_set_data(test_data_minimum, &hi, 0); 386251881Speter hid_set_data(test_data_positive_one, &hi, 1); 387251881Speter hid_set_data(test_data_negative_one, &hi, 0xfffffffe); 388251881Speter hid_set_data(test_data_maximum, &hi, 0xffffffff); 389251881Speter ATF_REQUIRE(hid_locate(hrd, 0xff000012U, hid_input, &hi, 390251881Speter NO_REPORT_ID) > 0); 391251881Speter hid_set_data(test_data_minimum, &hi, 0); 392251881Speter hid_set_data(test_data_positive_one, &hi, 1); 393251881Speter hid_set_data(test_data_negative_one, &hi, 0xfffe); 394251881Speter hid_set_data(test_data_maximum, &hi, 0xffff); 395251881Speter ATF_REQUIRE(hid_locate(hrd, 0xff000013U, hid_input, &hi, 396251881Speter NO_REPORT_ID) > 0); 397251881Speter hid_set_data(test_data_minimum, &hi, 0); 398251881Speter hid_set_data(test_data_positive_one, &hi, 1); 399251881Speter hid_set_data(test_data_negative_one, &hi, 0xfffffffe); 400251881Speter hid_set_data(test_data_maximum, &hi, 0xffffffff); 401251881Speter ATF_CHECK(memcmp(test_data_minimum, 402251881Speter unsigned_range_test_minimum_report, 403251881Speter sizeof test_data_minimum) == 0); 404251881Speter ATF_CHECK(memcmp(test_data_negative_one, 405251881Speter unsigned_range_test_negative_one_report, 406251881Speter sizeof test_data_negative_one) == 0); 407251881Speter ATF_CHECK(memcmp(test_data_positive_one, 408251881Speter unsigned_range_test_positive_one_report, 409251881Speter sizeof test_data_positive_one) == 0); 410251881Speter ATF_CHECK(memcmp(test_data_maximum, 411251881Speter unsigned_range_test_maximum_report, 412251881Speter sizeof test_data_maximum) == 0); 413251881Speter 414251881Speter hid_dispose_report_desc(hrd); 415251881Speter hrd = NULL; 416251881Speter} 417251881Speter 418251881SpeterATF_TC_HEAD(check_parse_just_pop, tc) 419251881Speter{ 420251881Speter 421251881Speter atf_tc_set_md_var(tc, "descr", "check Pop on empty stack bug"); 422251881Speter} 423251881Speter 424251881SpeterATF_TC_BODY(check_parse_just_pop, tc) 425251881Speter{ 426251881Speter report_desc_t hrd; 427251881Speter hid_data_t hd; 428251881Speter hid_item_t hi; 429251881Speter 430299742Sdim ATF_REQUIRE((hrd = hid_use_report_desc( 431299742Sdim just_pop_report_descriptor, 432251881Speter sizeof just_pop_report_descriptor)) != NULL); 433251881Speter hd = hid_start_parse(hrd, 0, NO_REPORT_ID); 434251881Speter while (hid_get_item(hd, &hi) > 0) { 435251881Speter } 436251881Speter hid_end_parse(hd); 437251881Speter hid_dispose_report_desc(hrd); 438251881Speter hrd = NULL; 439251881Speter} 440251881Speter 441251881SpeterATF_TP_ADD_TCS(tp) 442251881Speter{ 443251881Speter 444251881Speter ATF_TP_ADD_TC(tp, check_hid_logical_range); 445251881Speter ATF_TP_ADD_TC(tp, check_hid_physical_range); 446251881Speter ATF_TP_ADD_TC(tp, check_hid_usage); 447251881Speter ATF_TP_ADD_TC(tp, check_hid_get_data); 448251881Speter ATF_TP_ADD_TC(tp, check_hid_set_data); 449251881Speter ATF_TP_ADD_TC(tp, check_parse_just_pop); 450251881Speter 451251881Speter return atf_no_error(); 452251881Speter} 453251881Speter