xref: /netbsd-src/tests/lib/libusbhid/t_usbhid.c (revision d7cdc3c29ecc2b1dfe92175759849030e398eede)
1*d7cdc3c2Sjakllsch /*	$NetBSD: t_usbhid.c,v 1.12 2016/08/17 12:10:42 jakllsch Exp $	*/
23a26fec8Sjakllsch 
33a26fec8Sjakllsch /*
43a26fec8Sjakllsch  * Copyright (c) 2016 Jonathan A. Kollasch
53a26fec8Sjakllsch  * All rights reserved.
63a26fec8Sjakllsch  *
73a26fec8Sjakllsch  * Redistribution and use in source and binary forms, with or without
83a26fec8Sjakllsch  * modification, are permitted provided that the following conditions
93a26fec8Sjakllsch  * are met:
103a26fec8Sjakllsch  * 1. Redistributions of source code must retain the above copyright
113a26fec8Sjakllsch  *    notice, this list of conditions and the following disclaimer.
123a26fec8Sjakllsch  * 2. Redistributions in binary form must reproduce the above copyright
133a26fec8Sjakllsch  *    notice, this list of conditions and the following disclaimer in the
143a26fec8Sjakllsch  *    documentation and/or other materials provided with the distribution.
153a26fec8Sjakllsch  *
163a26fec8Sjakllsch  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
173a26fec8Sjakllsch  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
183a26fec8Sjakllsch  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
193a26fec8Sjakllsch  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
203a26fec8Sjakllsch  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
213a26fec8Sjakllsch  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
223a26fec8Sjakllsch  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
233a26fec8Sjakllsch  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
243a26fec8Sjakllsch  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
253a26fec8Sjakllsch  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
263a26fec8Sjakllsch  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
273a26fec8Sjakllsch  */
283a26fec8Sjakllsch 
293a26fec8Sjakllsch #include <sys/cdefs.h>
30*d7cdc3c2Sjakllsch __RCSID("$NetBSD: t_usbhid.c,v 1.12 2016/08/17 12:10:42 jakllsch Exp $");
313a26fec8Sjakllsch 
323a26fec8Sjakllsch #include <atf-c.h>
333a26fec8Sjakllsch 
343a26fec8Sjakllsch #include <inttypes.h>
353a26fec8Sjakllsch #include <usbhid.h>
363a26fec8Sjakllsch #include <string.h>
373a26fec8Sjakllsch 
383a26fec8Sjakllsch #include <stdio.h>
393a26fec8Sjakllsch #include <stdlib.h>
403a26fec8Sjakllsch 
413a26fec8Sjakllsch #include <limits.h>
423a26fec8Sjakllsch 
433a26fec8Sjakllsch ATF_TC(check_hid_logical_range);
443a26fec8Sjakllsch ATF_TC(check_hid_physical_range);
453a26fec8Sjakllsch ATF_TC(check_hid_usage);
463a26fec8Sjakllsch ATF_TC(check_hid_get_data);
473a26fec8Sjakllsch ATF_TC(check_hid_set_data);
484887406fSjakllsch ATF_TC(check_parse_just_pop);
493a26fec8Sjakllsch 
5025812d50Sjakllsch #define MYd_ATF_CHECK_EQ(d, v) \
5125812d50Sjakllsch 	ATF_CHECK_EQ_MSG(d, v, "== %d", (d))
5225812d50Sjakllsch 
5325812d50Sjakllsch #define MYu_ATF_CHECK_EQ(d, v) \
5425812d50Sjakllsch 	ATF_CHECK_EQ_MSG(d, v, "== %u", (d))
5525812d50Sjakllsch 
5625812d50Sjakllsch #define MYx_ATF_CHECK_EQ(d, v) \
5725812d50Sjakllsch 	ATF_CHECK_EQ_MSG(d, v, "== 0x%x", (d))
5825812d50Sjakllsch 
5943fe9848Sjakllsch #include "hid_test_data.c"
60cf34dae0Sjakllsch 
ATF_TC_HEAD(check_hid_usage,tc)613a26fec8Sjakllsch ATF_TC_HEAD(check_hid_usage, tc)
623a26fec8Sjakllsch {
633a26fec8Sjakllsch 
643a26fec8Sjakllsch 	atf_tc_set_md_var(tc, "descr", "Test libusbhid usage.c");
653a26fec8Sjakllsch }
663a26fec8Sjakllsch 
ATF_TC_BODY(check_hid_usage,tc)673a26fec8Sjakllsch ATF_TC_BODY(check_hid_usage, tc)
683a26fec8Sjakllsch {
693a26fec8Sjakllsch 	char usages_path[PATH_MAX];
703a26fec8Sjakllsch 
713a26fec8Sjakllsch 	(void)strlcpy(usages_path, atf_tc_get_config_var(tc, "srcdir"),
723a26fec8Sjakllsch 	    sizeof(usages_path));
733a26fec8Sjakllsch 	(void)strlcat(usages_path, "/test_usb_hid_usages",
743a26fec8Sjakllsch 	    sizeof(usages_path));
753a26fec8Sjakllsch 
763a26fec8Sjakllsch 	hid_init(usages_path);
773a26fec8Sjakllsch 
783a26fec8Sjakllsch 	ATF_CHECK_STREQ("t_usbhid_page", hid_usage_page(0xff1b));
793a26fec8Sjakllsch 	ATF_CHECK_EQ((uint32_t)hid_parse_usage_page("t_usbhid_page"), 0xff1b);
803a26fec8Sjakllsch 
813a26fec8Sjakllsch 	ATF_CHECK_STREQ("t_usbhid_usage", hid_usage_in_page(0xff1bff2a));
823a26fec8Sjakllsch 	ATF_CHECK_EQ((uint32_t)hid_parse_usage_in_page(
833a26fec8Sjakllsch 	    "t_usbhid_page:t_usbhid_usage"), 0xff1bff2a);
843a26fec8Sjakllsch 
853a26fec8Sjakllsch 	ATF_CHECK_STREQ("Quick_zephyrs_blow_vexing_daft_Jim_",
863a26fec8Sjakllsch 	    hid_usage_page(0xff2a));
873a26fec8Sjakllsch 	ATF_CHECK_EQ((uint32_t)hid_parse_usage_page(
883a26fec8Sjakllsch 	    "Quick_zephyrs_blow_vexing_daft_Jim_"), 0xff2a);
893a26fec8Sjakllsch 
903a26fec8Sjakllsch 	ATF_CHECK_STREQ("Usage_ID_Zero_%", hid_usage_in_page(0xff2a0000));
913a26fec8Sjakllsch 	ATF_CHECK_EQ((uint32_t)hid_parse_usage_in_page(
923a26fec8Sjakllsch 	    "Quick_zephyrs_blow_vexing_daft_Jim_:Usage_ID_Zero_%"),
933a26fec8Sjakllsch 	    0xff2a0000);
943a26fec8Sjakllsch 
953a26fec8Sjakllsch 	//ATF_CHECK_STREQ("Usage_ID_0_%", hid_usage_in_page(0xff2a0000));
963a26fec8Sjakllsch 	ATF_CHECK_EQ((uint32_t)hid_parse_usage_in_page(
973a26fec8Sjakllsch 	    "Quick_zephyrs_blow_vexing_daft_Jim_:Usage_ID_0_%"), 0xff2a0000);
983a26fec8Sjakllsch 
993a26fec8Sjakllsch 	ATF_CHECK_STREQ("Usage_ID_65535_%", hid_usage_in_page(0xff2affff));
1003a26fec8Sjakllsch 	ATF_CHECK_EQ((uint32_t)hid_parse_usage_in_page(
1013a26fec8Sjakllsch 	    "Quick_zephyrs_blow_vexing_daft_Jim_:Usage_ID_65535_%"),
1023a26fec8Sjakllsch 	    0xff2affff);
103aaf9a451Sjakllsch 
104aaf9a451Sjakllsch 	MYx_ATF_CHECK_EQ((uint32_t)hid_parse_usage_in_page("0xff2a:0xff1b"),
105aaf9a451Sjakllsch 	    0xff2aff1b);
1063a26fec8Sjakllsch }
1073a26fec8Sjakllsch 
ATF_TC_HEAD(check_hid_logical_range,tc)1083a26fec8Sjakllsch ATF_TC_HEAD(check_hid_logical_range, tc)
1093a26fec8Sjakllsch {
1103a26fec8Sjakllsch 
1113a26fec8Sjakllsch 	atf_tc_set_md_var(tc, "descr", "Test hid_get_item "
1123a26fec8Sjakllsch 	    "Logical Minimum/Maximum results");
1133a26fec8Sjakllsch }
1143a26fec8Sjakllsch 
ATF_TC_BODY(check_hid_logical_range,tc)1153a26fec8Sjakllsch ATF_TC_BODY(check_hid_logical_range, tc)
1163a26fec8Sjakllsch {
1173a26fec8Sjakllsch 	report_desc_t hrd;
1183a26fec8Sjakllsch 	hid_item_t hi;
119f8f58611Sjakllsch 	uint32_t minimum, maximum;
1203a26fec8Sjakllsch 
1213a26fec8Sjakllsch 	atf_tc_expect_fail("only the 32-bit opcode works, "
1223a26fec8Sjakllsch 	    "8 and 16-bit is broken");
1233a26fec8Sjakllsch 
1243a26fec8Sjakllsch 	ATF_REQUIRE((hrd = hid_use_report_desc(range_test_report_descriptor,
1253a26fec8Sjakllsch 	    __arraycount(range_test_report_descriptor))) != NULL);
1263a26fec8Sjakllsch 	ATF_REQUIRE(hid_locate(hrd, 0xff000001U, hid_input, &hi,
1273a26fec8Sjakllsch 	    NO_REPORT_ID) > 0);
128bc1f6fc4Sjakllsch 	MYd_ATF_CHECK_EQ(hi.logical_minimum, -128);
129bc1f6fc4Sjakllsch 	MYd_ATF_CHECK_EQ(hi.logical_maximum, 127);
1303a26fec8Sjakllsch 	ATF_REQUIRE(hid_locate(hrd, 0xff000002U, hid_input, &hi,
1313a26fec8Sjakllsch 	    NO_REPORT_ID) > 0);
132bc1f6fc4Sjakllsch 	MYd_ATF_CHECK_EQ(hi.logical_minimum, -32768);
133bc1f6fc4Sjakllsch 	MYd_ATF_CHECK_EQ(hi.logical_maximum, 32767);
1343a26fec8Sjakllsch 	ATF_REQUIRE(hid_locate(hrd, 0xff000003U, hid_input, &hi,
1353a26fec8Sjakllsch 	    NO_REPORT_ID) > 0);
136bc1f6fc4Sjakllsch 	MYd_ATF_CHECK_EQ(hi.logical_minimum, -2147483648);
137bc1f6fc4Sjakllsch 	MYd_ATF_CHECK_EQ(hi.logical_maximum, 2147483647);
1383a26fec8Sjakllsch 
1393a26fec8Sjakllsch 	hid_dispose_report_desc(hrd);
1403a26fec8Sjakllsch 	hrd = NULL;
1413a26fec8Sjakllsch 
1423a26fec8Sjakllsch 	ATF_REQUIRE((hrd = hid_use_report_desc(
1433a26fec8Sjakllsch 	    unsigned_range_test_report_descriptor,
1443a26fec8Sjakllsch 	    __arraycount(unsigned_range_test_report_descriptor))) != NULL);
1453a26fec8Sjakllsch 	ATF_REQUIRE(hid_locate(hrd, 0xff000011U, hid_input, &hi,
1463a26fec8Sjakllsch 	    NO_REPORT_ID) > 0);
147f8f58611Sjakllsch 	ATF_CHECK(hi.logical_minimum > hi.logical_maximum);
148f8f58611Sjakllsch 	minimum = (uint32_t)hi.logical_minimum & ((1ULL<<hi.report_size)-1);
149f8f58611Sjakllsch 	MYu_ATF_CHECK_EQ(minimum, 0);
150f8f58611Sjakllsch 	maximum = (uint32_t)hi.logical_maximum & ((1ULL<<hi.report_size)-1);
151f8f58611Sjakllsch 	MYu_ATF_CHECK_EQ(maximum, 255);
1523a26fec8Sjakllsch 	ATF_REQUIRE(hid_locate(hrd, 0xff000012U, hid_input, &hi,
1533a26fec8Sjakllsch 	    NO_REPORT_ID) > 0);
154f8f58611Sjakllsch 	ATF_CHECK(hi.logical_minimum > hi.logical_maximum);
155f8f58611Sjakllsch 	minimum = hi.logical_minimum & ((1ULL<<hi.report_size)-1);
156f8f58611Sjakllsch 	MYu_ATF_CHECK_EQ(minimum, 0);
157f8f58611Sjakllsch 	maximum = hi.logical_maximum & ((1ULL<<hi.report_size)-1);
158f8f58611Sjakllsch 	MYu_ATF_CHECK_EQ(maximum, 65535);
1593a26fec8Sjakllsch 	ATF_REQUIRE(hid_locate(hrd, 0xff000013U, hid_input, &hi,
1603a26fec8Sjakllsch 	    NO_REPORT_ID) > 0);
161f8f58611Sjakllsch 	ATF_CHECK(hi.logical_minimum > hi.logical_maximum);
162f8f58611Sjakllsch 	minimum = hi.logical_minimum & ((1ULL<<hi.report_size)-1);
163f8f58611Sjakllsch 	MYu_ATF_CHECK_EQ(minimum, 0);
164f8f58611Sjakllsch 	maximum = hi.logical_maximum & ((1ULL<<hi.report_size)-1);
165f8f58611Sjakllsch 	MYu_ATF_CHECK_EQ(maximum, 4294967295);
1663a26fec8Sjakllsch 
1673a26fec8Sjakllsch 	hid_dispose_report_desc(hrd);
1683a26fec8Sjakllsch 	hrd = NULL;
1693a26fec8Sjakllsch }
1703a26fec8Sjakllsch 
ATF_TC_HEAD(check_hid_physical_range,tc)1713a26fec8Sjakllsch ATF_TC_HEAD(check_hid_physical_range, tc)
1723a26fec8Sjakllsch {
1733a26fec8Sjakllsch 
1743a26fec8Sjakllsch 	atf_tc_set_md_var(tc, "descr", "Test hid_get_item "
1753a26fec8Sjakllsch 	    "Physical Minimum/Maximum results");
1763a26fec8Sjakllsch }
1773a26fec8Sjakllsch 
ATF_TC_BODY(check_hid_physical_range,tc)1783a26fec8Sjakllsch ATF_TC_BODY(check_hid_physical_range, tc)
1793a26fec8Sjakllsch {
1803a26fec8Sjakllsch 	report_desc_t hrd;
1813a26fec8Sjakllsch 	hid_item_t hi;
182f8f58611Sjakllsch 	uint32_t minimum, maximum;
1833a26fec8Sjakllsch 
1843a26fec8Sjakllsch 	atf_tc_expect_fail("only the 32-bit opcode works, "
1853a26fec8Sjakllsch 	    "8 and 16-bit is broken");
1863a26fec8Sjakllsch 
1873a26fec8Sjakllsch 	ATF_REQUIRE((hrd = hid_use_report_desc(range_test_report_descriptor,
1883a26fec8Sjakllsch 	    __arraycount(range_test_report_descriptor))) != NULL);
1893a26fec8Sjakllsch 	ATF_REQUIRE(hid_locate(hrd, 0xff000001U, hid_input, &hi,
1903a26fec8Sjakllsch 	    NO_REPORT_ID) > 0);
191bc1f6fc4Sjakllsch 	MYd_ATF_CHECK_EQ(hi.physical_minimum, -128);
192bc1f6fc4Sjakllsch 	MYd_ATF_CHECK_EQ(hi.physical_maximum, 127);
1933a26fec8Sjakllsch 	ATF_REQUIRE(hid_locate(hrd, 0xff000002U, hid_input, &hi,
1943a26fec8Sjakllsch 	    NO_REPORT_ID) > 0);
195bc1f6fc4Sjakllsch 	MYd_ATF_CHECK_EQ(hi.physical_minimum, -32768);
196bc1f6fc4Sjakllsch 	MYd_ATF_CHECK_EQ(hi.physical_maximum, 32767);
1973a26fec8Sjakllsch 	ATF_REQUIRE(hid_locate(hrd, 0xff000003U, hid_input, &hi,
1983a26fec8Sjakllsch 	    NO_REPORT_ID) > 0);
199bc1f6fc4Sjakllsch 	MYd_ATF_CHECK_EQ(hi.physical_minimum, -2147483648);
200bc1f6fc4Sjakllsch 	MYd_ATF_CHECK_EQ(hi.physical_maximum, 2147483647);
2013a26fec8Sjakllsch 
2023a26fec8Sjakllsch 	hid_dispose_report_desc(hrd);
2033a26fec8Sjakllsch 	hrd = NULL;
2043a26fec8Sjakllsch 
2053a26fec8Sjakllsch 	ATF_REQUIRE((hrd = hid_use_report_desc(
2063a26fec8Sjakllsch 	    unsigned_range_test_report_descriptor,
2073a26fec8Sjakllsch 	    __arraycount(unsigned_range_test_report_descriptor))) != NULL);
2083a26fec8Sjakllsch 	ATF_REQUIRE(hid_locate(hrd, 0xff000011U, hid_input, &hi,
2093a26fec8Sjakllsch 	    NO_REPORT_ID) > 0);
210f8f58611Sjakllsch 	ATF_CHECK(hi.physical_minimum > hi.physical_maximum);
211f8f58611Sjakllsch 	minimum = (uint32_t)hi.physical_minimum & ((1ULL<<hi.report_size)-1);
212f8f58611Sjakllsch 	MYu_ATF_CHECK_EQ(minimum, 0);
213f8f58611Sjakllsch 	maximum = (uint32_t)hi.physical_maximum & ((1ULL<<hi.report_size)-1);
214f8f58611Sjakllsch 	MYu_ATF_CHECK_EQ(maximum, 255);
2153a26fec8Sjakllsch 	ATF_REQUIRE(hid_locate(hrd, 0xff000012U, hid_input, &hi,
2163a26fec8Sjakllsch 	    NO_REPORT_ID) > 0);
217f8f58611Sjakllsch 	ATF_CHECK(hi.physical_minimum > hi.physical_maximum);
218f8f58611Sjakllsch 	minimum = hi.physical_minimum & ((1ULL<<hi.report_size)-1);
219f8f58611Sjakllsch 	MYu_ATF_CHECK_EQ(minimum, 0);
220f8f58611Sjakllsch 	maximum = hi.physical_maximum & ((1ULL<<hi.report_size)-1);
221f8f58611Sjakllsch 	MYu_ATF_CHECK_EQ(maximum, 65535);
2223a26fec8Sjakllsch 	ATF_REQUIRE(hid_locate(hrd, 0xff000013U, hid_input, &hi,
2233a26fec8Sjakllsch 	    NO_REPORT_ID) > 0);
224f8f58611Sjakllsch 	ATF_CHECK(hi.physical_minimum > hi.physical_maximum);
225f8f58611Sjakllsch 	minimum = hi.physical_minimum & ((1ULL<<hi.report_size)-1);
226f8f58611Sjakllsch 	MYu_ATF_CHECK_EQ(minimum, 0);
227f8f58611Sjakllsch 	maximum = hi.physical_maximum & ((1ULL<<hi.report_size)-1);
228f8f58611Sjakllsch 	MYu_ATF_CHECK_EQ(maximum, 4294967295);
2293a26fec8Sjakllsch 
2303a26fec8Sjakllsch 	hid_dispose_report_desc(hrd);
2313a26fec8Sjakllsch 	hrd = NULL;
2323a26fec8Sjakllsch }
2333a26fec8Sjakllsch 
ATF_TC_HEAD(check_hid_get_data,tc)2343a26fec8Sjakllsch ATF_TC_HEAD(check_hid_get_data, tc)
2353a26fec8Sjakllsch {
2363a26fec8Sjakllsch 
2373a26fec8Sjakllsch 	atf_tc_set_md_var(tc, "descr", "Test hid_get_data results");
2383a26fec8Sjakllsch }
2393a26fec8Sjakllsch 
ATF_TC_BODY(check_hid_get_data,tc)2403a26fec8Sjakllsch ATF_TC_BODY(check_hid_get_data, tc)
2413a26fec8Sjakllsch {
2423a26fec8Sjakllsch 	report_desc_t hrd;
2433a26fec8Sjakllsch 	hid_item_t hi;
2443a26fec8Sjakllsch 	int32_t data;
2453a26fec8Sjakllsch 	uint32_t udat;
2463a26fec8Sjakllsch 
247*d7cdc3c2Sjakllsch 	atf_tc_expect_fail("only the 32-bit opcode works, "
248*d7cdc3c2Sjakllsch 	    "8 and 16-bit is broken");
249*d7cdc3c2Sjakllsch 
2503a26fec8Sjakllsch 	ATF_REQUIRE((hrd = hid_use_report_desc(
2513a26fec8Sjakllsch 	    range_test_report_descriptor,
2523a26fec8Sjakllsch 	    __arraycount(range_test_report_descriptor))) != NULL);
2533a26fec8Sjakllsch 
2543a26fec8Sjakllsch 	ATF_REQUIRE(hid_locate(hrd, 0xff000001U, hid_input, &hi,
2553a26fec8Sjakllsch 	    NO_REPORT_ID) > 0);
2563a26fec8Sjakllsch 	data = hid_get_data(range_test_minimum_report, &hi);
2573a26fec8Sjakllsch 	MYd_ATF_CHECK_EQ(data, -128);
2583a26fec8Sjakllsch 	data = hid_get_data(range_test_negative_one_report, &hi);
2593a26fec8Sjakllsch 	MYd_ATF_CHECK_EQ(data, -1);
2603a26fec8Sjakllsch 	data = hid_get_data(range_test_positive_one_report, &hi);
2613a26fec8Sjakllsch 	MYd_ATF_CHECK_EQ(data, 1);
2623a26fec8Sjakllsch 	data = hid_get_data(range_test_maximum_report, &hi);
2633a26fec8Sjakllsch 	MYd_ATF_CHECK_EQ(data, 127);
2643a26fec8Sjakllsch 
2653a26fec8Sjakllsch 	ATF_REQUIRE(hid_locate(hrd, 0xff000002U, hid_input, &hi,
2663a26fec8Sjakllsch 	    NO_REPORT_ID) > 0);
2673a26fec8Sjakllsch 	data = hid_get_data(range_test_minimum_report, &hi);
2683a26fec8Sjakllsch 	MYd_ATF_CHECK_EQ(data, -32768);
2693a26fec8Sjakllsch 	data = hid_get_data(range_test_negative_one_report, &hi);
2703a26fec8Sjakllsch 	MYd_ATF_CHECK_EQ(data, -1);
2713a26fec8Sjakllsch 	data = hid_get_data(range_test_positive_one_report, &hi);
2723a26fec8Sjakllsch 	MYd_ATF_CHECK_EQ(data, 1);
2733a26fec8Sjakllsch 	data = hid_get_data(range_test_maximum_report, &hi);
2743a26fec8Sjakllsch 	MYd_ATF_CHECK_EQ(data, 32767);
2753a26fec8Sjakllsch 
2763a26fec8Sjakllsch 	ATF_REQUIRE(hid_locate(hrd, 0xff000003U, hid_input, &hi,
2773a26fec8Sjakllsch 	    NO_REPORT_ID) > 0);
2783a26fec8Sjakllsch 	data = hid_get_data(range_test_minimum_report, &hi);
2793a26fec8Sjakllsch 	MYd_ATF_CHECK_EQ(data, -2147483648);
2803a26fec8Sjakllsch 	data = hid_get_data(range_test_negative_one_report, &hi);
2813a26fec8Sjakllsch 	MYd_ATF_CHECK_EQ(data, -1);
2823a26fec8Sjakllsch 	data = hid_get_data(range_test_positive_one_report, &hi);
2833a26fec8Sjakllsch 	MYd_ATF_CHECK_EQ(data, 1);
2843a26fec8Sjakllsch 	data = hid_get_data(range_test_maximum_report, &hi);
2853a26fec8Sjakllsch 	MYd_ATF_CHECK_EQ(data, 2147483647);
2863a26fec8Sjakllsch 
2873a26fec8Sjakllsch 	hid_dispose_report_desc(hrd);
2883a26fec8Sjakllsch 	hrd = NULL;
2893a26fec8Sjakllsch 
2903a26fec8Sjakllsch 	ATF_REQUIRE((hrd = hid_use_report_desc(
2913a26fec8Sjakllsch 	    unsigned_range_test_report_descriptor,
2923a26fec8Sjakllsch 	    __arraycount(unsigned_range_test_report_descriptor))) != NULL);
2933a26fec8Sjakllsch 	ATF_REQUIRE(hid_locate(hrd, 0xff000011U, hid_input, &hi,
2943a26fec8Sjakllsch 	    NO_REPORT_ID) > 0);
2953a26fec8Sjakllsch 	udat = hid_get_data(unsigned_range_test_minimum_report, &hi);
2963a26fec8Sjakllsch 	MYu_ATF_CHECK_EQ(udat, 0);
2973a26fec8Sjakllsch 	udat = hid_get_data(unsigned_range_test_positive_one_report, &hi);
2983a26fec8Sjakllsch 	MYu_ATF_CHECK_EQ(udat, 1);
2993a26fec8Sjakllsch 	udat = hid_get_data(unsigned_range_test_negative_one_report, &hi);
3003a26fec8Sjakllsch 	MYu_ATF_CHECK_EQ(udat, 254);
3013a26fec8Sjakllsch 	udat = hid_get_data(unsigned_range_test_maximum_report, &hi);
3023a26fec8Sjakllsch 	MYu_ATF_CHECK_EQ(udat, 255);
3033a26fec8Sjakllsch 
3043a26fec8Sjakllsch 	ATF_REQUIRE(hid_locate(hrd, 0xff000012U, hid_input, &hi,
3053a26fec8Sjakllsch 	    NO_REPORT_ID) > 0);
3063a26fec8Sjakllsch 	udat = hid_get_data(unsigned_range_test_minimum_report, &hi);
3073a26fec8Sjakllsch 	MYu_ATF_CHECK_EQ(udat, 0);
3083a26fec8Sjakllsch 	udat = hid_get_data(unsigned_range_test_positive_one_report, &hi);
3093a26fec8Sjakllsch 	MYu_ATF_CHECK_EQ(udat, 1);
3103a26fec8Sjakllsch 	udat = hid_get_data(unsigned_range_test_negative_one_report, &hi);
3113a26fec8Sjakllsch 	MYu_ATF_CHECK_EQ(udat, 65534);
3123a26fec8Sjakllsch 	udat = hid_get_data(unsigned_range_test_maximum_report, &hi);
3133a26fec8Sjakllsch 	MYu_ATF_CHECK_EQ(udat, 65535);
3143a26fec8Sjakllsch 
3153a26fec8Sjakllsch 	ATF_REQUIRE(hid_locate(hrd, 0xff000013U, hid_input, &hi,
3163a26fec8Sjakllsch 	    NO_REPORT_ID) > 0);
3173a26fec8Sjakllsch 	udat = hid_get_data(unsigned_range_test_minimum_report, &hi);
3183a26fec8Sjakllsch 	MYu_ATF_CHECK_EQ(udat, 0);
3193a26fec8Sjakllsch 	udat = hid_get_data(unsigned_range_test_positive_one_report, &hi);
3203a26fec8Sjakllsch 	MYu_ATF_CHECK_EQ(udat, 1);
3213a26fec8Sjakllsch 	udat = hid_get_data(unsigned_range_test_negative_one_report, &hi);
3223a26fec8Sjakllsch 	MYu_ATF_CHECK_EQ(udat, 4294967294);
3233a26fec8Sjakllsch 	udat = hid_get_data(unsigned_range_test_maximum_report, &hi);
3243a26fec8Sjakllsch 	MYu_ATF_CHECK_EQ(udat, 4294967295);
3253a26fec8Sjakllsch 
3263a26fec8Sjakllsch 	hid_dispose_report_desc(hrd);
3273a26fec8Sjakllsch 	hrd = NULL;
3283a26fec8Sjakllsch }
3293a26fec8Sjakllsch 
ATF_TC_HEAD(check_hid_set_data,tc)3303a26fec8Sjakllsch ATF_TC_HEAD(check_hid_set_data, tc)
3313a26fec8Sjakllsch {
3323a26fec8Sjakllsch 
3333a26fec8Sjakllsch 	atf_tc_set_md_var(tc, "descr", "Test hid_set_data results");
3343a26fec8Sjakllsch }
3353a26fec8Sjakllsch 
ATF_TC_BODY(check_hid_set_data,tc)3363a26fec8Sjakllsch ATF_TC_BODY(check_hid_set_data, tc)
3373a26fec8Sjakllsch {
3383a26fec8Sjakllsch 	report_desc_t hrd;
3393a26fec8Sjakllsch 	hid_item_t hi;
3403a26fec8Sjakllsch 	uint8_t test_data_minimum[7];
3413a26fec8Sjakllsch 	uint8_t test_data_negative_one[7];
3423a26fec8Sjakllsch 	uint8_t test_data_positive_one[7];
3433a26fec8Sjakllsch 	uint8_t test_data_maximum[7];
3443a26fec8Sjakllsch 
3453a26fec8Sjakllsch 	ATF_REQUIRE((hrd = hid_use_report_desc(
3463a26fec8Sjakllsch 	    range_test_report_descriptor,
3473a26fec8Sjakllsch 	    __arraycount(range_test_report_descriptor))) != NULL);
3483a26fec8Sjakllsch 	ATF_REQUIRE(hid_locate(hrd, 0xff000001U, hid_input, &hi,
3493a26fec8Sjakllsch 	    NO_REPORT_ID) > 0);
3503a26fec8Sjakllsch 	hid_set_data(test_data_minimum, &hi, -128);
3513a26fec8Sjakllsch 	hid_set_data(test_data_negative_one, &hi, -1);
3523a26fec8Sjakllsch 	hid_set_data(test_data_positive_one, &hi, 1);
3533a26fec8Sjakllsch 	hid_set_data(test_data_maximum, &hi, 127);
3543a26fec8Sjakllsch 	ATF_REQUIRE(hid_locate(hrd, 0xff000002U, hid_input, &hi,
3553a26fec8Sjakllsch 	    NO_REPORT_ID) > 0);
3563a26fec8Sjakllsch 	hid_set_data(test_data_minimum, &hi, -32768);
3573a26fec8Sjakllsch 	hid_set_data(test_data_negative_one, &hi, -1);
3583a26fec8Sjakllsch 	hid_set_data(test_data_positive_one, &hi, 1);
3593a26fec8Sjakllsch 	hid_set_data(test_data_maximum, &hi, 32767);
3603a26fec8Sjakllsch 	ATF_REQUIRE(hid_locate(hrd, 0xff000003U, hid_input, &hi,
3613a26fec8Sjakllsch 	    NO_REPORT_ID) > 0);
3623a26fec8Sjakllsch 	hid_set_data(test_data_minimum, &hi, -2147483648);
3633a26fec8Sjakllsch 	hid_set_data(test_data_negative_one, &hi, -1);
3643a26fec8Sjakllsch 	hid_set_data(test_data_positive_one, &hi, 1);
3653a26fec8Sjakllsch 	hid_set_data(test_data_maximum, &hi, 2147483647);
3663a26fec8Sjakllsch 	ATF_CHECK(memcmp(test_data_minimum, range_test_minimum_report,
3673a26fec8Sjakllsch 	    sizeof test_data_minimum) == 0);
3683a26fec8Sjakllsch 	ATF_CHECK(memcmp(test_data_negative_one,
3693a26fec8Sjakllsch 	    range_test_negative_one_report,
3703a26fec8Sjakllsch 	    sizeof test_data_negative_one) == 0);
3713a26fec8Sjakllsch 	ATF_CHECK(memcmp(test_data_positive_one,
3723a26fec8Sjakllsch 	    range_test_positive_one_report,
3733a26fec8Sjakllsch 	    sizeof test_data_positive_one) == 0);
3743a26fec8Sjakllsch 	ATF_CHECK(memcmp(test_data_maximum, range_test_maximum_report,
3753a26fec8Sjakllsch 	    sizeof test_data_maximum) == 0);
3763a26fec8Sjakllsch 
3773a26fec8Sjakllsch 	hid_dispose_report_desc(hrd);
3783a26fec8Sjakllsch 	hrd = NULL;
3793a26fec8Sjakllsch 
3803a26fec8Sjakllsch 	ATF_REQUIRE((hrd = hid_use_report_desc(
3813a26fec8Sjakllsch 	    unsigned_range_test_report_descriptor,
3823a26fec8Sjakllsch 	    __arraycount(range_test_report_descriptor))) != NULL);
3833a26fec8Sjakllsch 	ATF_REQUIRE(hid_locate(hrd, 0xff000011U, hid_input, &hi,
3843a26fec8Sjakllsch 	    NO_REPORT_ID) > 0);
3853a26fec8Sjakllsch 	hid_set_data(test_data_minimum, &hi, 0);
3863a26fec8Sjakllsch 	hid_set_data(test_data_positive_one, &hi, 1);
3873a26fec8Sjakllsch 	hid_set_data(test_data_negative_one, &hi, 0xfffffffe);
3883a26fec8Sjakllsch 	hid_set_data(test_data_maximum, &hi, 0xffffffff);
3893a26fec8Sjakllsch 	ATF_REQUIRE(hid_locate(hrd, 0xff000012U, hid_input, &hi,
3903a26fec8Sjakllsch 	    NO_REPORT_ID) > 0);
3913a26fec8Sjakllsch 	hid_set_data(test_data_minimum, &hi, 0);
3923a26fec8Sjakllsch 	hid_set_data(test_data_positive_one, &hi, 1);
3933a26fec8Sjakllsch 	hid_set_data(test_data_negative_one, &hi, 0xfffe);
3943a26fec8Sjakllsch 	hid_set_data(test_data_maximum, &hi, 0xffff);
3953a26fec8Sjakllsch 	ATF_REQUIRE(hid_locate(hrd, 0xff000013U, hid_input, &hi,
3963a26fec8Sjakllsch 	    NO_REPORT_ID) > 0);
3973a26fec8Sjakllsch 	hid_set_data(test_data_minimum, &hi, 0);
3983a26fec8Sjakllsch 	hid_set_data(test_data_positive_one, &hi, 1);
3993a26fec8Sjakllsch 	hid_set_data(test_data_negative_one, &hi, 0xfffffffe);
4003a26fec8Sjakllsch 	hid_set_data(test_data_maximum, &hi, 0xffffffff);
4013a26fec8Sjakllsch 	ATF_CHECK(memcmp(test_data_minimum,
4023a26fec8Sjakllsch 	    unsigned_range_test_minimum_report,
4033a26fec8Sjakllsch 	    sizeof test_data_minimum) == 0);
4043a26fec8Sjakllsch 	ATF_CHECK(memcmp(test_data_negative_one,
4053a26fec8Sjakllsch 	    unsigned_range_test_negative_one_report,
4063a26fec8Sjakllsch 	    sizeof test_data_negative_one) == 0);
4073a26fec8Sjakllsch 	ATF_CHECK(memcmp(test_data_positive_one,
4083a26fec8Sjakllsch 	    unsigned_range_test_positive_one_report,
4093a26fec8Sjakllsch 	    sizeof test_data_positive_one) == 0);
4103a26fec8Sjakllsch 	ATF_CHECK(memcmp(test_data_maximum,
4113a26fec8Sjakllsch 	    unsigned_range_test_maximum_report,
4123a26fec8Sjakllsch 	    sizeof test_data_maximum) == 0);
4133a26fec8Sjakllsch 
4143a26fec8Sjakllsch 	hid_dispose_report_desc(hrd);
4153a26fec8Sjakllsch 	hrd = NULL;
4163a26fec8Sjakllsch }
4173a26fec8Sjakllsch 
ATF_TC_HEAD(check_parse_just_pop,tc)4184887406fSjakllsch ATF_TC_HEAD(check_parse_just_pop, tc)
4194887406fSjakllsch {
4204887406fSjakllsch 
4214887406fSjakllsch 	atf_tc_set_md_var(tc, "descr", "check Pop on empty stack bug");
4224887406fSjakllsch }
4234887406fSjakllsch 
ATF_TC_BODY(check_parse_just_pop,tc)4244887406fSjakllsch ATF_TC_BODY(check_parse_just_pop, tc)
4254887406fSjakllsch {
4264887406fSjakllsch 	report_desc_t hrd;
4274887406fSjakllsch 	hid_data_t hd;
4284887406fSjakllsch 	hid_item_t hi;
4294887406fSjakllsch 
4304887406fSjakllsch 	ATF_REQUIRE((hrd = hid_use_report_desc(
4314887406fSjakllsch 	    just_pop_report_descriptor,
4324887406fSjakllsch 	    sizeof just_pop_report_descriptor)) != NULL);
4334887406fSjakllsch 	hd = hid_start_parse(hrd, 0, NO_REPORT_ID);
4344887406fSjakllsch 	while (hid_get_item(hd, &hi) > 0) {
4354887406fSjakllsch 	}
4364887406fSjakllsch 	hid_end_parse(hd);
4374887406fSjakllsch 	hid_dispose_report_desc(hrd);
4384887406fSjakllsch 	hrd = NULL;
4394887406fSjakllsch }
4404887406fSjakllsch 
ATF_TP_ADD_TCS(tp)4413a26fec8Sjakllsch ATF_TP_ADD_TCS(tp)
4423a26fec8Sjakllsch {
4433a26fec8Sjakllsch 
4443a26fec8Sjakllsch 	ATF_TP_ADD_TC(tp, check_hid_logical_range);
4453a26fec8Sjakllsch 	ATF_TP_ADD_TC(tp, check_hid_physical_range);
4463a26fec8Sjakllsch 	ATF_TP_ADD_TC(tp, check_hid_usage);
4473a26fec8Sjakllsch 	ATF_TP_ADD_TC(tp, check_hid_get_data);
4483a26fec8Sjakllsch 	ATF_TP_ADD_TC(tp, check_hid_set_data);
4494887406fSjakllsch 	ATF_TP_ADD_TC(tp, check_parse_just_pop);
4503a26fec8Sjakllsch 
4513a26fec8Sjakllsch 	return atf_no_error();
4523a26fec8Sjakllsch }
453