asdf

Форк
0
/
shim_exec.bats 
449 строк · 13.4 Кб
1
#!/usr/bin/env bats
2
# shellcheck disable=SC2016,SC2164
3

4
load test_helpers
5

6
setup() {
7
  setup_asdf_dir
8
  install_dummy_plugin
9

10
  PROJECT_DIR="$HOME/project"
11
  mkdir -p "$PROJECT_DIR"
12
  cd "$PROJECT_DIR"
13

14
  # asdf lib needed to run generated shims
15
  cp -rf "$BATS_TEST_DIRNAME"/../{bin,lib} "$ASDF_DIR/"
16
}
17

18
teardown() {
19
  clean_asdf_dir
20
}
21

22
@test "asdf exec without argument should display help" {
23
  run asdf exec
24
  [ "$status" -eq 1 ]
25
  echo "$output" | grep "usage: asdf exec <command>"
26
}
27

28
@test "asdf exec should pass all arguments to executable" {
29
  echo "dummy 1.0" >"$PROJECT_DIR/.tool-versions"
30
  run asdf install
31

32
  run asdf exec dummy world hello
33
  [ "$output" = "This is Dummy 1.0! hello world" ]
34
  [ "$status" -eq 0 ]
35
}
36

37
@test "asdf exec should pass all arguments to executable even if shim is not in PATH" {
38
  echo "dummy 1.0" >"$PROJECT_DIR/.tool-versions"
39
  run asdf install
40

41
  path=$(echo "$PATH" | sed -e "s|$(asdf_data_dir)/shims||g; s|::|:|g")
42
  run env PATH="$path" which dummy
43
  [ "$output" = "" ]
44
  [ "$status" -eq 1 ]
45

46
  run env PATH="$path" asdf exec dummy world hello
47
  [ "$output" = "This is Dummy 1.0! hello world" ]
48
  [ "$status" -eq 0 ]
49
}
50

51
@test "shim exec should pass all arguments to executable" {
52
  echo "dummy 1.0" >"$PROJECT_DIR/.tool-versions"
53
  run asdf install
54

55
  run "$ASDF_DIR/shims/dummy" world hello
56
  [ "$output" = "This is Dummy 1.0! hello world" ]
57
  [ "$status" -eq 0 ]
58
}
59

60
@test "shim exec should pass stdin to executable" {
61
  echo "dummy 1.0" >"$PROJECT_DIR/.tool-versions"
62
  run asdf install
63

64
  echo "tr [:lower:] [:upper:]" >"$ASDF_DIR/installs/dummy/1.0/bin/upper"
65
  chmod +x "$ASDF_DIR/installs/dummy/1.0/bin/upper"
66

67
  run asdf reshim dummy 1.0
68

69
  run echo "$(echo hello | "$ASDF_DIR/shims/upper")"
70
  [ "$output" = "HELLO" ]
71
  [ "$status" -eq 0 ]
72
}
73

74
@test "shim exec should fail if no version is selected" {
75
  run asdf install dummy 1.0
76

77
  touch "$PROJECT_DIR/.tool-versions"
78

79
  run "$ASDF_DIR/shims/dummy" world hello
80
  [ "$status" -eq 126 ]
81
  echo "$output" | grep -q "No version is set for command dummy" 2>/dev/null
82
}
83

84
@test "shim exec should suggest which plugin to use when no version is selected" {
85
  run asdf install dummy 1.0
86
  run asdf install dummy 2.0.0
87

88
  touch "$PROJECT_DIR/.tool-versions"
89

90
  run "$ASDF_DIR/shims/dummy" world hello
91
  [ "$status" -eq 126 ]
92

93
  echo "$output" | grep -q "No version is set for command dummy" 2>/dev/null
94
  echo "$output" | grep -q "Consider adding one of the following versions in your config file at $PROJECT_DIR/.tool-versions" 2>/dev/null
95
  echo "$output" | grep -q "dummy 1.0" 2>/dev/null
96
  echo "$output" | grep -q "dummy 2.0.0" 2>/dev/null
97
}
98

