From b9e427ded51ae5fe5d41f466fdd22044250e8e14 Mon Sep 17 00:00:00 2001 From: Klaus Reimer Date: Wed, 17 Apr 2013 20:22:57 +0200 Subject: [PATCH] Make JNI lib more robust by validating handle objects --- src/main/c/src/ConfigDescriptor.c | 9 +- src/main/c/src/ConfigDescriptor.h | 1 + src/main/c/src/Context.c | 5 + src/main/c/src/Context.h | 1 + src/main/c/src/DeviceHandle.c | 11 +- src/main/c/src/DeviceHandle.h | 1 + src/main/c/src/DeviceList.c | 9 +- src/main/c/src/DeviceList.h | 1 + src/main/c/src/EndpointDescriptor.c | 4 +- src/main/c/src/LibUsb.c | 259 ++++-- src/main/c/src/Transfer.c | 5 + src/main/c/src/Transfer.h | 1 + src/main/c/src/usb4java.c | 7 + src/main/c/src/usb4java.h | 10 + .../usb4java/libusb/ConfigDescriptor.java | 4 +- .../ailis/usb4java/libusb/DeviceHandle.java | 10 +- .../de/ailis/usb4java/libusb/DeviceList.java | 8 +- .../usb4java/libusb/EndpointDescriptor.java | 4 +- .../libusb/linux-x86_64/libusb4java.so | Bin 126200 -> 130344 bytes .../usb4java/libusb/LibUSBDeviceTest.java | 100 ++- .../usb4java/libusb/LibUSBGlobalTest.java | 2 +- .../de/ailis/usb4java/libusb/LibUSBTest.java | 763 +++++++++++++++++- .../ailis/usb4java/libusb/TransferTest.java | 16 +- .../libusb/mocks/PollfdListenerMock.java | 59 ++ .../ailis/usb4java/{ => test}/TCKRunner.java | 2 +- .../ailis/usb4java/{ => test}/UsbAssume.java | 2 +- .../usb/tck/BulkIOErrorConditionsTest.java | 2 +- src/test/java/javax/usb/tck/BulkIOTests.java | 2 +- .../BulkIOTestwithSynchronizedUsbPipe.java | 2 +- .../javax/usb/tck/BulkShortPacketIOTests.java | 2 +- .../java/javax/usb/tck/ConstantsTest.java | 2 +- .../java/javax/usb/tck/ControlIOTest.java | 2 +- ...DefaultControlPipeTestErrorConditions.java | 2 +- ...orConditionswithSynchronizedUsbDevice.java | 2 +- .../usb/tck/DefaultControlPipeTestIRP.java | 2 +- .../tck/DefaultControlPipeTestIRPList.java | 2 +- ...eTestIRPListwithSynchronizedUsbDevice.java | 2 +- ...lPipeTestIRPwithSynchronizedUsbDevice.java | 2 +- .../javax/usb/tck/FindControlIODevice.java | 2 +- src/test/java/javax/usb/tck/HotPlugTest.java | 2 +- .../tck/InterruptIOErrorConditionsTest.java | 2 +- .../java/javax/usb/tck/InterruptIOTests.java | 2 +- ...nterruptIOTestwithSynchronizedUsbPipe.java | 2 +- .../usb/tck/InterruptShortPacketIOTests.java | 2 +- src/test/java/javax/usb/tck/IrpTest.java | 2 +- .../java/javax/usb/tck/SignatureTest.java | 2 +- .../javax/usb/tck/UsbInterfacePolicyTest.java | 2 +- 47 files changed, 1188 insertions(+), 148 deletions(-) create mode 100644 src/test/java/de/ailis/usb4java/libusb/mocks/PollfdListenerMock.java rename src/test/java/de/ailis/usb4java/{ => test}/TCKRunner.java (97%) rename src/test/java/de/ailis/usb4java/{ => test}/UsbAssume.java (98%) diff --git a/src/main/c/src/ConfigDescriptor.c b/src/main/c/src/ConfigDescriptor.c index e69edc4..465dd1d 100644 --- a/src/main/c/src/ConfigDescriptor.c +++ b/src/main/c/src/ConfigDescriptor.c @@ -9,13 +9,18 @@ void setConfigDescriptor(JNIEnv* env, struct libusb_config_descriptor* descriptor, jobject object) { - SET_POINTER(env, descriptor, object, "pointer"); + SET_POINTER(env, descriptor, object, "configDescriptorPointer"); } struct libusb_config_descriptor* unwrapConfigDescriptor(JNIEnv* env, jobject descriptor) { - UNWRAP_POINTER(env, descriptor, struct libusb_config_descriptor*, "pointer"); + UNWRAP_POINTER(env, descriptor, struct libusb_config_descriptor*, "configDescriptorPointer"); +} + +void resetConfigDescriptor(JNIEnv* env, jobject obj) +{ + RESET_POINTER(env, obj, "configDescriptorPointer"); } /** diff --git a/src/main/c/src/ConfigDescriptor.h b/src/main/c/src/ConfigDescriptor.h index 4626915..b5d8bea 100644 --- a/src/main/c/src/ConfigDescriptor.h +++ b/src/main/c/src/ConfigDescriptor.h @@ -10,5 +10,6 @@ void setConfigDescriptor(JNIEnv*, struct libusb_config_descriptor*, jobject); struct libusb_config_descriptor* unwrapConfigDescriptor(JNIEnv*, jobject); +void resetConfigDescriptor(JNIEnv*, jobject); #endif diff --git a/src/main/c/src/Context.c b/src/main/c/src/Context.c index 97fb679..5f98f03 100644 --- a/src/main/c/src/Context.c +++ b/src/main/c/src/Context.c @@ -14,3 +14,8 @@ libusb_context* unwrapContext(JNIEnv* env, jobject context) { UNWRAP_POINTER(env, context, libusb_context*, "contextPointer"); } + +void resetContext(JNIEnv* env, jobject obj) +{ + RESET_POINTER(env, obj, "contextPointer"); +} diff --git a/src/main/c/src/Context.h b/src/main/c/src/Context.h index e12578b..d348a1a 100644 --- a/src/main/c/src/Context.h +++ b/src/main/c/src/Context.h @@ -10,5 +10,6 @@ void setContext(JNIEnv*, libusb_context*, jobject); libusb_context* unwrapContext(JNIEnv*, jobject); +void resetContext(JNIEnv*, jobject); #endif diff --git a/src/main/c/src/DeviceHandle.c b/src/main/c/src/DeviceHandle.c index d1de0fd..0de351b 100644 --- a/src/main/c/src/DeviceHandle.c +++ b/src/main/c/src/DeviceHandle.c @@ -7,15 +7,20 @@ void setDeviceHandle(JNIEnv* env, libusb_device_handle* deviceHandle, jobject object) { - SET_POINTER(env, deviceHandle, object, "handlePointer"); + SET_POINTER(env, deviceHandle, object, "deviceHandlePointer"); } jobject wrapDeviceHandle(JNIEnv* env, libusb_device_handle* deviceHandle) { - WRAP_POINTER(env, deviceHandle, "DeviceHandle", "handlePointer"); + WRAP_POINTER(env, deviceHandle, "DeviceHandle", "deviceHandlePointer"); } libusb_device_handle* unwrapDeviceHandle(JNIEnv* env, jobject deviceHandle) { - UNWRAP_POINTER(env, deviceHandle, libusb_device_handle*, "handlePointer"); + UNWRAP_POINTER(env, deviceHandle, libusb_device_handle*, "deviceHandlePointer"); +} + +void resetDeviceHandle(JNIEnv* env, jobject object) +{ + RESET_POINTER(env, object, "deviceHandlePointer"); } diff --git a/src/main/c/src/DeviceHandle.h b/src/main/c/src/DeviceHandle.h index 98de02f..81ff999 100644 --- a/src/main/c/src/DeviceHandle.h +++ b/src/main/c/src/DeviceHandle.h @@ -11,5 +11,6 @@ void setDeviceHandle(JNIEnv*, libusb_device_handle*, jobject); jobject wrapDeviceHandle(JNIEnv*, libusb_device_handle*); libusb_device_handle* unwrapDeviceHandle(JNIEnv*, jobject); +void resetDeviceHandle(JNIEnv*, jobject); #endif diff --git a/src/main/c/src/DeviceList.c b/src/main/c/src/DeviceList.c index ace7acd..c51e339 100644 --- a/src/main/c/src/DeviceList.c +++ b/src/main/c/src/DeviceList.c @@ -8,7 +8,7 @@ void setDeviceList(JNIEnv* env, libusb_device** list, int size, jobject object) { - SET_POINTER(env, list, object, "pointer"); + SET_POINTER(env, list, object, "deviceListPointer"); jclass cls = (*env)->GetObjectClass(env, object); jfieldID field = (*env)->GetFieldID(env, cls, "size", "I"); @@ -17,7 +17,12 @@ void setDeviceList(JNIEnv* env, libusb_device** list, int size, jobject object) libusb_device** unwrapDeviceList(JNIEnv* env, jobject list) { - UNWRAP_POINTER(env, list, libusb_device**, "pointer"); + UNWRAP_POINTER(env, list, libusb_device**, "deviceListPointer"); +} + +void resetDeviceList(JNIEnv* env, jobject obj) +{ + RESET_POINTER(env, obj, "deviceListPointer"); } /** diff --git a/src/main/c/src/DeviceList.h b/src/main/c/src/DeviceList.h index 9060588..79cf469 100644 --- a/src/main/c/src/DeviceList.h +++ b/src/main/c/src/DeviceList.h @@ -10,5 +10,6 @@ void setDeviceList(JNIEnv*, libusb_device**, int, jobject); libusb_device** unwrapDeviceList(JNIEnv*, jobject); +void resetDeviceList(JNIEnv*, jobject); #endif diff --git a/src/main/c/src/EndpointDescriptor.c b/src/main/c/src/EndpointDescriptor.c index 21f861a..b8c72dd 100644 --- a/src/main/c/src/EndpointDescriptor.c +++ b/src/main/c/src/EndpointDescriptor.c @@ -8,7 +8,7 @@ jobject wrapEndpointDescriptor(JNIEnv *env, const struct libusb_endpoint_descriptor *descriptor) { - WRAP_POINTER(env, descriptor, "EndpointDescriptor", "pointer"); + WRAP_POINTER(env, descriptor, "EndpointDescriptor", "endpointDescriptorPointer"); } jobjectArray wrapEndpointDescriptors(JNIEnv *env, int count, @@ -28,7 +28,7 @@ jobjectArray wrapEndpointDescriptors(JNIEnv *env, int count, struct libusb_endpoint_descriptor *unwrapEndpointDescriptor(JNIEnv *env, jobject obj) { - UNWRAP_POINTER(env, obj, struct libusb_endpoint_descriptor*, "pointer"); + UNWRAP_POINTER(env, obj, struct libusb_endpoint_descriptor*, "endpointDescriptorPointer"); } /** diff --git a/src/main/c/src/LibUsb.c b/src/main/c/src/LibUsb.c index f05ba96..d02c89d 100644 --- a/src/main/c/src/LibUsb.c +++ b/src/main/c/src/LibUsb.c @@ -65,7 +65,10 @@ JNIEXPORT void JNICALL METHOD_NAME(LibUsb, exit) JNIEnv *env, jclass class, jobject context ) { - libusb_exit(unwrapContext(env, context)); + struct libusb_context *ctx = unwrapContext(env, context); + if (!ctx) return; + libusb_exit(ctx); + resetContext(env, context); } /** @@ -76,7 +79,9 @@ JNIEXPORT void JNICALL METHOD_NAME(LibUsb, setDebug) JNIEnv *env, jclass class, jobject context, jint level ) { - libusb_set_debug(unwrapContext(env, context), level); + struct libusb_context *ctx = unwrapContext(env, context); + if (!ctx) return; + libusb_set_debug(ctx, level); } /** @@ -88,9 +93,10 @@ JNIEXPORT jint JNICALL METHOD_NAME(LibUsb, getDeviceList) ) { NOT_NULL(env, deviceList, return 0); + struct libusb_context *ctx = unwrapContext(env, context); + if (!ctx) return 0; libusb_device **list; - ssize_t result = libusb_get_device_list(unwrapContext(env, context), - &list); + ssize_t result = libusb_get_device_list(ctx, &list); if (result >= 0) setDeviceList(env, list, result, deviceList); return result; } @@ -104,7 +110,10 @@ JNIEXPORT void JNICALL METHOD_NAME(LibUsb, freeDeviceList) ) { NOT_NULL(env, deviceList, return); - libusb_free_device_list(unwrapDeviceList(env, deviceList), unrefDevices); + libusb_device **list = unwrapDeviceList(env, deviceList); + if (!list) return; + libusb_free_device_list(list, unrefDevices); + resetDeviceList(env, deviceList); } /** @@ -116,7 +125,9 @@ JNIEXPORT jint JNICALL METHOD_NAME(LibUsb, getBusNumber) ) { NOT_NULL(env, device, return 0); - return libusb_get_bus_number(unwrapDevice(env, device)); + libusb_device *dev = unwrapDevice(env, device); + if (!dev) return 0; + return libusb_get_bus_number(dev); } /** @@ -128,8 +139,10 @@ JNIEXPORT jint JNICALL METHOD_NAME(LibUsb, getPortNumber) ) { NOT_NULL(env, device, return 0); + libusb_device *dev = unwrapDevice(env, device); + if (!dev) return 0; #if defined(LIBUSBX_API_VERSION) - return libusb_get_port_number(unwrapDevice(env, device)); + return libusb_get_port_number(dev); #else return 0; #endif @@ -145,11 +158,14 @@ JNIEXPORT jint JNICALL METHOD_NAME(LibUsb, getPortPath) { NOT_NULL(env, device, return 0); NOT_NULL(env, path, return 0); + struct libusb_context *ctx = unwrapContext(env, context); + if (!ctx) return 0; + libusb_device *dev = unwrapDevice(env, device); + if (!dev) return 0; jsize size = (*env)->GetArrayLength(env, path); unsigned char buffer[size]; #if defined(LIBUSBX_API_VERSION) - int result = libusb_get_port_path(unwrapContext(env, context), - unwrapDevice(env, device), buffer, size); + int result = libusb_get_port_path(ctx, dev, buffer, size); #else int result = 0; #endif @@ -166,8 +182,10 @@ JNIEXPORT jobject JNICALL METHOD_NAME(LibUsb, getParent) ) { NOT_NULL(env, device, return NULL); + libusb_device *dev = unwrapDevice(env, device); + if (!dev) return NULL; #if defined(LIBUSBX_API_VERSION) - return wrapDevice(env, libusb_get_parent(unwrapDevice(env, device))); + return wrapDevice(env, libusb_get_parent(dev)); #else return NULL; #endif @@ -182,7 +200,9 @@ JNIEXPORT jint JNICALL METHOD_NAME(LibUsb, getDeviceAddress) ) { NOT_NULL(env, device, return 0); - return libusb_get_device_address(unwrapDevice(env, device)); + libusb_device *dev = unwrapDevice(env, device); + if (!dev) return 0; + return libusb_get_device_address(dev); } /** @@ -194,7 +214,9 @@ JNIEXPORT jint JNICALL METHOD_NAME(LibUsb, getDeviceSpeed) ) { NOT_NULL(env, device, return 0); - return libusb_get_device_speed(unwrapDevice(env, device)); + libusb_device *dev = unwrapDevice(env, device); + if (!dev) return 0; + return libusb_get_device_speed(dev); } /** @@ -206,7 +228,9 @@ JNIEXPORT jint JNICALL METHOD_NAME(LibUsb, getMaxPacketSize) ) { NOT_NULL(env, device, return 0); - return libusb_get_max_packet_size(unwrapDevice(env, device), endpoint); + libusb_device *dev = unwrapDevice(env, device); + if (!dev) return 0; + return libusb_get_max_packet_size(dev, endpoint); } /** @@ -218,7 +242,9 @@ JNIEXPORT jint JNICALL METHOD_NAME(LibUsb, getMaxIsoPacketSize) ) { NOT_NULL(env, device, return 0); - return libusb_get_max_iso_packet_size(unwrapDevice(env, device), endpoint); + libusb_device *dev = unwrapDevice(env, device); + if (!dev) return 0; + return libusb_get_max_iso_packet_size(dev, endpoint); } /** @@ -230,7 +256,9 @@ JNIEXPORT jobject JNICALL METHOD_NAME(LibUsb, refDevice) ) { NOT_NULL(env, device, return NULL); - libusb_ref_device(unwrapDevice(env, device)); + libusb_device *dev = unwrapDevice(env, device); + if (!dev) return NULL; + libusb_ref_device(dev); return device; } @@ -243,7 +271,9 @@ JNIEXPORT void JNICALL METHOD_NAME(LibUsb, unrefDevice) ) { NOT_NULL(env, device, return); - libusb_unref_device(unwrapDevice(env, device)); + libusb_device *dev = unwrapDevice(env, device); + if (!dev) return; + libusb_unref_device(dev); } /** @@ -256,8 +286,10 @@ JNIEXPORT jint JNICALL METHOD_NAME(LibUsb, open) { NOT_NULL(env, device, return 0); NOT_NULL(env, handle, return 0); + libusb_device *dev = unwrapDevice(env, device); + if (!dev) return 0; libusb_device_handle *deviceHandle; - int result = libusb_open(unwrapDevice(env, device), &deviceHandle); + int result = libusb_open(dev, &deviceHandle); if (!result) setDeviceHandle(env, deviceHandle, handle); return result; } @@ -271,8 +303,10 @@ JNIEXPORT jobject JNICALL METHOD_NAME(LibUsb, openDeviceWithVidPid) jint productId ) { + struct libusb_context *ctx = unwrapContext(env, context); + if (!ctx) return NULL; return wrapDeviceHandle(env, libusb_open_device_with_vid_pid( - unwrapContext(env, context), vendorId, productId)); + ctx, vendorId, productId)); } /** @@ -284,7 +318,10 @@ JNIEXPORT void JNICALL METHOD_NAME(LibUsb, close) ) { NOT_NULL(env, handle, return); - libusb_close(unwrapDeviceHandle(env, handle)); + libusb_device_handle *dev_handle = unwrapDeviceHandle(env, handle); + if (!dev_handle) return; + libusb_close(dev_handle); + resetDeviceHandle(env, handle); } /** @@ -296,7 +333,9 @@ JNIEXPORT jobject JNICALL METHOD_NAME(LibUsb, getDevice) ) { NOT_NULL(env, handle, return NULL); - return wrapDevice(env, libusb_get_device(unwrapDeviceHandle(env, handle))); + libusb_device_handle *dev_handle = unwrapDeviceHandle(env, handle); + if (!dev_handle) return NULL; + return wrapDevice(env, libusb_get_device(dev_handle)); } /** @@ -309,9 +348,10 @@ JNIEXPORT jint JNICALL METHOD_NAME(LibUsb, getConfiguration) { NOT_NULL(env, handle, return 0); NOT_NULL(env, buffer, return 0); + libusb_device_handle *dev_handle = unwrapDeviceHandle(env, handle); + if (!dev_handle) return 0; int config; - int result = libusb_get_configuration(unwrapDeviceHandle(env, handle), - &config); + int result = libusb_get_configuration(dev_handle, &config); if (!result) { jclass cls = (*env)->GetObjectClass(env, buffer); @@ -330,7 +370,9 @@ JNIEXPORT jint JNICALL METHOD_NAME(LibUsb, setConfiguration) ) { NOT_NULL(env, handle, return 0); - return libusb_set_configuration(unwrapDeviceHandle(env, handle), config); + libusb_device_handle *dev_handle = unwrapDeviceHandle(env, handle); + if (!dev_handle) return 0; + return libusb_set_configuration(dev_handle, config); } /** @@ -342,7 +384,9 @@ JNIEXPORT jint JNICALL METHOD_NAME(LibUsb, claimInterface) ) { NOT_NULL(env, handle, return 0); - return libusb_claim_interface(unwrapDeviceHandle(env, handle), iface); + libusb_device_handle *dev_handle = unwrapDeviceHandle(env, handle); + if (!dev_handle) return 0; + return libusb_claim_interface(dev_handle, iface); } /** @@ -354,7 +398,9 @@ JNIEXPORT jint JNICALL METHOD_NAME(LibUsb, releaseInterface) ) { NOT_NULL(env, handle, return 0); - return libusb_release_interface(unwrapDeviceHandle(env, handle), iface); + libusb_device_handle *dev_handle = unwrapDeviceHandle(env, handle); + if (!dev_handle) return 0; + return libusb_release_interface(dev_handle, iface); } /** @@ -366,8 +412,9 @@ JNIEXPORT jint JNICALL METHOD_NAME(LibUsb, setInterfaceAltSetting) ) { NOT_NULL(env, handle, return 0); - return libusb_set_interface_alt_setting(unwrapDeviceHandle(env, handle), - iface, setting); + libusb_device_handle *dev_handle = unwrapDeviceHandle(env, handle); + if (!dev_handle) return 0; + return libusb_set_interface_alt_setting(dev_handle, iface, setting); } /** @@ -379,7 +426,9 @@ JNIEXPORT jint JNICALL METHOD_NAME(LibUsb, clearHalt) ) { NOT_NULL(env, handle, return 0); - return libusb_clear_halt(unwrapDeviceHandle(env, handle), endpoint); + libusb_device_handle *dev_handle = unwrapDeviceHandle(env, handle); + if (!dev_handle) return 0; + return libusb_clear_halt(dev_handle, endpoint); } /** @@ -391,7 +440,9 @@ JNIEXPORT jint JNICALL METHOD_NAME(LibUsb, resetDevice) ) { NOT_NULL(env, handle, return 0); - return libusb_reset_device(unwrapDeviceHandle(env, handle)); + libusb_device_handle *dev_handle = unwrapDeviceHandle(env, handle); + if (!dev_handle) return 0; + return libusb_reset_device(dev_handle); } /** @@ -403,7 +454,9 @@ JNIEXPORT jint JNICALL METHOD_NAME(LibUsb, kernelDriverActive) ) { NOT_NULL(env, handle, return 0); - return libusb_kernel_driver_active(unwrapDeviceHandle(env, handle), iface); + libusb_device_handle *dev_handle = unwrapDeviceHandle(env, handle); + if (!dev_handle) return 0; + return libusb_kernel_driver_active(dev_handle, iface); } /** @@ -415,7 +468,9 @@ JNIEXPORT jint JNICALL METHOD_NAME(LibUsb, detachKernelDriver) ) { NOT_NULL(env, handle, return 0); - return libusb_detach_kernel_driver(unwrapDeviceHandle(env, handle), iface); + libusb_device_handle *dev_handle = unwrapDeviceHandle(env, handle); + if (!dev_handle) return 0; + return libusb_detach_kernel_driver(dev_handle, iface); } /** @@ -427,7 +482,9 @@ JNIEXPORT jint JNICALL METHOD_NAME(LibUsb, attachKernelDriver) ) { NOT_NULL(env, handle, return 0); - return libusb_attach_kernel_driver(unwrapDeviceHandle(env, handle), iface); + libusb_device_handle *dev_handle = unwrapDeviceHandle(env, handle); + if (!dev_handle) return 0; + return libusb_attach_kernel_driver(dev_handle, iface); } /** @@ -484,8 +541,11 @@ JNIEXPORT jint JNICALL METHOD_NAME(LibUsb, getDeviceDescriptor) { NOT_NULL(env, device, return 0); NOT_NULL(env, descriptor, return 0); - struct libusb_device_descriptor *data = malloc(sizeof(struct libusb_device_descriptor)); - int result = libusb_get_device_descriptor(unwrapDevice(env, device), data); + libusb_device *dev = unwrapDevice(env, device); + if (!dev) return 0; + struct libusb_device_descriptor *data = + malloc(sizeof(struct libusb_device_descriptor)); + int result = libusb_get_device_descriptor(dev, data); if (!result) setDeviceDescriptor(env, data, descriptor); return result; } @@ -501,9 +561,11 @@ JNIEXPORT jint JNICALL METHOD_NAME(LibUsb, getStringDescriptorAscii) { NOT_NULL(env, handle, return 0); NOT_NULL(env, string, return 0); + libusb_device_handle *dev_handle = unwrapDeviceHandle(env, handle); + if (!dev_handle) return 0; unsigned char buffer[length + 1]; int result = libusb_get_string_descriptor_ascii( - unwrapDeviceHandle(env, handle), index, buffer, length); + dev_handle, index, buffer, length); if (result >= 0) { buffer[result] = 0; @@ -525,9 +587,10 @@ JNIEXPORT jint JNICALL METHOD_NAME(LibUsb, getActiveConfigDescriptor) { NOT_NULL(env, device, return 0); NOT_NULL(env, descriptor, return 0); + libusb_device *dev = unwrapDevice(env, device); + if (!dev) return 0; struct libusb_config_descriptor *config; - int result = libusb_get_active_config_descriptor( - unwrapDevice(env, device), &config); + int result = libusb_get_active_config_descriptor(dev, &config); if (!result) setConfigDescriptor(env, config, descriptor); return result; } @@ -542,9 +605,10 @@ JNIEXPORT jint JNICALL METHOD_NAME(LibUsb, getConfigDescriptor) { NOT_NULL(env, device, return 0); NOT_NULL(env, descriptor, return 0); + libusb_device *dev = unwrapDevice(env, device); + if (!dev) return 0; struct libusb_config_descriptor *config; - int result = libusb_get_config_descriptor( - unwrapDevice(env, device), index, &config); + int result = libusb_get_config_descriptor(dev, index, &config); if (!result) setConfigDescriptor(env, config, descriptor); return result; } @@ -559,9 +623,11 @@ JNIEXPORT jint JNICALL METHOD_NAME(LibUsb, getConfigDescriptorByValue) { NOT_NULL(env, device, return 0); NOT_NULL(env, descriptor, return 0); + libusb_device *dev = unwrapDevice(env, device); + if (!dev) return 0; struct libusb_config_descriptor *config; int result = libusb_get_config_descriptor_by_value( - unwrapDevice(env, device), index, &config); + dev, index, &config); if (!result) setConfigDescriptor(env, config, descriptor); return result; } @@ -575,7 +641,11 @@ JNIEXPORT void JNICALL METHOD_NAME(LibUsb, freeConfigDescriptor) ) { NOT_NULL(env, descriptor, return); - libusb_free_config_descriptor(unwrapConfigDescriptor(env, descriptor)); + struct libusb_config_descriptor *config = unwrapConfigDescriptor(env, + descriptor); + if (!config) return; + libusb_free_config_descriptor(config); + resetConfigDescriptor(env, descriptor); } /** @@ -590,10 +660,11 @@ JNIEXPORT jint JNICALL METHOD_NAME(LibUsb, getDescriptor) NOT_NULL(env, handle, return 0); NOT_NULL(env, data, return 0); DIRECT_BUFFER(env, data, return 0); + libusb_device_handle *dev_handle = unwrapDeviceHandle(env, handle); + if (!dev_handle) return 0; unsigned char *ptr = (*env)->GetDirectBufferAddress(env, data); jlong size = (*env)->GetDirectBufferCapacity(env, data); - return libusb_get_descriptor(unwrapDeviceHandle(env, handle), - type, index, ptr, size); + return libusb_get_descriptor(dev_handle, type, index, ptr, size); } /** @@ -608,10 +679,11 @@ JNIEXPORT jint JNICALL METHOD_NAME(LibUsb, getStringDescriptor) NOT_NULL(env, handle, return 0); NOT_NULL(env, data, return 0); DIRECT_BUFFER(env, data, return 0); + libusb_device_handle *dev_handle = unwrapDeviceHandle(env, handle); + if (!dev_handle) return 0; unsigned char *ptr = (*env)->GetDirectBufferAddress(env, data); jlong size = (*env)->GetDirectBufferCapacity(env, data); - return libusb_get_string_descriptor(unwrapDeviceHandle(env, handle), - index, langId, ptr, size); + return libusb_get_string_descriptor(dev_handle, index, langId, ptr, size); } /** @@ -626,10 +698,12 @@ JNIEXPORT jint JNICALL METHOD_NAME(LibUsb, controlTransfer) NOT_NULL(env, handle, return 0); NOT_NULL(env, data, return 0); DIRECT_BUFFER(env, data, return 0); + libusb_device_handle *dev_handle = unwrapDeviceHandle(env, handle); + if (!dev_handle) return 0; unsigned char *ptr = (*env)->GetDirectBufferAddress(env, data); jlong size = (*env)->GetDirectBufferCapacity(env, data); - return libusb_control_transfer(unwrapDeviceHandle(env, handle), - bmRequestType, bRequest, wValue, wIndex, ptr, size, timeout); + return libusb_control_transfer(dev_handle, bmRequestType, bRequest, + wValue, wIndex, ptr, size, timeout); } /** @@ -645,11 +719,13 @@ JNIEXPORT jint JNICALL METHOD_NAME(LibUsb, bulkTransfer) NOT_NULL(env, data, return 0); NOT_NULL(env, transferred, return 0); DIRECT_BUFFER(env, data, return 0); + libusb_device_handle *dev_handle = unwrapDeviceHandle(env, handle); + if (!dev_handle) return 0; int sent; unsigned char *ptr = (*env)->GetDirectBufferAddress(env, data); jlong size = (*env)->GetDirectBufferCapacity(env, data); - int result = libusb_bulk_transfer(unwrapDeviceHandle(env, handle), - endpoint, ptr, size, &sent, timeout); + int result = libusb_bulk_transfer(dev_handle, endpoint, ptr, size, &sent, + timeout); if (!result) { jclass cls = (*env)->GetObjectClass(env, transferred); @@ -673,11 +749,13 @@ JNIEXPORT jint JNICALL METHOD_NAME(LibUsb, interruptTransfer) NOT_NULL(env, data, return 0); NOT_NULL(env, transferred, return 0); DIRECT_BUFFER(env, data, return 0); + libusb_device_handle *dev_handle = unwrapDeviceHandle(env, handle); + if (!dev_handle) return 0; int sent; unsigned char *ptr = (*env)->GetDirectBufferAddress(env, data); jlong size = (*env)->GetDirectBufferCapacity(env, data); - int result = libusb_interrupt_transfer(unwrapDeviceHandle(env, handle), - endpoint, ptr, size, &sent, timeout); + int result = libusb_interrupt_transfer(dev_handle, endpoint, ptr, size, + &sent, timeout); if (!result) { jclass cls = (*env)->GetObjectClass(env, transferred); @@ -696,7 +774,9 @@ JNIEXPORT jint JNICALL METHOD_NAME(LibUsb, tryLockEvents) JNIEnv *env, jclass class, jobject context ) { - return libusb_try_lock_events(unwrapContext(env, context)); + struct libusb_context *ctx = unwrapContext(env, context); + if (!ctx) return 0; + return libusb_try_lock_events(ctx); } /** @@ -707,7 +787,9 @@ JNIEXPORT void JNICALL METHOD_NAME(LibUsb, lockEvents) JNIEnv *env, jclass class, jobject context ) { - libusb_lock_events(unwrapContext(env, context)); + struct libusb_context *ctx = unwrapContext(env, context); + if (!ctx) return; + libusb_lock_events(ctx); } /** @@ -718,7 +800,9 @@ JNIEXPORT void JNICALL METHOD_NAME(LibUsb, unlockEvents) JNIEnv *env, jclass class, jobject context ) { - libusb_unlock_events(unwrapContext(env, context)); + struct libusb_context *ctx = unwrapContext(env, context); + if (!ctx) return; + libusb_unlock_events(ctx); } /** @@ -729,7 +813,9 @@ JNIEXPORT jint JNICALL METHOD_NAME(LibUsb, eventHandlingOk) JNIEnv *env, jclass class, jobject context ) { - return libusb_event_handling_ok(unwrapContext(env, context)); + struct libusb_context *ctx = unwrapContext(env, context); + if (!ctx) return 0; + return libusb_event_handling_ok(ctx); } /** @@ -740,7 +826,9 @@ JNIEXPORT jint JNICALL METHOD_NAME(LibUsb, eventHandlerActive) JNIEnv *env, jclass class, jobject context ) { - return libusb_event_handler_active(unwrapContext(env, context)); + struct libusb_context *ctx = unwrapContext(env, context); + if (!ctx) return 0; + return libusb_event_handler_active(ctx); } /** @@ -751,7 +839,9 @@ JNIEXPORT void JNICALL METHOD_NAME(LibUsb, lockEventWaiters) JNIEnv *env, jclass class, jobject context ) { - libusb_lock_event_waiters(unwrapContext(env, context)); + struct libusb_context *ctx = unwrapContext(env, context); + if (!ctx) return; + libusb_lock_event_waiters(ctx); } /** @@ -762,7 +852,9 @@ JNIEXPORT void JNICALL METHOD_NAME(LibUsb, unlockEventWaiters) JNIEnv *env, jclass class, jobject context ) { - libusb_unlock_event_waiters(unwrapContext(env, context)); + struct libusb_context *ctx = unwrapContext(env, context); + if (!ctx) return; + libusb_unlock_event_waiters(ctx); } /** @@ -773,10 +865,12 @@ JNIEXPORT jint JNICALL METHOD_NAME(LibUsb, waitForEvent) JNIEnv *env, jclass class, jobject context, jlong timeout ) { + struct libusb_context *ctx = unwrapContext(env, context); + if (!ctx) return 0; struct timeval tv; tv.tv_sec = timeout / 1000000; tv.tv_usec = timeout % 1000000; - return libusb_wait_for_event(unwrapContext(env, context), &tv); + return libusb_wait_for_event(ctx, &tv); } /** @@ -788,12 +882,13 @@ JNIEXPORT jint JNICALL METHOD_NAME(LibUsb, handleEventsTimeoutCompleted) jobject completed ) { + struct libusb_context *ctx = unwrapContext(env, context); + if (!ctx) return 0; struct timeval tv; tv.tv_sec = timeout / 1000000; tv.tv_usec = timeout % 1000000; int complete; - int result = libusb_handle_events_timeout_completed( - unwrapContext(env, context), &tv, &complete); + int result = libusb_handle_events_timeout_completed(ctx, &tv, &complete); if (!result && completed) { jclass cls = (*env)->GetObjectClass(env, completed); @@ -811,10 +906,12 @@ JNIEXPORT jint JNICALL METHOD_NAME(LibUsb, handleEventsTimeout) JNIEnv *env, jclass class, jobject context, jlong timeout ) { + struct libusb_context *ctx = unwrapContext(env, context); + if (!ctx) return 0; struct timeval tv; tv.tv_sec = timeout / 1000000; tv.tv_usec = timeout % 1000000; - return libusb_handle_events_timeout(unwrapContext(env, context), &tv); + return libusb_handle_events_timeout(ctx, &tv); } /** @@ -825,7 +922,9 @@ JNIEXPORT jint JNICALL METHOD_NAME(LibUsb, handleEvents) JNIEnv *env, jclass class, jobject context ) { - return libusb_handle_events(unwrapContext(env, context)); + struct libusb_context *ctx = unwrapContext(env, context); + if (!ctx) return 0; + return libusb_handle_events(ctx); } /** @@ -836,9 +935,10 @@ JNIEXPORT jint JNICALL METHOD_NAME(LibUsb, handleEventsCompleted) JNIEnv *env, jclass class, jobject context, jobject completed ) { + struct libusb_context *ctx = unwrapContext(env, context); + if (!ctx) return 0; int complete; - int result = libusb_handle_events_completed( - unwrapContext(env, context), &complete); + int result = libusb_handle_events_completed(ctx, &complete); if (!result && completed) { jclass cls = (*env)->GetObjectClass(env, completed); @@ -856,10 +956,12 @@ JNIEXPORT jint JNICALL METHOD_NAME(LibUsb, handleEventsLocked) JNIEnv *env, jclass class, jobject context, jlong timeout ) { + struct libusb_context *ctx = unwrapContext(env, context); + if (!ctx) return 0; struct timeval tv; tv.tv_sec = timeout / 1000000; tv.tv_usec = timeout % 1000000; - return libusb_handle_events_locked(unwrapContext(env, context), &tv); + return libusb_handle_events_locked(ctx, &tv); } /** @@ -870,7 +972,9 @@ JNIEXPORT jint JNICALL METHOD_NAME(LibUsb, pollfdsHandleTimeouts) JNIEnv *env, jclass class, jobject context ) { - return libusb_pollfds_handle_timeouts(unwrapContext(env, context)); + struct libusb_context *ctx = unwrapContext(env, context); + if (!ctx) return 0; + return libusb_pollfds_handle_timeouts(ctx); } /** @@ -881,9 +985,10 @@ JNIEXPORT jint JNICALL METHOD_NAME(LibUsb, getNextTimeout) JNIEnv *env, jclass class, jobject context, jobject timeout ) { + struct libusb_context *ctx = unwrapContext(env, context); + if (!ctx) return 0; struct timeval tv; - int result = libusb_get_next_timeout( - unwrapContext(env, context), &tv); + int result = libusb_get_next_timeout(ctx, &tv); if (result == 1) { jclass cls = (*env)->GetObjectClass(env, timeout); @@ -935,9 +1040,11 @@ JNIEXPORT void JNICALL METHOD_NAME(LibUsb, setPollfdNotifiers) JNIEnv *env, jclass class, jobject context ) { + struct libusb_context *ctx = unwrapContext(env, context); + if (!ctx) return; (*env)->GetJavaVM(env, &jvm); - libusb_set_pollfd_notifiers(unwrapContext(env, context), - triggerPollfdAdded, triggerPollfdRemoved, NULL); + libusb_set_pollfd_notifiers(ctx, triggerPollfdAdded, triggerPollfdRemoved, + NULL); } /** @@ -948,8 +1055,9 @@ JNIEXPORT void JNICALL METHOD_NAME(LibUsb, unsetPollfdNotifiers) JNIEnv *env, jclass class, jobject context ) { - libusb_set_pollfd_notifiers(unwrapContext(env, context), - NULL, NULL, NULL); + struct libusb_context *ctx = unwrapContext(env, context); + if (!ctx) return; + libusb_set_pollfd_notifiers(ctx, NULL, NULL, NULL); } /** @@ -971,5 +1079,8 @@ JNIEXPORT void JNICALL METHOD_NAME(LibUsb, freeTransfer) JNIEnv *env, jclass class, jobject transfer ) { - libusb_free_transfer(unwrapTransfer(env, transfer)); + struct libusb_transfer *handle = unwrapTransfer(env, transfer); + if (!handle) return; + libusb_free_transfer(handle); + resetTransfer(env, transfer); } diff --git a/src/main/c/src/Transfer.c b/src/main/c/src/Transfer.c index 41f40f8..80bdc0b 100644 --- a/src/main/c/src/Transfer.c +++ b/src/main/c/src/Transfer.c @@ -16,6 +16,11 @@ struct libusb_transfer* unwrapTransfer(JNIEnv *env, jobject obj) UNWRAP_POINTER(env, obj, struct libusb_transfer*, "pointer"); } +void resetTransfer(JNIEnv* env, jobject obj) +{ + RESET_POINTER(env, obj, "pointer"); +} + /** * void setDevHandle(DeviceHandle) */ diff --git a/src/main/c/src/Transfer.h b/src/main/c/src/Transfer.h index e7686fd..dbca82d 100644 --- a/src/main/c/src/Transfer.h +++ b/src/main/c/src/Transfer.h @@ -10,5 +10,6 @@ jobject wrapTransfer(JNIEnv*, struct libusb_transfer*); struct libusb_transfer* unwrapTransfer(JNIEnv*, jobject); +void resetTransfer(JNIEnv*, jobject); #endif diff --git a/src/main/c/src/usb4java.c b/src/main/c/src/usb4java.c index 0a219b0..c148ca7 100644 --- a/src/main/c/src/usb4java.c +++ b/src/main/c/src/usb4java.c @@ -10,3 +10,10 @@ jint illegalArgument(JNIEnv *env, char *message) jclass cls = (*env)->FindClass(env, "java/lang/IllegalArgumentException"); return (*env)->ThrowNew(env, cls, message); } + +jint illegalState(JNIEnv *env, char *message) +{ + jclass cls = (*env)->FindClass(env, "java/lang/IllegalStateException"); + return (*env)->ThrowNew(env, cls, message); +} + diff --git a/src/main/c/src/usb4java.h b/src/main/c/src/usb4java.h index b9e45b6..dba1afc 100644 --- a/src/main/c/src/usb4java.h +++ b/src/main/c/src/usb4java.h @@ -26,6 +26,13 @@ (*ENV)->SetLongField(ENV, OBJECT, field, (jptr) PTR); \ } +#define RESET_POINTER(ENV, OBJECT, FIELD) \ +{ \ + jclass cls = (*ENV)->GetObjectClass(ENV, OBJECT); \ + jfieldID field = (*ENV)->GetFieldID(ENV, cls, FIELD, "J"); \ + (*ENV)->SetLongField(ENV, OBJECT, field, 0); \ +} + #define WRAP_POINTER(ENV, PTR, CLASS_NAME, FIELD) \ { \ if (!PTR) return NULL; \ @@ -44,6 +51,8 @@ if (!OBJECT) return NULL; \ jclass cls = (*ENV)->GetObjectClass(ENV, OBJECT); \ jfieldID field = (*ENV)->GetFieldID(ENV, cls, FIELD, "J"); \ + jptr ptr = (jptr) (*ENV)->GetLongField(ENV, OBJECT, field); \ + if (!ptr) illegalState(ENV, FIELD" is not initialized"); \ return (TYPE) (jptr) (*ENV)->GetLongField(ENV, OBJECT, field); \ } @@ -94,5 +103,6 @@ if (getEnvResult == JNI_EDETACHED) (*jvm)->DetachCurrentThread(jvm); jint illegalArgument(JNIEnv *env, char *message); +jint illegalState(JNIEnv *env, char *message); #endif diff --git a/src/main/java/de/ailis/usb4java/libusb/ConfigDescriptor.java b/src/main/java/de/ailis/usb4java/libusb/ConfigDescriptor.java index a9dda09..291f69a 100644 --- a/src/main/java/de/ailis/usb4java/libusb/ConfigDescriptor.java +++ b/src/main/java/de/ailis/usb4java/libusb/ConfigDescriptor.java @@ -31,7 +31,7 @@ import de.ailis.usb4java.utils.DescriptorUtils; public final class ConfigDescriptor implements UsbConfigurationDescriptor { /** The native pointer to the descriptor structure. */ - private long pointer; + private long configDescriptorPointer; /** * Constructs a new config descriptor which can be passed to the @@ -49,7 +49,7 @@ public final class ConfigDescriptor implements UsbConfigurationDescriptor */ public long getPointer() { - return this.pointer; + return this.configDescriptorPointer; } @Override diff --git a/src/main/java/de/ailis/usb4java/libusb/DeviceHandle.java b/src/main/java/de/ailis/usb4java/libusb/DeviceHandle.java index 0ce4430..24a9b39 100644 --- a/src/main/java/de/ailis/usb4java/libusb/DeviceHandle.java +++ b/src/main/java/de/ailis/usb4java/libusb/DeviceHandle.java @@ -27,7 +27,7 @@ import org.apache.commons.lang3.builder.HashCodeBuilder; public final class DeviceHandle { /** The native pointer to the device handle structure. */ - private long handlePointer; + private long deviceHandlePointer; /** * Constructs a new device handle. Must be passed to @@ -46,13 +46,13 @@ public final class DeviceHandle */ public long getPointer() { - return this.handlePointer; + return this.deviceHandlePointer; } @Override public int hashCode() { - return new HashCodeBuilder().append(this.handlePointer).toHashCode(); + return new HashCodeBuilder().append(this.deviceHandlePointer).toHashCode(); } @Override @@ -61,12 +61,12 @@ public final class DeviceHandle if (this == obj) return true; if (obj == null || getClass() != obj.getClass()) return false; final DeviceHandle other = (DeviceHandle) obj; - return this.handlePointer == other.handlePointer; + return this.deviceHandlePointer == other.deviceHandlePointer; } @Override public String toString() { - return String.format("libusb handle 0x%x", this.handlePointer); + return String.format("libusb handle 0x%x", this.deviceHandlePointer); } } diff --git a/src/main/java/de/ailis/usb4java/libusb/DeviceList.java b/src/main/java/de/ailis/usb4java/libusb/DeviceList.java index b0ccd5f..0c8cc00 100644 --- a/src/main/java/de/ailis/usb4java/libusb/DeviceList.java +++ b/src/main/java/de/ailis/usb4java/libusb/DeviceList.java @@ -24,7 +24,7 @@ import org.apache.commons.lang3.builder.HashCodeBuilder; public final class DeviceList implements Iterable { /** The native pointer to the devices array. */ - private long pointer; + private long deviceListPointer; /** The number of devices in the list. */ private int size; @@ -45,7 +45,7 @@ public final class DeviceList implements Iterable */ public long getPointer() { - return this.pointer; + return this.deviceListPointer; } /** @@ -76,7 +76,7 @@ public final class DeviceList implements Iterable @Override public int hashCode() { - return new HashCodeBuilder().append(this.pointer).toHashCode(); + return new HashCodeBuilder().append(this.deviceListPointer).toHashCode(); } @Override @@ -85,6 +85,6 @@ public final class DeviceList implements Iterable if (this == obj) return true; if (obj == null || getClass() != obj.getClass()) return false; final DeviceList other = (DeviceList) obj; - return this.pointer == other.pointer; + return this.deviceListPointer == other.deviceListPointer; } } diff --git a/src/main/java/de/ailis/usb4java/libusb/EndpointDescriptor.java b/src/main/java/de/ailis/usb4java/libusb/EndpointDescriptor.java index f445677..4fd5dfa 100644 --- a/src/main/java/de/ailis/usb4java/libusb/EndpointDescriptor.java +++ b/src/main/java/de/ailis/usb4java/libusb/EndpointDescriptor.java @@ -31,7 +31,7 @@ import de.ailis.usb4java.utils.DescriptorUtils; public final class EndpointDescriptor implements UsbEndpointDescriptor { /** The native pointer to the descriptor structure. */ - private long pointer; + private long endpointDescriptorPointer; /** * Package-private constructor to prevent manual instantiation. Endpoint @@ -49,7 +49,7 @@ public final class EndpointDescriptor implements UsbEndpointDescriptor */ public long getPointer() { - return this.pointer; + return this.endpointDescriptorPointer; } @Override diff --git a/src/main/resources/de/ailis/usb4java/libusb/linux-x86_64/libusb4java.so b/src/main/resources/de/ailis/usb4java/libusb/linux-x86_64/libusb4java.so index 9e9b2010e2fffbcf435f01e7c578514cca94a49f..589f3bb1cb6c229fcd3b4832dd3f8a3fa0b6608c 100644 GIT binary patch literal 130344 zcmeFa3tUuH_cwk(P`ovGp~x)Jw6H5(EKRM^oElAwRLblzK)@ss2xhz$N+QKHP4U=` z>_&F8o-TG%va-=k=<*br7Tu|=X2goj-xHbT`(11AeP+)vBSX*gyubJJ|NN(p=d5+s zUVH7e)?Rz7q@#%hc-x*1mEC}RNA#!H%T zr(NHPa_VdtDNIJ#t~eI$5%(AE8O(Tfz9WG_!`@w-Rk>JzRL=W@DChk_lvC$cfi~1x zvN7UNhK>e#KlD5l_vok2L`%Q)ZymXG?RZuc3_Ty{!DNOyt8$m39LX8&Psuq|))z@H zRb2!}b(YQHw)Mv?x_#lr8OAGbRQ|Ci@2XEf?l)rKz>kwZX_~exhf2PQV*-v896fP7 zlAbs;(YT?!PwI^0Jk#%*kleLTS0iqAO0IQxdGC~!hm*e3j0p+GXd`uStdVFK{bB~E zSd9d$HD+aPd3mq+n3$Bijxb`4p5>J(U^_IfYeHA+r0N7?Nc;_1-tk6qL#$DmI39{A zkLzcRE4L?>dsF5bRoxSeJB;|e39(yJ#*It7*+?)38wmr;jV|el=`rz%Db^K+u{^ch zmYBFVHr+Voh93QTR1{B-_a+!IL&pz}OXyYp*pRsHiSa!SOP}OT>1rQu+}icY(~au5 zxiKGfP3`*JnzW%^5|w(4ls*aNv8lb#0BfIKiJE(=(BDK|dRg3vf�KbdG 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

