From a1148f3d3af3fc6e6862a2ff7197021a60613af7 Mon Sep 17 00:00:00 2001 From: Nathan Flurry Date: Thu, 26 Jun 2025 07:33:07 +0000 Subject: [PATCH] chore: remove test driver in favor of memory driver --- packages/core/scripts/dump-openapi.ts | 13 +- packages/core/src/test/driver/actor.ts | 40 ----- packages/core/src/test/driver/global-state.ts | 65 --------- packages/core/src/test/driver/log.ts | 7 - packages/core/src/test/driver/manager.ts | 137 ------------------ packages/core/src/test/driver/mod.ts | 17 --- packages/core/src/test/mod.ts | 13 +- packages/core/tests/driver-test-suite.test.ts | 4 +- 8 files changed, 7 insertions(+), 289 deletions(-) delete mode 100644 packages/core/src/test/driver/actor.ts delete mode 100644 packages/core/src/test/driver/global-state.ts delete mode 100644 packages/core/src/test/driver/log.ts delete mode 100644 packages/core/src/test/driver/manager.ts delete mode 100644 packages/core/src/test/driver/mod.ts diff --git a/packages/core/scripts/dump-openapi.ts b/packages/core/scripts/dump-openapi.ts index 6572454c7..05b18cb22 100644 --- a/packages/core/scripts/dump-openapi.ts +++ b/packages/core/scripts/dump-openapi.ts @@ -6,10 +6,8 @@ import { createManagerRouter } from "@/manager/router"; import { type RegistryConfig, RegistryConfigSchema, setup } from "@/mod"; import { type RunConfig, RunConfigSchema } from "@/registry/run-config"; import { - TestActorDriver, - TestGlobalState, - TestManagerDriver, -} from "@/test/driver/mod"; + createMemoryDriver, +} from "@/drivers/memory/mod"; import { VERSION } from "@/utils"; function main() { @@ -18,13 +16,8 @@ function main() { }); const registry = setup(registryConfig); - const memoryState = new TestGlobalState(); const driverConfig: RunConfig = RunConfigSchema.parse({ - driver: { - topology: "standalone", - actor: new TestActorDriver(memoryState), - manager: new TestManagerDriver(memoryState), - }, + driver: createMemoryDriver(), getUpgradeWebSocket: () => () => unimplemented(), }); diff --git a/packages/core/src/test/driver/actor.ts b/packages/core/src/test/driver/actor.ts deleted file mode 100644 index 6489069ea..000000000 --- a/packages/core/src/test/driver/actor.ts +++ /dev/null @@ -1,40 +0,0 @@ -import type { ActorDriver, AnyActorInstance } from "@/driver-helpers/mod"; -import type { TestGlobalState } from "./global-state"; - -export interface ActorDriverContext { - // Used to test that the actor context works from tests - isTest: boolean; -} - -export class TestActorDriver implements ActorDriver { - #state: TestGlobalState; - - constructor(state: TestGlobalState) { - this.#state = state; - } - - getContext(_actorId: string): ActorDriverContext { - return { - isTest: true, - }; - } - - async readPersistedData(actorId: string): Promise { - return this.#state.readPersistedData(actorId); - } - - async writePersistedData(actorId: string, data: Uint8Array): Promise { - this.#state.writePersistedData(actorId, data); - } - - async setAlarm(actor: AnyActorInstance, timestamp: number): Promise { - const delay = Math.max(timestamp - Date.now(), 0); - setTimeout(() => { - actor.onAlarm(); - }, delay); - } - - getDatabase(actorId: string): Promise { - return Promise.resolve(undefined); - } -} diff --git a/packages/core/src/test/driver/global-state.ts b/packages/core/src/test/driver/global-state.ts deleted file mode 100644 index afd9cc034..000000000 --- a/packages/core/src/test/driver/global-state.ts +++ /dev/null @@ -1,65 +0,0 @@ -import type { ActorKey } from "@/actor/mod"; -import { serializeEmptyPersistData } from "@/driver-helpers/mod"; - -export interface ActorState { - id: string; - name: string; - key: ActorKey; - persistedData?: Uint8Array; -} - -export class TestGlobalState { - #actors: Map = new Map(); - - #getActor(actorId: string): ActorState { - const actor = this.#actors.get(actorId); - if (!actor) { - throw new Error(`Actor does not exist for ID: ${actorId}`); - } - return actor; - } - - readPersistedData(actorId: string): Uint8Array | undefined { - return this.#getActor(actorId).persistedData; - } - - writePersistedData(actorId: string, data: Uint8Array) { - this.#getActor(actorId).persistedData = data; - } - - createActor( - actorId: string, - name: string, - key: ActorKey, - input: unknown | undefined, - ): void { - // Create actor state if it doesn't exist - if (!this.#actors.has(actorId)) { - this.#actors.set(actorId, { - id: actorId, - name, - key, - persistedData: serializeEmptyPersistData(input), - }); - } else { - throw new Error(`Actor already exists for ID: ${actorId}`); - } - } - - findActor(filter: (actor: ActorState) => boolean): ActorState | undefined { - for (const actor of this.#actors.values()) { - if (filter(actor)) { - return actor; - } - } - return undefined; - } - - getActor(actorId: string): ActorState | undefined { - return this.#actors.get(actorId); - } - - getAllActors(): ActorState[] { - return Array.from(this.#actors.values()); - } -} diff --git a/packages/core/src/test/driver/log.ts b/packages/core/src/test/driver/log.ts deleted file mode 100644 index cc3404df5..000000000 --- a/packages/core/src/test/driver/log.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { getLogger } from "@/common/log"; - -export const LOGGER_NAME = "driver-test"; - -export function logger() { - return getLogger(LOGGER_NAME); -} diff --git a/packages/core/src/test/driver/manager.ts b/packages/core/src/test/driver/manager.ts deleted file mode 100644 index 1b9bbfda5..000000000 --- a/packages/core/src/test/driver/manager.ts +++ /dev/null @@ -1,137 +0,0 @@ -import * as crypto from "node:crypto"; -import { ActorAlreadyExists } from "@/actor/errors"; -import type { - CreateInput, - GetForIdInput, - GetOrCreateWithKeyInput, - GetWithKeyInput, - ManagerDriver, -} from "@/driver-helpers/mod"; -import type { ActorOutput } from "@/manager/driver"; -import type { TestGlobalState } from "./global-state"; - -export class TestManagerDriver implements ManagerDriver { - #state: TestGlobalState; - - // inspector: ManagerInspector = new ManagerInspector(this, { - // getAllActors: () => this.#state.getAllActors(), - // getAllTypesOfActors: () => Object.keys(this.registry.config.actors), - // }); - - constructor(state: TestGlobalState) { - this.#state = state; - } - - async getForId({ actorId }: GetForIdInput): Promise { - // Validate the actor exists - const actor = this.#state.getActor(actorId); - if (!actor) { - return undefined; - } - - return { - actorId, - name: actor.name, - key: actor.key, - }; - } - - async getWithKey({ - name, - key, - }: GetWithKeyInput): Promise { - // NOTE: This is a slow implementation that checks each actor individually. - // This can be optimized with an index in the future. - - const actor = this.#state.findActor((actor) => { - if (actor.name !== name) { - return false; - } - - // handle empty key - if (key === null || key === undefined) { - return actor.key === null || actor.key === undefined; - } - - // handle array - if (Array.isArray(key)) { - if (!Array.isArray(actor.key)) { - return false; - } - if (key.length !== actor.key.length) { - return false; - } - // Check if all elements in key are in actor.key - for (let i = 0; i < key.length; i++) { - if (key[i] !== actor.key[i]) { - return false; - } - } - return true; - } - - // Handle object - if (typeof key === "object" && !Array.isArray(key)) { - if (typeof actor.key !== "object" || Array.isArray(actor.key)) { - return false; - } - if (actor.key === null) { - return false; - } - - // Check if all keys in key are in actor.key - const keyObj = key as Record; - const actorKeyObj = actor.key as unknown as Record; - for (const k in keyObj) { - if (!(k in actorKeyObj) || keyObj[k] !== actorKeyObj[k]) { - return false; - } - } - return true; - } - - // handle scalar - return key === actor.key; - }); - - if (actor) { - return { - actorId: actor.id, - name, - key: actor.key, - }; - } - - return undefined; - } - - async getOrCreateWithKey( - input: GetOrCreateWithKeyInput, - ): Promise { - const getOutput = await this.getWithKey(input); - if (getOutput) { - return getOutput; - } else { - return await this.createActor(input); - } - } - - async createActor({ name, key, input }: CreateInput): Promise { - // Check if actor with the same name and key already exists - const existingActor = await this.getWithKey({ name, key }); - if (existingActor) { - throw new ActorAlreadyExists(name, key); - } - - const actorId = crypto.randomUUID(); - this.#state.createActor(actorId, name, key, input); - - // this.inspector.onActorsChange(this.#state.getAllActors()); - - return { - actorId, - name, - key, - }; - } -} diff --git a/packages/core/src/test/driver/mod.ts b/packages/core/src/test/driver/mod.ts deleted file mode 100644 index dffab797a..000000000 --- a/packages/core/src/test/driver/mod.ts +++ /dev/null @@ -1,17 +0,0 @@ -import type { DriverConfig } from "@/mod"; -import { TestActorDriver } from "./actor"; -import { TestGlobalState } from "./global-state"; -import { TestManagerDriver } from "./manager"; - -export { TestGlobalState } from "./global-state"; -export { TestActorDriver } from "./actor"; -export { TestManagerDriver } from "./manager"; - -export function createTestDriver(): DriverConfig { - const state = new TestGlobalState(); - return { - topology: "standalone", - manager: new TestManagerDriver(state), - actor: new TestActorDriver(state), - }; -} diff --git a/packages/core/src/test/mod.ts b/packages/core/src/test/mod.ts index 438b1b934..3448860b8 100644 --- a/packages/core/src/test/mod.ts +++ b/packages/core/src/test/mod.ts @@ -9,12 +9,8 @@ import { type NodeWebSocket, createNodeWebSocket } from "@hono/node-ws"; import type { Hono } from "hono"; import { type TestContext, vi } from "vitest"; import { ConfigSchema, type InputConfig } from "./config"; -import { - TestActorDriver, - TestGlobalState, - TestManagerDriver, -} from "./driver/mod"; import { logger } from "./log"; +import { createMemoryDriver } from "@/drivers/memory/mod"; function createRouter( registry: Registry, @@ -27,12 +23,7 @@ function createRouter( // Configure default configuration if (!config.driver) { - const memoryState = new TestGlobalState(); - config.driver = { - topology: "standalone", - manager: new TestManagerDriver(memoryState), - actor: new TestActorDriver(memoryState), - }; + config.driver = createMemoryDriver(); } // Setup WebSocket routing for Node diff --git a/packages/core/tests/driver-test-suite.test.ts b/packages/core/tests/driver-test-suite.test.ts index 70849135d..ae93b49fb 100644 --- a/packages/core/tests/driver-test-suite.test.ts +++ b/packages/core/tests/driver-test-suite.test.ts @@ -1,6 +1,6 @@ import { join } from "node:path"; import { createTestRuntime, runDriverTests } from "@/driver-test-suite/mod"; -import { createTestDriver } from "@/test/driver/mod"; +import { createMemoryDriver } from "@/drivers/memory/mod"; runDriverTests({ async start(projectPath: string) { @@ -8,7 +8,7 @@ runDriverTests({ join(projectPath, "registry.ts"), async () => { return { - driver: createTestDriver(), + driver: createMemoryDriver(), }; }, );