99
@test "shim exec should suggest different plugins providing same tool when no version is selected" {
100
  # Another fake plugin with 'dummy' executable
101
  cp -rf "$ASDF_DIR/plugins/dummy" "$ASDF_DIR/plugins/mummy"
102

103
  run asdf install dummy 1.0
104
  run asdf install mummy 3.0
105

106
  touch "$PROJECT_DIR/.tool-versions"
107

108
  run "$ASDF_DIR/shims/dummy" world hello
109
  [ "$status" -eq 126 ]
110

111
  echo "$output" | grep -q "No version is set for command dummy" 2>/dev/null
112
  echo "$output" | grep -q "Consider adding one of the following versions in your config file at $PROJECT_DIR/.tool-versions" 2>/dev/null
113
  echo "$output" | grep -q "dummy 1.0" 2>/dev/null
114
  echo "$output" | grep -q "mummy 3.0" 2>/dev/null
115
}
116

117
@test "shim exec should suggest to install missing version" {
118
  run asdf install dummy 1.0
119

120
  echo "dummy 2.0.0 1.3" >"$PROJECT_DIR/.tool-versions"
121

122
  run "$ASDF_DIR/shims/dummy" world hello
123
  [ "$status" -eq 126 ]
124
  echo "$output" | grep -q "No preset version installed for command dummy" 2>/dev/null
125
  echo "$output" | grep -q "Please install a version by running one of the following:" 2>/dev/null
126
  echo "$output" | grep -q "asdf install dummy 2.0.0" 2>/dev/null
127
  echo "$output" | grep -q "asdf install dummy 1.3" 2>/dev/null
128
  echo "$output" | grep -q "or add one of the following versions in your config file at $PROJECT_DIR/.tool-versions" 2>/dev/null
129
  echo "$output" | grep -q "dummy 1.0" 2>/dev/null
130
}
131

132
@test "shim exec should execute first plugin that is installed and set" {
133
  run asdf install dummy 2.0.0
134
  run asdf install dummy 3.0
135

136
  echo "dummy 1.0 3.0 2.0.0" >"$PROJECT_DIR/.tool-versions"
137

138
  run "$ASDF_DIR/shims/dummy" world hello
139
  [ "$status" -eq 0 ]
140

141
  echo "$output" | grep -q "This is Dummy 3.0! hello world" 2>/dev/null
142
}
143

144
@test "shim exec should only use the first version found for a plugin" {
145
  run asdf install dummy 3.0
146

147
  echo "dummy 3.0" >"$PROJECT_DIR/.tool-versions"
148
  echo "dummy 1.0" >>"$PROJECT_DIR/.tool-versions"
149

150
  run "$ASDF_DIR/shims/dummy" world hello
151
  [ "$status" -eq 0 ]
152

153
  echo "$output" | grep -q "This is Dummy 3.0! hello world" 2>/dev/null
154
}
155

156
@test "shim exec should determine correct executable on two projects using different plugins that provide the same tool" {
157
  # Another fake plugin with 'dummy' executable
158
  cp -rf "$ASDF_DIR/plugins/dummy" "$ASDF_DIR/plugins/mummy"
159
  sed -i -e 's/Dummy/Mummy/' "$ASDF_DIR/plugins/mummy/bin/install"
160

161
  run asdf install mummy 3.0
162
  run asdf install dummy 1.0
163

164
  mkdir "$PROJECT_DIR"/{A,B}
165
  echo "dummy 1.0" >"$PROJECT_DIR/A/.tool-versions"
166
  echo "mummy 3.0" >"$PROJECT_DIR/B/.tool-versions"
167

168
  cd "$PROJECT_DIR"/A
169
  run "$ASDF_DIR/shims/dummy" world hello
170
  [ "$output" = "This is Dummy 1.0! hello world" ]
171
  [ "$status" -eq 0 ]
172

173
  cd "$PROJECT_DIR"/B
174
  run "$ASDF_DIR/shims/dummy" world hello
175
  [ "$output" = "This is Mummy 3.0! hello world" ]
176
  [ "$status" -eq 0 ]
177
}
178

179
@test "shim exec should determine correct executable on a project with two plugins set that provide the same tool" {
180
  # Another fake plugin with 'dummy' executable
181
  cp -rf "$ASDF_DIR/plugins/dummy" "$ASDF_DIR/plugins/mummy"
182
  sed -i -e 's/Dummy/Mummy/' "$ASDF_DIR/plugins/mummy/bin/install"
183

184
  run asdf install dummy 1.0
185
  run asdf install mummy 3.0
186

187
  echo "dummy 2.0.0" >"$PROJECT_DIR/.tool-versions"
188
  echo "mummy 3.0" >>"$PROJECT_DIR/.tool-versions"
189
  echo "dummy 1.0" >>"$PROJECT_DIR/.tool-versions"
190

191
  run "$ASDF_DIR/shims/dummy" world hello
192
  [ "$output" = "This is Mummy 3.0! hello world" ]
193
  [ "$status" -eq 0 ]
194
}
195

