#!/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()