TestServiceFilter.swift [plain text]
//
// TestServiceFilter.swift
// IOHIDFamilyUnitTests
//
// Created by dekom on 9/28/18.
//
import Foundation
import XCTest
import HID
@objc(TestServiceFilter) class TestServiceFilter : XCTestCase {
var userDevice : HIDUserDevice!
var client : HIDEventSystemClient!
var serviceClient : HIDServiceClient!
var eventExp : XCTestExpectation!
override func setUp() {
super.setUp()
guard let client = HIDEventSystemClient(type: HIDEventSystemClientType.monitor) else {
XCTAssert(false, "Failed to create HIDEventSystemClient")
return
}
client.setMatching([kIOHIDVendorIDKey : 12345678,
kIOHIDServiceHiddenKey as String: true])
eventExp = XCTestExpectation(description: "HIDEvent handler")
client.setEventHandler { (service, event) in
print("Received event \(event)")
self.eventExp.fulfill()
}
let serviceExp = XCTestExpectation(description: "service enumerated")
client.setServiceNotificationHandler { (service) in
print("Service added: \(service)")
self.serviceClient = service;
serviceExp.fulfill()
}
client.setDispatchQueue(DispatchQueue.main)
client.activate()
let desc = NSData(bytesNoCopy: UnsafeMutableRawPointer(mutating: HIDKeyboardDescriptor),
length: HIDKeyboardDescriptor.count,
freeWhenDone: false)
let properties : [String : Any] = [kIOHIDReportDescriptorKey: desc,
kIOHIDVendorIDKey: 12345678,
kIOHIDServiceHiddenKey as String: true]
guard let userDevice = HIDUserDevice(properties: properties) else {
XCTAssert(false, "Failed to create HIDUserDevice")
return
}
let result = XCTWaiter.wait(for: [serviceExp], timeout: 5)
XCTAssert(result == XCTWaiter.Result.completed)
self.userDevice = userDevice
self.client = client
}
override func tearDown() {
client.cancel()
super.tearDown()
}
func testServiceFilter() {
var result : Bool = false
print("waiting...")
result = serviceClient.setProperty(1234, forKey: "TestHIDServiceFilterSetProperty")
XCTAssert(result, "serviceClient.setProperty failed")
let prop = serviceClient.property(forKey: "TestHIDServiceFilterGetProperty")
XCTAssert(prop != nil, "servserviceClient.property failed")
print("prop: \(String(describing: prop))")
result = serviceClient.setProperty(true, forKey: "TestEventDispatch")
XCTAssert(result, "serviceClient.setProperty failed")
let waiter = XCTWaiter.wait(for: [eventExp], timeout: 5)
XCTAssert(waiter == XCTWaiter.Result.completed)
let matching = [kIOHIDEventTypeKey : kIOHIDEventTypeKeyboard,
kIOHIDUsagePageKey : kHIDPage_KeyboardOrKeypad,
kIOHIDUsageKey : kHIDUsage_KeyboardLeftShift]
if let event = serviceClient.event(matching: matching) {
print("event: \(event)")
XCTAssert(event.type == kIOHIDEventTypeKeyboard)
XCTAssert(event.children != nil)
} else {
XCTAssert(false, "serviceClient.event failed")
}
let debugInfo = serviceClient.property(forKey: kIOHIDServiceFilterDebugKey) as? Dictionary<String,Any>
XCTAssert(debugInfo != nil, "servserviceClient.property failed for kIOHIDServiceFilterDebugKey")
print("debugInfo: \(String(describing: debugInfo))")
XCTAssert(debugInfo?["FilterName"] as! String == "HIDServiceFilterExample")
XCTAssert(debugInfo?["cancelHandler"] as! Bool == true)
XCTAssert(debugInfo?["dispatchQueue"] as! Bool == true)
XCTAssert(debugInfo?["activated"] as! Bool == true)
XCTAssert(debugInfo?["clientAdded"] as! Bool == true)
}
}