Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 3 additions & 8 deletions packages/daemon-contracts/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -32,10 +32,6 @@
"types": "./src/daemon-registration.ts",
"default": "./src/daemon-registration.ts"
},
"./daemon-registration-fixtures": {
"types": "./src/daemon-registration.fixtures.ts",
"default": "./src/daemon-registration.fixtures.ts"
},
"./daemon-registration-owner": {
"types": "./src/daemon-registration-owner.ts",
"default": "./src/daemon-registration-owner.ts"
Expand All @@ -60,10 +56,6 @@
"types": "./src/device-claims.ts",
"default": "./src/device-claims.ts"
},
"./device-claims-fixtures": {
"types": "./src/device-claims.fixtures.ts",
"default": "./src/device-claims.fixtures.ts"
},
"./provider-credentials": {
"types": "./src/provider-credentials.ts",
"default": "./src/provider-credentials.ts"
Expand All @@ -80,5 +72,8 @@
"types": "./src/session-repair-tombstone.ts",
"default": "./src/session-repair-tombstone.ts"
}
},
"devDependencies": {
"@agent-device/test-kit": "workspace:*"
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import path from 'node:path';
import { afterEach, beforeEach, test } from 'vitest';
import { emitDiagnostic } from '@agent-device/host-kit/diagnostics';
import { withDaemonDiagnosticsScope } from './daemon-diagnostics-scope.ts';
import { mkdtempForTestSync } from './tmp-dir.fixtures.ts';
import { mkdtempForTestSync } from '@agent-device/test-kit';

let dir: string;
let logPath: string;
Expand Down
2 changes: 1 addition & 1 deletion packages/daemon-contracts/src/daemon-policy-file.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import path from 'node:path';
import { expect, test } from 'vitest';
import { commandDescriptors } from '@agent-device/command-registry/registry';
import type { CommandDescriptor } from '@agent-device/command-registry/types';
import { mkdtempForTestSync } from './tmp-dir.fixtures.ts';
import { mkdtempForTestSync } from '@agent-device/test-kit';
import { DAEMON_POLICY_ENV, loadDaemonPolicy, parseDaemonPolicy } from './daemon-policy-file.ts';

const SOURCE = '/etc/agent-device/policy.json';
Expand Down
3 changes: 1 addition & 2 deletions packages/daemon-contracts/src/daemon-registration.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,7 @@ import {
readRegisteredDaemonIdentity,
readRegisteredDaemonOwnership,
} from './daemon-registration.ts';
import { publishDaemonRegistration } from './daemon-registration.fixtures.ts';
import { mkdtempForTestSync } from './tmp-dir.fixtures.ts';
import { mkdtempForTestSync, publishDaemonRegistration } from '@agent-device/test-kit';

const roots: string[] = [];

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import path from 'node:path';
import { expect, test } from 'vitest';
import type { DeviceLease } from '@agent-device/contracts/device';
import { readDaemonShutdownReport, buildDaemonShutdownReport } from './daemon-shutdown-report.ts';
import { mkdtempForTestSync } from './tmp-dir.fixtures.ts';
import { mkdtempForTestSync } from '@agent-device/test-kit';

const claim = {
deviceKey: 'local:android:none:emulator-5554',
Expand Down
2 changes: 1 addition & 1 deletion packages/daemon-contracts/src/daemon-stop.test.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import fs from 'node:fs';
import { afterEach, expect, test, vi } from 'vitest';
import { mkdtempForTestSync } from './tmp-dir.fixtures.ts';
import { mkdtempForTestSync } from '@agent-device/test-kit';

const mocks = vi.hoisted(() => ({ stopAndRetireDaemon: vi.fn() }));
vi.mock('./daemon-registration-owner.ts', () => ({
Expand Down
21 changes: 21 additions & 0 deletions packages/daemon-contracts/src/device-claim-paths.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import path from 'node:path';
import { expect, test, vi } from 'vitest';
import { deviceClaimFilePath } from '@agent-device/test-kit';
import { resolveDeviceClaimPath } from './device-claim-paths.ts';

const DEVICE_KEYS = ['local:android:none:emulator-5554', 'local:ios:ios:ABCD-1234'];

test('the claim file path test-kit restates matches the production resolver', () => {
vi.stubEnv('AGENT_DEVICE_CLAIMS_DIR', '');
for (const key of DEVICE_KEYS) {
expect(deviceClaimFilePath(key)).toBe(resolveDeviceClaimPath(key));
}
});

test('the restated path follows the claims directory override like the resolver', () => {
vi.stubEnv('AGENT_DEVICE_CLAIMS_DIR', path.join('relative', 'claims'));
for (const key of DEVICE_KEYS) {
expect(deviceClaimFilePath(key)).toBe(resolveDeviceClaimPath(key));
expect(path.isAbsolute(deviceClaimFilePath(key))).toBe(true);
}
});
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { createDeviceClaimReconciler } from '@agent-device/daemon-contracts/device-claims-fixtures';
import { createDeviceClaimReconciler } from './device-claim-reconciliation.ts';
import { appLogResourceStore } from '@agent-device/capture-kit/app-log-durable-resource';
import fs from 'node:fs';
import path from 'node:path';
Expand All @@ -15,7 +15,7 @@ import {
mkdtempForTestSync,
unavailableDeploymentSnapshotAndShutdownOperationFacts,
} from '@agent-device/test-kit';
import type { DeviceClaim } from '@agent-device/daemon-contracts/device-claims';
import type { DeviceClaim } from './device-claims.ts';

const scope = {
signal: new AbortController().signal,
Expand Down
2 changes: 0 additions & 2 deletions packages/daemon-contracts/src/device-claims.fixtures.ts

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import fs from 'node:fs';
import path from 'node:path';
import { AppError } from '@agent-device/kernel/errors';
import { requireManagedSessionArtifactPath, resolveSessionDir } from './session-artifact-paths.ts';
import { mkdtempForTestSync } from './tmp-dir.fixtures.ts';
import { mkdtempForTestSync } from '@agent-device/test-kit';

test('resolveSessionDir keeps every session dir beneath the sessions dir', () => {
const sessionsDir = path.join(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import fs from 'node:fs';
import path from 'node:path';
import { expect, test } from 'vitest';
import { AppError } from '@agent-device/kernel/errors';
import { mkdtempForTestSync } from './tmp-dir.fixtures.ts';
import { mkdtempForTestSync } from '@agent-device/test-kit';
import {
findUnrecoveredRepairCommitFailure,
readRepairTombstoneFile,
Expand Down
12 changes: 0 additions & 12 deletions packages/daemon-contracts/src/tmp-dir.fixtures.ts

This file was deleted.

3 changes: 2 additions & 1 deletion packages/daemon-contracts/tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
{ "path": "../command-registry" },
{ "path": "../contracts" },
{ "path": "../host-kit" },
{ "path": "../kernel" }
{ "path": "../kernel" },
{ "path": "../test-kit" }
]
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { resolveDeviceClaimPath } from '@agent-device/daemon-contracts/device-claims-fixtures';
import { ANDROID_EMULATOR, deviceClaimFilePath } from '@agent-device/test-kit';
import { expect, test } from 'vitest';
import {
daemonPlatformServicesFixture,
Expand All @@ -8,7 +8,6 @@ import fs from 'node:fs';
import path from 'node:path';
import { localRuntimeOwner, providerRuntimeOwner } from '@agent-device/contracts/platform-runtime';
import { asAppError } from '@agent-device/kernel/errors';
import { ANDROID_EMULATOR } from '@agent-device/test-kit';
import {
isolatedDeviceClaimStores,
retainOrphanedDeviceClaims,
Expand Down Expand Up @@ -168,7 +167,7 @@ test('an ordinary owner is refused for an unknown-schema claim record, not waved
const { stateDir, claimsDir } = setup();
fs.mkdirSync(claimsDir, { recursive: true });
const deviceKey = canonicalLocalDeviceKey(ANDROID_EMULATOR);
const claimPath = resolveDeviceClaimPath(deviceKey);
const claimPath = deviceClaimFilePath(deviceKey);
const record = JSON.stringify({
schemaVersion: 3,
deviceKey,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,9 @@
import { resolveDeviceClaimPath } from '@agent-device/daemon-contracts/device-claims-fixtures';
import {
deviceClaimFilePath,
mkdtempForTestSync,
pinOwnProcessStartTime,
publishDaemonRegistration,
} from '@agent-device/test-kit';
import assert from 'node:assert/strict';
import fs from 'node:fs';

Expand All @@ -8,9 +13,6 @@ import { reconcileOrphanedDeviceClaims } from '@agent-device/daemon-contracts/de
import { acquireProcessLock } from '@agent-device/host-kit/file';
import * as hostProcess from '@agent-device/host-kit/process';
import { readCurrentOwnerIdentity } from '@agent-device/host-kit/process';
import { publishDaemonRegistration } from '@agent-device/daemon-contracts/daemon-registration-fixtures';

import { mkdtempForTestSync, pinOwnProcessStartTime } from '@agent-device/test-kit';

pinOwnProcessStartTime(hostProcess);

Expand All @@ -29,7 +31,7 @@ function writeClaim(
): void {
const deviceKey = `local:android:none:${fileName}`;
fs.writeFileSync(
resolveDeviceClaimPath(deviceKey),
deviceClaimFilePath(deviceKey),
JSON.stringify({
schemaVersion: 1,
deviceKey,
Expand Down Expand Up @@ -67,7 +69,7 @@ test('reconciles claims whose owner is gone and keeps every other claim', async
process.cwd(),
);

const claimPathFor = (name: string) => resolveDeviceClaimPath(`local:android:none:${name}`);
const claimPathFor = (name: string) => deviceClaimFilePath(`local:android:none:${name}`);
assert.deepEqual(summary, { examined: 1, reconciled: 1, retained: 0, changed: 0 });
assert.equal(fs.existsSync(claimPathFor('dead.json')), false);
assert.equal(fs.existsSync(claimPathFor('live.json')), true);
Expand Down Expand Up @@ -103,7 +105,7 @@ test('leaves a live successor written while the reconciliation waited for the cl
process.env.AGENT_DEVICE_CLAIMS_DIR = claimsDir;
const owner = readCurrentOwnerIdentity();
const deviceKey = 'local:android:none:contested';
const claimPath = resolveDeviceClaimPath(deviceKey);
const claimPath = deviceClaimFilePath(deviceKey);
const writeContested = (ownerPid: number, ownerStartTime: string | null, token: string) => {
fs.writeFileSync(
claimPath,
Expand Down Expand Up @@ -175,10 +177,7 @@ test('reconciles a claim whose owning daemon was replaced while still running',
);

assert.deepEqual(summary, { examined: 1, reconciled: 1, retained: 0, changed: 0 });
assert.equal(
fs.existsSync(resolveDeviceClaimPath('local:android:none:superseded.json')),
false,
);
assert.equal(fs.existsSync(deviceClaimFilePath('local:android:none:superseded.json')), false);
} finally {
fs.rmSync(claimsDir, { recursive: true, force: true });
}
Expand Down Expand Up @@ -206,7 +205,7 @@ test('leaves a superseded owner in another state dir to the device that asks for

assert.deepEqual(summary, { examined: 0, reconciled: 0, retained: 0, changed: 0 });
assert.equal(reconcile.mock.calls.length, 0);
assert.equal(fs.existsSync(resolveDeviceClaimPath('local:android:none:foreign.json')), true);
assert.equal(fs.existsSync(deviceClaimFilePath('local:android:none:foreign.json')), true);
} finally {
fs.rmSync(claimsDir, { recursive: true, force: true });
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,11 @@ import {
} from '@agent-device/daemon-contracts/device-claims';
import type { DeviceBootObservationService } from '@agent-device/contracts/device-boot';
import type { DeviceInfo } from '@agent-device/kernel/device';
import { mkdtempForTestSync, pinOwnProcessStartTime } from '@agent-device/test-kit';
import { publishDaemonRegistration } from '@agent-device/daemon-contracts/daemon-registration-fixtures';
import {
mkdtempForTestSync,
pinOwnProcessStartTime,
publishDaemonRegistration,
} from '@agent-device/test-kit';
pinOwnProcessStartTime(hostProcess);

const device: DeviceInfo = {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,11 @@ import {
inspectDeviceClaims,
} from '@agent-device/daemon-contracts/device-claims';
import type { DeviceInfo } from '@agent-device/kernel/device';
import { mkdtempForTestSync, pinOwnProcessStartTime } from '@agent-device/test-kit';
import { publishDaemonRegistration } from '@agent-device/daemon-contracts/daemon-registration-fixtures';
import {
mkdtempForTestSync,
pinOwnProcessStartTime,
publishDaemonRegistration,
} from '@agent-device/test-kit';
import * as hostProcess from '@agent-device/host-kit/process';
import { readCurrentOwnerIdentity } from '@agent-device/host-kit/process';
import { acquireProcessLock } from '@agent-device/host-kit/file';
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
import { resolveDeviceClaimPath } from '@agent-device/daemon-contracts/device-claims-fixtures';
import { deviceClaimFilePath, mkdtempForTestSync } from '@agent-device/test-kit';
import fs from 'node:fs';
import path from 'node:path';
import { expect, test, vi } from 'vitest';
import { mkdtempForTestSync } from '@agent-device/test-kit';
import { authoringPublication, makeIosSession } from '../../__tests__/support/session-factories.ts';
import { makeSessionStore } from '../../__tests__/support/store-factory.ts';
import {
Expand Down Expand Up @@ -41,7 +40,7 @@ async function publishLeasedSession(
});
if (acquired.status !== 'acquired') throw new Error('expected an acquired claim');
sessionStore.publish(name, { ...session, deviceClaim: acquired.ownership });
return resolveDeviceClaimPath(acquired.ownership.deviceKey);
return deviceClaimFilePath(acquired.ownership.deviceKey);
}

function holdSessionLocks(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { resolveDeviceClaimPath } from '@agent-device/daemon-contracts/device-claims-fixtures';
import { deviceClaimFilePath, IOS_SIMULATOR, mkdtempForTestSync } from '@agent-device/test-kit';
import { assert } from 'vitest';
import fs from 'node:fs';
import path from 'node:path';
Expand All @@ -15,7 +15,6 @@ import {
acquireDeviceClaim,
type DeviceClaimSessionOwnership,
} from '@agent-device/daemon-contracts/device-claims';
import { IOS_SIMULATOR, mkdtempForTestSync } from '@agent-device/test-kit';

/** The inactivity window every harness session is already past, except where a test says otherwise. */
export const WINDOW_MS = 1_000;
Expand Down Expand Up @@ -135,7 +134,7 @@ export function createIdleExpiryHarness(): Readonly<{
fixture.sessionStore.publish(name, session);
return { session, deviceClaim: acquired.ownership };
},
claimFileHeld: (deviceClaim) => fs.existsSync(resolveDeviceClaimPath(deviceClaim.deviceKey)),
claimFileHeld: (deviceClaim) => fs.existsSync(deviceClaimFilePath(deviceClaim.deviceKey)),
runUntilIdle: (controller, ms) => {
controller.noteSessionsChanged();
return new Promise((resolve) => setTimeout(resolve, ms));
Expand Down
3 changes: 1 addition & 2 deletions packages/daemon/src/server/http/daemon-metadata-loss.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,7 @@ import assert from 'node:assert/strict';
import fs from 'node:fs';
import path from 'node:path';
import { describe, test, vi } from 'vitest';
import { mkdtempForTestSync } from '@agent-device/test-kit';
import { publishDaemonRegistration } from '@agent-device/daemon-contracts/daemon-registration-fixtures';
import { mkdtempForTestSync, publishDaemonRegistration } from '@agent-device/test-kit';
import {
readDaemonMetadataLoss,
watchDaemonMetadataLoss,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
import { resolveDeviceClaimPath } from '@agent-device/daemon-contracts/device-claims-fixtures';
import { ANDROID_EMULATOR, deviceClaimFilePath, mkdtempForTestSync } from '@agent-device/test-kit';
import fs from 'node:fs';
import path from 'node:path';
import { afterEach, expect, test, vi } from 'vitest';
import { ANDROID_EMULATOR, mkdtempForTestSync } from '@agent-device/test-kit';
import { platformResourceCleanupFixture } from '../../__tests__/support/platform-resource-cleanup-fixture.ts';

const lifecycleEvents = vi.hoisted(() => [] as string[]);
Expand Down Expand Up @@ -292,7 +291,7 @@ test('shutdown includes drain publications, releases their claims and refuses po
expect(refusal).toMatchObject({ details: { reason: 'daemon_shutting_down' } });
expect(store.lookup('draining')).toBeUndefined();
expect(store.lookup('late')).toBeUndefined();
expect(fs.existsSync(resolveDeviceClaimPath(acquired.ownership.deviceKey))).toBe(false);
expect(fs.existsSync(deviceClaimFilePath(acquired.ownership.deviceKey))).toBe(false);
} finally {
await runtime?.shutdown();
}
Expand Down Expand Up @@ -410,7 +409,7 @@ test('shutdown joins dispatch completion after force-closing the client before t
expect(publicationError).toBeUndefined();
expect(shutdownProbe.finalize).toHaveBeenCalledOnce();
expect(store.lookup('dispatching')).toBeUndefined();
expect(fs.existsSync(resolveDeviceClaimPath(acquired.ownership.deviceKey))).toBe(false);
expect(fs.existsSync(deviceClaimFilePath(acquired.ownership.deviceKey))).toBe(false);
} finally {
release();
await request;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
import fs from 'node:fs';
import path from 'node:path';
import { afterEach, expect, test, vi } from 'vitest';
import { mkdtempForTestSync } from '@agent-device/test-kit';
import { publishDaemonRegistration } from '@agent-device/daemon-contracts/daemon-registration-fixtures';
import { mkdtempForTestSync, publishDaemonRegistration } from '@agent-device/test-kit';

const lifecycleEvents = vi.hoisted(() => [] as string[]);
const startupFailure = vi.hoisted(() => ({ active: false }));
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { resolveDeviceClaimPath } from '@agent-device/daemon-contracts/device-claims-fixtures';
import { deviceClaimFilePath } from '@agent-device/test-kit';
import { test } from 'vitest';
import assert from 'node:assert/strict';
import fs from 'node:fs';
Expand Down Expand Up @@ -77,7 +77,7 @@ test('a settle that cannot confirm the claim gone keeps the session record stand

// A claim store this process cannot write into: the clear reaches NO verdict, which is different
// information from a successor having taken the device.
const claimsDir = path.dirname(resolveDeviceClaimPath(deviceClaim.deviceKey));
const claimsDir = path.dirname(deviceClaimFilePath(deviceClaim.deviceKey));
fs.chmodSync(claimsDir, 0o500);
try {
const sweeps = createSweepBarrier();
Expand Down Expand Up @@ -117,7 +117,7 @@ test('a claim that yields no attributable owner keeps the session record standin
// The record this daemon wrote is now unreadable. The clear therefore learns nothing about whether
// its claim is gone, which is a different answer from a successor owning the device — and only that
// successor case may justify forgetting a session whose daemon is still alive.
fs.writeFileSync(resolveDeviceClaimPath(deviceClaim.deviceKey), '{bad json');
fs.writeFileSync(deviceClaimFilePath(deviceClaim.deviceKey), '{bad json');

const sweeps = createSweepBarrier();
const controller = createSessionIdleExpiry({
Expand Down Expand Up @@ -295,7 +295,7 @@ test('a held-back settle leaves a repair transaction uncommitted, so a later pas
sessionStore.retire(sessionStore.lookup('default')!);
sessionStore.publish('default', session);

const claimsDir = path.dirname(resolveDeviceClaimPath(deviceClaim.deviceKey));
const claimsDir = path.dirname(deviceClaimFilePath(deviceClaim.deviceKey));
const sweeps = createSweepBarrier();
const settleParams = {
sessionStore,
Expand Down
Loading
Loading