#![allow(non_snake_case)]
#[cfg(test)]
mod teec_api_tests {
use cc_teec::{
TEEC_AllocateSharedMemory, TEEC_CloseSession, TEEC_FinalizeContext, TEEC_InitializeContext,
TEEC_InvokeCommand, TEEC_OpenSession, TEEC_RegisterSharedMemory, TEEC_ReleaseSharedMemory,
TEEC_RequestCancellation, raw,
};
use std::ptr;
#[test]
fn test_TEEC_InitializeContext() {
let res = TEEC_InitializeContext(ptr::null(), ptr::null_mut());
assert_eq!(res, raw::TEEC_ERROR_BAD_PARAMETERS);
let mut ctx = raw::TEEC_Context {
imp: raw::TEEC_Context__Imp {
fd: -1,
reg_mem: false,
memref_null: false,
},
};
let res = TEEC_InitializeContext(ptr::null(), &mut ctx);
let _ = res; }
#[test]
fn test_TEEC_OpenSession() {
let res = TEEC_OpenSession(
ptr::null_mut(),
ptr::null_mut(),
ptr::null(),
0,
ptr::null(),
ptr::null_mut(),
ptr::null_mut(),
);
assert_eq!(res, raw::TEEC_ERROR_BAD_PARAMETERS);
let mut ctx = raw::TEEC_Context {
imp: raw::TEEC_Context__Imp {
fd: -1,
reg_mem: false,
memref_null: false,
},
};
let mut session = raw::TEEC_Session {
imp: raw::TEEC_Session__Imp {
ctx: ptr::null_mut(),
session_id: 0,
},
};
let res = TEEC_OpenSession(
&mut ctx,
&mut session,
ptr::null(),
0,
ptr::null(),
ptr::null_mut(),
ptr::null_mut(),
);
assert_eq!(res, raw::TEEC_ERROR_BAD_PARAMETERS);
}
#[test]
fn test_TEEC_InvokeCommand() {
let res = TEEC_InvokeCommand(ptr::null_mut(), 0, ptr::null_mut(), ptr::null_mut());
assert_eq!(res, raw::TEEC_ERROR_BAD_PARAMETERS);
let mut session = raw::TEEC_Session {
imp: raw::TEEC_Session__Imp {
ctx: ptr::null_mut(),
session_id: 0,
},
};
let mut operation = raw::TEEC_Operation {
started: 0,
paramTypes: 0,
params: [unsafe { std::mem::zeroed() }; 4],
imp: raw::TEEC_Operation__Imp {
session: ptr::null_mut(),
},
};
let mut error_origin = 0u32;
let res = TEEC_InvokeCommand(&mut session, 1, &mut operation, &mut error_origin);
assert_eq!(res, raw::TEEC_ERROR_BAD_PARAMETERS);
}
#[test]
fn test_TEEC_RegisterSharedMemory() {
let res = TEEC_RegisterSharedMemory(ptr::null_mut(), ptr::null_mut());
assert_eq!(res, raw::TEEC_ERROR_BAD_PARAMETERS);
let mut ctx = raw::TEEC_Context {
imp: raw::TEEC_Context__Imp {
fd: -1,
reg_mem: false,
memref_null: false,
},
};
let mut shm = raw::TEEC_SharedMemory {
buffer: ptr::null_mut(),
size: 1024,
flags: raw::TEEC_MEM_INPUT,
imp: raw::TEEC_SharedMemory__Imp {
id: -1,
alloced_size: 0,
shadow_buffer: ptr::null_mut(),
registered_fd: -1,
flags: 0,
},
};
let res = TEEC_RegisterSharedMemory(&mut ctx, &mut shm);
assert_eq!(res, raw::TEEC_ERROR_BAD_PARAMETERS);
}
#[test]
fn test_TEEC_AllocateSharedMemory() {
let res = TEEC_AllocateSharedMemory(ptr::null_mut(), ptr::null_mut());
assert_eq!(res, raw::TEEC_ERROR_BAD_PARAMETERS);
let mut ctx = raw::TEEC_Context {
imp: raw::TEEC_Context__Imp {
fd: -1,
reg_mem: false,
memref_null: false,
},
};
let mut shm = raw::TEEC_SharedMemory {
buffer: ptr::null_mut(),
size: 0,
flags: raw::TEEC_MEM_INPUT,
imp: raw::TEEC_SharedMemory__Imp {
id: -1,
alloced_size: 0,
shadow_buffer: ptr::null_mut(),
registered_fd: -1,
flags: 0,
},
};
let res = TEEC_AllocateSharedMemory(&mut ctx, &mut shm);
assert_eq!(res, raw::TEEC_ERROR_BAD_PARAMETERS);
}
#[test]
fn test_TEEC_CloseSession() {
TEEC_CloseSession(ptr::null_mut());
let mut session = raw::TEEC_Session {
imp: raw::TEEC_Session__Imp {
ctx: ptr::null_mut(),
session_id: 0,
},
};
TEEC_CloseSession(&mut session);
assert_eq!(session.imp.session_id, 0);
}
#[test]
fn test_TEEC_FinalizeContext() {
TEEC_FinalizeContext(ptr::null_mut());
let mut ctx = raw::TEEC_Context {
imp: raw::TEEC_Context__Imp {
fd: 123, reg_mem: true,
memref_null: true,
},
};
TEEC_FinalizeContext(&mut ctx);
}
#[test]
fn test_TEEC_RequestCancellation() {
TEEC_RequestCancellation(ptr::null_mut());
let mut operation = raw::TEEC_Operation {
started: 1, paramTypes: 0,
params: [unsafe { std::mem::zeroed() }; 4],
imp: raw::TEEC_Operation__Imp {
session: ptr::null_mut(), },
};
TEEC_RequestCancellation(&mut operation);
}
#[test]
fn test_TEEC_ReleaseSharedMemory() {
TEEC_ReleaseSharedMemory(ptr::null_mut());
let buffer = Box::new([0u8; 1024]);
let raw_ptr = Box::into_raw(buffer) as *mut std::ffi::c_void;
let mut shm = raw::TEEC_SharedMemory {
buffer: raw_ptr,
size: 1024,
flags: raw::TEEC_MEM_INPUT,
imp: raw::TEEC_SharedMemory__Imp {
id: 456, alloced_size: 1024,
shadow_buffer: ptr::null_mut(),
registered_fd: -1,
flags: 1, },
};
TEEC_ReleaseSharedMemory(&mut shm);
let _ = unsafe { Box::from_raw(raw_ptr as *mut [u8; 1024]) };
}
#[test]
fn test_param_macros() {
let param_types = raw::TEEC_PARAM_TYPES(
raw::TEEC_VALUE_INPUT,
raw::TEEC_VALUE_OUTPUT,
raw::TEEC_MEMREF_TEMP_INPUT,
raw::TEEC_MEMREF_WHOLE,
);
assert_eq!(
raw::TEEC_PARAM_TYPE_GET(param_types, 0),
raw::TEEC_VALUE_INPUT
);
assert_eq!(
raw::TEEC_PARAM_TYPE_GET(param_types, 1),
raw::TEEC_VALUE_OUTPUT
);
assert_eq!(
raw::TEEC_PARAM_TYPE_GET(param_types, 2),
raw::TEEC_MEMREF_TEMP_INPUT
);
assert_eq!(
raw::TEEC_PARAM_TYPE_GET(param_types, 3),
raw::TEEC_MEMREF_WHOLE
);
let param_type = raw::TEEC_PARAM_TYPE_GET(param_types, 4);
assert_eq!(param_type, 0);
}
#[test]
fn test_shared_memory_boundary_conditions() {
let mut ctx = raw::TEEC_Context {
imp: raw::TEEC_Context__Imp {
fd: 1,
reg_mem: true,
memref_null: false,
},
};
let mut shm = raw::TEEC_SharedMemory {
buffer: ptr::null_mut(),
size: 1024,
flags: 0xFFFFFFFF, imp: raw::TEEC_SharedMemory__Imp {
id: -1,
alloced_size: 0,
shadow_buffer: ptr::null_mut(),
registered_fd: -1,
flags: 0,
},
};
let res = TEEC_AllocateSharedMemory(&mut ctx, &mut shm);
assert_eq!(res, raw::TEEC_ERROR_BAD_PARAMETERS);
}
#[test]
fn test_operation_params_error_handling() {
let mut operation = raw::TEEC_Operation {
started: 0,
paramTypes: 0xFFFFFFFF, params: [unsafe { std::mem::zeroed() }; 4],
imp: raw::TEEC_Operation__Imp {
session: ptr::null_mut(),
},
};
let mut session = raw::TEEC_Session {
imp: raw::TEEC_Session__Imp {
ctx: ptr::null_mut(),
session_id: 0,
},
};
let mut error_origin = 0u32;
let res = TEEC_InvokeCommand(&mut session, 1, &mut operation, &mut error_origin);
assert_eq!(res, raw::TEEC_ERROR_BAD_PARAMETERS);
}
#[test]
fn test_uuid_conversion() {
let uuid = raw::TEEC_UUID {
timeLow: 0x00112233,
timeMid: 0x4455,
timeHiAndVersion: 0x6677,
clockSeqAndNode: [0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF],
};
let mut ctx = raw::TEEC_Context {
imp: raw::TEEC_Context__Imp {
fd: -1,
reg_mem: false,
memref_null: false,
},
};
let mut session = raw::TEEC_Session {
imp: raw::TEEC_Session__Imp {
ctx: ptr::null_mut(),
session_id: 0,
},
};
let res = TEEC_OpenSession(
&mut ctx,
&mut session,
&uuid,
raw::TEEC_LOGIN_PUBLIC,
ptr::null(),
ptr::null_mut(),
ptr::null_mut(),
);
assert_eq!(res, raw::TEEC_ERROR_BAD_PARAMETERS);
}
#[test]
fn test_session_and_operation_lifecycle() {
let mut operation = raw::TEEC_Operation {
started: 0,
paramTypes: raw::TEEC_PARAM_TYPES(
raw::TEEC_VALUE_INPUT,
raw::TEEC_VALUE_OUTPUT,
raw::TEEC_NONE,
raw::TEEC_NONE,
),
params: [unsafe { std::mem::zeroed() }; 4],
imp: raw::TEEC_Operation__Imp {
session: ptr::null_mut(),
},
};
operation.params[0].value.a = 123;
operation.params[0].value.b = 456;
assert_eq!(
raw::TEEC_PARAM_TYPE_GET(operation.paramTypes, 0),
raw::TEEC_VALUE_INPUT
);
assert_eq!(
raw::TEEC_PARAM_TYPE_GET(operation.paramTypes, 1),
raw::TEEC_VALUE_OUTPUT
);
unsafe {
assert_eq!(operation.params[0].value.a, 123);
assert_eq!(operation.params[0].value.b, 456);
}
let mut session = raw::TEEC_Session {
imp: raw::TEEC_Session__Imp {
ctx: ptr::null_mut(),
session_id: 999, },
};
operation.imp.session = &mut session;
assert_eq!(operation.imp.session as *const _, &mut session as *const _);
TEEC_CloseSession(&mut session);
}
}
#[cfg(test)]
mod teec_trace_api_tests {
use std::ffi::CString;
use std::ptr;
use cc_teec::{TRACE_INFO, dump_buffer, rust_dprintf};
#[test]
fn test_rust_dprintf_returns_written_len() {
let function = CString::new("test_fn").unwrap();
let prefix = CString::new("TEST").unwrap();
let message = CString::new("hello").unwrap();
let n = rust_dprintf(
function.as_ptr(),
42,
TRACE_INFO,
prefix.as_ptr(),
message.as_ptr(),
);
assert!(n > 0);
}
#[test]
fn test_rust_dprintf_null_message() {
let prefix = CString::new("TEST").unwrap();
let n = rust_dprintf(ptr::null(), 0, TRACE_INFO, prefix.as_ptr(), ptr::null());
assert_eq!(n, -1);
}
#[test]
fn test_rust_dprintf_without_function_info() {
let prefix = CString::new("TEST").unwrap();
let message = CString::new("plain").unwrap();
let n = rust_dprintf(
ptr::null(),
0,
TRACE_INFO,
prefix.as_ptr(),
message.as_ptr(),
);
assert!(n > 0);
}
#[test]
fn test_dump_buffer_null_args() {
dump_buffer(ptr::null(), ptr::null(), 0);
}
#[test]
fn test_dump_buffer_valid_buffer() {
let name = CString::new("buf").unwrap();
let data = [0u8, 1, 2, 3, 0xFF];
dump_buffer(name.as_ptr(), data.as_ptr(), data.len());
}
}