browser4-cli 0.1.24 → 0.1.26
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/bin/browser4-cli-darwin-arm64 +0 -0
- package/bin/browser4-cli-darwin-x64 +0 -0
- package/bin/browser4-cli-linux-arm64 +0 -0
- package/bin/browser4-cli-linux-musl-arm64 +0 -0
- package/bin/browser4-cli-linux-musl-x64 +0 -0
- package/bin/browser4-cli-linux-x64 +0 -0
- package/bin/browser4-cli-win32-x64.exe +0 -0
- package/package.json +1 -1
- package/scripts/install-browser4-cli.ps1 +103 -55
- package/scripts/install-browser4-cli.sh +47 -42
- package/scripts/tests/install-browser4-cli.tests.ps1 +366 -0
- package/scripts/tests/install-browser4-cli.tests.sh +322 -0
|
@@ -0,0 +1,322 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# install-browser4-cli.tests.sh
|
|
3
|
+
# Test suite for install-browser4-cli.sh
|
|
4
|
+
# Uses only bash builtins and standard Unix tools — no external test frameworks.
|
|
5
|
+
#
|
|
6
|
+
# Run:
|
|
7
|
+
# bash cli/scripts/tests/install-browser4-cli.tests.sh
|
|
8
|
+
# bash cli/scripts/tests/install-browser4-cli.tests.sh -v (verbose)
|
|
9
|
+
|
|
10
|
+
set -euo pipefail
|
|
11
|
+
|
|
12
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
13
|
+
INSTALL_SCRIPT="$(cd "$SCRIPT_DIR/.." && pwd)/install-browser4-cli.sh"
|
|
14
|
+
|
|
15
|
+
PASS=0
|
|
16
|
+
FAIL=0
|
|
17
|
+
VERBOSE=false
|
|
18
|
+
|
|
19
|
+
[[ "${1:-}" == "-v" ]] && VERBOSE=true
|
|
20
|
+
|
|
21
|
+
# ── Helpers ────────────────────────────────────────────
|
|
22
|
+
|
|
23
|
+
green() { echo -e "\033[0;32m$*\033[0m"; }
|
|
24
|
+
red() { echo -e "\033[0;31m$*\033[0m"; }
|
|
25
|
+
cyan() { echo -e "\033[0;36m$*\033[0m"; }
|
|
26
|
+
dim() { echo -e "\033[2m$*\033[0m"; }
|
|
27
|
+
|
|
28
|
+
test() {
|
|
29
|
+
local name="$1"
|
|
30
|
+
local fn="$2"
|
|
31
|
+
if "$fn"; then
|
|
32
|
+
PASS=$((PASS + 1))
|
|
33
|
+
green " PASS $name"
|
|
34
|
+
else
|
|
35
|
+
FAIL=$((FAIL + 1))
|
|
36
|
+
red " FAIL $name"
|
|
37
|
+
fi
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
# Run a command and capture both stdout and stderr.
|
|
41
|
+
# Returns the combined output via stdout; exit code 0 = success metadata only.
|
|
42
|
+
run_script() {
|
|
43
|
+
local args="$*"
|
|
44
|
+
bash "$INSTALL_SCRIPT" $args 2>&1 || true
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
# ── Header ─────────────────────────────────────────────
|
|
48
|
+
|
|
49
|
+
cyan "============================================"
|
|
50
|
+
cyan " install-browser4-cli.sh Test Suite"
|
|
51
|
+
cyan "============================================"
|
|
52
|
+
echo ""
|
|
53
|
+
|
|
54
|
+
# ── Pre-flight ─────────────────────────────────────────
|
|
55
|
+
|
|
56
|
+
echo "--- Pre-flight ---" | cyan
|
|
57
|
+
|
|
58
|
+
test "file exists" bash -c "
|
|
59
|
+
[[ -f '$INSTALL_SCRIPT' ]]
|
|
60
|
+
"
|
|
61
|
+
|
|
62
|
+
test "file is readable" bash -c "
|
|
63
|
+
head -c 1 '$INSTALL_SCRIPT' >/dev/null 2>&1
|
|
64
|
+
"
|
|
65
|
+
|
|
66
|
+
test "starts with shebang" bash -c "
|
|
67
|
+
head -c 20 '$INSTALL_SCRIPT' | grep -q '^#!/usr/bin/env bash'
|
|
68
|
+
"
|
|
69
|
+
|
|
70
|
+
test "bash syntax check passes" bash -c "
|
|
71
|
+
bash -n '$INSTALL_SCRIPT' 2>&1
|
|
72
|
+
"
|
|
73
|
+
|
|
74
|
+
test "no non-ASCII bytes" bash -c "
|
|
75
|
+
! grep -Pn '[^\\x00-\\x7F]' '$INSTALL_SCRIPT' >/dev/null 2>&1
|
|
76
|
+
"
|
|
77
|
+
|
|
78
|
+
echo ""
|
|
79
|
+
|
|
80
|
+
# ── Argument parsing ──────────────────────────────────
|
|
81
|
+
|
|
82
|
+
echo "--- Argument parsing ---" | cyan
|
|
83
|
+
|
|
84
|
+
test "--help exits 0" bash -c "
|
|
85
|
+
bash '$INSTALL_SCRIPT' --help >/dev/null 2>&1
|
|
86
|
+
"
|
|
87
|
+
|
|
88
|
+
test "--help mentions --skip-if-installed" bash -c "
|
|
89
|
+
bash '$INSTALL_SCRIPT' --help 2>&1 | grep -q 'skip-if-installed'
|
|
90
|
+
"
|
|
91
|
+
|
|
92
|
+
test "--help does NOT mention --force" bash -c "
|
|
93
|
+
! bash '$INSTALL_SCRIPT' --help 2>&1 | grep -q '\-\-force'
|
|
94
|
+
"
|
|
95
|
+
|
|
96
|
+
test "--version requires value" bash -c "
|
|
97
|
+
bash '$INSTALL_SCRIPT' --version 2>&1 | grep -q 'requires a value'
|
|
98
|
+
"
|
|
99
|
+
|
|
100
|
+
test "--install-dir requires value" bash -c "
|
|
101
|
+
bash '$INSTALL_SCRIPT' --install-dir 2>&1 | grep -q 'requires a value'
|
|
102
|
+
"
|
|
103
|
+
|
|
104
|
+
test "--source requires value" bash -c "
|
|
105
|
+
bash '$INSTALL_SCRIPT' --source 2>&1 | grep -q 'requires a value'
|
|
106
|
+
"
|
|
107
|
+
|
|
108
|
+
test "--source invalid rejected" bash -c "
|
|
109
|
+
bash '$INSTALL_SCRIPT' --source invalid --dry-run 2>&1 | grep -qi 'github.*oss\|must be'
|
|
110
|
+
"
|
|
111
|
+
|
|
112
|
+
test "--dry-run flag accepted" bash -c "
|
|
113
|
+
bash '$INSTALL_SCRIPT' --dry-run 2>&1 | grep -qi 'DRY-RUN\|dry-run\|Install'
|
|
114
|
+
"
|
|
115
|
+
|
|
116
|
+
test "--silent flag accepted" bash -c "
|
|
117
|
+
bash '$INSTALL_SCRIPT' --silent --dry-run 2>&1 | grep -v '^$' | head -1 | grep -qv '→\|step'
|
|
118
|
+
"
|
|
119
|
+
|
|
120
|
+
test "--skip-local flag accepted" bash -c "
|
|
121
|
+
bash '$INSTALL_SCRIPT' --skip-local --dry-run 2>&1 | grep -qi 'skip\|DRY-RUN\|Already\|Install'
|
|
122
|
+
"
|
|
123
|
+
|
|
124
|
+
test "--no-path flag accepted" bash -c "
|
|
125
|
+
bash '$INSTALL_SCRIPT' --no-path --dry-run 2>&1 | grep -vq 'Added to PATH'
|
|
126
|
+
"
|
|
127
|
+
|
|
128
|
+
test "unknown arg rejected" bash -c "
|
|
129
|
+
bash '$INSTALL_SCRIPT' --bogus-flag 2>&1 | grep -q 'Unknown argument'
|
|
130
|
+
"
|
|
131
|
+
|
|
132
|
+
echo ""
|
|
133
|
+
|
|
134
|
+
# ── Locate mode ────────────────────────────────────────
|
|
135
|
+
|
|
136
|
+
echo "--- Locate mode ---" | cyan
|
|
137
|
+
|
|
138
|
+
test "--locate exits 0" bash -c "
|
|
139
|
+
bash '$INSTALL_SCRIPT' --locate >/dev/null 2>&1
|
|
140
|
+
"
|
|
141
|
+
|
|
142
|
+
test "--locate shows Platform key" bash -c "
|
|
143
|
+
bash '$INSTALL_SCRIPT' --locate 2>&1 | grep -q 'Platform key'
|
|
144
|
+
"
|
|
145
|
+
|
|
146
|
+
test "--locate shows Binary name" bash -c "
|
|
147
|
+
bash '$INSTALL_SCRIPT' --locate 2>&1 | grep -q 'Binary name'
|
|
148
|
+
"
|
|
149
|
+
|
|
150
|
+
test "--locate shows Script dir" bash -c "
|
|
151
|
+
bash '$INSTALL_SCRIPT' --locate 2>&1 | grep -q 'Script dir'
|
|
152
|
+
"
|
|
153
|
+
|
|
154
|
+
test "--locate shows Download order" bash -c "
|
|
155
|
+
bash '$INSTALL_SCRIPT' --locate 2>&1 | grep -q 'Download order'
|
|
156
|
+
"
|
|
157
|
+
|
|
158
|
+
test "--locate shows China locale" bash -c "
|
|
159
|
+
bash '$INSTALL_SCRIPT' --locate 2>&1 | grep -q 'China locale'
|
|
160
|
+
"
|
|
161
|
+
|
|
162
|
+
test "--locate shows OS" bash -c "
|
|
163
|
+
bash '$INSTALL_SCRIPT' --locate 2>&1 | grep -q 'OS:'
|
|
164
|
+
"
|
|
165
|
+
|
|
166
|
+
echo ""
|
|
167
|
+
|
|
168
|
+
# ── Download URL patterns ──────────────────────────────
|
|
169
|
+
|
|
170
|
+
echo "--- Download URLs ---" | cyan
|
|
171
|
+
|
|
172
|
+
test "latest mode uses GitHub latest/download pattern" bash -c "
|
|
173
|
+
bash '$INSTALL_SCRIPT' --locate 2>&1 | grep -q 'github.com/platonai/Browser4/releases/latest/download/'
|
|
174
|
+
"
|
|
175
|
+
|
|
176
|
+
test "latest mode uses OSS download/latest pattern" bash -c "
|
|
177
|
+
bash '$INSTALL_SCRIPT' --locate 2>&1 | grep -q 'oss-cn-beijing.*releases/download/latest/'
|
|
178
|
+
"
|
|
179
|
+
|
|
180
|
+
test "versioned mode uses tag-based URLs" bash -c "
|
|
181
|
+
bash '$INSTALL_SCRIPT' --locate --version v4.11.0 2>&1 | grep -q 'releases/download/v4\.11\.0/'
|
|
182
|
+
"
|
|
183
|
+
|
|
184
|
+
test "GitHub URL NOT using broken OSS pattern" bash -c "
|
|
185
|
+
! bash '$INSTALL_SCRIPT' --locate 2>&1 | grep 'github.com' | grep -q 'releases/download/latest'
|
|
186
|
+
"
|
|
187
|
+
|
|
188
|
+
test "OSS URL NOT using broken GitHub pattern" bash -c "
|
|
189
|
+
! bash '$INSTALL_SCRIPT' --locate 2>&1 | grep 'oss-cn-beijing' | grep -q 'releases/latest/download'
|
|
190
|
+
"
|
|
191
|
+
|
|
192
|
+
echo ""
|
|
193
|
+
|
|
194
|
+
# ── Functions (extracted via copy without main call) ──
|
|
195
|
+
|
|
196
|
+
echo "--- Functions ---" | cyan
|
|
197
|
+
|
|
198
|
+
# Create a sourceable copy that defines all functions but doesn't call main
|
|
199
|
+
FUNC_TEST_SCRIPT="$(mktemp)"
|
|
200
|
+
trap "rm -f '$FUNC_TEST_SCRIPT'" EXIT
|
|
201
|
+
sed 's/^main$/# main/' "$INSTALL_SCRIPT" > "$FUNC_TEST_SCRIPT"
|
|
202
|
+
|
|
203
|
+
test "get_platform_key returns valid format" bash -c "
|
|
204
|
+
source '$FUNC_TEST_SCRIPT' >/dev/null 2>&1
|
|
205
|
+
key=\$(get_platform_key)
|
|
206
|
+
[[ \"\$key\" =~ ^(win32|linux|darwin)-(x64|arm64)\$ ]] || [[ \"\$key\" =~ ^linux-musl-(x64|arm64)\$ ]]
|
|
207
|
+
"
|
|
208
|
+
|
|
209
|
+
test "get_binary_name adds .exe on win32" bash -c "
|
|
210
|
+
source '$FUNC_TEST_SCRIPT' >/dev/null 2>&1
|
|
211
|
+
name=\$(get_binary_name 'win32-x64')
|
|
212
|
+
[[ \"\$name\" == 'browser4-cli-win32-x64.exe' ]]
|
|
213
|
+
"
|
|
214
|
+
|
|
215
|
+
test "get_binary_name omits .exe on linux" bash -c "
|
|
216
|
+
source '$FUNC_TEST_SCRIPT' >/dev/null 2>&1
|
|
217
|
+
name=\$(get_binary_name 'linux-x64')
|
|
218
|
+
[[ \"\$name\" == 'browser4-cli-linux-x64' ]]
|
|
219
|
+
"
|
|
220
|
+
|
|
221
|
+
test "get_binary_name omits .exe on darwin" bash -c "
|
|
222
|
+
source '$FUNC_TEST_SCRIPT' >/dev/null 2>&1
|
|
223
|
+
name=\$(get_binary_name 'darwin-arm64')
|
|
224
|
+
[[ \"\$name\" == 'browser4-cli-darwin-arm64' ]]
|
|
225
|
+
"
|
|
226
|
+
|
|
227
|
+
test "get_default_install_dir returns non-empty" bash -c "
|
|
228
|
+
source '$FUNC_TEST_SCRIPT' >/dev/null 2>&1
|
|
229
|
+
dir=\$(get_default_install_dir)
|
|
230
|
+
[[ -n \"\$dir\" ]]
|
|
231
|
+
"
|
|
232
|
+
|
|
233
|
+
test "detect_china_locale returns 0 or 1 (no crash)" bash -c "
|
|
234
|
+
source '$FUNC_TEST_SCRIPT' >/dev/null 2>&1
|
|
235
|
+
detect_china_locale && true || true
|
|
236
|
+
"
|
|
237
|
+
|
|
238
|
+
test "detect_os returns valid OS" bash -c "
|
|
239
|
+
source '$FUNC_TEST_SCRIPT' >/dev/null 2>&1
|
|
240
|
+
os=\$(detect_os)
|
|
241
|
+
[[ \"\$os\" =~ ^(linux|darwin|win32)$ ]]
|
|
242
|
+
"
|
|
243
|
+
|
|
244
|
+
test "detect_arch returns x64 or arm64" bash -c "
|
|
245
|
+
source '$FUNC_TEST_SCRIPT' >/dev/null 2>&1
|
|
246
|
+
arch=\$(detect_arch)
|
|
247
|
+
[[ \"\$arch\" == 'x64' || \"\$arch\" == 'arm64' ]]
|
|
248
|
+
"
|
|
249
|
+
|
|
250
|
+
test "find_local_binary returns error for nonexistent" bash -c "
|
|
251
|
+
source '$FUNC_TEST_SCRIPT' >/dev/null 2>&1
|
|
252
|
+
SCRIPT_DIR='$SCRIPT_DIR'
|
|
253
|
+
! find_local_binary 'nonexistent-binary-xyz' 2>/dev/null
|
|
254
|
+
"
|
|
255
|
+
|
|
256
|
+
test "test_local_binary returns error for empty path" bash -c "
|
|
257
|
+
source '$FUNC_TEST_SCRIPT' >/dev/null 2>&1
|
|
258
|
+
! test_local_binary '' 2>/dev/null
|
|
259
|
+
"
|
|
260
|
+
|
|
261
|
+
test "test_local_binary returns error for nonexistent" bash -c "
|
|
262
|
+
source '$FUNC_TEST_SCRIPT' >/dev/null 2>&1
|
|
263
|
+
! test_local_binary '/nonexistent/path/binary' 2>/dev/null
|
|
264
|
+
"
|
|
265
|
+
|
|
266
|
+
echo ""
|
|
267
|
+
|
|
268
|
+
# ── --skip-if-installed behavior ───────────────────────
|
|
269
|
+
|
|
270
|
+
echo "--- --skip-if-installed ---" | cyan
|
|
271
|
+
|
|
272
|
+
test "--skip-if-installed flag accepted" bash -c "
|
|
273
|
+
bash '$INSTALL_SCRIPT' --skip-if-installed --dry-run 2>&1 | grep -qi 'DRY-RUN\|Already\|Install'
|
|
274
|
+
"
|
|
275
|
+
|
|
276
|
+
echo ""
|
|
277
|
+
|
|
278
|
+
# ── Header UX ──────────────────────────────────────────
|
|
279
|
+
|
|
280
|
+
echo "--- Header ---" | cyan
|
|
281
|
+
|
|
282
|
+
test "header is ASCII (no box-drawing chars)" bash -c "
|
|
283
|
+
bash '$INSTALL_SCRIPT' --locate 2>&1 | grep -q '===='
|
|
284
|
+
"
|
|
285
|
+
|
|
286
|
+
test "header does not contain Unicode box-drawing" bash -c "
|
|
287
|
+
! bash '$INSTALL_SCRIPT' --locate 2>&1 | grep -P '[\x{2500}-\x{257F}]' 2>/dev/null || true
|
|
288
|
+
"
|
|
289
|
+
|
|
290
|
+
echo ""
|
|
291
|
+
|
|
292
|
+
# ── Edge cases ─────────────────────────────────────────
|
|
293
|
+
|
|
294
|
+
echo "--- Edge cases ---" | cyan
|
|
295
|
+
|
|
296
|
+
test "double dash in --version handled (no operator parsing)" bash -c "
|
|
297
|
+
bash '$INSTALL_SCRIPT' --locate 2>&1 | grep -q 'version'
|
|
298
|
+
"
|
|
299
|
+
|
|
300
|
+
test "empty --version with dry-run doesn't download" bash -c "
|
|
301
|
+
bash '$INSTALL_SCRIPT' --dry-run --silent 2>&1 | grep -qi 'DRY-RUN\|Already'
|
|
302
|
+
"
|
|
303
|
+
|
|
304
|
+
echo ""
|
|
305
|
+
|
|
306
|
+
# ── Summary ────────────────────────────────────────────
|
|
307
|
+
|
|
308
|
+
cyan "============================================"
|
|
309
|
+
TOTAL=$((PASS + FAIL))
|
|
310
|
+
if [[ $FAIL -eq 0 ]]; then
|
|
311
|
+
green " Results: $PASS / $TOTAL passed"
|
|
312
|
+
else
|
|
313
|
+
red " Results: $PASS / $TOTAL passed"
|
|
314
|
+
fi
|
|
315
|
+
cyan "============================================"
|
|
316
|
+
|
|
317
|
+
if [[ $FAIL -gt 0 ]]; then
|
|
318
|
+
echo ""
|
|
319
|
+
red "FAILURES: $FAIL tests failed"
|
|
320
|
+
exit 1
|
|
321
|
+
fi
|
|
322
|
+
exit 0
|