You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maka.apache.org by as...@apache.org on 2026/08/29 02:50:46 UTC

(maka) branch main updated: test(cli): reuse shared wait budget in tui-mcp-control (#4106)

This is an automated email from the ASF dual-hosted git repository.

Astro-Han pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/maka.git


The following commit(s) were added to refs/heads/main by this push:
     new ff07d1bd5 test(cli): reuse shared wait budget in tui-mcp-control (#4106)
ff07d1bd5 is described below

commit ff07d1bd55eaebcbebcc51feccb4404101af90ec
Author: Enoch <bf...@gmail.com>
AuthorDate: Sat Aug 29 03:50:42 2026 +0100

    test(cli): reuse shared wait budget in tui-mcp-control (#4106)
    
    Replace the local iteration-count waitFor (1000 * setImmediate) with
    the existing shared wall-clock helper from tui-terminal-mock.ts
    (WAIT_BUDGET_MS = 250ms local / 5000ms CI / MAKA_TEST_WAIT_BUDGET_MS).
    Add descriptive timeout messages to all 27 waits and remove the flaky
    local helper. Fixes the race that failed the same-server credential
    retirement transaction under CI load.
    
    Closes #4094
    
    Generated-by: Muse Spark (opencode/muse-spark-1.2-contributor-free)
---
 packages/cli/src/__tests__/tui-mcp-control.test.ts | 132 ++++++++++++++++-----
 1 file changed, 100 insertions(+), 32 deletions(-)

diff --git a/packages/cli/src/__tests__/tui-mcp-control.test.ts b/packages/cli/src/__tests__/tui-mcp-control.test.ts
index d8836dcf9..f4f788d25 100644
--- a/packages/cli/src/__tests__/tui-mcp-control.test.ts
+++ b/packages/cli/src/__tests__/tui-mcp-control.test.ts
@@ -30,6 +30,7 @@ import type {
 } from '@maka/runtime-host/client';
 import { createMcpConfigStore } from '@maka/storage/mcp-config-store';
 import { createTuiMcpController } from '../tui-mcp-control.js';
+import { waitFor } from './tui-terminal-mock.js';
 
 test('TUI MCP startup stays backgrounded and publishes the discovered snapshot', async () => {
   const config = deferredValue<McpConfigFile>();
@@ -47,7 +48,10 @@ test('TUI MCP startup stays backgrounded and publishes the discovered snapshot',
   assert.equal(controller.snapshot().initialization, 'loading');
   assert.equal(connection.replacements.length, 0);
   config.resolve(emptyConfig());
-  await waitFor(() => controller.snapshot().publication === 'published');
+  await waitFor(
+    () => controller.snapshot().publication === 'published',
+    "TUI MCP startup publication to reach 'published'",
+  );
   assert.equal(controller.snapshot().initialization, 'ready');
   assert.equal(controller.snapshot().toolCount, 1);
   assert.deepEqual(controller.snapshot().servers, [
@@ -89,11 +93,20 @@ test('TUI MCP publication coalesces a discovery change behind the in-flight revi
     },
   );
 
-  await waitFor(() => connection.replacements.length === 1);
+  await waitFor(
+    () => connection.replacements.length === 1,
+    'first capability publication before revision change',
+  );
   manager.changeRevision(2);
   firstPublication.resolve();
-  await waitFor(() => connection.replacements.length === 2);
-  await waitFor(() => controller.snapshot().publication === 'published');
+  await waitFor(
+    () => connection.replacements.length === 2,
+    'second capability publication after coalesced revision',
+  );
+  await waitFor(
+    () => controller.snapshot().publication === 'published',
+    "coalesced TUI MCP publication to reach 'published'",
+  );
   assert.deepEqual(providers, ['provider-1', 'provider-2']);
   await controller.close();
 });
@@ -110,12 +123,21 @@ test('TUI MCP invalidates a lost generation and republishes on its replacement',
     },
   );
 
-  await waitFor(() => connection.replacements.length === 1);
+  await waitFor(
+    () => connection.replacements.length === 1,
+    'first capability publication before host unavailable',
+  );
   connection.emit({ kind: 'unavailable' });
   assert.equal(controller.snapshot().publication, 'host_unavailable');
   connection.emit({ kind: 'connected', hostEpoch: 'host-2', connectionId: 'connection-2' });
-  await waitFor(() => connection.replacements.length === 2);
-  await waitFor(() => controller.snapshot().publication === 'published');
+  await waitFor(
+    () => connection.replacements.length === 2,
+    'second capability publication after generation replacement',
+  );
+  await waitFor(
+    () => controller.snapshot().publication === 'published',
+    "TUI MCP publication to reach 'published' after generation replacement",
+  );
   await controller.close();
 });
 
@@ -132,9 +154,15 @@ test('TUI MCP unregisters the current generation when discovery removes every to
     },
   );
 
-  await waitFor(() => controller.snapshot().publication === 'published');
+  await waitFor(
+    () => controller.snapshot().publication === 'published',
+    "initial TUI MCP publication to reach 'published' before empty snapshot",
+  );
   manager.changeRevision(2, 0);
-  await waitFor(() => controller.snapshot().publication === 'not_published');
+  await waitFor(
+    () => controller.snapshot().publication === 'not_published',
+    "TUI MCP publication to reach 'not_published' after empty tool snapshot",
+  );
   assert.equal(connection.unregisters, 1);
   await controller.close();
   assert.equal(connection.unregisters, 1);
@@ -154,7 +182,10 @@ test('TUI MCP fails closed when its saved config cannot be read', async () => {
     },
   );
 
-  await waitFor(() => controller.snapshot().initialization === 'error');
+  await waitFor(
+    () => controller.snapshot().initialization === 'error',
+    "TUI MCP initialization to reach 'error' when config read fails",
+  );
   assert.equal(controller.snapshot().publication, 'not_published');
   assert.equal(JSON.stringify(controller.snapshot()).includes('secret-value'), false);
   assert.equal(connection.replacements.length, 0);
@@ -178,7 +209,10 @@ test('TUI MCP unregisters a publication that settles while close is waiting', as
     },
   );
 