*UFeX_W1 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 literal 126200 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 diff --git a/src/test/java/de/ailis/usb4java/libusb/LibUSBDeviceTest.java b/src/test/java/de/ailis/usb4java/libusb/LibUSBDeviceTest.java index 5dd0697..8763142 100644 --- a/src/test/java/de/ailis/usb4java/libusb/LibUSBDeviceTest.java +++ b/src/test/java/de/ailis/usb4java/libusb/LibUSBDeviceTest.java @@ -5,10 +5,11 @@ package de.ailis.usb4java.libusb; -import static de.ailis.usb4java.UsbAssume.assumeUsbTestsEnabled; +import static de.ailis.usb4java.test.UsbAssume.assumeUsbTestsEnabled; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; import static org.junit.Assume.assumeNotNull; import java.nio.ByteBuffer; @@ -56,7 +57,8 @@ public class LibUSBDeviceTest LibUsb.init(this.context); this.device = findTestDevice(); if (this.device == null) - throw new IllegalStateException("Need at least one USB device " + + throw new IllegalStateException("Need at least one USB device " + + "with at least one endpoint to execute this test"); } catch (Throwable e) @@ -140,16 +142,6 @@ public class LibUSBDeviceTest assertTrue(LibUsb.getBusNumber(this.device) >= 0); } - /** - * Tests the {@link LibUsb#getBusNumber(Device)} method without a device. - */ - @Test(expected = IllegalArgumentException.class) - public void testGetBusNumberWithoutDevice() - { - assumeUsbTestsEnabled(); - LibUsb.getBusNumber(null); - } - /** * Tests the {@link LibUsb#getPortNumber(Device)} method. */ @@ -161,16 +153,6 @@ public class LibUSBDeviceTest assertTrue(LibUsb.getPortNumber(this.device) >= 0); } - /** - * Tests the {@link LibUsb#getPortNumber(Device)} method without a device. - */ - @Test(expected = IllegalArgumentException.class) - public void testGetPortNumberWithoutDevice() - { - assumeUsbTestsEnabled(); - LibUsb.getPortNumber(null); - } - /** * Tests the {@link LibUsb#getPortPath(Context, Device, byte[])} method. */ @@ -221,6 +203,30 @@ public class LibUSBDeviceTest LibUsb.getPortPath(this.context, this.device, null); } + /** + * Tests {@link LibUsb#getPortPath(Context, Device, byte[])} method with + * uninitialized USB context. + */ + @Test(expected = IllegalStateException.class) + public void testGetPortPathWithUninitializedContext() + { + assumeUsbTestsEnabled(); + assumeNotNull(this.device); + final Context context = new Context(); + LibUsb.getPortPath(context, this.device, new byte[16]); + } + + /** + * Tests {@link LibUsb#getPortPath(Context, Device, byte[])} method with + * uninitialized device. + */ + @Test(expected = IllegalStateException.class) + public void testGetPortPathWithUninitializedDevice() + { + assumeUsbTestsEnabled(); + LibUsb.getPortPath(this.context, new Device(), new byte[16]); + } + /** * Tests the {@link LibUsb#getParent(Device)} method. */ @@ -425,14 +431,27 @@ public class LibUSBDeviceTest * crash. */ @Test - public void testOpen() + public void testOpenAndClose() { assumeUsbTestsEnabled(); assumeNotNull(this.device); DeviceHandle handle = new DeviceHandle(); int result = LibUsb.open(this.device, handle); assertTrue(result == LibUsb.SUCCESS || result == LibUsb.ERROR_ACCESS); - if (result == LibUsb.SUCCESS) LibUsb.close(handle); + if (result == LibUsb.SUCCESS) + { + LibUsb.close(handle); + + try + { + LibUsb.close(handle); + fail("Double-close should throw IllegalStateException"); + } + catch (IllegalStateException e) + { + // Expected behavior + } + } } /** @@ -878,6 +897,16 @@ public class LibUSBDeviceTest finally { LibUsb.freeConfigDescriptor(desc); + + try + { + LibUsb.freeConfigDescriptor(desc); + fail("Double-free should throw IllegalStateException"); + } + catch (IllegalStateException e) + { + // Expected behavior + } } } @@ -1104,4 +1133,27 @@ public class LibUSBDeviceTest LibUsb.interruptTransfer(new DeviceHandle(), 0, ByteBuffer.allocate(0), null, 0); } + + /** + * Tests the {@link LibUsb#getDeviceList(Context, DeviceList)} and + * LibUsb#freeDeviceList(DeviceList, boolean)} methods. + */ + @Test + public void testGetAndFreeDeviceList() + { + assumeUsbTestsEnabled(); + DeviceList list = new DeviceList(); + assertTrue(LibUsb.getDeviceList(this.context, list) >= 0); + LibUsb.freeDeviceList(list, true); + + try + { + LibUsb.freeDeviceList(list, true); + fail("Double-free should throw IllegalStateException"); + } + catch (IllegalStateException e) + { + // Expected behavior + } + } } diff --git a/src/test/java/de/ailis/usb4java/libusb/LibUSBGlobalTest.java b/src/test/java/de/ailis/usb4java/libusb/LibUSBGlobalTest.java index 885de28..eb8b2d6 100644 --- a/src/test/java/de/ailis/usb4java/libusb/LibUSBGlobalTest.java +++ b/src/test/java/de/ailis/usb4java/libusb/LibUSBGlobalTest.java @@ -5,7 +5,7 @@ package de.ailis.usb4java.libusb; -import static de.ailis.usb4java.UsbAssume.assumeUsbTestsEnabled; +import static de.ailis.usb4java.test.UsbAssume.assumeUsbTestsEnabled; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; diff --git a/src/test/java/de/ailis/usb4java/libusb/LibUSBTest.java b/src/test/java/de/ailis/usb4java/libusb/LibUSBTest.java index 223a82b..2a12b33 100644 --- a/src/test/java/de/ailis/usb4java/libusb/LibUSBTest.java +++ b/src/test/java/de/ailis/usb4java/libusb/LibUSBTest.java @@ -5,13 +5,22 @@ package de.ailis.usb4java.libusb; -import static de.ailis.usb4java.UsbAssume.assumeUsbTestsEnabled; +import static de.ailis.usb4java.test.UsbAssume.assumeUsbTestsEnabled; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import java.io.FileDescriptor; +import java.nio.ByteBuffer; +import java.nio.IntBuffer; import org.junit.Test; +import de.ailis.usb4java.libusb.mocks.PollfdListenerMock; + /** * Tests the {@link LibUsb} class. * @@ -166,10 +175,13 @@ public class LibUSBTest assumeUsbTestsEnabled(); assertEquals(LibUsb.SUCCESS, LibUsb.init(null)); LibUsb.exit(null); + + // Double-exit without a context should work + LibUsb.exit(null); } /** - * Tests the initialization and deinitialization of libusb with a custom + * Tests the initialization and deinitialization of libusb with a custom USB * context. */ @Test @@ -179,5 +191,752 @@ public class LibUSBTest Context context = new Context(); assertEquals(LibUsb.SUCCESS, LibUsb.init(context)); LibUsb.exit(context); + + try + { + LibUsb.exit(context); + fail("Double-exit should throw IllegalStateException"); + } + catch (IllegalStateException e) + { + // Expected behavior + } + } + + /** + * Tests {@link LibUsb#exit(Context)} method with uninitialized Context + */ + @Test(expected = IllegalStateException.class) + public void testExitWithUninitializedContext() + { + assumeUsbTestsEnabled(); + final Context context = new Context(); + LibUsb.exit(context); + } + + /** + * Tests {@link LibUsb#setDebug(Context, int)} method with uninitialized USB + * context + */ + @Test(expected = IllegalStateException.class) + public void testSetDebugWithUninitializedContext() + { + assumeUsbTestsEnabled(); + final Context context = new Context(); + LibUsb.setDebug(context, 0); + } + + /** + * Tests {@link LibUsb#getDeviceList(Context, DeviceList)} method with + * uninitialized USB context. + */ + @Test(expected = IllegalStateException.class) + public void testGetDeviceListWithUninitializedContext() + { + assumeUsbTestsEnabled(); + final Context context = new Context(); + LibUsb.getDeviceList(context, new DeviceList()); + } + + /** + * Tests {@link LibUsb#freeDeviceList(DeviceList, boolean)} method with + * uninitialized list. + */ + @Test(expected = IllegalStateException.class) + public void testFreeDeviceListWithUninitializedList() + { + assumeUsbTestsEnabled(); + LibUsb.freeDeviceList(new DeviceList(), true); + } + + /** + * Tests {@link LibUsb#freeDeviceList(DeviceList, boolean)} method without + * list. + */ + @Test(expected = IllegalArgumentException.class) + public void testFreeDeviceListWithoutList() + { + assumeUsbTestsEnabled(); + LibUsb.freeDeviceList(null, true); + } + + /** + * Tests the {@link LibUsb#getBusNumber(Device)} method without a device. + */ + @Test(expected = IllegalArgumentException.class) + public void testGetBusNumberWithoutDevice() + { + assumeUsbTestsEnabled(); + LibUsb.getBusNumber(null); + } + + /** + * Tests the {@link LibUsb#getBusNumber(Device)} method with uninitialized + * device. + */ + @Test(expected = IllegalStateException.class) + public void testGetBusNumberWithUninitializedDevice() + { + assumeUsbTestsEnabled(); + LibUsb.getBusNumber(new Device()); + } + + /** + * Tests the {@link LibUsb#getPortNumber(Device)} method without a device. + */ + @Test(expected = IllegalArgumentException.class) + public void testGetPortNumberWithoutDevice() + { + assumeUsbTestsEnabled(); + LibUsb.getPortNumber(null); + } + + /** + * Tests the {@link LibUsb#getPortNumber(Device)} method with uninitialized + * device. + */ + @Test(expected = IllegalStateException.class) + public void testGetPortNumberWithUninitializedDevice() + { + assumeUsbTestsEnabled(); + LibUsb.getPortNumber(new Device()); + } + + /** + * Tests the {@link LibUsb#getParent(Device)} method with uninitialized + * device. + */ + @Test(expected = IllegalStateException.class) + public void testGetParentWithUninitializedDevice() + { + assumeUsbTestsEnabled(); + LibUsb.getParent(new Device()); + } + + /** + * Tests the {@link LibUsb#getDeviceAddress(Device)} method with + * uninitialized device. + */ + @Test(expected = IllegalStateException.class) + public void testGetDeviceAddressWithUninitializedDevice() + { + assumeUsbTestsEnabled(); + LibUsb.getDeviceAddress(new Device()); + } + + /** + * Tests the {@link LibUsb#getDeviceSpeed(Device)} method with uninitialized + * device. + */ + @Test(expected = IllegalStateException.class) + public void testGetDeviceDeviceSpeedWithUninitializedDevice() + { + assumeUsbTestsEnabled(); + LibUsb.getDeviceSpeed(new Device()); + } + + /** + * Tests the {@link LibUsb#getMaxPacketSize(Device, int)} method with + * uninitialized device. + */ + @Test(expected = IllegalStateException.class) + public void testMaxPacketSizeWithUninitializedDevice() + { + assumeUsbTestsEnabled(); + LibUsb.getMaxPacketSize(new Device(), 0); + } + + /** + * Tests the {@link LibUsb#getMaxIsoPacketSize(Device, int)} method with + * uninitialized device. + */ + @Test(expected = IllegalStateException.class) + public void testMaxIsoPacketSizeWithUninitializedDevice() + { + assumeUsbTestsEnabled(); + LibUsb.getMaxIsoPacketSize(new Device(), 0); + } + + /** + * Tests the {@link LibUsb#refDevice(Device)} method with uninitialized + * device. + */ + @Test(expected = IllegalStateException.class) + public void testRefDeviceWithUninitializedDevice() + { + assumeUsbTestsEnabled(); + LibUsb.refDevice(new Device()); + } + + /** + * Tests the {@link LibUsb#unrefDevice(Device)} method with uninitialized + * device. + */ + @Test(expected = IllegalStateException.class) + public void testUnrefDeviceWithUninitializedDevice() + { + assumeUsbTestsEnabled(); + LibUsb.unrefDevice(new Device()); + } + + /** + * Tests the {@link LibUsb#open(Device, DeviceHandle)} method with + * uninitialized device. + */ + @Test(expected = IllegalStateException.class) + public void testOpenWithUninitializedDevice() + { + assumeUsbTestsEnabled(); + LibUsb.open(new Device(), new DeviceHandle()); + } + + /** + * Tests the {@link LibUsb#close(DeviceHandle)} method with uninitialized + * device handle. + */ + @Test(expected = IllegalStateException.class) + public void testCloseWithUninitializedHandle() + { + assumeUsbTestsEnabled(); + LibUsb.close(new DeviceHandle()); + } + + /** + * Tests the {@link LibUsb#getDevice(DeviceHandle)} method with + * uninitialized device handle. + */ + @Test(expected = IllegalStateException.class) + public void testGetDeviceWithUninitializedHandle() + { + assumeUsbTestsEnabled(); + LibUsb.getDevice(new DeviceHandle()); + } + + /** + * Tests the {@link LibUsb#getConfiguration(DeviceHandle, IntBuffer)} method + * with uninitialized device handle. + */ + @Test(expected = IllegalStateException.class) + public void testGetConfigurationWithUninitializedHandle() + { + assumeUsbTestsEnabled(); + LibUsb.getConfiguration(new DeviceHandle(), IntBuffer.allocate(1)); + } + + /** + * Tests the {@link LibUsb#setConfiguration(DeviceHandle, int)} method with + * uninitialized device handle. + */ + @Test(expected = IllegalStateException.class) + public void testSetConfigurationWithUninitializedHandle() + { + assumeUsbTestsEnabled(); + LibUsb.setConfiguration(new DeviceHandle(), 0); + } + + /** + * Tests the {@link LibUsb#claimInterface(DeviceHandle, int)} method with + * uninitialized device handle. + */ + @Test(expected = IllegalStateException.class) + public void testClaimInterfaceWithUninitializedHandle() + { + assumeUsbTestsEnabled(); + LibUsb.claimInterface(new DeviceHandle(), 0); + } + + /** + * Tests the {@link LibUsb#releaseInterface(DeviceHandle, int)} method with + * uninitialized device handle. + */ + @Test(expected = IllegalStateException.class) + public void testReleaseInterfaceWithUninitializedHandle() + { + assumeUsbTestsEnabled(); + LibUsb.releaseInterface(new DeviceHandle(), 0); + } + + /** + * Tests the {@link LibUsb#setInterfaceAltSetting(DeviceHandle, int, int)} + * method with uninitialized device handle. + */ + @Test(expected = IllegalStateException.class) + public void testSetInterfaceAltSettingWithUninitializedHandle() + { + assumeUsbTestsEnabled(); + LibUsb.setInterfaceAltSetting(new DeviceHandle(), 0, 0); + } + + /** + * Tests the {@link LibUsb#clearHalt(DeviceHandle, int)} method with + * uninitialized device handle. + */ + @Test(expected = IllegalStateException.class) + public void testClearHaltWithUninitializedHandle() + { + assumeUsbTestsEnabled(); + LibUsb.clearHalt(new DeviceHandle(), 0); + } + + /** + * Tests the {@link LibUsb#resetDevice(DeviceHandle)} method with + * uninitialized device handle. + */ + @Test(expected = IllegalStateException.class) + public void testResetDeviceWithUninitializedHandle() + { + assumeUsbTestsEnabled(); + LibUsb.resetDevice(new DeviceHandle()); + } + + /** + * Tests the {@link LibUsb#kernelDriverActive(DeviceHandle, int)} method + * with uninitialized device handle. + */ + @Test(expected = IllegalStateException.class) + public void testKernelDriverActiveWithUninitializedHandle() + { + assumeUsbTestsEnabled(); + LibUsb.kernelDriverActive(new DeviceHandle(), 0); + } + + /** + * Tests the {@link LibUsb#detachKernelDriver(DeviceHandle, int)} method + * with uninitialized device handle. + */ + @Test(expected = IllegalStateException.class) + public void testDetachKernelDriverWithUninitializedHandle() + { + assumeUsbTestsEnabled(); + LibUsb.detachKernelDriver(new DeviceHandle(), 0); + } + + /** + * Tests the {@link LibUsb#attachKernelDriver(DeviceHandle, int)} method + * with uninitialized device handle. + */ + @Test(expected = IllegalStateException.class) + public void testAttachKernelDriverWithUninitializedHandle() + { + assumeUsbTestsEnabled(); + LibUsb.attachKernelDriver(new DeviceHandle(), 0); + } + + /** + * Tests the {@link LibUsb#getDeviceDescriptor(Device, DeviceDescriptor)} + * method with uninitialized device. + */ + @Test(expected = IllegalStateException.class) + public void testGetDeviceDescriptorWithUninitializedDevice() + { + assumeUsbTestsEnabled(); + LibUsb.getDeviceDescriptor(new Device(), new DeviceDescriptor()); + } + + /** + * Tests the + * {@link LibUsb#getStringDescriptorAscii(DeviceHandle, int, StringBuffer, int)} + * method with uninitialized device handle. + */ + @Test(expected = IllegalStateException.class) + public void testGetStringDescriptorAsciiWithUninitializedHandle() + { + assumeUsbTestsEnabled(); + LibUsb.getStringDescriptorAscii(new DeviceHandle(), 0, + new StringBuffer(), 0); + } + + /** + * Tests the + * {@link LibUsb#getActiveConfigDescriptor(Device, ConfigDescriptor)} method + * with uninitialized device. + */ + @Test(expected = IllegalStateException.class) + public void testGetActiveConfigDescriptorWithUninitializedDevice() + { + assumeUsbTestsEnabled(); + LibUsb.getActiveConfigDescriptor(new Device(), new ConfigDescriptor()); + } + + /** + * Tests the + * {@link LibUsb#getConfigDescriptor(Device, int, ConfigDescriptor)} method + * with uninitialized device. + */ + @Test(expected = IllegalStateException.class) + public void testGetConfigDescriptorWithUninitializedDevice() + { + assumeUsbTestsEnabled(); + LibUsb.getConfigDescriptor(new Device(), 0, new ConfigDescriptor()); + } + + /** + * Tests the + * {@link LibUsb#getConfigDescriptorByValue(Device, int, ConfigDescriptor)} + * method with uninitialized device. + */ + @Test(expected = IllegalStateException.class) + public void testGetConfigDescriptorByValueWithUninitializedDevice() + { + assumeUsbTestsEnabled(); + LibUsb.getConfigDescriptorByValue(new Device(), 0, + new ConfigDescriptor()); + } + + /** + * Tests the {@link LibUsb#freeConfigDescriptor(ConfigDescriptor)} method + * with uninitialized descriptor. + */ + @Test(expected = IllegalStateException.class) + public void testFreeConfigDescriptorWithUninitializedDescriptor() + { + assumeUsbTestsEnabled(); + LibUsb.freeConfigDescriptor(new ConfigDescriptor()); + } + + /** + * Tests the + * {@link LibUsb#getDescriptor(DeviceHandle, int, int, ByteBuffer)} method + * with uninitialized device handle. + */ + @Test(expected = IllegalStateException.class) + public void testGetDescriptorWithUninitializedHandle() + { + assumeUsbTestsEnabled(); + LibUsb.getDescriptor(new DeviceHandle(), 0, 0, + ByteBuffer.allocateDirect(1)); + } + + /** + * Tests the + * {@link LibUsb#getStringDescriptor(DeviceHandle, int, int, ByteBuffer)} + * method with uninitialized device handle. + */ + @Test(expected = IllegalStateException.class) + public void testGetStringDescriptorWithUninitializedHandle() + { + assumeUsbTestsEnabled(); + LibUsb.getStringDescriptor(new DeviceHandle(), 0, 0, + ByteBuffer.allocateDirect(1)); + } + + /** + * Tests the + * {@link LibUsb#controlTransfer(DeviceHandle, int, int, int, int, ByteBuffer, int)} + * method with uninitialized device handle. + */ + @Test(expected = IllegalStateException.class) + public void testControlTransferWithUninitializedHandle() + { + assumeUsbTestsEnabled(); + LibUsb.controlTransfer(new DeviceHandle(), 0, 0, 0, 0, + ByteBuffer.allocateDirect(1), 0); + } + + /** + * Tests the + * {@link LibUsb#bulkTransfer(DeviceHandle, int, ByteBuffer, IntBuffer, int)} + * method with uninitialized device handle. + */ + @Test(expected = IllegalStateException.class) + public void testBulkTransferWithUninitializedHandle() + { + assumeUsbTestsEnabled(); + LibUsb.bulkTransfer(new DeviceHandle(), 0, + ByteBuffer.allocateDirect(1), IntBuffer.allocate(1), 0); + } + + /** + * Tests the + * {@link LibUsb#interruptTransfer(DeviceHandle, int, ByteBuffer, IntBuffer, int)} + * method with uninitialized device handle. + */ + @Test(expected = IllegalStateException.class) + public void testInterruptTransferWithUninitializedHandle() + { + assumeUsbTestsEnabled(); + LibUsb.interruptTransfer(new DeviceHandle(), 0, + ByteBuffer.allocateDirect(1), IntBuffer.allocate(1), 0); + } + + /** + * Tests the {@link LibUsb#freeTransfer(Transfer)} method with uninitialized + * device handle. + */ + @Test(expected = IllegalStateException.class) + public void testFreeTransferWithUninitializedTransfer() + { + assumeUsbTestsEnabled(); + LibUsb.freeTransfer(new Transfer()); + } + + /** + * Tests {@link LibUsb#openDeviceWithVidPid(Context, int, int)} with + * uninitialized USB context. + */ + @Test(expected = IllegalStateException.class) + public void testOpenDeviceWithVidPid() + { + assumeUsbTestsEnabled(); + final Context context = new Context(); + LibUsb.openDeviceWithVidPid(context, 0, 0); + } + + /** + * Tests {@link LibUsb#tryLockEvents(Context)} with uninitialized USB + * context. + */ + @Test(expected = IllegalStateException.class) + public void testTryLockEventsWithUninitializedContext() + { + assumeUsbTestsEnabled(); + final Context context = new Context(); + LibUsb.tryLockEvents(context); + } + + /** + * Tests {@link LibUsb#lockEvents(Context)} with uninitialized USB context. + */ + @Test(expected = IllegalStateException.class) + public void testLockEventsWithUninitializedContext() + { + assumeUsbTestsEnabled(); + final Context context = new Context(); + LibUsb.lockEvents(context); + } + + /** + * Tests {@link LibUsb#unlockEvents(Context)} with uninitialized USB + * context. + */ + @Test(expected = IllegalStateException.class) + public void testUnlockEventsWithUninitializedContext() + { + assumeUsbTestsEnabled(); + final Context context = new Context(); + LibUsb.unlockEvents(context); + } + + /** + * Tests {@link LibUsb#eventHandlingOk(Context)} with uninitialized USB + * context. + */ + @Test(expected = IllegalStateException.class) + public void testEventHandlingOkWithUninitializedContext() + { + assumeUsbTestsEnabled(); + final Context context = new Context(); + LibUsb.eventHandlingOk(context); + } + + /** + * Tests {@link LibUsb#eventHandlerActive(Context)} with uninitialized USB + * context. + */ + @Test(expected = IllegalStateException.class) + public void testEventHandlerActiveWithUninitializedContext() + { + assumeUsbTestsEnabled(); + final Context context = new Context(); + LibUsb.eventHandlerActive(context); + } + + /** + * Tests {@link LibUsb#lockEventWaiters(Context)} with uninitialized USB + * context. + */ + @Test(expected = IllegalStateException.class) + public void testLockEventWaitersWithUninitializedContext() + { + assumeUsbTestsEnabled(); + final Context context = new Context(); + LibUsb.lockEventWaiters(context); + } + + /** + * Tests {@link LibUsb#unlockEventWaiters(Context)} with uninitialized USB + * context. + */ + @Test(expected = IllegalStateException.class) + public void testUnlockEventWaitersWithUninitializedContext() + { + assumeUsbTestsEnabled(); + final Context context = new Context(); + LibUsb.unlockEventWaiters(context); + } + + /** + * Tests {@link LibUsb#waitForEvent(Context, long)} with uninitialized USB + * context. + */ + @Test(expected = IllegalStateException.class) + public void testWaitForEventWithUninitializedContext() + { + assumeUsbTestsEnabled(); + final Context context = new Context(); + LibUsb.waitForEvent(context, 53); + } + + /** + * Tests + * {@link LibUsb#handleEventsTimeoutCompleted(Context, long, IntBuffer)} + * with uninitialized USB context. + */ + @Test(expected = IllegalStateException.class) + public void testHandleEventsTimeoutCompletedWithUninitializedContext() + { + assumeUsbTestsEnabled(); + final Context context = new Context(); + LibUsb.handleEventsTimeoutCompleted(context, 53, IntBuffer.allocate(1)); + } + + /** + * Tests {@link LibUsb#handleEventsTimeout(Context, long)} with + * uninitialized USB context. + */ + @Test(expected = IllegalStateException.class) + public void testHandleEventsTimeoutWithUninitializedContext() + { + assumeUsbTestsEnabled(); + final Context context = new Context(); + LibUsb.handleEventsTimeout(context, 53); + } + + /** + * Tests {@link LibUsb#handleEvents(Context)} with uninitialized USB + * context. + */ + @Test(expected = IllegalStateException.class) + public void testHandleEventsWithUninitializedContext() + { + assumeUsbTestsEnabled(); + final Context context = new Context(); + LibUsb.handleEvents(context); + } + + /** + * Tests {@link LibUsb#handleEventsCompleted(Context, IntBuffer)} with + * uninitialized USB context. + */ + @Test(expected = IllegalStateException.class) + public void testHandleEventsCompletedWithUninitializedContext() + { + assumeUsbTestsEnabled(); + final Context context = new Context(); + LibUsb.handleEventsCompleted(context, IntBuffer.allocate(1)); + } + + /** + * Tests {@link LibUsb#handleEventsLocked(Context, long)} with uninitialized + * USB context. + */ + @Test(expected = IllegalStateException.class) + public void testHandleEventsLockedWithUninitializedContext() + { + assumeUsbTestsEnabled(); + final Context context = new Context(); + LibUsb.handleEventsLocked(context, 53); + } + + /** + * Tests {@link LibUsb#pollfdsHandleTimeouts(Context)} with uninitialized + * USB context. + */ + @Test(expected = IllegalStateException.class) + public void testPollfdsHandleTimeoutsWithUninitializedContext() + { + assumeUsbTestsEnabled(); + final Context context = new Context(); + LibUsb.pollfdsHandleTimeouts(context); + } + + /** + * Tests {@link LibUsb#getNextTimeout(Context, IntBuffer)} with + * uninitialized USB context. + */ + @Test(expected = IllegalStateException.class) + public void testGetNextTimeoutWithUninitializedContext() + { + assumeUsbTestsEnabled(); + final Context context = new Context(); + LibUsb.getNextTimeout(context, IntBuffer.allocate(1)); + } + + /** + * Tests {@link LibUsb#setPollfdNotifiers(Context)} with uninitialized USB + * context. + */ + @Test(expected = IllegalStateException.class) + public void testSetPollfdNotifiersWithUninitializedContext() + { + assumeUsbTestsEnabled(); + final Context context = new Context(); + LibUsb.setPollfdNotifiers(context); + } + + /** + * Tests {@link LibUsb#unsetPollfdNotifiers(Context)} with uninitialized USB + * context. + */ + @Test(expected = IllegalStateException.class) + public void testUnsetPollfdNotifiersWithUninitializedContext() + { + assumeUsbTestsEnabled(); + final Context context = new Context(); + LibUsb.unsetPollfdNotifiers(context); + } + + /** + * Tests the + * {@link LibUsb#setPollfdNotifiers(Context, PollfdListener, Object)} + * method. + */ + @Test + public void testPollFdNotifiers() + { + assumeUsbTestsEnabled(); + PollfdListenerMock listener = new PollfdListenerMock(); + Context context = new Context(); + LibUsb.init(context); + LibUsb.setPollfdNotifiers(context, listener, "test"); + + FileDescriptor fd = new FileDescriptor(); + LibUsb.triggerPollfdAdded(fd, 53); + assertEquals(53, listener.addedEvents); + assertSame(fd, listener.addedFd); + assertSame("test", listener.addedUserData); + assertNull(listener.removedFd); + assertNull(listener.removedUserData); + + listener.reset(); + + fd = new FileDescriptor(); + LibUsb.triggerPollfdRemoved(fd); + assertEquals(0, listener.addedEvents); + assertNull(listener.addedFd); + assertNull(listener.addedUserData); + assertSame(fd, listener.removedFd); + assertSame("test", listener.removedUserData); + + LibUsb.setPollfdNotifiers(context, null, null); + listener.reset(); + + fd = new FileDescriptor(); + LibUsb.triggerPollfdAdded(fd, 53); + assertEquals(0, listener.addedEvents); + assertNull(listener.addedFd); + assertNull(listener.addedUserData); + assertNull(listener.removedFd); + assertNull(listener.removedUserData); + + listener.reset(); + + fd = new FileDescriptor(); + LibUsb.triggerPollfdRemoved(fd); + assertEquals(0, listener.addedEvents); + assertNull(listener.addedFd); + assertNull(listener.addedUserData); + assertNull(listener.removedFd); + assertNull(listener.removedUserData); } } diff --git a/src/test/java/de/ailis/usb4java/libusb/TransferTest.java b/src/test/java/de/ailis/usb4java/libusb/TransferTest.java index 9dd4474..5bf6bde 100644 --- a/src/test/java/de/ailis/usb4java/libusb/TransferTest.java +++ b/src/test/java/de/ailis/usb4java/libusb/TransferTest.java @@ -5,12 +5,13 @@ package de.ailis.usb4java.libusb; -import static de.ailis.usb4java.UsbAssume.assumeUsbTestsEnabled; +import static de.ailis.usb4java.test.UsbAssume.assumeUsbTestsEnabled; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNotSame; import static org.junit.Assert.assertNull; +import static org.junit.Assert.fail; import java.lang.reflect.Field; @@ -64,6 +65,16 @@ public class TransferTest Transfer transfer = LibUsb.allocTransfer(0); assertNotNull(transfer); LibUsb.freeTransfer(transfer); + + try + { + LibUsb.freeTransfer(transfer); + fail("Double-free should throw IllegalStateException"); + } + catch (IllegalStateException e) + { + // Expected behavior + } } /** @@ -78,7 +89,8 @@ public class TransferTest { try { - Field field = DeviceHandle.class.getDeclaredField("handlePointer"); + Field field = + DeviceHandle.class.getDeclaredField("deviceHandlePointer"); field.setAccessible(true); field.set(handle, pointer); } diff --git a/src/test/java/de/ailis/usb4java/libusb/mocks/PollfdListenerMock.java b/src/test/java/de/ailis/usb4java/libusb/mocks/PollfdListenerMock.java new file mode 100644 index 0000000..f4cd97c --- /dev/null +++ b/src/test/java/de/ailis/usb4java/libusb/mocks/PollfdListenerMock.java @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2013 Klaus Reimer + * See LICENSE.md for licensing information. + */ +package de.ailis.usb4java.libusb.mocks; + +import java.io.FileDescriptor; + +import de.ailis.usb4java.libusb.PollfdListener; + +/** + * A mocked pollfd listener implementation. + * + * @author Klaus Reimer (k@ailis.de) + */ +public class PollfdListenerMock implements PollfdListener +{ + /** The file descriptor reported by the added event. */ + public FileDescriptor addedFd; + + /** The file descriptor reported by the removed event. */ + public FileDescriptor removedFd; + + /** The events number reported by the added event. */ + public int addedEvents; + + /** The user data reported by the added event. */ + public Object addedUserData; + + /** The user data reported by the removed event. */ + public Object removedUserData; + + @Override + public void pollfdAdded(FileDescriptor fd, int events, Object userData) + { + this.addedEvents = events; + this.addedFd = fd; + this.addedUserData = userData; + } + + @Override + public void pollfdRemoved(FileDescriptor fd, Object userData) + { + this.removedFd = fd; + this.removedUserData = userData; + } + + /** + * Resets the mock object state. + */ + public void reset() + { + this.addedEvents = 0; + this.addedFd = null; + this.addedUserData = null; + this.removedFd = null; + this.removedUserData = null; + } +} diff --git a/src/test/java/de/ailis/usb4java/TCKRunner.java b/src/test/java/de/ailis/usb4java/test/TCKRunner.java similarity index 97% rename from src/test/java/de/ailis/usb4java/TCKRunner.java rename to src/test/java/de/ailis/usb4java/test/TCKRunner.java index 7c487b0..0f37223 100644 --- a/src/test/java/de/ailis/usb4java/TCKRunner.java +++ b/src/test/java/de/ailis/usb4java/test/TCKRunner.java @@ -3,7 +3,7 @@ * See LICENSE.md for licensing information. */ -package de.ailis.usb4java; +package de.ailis.usb4java.test; import org.junit.internal.runners.JUnit38ClassRunner; import org.junit.runner.Description; diff --git a/src/test/java/de/ailis/usb4java/UsbAssume.java b/src/test/java/de/ailis/usb4java/test/UsbAssume.java similarity index 98% rename from src/test/java/de/ailis/usb4java/UsbAssume.java rename to src/test/java/de/ailis/usb4java/test/UsbAssume.java index f54fc59..e53fd32 100644 --- a/src/test/java/de/ailis/usb4java/UsbAssume.java +++ b/src/test/java/de/ailis/usb4java/test/UsbAssume.java @@ -3,7 +3,7 @@ * See LICENSE.md for licensing information. */ -package de.ailis.usb4java; +package de.ailis.usb4java.test; import static org.junit.Assume.assumeTrue; diff --git a/src/test/java/javax/usb/tck/BulkIOErrorConditionsTest.java b/src/test/java/javax/usb/tck/BulkIOErrorConditionsTest.java index 51d9ecd..04d973c 100755 --- a/src/test/java/javax/usb/tck/BulkIOErrorConditionsTest.java +++ b/src/test/java/javax/usb/tck/BulkIOErrorConditionsTest.java @@ -25,7 +25,7 @@ import javax.usb.*; import org.junit.runner.RunWith; -import de.ailis.usb4java.TCKRunner; +import de.ailis.usb4java.test.TCKRunner; //import javax.usb.util.*; import junit.framework.TestCase; diff --git a/src/test/java/javax/usb/tck/BulkIOTests.java b/src/test/java/javax/usb/tck/BulkIOTests.java index e805bdb..452b74c 100755 --- a/src/test/java/javax/usb/tck/BulkIOTests.java +++ b/src/test/java/javax/usb/tck/BulkIOTests.java @@ -15,7 +15,7 @@ import javax.usb.*; import org.junit.runner.RunWith; -import de.ailis.usb4java.TCKRunner; +import de.ailis.usb4java.test.TCKRunner; import junit.framework.*; diff --git a/src/test/java/javax/usb/tck/BulkIOTestwithSynchronizedUsbPipe.java b/src/test/java/javax/usb/tck/BulkIOTestwithSynchronizedUsbPipe.java index bc0f4b9..0fb4d88 100755 --- a/src/test/java/javax/usb/tck/BulkIOTestwithSynchronizedUsbPipe.java +++ b/src/test/java/javax/usb/tck/BulkIOTestwithSynchronizedUsbPipe.java @@ -16,7 +16,7 @@ import javax.usb.util.*; import org.junit.runner.RunWith; -import de.ailis.usb4java.TCKRunner; +import de.ailis.usb4java.test.TCKRunner; import junit.framework.*; diff --git a/src/test/java/javax/usb/tck/BulkShortPacketIOTests.java b/src/test/java/javax/usb/tck/BulkShortPacketIOTests.java index 2a7cb55..dcfad81 100755 --- a/src/test/java/javax/usb/tck/BulkShortPacketIOTests.java +++ b/src/test/java/javax/usb/tck/BulkShortPacketIOTests.java @@ -15,7 +15,7 @@ import javax.usb.*; import org.junit.runner.RunWith; -import de.ailis.usb4java.TCKRunner; +import de.ailis.usb4java.test.TCKRunner; diff --git a/src/test/java/javax/usb/tck/ConstantsTest.java b/src/test/java/javax/usb/tck/ConstantsTest.java index 174f54f..1ea2566 100755 --- a/src/test/java/javax/usb/tck/ConstantsTest.java +++ b/src/test/java/javax/usb/tck/ConstantsTest.java @@ -15,7 +15,7 @@ import javax.usb.*; import org.junit.runner.RunWith; -import de.ailis.usb4java.TCKRunner; +import de.ailis.usb4java.test.TCKRunner; import junit.framework.Assert; import junit.framework.TestCase; diff --git a/src/test/java/javax/usb/tck/ControlIOTest.java b/src/test/java/javax/usb/tck/ControlIOTest.java index 4104d2c..8dd2b8a 100755 --- a/src/test/java/javax/usb/tck/ControlIOTest.java +++ b/src/test/java/javax/usb/tck/ControlIOTest.java @@ -31,7 +31,7 @@ import javax.usb.event.*; import org.junit.runner.RunWith; -import de.ailis.usb4java.TCKRunner; +import de.ailis.usb4java.test.TCKRunner; /** * Control I/O Test - Synchronous and asynchronous Control Irp and Control diff --git a/src/test/java/javax/usb/tck/DefaultControlPipeTestErrorConditions.java b/src/test/java/javax/usb/tck/DefaultControlPipeTestErrorConditions.java index c17eca5..398d63a 100755 --- a/src/test/java/javax/usb/tck/DefaultControlPipeTestErrorConditions.java +++ b/src/test/java/javax/usb/tck/DefaultControlPipeTestErrorConditions.java @@ -16,7 +16,7 @@ import javax.usb.event.*; import org.junit.runner.RunWith; -import de.ailis.usb4java.TCKRunner; +import de.ailis.usb4java.test.TCKRunner; import junit.framework.TestCase; diff --git a/src/test/java/javax/usb/tck/DefaultControlPipeTestErrorConditionswithSynchronizedUsbDevice.java b/src/test/java/javax/usb/tck/DefaultControlPipeTestErrorConditionswithSynchronizedUsbDevice.java index 30e5ebc..92c7746 100755 --- a/src/test/java/javax/usb/tck/DefaultControlPipeTestErrorConditionswithSynchronizedUsbDevice.java +++ b/src/test/java/javax/usb/tck/DefaultControlPipeTestErrorConditionswithSynchronizedUsbDevice.java @@ -15,7 +15,7 @@ import javax.usb.util.*; import org.junit.runner.RunWith; -import de.ailis.usb4java.TCKRunner; +import de.ailis.usb4java.test.TCKRunner; import junit.framework.TestCase; diff --git a/src/test/java/javax/usb/tck/DefaultControlPipeTestIRP.java b/src/test/java/javax/usb/tck/DefaultControlPipeTestIRP.java index e7c79d2..cd91212 100755 --- a/src/test/java/javax/usb/tck/DefaultControlPipeTestIRP.java +++ b/src/test/java/javax/usb/tck/DefaultControlPipeTestIRP.java @@ -25,7 +25,7 @@ import javax.usb.event.*; import org.junit.runner.RunWith; -import de.ailis.usb4java.TCKRunner; +import de.ailis.usb4java.test.TCKRunner; import junit.framework.TestCase; diff --git a/src/test/java/javax/usb/tck/DefaultControlPipeTestIRPList.java b/src/test/java/javax/usb/tck/DefaultControlPipeTestIRPList.java index 44300a6..ab25995 100755 --- a/src/test/java/javax/usb/tck/DefaultControlPipeTestIRPList.java +++ b/src/test/java/javax/usb/tck/DefaultControlPipeTestIRPList.java @@ -25,7 +25,7 @@ import javax.usb.event.*; import org.junit.runner.RunWith; -import de.ailis.usb4java.TCKRunner; +import de.ailis.usb4java.test.TCKRunner; import junit.framework.TestCase; diff --git a/src/test/java/javax/usb/tck/DefaultControlPipeTestIRPListwithSynchronizedUsbDevice.java b/src/test/java/javax/usb/tck/DefaultControlPipeTestIRPListwithSynchronizedUsbDevice.java index f4140c0..5e4f0f1 100755 --- a/src/test/java/javax/usb/tck/DefaultControlPipeTestIRPListwithSynchronizedUsbDevice.java +++ b/src/test/java/javax/usb/tck/DefaultControlPipeTestIRPListwithSynchronizedUsbDevice.java @@ -14,7 +14,7 @@ import javax.usb.util.*; import org.junit.runner.RunWith; -import de.ailis.usb4java.TCKRunner; +import de.ailis.usb4java.test.TCKRunner; import junit.framework.TestCase; diff --git a/src/test/java/javax/usb/tck/DefaultControlPipeTestIRPwithSynchronizedUsbDevice.java b/src/test/java/javax/usb/tck/DefaultControlPipeTestIRPwithSynchronizedUsbDevice.java index 3530cfb..3f9e973 100755 --- a/src/test/java/javax/usb/tck/DefaultControlPipeTestIRPwithSynchronizedUsbDevice.java +++ b/src/test/java/javax/usb/tck/DefaultControlPipeTestIRPwithSynchronizedUsbDevice.java @@ -14,7 +14,7 @@ import javax.usb.util.*; import org.junit.runner.RunWith; -import de.ailis.usb4java.TCKRunner; +import de.ailis.usb4java.test.TCKRunner; import junit.framework.TestCase; diff --git a/src/test/java/javax/usb/tck/FindControlIODevice.java b/src/test/java/javax/usb/tck/FindControlIODevice.java index ad8b864..7c4f248 100755 --- a/src/test/java/javax/usb/tck/FindControlIODevice.java +++ b/src/test/java/javax/usb/tck/FindControlIODevice.java @@ -27,7 +27,7 @@ import javax.usb.util.*; import org.junit.runner.RunWith; -import de.ailis.usb4java.TCKRunner; +import de.ailis.usb4java.test.TCKRunner; /** * FindControlIODevice diff --git a/src/test/java/javax/usb/tck/HotPlugTest.java b/src/test/java/javax/usb/tck/HotPlugTest.java index a23bb86..1e63726 100755 --- a/src/test/java/javax/usb/tck/HotPlugTest.java +++ b/src/test/java/javax/usb/tck/HotPlugTest.java @@ -29,7 +29,7 @@ import javax.usb.util.StandardRequest; import org.junit.runner.RunWith; -import de.ailis.usb4java.TCKRunner; +import de.ailis.usb4java.test.TCKRunner; import junit.framework.TestCase; diff --git a/src/test/java/javax/usb/tck/InterruptIOErrorConditionsTest.java b/src/test/java/javax/usb/tck/InterruptIOErrorConditionsTest.java index f79bded..b077620 100755 --- a/src/test/java/javax/usb/tck/InterruptIOErrorConditionsTest.java +++ b/src/test/java/javax/usb/tck/InterruptIOErrorConditionsTest.java @@ -23,7 +23,7 @@ import javax.usb.*; import org.junit.runner.RunWith; -import de.ailis.usb4java.TCKRunner; +import de.ailis.usb4java.test.TCKRunner; //import javax.usb.util.*; import junit.framework.TestCase; diff --git a/src/test/java/javax/usb/tck/InterruptIOTests.java b/src/test/java/javax/usb/tck/InterruptIOTests.java index 5520f71..095f493 100755 --- a/src/test/java/javax/usb/tck/InterruptIOTests.java +++ b/src/test/java/javax/usb/tck/InterruptIOTests.java @@ -15,7 +15,7 @@ import javax.usb.*; import org.junit.runner.RunWith; -import de.ailis.usb4java.TCKRunner; +import de.ailis.usb4java.test.TCKRunner; diff --git a/src/test/java/javax/usb/tck/InterruptIOTestwithSynchronizedUsbPipe.java b/src/test/java/javax/usb/tck/InterruptIOTestwithSynchronizedUsbPipe.java index 7bb959f..79f9012 100755 --- a/src/test/java/javax/usb/tck/InterruptIOTestwithSynchronizedUsbPipe.java +++ b/src/test/java/javax/usb/tck/InterruptIOTestwithSynchronizedUsbPipe.java @@ -16,7 +16,7 @@ import javax.usb.util.*; import org.junit.runner.RunWith; -import de.ailis.usb4java.TCKRunner; +import de.ailis.usb4java.test.TCKRunner; import junit.framework.*; diff --git a/src/test/java/javax/usb/tck/InterruptShortPacketIOTests.java b/src/test/java/javax/usb/tck/InterruptShortPacketIOTests.java index 405f872..60ff2d2 100755 --- a/src/test/java/javax/usb/tck/InterruptShortPacketIOTests.java +++ b/src/test/java/javax/usb/tck/InterruptShortPacketIOTests.java @@ -15,7 +15,7 @@ import javax.usb.*; import org.junit.runner.RunWith; -import de.ailis.usb4java.TCKRunner; +import de.ailis.usb4java.test.TCKRunner; diff --git a/src/test/java/javax/usb/tck/IrpTest.java b/src/test/java/javax/usb/tck/IrpTest.java index b090ca4..fca936e 100755 --- a/src/test/java/javax/usb/tck/IrpTest.java +++ b/src/test/java/javax/usb/tck/IrpTest.java @@ -7,7 +7,7 @@ import javax.usb.util.*; import org.junit.runner.RunWith; -import de.ailis.usb4java.TCKRunner; +import de.ailis.usb4java.test.TCKRunner; import java.util.*; diff --git a/src/test/java/javax/usb/tck/SignatureTest.java b/src/test/java/javax/usb/tck/SignatureTest.java index b1f8f6f..552676c 100755 --- a/src/test/java/javax/usb/tck/SignatureTest.java +++ b/src/test/java/javax/usb/tck/SignatureTest.java @@ -13,7 +13,7 @@ import javax.usb.tck.sigtest.*; import org.junit.runner.RunWith; -import de.ailis.usb4java.TCKRunner; +import de.ailis.usb4java.test.TCKRunner; import java.io.*; import junit.framework.*; diff --git a/src/test/java/javax/usb/tck/UsbInterfacePolicyTest.java b/src/test/java/javax/usb/tck/UsbInterfacePolicyTest.java index c37a012..1869f0c 100755 --- a/src/test/java/javax/usb/tck/UsbInterfacePolicyTest.java +++ b/src/test/java/javax/usb/tck/UsbInterfacePolicyTest.java @@ -28,7 +28,7 @@ import javax.usb.*; import org.junit.runner.RunWith; -import de.ailis.usb4java.TCKRunner; +import de.ailis.usb4java.test.TCKRunner; /** * Usb Interface Policy Test