@mzzsfy/dsh-maintain 0.5.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +55 -0
- package/cordis.patch.yml +8 -0
- package/package.json +49 -0
- package/src/client.js +781 -0
- package/src/core.mjs +215 -0
- package/src/index.js +483 -0
- package/src/upgrade.mjs +128 -0
- package/test/client-id.test.mjs +16 -0
- package/test/core.test.mjs +176 -0
- package/test/dist-tags.test.mjs +220 -0
- package/test/logic-extract.mjs +21 -0
- package/test/parity.test.mjs +149 -0
- package/test/restart-ready.test.mjs +198 -0
- package/test/route.test.mjs +425 -0
- package/test/upgrade.test.mjs +65 -0
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { test } from 'node:test'
|
|
2
|
+
import assert from 'node:assert/strict'
|
|
3
|
+
|
|
4
|
+
import { runUpgrade } from '../src/upgrade.mjs'
|
|
5
|
+
|
|
6
|
+
// 脚本体一律单引号:Windows shell 化 spawn 经 cmd.exe,双层双引号会被截断。
|
|
7
|
+
const NODE = 'node'
|
|
8
|
+
const OK_SCRIPT = 'process.exit(0)'
|
|
9
|
+
const FAIL_SCRIPT = "console.error('boom-fail'); process.exit(3)"
|
|
10
|
+
const STDOUT_SCRIPT = "console.log('out-line-1'); console.log('out-line-2')"
|
|
11
|
+
const HANG_SCRIPT = 'setTimeout(() => {}, 60 * 1000)'
|
|
12
|
+
|
|
13
|
+
test('场景:shell 化执行 命令串含连接符与参数可运行', async () => {
|
|
14
|
+
// shell:false 会把整串当可执行文件路径(POSIX 必 ENOENT);此用例锁死 shell 化语义
|
|
15
|
+
const result = await runUpgrade({ command: NODE + ' -e "process.stdout.write(\'chain-ok\')"' + ' && echo done', timeoutMs: 30 * 1000 })
|
|
16
|
+
assert.equal(result.ok, true)
|
|
17
|
+
assert.match(result.stdoutTail, /chain-ok/)
|
|
18
|
+
assert.match(result.stdoutTail, /done/)
|
|
19
|
+
})
|
|
20
|
+
|
|
21
|
+
test('场景:升级命令成功完成', async () => {
|
|
22
|
+
const result = await runUpgrade({ command: NODE + ' -e "' + OK_SCRIPT + '"', timeoutMs: 30 * 1000 })
|
|
23
|
+
assert.equal(result.ok, true)
|
|
24
|
+
assert.equal(result.code, 0)
|
|
25
|
+
assert.equal(result.timedOut, false)
|
|
26
|
+
assert.equal(result.stderrTail, '')
|
|
27
|
+
})
|
|
28
|
+
|
|
29
|
+
test('场景:升级失败可见 非零码与 stderr 摘要', async () => {
|
|
30
|
+
const result = await runUpgrade({ command: NODE + ' -e "' + FAIL_SCRIPT + '"', timeoutMs: 30 * 1000 })
|
|
31
|
+
assert.equal(result.ok, false)
|
|
32
|
+
assert.equal(result.code, 3)
|
|
33
|
+
assert.match(result.stderrTail, /boom-fail/)
|
|
34
|
+
})
|
|
35
|
+
|
|
36
|
+
test('场景:stdout 内容被收集', async () => {
|
|
37
|
+
const result = await runUpgrade({ command: NODE + ' -e "' + STDOUT_SCRIPT + '"', timeoutMs: 30 * 1000 })
|
|
38
|
+
assert.equal(result.ok, true)
|
|
39
|
+
assert.match(result.stdoutTail, /out-line-1/)
|
|
40
|
+
assert.match(result.stdoutTail, /out-line-2/)
|
|
41
|
+
})
|
|
42
|
+
|
|
43
|
+
test('场景:命令超时被强制终止', async () => {
|
|
44
|
+
const startedAt = Date.now()
|
|
45
|
+
const result = await runUpgrade({ command: NODE + ' -e "' + HANG_SCRIPT + '"', timeoutMs: 2 * 1000 })
|
|
46
|
+
assert.equal(result.ok, false)
|
|
47
|
+
assert.equal(result.timedOut, true)
|
|
48
|
+
// 上界收紧为 timeoutMs + 强杀宽限 + 数秒余量,防 killTree 回归被宽 assertion 掩盖
|
|
49
|
+
assert.ok(Date.now() - startedAt < 2 * 1000 + 5 * 1000 + 5 * 1000, '超时后应在强杀宽限内收敛而不是等满挂起时长')
|
|
50
|
+
})
|
|
51
|
+
|
|
52
|
+
test('场景:超长输出截尾保留末尾', async () => {
|
|
53
|
+
const result = await runUpgrade({
|
|
54
|
+
command: NODE + " -e \"console.log(Array(100).fill('x-line-0123456789').join('\\n'))\"",
|
|
55
|
+
timeoutMs: 30 * 1000,
|
|
56
|
+
})
|
|
57
|
+
assert.equal(result.ok, true)
|
|
58
|
+
assert.ok(result.stdoutTail.length <= 2000)
|
|
59
|
+
assert.match(result.stdoutTail, /x-line-0123456789$/)
|
|
60
|
+
})
|
|
61
|
+
|
|
62
|
+
test('场景:命令不存在失败不抛错', async () => {
|
|
63
|
+
const result = await runUpgrade({ command: 'definitely-not-exist-cmd-xyz --version', timeoutMs: 10 * 1000 })
|
|
64
|
+
assert.equal(result.ok, false)
|
|
65
|
+
})
|