-  await waitFor(() => connection.replacements.length === 1);
+  await waitFor(
+    () => connection.replacements.length === 1,
+    'initial capability publication before close',
+  );
   const closing = controller.close();
   publication.resolve();
   await closing;
@@ -199,7 +233,10 @@ test('TUI MCP add commits before manager synchronization and reports Host conver
       createProvider: () => undefined,
     },
   );
-  await waitFor(() => controller.snapshot().initialization === 'ready');
+  await waitFor(
+    () => controller.snapshot().initialization === 'ready',
+    "TUI MCP initialization to reach 'ready' before add",
+  );
   order.length = 0;
 
   const result = await controller.execute({
@@ -235,7 +272,10 @@ test('TUI MCP retires endpoint credentials before persistence and aborts on clea
     { workspaceRoot: '/unused', connection: connection.connection },
     { configStore: store.store, manager: manager.manager, createProvider: () => undefined },
   );
-  await waitFor(() => controller.snapshot().initialization === 'ready');
+  await waitFor(
+    () => controller.snapshot().initialization === 'ready',
+    "TUI MCP initialization to reach 'ready' before credential-retiring edit",
+  );
   order.length = 0;
   const edit = controller.configForEdit('docs');
   assert.ok(edit);
@@ -267,7 +307,10 @@ test('TUI MCP rejects an invalid endpoint before retiring the previous credentia
     { workspaceRoot: '/unused', connection: connection.connection },
     { configStore: store.store, manager: manager.manager, createProvider: () => undefined },
   );
-  await waitFor(() => controller.snapshot().initialization === 'ready');
+  await waitFor(
+    () => controller.snapshot().initialization === 'ready',
+    "TUI MCP initialization to reach 'ready' before invalid edit",
+  );
   const edit = controller.configForEdit('docs');
   assert.ok(edit);
   order.length = 0;
@@ -297,7 +340,10 @@ test('TUI MCP edit rejects a stale revision without touching credentials or disk
     { workspaceRoot: '/unused', connection: connection.connection },
     { configStore: store.store, manager: manager.manager, createProvider: () => undefined },
   );
-  await waitFor(() => controller.snapshot().initialization === 'ready');
+  await waitFor(
+    () => controller.snapshot().initialization === 'ready',
+    "TUI MCP initialization to reach 'ready' before stale-revision edit",
+  );
   const edit = controller.configForEdit('docs');
   assert.ok(edit);
   store.replace({ version: 3, mcpServers: { docs: { url: 'https://other.example/mcp' } } });
@@ -327,7 +373,10 @@ test('TUI MCP import preserves unrelated external edits and rejects changed prev
     { workspaceRoot: '/unused', connection: connection.connection },
     { configStore: store.store, manager: manager.manager, createProvider: () => undefined },
   );
-  await waitFor(() => controller.snapshot().initialization === 'ready');
+  await waitFor(
+    () => controller.snapshot().initialization === 'ready',
+    "TUI MCP initialization to reach 'ready' before import preview",
+  );
   const preview = controller.previewImport('{"docs":{"url":"https://docs.example/mcp"}}');
   assert.equal(preview.status, 'ready');
   if (preview.status !== 'ready') throw new Error('preview did not prepare');
@@ -376,7 +425,10 @@ test('TUI MCP keeps a durable mutation visible when manager synchronization fail
     { workspaceRoot: '/unused', connection: connection.connection },
     { configStore: store.store, manager: manager.manager, createProvider: () => undefined },
   );
-  await waitFor(() => controller.snapshot().initialization === 'ready');
+  await waitFor(
+    () => controller.snapshot().initialization === 'ready',
+    "TUI MCP initialization to reach 'ready' before sync-failed mutation",
+  );
   manager.failNextSync();
 
   const result = await controller.execute({
@@ -410,7 +462,10 @@ test('TUI MCP reports a committed action as pending while the Host is unavailabl
     { workspaceRoot: '/unused', connection: connection.connection },
     { configStore: store.store, manager: manager.manager, createProvider: () => undefined },
   );
-  await waitFor(() => controller.snapshot().initialization === 'ready');
+  await waitFor(
+    () => controller.snapshot().initialization === 'ready',
+    "TUI MCP initialization to reach 'ready' while host unavailable",
+  );
 
   assert.deepEqual(
     await controller.execute({ kind: 'add', serverId: 'local', config: { command: 'server' } }),
@@ -445,13 +500,16 @@ test('TUI MCP close fences an admitted mutation before persistence', async () =>
     { workspaceRoot: '/unused', connection: connection.connection },
     { configStore: store, manager: manager.manager, createProvider: () => undefined },
   );
-  await waitFor(() => controller.snapshot().initialization === 'ready');
+  await waitFor(
+    () => controller.snapshot().initialization === 'ready',
+    "TUI MCP initialization to reach 'ready' before fenced mutation",
+  );
   const executing = controller.execute({
     kind: 'add',
     serverId: 'late',
     config: { command: 'server' },
   });
-  await waitFor(() => transforms === 1);
+  await waitFor(() => transforms === 1, 'config transform to be admitted before close fence');
   const closing = controller.close();
   transactionAdmission.resolve();
 
@@ -493,7 +551,10 @@ test('TUI MCP waits for manager synchronization before publishing an action snap
     { workspaceRoot: '/unused', connection: connection.connection },
     { configStore: store.store, manager, createProvider: () => provider('provider') },
   );
-  await waitFor(() => controller.snapshot().publication === 'published');
+  await waitFor(
+    () => controller.snapshot().publication === 'published',
+    "initial TUI MCP publication to reach 'published' before action sync",
+  );
   connection.replacements.length = 0;
 
   const executing = controller.execute({
@@ -501,7 +562,10 @@ test('TUI MCP waits for manager synchronization before publishing an action snap
     serverId: 'local',
     config: { command: 'server' },
   });
-  await waitFor(() => syncCount === 2);
+  await waitFor(
+    () => syncCount === 2,
+    'manager sync to reach count 2 before publishing action snapshot',
+  );
   assert.equal(connection.replacements.length, 0);
   assert.equal(controller.snapshot().configuration, 'synchronizing');
   actionSync.resolve();
@@ -534,7 +598,10 @@ test('TUI MCP rebases an action over an unrelated concurrent config edit', async
     { workspaceRoot: '/unused', connection: connection.connection },
     { configStore: store, manager: manager.manager, createProvider: () => undefined },
   );
-  await waitFor(() => controller.snapshot().initialization === 'ready');
+  await waitFor(
+    () => controller.snapshot().initialization === 'ready',
+    "TUI MCP initialization to reach 'ready' before rebased concurrent edit",
+  );
 
   assert.deepEqual(
     await controller.execute({ kind: 'add', serverId: 'local', config: { command: 'server' } }),
@@ -569,6 +636,7 @@ test('independent TUI controllers preserve concurrent additions in one workspace
   );
   await waitFor(
     () => left.snapshot().initialization === 'ready' && right.snapshot().initialization === 'ready',
+    "both TUI controllers to reach 'ready' before concurrent additions",
   );
 
   const [leftResult, rightResult] = await Promise.all([
@@ -609,6 +677,7 @@ test('same-server credential retirement stays inside the shared config transacti
   );
   await waitFor(
     () => left.snapshot().initialization === 'ready' && right.snapshot().initialization === 'ready',
+    "both TUI controllers to reach 'ready' before credential-retirement transaction",
   );
   const leftEdit = left.configForEdit('docs');
   const rightEdit = right.configForEdit('docs');
@@ -621,7 +690,10 @@ test('same-server credential retirement stays inside the shared config transacti
     expectedRevision: leftEdit.revision,
     config: { url: 'https://left.example/mcp' },
   });
-  await waitFor(() => leftOrder.includes('forget:docs'));
+  await waitFor(
+    () => leftOrder.includes('forget:docs'),
+    'left controller to retire credentials inside the shared config transaction',
+  );
   const second = right.execute({
     kind: 'edit',
     serverId: 'docs',
@@ -658,7 +730,10 @@ test('TUI MCP manages enabled state, tests, reconnects, and removes through one
     { workspaceRoot: '/unused', connection: connection.connection },
     { configStore: store.store, manager: manager.manager, createProvider: () => undefined },
   );
-  await waitFor(() => controller.snapshot().initialization === 'ready');
+  await waitFor(
+    () => controller.snapshot().initialization === 'ready',
+    "TUI MCP initialization to reach 'ready' before enabled/test/reconnect/remove lane",
+  );
   order.length = 0;
 
   assert.deepEqual(
@@ -895,13 +970,6 @@ function configStoreHarness(get: () => Promise<McpConfigFile>) {
   };
 }
 
-async function waitFor(condition: () => boolean): Promise<void> {
-  for (let attempt = 0; attempt < 1_000 && !condition(); attempt += 1) {
-    await new Promise<void>((resolve) => setImmediate(resolve));
-  }
-  assert.ok(condition());
-}
-
 function deferred() {
   let resolve!: () => void;
   const promise = new Promise<void>((settle) => {


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@maka.apache.org
For additional commands, e-mail: commits-help@maka.apache.org