Skip to content

Commit

Permalink
[Fix] nvm_get_arch: proper value for alpine linux
Browse files Browse the repository at this point in the history
  • Loading branch information
asolopovas authored and ljharb committed Sep 30, 2023
1 parent b64e547 commit 44f91d0
Show file tree
Hide file tree
Showing 3 changed files with 139 additions and 0 deletions.
41 changes: 41 additions & 0 deletions .github/workflows/windows-npm.yml
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,47 @@ jobs:
nvm install ${{ matrix.npm-node-version }}
node -v
wsl_matrix_unofficial:
name: 'WSL nvm install'
defaults:
run:
shell: wsl-bash {0}
runs-on: windows-latest
env:
WSLENV: NVM_INSTALL_GITHUB_REPO:NVM_INSTALL_VERSION:/p
NVM_NODEJS_ORG_MIRROR: https://unofficial-builds.nodejs.org/download/release
strategy:
fail-fast: false
matrix:
wsl-distrib:
- Alpine
npm-node-version:
- '--lts'
- '21'
- '18'
- '16'
- '14'
- '12'
- '11'
- '10'
method:
- ''
- 'script'
steps:
- uses: Vampire/setup-wsl@v1
with:
distribution: ${{ matrix.wsl-distrib }}
additional-packages: bash git curl ca-certificates wget
- name: Retrieve nvm on WSL
run: |
if [ -z "${{ matrix.method }}" ]; then
curl -fsSLo- "https://raw.githubusercontent.com/${NVM_INSTALL_GITHUB_REPO}/${NVM_INSTALL_VERSION}/install.sh" | bash
else
curl -fsSLo- "https://raw.githubusercontent.com/${NVM_INSTALL_GITHUB_REPO}/${NVM_INSTALL_VERSION}/install.sh" | METHOD="${{matrix.method}}" bash
fi
. "$HOME/.nvm/nvm.sh"
nvm install ${{ matrix.npm-node-version }}
nvm_windows:
name: 'tests, on windows'
permissions:
Expand Down
4 changes: 4 additions & 0 deletions nvm.sh
Original file line number Diff line number Diff line change
Expand Up @@ -1965,6 +1965,10 @@ nvm_get_arch() {
HOST_ARCH=armv7l
fi

if [ -f "/etc/alpine-release" ]; then
NVM_ARCH=x64-musl
fi

nvm_echo "${NVM_ARCH}"
}

Expand Down
94 changes: 94 additions & 0 deletions test/fast/Unit tests/nvm_get_arch_unofficial
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
#!/bin/sh

# Save the PATH as it was when the test started to restore it when it finishes
ORIG_PATH="${PATH}"

cleanup() {
# Restore the PATH as it was when the test started
export PATH="${ORIG_PATH}"
rm -rf "${TMP_DIR}"
}

die() {
cleanup
echo "$@"
exit 1
}

. ../../../nvm.sh

# Sets the PATH for these tests to include the symlinks to the mocked binaries
export PATH=".:${PATH}"

TMP_DIR=$(mktemp -d)
CHROOT_WITH_ALPINE="$TMP_DIR/with_alpine"
CHROOT_WITHOUT_ALPINE="$TMP_DIR/without_alpine"

setup_chroot() {
chroot_dir=$1

# Directories
mkdir -p "${chroot_dir}/etc"
mkdir -p "${chroot_dir}/bin"
mkdir -p "${chroot_dir}/usr/bin"
mkdir -p "${chroot_dir}/lib64"
mkdir -p "${chroot_dir}/dev"

# Files and binaries
cp ../../../nvm.sh "${chroot_dir}/"
cp /bin/sh /usr/bin/dirname "${chroot_dir}/bin/"
[ "${chroot_dir}" = "${CHROOT_WITH_ALPINE}" ] && touch "${chroot_dir}/etc/alpine-release"

# Libraries
for binary in /bin/sh /usr/bin/dirname; do
for lib in $(ldd $binary | awk '{print $3}' | grep "^/"); do
dir=$(dirname "${lib}")
mkdir -p "${chroot_dir}${dir}"
cp "${lib}" "${chroot_dir}${dir}/"
done
done

# Dynamic linker
cp /lib64/ld-linux-x86-64.so.2 "${chroot_dir}/lib64/"

# /dev/null
sudo mknod "${chroot_dir}/dev/null" c 1 3
}

setup_chroot "${CHROOT_WITH_ALPINE}"
setup_chroot "${CHROOT_WITHOUT_ALPINE}"

# Run tests in chroot environments
ARCH_WITH_ALPINE=$(sudo chroot "${CHROOT_WITH_ALPINE}" /bin/sh -c ". ./nvm.sh && nvm_get_arch")
[ "${ARCH_WITH_ALPINE}" = "x64-musl" ] || die "Expected x64-musl for alpine environment but got ${ARCH_WITH_ALPINE}"

ARCH_WITHOUT_ALPINE=$(sudo chroot "${CHROOT_WITHOUT_ALPINE}" /bin/sh -c ". ./nvm.sh && nvm_get_arch")
[ "${ARCH_WITHOUT_ALPINE}" != "x64-musl" ] || die "Did not expect x64-musl for non-alpine environment"

# Run tests for nvm ls-remote
test_default_ls_remote() {
mock_response='N/A'
result=$(NVM_NODEJS_ORG_MIRROR='http://nonexistent-url' nvm ls-remote 18)
if [ "${result}" = "${mock_response}" ]; then
die "Test failed: Expected '${mock_response}' for but got '${result}'"
else
echo "Test passed"
fi
}

test_unofficial_mirror_ls_remote() {
mock_response='v18.18.0 (LTS: Hydrogen)'
result=$(NVM_NODEJS_ORG_MIRROR='https://unofficial-builds.nodejs.org/download/release' nvm ls-remote 18.18.0 | sed -e 's/^[[:space:]]*//')
result=$(echo "${result}" | sed 's/\x1b\[[0-9;]*m//g')

if [ "${result}" = "${mock_response}" ]; then
echo "Test passed"
else
die "Test failed: Expected '${mock_response}' but got '${result}'"
fi
}

test_default_ls_remote
test_unofficial_mirror_ls_remote

cleanup

0 comments on commit 44f91d0

Please sign in to comment.