Files
ltdrdata-ComfyUI-Impact-Pack/tests/wildcards/test_sequential_loading.sh
T
Dr.Lt.DataandClaude fd1b40bee5 feat: Progressive on-demand wildcard loading system
Implement memory-efficient progressive loading for large wildcard collections (10GB+).

Closes #1137

## Key Changes

- **LazyWildcardLoader**: On-demand loading proxy with thread-safe caching
- **Auto mode detection**: Full cache (<50MB) or on-demand (≥50MB), configurable via `wildcard_cache_limit_mb`
- **Performance**: Startup 20-60min → <1min, Memory 5-10GB → <100MB, Size calc <1sec
- **API**: `/impact/wildcards/list/loaded` - Progressive tracking endpoint
- **UI**: Real-time status (🔵 On-Demand / 🟢 Full Cache) with loaded count
- **Compatibility**: Backward compatible, all existing features work unchanged

## Implementation

- YAML pre-loaded (keys in content), TXT on-demand (path = key)
- Early termination size calculation, transitive wildcard support maintained
- 15 test files with comprehensive documentation

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-18 01:57:24 +09:00

328 lines
8.6 KiB
Bash

#!/bin/bash
# Sequential Multi-Stage Wildcard Loading Test
# Tests transitive wildcards that load in multiple sequential stages
# Auto-detect paths
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
IMPACT_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
PORT=8193
CONFIG_FILE="$IMPACT_DIR/impact-pack.ini"
GREEN='\033[0;32m'
RED='\033[0;31m'
BLUE='\033[0;34m'
YELLOW='\033[1;33m'
CYAN='\033[0;36m'
NC='\033[0m'
echo "=========================================="
echo "Sequential Multi-Stage Wildcard Loading Test"
echo "=========================================="
echo ""
# Setup config for full cache mode
cat > "$CONFIG_FILE" << EOF
[default]
dependency_version = 24
mmdet_skip = True
sam_editor_cpu = False
sam_editor_model = sam_vit_h_4b8939.pth
custom_wildcards = $IMPACT_DIR/custom_wildcards
disable_gpu_opencv = True
wildcard_cache_limit_mb = 50
EOF
echo "Mode: Full cache mode (50MB limit)"
echo ""
# Kill existing servers
pkill -9 -f "python.*main.py" 2>/dev/null || true
sleep 3
# Start server
COMFYUI_DIR="$(cd "$IMPACT_DIR/../.." && pwd)"
cd "$COMFYUI_DIR"
echo "Starting ComfyUI server on port $PORT..."
bash run.sh --listen 127.0.0.1 --port $PORT > /tmp/sequential_test.log 2>&1 &
SERVER_PID=$!
# Wait for server
echo "Waiting 70 seconds for server startup..."
for i in {1..70}; do
sleep 1
if [ $((i % 10)) -eq 0 ]; then
echo " ... $i seconds"
fi
done
# Check server
if ! curl -s http://127.0.0.1:$PORT/ > /dev/null; then
echo "${RED}✗ Server failed to start${NC}"
exit 1
fi
echo "${GREEN}✓ Server started${NC}"
echo ""
# Test function with stage visualization
test_sequential() {
local TEST_NUM=$1
local RAW_PROMPT=$2
local SEED=$3
local DESCRIPTION=$4
local EXPECTED_STAGES=$5 # Number of expected expansion stages
echo "${BLUE}=== Test $TEST_NUM: $DESCRIPTION ===${NC}"
echo "Raw prompt: ${YELLOW}$RAW_PROMPT${NC}"
echo "Seed: $SEED"
echo "Expected stages: $EXPECTED_STAGES"
echo ""
# Test the prompt
RESULT=$(curl -s -X POST http://127.0.0.1:$PORT/impact/wildcards \
-H "Content-Type: application/json" \
-d "{\"text\": \"$RAW_PROMPT\", \"seed\": $SEED}" | \
python3 -c "import sys, json; print(json.load(sys.stdin).get('text','ERROR'))" 2>/dev/null || echo "ERROR")
echo "${CYAN}Stage Analysis:${NC}"
echo " Stage 0 (Input): $RAW_PROMPT"
# Check if result contains any wildcards (incomplete expansion)
if echo "$RESULT" | grep -q "__.*__"; then
echo " ${YELLOW}⚠ Result still contains wildcards (incomplete expansion)${NC}"
echo " Final Result: $RESULT"
else
echo " ${GREEN}✓ All wildcards fully expanded${NC}"
fi
echo " Final Output: ${GREEN}$RESULT${NC}"
echo ""
# Validate result
if [ "$RESULT" != "ERROR" ] && [ "$RESULT" != "" ]; then
# Check if result still has wildcards (shouldn't have)
if echo "$RESULT" | grep -q "__.*__"; then
echo "Status: ${YELLOW}⚠ PARTIAL - Wildcards remain${NC}"
else
echo "Status: ${GREEN}✅ SUCCESS - Complete expansion${NC}"
fi
else
echo "Status: ${RED}❌ FAILED - Error or empty result${NC}"
fi
echo ""
}
echo "=========================================="
echo "Sequential Loading Test Suite"
echo "=========================================="
echo ""
echo "${CYAN}Test Category 1: Depth Verification${NC}"
echo "Testing different transitive depths with stage tracking"
echo ""
# Test 1: Depth 1 (Direct wildcard)
test_sequential "01" \
"__samples/flower__" \
42 \
"Depth 1 - Direct wildcard (no transitive)" \
1
# Test 2: Depth 2 (One level transitive)
test_sequential "02" \
"__dragon__" \
200 \
"Depth 2 - One level transitive" \
2
# Test 3: Depth 3 (Two levels transitive)
test_sequential "03" \
"__dragon__ warrior" \
200 \
"Depth 3 - Two levels with suffix" \
3
# Test 4: Depth 3 (Maximum verified depth)
test_sequential "04" \
"__adnd__ creature" \
222 \
"Depth 3 - Maximum transitive chain" \
3
echo ""
echo "${CYAN}Test Category 2: Mixed Transitive Scenarios${NC}"
echo "Testing wildcards mixed with dynamic prompts"
echo ""
# Test 5: Transitive with dynamic prompt
test_sequential "05" \
"{__dragon__|__adnd__} in battle" \
100 \
"Dynamic selection of transitive wildcards" \
3
# Test 6: Multiple transitive wildcards
test_sequential "06" \
"__dragon__ fights __adnd__" \
150 \
"Multiple transitive wildcards in one prompt" \
3
# Test 7: Nested transitive in dynamic
test_sequential "07" \
"powerful {__dragon__|__adnd__|simple warrior}" \
200 \
"Transitive wildcards nested in dynamic prompts" \
3
echo ""
echo "${CYAN}Test Category 3: Complex Sequential Scenarios${NC}"
echo "Testing complex multi-stage expansions"
echo ""
# Test 8: Transitive with weights
test_sequential "08" \
"{5::__dragon__|3::__adnd__|regular warrior}" \
250 \
"Weighted selection with transitive wildcards" \
3
# Test 9: Multi-select with transitive
test_sequential "09" \
"{2\$\$, \$\$__dragon__|__adnd__|warrior|mage}" \
300 \
"Multi-select including transitive wildcards" \
3
# Test 10: Quantified transitive
test_sequential "10" \
"{2\$\$, \$\$3#__dragon__}" \
350 \
"Quantified wildcard with transitive expansion" \
3
echo ""
echo "${CYAN}Test Category 4: Edge Cases${NC}"
echo "Testing boundary conditions and special cases"
echo ""
# Test 11: Transitive in compound grammar
test_sequential "11" \
"1{girl holding __samples/flower__|boy riding __dragon__}" \
400 \
"Compound grammar with mixed transitive depths" \
3
# Test 12: Multiple wildcards, different depths
test_sequential "12" \
"__samples/flower__ and __dragon__ with __colors__" \
450 \
"Multiple wildcards with varying depths" \
3
# Test 13: YAML wildcard (no transitive)
test_sequential "13" \
"__colors__" \
333 \
"YAML wildcard (depth 1, no transitive)" \
1
# Test 14: Transitive + YAML combination
test_sequential "14" \
"__dragon__ with __colors__ armor" \
500 \
"Combination of transitive and YAML wildcards" \
3
echo ""
echo "${CYAN}Test Category 5: On-Demand Mode Verification${NC}"
echo "Testing sequential loading in on-demand mode"
echo ""
# Switch to on-demand mode
cat > "$CONFIG_FILE" << EOF
[default]
dependency_version = 24
mmdet_skip = True
sam_editor_cpu = False
sam_editor_model = sam_vit_h_4b8939.pth
custom_wildcards = $IMPACT_DIR/custom_wildcards
disable_gpu_opencv = True
wildcard_cache_limit_mb = 0.5
EOF
# Restart server
kill $SERVER_PID 2>/dev/null
pkill -9 -f "python.*main.py.*$PORT" 2>/dev/null
sleep 3
echo "Restarting server in on-demand mode (0.5MB limit)..."
cd "$COMFYUI_DIR"
bash run.sh --listen 127.0.0.1 --port $PORT > /tmp/sequential_ondemand.log 2>&1 &
SERVER_PID=$!
echo "Waiting 70 seconds for server restart..."
for i in {1..70}; do
sleep 1
if [ $((i % 10)) -eq 0 ]; then
echo " ... $i seconds"
fi
done
if ! curl -s http://127.0.0.1:$PORT/ > /dev/null; then
echo "${RED}✗ Server failed to restart${NC}"
exit 1
fi
echo "${GREEN}✓ Server restarted in on-demand mode${NC}"
echo ""
# Test 15: Same transitive in on-demand mode
test_sequential "15" \
"__adnd__ creature" \
222 \
"Depth 3 transitive in on-demand mode (should match full cache)" \
3
# Test 16: Complex scenario in on-demand
test_sequential "16" \
"{__dragon__|__adnd__} {warrior|mage}" \
100 \
"Complex transitive with dynamic in on-demand mode" \
3
# Test 17: Multiple transitive in on-demand
test_sequential "17" \
"__dragon__ and __adnd__ together" \
150 \
"Multiple transitive wildcards in on-demand mode" \
3
# Stop server
kill $SERVER_PID 2>/dev/null
pkill -9 -f "python.*main.py.*$PORT" 2>/dev/null
echo "=========================================="
echo "Test Summary"
echo "=========================================="
echo ""
echo "Total tests: 17"
echo "Categories:"
echo " - Depth Verification (4 tests)"
echo " - Mixed Transitive Scenarios (3 tests)"
echo " - Complex Sequential Scenarios (3 tests)"
echo " - Edge Cases (4 tests)"
echo " - On-Demand Mode Verification (3 tests)"
echo ""
echo "Test Focus:"
echo " ✓ Multi-stage transitive wildcard expansion"
echo " ✓ Sequential loading across different depths"
echo " ✓ Transitive wildcards in dynamic prompts"
echo " ✓ Transitive wildcards with weights and multi-select"
echo " ✓ On-demand mode sequential loading verification"
echo ""
echo "Log saved to:"
echo " - Full cache mode: /tmp/sequential_test.log"
echo " - On-demand mode: /tmp/sequential_ondemand.log"
echo ""