196
@test "shim exec should fallback to system executable when specified version is system" {
197
  run asdf install dummy 1.0
198

199
  echo "dummy system" >"$PROJECT_DIR/.tool-versions"
200

201
  mkdir "$PROJECT_DIR/foo/"
202
  echo "echo System" >"$PROJECT_DIR/foo/dummy"
203
  chmod +x "$PROJECT_DIR/foo/dummy"
204

205
  run env "PATH=$PATH:$PROJECT_DIR/foo" "$ASDF_DIR/shims/dummy" hello
206
  [ "$output" = "System" ]
207
}
208

209
# NOTE: The name of this test is linked to a condition in `test_helpers.bash. See
210
# the 'setup_asdf_dir' function for details.
211
@test "shim exec should use path executable when specified version path:<path>" {
212
  run asdf install dummy 1.0
213

214
  CUSTOM_DUMMY_PATH="$PROJECT_DIR/foo"
215
  CUSTOM_DUMMY_BIN_PATH="$CUSTOM_DUMMY_PATH/bin"
216
  mkdir -p "$CUSTOM_DUMMY_BIN_PATH"
217
  echo "echo System" >"$CUSTOM_DUMMY_BIN_PATH/dummy"
218
  chmod +x "$CUSTOM_DUMMY_BIN_PATH/dummy"
219

220
  echo "dummy path:$CUSTOM_DUMMY_PATH" >"$PROJECT_DIR/.tool-versions"
221

222
  run "$ASDF_DIR/shims/dummy" hello
223
  [ "$output" = "System" ]
224
}
225

226
@test "shim exec should execute system if set first" {
227
  run asdf install dummy 2.0.0
228

229
  echo "dummy system" >"$PROJECT_DIR/.tool-versions"
230
  echo "dummy 2.0.0" >>"$PROJECT_DIR/.tool-versions"
231

232
  mkdir "$PROJECT_DIR/foo/"
233
  echo "echo System" >"$PROJECT_DIR/foo/dummy"
234
  chmod +x "$PROJECT_DIR/foo/dummy"
235

236
  run env "PATH=$PATH:$PROJECT_DIR/foo" "$ASDF_DIR/shims/dummy" hello
237
  [ "$output" = "System" ]
238
}
239

240
@test "shim exec should use custom exec-env for tool" {
241
  run asdf install dummy 2.0.0
242
  echo "export FOO=sourced" >"$ASDF_DIR/plugins/dummy/bin/exec-env"
243
  mkdir "$ASDF_DIR/plugins/dummy/shims"
244
  echo 'echo $FOO custom' >"$ASDF_DIR/plugins/dummy/shims/foo"
245
  chmod +x "$ASDF_DIR/plugins/dummy/shims/foo"
246
  run asdf reshim dummy 2.0.0
247

248
  echo "dummy 2.0.0" >"$PROJECT_DIR/.tool-versions"
249
  run "$ASDF_DIR/shims/foo"
250
  [ "$output" = "sourced custom" ]
251
}
252

253
@test "shim exec with custom exec-env using ASDF_INSTALL_PATH" {
254
  run asdf install dummy 2.0.0
255
  echo 'export FOO=$ASDF_INSTALL_PATH/foo' >"$ASDF_DIR/plugins/dummy/bin/exec-env"
256
  mkdir "$ASDF_DIR/plugins/dummy/shims"
257
  echo 'echo $FOO custom' >"$ASDF_DIR/plugins/dummy/shims/foo"
258
  chmod +x "$ASDF_DIR/plugins/dummy/shims/foo"
259
  run asdf reshim dummy 2.0.0
260

261
  echo "dummy 2.0.0" >"$PROJECT_DIR/.tool-versions"
262
  run "$ASDF_DIR/shims/foo"
263
  [ "$output" = "$ASDF_DIR/installs/dummy/2.0.0/foo custom" ]
264
}
265

