import io import json import os from pathlib import Path import pty import signal import subprocess import sys import tempfile import time import unittest from unittest import mock from framebridge_expanded import connection_background as background from framebridge_expanded import tunnel ID = "tunnel_background_fixture" MCP = "http://127.0.0.1:20865/mcp" FAKE = "SYNTHETIC_BACKGROUND_ONLY_0123456789" CLIENT = r''' import datetime,http.server,json,os,sys,time from pathlib import Path started=datetime.datetime.now(datetime.timezone.utc).isoformat() identifier=sys.argv[sys.argv.index('--control-plane.tunnel-id')+1] mcp=sys.argv[sys.argv.index('--mcp.server-url')+1].removeprefix('url=') class Handler(http.server.BaseHTTPRequestHandler): def log_message(self,*args): pass def do_GET(self): if self.path=='/readyz': body=b'ready' elif self.path=='/healthz': body=b'live' elif self.path=='/api/status': body=json.dumps({'control_plane_tunnel_id':identifier,'mcp_server_url':mcp,'started_at':started,'tunnel_metadata':{'ID':identifier}}).encode() elif self.path=='/metrics': body=('commands_poll_last_successful_timestamp_seconds '+str(time.time())+'\n').encode() else: self.send_response(404);self.end_headers();return self.send_response(200);self.end_headers();self.wfile.write(body) server=http.server.HTTPServer(('127.0.0.1',0),Handler) Path(sys.argv[sys.argv.index('--health.url-file')+1]).write_text('http://127.0.0.1:'+str(server.server_port)) print('TECHNICAL_FIXTURE '+os.environ['FRAMEBRIDGE_EXPANDED_RUNTIME_KEY'],flush=True) server.serve_forever() ''' def command(code=CLIENT): return [sys.executable, "-u", "-c", code, "--control-plane.tunnel-id", ID, "--mcp.server-url", "url=" + MCP] class BackgroundTests(unittest.TestCase): def setUp(self): self.temp = tempfile.TemporaryDirectory(prefix="fb-background-test-") self.state = Path(self.temp.name) def tearDown(self): background.disconnect(self.state) self.temp.cleanup() def start(self, wait=10): output = io.StringIO() rc = background.start(command(), FAKE, self.state, output=output, wait_timeout=wait) self.assertEqual(rc, 0, output.getvalue()) return output.getvalue() def test_real_detached_worker_ready_private_logs_and_no_credential_on_disk(self): output = self.start() current = background.status(self.state) self.assertTrue(current["alive"]) self.assertTrue(current["verified"]) self.assertIn("terminal can be closed", output) self.assertNotIn(FAKE, output) self.assertNotIn("TECHNICAL_FIXTURE", output) worker = Path('/proc') / str(current['pid']) self.assertNotIn(FAKE.encode(), (worker / 'cmdline').read_bytes()) self.assertNotIn(FAKE.encode(), (worker / 'environ').read_bytes()) log = self.state / 'logs/chatgpt/connection.log' deadline = time.monotonic()+3 while 'TECHNICAL_FIXTURE' not in log.read_text() and time.monotonic()