mirror of
https://github.com/allaunthefox/SilverSight.git
synced 2026-07-31 01:25:21 +00:00
- SidonAdapter.lean: updated Singer construction integration - UnitDistCandidateGen.lean: enhanced golden-angle perturbation - WeightCandidateGen.lean: cmix weight matrix -> ManifoldShortcut - ComplexProjectiveSpace.lean: Kaehler geometry scaffolding - EisensteinSeries.lean: modular forms stub infrastructure - test scripts: concurrency and Lean LLM integration tests
196 lines
No EOL
5.5 KiB
Python
196 lines
No EOL
5.5 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
Test script to verify MCP server handles concurrent agent requests correctly.
|
|
"""
|
|
import json
|
|
import subprocess
|
|
import time
|
|
from threading import Thread
|
|
from queue import Queue
|
|
|
|
SILVERSIGHT = "/home/allaun/SilverSight"
|
|
|
|
def send_mcp_request(request):
|
|
"""Send a request to the MCP server and get response."""
|
|
proc = subprocess.Popen(
|
|
["python3", f"{SILVERSIGHT}/scripts/mcp_autoproof.py", "--stdio"],
|
|
stdin=subprocess.PIPE,
|
|
stdout=subprocess.PIPE,
|
|
stderr=subprocess.PIPE,
|
|
text=True,
|
|
cwd=SILVERSIGHT
|
|
)
|
|
|
|
# Send request
|
|
proc.stdin.write(json.dumps(request) + "\n")
|
|
proc.stdin.flush()
|
|
proc.stdin.close()
|
|
|
|
# Get response
|
|
response = proc.stdout.readline()
|
|
proc.wait()
|
|
|
|
return json.loads(response) if response else None
|
|
|
|
def worker(agent_id, request, results):
|
|
"""Worker function for concurrent testing."""
|
|
print(f"[Agent {agent_id}] Sending request: {request.get('method')}")
|
|
start = time.time()
|
|
|
|
try:
|
|
response = send_mcp_request(request)
|
|
elapsed = time.time() - start
|
|
|
|
if response:
|
|
result = response.get("result", {})
|
|
status = result.get("content", [{}])[0].get("text", "")
|
|
status_json = json.loads(status) if status else {}
|
|
|
|
results.put({
|
|
"agent_id": agent_id,
|
|
"elapsed": elapsed,
|
|
"status": status_json.get("status", "unknown"),
|
|
"message": status_json.get("message", "")[:100]
|
|
})
|
|
print(f"[Agent {agent_id}] Response in {elapsed:.2f}s: {status_json.get('status')}")
|
|
else:
|
|
results.put({
|
|
"agent_id": agent_id,
|
|
"elapsed": elapsed,
|
|
"status": "error",
|
|
"message": "No response"
|
|
})
|
|
print(f"[Agent {agent_id}] No response")
|
|
except Exception as e:
|
|
elapsed = time.time() - start
|
|
results.put({
|
|
"agent_id": agent_id,
|
|
"elapsed": elapsed,
|
|
"status": "error",
|
|
"message": str(e)[:100]
|
|
})
|
|
print(f"[Agent {agent_id}] Error: {e}")
|
|
|
|
def test_concurrent_get_context():
|
|
"""Test multiple agents reading the same file."""
|
|
print("\n=== Test: Concurrent get_sorry_context ===")
|
|
results = Queue()
|
|
threads = []
|
|
|
|
for i in range(3):
|
|
request = {
|
|
"method": "tools/call",
|
|
"params": {
|
|
"name": "get_sorry_context",
|
|
"arguments": {
|
|
"filepath": "formal/CoreFormalism/ComplexProjectiveSpace.lean"
|
|
}
|
|
}
|
|
}
|
|
t = Thread(target=worker, args=(i, request, results))
|
|
threads.append(t)
|
|
t.start()
|
|
time.sleep(0.1) # Small delay to stagger requests
|
|
|
|
for t in threads:
|
|
t.join()
|
|
|
|
print("\nResults:")
|
|
while not results.empty():
|
|
r = results.get()
|
|
print(f" Agent {r['agent_id']}: {r['status']} ({r['elapsed']:.2f}s) - {r['message'][:80]}")
|
|
|
|
def test_concurrent_check_proof():
|
|
"""Test multiple agents checking proofs simultaneously."""
|
|
print("\n=== Test: Concurrent check_proof ===")
|
|
results = Queue()
|
|
threads = []
|
|
|
|
for i in range(2):
|
|
request = {
|
|
"method": "tools/call",
|
|
"params": {
|
|
"name": "check_proof",
|
|
"arguments": {
|
|
"target": "CoreFormalism.ComplexProjectiveSpace"
|
|
}
|
|
}
|
|
}
|
|
t = Thread(target=worker, args=(i, request, results))
|
|
threads.append(t)
|
|
t.start()
|
|
|
|
for t in threads:
|
|
t.join()
|
|
|
|
print("\nResults:")
|
|
while not results.empty():
|
|
r = results.get()
|
|
print(f" Agent {r['agent_id']}: {r['status']} ({r['elapsed']:.2f}s) - {r['message'][:80]}")
|
|
|
|
def test_mixed_operations():
|
|
"""Test mixed operations happening concurrently."""
|
|
print("\n=== Test: Mixed Operations ===")
|
|
results = Queue()
|
|
threads = []
|
|
|
|
requests = [
|
|
{
|
|
"method": "tools/call",
|
|
"params": {
|
|
"name": "get_sorry_context",
|
|
"arguments": {
|
|
"filepath": "formal/CoreFormalism/ComplexProjectiveSpace.lean"
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"method": "tools/call",
|
|
"params": {
|
|
"name": "check_proof",
|
|
"arguments": {
|
|
"target": "CoreFormalism.ComplexProjectiveSpace"
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"method": "tools/call",
|
|
"params": {
|
|
"name": "list_tools",
|
|
"arguments": {}
|
|
}
|
|
}
|
|
]
|
|
|
|
for i, request in enumerate(requests):
|
|
t = Thread(target=worker, args=(i, request, results))
|
|
threads.append(t)
|
|
t.start()
|
|
time.sleep(0.05)
|
|
|
|
for t in threads:
|
|
t.join()
|
|
|
|
print("\nResults:")
|
|
while not results.empty():
|
|
r = results.get()
|
|
print(f" Agent {r['agent_id']}: {r['status']} ({r['elapsed']:.2f}s) - {r['message'][:80]}")
|
|
|
|
def main():
|
|
print("MCP Server Concurrency Test Suite")
|
|
print("=" * 50)
|
|
|
|
# Test 1: Concurrent read operations
|
|
test_concurrent_get_context()
|
|
|
|
# Test 2: Concurrent build operations (should serialize)
|
|
test_concurrent_check_proof()
|
|
|
|
# Test 3: Mixed operations
|
|
test_mixed_operations()
|
|
|
|
print("\n" + "=" * 50)
|
|
print("All tests completed!")
|
|
|
|
if __name__ == "__main__":
|
|
main() |