266
@test "shim exec doest not use custom exec-env for system version" {
267
  run asdf install dummy 2.0.0
268
  echo "export FOO=sourced" >"$ASDF_DIR/plugins/dummy/bin/exec-env"
269
  mkdir "$ASDF_DIR/plugins/dummy/shims"
270
  echo 'echo $FOO custom' >"$ASDF_DIR/plugins/dummy/shims/foo"
271
  chmod +x "$ASDF_DIR/plugins/dummy/shims/foo"
272
  run asdf reshim dummy 2.0.0
273

274
  echo "dummy system" >"$PROJECT_DIR/.tool-versions"
275

276
  mkdir "$PROJECT_DIR/sys/"
277
  echo 'echo x$FOO System' >"$PROJECT_DIR/sys/foo"
278
  chmod +x "$PROJECT_DIR/sys/foo"
279

280
  run env "PATH=$PATH:$PROJECT_DIR/sys" "$ASDF_DIR/shims/foo"
281
  [ "$output" = "x System" ]
282
}
283

284
@test "shim exec should prepend the plugin paths on execution" {
285
  run asdf install dummy 2.0.0
286

287
  mkdir "$ASDF_DIR/plugins/dummy/shims"
288
  echo 'which dummy' >"$ASDF_DIR/plugins/dummy/shims/foo"
289
  chmod +x "$ASDF_DIR/plugins/dummy/shims/foo"
290
  run asdf reshim dummy 2.0.0
291

292
  echo "dummy 2.0.0" >"$PROJECT_DIR/.tool-versions"
293

294
  run "$ASDF_DIR/shims/foo"
295
  [ "$output" = "$ASDF_DIR/installs/dummy/2.0.0/bin/dummy" ]
296
}
297

298
@test "shim exec should be able to find other shims in path" {
299
  cp -rf "$ASDF_DIR/plugins/dummy" "$ASDF_DIR/plugins/gummy"
300

301
  echo "dummy 2.0.0" >"$PROJECT_DIR/.tool-versions"
302
  echo "gummy 2.0.0" >>"$PROJECT_DIR/.tool-versions"
303

304
  run asdf install
305

306
  mkdir "$ASDF_DIR/plugins/"{dummy,gummy}/shims
307

308
  echo 'which dummy' >"$ASDF_DIR/plugins/dummy/shims/foo"
309
  chmod +x "$ASDF_DIR/plugins/dummy/shims/foo"
310

311
  echo 'which gummy' >"$ASDF_DIR/plugins/dummy/shims/bar"
312
  chmod +x "$ASDF_DIR/plugins/dummy/shims/bar"
313

314
  touch "$ASDF_DIR/plugins/gummy/shims/gummy"
315
  chmod +x "$ASDF_DIR/plugins/gummy/shims/gummy"
316

317
  run asdf reshim
318

319
  run "$ASDF_DIR/shims/foo"
320
  [ "$output" = "$ASDF_DIR/installs/dummy/2.0.0/bin/dummy" ]
321

322
  run "$ASDF_DIR/shims/bar"
323
  [ "$output" = "$ASDF_DIR/shims/gummy" ]
324
}
325

326
@test "shim exec should remove shim_path from path on system version execution" {
327
  run asdf install dummy 2.0.0
328

329
  echo "dummy system" >"$PROJECT_DIR/.tool-versions"
330

331
  mkdir "$PROJECT_DIR/sys/"
332
  echo 'which dummy' >"$PROJECT_DIR/sys/dummy"
333
  chmod +x "$PROJECT_DIR/sys/dummy"
334

335
  run env "PATH=$PATH:$PROJECT_DIR/sys" "$ASDF_DIR/shims/dummy"
336
  [ "$output" = "$ASDF_DIR/shims/dummy" ]
337
}
338

339
@test "shim exec can take version from legacy file if configured" {
340
  run asdf install dummy 2.0.0
341

342
  echo "legacy_version_file = yes" >"$HOME/.asdfrc"
343
  echo "2.0.0" >"$PROJECT_DIR/.dummy-version"
344

345
  run "$ASDF_DIR/shims/dummy" world hello
346
  [ "$output" = "This is Dummy 2.0.0! hello world" ]
347
}
348

