diff options
Diffstat (limited to 'tests')
-rw-r--r-- | tests/java_integers.rs | 8 | ||||
-rw-r--r-- | tests/jni_api.rs | 58 | ||||
-rw-r--r-- | tests/util/mod.rs | 2 |
3 files changed, 48 insertions, 20 deletions
diff --git a/tests/java_integers.rs b/tests/java_integers.rs index b4b2ed6..0d7c6fb 100644 --- a/tests/java_integers.rs +++ b/tests/java_integers.rs @@ -16,11 +16,9 @@ fn test_java_integers() { let integer_value = env.new_object("java/lang/Integer", "(I)V", &[JValue::Int(value)])?; - let values_array = JObject::from(env.new_object_array( - array_length, - "java/lang/Integer", - integer_value, - )?); + let values_array = + env.new_object_array(array_length, "java/lang/Integer", integer_value)?; + let values_array = unsafe { JObject::from_raw(values_array) }; let result = env .call_static_method( diff --git a/tests/jni_api.rs b/tests/jni_api.rs index 5d35719..050f8ec 100644 --- a/tests/jni_api.rs +++ b/tests/jni_api.rs @@ -305,7 +305,7 @@ pub fn java_byte_array_from_slice() { let java_array = env .byte_array_from_slice(buf) .expect("JNIEnv#byte_array_from_slice must create a java array from slice"); - let obj = AutoLocal::new(&env, JObject::from(java_array)); + let obj = AutoLocal::new(&env, unsafe { JObject::from_raw(java_array) }); assert!(!obj.as_obj().is_null()); let mut res: [i8; 3] = [0; 3]; @@ -333,8 +333,12 @@ macro_rules! test_get_array_elements { // Use a scope to test Drop { // Get byte array elements auto wrapper - let auto_ptr: AutoArray<$jni_type> = - env.$jni_get(java_array, ReleaseMode::CopyBack).unwrap(); + let auto_ptr: AutoArray<$jni_type> = { + // Make sure the lifetime is tied to the environment, + // not the particular JNIEnv reference + let temporary_env: JNIEnv = *env; + temporary_env.$jni_get(java_array, ReleaseMode::CopyBack).unwrap() + }; // Check array size assert_eq!(auto_ptr.size().unwrap(), 2); @@ -572,19 +576,34 @@ pub fn get_object_class_null_arg() { #[test] pub fn new_direct_byte_buffer() { let env = attach_current_thread(); - let mut vec: Vec<u8> = vec![0, 1, 2, 3]; - let buf = vec.as_mut_slice(); - let result = env.new_direct_byte_buffer(buf); + let vec: Vec<u8> = vec![0, 1, 2, 3]; + let (addr, len) = { + // (would use buf.into_raw_parts() on nightly) + let buf = vec.leak(); + (buf.as_mut_ptr(), buf.len()) + }; + let result = unsafe { env.new_direct_byte_buffer(addr, len) }; assert!(result.is_ok()); assert!(!result.unwrap().is_null()); } #[test] +pub fn new_direct_byte_buffer_invalid_addr() { + let env = attach_current_thread(); + let result = unsafe { env.new_direct_byte_buffer(std::ptr::null_mut(), 5) }; + assert!(result.is_err()); +} + +#[test] pub fn get_direct_buffer_capacity_ok() { let env = attach_current_thread(); - let mut vec: Vec<u8> = vec![0, 1, 2, 3]; - let buf = vec.as_mut_slice(); - let result = env.new_direct_byte_buffer(buf).unwrap(); + let vec: Vec<u8> = vec![0, 1, 2, 3]; + let (addr, len) = { + // (would use buf.into_raw_parts() on nightly) + let buf = vec.leak(); + (buf.as_mut_ptr(), buf.len()) + }; + let result = unsafe { env.new_direct_byte_buffer(addr, len) }.unwrap(); assert!(!result.is_null()); let capacity = env.get_direct_buffer_capacity(result).unwrap(); @@ -594,21 +613,32 @@ pub fn get_direct_buffer_capacity_ok() { #[test] pub fn get_direct_buffer_capacity_wrong_arg() { let env = attach_current_thread(); - let wrong_obj = JByteBuffer::from(env.new_string("wrong").unwrap().into_inner()); + let wrong_obj = unsafe { JByteBuffer::from_raw(env.new_string("wrong").unwrap().into_raw()) }; let capacity = env.get_direct_buffer_capacity(wrong_obj); assert!(capacity.is_err()); } #[test] +pub fn get_direct_buffer_capacity_null_arg() { + let env = attach_current_thread(); + let result = env.get_direct_buffer_capacity(JObject::null().into()); + assert!(result.is_err()); +} + +#[test] pub fn get_direct_buffer_address_ok() { let env = attach_current_thread(); - let mut vec: Vec<u8> = vec![0, 1, 2, 3]; - let buf = vec.as_mut_slice(); - let result = env.new_direct_byte_buffer(buf).unwrap(); + let vec: Vec<u8> = vec![0, 1, 2, 3]; + let (addr, len) = { + // (would use buf.into_raw_parts() on nightly) + let buf = vec.leak(); + (buf.as_mut_ptr(), buf.len()) + }; + let result = unsafe { env.new_direct_byte_buffer(addr, len) }.unwrap(); assert!(!result.is_null()); let dest_buffer = env.get_direct_buffer_address(result).unwrap(); - assert_eq!(buf, dest_buffer); + assert_eq!(addr, dest_buffer); } #[test] diff --git a/tests/util/mod.rs b/tests/util/mod.rs index 511550d..fb07386 100644 --- a/tests/util/mod.rs +++ b/tests/util/mod.rs @@ -79,7 +79,7 @@ pub fn print_exception(env: &JNIEnv) { #[allow(dead_code)] pub fn unwrap<T>(env: &JNIEnv, res: Result<T>) -> T { res.unwrap_or_else(|e| { - print_exception(&env); + print_exception(env); panic!("{:#?}", e); }) } |