Files
2026-07-13 13:13:07 +08:00

203 lines
5.8 KiB
Bash
Executable File

#!/usr/bin/env bash
#
# Database State Tests
#
# Part of the smolvm test suite. Run with: ./tests/test_db.sh
#
source "$(dirname "$0")/common.sh"
init_smolvm
log_info "Pre-flight cleanup: killing orphan processes..."
kill_orphan_smolvm_processes
trap cleanup_machine EXIT
echo ""
echo "=========================================="
echo " Database State Tests"
echo "=========================================="
echo ""
test_db_persistence_across_restart() {
local vm_name="db-test-vm-$$"
# Clean up any existing
$SMOLVM machine stop --name "$vm_name" 2>/dev/null || true
$SMOLVM machine delete --name "$vm_name" -f 2>/dev/null || true
# Create a named VM with specific configuration
$SMOLVM machine create --name "$vm_name" --cpus 2 --mem 1024 2>&1
# Verify it was created with correct config
local list_output
list_output=$($SMOLVM machine ls --json 2>&1)
if [[ "$list_output" != *"$vm_name"* ]]; then
echo "VM was not created"
return 1
fi
if [[ "$list_output" != *'"cpus": 2'* ]] || [[ "$list_output" != *'"memory_mib": 1024'* ]]; then
echo "VM configuration not persisted correctly"
$SMOLVM machine delete --name "$vm_name" -f 2>/dev/null || true
return 1
fi
# Clean up
$SMOLVM machine delete --name "$vm_name" -f 2>&1
ensure_data_dir_deleted "$vm_name"
}
test_db_vm_state_update() {
local vm_name="db-state-test-$$"
# Clean up any existing
$SMOLVM machine stop --name "$vm_name" 2>/dev/null || true
$SMOLVM machine delete --name "$vm_name" -f 2>/dev/null || true
# Create a named VM
$SMOLVM machine create --name "$vm_name" 2>&1
# Check initial state is "created"
local initial_state
initial_state=$($SMOLVM machine ls --json 2>&1)
if [[ "$initial_state" != *'"state": "created"'* ]]; then
echo "Initial state should be 'created'"
$SMOLVM machine delete --name "$vm_name" -f 2>/dev/null || true
return 1
fi
# Start the VM
$SMOLVM machine start --name "$vm_name" 2>&1
# Check state changed to "running"
local running_state
running_state=$($SMOLVM machine ls --json 2>&1)
if [[ "$running_state" != *'"state": "running"'* ]]; then
echo "State should be 'running' after start"
$SMOLVM machine stop --name "$vm_name" 2>/dev/null || true
$SMOLVM machine delete --name "$vm_name" -f 2>/dev/null || true
return 1
fi
# Stop the VM
$SMOLVM machine stop --name "$vm_name" 2>&1
# Check state changed to "stopped"
local stopped_state
stopped_state=$($SMOLVM machine ls --json 2>&1)
# Clean up
$SMOLVM machine delete --name "$vm_name" -f 2>&1
ensure_data_dir_deleted "$vm_name"
[[ "$stopped_state" == *'"state": "stopped"'* ]]
}
test_db_delete_removes_from_db() {
local vm_name="db-delete-test-$$"
# Clean up any existing
$SMOLVM machine delete --name "$vm_name" -f 2>/dev/null || true
# Create a VM
$SMOLVM machine create --name "$vm_name" 2>&1
# Verify it exists
local before_delete
before_delete=$($SMOLVM machine ls --json 2>&1)
if [[ "$before_delete" != *"$vm_name"* ]]; then
echo "VM should exist before delete"
return 1
fi
# Delete it
$SMOLVM machine delete --name "$vm_name" -f 2>&1
ensure_data_dir_deleted "$vm_name"
# Verify it's gone
local after_delete
after_delete=$($SMOLVM machine ls --json 2>&1)
[[ "$after_delete" != *"$vm_name"* ]]
}
test_db_default_vm_appears_in_list_on_start() {
cleanup_machine
# Start the default VM (no name)
$SMOLVM machine start 2>&1 || return 1
# Verify "default" appears in machine ls --json as running
local list_output
list_output=$($SMOLVM machine ls --json 2>&1)
# Clean up
$SMOLVM machine stop 2>/dev/null || true
[[ "$list_output" == *'"name": "default"'* ]] && \
[[ "$list_output" == *'"state": "running"'* ]]
}
test_db_default_vm_shows_stopped_after_stop() {
cleanup_machine
# Start then stop the default VM
$SMOLVM machine start 2>&1 || return 1
$SMOLVM machine stop 2>&1 || return 1
# Verify "default" shows as stopped
local list_output
list_output=$($SMOLVM machine ls --json 2>&1)
[[ "$list_output" == *'"name": "default"'* ]] && \
[[ "$list_output" == *'"state": "stopped"'* ]]
}
test_db_default_vm_state_transitions() {
cleanup_machine
# Start default VM
$SMOLVM machine start 2>&1 || return 1
# Check running state
local running_state
running_state=$($SMOLVM machine ls --json 2>&1)
if [[ "$running_state" != *'"state": "running"'* ]]; then
echo "State should be 'running' after start"
$SMOLVM machine stop 2>/dev/null || true
return 1
fi
# Stop default VM
$SMOLVM machine stop 2>&1 || return 1
# Check stopped state
local stopped_state
stopped_state=$($SMOLVM machine ls --json 2>&1)
if [[ "$stopped_state" != *'"state": "stopped"'* ]]; then
echo "State should be 'stopped' after stop"
return 1
fi
# Restart and check running again
$SMOLVM machine start 2>&1 || return 1
local restarted_state
restarted_state=$($SMOLVM machine ls --json 2>&1)
# Clean up
$SMOLVM machine stop 2>/dev/null || true
[[ "$restarted_state" == *'"state": "running"'* ]]
}
run_test "DB persistence across restart" test_db_persistence_across_restart || true
run_test "DB VM state update" test_db_vm_state_update || true
run_test "DB delete removes from database" test_db_delete_removes_from_db || true
run_test "DB default VM appears in list on start" test_db_default_vm_appears_in_list_on_start || true
run_test "DB default VM shows stopped after stop" test_db_default_vm_shows_stopped_after_stop || true
run_test "DB default VM state transitions" test_db_default_vm_state_transitions || true
print_summary "DB State Tests"