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