Fix: Ensure all skills are tracked as files, not submodules
This commit is contained in:
196
skills/loki-mode/tests/test-bootstrap.sh
Executable file
196
skills/loki-mode/tests/test-bootstrap.sh
Executable file
@@ -0,0 +1,196 @@
|
||||
#!/bin/bash
|
||||
# Test: Bootstrap Script Functionality
|
||||
# Tests the .loki directory initialization and state management
|
||||
|
||||
set -uo pipefail
|
||||
# Note: Not using -e to allow collecting all test results
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
TEST_DIR=$(mktemp -d)
|
||||
PASSED=0
|
||||
FAILED=0
|
||||
|
||||
# Colors
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
NC='\033[0m'
|
||||
|
||||
log_pass() { echo -e "${GREEN}[PASS]${NC} $1"; ((PASSED++)); }
|
||||
log_fail() { echo -e "${RED}[FAIL]${NC} $1"; ((FAILED++)); }
|
||||
log_test() { echo -e "${YELLOW}[TEST]${NC} $1"; }
|
||||
|
||||
cleanup() {
|
||||
rm -rf "$TEST_DIR"
|
||||
}
|
||||
trap cleanup EXIT
|
||||
|
||||
cd "$TEST_DIR"
|
||||
|
||||
echo "========================================"
|
||||
echo "Loki Mode Bootstrap Tests"
|
||||
echo "========================================"
|
||||
echo "Test directory: $TEST_DIR"
|
||||
echo ""
|
||||
|
||||
# Test 1: Directory structure creation
|
||||
log_test "Directory structure creation"
|
||||
mkdir -p .loki/{state/{agents,checkpoints,locks},queue,messages/{inbox,outbox,broadcast},logs/{agents,decisions,archive},config,prompts,artifacts/{releases,reports,backups},scripts,memory/{episodic,semantic,skills},metrics/{efficiency,rewards}}
|
||||
|
||||
if [ -d ".loki/state/agents" ] && [ -d ".loki/queue" ] && [ -d ".loki/logs" ]; then
|
||||
log_pass "All directories created"
|
||||
else
|
||||
log_fail "Missing directories"
|
||||
fi
|
||||
|
||||
# Test 2: Queue files initialization
|
||||
log_test "Queue files initialization"
|
||||
for f in pending in-progress completed failed dead-letter; do
|
||||
echo '{"tasks":[]}' > ".loki/queue/$f.json"
|
||||
done
|
||||
|
||||
all_queues_exist=true
|
||||
for f in pending in-progress completed failed dead-letter; do
|
||||
if [ ! -f ".loki/queue/$f.json" ]; then
|
||||
all_queues_exist=false
|
||||
fi
|
||||
done
|
||||
|
||||
if $all_queues_exist; then
|
||||
log_pass "All queue files created"
|
||||
else
|
||||
log_fail "Missing queue files"
|
||||
fi
|
||||
|
||||
# Test 3: Orchestrator state initialization
|
||||
log_test "Orchestrator state initialization"
|
||||
cat > .loki/state/orchestrator.json << 'EOF'
|
||||
{
|
||||
"version": "2.1.0",
|
||||
"startupId": "",
|
||||
"phase": "bootstrap",
|
||||
"prdPath": "",
|
||||
"prdHash": "",
|
||||
"agents": {"active":[],"idle":[],"failed":[],"totalSpawned":0},
|
||||
"metrics": {"tasksCompleted":0,"tasksFailed":0,"deployments":0},
|
||||
"circuitBreakers": {},
|
||||
"lastCheckpoint": "",
|
||||
"lastBackup": "",
|
||||
"currentRelease": "0.0.0"
|
||||
}
|
||||
EOF
|
||||
|
||||
if [ -f ".loki/state/orchestrator.json" ]; then
|
||||
version=$(cat .loki/state/orchestrator.json | grep -o '"version": "[^"]*"' | cut -d'"' -f4)
|
||||
if [ "$version" = "2.1.0" ]; then
|
||||
log_pass "Orchestrator state created with correct version"
|
||||
else
|
||||
log_fail "Orchestrator state has wrong version: $version"
|
||||
fi
|
||||
else
|
||||
log_fail "Orchestrator state file not created"
|
||||
fi
|
||||
|
||||
# Test 4: UUID generation (macOS compatible)
|
||||
log_test "UUID generation (macOS compatible)"
|
||||
if command -v uuidgen &> /dev/null; then
|
||||
STARTUP_ID=$(uuidgen)
|
||||
if [ -n "$STARTUP_ID" ]; then
|
||||
log_pass "UUID generated via uuidgen: $STARTUP_ID"
|
||||
else
|
||||
log_fail "uuidgen failed to generate UUID"
|
||||
fi
|
||||
elif [ -f /proc/sys/kernel/random/uuid ]; then
|
||||
STARTUP_ID=$(cat /proc/sys/kernel/random/uuid)
|
||||
if [ -n "$STARTUP_ID" ]; then
|
||||
log_pass "UUID generated via /proc: $STARTUP_ID"
|
||||
else
|
||||
log_fail "Failed to generate UUID from /proc"
|
||||
fi
|
||||
else
|
||||
STARTUP_ID="$(date +%s)-$$"
|
||||
log_pass "Fallback UUID generated: $STARTUP_ID"
|
||||
fi
|
||||
|
||||
# Test 5: sed macOS compatibility
|
||||
log_test "sed macOS compatibility"
|
||||
echo '{"startupId": ""}' > test_sed.json
|
||||
if [[ "$OSTYPE" == "darwin"* ]]; then
|
||||
sed -i '' 's/"startupId": ""/"startupId": "test-uuid"/' test_sed.json
|
||||
else
|
||||
sed -i 's/"startupId": ""/"startupId": "test-uuid"/' test_sed.json
|
||||
fi
|
||||
|
||||
if grep -q '"startupId": "test-uuid"' test_sed.json; then
|
||||
log_pass "sed works correctly on $OSTYPE"
|
||||
else
|
||||
log_fail "sed failed on $OSTYPE"
|
||||
fi
|
||||
|
||||
# Test 6: JSON validation
|
||||
log_test "JSON validation of queue files"
|
||||
json_valid=true
|
||||
for f in .loki/queue/*.json; do
|
||||
if ! python3 -c "import json; json.load(open('$f'))" 2>/dev/null; then
|
||||
if ! node -e "require('$f')" 2>/dev/null; then
|
||||
json_valid=false
|
||||
log_fail "Invalid JSON: $f"
|
||||
fi
|
||||
fi
|
||||
done
|
||||
if $json_valid; then
|
||||
log_pass "All queue JSON files are valid"
|
||||
fi
|
||||
|
||||
# Test 7: File locking mechanism
|
||||
log_test "File locking mechanism"
|
||||
mkdir -p .loki/state/locks
|
||||
LOCK_FILE=".loki/state/locks/test.lock"
|
||||
|
||||
# Test acquiring lock
|
||||
(
|
||||
exec 200>"$LOCK_FILE"
|
||||
if flock -x -w 1 200; then
|
||||
echo "locked" > "$LOCK_FILE.status"
|
||||
sleep 0.1
|
||||
fi
|
||||
) &
|
||||
LOCK_PID=$!
|
||||
sleep 0.2
|
||||
wait $LOCK_PID 2>/dev/null || true
|
||||
|
||||
if [ -f "$LOCK_FILE.status" ] && grep -q "locked" "$LOCK_FILE.status"; then
|
||||
log_pass "File locking works"
|
||||
else
|
||||
log_pass "File locking works (or flock not available - acceptable)"
|
||||
fi
|
||||
|
||||
# Test 8: Backup directory structure
|
||||
log_test "Backup directory structure"
|
||||
mkdir -p .loki/artifacts/backups
|
||||
TIMESTAMP=$(date +%Y%m%d-%H%M%S)
|
||||
BACKUP_PATH=".loki/artifacts/backups/state-$TIMESTAMP"
|
||||
mkdir -p "$BACKUP_PATH"
|
||||
cp .loki/state/orchestrator.json "$BACKUP_PATH/"
|
||||
|
||||
if [ -f "$BACKUP_PATH/orchestrator.json" ]; then
|
||||
log_pass "Backup structure works"
|
||||
else
|
||||
log_fail "Backup structure failed"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "========================================"
|
||||
echo "Test Summary"
|
||||
echo "========================================"
|
||||
echo -e "${GREEN}Passed: $PASSED${NC}"
|
||||
echo -e "${RED}Failed: $FAILED${NC}"
|
||||
echo ""
|
||||
|
||||
if [ $FAILED -eq 0 ]; then
|
||||
echo -e "${GREEN}All tests passed!${NC}"
|
||||
exit 0
|
||||
else
|
||||
echo -e "${RED}Some tests failed!${NC}"
|
||||
exit 1
|
||||
fi
|
||||
Reference in New Issue
Block a user