|
1 | 1 | import { logger } from "@coder/logger"
|
| 2 | +import { promises, rmdirSync } from "fs" |
2 | 3 | import * as http from "http"
|
| 4 | +import * as path from "path" |
3 | 5 | import { createApp, ensureAddress, handleArgsSocketCatchError, handleServerError } from "../../../src/node/app"
|
4 | 6 | import { setDefaults } from "../../../src/node/cli"
|
5 |
| -import { getAvailablePort } from "../../utils/helpers" |
| 7 | +import { getAvailablePort, tmpdir } from "../../utils/helpers" |
6 | 8 |
|
7 | 9 | describe("createApp", () => {
|
8 | 10 | let spy: jest.SpyInstance
|
| 11 | + let unlinkSpy: jest.SpyInstance |
9 | 12 |
|
10 | 13 | beforeEach(() => {
|
| 14 | + // https://github.com/aelbore/esbuild-jest/issues/26#issuecomment-893763840 |
| 15 | + // explain why we do it this way |
11 | 16 | spy = jest.spyOn(logger, "error")
|
| 17 | + unlinkSpy = jest.spyOn(promises, "unlink") |
12 | 18 | })
|
13 | 19 |
|
14 | 20 | afterEach(() => {
|
@@ -93,6 +99,44 @@ describe("createApp", () => {
|
93 | 99 |
|
94 | 100 | expect(() => masterBall()).rejects.toThrow(`listen EACCES: permission denied 127.0.0.1:${port}`)
|
95 | 101 | })
|
| 102 | + |
| 103 | + it("should unlink a socket before listening on the socket", async () => { |
| 104 | + const tmpDir = await tmpdir("unlink-socket") |
| 105 | + const tmpFile = path.join(tmpDir, "unlink-socket-file") |
| 106 | + await promises.writeFile(tmpFile, "") |
| 107 | + const socketPath = tmpFile |
| 108 | + const defaultArgs = await setDefaults({ |
| 109 | + _: [], |
| 110 | + socket: socketPath, |
| 111 | + }) |
| 112 | + |
| 113 | + const app = await createApp(defaultArgs) |
| 114 | + const server = app[2] |
| 115 | + |
| 116 | + expect(unlinkSpy).toHaveBeenCalledTimes(1) |
| 117 | + // Ensure directory was removed |
| 118 | + rmdirSync(socketPath, { recursive: true }) |
| 119 | + server.close() |
| 120 | + }) |
| 121 | + it("should catch errors thrown when unlinking a socket", async () => { |
| 122 | + const tmpDir = await tmpdir("unlink-socket") |
| 123 | + const tmpFile = path.join(tmpDir, "unlink-socket-file") |
| 124 | + // await promises.writeFile(tmpFile, "") |
| 125 | + const socketPath = tmpFile |
| 126 | + const defaultArgs = await setDefaults({ |
| 127 | + _: [], |
| 128 | + socket: socketPath, |
| 129 | + }) |
| 130 | + |
| 131 | + const app = await createApp(defaultArgs) |
| 132 | + const server = app[2] |
| 133 | + |
| 134 | + expect(spy).toHaveBeenCalledTimes(1) |
| 135 | + expect(spy).toHaveBeenCalledWith(`ENOENT: no such file or directory, unlink '${socketPath}'`) |
| 136 | + // Ensure directory was removed |
| 137 | + rmdirSync(socketPath, { recursive: true }) |
| 138 | + server.close() |
| 139 | + }) |
96 | 140 | })
|
97 | 141 |
|
98 | 142 | describe("ensureAddress", () => {
|
|
0 commit comments