claude-flow-novice 2.14.3 → 2.14.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/commands/CFN_LOOP_TASK_MODE.md +4 -47
- package/.claude/skills/cfn-redis-coordination/demos/test-cancel-swarm.sh +0 -276
- package/claude-assets/commands/CFN_LOOP_TASK_MODE.md +4 -47
- package/claude-assets/skills/cfn-redis-coordination/demos/test-cancel-swarm.sh +0 -276
- package/dist/agents/agent-loader.js +165 -146
- package/dist/agents/agent-loader.js.map +1 -1
- package/dist/cli/agent-prompt-builder.js +25 -0
- package/dist/cli/agent-prompt-builder.js.map +1 -1
- package/dist/cli/config-manager.js +91 -109
- package/package.json +1 -1
- package/.claude/skills/cfn-redis-coordination/HEARTBEAT.md +0 -57
- package/.claude/skills/cfn-redis-coordination/HEARTBEAT_MONITORING.md +0 -267
- package/.claude/skills/cfn-redis-coordination/LOGGING.md +0 -260
- package/.claude/skills/cfn-redis-coordination/README.md +0 -65
- package/.claude/skills/cfn-redis-coordination/SECURITY_REVIEW.md +0 -25
- package/.claude/skills/cfn-redis-coordination/SHUTDOWN_HANDLING.md +0 -164
- package/.claude/skills/cfn-redis-coordination/SKILL.md +0 -720
- package/.claude/skills/cfn-redis-coordination/demos/test-dlq.sh +0 -129
- package/.claude/skills/cfn-redis-coordination/demos/test-iteration-feedback.sh +0 -320
- package/.claude/skills/cfn-redis-coordination/demos/test-orchestrator.sh +0 -249
- package/.claude/skills/cfn-redis-coordination/demos/test-priority-wake-phase4-unix.sh +0 -148
- package/.claude/skills/cfn-redis-coordination/demos/test-priority-wake-phase4.sh +0 -163
- package/.claude/skills/cfn-redis-coordination/demos/test-priority-wake.sh +0 -138
- package/.claude/skills/cfn-redis-coordination/demos/test-quick-fix.sh +0 -81
- package/.claude/skills/cfn-redis-coordination/demos/test-quorum-absolute.sh +0 -45
- package/.claude/skills/cfn-redis-coordination/demos/test-quorum-fallback.sh +0 -68
- package/.claude/skills/cfn-redis-coordination/demos/test-quorum-percentage.sh +0 -56
- package/.claude/skills/cfn-redis-coordination/demos/test-quorum-with-retry.sh +0 -81
- package/.claude/skills/cfn-redis-coordination/demos/test-quorum.sh +0 -57
- package/.claude/skills/cfn-redis-coordination/demos/test-shutdown-handling.sh +0 -187
- package/.claude/skills/cfn-redis-coordination/demos/test-shutdown.sh +0 -160
- package/.claude/skills/cfn-redis-coordination/demos/test-utils-unix.sh +0 -97
- package/.claude/skills/cfn-redis-coordination/demos/test-utils.sh +0 -97
- package/.claude/skills/cfn-redis-coordination/demos/test-waiting-mode.sh +0 -59
- package/.claude/skills/cfn-redis-coordination/examples/README.md +0 -73
- package/.claude/skills/cfn-redis-coordination/examples/grafana-dashboard.json +0 -352
- package/.claude/skills/cfn-redis-coordination/examples/hierarchical-pattern.sh +0 -127
- package/.claude/skills/cfn-redis-coordination/examples/mesh-pattern.sh +0 -171
- package/.claude/skills/cfn-redis-coordination/examples/timeout-handling.sh +0 -227
- package/.claude/skills/cfn-redis-coordination/examples/waiting-mode-pattern.sh +0 -239
- package/.claude/skills/cfn-redis-coordination/execute-product-owner-decision.sh +0 -258
- package/.claude/skills/cfn-redis-coordination/get-agent-timeout.sh +0 -177
- package/.claude/skills/cfn-redis-coordination/heartbeat-functions.sh +0 -137
- package/.claude/skills/cfn-redis-coordination/heartbeat-protocol.md +0 -106
- package/.claude/skills/cfn-redis-coordination/heartbeat.sh +0 -126
- package/.claude/skills/cfn-redis-coordination/init-swarm.sh +0 -148
- package/.claude/skills/cfn-redis-coordination/invoke-redis-pattern.sh +0 -220
- package/.claude/skills/cfn-redis-coordination/invoke-waiting-mode.sh +0 -283
- package/.claude/skills/cfn-redis-coordination/list-active-swarms.sh +0 -147
- package/.claude/skills/cfn-redis-coordination/log-event.sh +0 -109
- package/.claude/skills/cfn-redis-coordination/metrics-export.sh +0 -674
- package/.claude/skills/cfn-redis-coordination/metrics-schema.json +0 -66
- package/.claude/skills/cfn-redis-coordination/metrics-storage.md +0 -31
- package/.claude/skills/cfn-redis-coordination/monitor-cfn-violations.sh +0 -391
- package/.claude/skills/cfn-redis-coordination/monitor-heartbeats.sh +0 -101
- package/.claude/skills/cfn-redis-coordination/orchestrate-cfn-loop-v3.sh +0 -141
- package/.claude/skills/cfn-redis-coordination/orchestrate-cfn-loop.sh +0 -31
- package/.claude/skills/cfn-redis-coordination/orchestrate-cfn-loop.sh.bak +0 -0
- package/.claude/skills/cfn-redis-coordination/priority-wake-mechanism.md +0 -75
- package/.claude/skills/cfn-redis-coordination/priority_wake.py +0 -134
- package/.claude/skills/cfn-redis-coordination/query-dlq.sh +0 -162
- package/.claude/skills/cfn-redis-coordination/query-logs.sh +0 -103
- package/.claude/skills/cfn-redis-coordination/redis-pattern.sh +0 -619
- package/.claude/skills/cfn-redis-coordination/retrieve-context.sh +0 -58
- package/.claude/skills/cfn-redis-coordination/select-specialist-agent.sh +0 -371
- package/.claude/skills/cfn-redis-coordination/semantic-match-tfidf.py +0 -252
- package/.claude/skills/cfn-redis-coordination/send-heartbeat.sh +0 -165
- package/.claude/skills/cfn-redis-coordination/signal.sh +0 -38
- package/.claude/skills/cfn-redis-coordination/store-context.sh +0 -86
- package/.claude/skills/cfn-redis-coordination/store-epic-context.sh +0 -123
- package/.claude/skills/cfn-redis-coordination/test-context-injection.sh +0 -354
- package/.claude/skills/cfn-redis-coordination/test-timeout-enforcement.sh +0 -513
- package/.claude/skills/cfn-redis-coordination/tests/convert-line-endings.sh +0 -15
- package/.claude/skills/cfn-redis-coordination/tests/dlq-functionality-test.sh +0 -102
- package/.claude/skills/cfn-redis-coordination/tests/edge-cases-test.sh +0 -99
- package/.claude/skills/cfn-redis-coordination/tests/integration-test.sh +0 -170
- package/.claude/skills/cfn-redis-coordination/tests/retry-mechanism-test.sh +0 -82
- package/.claude/skills/cfn-redis-coordination/tests/run-test-suite.sh +0 -92
- package/.claude/skills/cfn-redis-coordination/tests/run-tests.sh +0 -4
- package/.claude/skills/cfn-redis-coordination/tests/test-heartbeat-monitoring.sh +0 -418
- package/.claude/skills/cfn-redis-coordination/tests/test-heartbeat-simple.sh +0 -124
- package/.claude/skills/cfn-redis-coordination/tests/test-primitives.sh +0 -166
- package/.claude/skills/cfn-redis-coordination/tests/test-utils.sh +0 -54
- package/.claude/skills/cfn-redis-coordination/tests/test_utils.sh +0 -49
- package/.claude/skills/cfn-redis-coordination/v2_modularization/core_orchestration.sh +0 -76
- package/.claude/skills/cfn-redis-coordination/validate-parameters.sh +0 -492
- package/claude-assets/skills/cfn-redis-coordination/HEARTBEAT.md +0 -57
- package/claude-assets/skills/cfn-redis-coordination/HEARTBEAT_MONITORING.md +0 -267
- package/claude-assets/skills/cfn-redis-coordination/LOGGING.md +0 -260
- package/claude-assets/skills/cfn-redis-coordination/README.md +0 -65
- package/claude-assets/skills/cfn-redis-coordination/SECURITY_REVIEW.md +0 -25
- package/claude-assets/skills/cfn-redis-coordination/SHUTDOWN_HANDLING.md +0 -164
- package/claude-assets/skills/cfn-redis-coordination/SKILL.md +0 -720
- package/claude-assets/skills/cfn-redis-coordination/demos/test-dlq.sh +0 -129
- package/claude-assets/skills/cfn-redis-coordination/demos/test-iteration-feedback.sh +0 -320
- package/claude-assets/skills/cfn-redis-coordination/demos/test-orchestrator.sh +0 -249
- package/claude-assets/skills/cfn-redis-coordination/demos/test-priority-wake-phase4-unix.sh +0 -148
- package/claude-assets/skills/cfn-redis-coordination/demos/test-priority-wake-phase4.sh +0 -163
- package/claude-assets/skills/cfn-redis-coordination/demos/test-priority-wake.sh +0 -138
- package/claude-assets/skills/cfn-redis-coordination/demos/test-quick-fix.sh +0 -81
- package/claude-assets/skills/cfn-redis-coordination/demos/test-quorum-absolute.sh +0 -45
- package/claude-assets/skills/cfn-redis-coordination/demos/test-quorum-fallback.sh +0 -68
- package/claude-assets/skills/cfn-redis-coordination/demos/test-quorum-percentage.sh +0 -56
- package/claude-assets/skills/cfn-redis-coordination/demos/test-quorum-with-retry.sh +0 -81
- package/claude-assets/skills/cfn-redis-coordination/demos/test-quorum.sh +0 -57
- package/claude-assets/skills/cfn-redis-coordination/demos/test-shutdown-handling.sh +0 -187
- package/claude-assets/skills/cfn-redis-coordination/demos/test-shutdown.sh +0 -160
- package/claude-assets/skills/cfn-redis-coordination/demos/test-utils-unix.sh +0 -97
- package/claude-assets/skills/cfn-redis-coordination/demos/test-utils.sh +0 -97
- package/claude-assets/skills/cfn-redis-coordination/demos/test-waiting-mode.sh +0 -59
- package/claude-assets/skills/cfn-redis-coordination/examples/README.md +0 -73
- package/claude-assets/skills/cfn-redis-coordination/examples/grafana-dashboard.json +0 -352
- package/claude-assets/skills/cfn-redis-coordination/examples/hierarchical-pattern.sh +0 -127
- package/claude-assets/skills/cfn-redis-coordination/examples/mesh-pattern.sh +0 -171
- package/claude-assets/skills/cfn-redis-coordination/examples/timeout-handling.sh +0 -227
- package/claude-assets/skills/cfn-redis-coordination/examples/waiting-mode-pattern.sh +0 -239
- package/claude-assets/skills/cfn-redis-coordination/execute-product-owner-decision.sh +0 -258
- package/claude-assets/skills/cfn-redis-coordination/get-agent-timeout.sh +0 -177
- package/claude-assets/skills/cfn-redis-coordination/heartbeat-functions.sh +0 -137
- package/claude-assets/skills/cfn-redis-coordination/heartbeat-protocol.md +0 -106
- package/claude-assets/skills/cfn-redis-coordination/heartbeat.sh +0 -126
- package/claude-assets/skills/cfn-redis-coordination/init-swarm.sh +0 -148
- package/claude-assets/skills/cfn-redis-coordination/invoke-redis-pattern.sh +0 -220
- package/claude-assets/skills/cfn-redis-coordination/invoke-waiting-mode.sh +0 -283
- package/claude-assets/skills/cfn-redis-coordination/list-active-swarms.sh +0 -147
- package/claude-assets/skills/cfn-redis-coordination/log-event.sh +0 -109
- package/claude-assets/skills/cfn-redis-coordination/metrics-export.sh +0 -674
- package/claude-assets/skills/cfn-redis-coordination/metrics-schema.json +0 -66
- package/claude-assets/skills/cfn-redis-coordination/metrics-storage.md +0 -31
- package/claude-assets/skills/cfn-redis-coordination/monitor-cfn-violations.sh +0 -391
- package/claude-assets/skills/cfn-redis-coordination/monitor-heartbeats.sh +0 -101
- package/claude-assets/skills/cfn-redis-coordination/orchestrate-cfn-loop-v3.sh +0 -141
- package/claude-assets/skills/cfn-redis-coordination/orchestrate-cfn-loop.sh +0 -31
- package/claude-assets/skills/cfn-redis-coordination/orchestrate-cfn-loop.sh.bak +0 -0
- package/claude-assets/skills/cfn-redis-coordination/priority-wake-mechanism.md +0 -75
- package/claude-assets/skills/cfn-redis-coordination/priority_wake.py +0 -134
- package/claude-assets/skills/cfn-redis-coordination/query-dlq.sh +0 -162
- package/claude-assets/skills/cfn-redis-coordination/query-logs.sh +0 -103
- package/claude-assets/skills/cfn-redis-coordination/redis-pattern.sh +0 -619
- package/claude-assets/skills/cfn-redis-coordination/retrieve-context.sh +0 -58
- package/claude-assets/skills/cfn-redis-coordination/select-specialist-agent.sh +0 -371
- package/claude-assets/skills/cfn-redis-coordination/semantic-match-tfidf.py +0 -252
- package/claude-assets/skills/cfn-redis-coordination/send-heartbeat.sh +0 -165
- package/claude-assets/skills/cfn-redis-coordination/signal.sh +0 -38
- package/claude-assets/skills/cfn-redis-coordination/store-context.sh +0 -86
- package/claude-assets/skills/cfn-redis-coordination/store-epic-context.sh +0 -123
- package/claude-assets/skills/cfn-redis-coordination/test-context-injection.sh +0 -354
- package/claude-assets/skills/cfn-redis-coordination/test-timeout-enforcement.sh +0 -513
- package/claude-assets/skills/cfn-redis-coordination/tests/convert-line-endings.sh +0 -15
- package/claude-assets/skills/cfn-redis-coordination/tests/dlq-functionality-test.sh +0 -102
- package/claude-assets/skills/cfn-redis-coordination/tests/edge-cases-test.sh +0 -99
- package/claude-assets/skills/cfn-redis-coordination/tests/integration-test.sh +0 -170
- package/claude-assets/skills/cfn-redis-coordination/tests/retry-mechanism-test.sh +0 -82
- package/claude-assets/skills/cfn-redis-coordination/tests/run-test-suite.sh +0 -92
- package/claude-assets/skills/cfn-redis-coordination/tests/run-tests.sh +0 -4
- package/claude-assets/skills/cfn-redis-coordination/tests/test-heartbeat-monitoring.sh +0 -418
- package/claude-assets/skills/cfn-redis-coordination/tests/test-heartbeat-simple.sh +0 -124
- package/claude-assets/skills/cfn-redis-coordination/tests/test-primitives.sh +0 -166
- package/claude-assets/skills/cfn-redis-coordination/tests/test-utils.sh +0 -54
- package/claude-assets/skills/cfn-redis-coordination/tests/test_utils.sh +0 -49
- package/claude-assets/skills/cfn-redis-coordination/v2_modularization/core_orchestration.sh +0 -76
- package/claude-assets/skills/cfn-redis-coordination/validate-parameters.sh +0 -492
|
@@ -1,418 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
|
|
3
|
-
##############################################################################
|
|
4
|
-
# Heartbeat Monitoring Test Suite
|
|
5
|
-
# Validates agent heartbeat detection and quorum-aware handling
|
|
6
|
-
##############################################################################
|
|
7
|
-
|
|
8
|
-
set -euo pipefail
|
|
9
|
-
|
|
10
|
-
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
11
|
-
REDIS_COORDINATION_DIR="$(dirname "$SCRIPT_DIR")"
|
|
12
|
-
|
|
13
|
-
# Test configuration
|
|
14
|
-
TASK_ID="test-heartbeat-$(date +%s)"
|
|
15
|
-
TEST_RESULTS=()
|
|
16
|
-
FAILED_TESTS=0
|
|
17
|
-
|
|
18
|
-
# Colors for output
|
|
19
|
-
RED='\033[0;31m'
|
|
20
|
-
GREEN='\033[0;32m'
|
|
21
|
-
YELLOW='\033[1;33m'
|
|
22
|
-
NC='\033[0m' # No Color
|
|
23
|
-
|
|
24
|
-
##############################################################################
|
|
25
|
-
# Test Helper Functions
|
|
26
|
-
##############################################################################
|
|
27
|
-
function setup_test() {
|
|
28
|
-
local test_name="$1"
|
|
29
|
-
echo ""
|
|
30
|
-
echo "=========================================="
|
|
31
|
-
echo "TEST: $test_name"
|
|
32
|
-
echo "=========================================="
|
|
33
|
-
|
|
34
|
-
# Clean up any previous test data
|
|
35
|
-
redis-cli --scan --pattern "swarm:${TASK_ID}:*" | xargs -r redis-cli DEL >/dev/null 2>&1 || true
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
function assert_equals() {
|
|
39
|
-
local expected="$1"
|
|
40
|
-
local actual="$2"
|
|
41
|
-
local message="$3"
|
|
42
|
-
|
|
43
|
-
if [ "$expected" = "$actual" ]; then
|
|
44
|
-
echo -e "${GREEN}✓${NC} $message"
|
|
45
|
-
return 0
|
|
46
|
-
else
|
|
47
|
-
echo -e "${RED}✗${NC} $message"
|
|
48
|
-
echo " Expected: $expected"
|
|
49
|
-
echo " Actual: $actual"
|
|
50
|
-
return 1
|
|
51
|
-
fi
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
function assert_not_equals() {
|
|
55
|
-
local not_expected="$1"
|
|
56
|
-
local actual="$2"
|
|
57
|
-
local message="$3"
|
|
58
|
-
|
|
59
|
-
if [ "$not_expected" != "$actual" ]; then
|
|
60
|
-
echo -e "${GREEN}✓${NC} $message"
|
|
61
|
-
return 0
|
|
62
|
-
else
|
|
63
|
-
echo -e "${RED}✗${NC} $message"
|
|
64
|
-
echo " Should not be: $not_expected"
|
|
65
|
-
echo " Actual: $actual"
|
|
66
|
-
return 1
|
|
67
|
-
fi
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
function record_result() {
|
|
71
|
-
local test_name="$1"
|
|
72
|
-
local result="$2"
|
|
73
|
-
|
|
74
|
-
TEST_RESULTS+=("$test_name: $result")
|
|
75
|
-
|
|
76
|
-
if [ "$result" = "PASS" ]; then
|
|
77
|
-
echo -e "${GREEN}RESULT: PASS${NC}"
|
|
78
|
-
else
|
|
79
|
-
echo -e "${RED}RESULT: FAIL${NC}"
|
|
80
|
-
FAILED_TESTS=$((FAILED_TESTS + 1))
|
|
81
|
-
fi
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
##############################################################################
|
|
85
|
-
# Test 1: Agent with active heartbeat is detected as alive
|
|
86
|
-
##############################################################################
|
|
87
|
-
function test_active_heartbeat() {
|
|
88
|
-
setup_test "Active Heartbeat Detection"
|
|
89
|
-
|
|
90
|
-
local agent="test-agent-1"
|
|
91
|
-
local hb_key="swarm:${TASK_ID}:${agent}:heartbeat"
|
|
92
|
-
|
|
93
|
-
# Set heartbeat
|
|
94
|
-
redis-cli SET "$hb_key" "{\"timestamp\": $(date +%s), \"status\": \"working\"}" >/dev/null
|
|
95
|
-
redis-cli EXPIRE "$hb_key" 60 >/dev/null
|
|
96
|
-
|
|
97
|
-
# Source heartbeat functions
|
|
98
|
-
source "$REDIS_COORDINATION_DIR/heartbeat-functions.sh"
|
|
99
|
-
|
|
100
|
-
# Check heartbeat
|
|
101
|
-
if check_agent_heartbeat "$agent" "$TASK_ID"; then
|
|
102
|
-
record_result "test_active_heartbeat" "PASS"
|
|
103
|
-
else
|
|
104
|
-
record_result "test_active_heartbeat" "FAIL"
|
|
105
|
-
fi
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
##############################################################################
|
|
109
|
-
# Test 2: Agent without heartbeat is detected as dead
|
|
110
|
-
##############################################################################
|
|
111
|
-
function test_missing_heartbeat() {
|
|
112
|
-
setup_test "Missing Heartbeat Detection"
|
|
113
|
-
|
|
114
|
-
local agent="test-agent-2"
|
|
115
|
-
|
|
116
|
-
# Source heartbeat functions
|
|
117
|
-
source "$REDIS_COORDINATION_DIR/heartbeat-functions.sh"
|
|
118
|
-
|
|
119
|
-
# Check heartbeat (should fail - no heartbeat set)
|
|
120
|
-
if ! check_agent_heartbeat "$agent" "$TASK_ID"; then
|
|
121
|
-
record_result "test_missing_heartbeat" "PASS"
|
|
122
|
-
else
|
|
123
|
-
record_result "test_missing_heartbeat" "FAIL"
|
|
124
|
-
fi
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
##############################################################################
|
|
128
|
-
# Test 3: Missed heartbeat counter increments correctly
|
|
129
|
-
##############################################################################
|
|
130
|
-
function test_missed_heartbeat_counter() {
|
|
131
|
-
setup_test "Missed Heartbeat Counter"
|
|
132
|
-
|
|
133
|
-
local agent="test-agent-3"
|
|
134
|
-
|
|
135
|
-
# Source heartbeat functions
|
|
136
|
-
source "$REDIS_COORDINATION_DIR/heartbeat-functions.sh"
|
|
137
|
-
|
|
138
|
-
# Initialize variables
|
|
139
|
-
LOOP3_FAILED_AGENTS=()
|
|
140
|
-
LOOP2_FAILED_AGENTS=()
|
|
141
|
-
LOOP3_COMPLETED_AGENTS=()
|
|
142
|
-
LOOP2_COMPLETED_AGENTS=()
|
|
143
|
-
MIN_QUORUM_LOOP3=1
|
|
144
|
-
MIN_QUORUM_LOOP2=1
|
|
145
|
-
LOOP3_TOTAL=3
|
|
146
|
-
LOOP2_TOTAL=3
|
|
147
|
-
LOOP3_AGENTS="$agent"
|
|
148
|
-
LOOP2_AGENTS=""
|
|
149
|
-
|
|
150
|
-
# First check - should increment to 1
|
|
151
|
-
check_heartbeats_loop "$TASK_ID" "test" "$agent" 2>/dev/null || true
|
|
152
|
-
|
|
153
|
-
if [ "${MISSED_HEARTBEATS[$agent]:-0}" -eq 1 ]; then
|
|
154
|
-
echo -e "${GREEN}✓${NC} Counter incremented to 1"
|
|
155
|
-
|
|
156
|
-
# Second check - should increment to 2
|
|
157
|
-
check_heartbeats_loop "$TASK_ID" "test" "$agent" 2>/dev/null || true
|
|
158
|
-
|
|
159
|
-
if [ "${MISSED_HEARTBEATS[$agent]:-0}" -eq 2 ]; then
|
|
160
|
-
echo -e "${GREEN}✓${NC} Counter incremented to 2"
|
|
161
|
-
record_result "test_missed_heartbeat_counter" "PASS"
|
|
162
|
-
else
|
|
163
|
-
echo -e "${RED}✗${NC} Counter should be 2, got ${MISSED_HEARTBEATS[$agent]:-0}"
|
|
164
|
-
record_result "test_missed_heartbeat_counter" "FAIL"
|
|
165
|
-
fi
|
|
166
|
-
else
|
|
167
|
-
echo -e "${RED}✗${NC} Counter should be 1, got ${MISSED_HEARTBEATS[$agent]:-0}"
|
|
168
|
-
record_result "test_missed_heartbeat_counter" "FAIL"
|
|
169
|
-
fi
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
##############################################################################
|
|
173
|
-
# Test 4: Heartbeat counter resets when agent recovers
|
|
174
|
-
##############################################################################
|
|
175
|
-
function test_heartbeat_recovery() {
|
|
176
|
-
setup_test "Heartbeat Recovery"
|
|
177
|
-
|
|
178
|
-
local agent="test-agent-4"
|
|
179
|
-
local hb_key="swarm:${TASK_ID}:${agent}:heartbeat"
|
|
180
|
-
|
|
181
|
-
# Source heartbeat functions
|
|
182
|
-
source "$REDIS_COORDINATION_DIR/heartbeat-functions.sh"
|
|
183
|
-
|
|
184
|
-
# Initialize variables
|
|
185
|
-
LOOP3_FAILED_AGENTS=()
|
|
186
|
-
LOOP2_FAILED_AGENTS=()
|
|
187
|
-
LOOP3_COMPLETED_AGENTS=()
|
|
188
|
-
LOOP2_COMPLETED_AGENTS=()
|
|
189
|
-
MIN_QUORUM_LOOP3=1
|
|
190
|
-
MIN_QUORUM_LOOP2=1
|
|
191
|
-
LOOP3_TOTAL=3
|
|
192
|
-
LOOP2_TOTAL=3
|
|
193
|
-
LOOP3_AGENTS="$agent"
|
|
194
|
-
LOOP2_AGENTS=""
|
|
195
|
-
|
|
196
|
-
# Miss heartbeat twice
|
|
197
|
-
check_heartbeats_loop "$TASK_ID" "test" "$agent" 2>/dev/null || true
|
|
198
|
-
check_heartbeats_loop "$TASK_ID" "test" "$agent" 2>/dev/null || true
|
|
199
|
-
|
|
200
|
-
if [ "${MISSED_HEARTBEATS[$agent]:-0}" -eq 2 ]; then
|
|
201
|
-
echo -e "${GREEN}✓${NC} Counter at 2 after missing heartbeats"
|
|
202
|
-
|
|
203
|
-
# Agent recovers - set heartbeat
|
|
204
|
-
redis-cli SET "$hb_key" "{\"timestamp\": $(date +%s), \"status\": \"working\"}" >/dev/null
|
|
205
|
-
redis-cli EXPIRE "$hb_key" 60 >/dev/null
|
|
206
|
-
|
|
207
|
-
# Check again - should reset
|
|
208
|
-
check_heartbeats_loop "$TASK_ID" "test" "$agent" 2>/dev/null || true
|
|
209
|
-
|
|
210
|
-
if [ "${MISSED_HEARTBEATS[$agent]:-0}" -eq 0 ]; then
|
|
211
|
-
echo -e "${GREEN}✓${NC} Counter reset to 0 after recovery"
|
|
212
|
-
record_result "test_heartbeat_recovery" "PASS"
|
|
213
|
-
else
|
|
214
|
-
echo -e "${RED}✗${NC} Counter should reset to 0, got ${MISSED_HEARTBEATS[$agent]:-0}"
|
|
215
|
-
record_result "test_heartbeat_recovery" "FAIL"
|
|
216
|
-
fi
|
|
217
|
-
else
|
|
218
|
-
echo -e "${RED}✗${NC} Counter should be 2, got ${MISSED_HEARTBEATS[$agent]:-0}"
|
|
219
|
-
record_result "test_heartbeat_recovery" "FAIL"
|
|
220
|
-
fi
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
##############################################################################
|
|
224
|
-
# Test 5: Heartbeat monitor starts and stops correctly
|
|
225
|
-
##############################################################################
|
|
226
|
-
function test_monitor_lifecycle() {
|
|
227
|
-
setup_test "Monitor Lifecycle"
|
|
228
|
-
|
|
229
|
-
local agent1="test-agent-5a"
|
|
230
|
-
local agent2="test-agent-5b"
|
|
231
|
-
|
|
232
|
-
# Source heartbeat functions
|
|
233
|
-
source "$REDIS_COORDINATION_DIR/heartbeat-functions.sh"
|
|
234
|
-
|
|
235
|
-
# Initialize variables
|
|
236
|
-
LOOP3_FAILED_AGENTS=()
|
|
237
|
-
LOOP2_FAILED_AGENTS=()
|
|
238
|
-
LOOP3_COMPLETED_AGENTS=()
|
|
239
|
-
LOOP2_COMPLETED_AGENTS=()
|
|
240
|
-
MIN_QUORUM_LOOP3=1
|
|
241
|
-
MIN_QUORUM_LOOP2=1
|
|
242
|
-
LOOP3_TOTAL=2
|
|
243
|
-
LOOP2_TOTAL=2
|
|
244
|
-
LOOP3_AGENTS="$agent1,$agent2"
|
|
245
|
-
LOOP2_AGENTS=""
|
|
246
|
-
SHUTDOWN_REQUESTED=0
|
|
247
|
-
|
|
248
|
-
# Start monitor
|
|
249
|
-
MONITOR_PID=$(start_heartbeat_monitor "$TASK_ID" "test" "$agent1" "$agent2")
|
|
250
|
-
|
|
251
|
-
if [ -n "$MONITOR_PID" ] && kill -0 "$MONITOR_PID" 2>/dev/null; then
|
|
252
|
-
echo -e "${GREEN}✓${NC} Monitor started successfully (PID: $MONITOR_PID)"
|
|
253
|
-
|
|
254
|
-
# Wait a moment
|
|
255
|
-
sleep 1
|
|
256
|
-
|
|
257
|
-
# Check marker file exists
|
|
258
|
-
if [ -f "/tmp/heartbeat-monitor-${TASK_ID}-test.active" ]; then
|
|
259
|
-
echo -e "${GREEN}✓${NC} Monitor marker file created"
|
|
260
|
-
|
|
261
|
-
# Stop monitor
|
|
262
|
-
stop_heartbeat_monitor "$TASK_ID" "test" "$MONITOR_PID"
|
|
263
|
-
|
|
264
|
-
# Wait a moment for cleanup
|
|
265
|
-
sleep 1
|
|
266
|
-
|
|
267
|
-
# Check marker file removed
|
|
268
|
-
if [ ! -f "/tmp/heartbeat-monitor-${TASK_ID}-test.active" ]; then
|
|
269
|
-
echo -e "${GREEN}✓${NC} Monitor marker file removed"
|
|
270
|
-
|
|
271
|
-
# Check process stopped
|
|
272
|
-
if ! kill -0 "$MONITOR_PID" 2>/dev/null; then
|
|
273
|
-
echo -e "${GREEN}✓${NC} Monitor process stopped"
|
|
274
|
-
record_result "test_monitor_lifecycle" "PASS"
|
|
275
|
-
else
|
|
276
|
-
echo -e "${RED}✗${NC} Monitor process still running"
|
|
277
|
-
kill "$MONITOR_PID" 2>/dev/null || true
|
|
278
|
-
record_result "test_monitor_lifecycle" "FAIL"
|
|
279
|
-
fi
|
|
280
|
-
else
|
|
281
|
-
echo -e "${RED}✗${NC} Monitor marker file not removed"
|
|
282
|
-
stop_heartbeat_monitor "$TASK_ID" "test" "$MONITOR_PID"
|
|
283
|
-
record_result "test_monitor_lifecycle" "FAIL"
|
|
284
|
-
fi
|
|
285
|
-
else
|
|
286
|
-
echo -e "${RED}✗${NC} Monitor marker file not created"
|
|
287
|
-
stop_heartbeat_monitor "$TASK_ID" "test" "$MONITOR_PID"
|
|
288
|
-
record_result "test_monitor_lifecycle" "FAIL"
|
|
289
|
-
fi
|
|
290
|
-
else
|
|
291
|
-
echo -e "${RED}✗${NC} Monitor failed to start"
|
|
292
|
-
record_result "test_monitor_lifecycle" "FAIL"
|
|
293
|
-
fi
|
|
294
|
-
}
|
|
295
|
-
|
|
296
|
-
##############################################################################
|
|
297
|
-
# Test 6: Monitor respects shutdown flag
|
|
298
|
-
##############################################################################
|
|
299
|
-
function test_monitor_shutdown() {
|
|
300
|
-
setup_test "Monitor Shutdown Handling"
|
|
301
|
-
|
|
302
|
-
local agent="test-agent-6"
|
|
303
|
-
|
|
304
|
-
# Source heartbeat functions
|
|
305
|
-
source "$REDIS_COORDINATION_DIR/heartbeat-functions.sh"
|
|
306
|
-
|
|
307
|
-
# Initialize variables
|
|
308
|
-
LOOP3_FAILED_AGENTS=()
|
|
309
|
-
LOOP2_FAILED_AGENTS=()
|
|
310
|
-
LOOP3_COMPLETED_AGENTS=()
|
|
311
|
-
LOOP2_COMPLETED_AGENTS=()
|
|
312
|
-
MIN_QUORUM_LOOP3=1
|
|
313
|
-
MIN_QUORUM_LOOP2=1
|
|
314
|
-
LOOP3_TOTAL=1
|
|
315
|
-
LOOP2_TOTAL=1
|
|
316
|
-
LOOP3_AGENTS="$agent"
|
|
317
|
-
LOOP2_AGENTS=""
|
|
318
|
-
SHUTDOWN_REQUESTED=0
|
|
319
|
-
|
|
320
|
-
# Start monitor
|
|
321
|
-
MONITOR_PID=$(start_heartbeat_monitor "$TASK_ID" "test" "$agent")
|
|
322
|
-
|
|
323
|
-
if [ -n "$MONITOR_PID" ] && kill -0 "$MONITOR_PID" 2>/dev/null; then
|
|
324
|
-
echo -e "${GREEN}✓${NC} Monitor started"
|
|
325
|
-
|
|
326
|
-
# Set shutdown flag
|
|
327
|
-
SHUTDOWN_REQUESTED=1
|
|
328
|
-
export SHUTDOWN_REQUESTED
|
|
329
|
-
|
|
330
|
-
# Wait for monitor to detect shutdown
|
|
331
|
-
sleep 2
|
|
332
|
-
|
|
333
|
-
# Monitor should have stopped on its own
|
|
334
|
-
if ! kill -0 "$MONITOR_PID" 2>/dev/null; then
|
|
335
|
-
echo -e "${GREEN}✓${NC} Monitor stopped automatically on shutdown flag"
|
|
336
|
-
|
|
337
|
-
# Cleanup
|
|
338
|
-
rm -f "/tmp/heartbeat-monitor-${TASK_ID}-test.active"
|
|
339
|
-
record_result "test_monitor_shutdown" "PASS"
|
|
340
|
-
else
|
|
341
|
-
echo -e "${YELLOW}⚠${NC} Monitor still running, forcing cleanup"
|
|
342
|
-
stop_heartbeat_monitor "$TASK_ID" "test" "$MONITOR_PID"
|
|
343
|
-
record_result "test_monitor_shutdown" "PASS" # Still pass since cleanup works
|
|
344
|
-
fi
|
|
345
|
-
else
|
|
346
|
-
echo -e "${RED}✗${NC} Monitor failed to start"
|
|
347
|
-
record_result "test_monitor_shutdown" "FAIL"
|
|
348
|
-
fi
|
|
349
|
-
}
|
|
350
|
-
|
|
351
|
-
##############################################################################
|
|
352
|
-
# Run All Tests
|
|
353
|
-
##############################################################################
|
|
354
|
-
echo "=========================================="
|
|
355
|
-
echo "Heartbeat Monitoring Test Suite"
|
|
356
|
-
echo "Task ID: $TASK_ID"
|
|
357
|
-
echo "=========================================="
|
|
358
|
-
|
|
359
|
-
test_active_heartbeat
|
|
360
|
-
test_missing_heartbeat
|
|
361
|
-
test_missed_heartbeat_counter
|
|
362
|
-
test_heartbeat_recovery
|
|
363
|
-
test_monitor_lifecycle
|
|
364
|
-
test_monitor_shutdown
|
|
365
|
-
|
|
366
|
-
##############################################################################
|
|
367
|
-
# Cleanup
|
|
368
|
-
##############################################################################
|
|
369
|
-
echo ""
|
|
370
|
-
echo "=========================================="
|
|
371
|
-
echo "Cleanup"
|
|
372
|
-
echo "=========================================="
|
|
373
|
-
|
|
374
|
-
# Clean up all test Redis keys
|
|
375
|
-
KEYS_DELETED=$(redis-cli --scan --pattern "swarm:${TASK_ID}:*" | xargs -r redis-cli DEL 2>/dev/null || echo "0")
|
|
376
|
-
echo "Deleted $KEYS_DELETED Redis keys"
|
|
377
|
-
|
|
378
|
-
# Clean up any remaining marker files
|
|
379
|
-
rm -f /tmp/heartbeat-monitor-${TASK_ID}-*.active 2>/dev/null || true
|
|
380
|
-
echo "Removed marker files"
|
|
381
|
-
|
|
382
|
-
##############################################################################
|
|
383
|
-
# Summary
|
|
384
|
-
##############################################################################
|
|
385
|
-
echo ""
|
|
386
|
-
echo "=========================================="
|
|
387
|
-
echo "Test Summary"
|
|
388
|
-
echo "=========================================="
|
|
389
|
-
|
|
390
|
-
TOTAL_TESTS=${#TEST_RESULTS[@]}
|
|
391
|
-
PASSED_TESTS=$((TOTAL_TESTS - FAILED_TESTS))
|
|
392
|
-
|
|
393
|
-
echo "Total Tests: $TOTAL_TESTS"
|
|
394
|
-
echo -e "Passed: ${GREEN}$PASSED_TESTS${NC}"
|
|
395
|
-
echo -e "Failed: ${RED}$FAILED_TESTS${NC}"
|
|
396
|
-
|
|
397
|
-
echo ""
|
|
398
|
-
echo "Individual Results:"
|
|
399
|
-
for result in "${TEST_RESULTS[@]}"; do
|
|
400
|
-
if [[ "$result" == *"PASS"* ]]; then
|
|
401
|
-
echo -e " ${GREEN}✓${NC} $result"
|
|
402
|
-
else
|
|
403
|
-
echo -e " ${RED}✗${NC} $result"
|
|
404
|
-
fi
|
|
405
|
-
done
|
|
406
|
-
|
|
407
|
-
echo ""
|
|
408
|
-
if [ $FAILED_TESTS -eq 0 ]; then
|
|
409
|
-
echo -e "${GREEN}=========================================="
|
|
410
|
-
echo "ALL TESTS PASSED!"
|
|
411
|
-
echo -e "==========================================${NC}"
|
|
412
|
-
exit 0
|
|
413
|
-
else
|
|
414
|
-
echo -e "${RED}=========================================="
|
|
415
|
-
echo "SOME TESTS FAILED"
|
|
416
|
-
echo -e "==========================================${NC}"
|
|
417
|
-
exit 1
|
|
418
|
-
fi
|
|
@@ -1,124 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
|
|
3
|
-
##############################################################################
|
|
4
|
-
# Simple Heartbeat Monitoring Test
|
|
5
|
-
# Validates core heartbeat detection functionality
|
|
6
|
-
##############################################################################
|
|
7
|
-
|
|
8
|
-
set -euo pipefail
|
|
9
|
-
|
|
10
|
-
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
11
|
-
REDIS_COORDINATION_DIR="$(dirname "$SCRIPT_DIR")"
|
|
12
|
-
|
|
13
|
-
# Test configuration
|
|
14
|
-
TASK_ID="test-hb-$(date +%s)"
|
|
15
|
-
|
|
16
|
-
# Source functions
|
|
17
|
-
source "$REDIS_COORDINATION_DIR/heartbeat-functions.sh"
|
|
18
|
-
|
|
19
|
-
echo "=========================================="
|
|
20
|
-
echo "Simple Heartbeat Test"
|
|
21
|
-
echo "Task ID: $TASK_ID"
|
|
22
|
-
echo "=========================================="
|
|
23
|
-
|
|
24
|
-
##############################################################################
|
|
25
|
-
# Test 1: Active heartbeat detected
|
|
26
|
-
##############################################################################
|
|
27
|
-
echo ""
|
|
28
|
-
echo "Test 1: Active heartbeat detection"
|
|
29
|
-
AGENT1="agent-alive"
|
|
30
|
-
HB_KEY="swarm:${TASK_ID}:${AGENT1}:heartbeat"
|
|
31
|
-
|
|
32
|
-
redis-cli SET "$HB_KEY" '{"timestamp": 1234567890, "status": "working"}' >/dev/null
|
|
33
|
-
redis-cli EXPIRE "$HB_KEY" 60 >/dev/null
|
|
34
|
-
|
|
35
|
-
if check_agent_heartbeat "$AGENT1" "$TASK_ID"; then
|
|
36
|
-
echo "✓ PASS: Active heartbeat detected"
|
|
37
|
-
else
|
|
38
|
-
echo "✗ FAIL: Active heartbeat not detected"
|
|
39
|
-
fi
|
|
40
|
-
|
|
41
|
-
##############################################################################
|
|
42
|
-
# Test 2: Missing heartbeat detected
|
|
43
|
-
##############################################################################
|
|
44
|
-
echo ""
|
|
45
|
-
echo "Test 2: Missing heartbeat detection"
|
|
46
|
-
AGENT2="agent-dead"
|
|
47
|
-
|
|
48
|
-
if ! check_agent_heartbeat "$AGENT2" "$TASK_ID"; then
|
|
49
|
-
echo "✓ PASS: Missing heartbeat detected"
|
|
50
|
-
else
|
|
51
|
-
echo "✗ FAIL: Missing heartbeat should have been detected"
|
|
52
|
-
fi
|
|
53
|
-
|
|
54
|
-
##############################################################################
|
|
55
|
-
# Test 3: Counter increments
|
|
56
|
-
##############################################################################
|
|
57
|
-
echo ""
|
|
58
|
-
echo "Test 3: Missed heartbeat counter"
|
|
59
|
-
AGENT3="agent-flaky"
|
|
60
|
-
|
|
61
|
-
# Initialize required variables
|
|
62
|
-
LOOP3_FAILED_AGENTS=()
|
|
63
|
-
LOOP2_FAILED_AGENTS=()
|
|
64
|
-
LOOP3_COMPLETED_AGENTS=()
|
|
65
|
-
LOOP2_COMPLETED_AGENTS=()
|
|
66
|
-
MIN_QUORUM_LOOP3=1
|
|
67
|
-
MIN_QUORUM_LOOP2=1
|
|
68
|
-
LOOP3_TOTAL=1
|
|
69
|
-
LOOP2_TOTAL=1
|
|
70
|
-
LOOP3_AGENTS="$AGENT3"
|
|
71
|
-
LOOP2_AGENTS=""
|
|
72
|
-
|
|
73
|
-
# Check twice (agent has no heartbeat)
|
|
74
|
-
check_heartbeats_loop "$TASK_ID" "test" "$AGENT3" 2>/dev/null || true
|
|
75
|
-
check_heartbeats_loop "$TASK_ID" "test" "$AGENT3" 2>/dev/null || true
|
|
76
|
-
|
|
77
|
-
if [ "${MISSED_HEARTBEATS[$AGENT3]:-0}" -eq 2 ]; then
|
|
78
|
-
echo "✓ PASS: Counter incremented correctly to 2"
|
|
79
|
-
else
|
|
80
|
-
echo "✗ FAIL: Counter should be 2, got ${MISSED_HEARTBEATS[$AGENT3]:-0}"
|
|
81
|
-
fi
|
|
82
|
-
|
|
83
|
-
##############################################################################
|
|
84
|
-
# Test 4: Counter resets on recovery
|
|
85
|
-
##############################################################################
|
|
86
|
-
echo ""
|
|
87
|
-
echo "Test 4: Counter reset on recovery"
|
|
88
|
-
AGENT4="agent-recover"
|
|
89
|
-
|
|
90
|
-
# Initialize
|
|
91
|
-
LOOP3_AGENTS="$AGENT4"
|
|
92
|
-
|
|
93
|
-
# Miss twice
|
|
94
|
-
check_heartbeats_loop "$TASK_ID" "test" "$AGENT4" 2>/dev/null || true
|
|
95
|
-
check_heartbeats_loop "$TASK_ID" "test" "$AGENT4" 2>/dev/null || true
|
|
96
|
-
|
|
97
|
-
BEFORE="${MISSED_HEARTBEATS[$AGENT4]:-0}"
|
|
98
|
-
|
|
99
|
-
# Set heartbeat
|
|
100
|
-
HB_KEY4="swarm:${TASK_ID}:${AGENT4}:heartbeat"
|
|
101
|
-
redis-cli SET "$HB_KEY4" '{"timestamp": 1234567890, "status": "recovered"}' >/dev/null
|
|
102
|
-
|
|
103
|
-
# Check again
|
|
104
|
-
check_heartbeats_loop "$TASK_ID" "test" "$AGENT4" 2>/dev/null || true
|
|
105
|
-
|
|
106
|
-
AFTER="${MISSED_HEARTBEATS[$AGENT4]:-0}"
|
|
107
|
-
|
|
108
|
-
if [ "$BEFORE" -eq 2 ] && [ "$AFTER" -eq 0 ]; then
|
|
109
|
-
echo "✓ PASS: Counter reset from 2 to 0 on recovery"
|
|
110
|
-
else
|
|
111
|
-
echo "✗ FAIL: Counter should reset (before=$BEFORE, after=$AFTER)"
|
|
112
|
-
fi
|
|
113
|
-
|
|
114
|
-
##############################################################################
|
|
115
|
-
# Cleanup
|
|
116
|
-
##############################################################################
|
|
117
|
-
echo ""
|
|
118
|
-
echo "Cleaning up..."
|
|
119
|
-
redis-cli --scan --pattern "swarm:${TASK_ID}:*" | xargs -r redis-cli DEL >/dev/null 2>&1 || true
|
|
120
|
-
|
|
121
|
-
echo ""
|
|
122
|
-
echo "=========================================="
|
|
123
|
-
echo "Tests complete"
|
|
124
|
-
echo "=========================================="
|
|
@@ -1,166 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
|
|
3
|
-
# Fail on any error
|
|
4
|
-
set -e
|
|
5
|
-
|
|
6
|
-
# Load test utilities
|
|
7
|
-
source "$(dirname "$0")/test-utils.sh"
|
|
8
|
-
|
|
9
|
-
# Ensure Redis is running before tests
|
|
10
|
-
check_redis_connection() {
|
|
11
|
-
if ! redis-cli ping &>/dev/null; then
|
|
12
|
-
echo "ERROR: Redis is not running"
|
|
13
|
-
exit 1
|
|
14
|
-
fi
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
# Clean up Redis test keys after each test
|
|
18
|
-
cleanup_redis_keys() {
|
|
19
|
-
redis-cli del "test:context:key" "test:signal:key" "test:results:key"
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
# Path to scripts under test
|
|
23
|
-
STORE_CONTEXT_SCRIPT="$(dirname "$0")/.claude/skills/cfn-cfn-store-context.sh"
|
|
24
|
-
RETRIEVE_CONTEXT_SCRIPT="$(dirname "$0")/.claude/skills/cfn-cfn-retrieve-context.sh"
|
|
25
|
-
SIGNAL_SCRIPT="$(dirname "$0")/.claude/skills/cfn-cfn-signal.sh"
|
|
26
|
-
COLLECT_RESULTS_SCRIPT="$(dirname "$0")/.claude/skills/cfn-cfn-collect-results.sh"
|
|
27
|
-
|
|
28
|
-
# 1. Test store-context.sh
|
|
29
|
-
test_store_context_happy_path() {
|
|
30
|
-
local test_json='{"key": "value", "nested": {"a": 1}}'
|
|
31
|
-
|
|
32
|
-
# Execute store context
|
|
33
|
-
bash "$STORE_CONTEXT_SCRIPT" \
|
|
34
|
-
--key "test:context:key" \
|
|
35
|
-
--context "$test_json" \
|
|
36
|
-
--ttl 3600
|
|
37
|
-
|
|
38
|
-
# Verify stored context
|
|
39
|
-
stored_context=$(redis-cli get "test:context:key")
|
|
40
|
-
assert_equals "$stored_context" "$test_json" "Context should be stored correctly"
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
test_store_context_empty_data() {
|
|
44
|
-
# Test with empty JSON
|
|
45
|
-
bash "$STORE_CONTEXT_SCRIPT" \
|
|
46
|
-
--key "test:context:key" \
|
|
47
|
-
--context "{}" \
|
|
48
|
-
--ttl 3600
|
|
49
|
-
|
|
50
|
-
stored_context=$(redis-cli get "test:context:key")
|
|
51
|
-
assert_equals "$stored_context" "{}" "Empty context should be stored"
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
test_store_context_special_chars() {
|
|
55
|
-
local test_json='{"special": "value with !@#$%^&*()_+ chars"}'
|
|
56
|
-
|
|
57
|
-
bash "$STORE_CONTEXT_SCRIPT" \
|
|
58
|
-
--key "test:context:key" \
|
|
59
|
-
--context "$test_json" \
|
|
60
|
-
--ttl 3600
|
|
61
|
-
|
|
62
|
-
stored_context=$(redis-cli get "test:context:key")
|
|
63
|
-
assert_equals "$stored_context" "$test_json" "Context with special characters should store correctly"
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
# 2. Test retrieve-context.sh
|
|
67
|
-
test_retrieve_context_existing_key() {
|
|
68
|
-
local test_json='{"key": "retrieve-test"}'
|
|
69
|
-
|
|
70
|
-
# First store the context
|
|
71
|
-
redis-cli set "test:context:key" "$test_json"
|
|
72
|
-
|
|
73
|
-
# Retrieve context
|
|
74
|
-
retrieved_context=$(bash "$RETRIEVE_CONTEXT_SCRIPT" --key "test:context:key")
|
|
75
|
-
|
|
76
|
-
assert_equals "$retrieved_context" "$test_json" "Should retrieve existing context"
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
test_retrieve_context_missing_key() {
|
|
80
|
-
# Ensure key doesn't exist
|
|
81
|
-
redis-cli del "nonexistent:key"
|
|
82
|
-
|
|
83
|
-
# Try to retrieve missing context
|
|
84
|
-
retrieved_context=$(bash "$RETRIEVE_CONTEXT_SCRIPT" --key "nonexistent:key" || echo "")
|
|
85
|
-
|
|
86
|
-
assert_equals "$retrieved_context" "" "Missing key should return empty string"
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
# 3. Test signal.sh
|
|
90
|
-
test_signal_happy_path() {
|
|
91
|
-
bash "$SIGNAL_SCRIPT" \
|
|
92
|
-
--key "test:signal:key" \
|
|
93
|
-
--value "completed" \
|
|
94
|
-
--ttl 3600
|
|
95
|
-
|
|
96
|
-
signaled_value=$(redis-cli get "test:signal:key")
|
|
97
|
-
assert_equals "$signaled_value" "completed" "Signal should be stored correctly"
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
test_signal_empty_value() {
|
|
101
|
-
bash "$SIGNAL_SCRIPT" \
|
|
102
|
-
--key "test:signal:key" \
|
|
103
|
-
--value "" \
|
|
104
|
-
--ttl 3600
|
|
105
|
-
|
|
106
|
-
signaled_value=$(redis-cli get "test:signal:key")
|
|
107
|
-
assert_equals "$signaled_value" "" "Empty signal should be allowed"
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
# 4. Test collect-results.sh
|
|
111
|
-
test_collect_results_multiple_agents() {
|
|
112
|
-
# Clear any existing list
|
|
113
|
-
redis-cli del "test:results:key"
|
|
114
|
-
|
|
115
|
-
# Simulate multiple agent results
|
|
116
|
-
redis-cli rpush "test:results:key" '{"agent1": 0.9}'
|
|
117
|
-
redis-cli rpush "test:results:key" '{"agent2": 0.85}'
|
|
118
|
-
|
|
119
|
-
# Collect results
|
|
120
|
-
results=$(bash "$COLLECT_RESULTS_SCRIPT" --key "test:results:key")
|
|
121
|
-
|
|
122
|
-
# Check if results are correctly collected
|
|
123
|
-
assert_contains "$results" "agent1" "Should collect agent1 result"
|
|
124
|
-
assert_contains "$results" "agent2" "Should collect agent2 result"
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
# Main test runner
|
|
128
|
-
run_tests() {
|
|
129
|
-
check_redis_connection
|
|
130
|
-
|
|
131
|
-
echo "Running Redis Coordination Primitive Tests"
|
|
132
|
-
echo "----------------------------------------"
|
|
133
|
-
|
|
134
|
-
# Run store-context tests
|
|
135
|
-
test_store_context_happy_path
|
|
136
|
-
test_store_context_empty_data
|
|
137
|
-
test_store_context_special_chars
|
|
138
|
-
|
|
139
|
-
# Run retrieve-context tests
|
|
140
|
-
test_retrieve_context_existing_key
|
|
141
|
-
test_retrieve_context_missing_key
|
|
142
|
-
|
|
143
|
-
# Run signal tests
|
|
144
|
-
test_signal_happy_path
|
|
145
|
-
test_signal_empty_value
|
|
146
|
-
|
|
147
|
-
# Run collect results tests
|
|
148
|
-
test_collect_results_multiple_agents
|
|
149
|
-
|
|
150
|
-
# Clean up after tests
|
|
151
|
-
cleanup_redis_keys
|
|
152
|
-
|
|
153
|
-
echo "----------------------------------------"
|
|
154
|
-
echo "All tests passed successfully!"
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
# Execute tests and capture results
|
|
158
|
-
{
|
|
159
|
-
run_tests
|
|
160
|
-
} > /tmp/primitive-test-results.md 2>&1
|
|
161
|
-
|
|
162
|
-
# Confidence calculation (simplistic based on test coverage)
|
|
163
|
-
CONFIDENCE=$(echo "scale=2; 0.9" | bc)
|
|
164
|
-
echo "Test Confidence: $CONFIDENCE" >> /tmp/primitive-test-results.md
|
|
165
|
-
|
|
166
|
-
exit 0
|