Skip to content

Commit b7375ee

Browse files
committed
Fix race conditions and data integrity issues
CONCURRENCY FIXES: - Thread-safe ID generation with atomic counters and entropy - Collision detection in bulk operations - Process ID and machine ID for distributed uniqueness - Fixed mock to return actual IDs instead of hardcoded values DATA INTEGRITY FIXES: - Metadata round-trip corruption resolved - JSON parsing/stringification now properly handled - Complex objects (numbers, booleans, nested) preserved - All node property retrieval now includes metadata parsing ID GENERATION IMPROVEMENTS: - Format: prefix_timestamp_machineId_processId_sequence_random - Atomic sequence counter prevents race conditions - Crypto-random components for additional entropy - Validation functions to detect potential collisions TESTING IMPROVEMENTS: - Race condition tests now pass (0 duplicate IDs in 50 concurrent operations) - Data integrity tests pass (42 remains 42, not undefined) - Mock properly respects input parameters
1 parent d12ee9f commit b7375ee

28 files changed

Lines changed: 3810 additions & 189 deletions
Lines changed: 269 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,269 @@
1+
name: Chaos Testing
2+
3+
on:
4+
push:
5+
branches: [main, dev, dev-*]
6+
pull_request:
7+
branches: [main, dev]
8+
schedule:
9+
# Run chaos tests daily at 2 AM UTC
10+
- cron: '0 2 * * *'
11+
workflow_dispatch:
12+
inputs:
13+
intensity:
14+
description: 'Chaos testing intensity'
15+
required: true
16+
default: 'normal'
17+
type: choice
18+
options:
19+
- light
20+
- normal
21+
- aggressive
22+
23+
jobs:
24+
chaos-testing:
25+
name: Chaos Testing - Edge Cases & Resilience
26+
runs-on: ubuntu-latest
27+
28+
strategy:
29+
matrix:
30+
node-version: [18, 20, 21]
31+
fail-fast: false # Continue testing other versions even if one fails
32+
33+
services:
34+
neo4j:
35+
image: neo4j:5.15-community
36+
env:
37+
NEO4J_AUTH: neo4j/graphdone_password
38+
NEO4J_PLUGINS: '["apoc"]'
39+
NEO4J_apoc_export_file_enabled: true
40+
NEO4J_apoc_import_file_enabled: true
41+
NEO4J_apoc_import_file_use__neo4j__config: true
42+
ports:
43+
- 7474:7474
44+
- 7687:7687
45+
options: >-
46+
--health-cmd "wget --no-verbose --tries=1 --spider localhost:7474 || exit 1"
47+
--health-interval 30s
48+
--health-timeout 10s
49+
--health-retries 10
50+
51+
steps:
52+
- name: Checkout code
53+
uses: actions/checkout@v4
54+
55+
- name: Setup Node.js ${{ matrix.node-version }}
56+
uses: actions/setup-node@v4
57+
with:
58+
node-version: ${{ matrix.node-version }}
59+
cache: 'npm'
60+
61+
- name: Install dependencies
62+
run: |
63+
npm ci
64+
cd packages/mcp-server
65+
npm ci
66+
67+
- name: Wait for Neo4j to be ready
68+
run: |
69+
timeout 300 bash -c 'until curl -f -s -I http://localhost:7474; do echo "Waiting for Neo4j..."; sleep 5; done'
70+
echo "Neo4j is ready!"
71+
72+
- name: Verify Neo4j connection
73+
run: |
74+
curl -u neo4j:graphdone_password \
75+
-H "Content-Type: application/json" \
76+
-d '{"statements":[{"statement":"RETURN 1 as test"}]}' \
77+
http://localhost:7474/db/neo4j/tx/commit
78+
79+
- name: Run standard tests first
80+
working-directory: packages/mcp-server
81+
run: |
82+
npm run lint
83+
npm run typecheck
84+
npm run test
85+
86+
- name: Set chaos testing intensity
87+
id: chaos-config
88+
run: |
89+
INTENSITY="${{ github.event.inputs.intensity || 'normal' }}"
90+
echo "intensity=$INTENSITY" >> $GITHUB_OUTPUT
91+
92+
case $INTENSITY in
93+
light)
94+
echo "iterations=1" >> $GITHUB_OUTPUT
95+
echo "memory_limit=512" >> $GITHUB_OUTPUT
96+
echo "timeout=60" >> $GITHUB_OUTPUT
97+
;;
98+
aggressive)
99+
echo "iterations=5" >> $GITHUB_OUTPUT
100+
echo "memory_limit=128" >> $GITHUB_OUTPUT
101+
echo "timeout=300" >> $GITHUB_OUTPUT
102+
;;
103+
*)
104+
echo "iterations=3" >> $GITHUB_OUTPUT
105+
echo "memory_limit=256" >> $GITHUB_OUTPUT
106+
echo "timeout=120" >> $GITHUB_OUTPUT
107+
;;
108+
esac
109+
110+
- name: Run Chaos Testing Suite
111+
working-directory: packages/mcp-server
112+
timeout-minutes: 10
113+
env:
114+
NODE_OPTIONS: "--max-old-space-size=${{ steps.chaos-config.outputs.memory_limit }}"
115+
CHAOS_ITERATIONS: ${{ steps.chaos-config.outputs.iterations }}
116+
NEO4J_URI: bolt://localhost:7687
117+
NEO4J_USERNAME: neo4j
118+
NEO4J_PASSWORD: graphdone_password
119+
run: |
120+
echo "🔥 Running chaos tests with intensity: ${{ steps.chaos-config.outputs.intensity }}"
121+
npm run test:chaos
122+
123+
- name: Run Resource Stress Test
124+
working-directory: packages/mcp-server
125+
timeout-minutes: 5
126+
run: |
127+
echo "🧪 Testing under resource constraints..."
128+
129+
# Memory pressure test
130+
node --max-old-space-size=128 node_modules/.bin/vitest --run tests/chaos-testing.test.ts
131+
132+
# CPU pressure test (run multiple instances)
133+
for i in {1..3}; do
134+
npm run test:chaos &
135+
done
136+
wait
137+
138+
- name: Run Real Database Chaos Tests
139+
working-directory: packages/mcp-server
140+
timeout-minutes: 8
141+
env:
142+
NEO4J_URI: bolt://localhost:7687
143+
NEO4J_USERNAME: neo4j
144+
NEO4J_PASSWORD: graphdone_password
145+
run: |
146+
echo "🗄️ Running database chaos tests..."
147+
148+
# Concurrent database operations
149+
for i in {1..3}; do
150+
npm test -- tests/real-database-integration.test.ts &
151+
done
152+
wait
153+
154+
# Connection limit testing
155+
echo "Testing connection limits..."
156+
npm test -- tests/real-database-integration.test.ts
157+
158+
- name: Run Network Chaos Simulation
159+
working-directory: packages/mcp-server
160+
run: |
161+
echo "🌐 Simulating network chaos..."
162+
163+
# Timeout pressure
164+
timeout 30s npm run test:chaos || echo "Timeout test completed"
165+
166+
# Rapid requests
167+
for i in {1..10}; do
168+
npm run test:chaos > /dev/null 2>&1 &
169+
done
170+
wait || echo "Rapid request test completed"
171+
172+
- name: System Resource Analysis
173+
if: always()
174+
run: |
175+
echo "📊 System Resource Analysis:"
176+
echo "=========================="
177+
echo "Memory usage:"
178+
free -h
179+
echo ""
180+
echo "Disk usage:"
181+
df -h
182+
echo ""
183+
echo "Process information:"
184+
ps aux --sort=-%cpu | head -10
185+
186+
- name: Generate Chaos Test Report
187+
if: always()
188+
working-directory: packages/mcp-server
189+
run: |
190+
echo "📋 Chaos Testing Report" > chaos-report.md
191+
echo "======================" >> chaos-report.md
192+
echo "" >> chaos-report.md
193+
echo "**Test Configuration:**" >> chaos-report.md
194+
echo "- Node.js Version: ${{ matrix.node-version }}" >> chaos-report.md
195+
echo "- Intensity: ${{ steps.chaos-config.outputs.intensity }}" >> chaos-report.md
196+
echo "- Memory Limit: ${{ steps.chaos-config.outputs.memory_limit }}MB" >> chaos-report.md
197+
echo "- Iterations: ${{ steps.chaos-config.outputs.iterations }}" >> chaos-report.md
198+
echo "" >> chaos-report.md
199+
echo "**System Info:**" >> chaos-report.md
200+
echo '```' >> chaos-report.md
201+
uname -a >> chaos-report.md
202+
node --version >> chaos-report.md
203+
npm --version >> chaos-report.md
204+
echo '```' >> chaos-report.md
205+
206+
- name: Upload Chaos Test Results
207+
if: always()
208+
uses: actions/upload-artifact@v4
209+
with:
210+
name: chaos-test-results-node-${{ matrix.node-version }}
211+
path: |
212+
packages/mcp-server/chaos-report.md
213+
packages/mcp-server/coverage/
214+
retention-days: 30
215+
216+
chaos-summary:
217+
name: Chaos Testing Summary
218+
needs: chaos-testing
219+
runs-on: ubuntu-latest
220+
if: always()
221+
222+
steps:
223+
- name: Check chaos testing results
224+
run: |
225+
echo "🎯 Chaos Testing Complete!"
226+
echo "========================="
227+
228+
if [ "${{ needs.chaos-testing.result }}" == "success" ]; then
229+
echo "✅ All chaos tests passed! System shows excellent resilience."
230+
echo "CHAOS_STATUS=success" >> $GITHUB_ENV
231+
elif [ "${{ needs.chaos-testing.result }}" == "failure" ]; then
232+
echo "❌ Some chaos tests failed. System needs resilience improvements."
233+
echo "CHAOS_STATUS=failure" >> $GITHUB_ENV
234+
else
235+
echo "⚠️ Chaos testing was cancelled or had other issues."
236+
echo "CHAOS_STATUS=cancelled" >> $GITHUB_ENV
237+
fi
238+
239+
- name: Comment on PR (if applicable)
240+
if: github.event_name == 'pull_request'
241+
uses: actions/github-script@v7
242+
with:
243+
script: |
244+
const status = process.env.CHAOS_STATUS;
245+
let message = "## 🔥 Chaos Testing Results\n\n";
246+
247+
if (status === 'success') {
248+
message += "✅ **All chaos tests passed!** Your code shows excellent resilience to edge cases and unexpected inputs.\n\n";
249+
message += "The system successfully handled:\n";
250+
message += "- Extreme input values\n";
251+
message += "- Memory pressure scenarios\n";
252+
message += "- Concurrent operations\n";
253+
message += "- Network timeouts\n";
254+
message += "- Resource exhaustion\n";
255+
} else if (status === 'failure') {
256+
message += "⚠️ **Some chaos tests failed.** The system may need improvements in resilience.\n\n";
257+
message += "Please check the chaos test artifacts for detailed failure analysis.\n";
258+
} else {
259+
message += "❓ **Chaos testing was inconclusive.** Please check the workflow logs.\n";
260+
}
261+
262+
message += "\n📊 **Test Coverage:** Edge cases, boundary conditions, type safety, concurrency, and resource limits.";
263+
264+
github.rest.issues.createComment({
265+
issue_number: context.issue.number,
266+
owner: context.repo.owner,
267+
repo: context.repo.repo,
268+
body: message
269+
});

0 commit comments

Comments
 (0)