85 lines
2.8 KiB
Python
85 lines
2.8 KiB
Python
#!/usr/bin/env python3
|
|
import sys
|
|
import os
|
|
import json
|
|
import time
|
|
import http.server
|
|
import threading
|
|
|
|
# Add PiZeroNoteKeeper to path so we can import kernel
|
|
sys.path.append("/Users/adolforeyna/Projects/PiZeroNoteKeeper")
|
|
from kernel.system import SystemContext
|
|
|
|
# Mock HTTP Server to capture the POST request
|
|
class MockMCPServer(http.server.BaseHTTPRequestHandler):
|
|
received_request = None
|
|
|
|
def do_POST(self):
|
|
if self.path == "/api/mcp":
|
|
content_length = int(self.headers['Content-Length'])
|
|
post_data = self.rfile.read(content_length)
|
|
MockMCPServer.received_request = json.loads(post_data.decode('utf-8'))
|
|
|
|
# Send success response
|
|
self.send_response(200)
|
|
self.send_header('Content-Type', 'application/json')
|
|
self.end_headers()
|
|
self.wfile.write(json.dumps({"jsonrpc": "2.0", "result": "OK", "id": "test"}).encode('utf-8'))
|
|
else:
|
|
self.send_response(404)
|
|
self.end_headers()
|
|
|
|
def log_message(self, format, *args):
|
|
# Suppress logging to keep output clean
|
|
pass
|
|
|
|
def run_test():
|
|
# Start mock server
|
|
server = http.server.HTTPServer(('127.0.0.1', 9999), MockMCPServer)
|
|
server_thread = threading.Thread(target=server.serve_forever, daemon=True)
|
|
server_thread.start()
|
|
print("Mock MCP server running on http://127.0.0.1:9999")
|
|
|
|
# Initialize SystemContext pointing to mock server
|
|
context = SystemContext(target_ip="127.0.0.1", target_port=8081, pin_target=True)
|
|
# Set the discovered/active mcp_port
|
|
context.mcp_port = 9999
|
|
|
|
print("Sending play_beep command...")
|
|
context.play_beep(frequency=1200, duration_ms=40, volume=30)
|
|
|
|
# Wait for background thread to execute the HTTP request
|
|
timeout = 3.0
|
|
start_time = time.time()
|
|
while MockMCPServer.received_request is None and (time.time() - start_time) < timeout:
|
|
time.sleep(0.1)
|
|
|
|
# Shutdown server
|
|
server.shutdown()
|
|
server.server_close()
|
|
|
|
# Assert and verify
|
|
req = MockMCPServer.received_request
|
|
if req is None:
|
|
print("FAIL: No request received by mock MCP server within timeout.")
|
|
sys.exit(1)
|
|
|
|
print("Received request payload:")
|
|
print(json.dumps(req, indent=2))
|
|
|
|
try:
|
|
assert req["jsonrpc"] == "2.0"
|
|
assert req["method"] == "tools/call"
|
|
assert req["params"]["name"] == "play_tone"
|
|
args = req["params"]["arguments"]
|
|
assert args["frequency"] == 1200
|
|
assert args["duration_ms"] == 40
|
|
assert args["volume"] == 30
|
|
print("\nSUCCESS: All request fields verified perfectly!")
|
|
except AssertionError as e:
|
|
print("\nFAIL: Request fields did not match expected values.", e)
|
|
sys.exit(1)
|
|
|
|
if __name__ == "__main__":
|
|
run_test()
|