use super::*;
use crate::arithmetic::push_int;
use crate::scheduler::scheduler_init;
#[test]
fn test_tcp_listen() {
unsafe {
scheduler_init();
let stack = crate::stack::alloc_test_stack();
let stack = push_int(stack, 0); let stack = tcp_listen(stack);
let (stack, success) = pop(stack);
assert!(
matches!(success, Value::Bool(true)),
"tcp_listen should succeed"
);
let (_stack, result) = pop(stack);
match result {
Value::Int(listener_id) => {
assert!(listener_id >= 0, "Listener ID should be non-negative");
}
_ => panic!("Expected Int (listener_id), got {:?}", result),
}
}
}
#[test]
fn test_tcp_listen_invalid_port_negative() {
unsafe {
scheduler_init();
let stack = crate::stack::alloc_test_stack();
let stack = push_int(stack, -1);
let stack = tcp_listen(stack);
let (stack, success) = pop(stack);
assert!(
matches!(success, Value::Bool(false)),
"Invalid port should return false"
);
let (_stack, result) = pop(stack);
assert!(
matches!(result, Value::Int(0)),
"Invalid port should return 0"
);
}
}
#[test]
fn test_tcp_listen_invalid_port_too_high() {
unsafe {
scheduler_init();
let stack = crate::stack::alloc_test_stack();
let stack = push_int(stack, 65536);
let stack = tcp_listen(stack);
let (stack, success) = pop(stack);
assert!(
matches!(success, Value::Bool(false)),
"Invalid port should return false"
);
let (_stack, result) = pop(stack);
assert!(
matches!(result, Value::Int(0)),
"Invalid port should return 0"
);
}
}
#[test]
fn test_tcp_port_range_valid() {
unsafe {
scheduler_init();
let stack = push_int(crate::stack::alloc_test_stack(), 0);
let stack = tcp_listen(stack);
let (stack, success) = pop(stack);
assert!(matches!(success, Value::Bool(true)));
let (_, result) = pop(stack);
assert!(matches!(result, Value::Int(_)));
let stack = push_int(crate::stack::alloc_test_stack(), 9999);
let stack = tcp_listen(stack);
let (stack, success) = pop(stack);
assert!(matches!(success, Value::Bool(true)));
let (_, result) = pop(stack);
assert!(matches!(result, Value::Int(_)));
}
}
#[test]
fn test_socket_id_reuse_after_close() {
unsafe {
scheduler_init();
let stack = push_int(crate::stack::alloc_test_stack(), 0);
let stack = tcp_listen(stack);
let (stack, success) = pop(stack);
assert!(matches!(success, Value::Bool(true)));
let (_stack, listener_result) = pop(stack);
let listener_id = match listener_result {
Value::Int(id) => id,
_ => panic!("Expected listener ID"),
};
assert!(listener_id >= 0);
}
}
#[test]
fn test_tcp_read_invalid_socket_id() {
unsafe {
scheduler_init();
let stack = push_int(crate::stack::alloc_test_stack(), 9999);
let stack = tcp_read(stack);
let (stack, success) = pop(stack);
assert!(
matches!(success, Value::Bool(false)),
"Invalid socket should return false"
);
let (_stack, result) = pop(stack);
match result {
Value::String(s) => assert_eq!(s.as_str(), ""),
_ => panic!("Expected empty string"),
}
}
}
#[test]
fn test_tcp_write_invalid_socket_id() {
unsafe {
scheduler_init();
let stack = push(
crate::stack::alloc_test_stack(),
Value::String("test".into()),
);
let stack = push_int(stack, 9999);
let stack = tcp_write(stack);
let (_stack, success) = pop(stack);
assert!(
matches!(success, Value::Bool(false)),
"Invalid socket should return false"
);
}
}
#[test]
fn test_tcp_close_idempotent() {
unsafe {
scheduler_init();
let stack = push_int(crate::stack::alloc_test_stack(), 0);
let stack = tcp_listen(stack);
let (stack, success) = pop(stack);
assert!(matches!(success, Value::Bool(true)));
let (stack, _listener_result) = pop(stack);
let stack = push_int(stack, 9999);
let stack = tcp_close(stack);
let (_stack, success) = pop(stack);
assert!(
matches!(success, Value::Bool(false)),
"Invalid socket close should return false"
);
}
}
#[test]
fn test_socket_registry_capacity() {
assert_eq!(MAX_SOCKETS, 10_000);
}
#[test]
fn test_max_read_size_limit() {
assert_eq!(MAX_READ_SIZE, 1_048_576);
}