From 13b4a7d65d9d9a047a8f3d14de8c6fb028efe1cc Mon Sep 17 00:00:00 2001 From: Denis Lantsman Date: Tue, 31 Dec 2024 10:35:58 -0800 Subject: [PATCH 1/2] fix #156 also add some tests --- bun.lockb | Bin 272619 -> 271062 bytes src/attach.test.ts | 16 ++++++++++ src/attach.ts | 43 ++++++++++++++------------- src/sample.test.ts | 5 ---- tests/preamble.ts | 72 +++++++++++++++++++++++++++++++++++++++++++++ tsconfig.json | 2 +- 6 files changed, 112 insertions(+), 26 deletions(-) create mode 100644 src/attach.test.ts delete mode 100644 src/sample.test.ts create mode 100644 tests/preamble.ts diff --git a/bun.lockb b/bun.lockb index 415591d8e00e477ad9f1eba091f1519db740e1b9..5d2253c9cc0e6f00b95a01a24254f2fba13c7a44 100755 GIT binary patch delta 55784 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 n(>M?F6!l%S-W=a { + it("nvim_buf_set_lines with a large file", async () => { + await withNvimClient(async (nvim) => { + const lines: string[] = []; + for (let line = 0; line < 500; line += 1) { + lines.push("x".repeat(100)); + } + await nvim.call("nvim_buf_set_lines", [0, 0, -1, false, lines]); + const roundtripLines = await nvim.call("nvim_buf_get_lines", [0, 0, -1, false]); + expect(roundtripLines).toEqual(lines); + }); + }); +}); diff --git a/src/attach.ts b/src/attach.ts index 48e277f..635ddde 100644 --- a/src/attach.ts +++ b/src/attach.ts @@ -1,5 +1,6 @@ import { Packr, UnpackrStream, addExtension, unpack } from "msgpackr"; import { EventEmitter } from "node:events"; +import net from "node:net"; import { createLogger, prettyRPCMessage } from "./logger.ts"; import { MessageType, @@ -41,26 +42,28 @@ export async function attach({ let lastReqId = 0; let handlerId = 0; - const nvimSocket = await Bun.connect({ - unix: socket, - socket: { - binaryType: "uint8array", - data(_, data) { - // Sometimes RPC messages are split into multiple socket messages. - // `unpackrStream` handles collecting all socket messages if the RPC message - // is split and decoding it. - unpackrStream.write(data); - }, - error(_, error) { - logger?.error("socket error", error); - }, - end() { - logger?.debug("connection closed by neovim"); - }, - close() { - logger?.debug("connection closed by bunvim"); - }, - }, + const nvimSocket = await new Promise((resolve, reject) => { + const client = new net.Socket(); + client.once("error", reject); + client.once("connect", () => { + client + .removeListener("error", reject) + .on("data", (data: Buffer) => { + unpackrStream.write(data); + }) + .on("error", (error) => { + logger?.error("socket error", error); + }) + .on("end", () => { + logger?.debug("connection closed by neovim"); + }) + .on("close", () => { + logger?.debug("connection closed by bunvim"); + }); + resolve(client); + }); + + client.connect(socket); }); function processMessageOutQueue() { diff --git a/src/sample.test.ts b/src/sample.test.ts deleted file mode 100644 index 32d5d4a..0000000 --- a/src/sample.test.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { expect, test } from "bun:test"; - -test("2 + 1", () => { - expect(2 + 1).toBe(3); -}); diff --git a/tests/preamble.ts b/tests/preamble.ts new file mode 100644 index 0000000..84f84a9 --- /dev/null +++ b/tests/preamble.ts @@ -0,0 +1,72 @@ +import { attach, type Nvim } from "../src/index.ts"; +import { unlink } from "node:fs/promises"; +import { spawn } from "child_process"; +import path from "path"; + +const SOCK = `/tmp/bunvim-test.sock`; +export async function withNvimProcess(fn: (sock: string) => Promise) { + try { + await unlink(SOCK); + } catch (e) { + if ((e as { code: string }).code !== "ENOENT") { + console.error(e); + } + } + + const nvimProcess = spawn( + "nvim", + ["--headless", "-n", "--clean", "--listen", SOCK], + { + // root dir relative to this file + cwd: path.resolve(path.dirname(__filename), "../"), + }, + ); + + if (!nvimProcess.pid) { + throw new Error("Failed to start nvim process"); + } + + try { + nvimProcess.on("error", (err) => { + throw err; + }); + + nvimProcess.on("exit", (code, signal) => { + if (code !== 1) { + throw new Error( + `Nvim process exited with code ${code} and signal ${signal}`, + ); + } + }); + + // give enough time for socket to be created + // TODO: poll for socket instead + await new Promise((resolve) => setTimeout(resolve, 500)); + + await fn(SOCK); + } finally { + const res = nvimProcess.kill(); + console.log(`Killed process ${nvimProcess.pid} with result ${res}`); + } +} + +export async function withNvimClient(fn: (nvim: Nvim) => Promise) { + return await withNvimProcess(async (sock) => { + const nvim = await attach({ + socket: sock, + client: { name: "test" }, + logging: { level: "debug" }, + }); + + try { + await fn(nvim); + } finally { + nvim.detach(); + } + }); +} + +process.on("uncaughtException", (err) => { + console.error(err); + process.exit(1); +}); diff --git a/tsconfig.json b/tsconfig.json index 8021421..fe4da99 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -30,5 +30,5 @@ "checkJs": true, "esModuleInterop": true }, - "include": ["src", "./package.json"] + "include": ["src", "test", "./package.json"] } From 2fc96196bb17b51c4514585b288d71e3ba74063a Mon Sep 17 00:00:00 2001 From: Denis Lantsman Date: Tue, 31 Dec 2024 10:38:01 -0800 Subject: [PATCH 2/2] add neovim dep to tests --- .github/workflows/release.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index b9258b0..06d3ee6 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -20,6 +20,11 @@ jobs: uses: actions/setup-node@v4 with: node-version: 20.x + - name: Setup Neovim + uses: rhysd/action-setup-vim@v1 + with: + neovim: true + version: stable - name: Install bun uses: oven-sh/setup-bun@v2 - name: Install dependencies