2021-06-23 05:34:11 +08:00
|
|
|
import { promises as fs } from "fs"
|
2021-05-06 00:02:34 +08:00
|
|
|
import * as os from "os"
|
|
|
|
import * as path from "path"
|
2021-07-28 05:22:25 +08:00
|
|
|
import * as net from "net"
|
2021-05-06 00:02:34 +08:00
|
|
|
|
2021-05-07 00:25:29 +08:00
|
|
|
/**
|
|
|
|
* Return a mock of @coder/logger.
|
|
|
|
*/
|
|
|
|
export function createLoggerMock() {
|
|
|
|
return {
|
|
|
|
field: jest.fn(),
|
|
|
|
level: 2,
|
|
|
|
logger: {
|
|
|
|
debug: jest.fn(),
|
|
|
|
error: jest.fn(),
|
|
|
|
info: jest.fn(),
|
|
|
|
trace: jest.fn(),
|
|
|
|
warn: jest.fn(),
|
|
|
|
},
|
|
|
|
}
|
2021-02-24 06:58:54 +08:00
|
|
|
}
|
2021-05-06 00:02:34 +08:00
|
|
|
|
|
|
|
/**
|
2021-06-23 05:34:11 +08:00
|
|
|
* Clean up directories left by a test. It is recommended to do this when a test
|
|
|
|
* starts to avoid potentially accumulating infinite test directories.
|
|
|
|
*/
|
|
|
|
export async function clean(testName: string): Promise<void> {
|
|
|
|
const dir = path.join(os.tmpdir(), `code-server/tests/${testName}`)
|
2021-06-23 05:34:44 +08:00
|
|
|
await fs.rmdir(dir, { recursive: true })
|
2021-06-23 05:34:11 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Create a uniquely named temporary directory for a test.
|
2021-05-06 00:02:34 +08:00
|
|
|
*/
|
|
|
|
export async function tmpdir(testName: string): Promise<string> {
|
2021-06-23 05:34:11 +08:00
|
|
|
const dir = path.join(os.tmpdir(), `code-server/tests/${testName}`)
|
|
|
|
await fs.mkdir(dir, { recursive: true })
|
2021-05-06 00:02:34 +08:00
|
|
|
|
2021-06-23 05:34:11 +08:00
|
|
|
return await fs.mkdtemp(path.join(dir, `${testName}-`), { encoding: "utf8" })
|
2021-05-06 00:02:34 +08:00
|
|
|
}
|
2021-07-27 02:21:30 +08:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @description Helper function to use an environment variable.
|
|
|
|
*
|
|
|
|
* @returns an array (similar to useState in React) with a function
|
|
|
|
* to set the value and reset the value
|
|
|
|
*/
|
|
|
|
export function useEnv(key: string): [(nextValue: string | undefined) => string | undefined, () => void] {
|
|
|
|
const initialValue = process.env[key]
|
|
|
|
const setValue = (nextValue: string | undefined) => (process.env[key] = nextValue)
|
|
|
|
// Node automatically converts undefined to string 'undefined'
|
|
|
|
// when assigning an environment variable.
|
|
|
|
// which is why we need to delete it if it's supposed to be undefined
|
|
|
|
// Source: https://stackoverflow.com/a/60147167
|
|
|
|
const resetValue = () => {
|
|
|
|
if (initialValue !== undefined) {
|
|
|
|
process.env[key] = initialValue
|
|
|
|
} else {
|
|
|
|
delete process.env[key]
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return [setValue, resetValue]
|
|
|
|
}
|
2021-07-28 05:22:25 +08:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Helper function to get a random port.
|
|
|
|
*
|
|
|
|
* Source: https://github.com/sindresorhus/get-port/blob/main/index.js#L23-L33
|
|
|
|
*/
|
|
|
|
export const getAvailablePort = (options?: net.ListenOptions): Promise<number> =>
|
|
|
|
new Promise((resolve, reject) => {
|
|
|
|
const server = net.createServer()
|
|
|
|
server.unref()
|
|
|
|
server.on("error", reject)
|
|
|
|
server.listen(options, () => {
|
|
|
|
// NOTE@jsjoeio: not a huge fan of the type assertion
|
|
|
|
// but it works for now.
|
|
|
|
const { port } = server.address() as net.AddressInfo
|
|
|
|
server.close(() => {
|
|
|
|
resolve(port)
|
|
|
|
})
|
|
|
|
})
|
|
|
|
})
|