349
@test "shim exec can take version from environment variable" {
350
  run asdf install dummy 2.0.0
351
  run env ASDF_DUMMY_VERSION=2.0.0 "$ASDF_DIR/shims/dummy" world hello
352
  [ "$output" = "This is Dummy 2.0.0! hello world" ]
353
}
354

355
@test "shim exec uses plugin list-bin-paths" {
356
  exec_path="$ASDF_DIR/plugins/dummy/bin/list-bin-paths"
357
  custom_path="$ASDF_DIR/installs/dummy/1.0/custom"
358

359
  echo "echo bin custom" >"$exec_path"
360
  chmod +x "$exec_path"
361

362
  run asdf install dummy 1.0
363
  echo "dummy 1.0" >"$PROJECT_DIR/.tool-versions"
364

365
  mkdir "$custom_path"
366
  echo "echo CUSTOM" >"$custom_path/foo"
367
  chmod +x "$custom_path/foo"
368

369
  run asdf reshim dummy 1.0
370

371
  run "$ASDF_DIR/shims/foo"
372
  [ "$output" = "CUSTOM" ]
373
}
374

375
@test "shim exec uses plugin custom exec-path hook" {
376
  run asdf install dummy 1.0
377

378
  exec_path="$ASDF_DIR/plugins/dummy/bin/exec-path"
379
  custom_dummy="$ASDF_DIR/installs/dummy/1.0/custom/dummy"
380

381
  echo "echo custom/dummy" >"$exec_path"
382
  chmod +x "$exec_path"
383

384
  mkdir "$(dirname "$custom_dummy")"
385
  echo "echo CUSTOM" >"$custom_dummy"
386
  chmod +x "$custom_dummy"
387

388
  echo "dummy 1.0" >"$PROJECT_DIR/.tool-versions"
389

390
  run "$ASDF_DIR/shims/dummy"
391
  [ "$output" = "CUSTOM" ]
392
}
393

394
@test "shim exec uses plugin custom exec-path hook that defaults" {
395
  run asdf install dummy 1.0
396

397
  exec_path="$ASDF_DIR/plugins/dummy/bin/exec-path"
398
  echo 'echo $3 # always same path' >"$exec_path"
399
  chmod +x "$exec_path"
400

401
  echo "dummy 1.0" >"$PROJECT_DIR/.tool-versions"
402

403
  run "$ASDF_DIR/shims/dummy"
404
  [ "$output" = "This is Dummy 1.0!" ]
405
}
406

407
@test "shim exec executes configured pre-hook" {
408
  run asdf install dummy 1.0
409
  echo dummy 1.0 >"$PROJECT_DIR/.tool-versions"
410

411
  cat >"$HOME/.asdfrc" <<-'EOM'
412
pre_dummy_dummy = echo PRE $version $1 $2
413
EOM
414

415
  run "$ASDF_DIR/shims/dummy" hello world
416
  [ "$status" -eq 0 ]
417
  echo "$output" | grep "PRE 1.0 hello world"
418
  echo "$output" | grep "This is Dummy 1.0! world hello"
419
}
420

421
@test "shim exec doesnt execute command if pre-hook failed" {
422
  run asdf install dummy 1.0
423
  echo dummy 1.0 >"$PROJECT_DIR/.tool-versions"
424

425
  mkdir "$HOME/hook"
426
  pre_cmd="$HOME/hook/pre"
427
  echo 'echo $* && false' >"$pre_cmd"
428
  chmod +x "$pre_cmd"
429

430
  cat >"$HOME/.asdfrc" <<'EOM'
431
pre_dummy_dummy = pre $1 no $plugin_name $2
432
EOM
433

434
  run env PATH="$PATH:$HOME/hook" "$ASDF_DIR/shims/dummy" hello world
435
  [ "$output" = "hello no dummy world" ]
436
  [ "$status" -eq 1 ]
437
}
438

439
# From @tejanium in https://github.com/asdf-vm/asdf/issues/581#issuecomment-635337727
440
@test "asdf exec should not crash when POSIXLY_CORRECT=1" {
441
  export POSIXLY_CORRECT=1
442

443
  echo "dummy 1.0" >"$PROJECT_DIR/.tool-versions"
444
  run asdf install
445

446
  run asdf exec dummy world hello
447
  [ "$output" = "This is Dummy 1.0! hello world" ]
448
  [ "$status" -eq 0 ]
449
}
450

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.