mirror of
https://github.com/privatevoid-net/nix-super.git
synced 2024-11-24 14:56:15 +02:00
Build Functional tests with Meson
Co-Authored-By: Qyriad <qyriad@qyriad.me> Co-authored-by: Robert Hensing <roberth@users.noreply.github.com>
This commit is contained in:
parent
d434a54b6c
commit
34fe2478a2
29 changed files with 678 additions and 115 deletions
|
@ -210,6 +210,9 @@
|
|||
"${nixpkgsPrefix}${pkgName}-${testName}" = test;
|
||||
})
|
||||
)
|
||||
// lib.optionalAttrs (nixpkgs.stdenv.hostPlatform == nixpkgs.stdenv.buildPlatform) {
|
||||
"${nixpkgsPrefix}nix-functional-tests" = nixpkgs.nixComponents.nix-functional-tests;
|
||||
}
|
||||
)
|
||||
// devFlake.checks.${system} or {}
|
||||
);
|
||||
|
@ -323,6 +326,7 @@
|
|||
++ lib.optionals havePerl pkgs.nixComponents.nix-perl-bindings.nativeBuildInputs
|
||||
++ pkgs.nixComponents.nix-internal-api-docs.nativeBuildInputs
|
||||
++ pkgs.nixComponents.nix-external-api-docs.nativeBuildInputs
|
||||
++ pkgs.nixComponents.nix-functional-tests.baseNativeBuildInputs
|
||||
++ lib.optional
|
||||
(!stdenv.buildPlatform.canExecute stdenv.hostPlatform
|
||||
# Hack around https://github.com/nixos/nixpkgs/commit/bf7ad8cfbfa102a90463433e2c5027573b462479
|
||||
|
|
|
@ -42,3 +42,4 @@ subproject('nix-fetchers-tests')
|
|||
subproject('nix-expr-test-support')
|
||||
subproject('nix-expr-tests')
|
||||
subproject('nix-flake-tests')
|
||||
subproject('nix-functional-tests')
|
||||
|
|
|
@ -59,6 +59,8 @@ in
|
|||
# Will replace `nix` once the old build system is gone.
|
||||
nix-ng = callPackage ../src/nix/package.nix { version = fineVersion; };
|
||||
|
||||
nix-functional-tests = callPackage ../src/nix-functional-tests/package.nix { version = fineVersion; };
|
||||
|
||||
nix-internal-api-docs = callPackage ../src/internal-api-docs/package.nix { version = fineVersion; };
|
||||
nix-external-api-docs = callPackage ../src/external-api-docs/package.nix { version = fineVersion; };
|
||||
|
||||
|
|
|
@ -62,6 +62,7 @@ let
|
|||
"nix-main-c"
|
||||
"nix-cmd"
|
||||
"nix-ng"
|
||||
"nix-functional-tests"
|
||||
];
|
||||
in
|
||||
{
|
||||
|
@ -75,8 +76,10 @@ in
|
|||
lib.genAttrs linux64BitSystems (system: nixpkgsFor.${system}.static.nixComponents.${pkgName}));
|
||||
|
||||
buildCross = forAllPackages (pkgName:
|
||||
forAllCrossSystems (crossSystem:
|
||||
lib.genAttrs [ "x86_64-linux" ] (system: nixpkgsFor.${system}.cross.${crossSystem}.nixComponents.${pkgName})));
|
||||
# Hack to avoid non-evaling package
|
||||
(if pkgName == "nix-functional-tests" then lib.flip builtins.removeAttrs ["x86_64-w64-mingw32"] else lib.id)
|
||||
(forAllCrossSystems (crossSystem:
|
||||
lib.genAttrs [ "x86_64-linux" ] (system: nixpkgsFor.${system}.cross.${crossSystem}.nixComponents.${pkgName}))));
|
||||
|
||||
buildNoGc = forAllSystems (system:
|
||||
self.packages.${system}.nix.override { enableGC = false; }
|
||||
|
|
|
@ -21,7 +21,7 @@ configdata = configuration_data()
|
|||
# TODO rename, because it will conflict with downstream projects
|
||||
configdata.set_quoted('PACKAGE_VERSION', meson.project_version())
|
||||
|
||||
configdata.set_quoted('SYSTEM', host_machine.system())
|
||||
configdata.set_quoted('SYSTEM', host_machine.cpu_family() + '-' + host_machine.system())
|
||||
|
||||
deps_private_maybe_subproject = [
|
||||
]
|
||||
|
|
1
src/nix-functional-tests
Symbolic link
1
src/nix-functional-tests
Symbolic link
|
@ -0,0 +1 @@
|
|||
../tests/functional
|
1
tests/functional/.version
Symbolic link
1
tests/functional/.version
Symbolic link
|
@ -0,0 +1 @@
|
|||
../../.version
|
33
tests/functional/ca/meson.build
Normal file
33
tests/functional/ca/meson.build
Normal file
|
@ -0,0 +1,33 @@
|
|||
configure_file(
|
||||
input : 'config.nix.in',
|
||||
output : 'config.nix',
|
||||
configuration : test_confdata,
|
||||
)
|
||||
|
||||
suites += {
|
||||
'name': 'ca',
|
||||
'deps': [],
|
||||
'tests': [
|
||||
'build-with-garbage-path.sh',
|
||||
'build.sh',
|
||||
'build-cache.sh',
|
||||
'concurrent-builds.sh',
|
||||
'derivation-json.sh',
|
||||
'duplicate-realisation-in-closure.sh',
|
||||
'eval-store.sh',
|
||||
'gc.sh',
|
||||
'import-derivation.sh',
|
||||
'new-build-cmd.sh',
|
||||
'nix-copy.sh',
|
||||
'nix-run.sh',
|
||||
'nix-shell.sh',
|
||||
'post-hook.sh',
|
||||
'recursive.sh',
|
||||
'repl.sh',
|
||||
'selfref-gc.sh',
|
||||
'signatures.sh',
|
||||
'substitute.sh',
|
||||
'why-depends.sh',
|
||||
],
|
||||
'workdir': meson.current_build_dir(),
|
||||
}
|
|
@ -8,7 +8,8 @@ COMMON_SH_SOURCED=1
|
|||
|
||||
functionalTestsDir="$(readlink -f "$(dirname "${BASH_SOURCE[0]-$0}")")"
|
||||
|
||||
source "$functionalTestsDir/common/vars-and-functions.sh"
|
||||
source "$functionalTestsDir/common/vars.sh"
|
||||
source "$functionalTestsDir/common/functions.sh"
|
||||
source "$functionalTestsDir/common/init.sh"
|
||||
|
||||
if [[ -n "${NIX_DAEMON_PACKAGE:-}" ]]; then
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
# NOTE: instances of @variable@ are substituted as defined in /mk/templates.mk
|
||||
# shellcheck shell=bash
|
||||
|
||||
set -eu -o pipefail
|
||||
|
||||
if [[ -z "${COMMON_VARS_AND_FUNCTIONS_SH_SOURCED-}" ]]; then
|
||||
if [[ -z "${COMMON_FUNCTIONS_SH_SOURCED-}" ]]; then
|
||||
|
||||
COMMON_VARS_AND_FUNCTIONS_SH_SOURCED=1
|
||||
COMMON_FUNCTIONS_SH_SOURCED=1
|
||||
|
||||
isTestOnNixOS() {
|
||||
[[ "${isTestOnNixOS:-}" == 1 ]]
|
||||
|
@ -15,64 +15,14 @@ die() {
|
|||
exit 1
|
||||
}
|
||||
|
||||
set +x
|
||||
|
||||
commonDir="$(readlink -f "$(dirname "${BASH_SOURCE[0]-$0}")")"
|
||||
|
||||
source "$commonDir/subst-vars.sh"
|
||||
# Make sure shellcheck knows all these will be defined by the above generated snippet
|
||||
: "${bindir?} ${coreutils?} ${dot?} ${SHELL?} ${PAGER?} ${busybox?} ${version?} ${system?} ${BUILD_SHARED_LIBS?}"
|
||||
|
||||
source "$commonDir/paths.sh"
|
||||
source "$commonDir/test-root.sh"
|
||||
|
||||
test_nix_conf_dir=$TEST_ROOT/etc
|
||||
test_nix_conf=$test_nix_conf_dir/nix.conf
|
||||
|
||||
export TEST_HOME=$TEST_ROOT/test-home
|
||||
|
||||
if ! isTestOnNixOS; then
|
||||
export NIX_STORE_DIR
|
||||
if ! NIX_STORE_DIR=$(readlink -f $TEST_ROOT/store 2> /dev/null); then
|
||||
# Maybe the build directory is symlinked.
|
||||
export NIX_IGNORE_SYMLINK_STORE=1
|
||||
NIX_STORE_DIR=$TEST_ROOT/store
|
||||
fi
|
||||
export NIX_LOCALSTATE_DIR=$TEST_ROOT/var
|
||||
export NIX_LOG_DIR=$TEST_ROOT/var/log/nix
|
||||
export NIX_STATE_DIR=$TEST_ROOT/var/nix
|
||||
export NIX_CONF_DIR=$test_nix_conf_dir
|
||||
export NIX_DAEMON_SOCKET_PATH=$TEST_ROOT/dSocket
|
||||
unset NIX_USER_CONF_FILES
|
||||
export _NIX_TEST_SHARED=$TEST_ROOT/shared
|
||||
if [[ -n $NIX_STORE ]]; then
|
||||
export _NIX_TEST_NO_SANDBOX=1
|
||||
fi
|
||||
export _NIX_IN_TEST=$TEST_ROOT/shared
|
||||
export _NIX_TEST_NO_LSOF=1
|
||||
export NIX_REMOTE=${NIX_REMOTE_-}
|
||||
|
||||
fi # ! isTestOnNixOS
|
||||
|
||||
unset NIX_PATH
|
||||
export HOME=$TEST_HOME
|
||||
unset XDG_STATE_HOME
|
||||
unset XDG_DATA_HOME
|
||||
unset XDG_CONFIG_HOME
|
||||
unset XDG_CONFIG_DIRS
|
||||
unset XDG_CACHE_HOME
|
||||
|
||||
export IMPURE_VAR1=foo
|
||||
export IMPURE_VAR2=bar
|
||||
|
||||
cacheDir=$TEST_ROOT/binary-cache
|
||||
|
||||
readLink() {
|
||||
# TODO fix this
|
||||
# shellcheck disable=SC2012
|
||||
ls -l "$1" | sed 's/.*->\ //'
|
||||
}
|
||||
|
||||
clearProfiles() {
|
||||
profiles="$HOME"/.local/state/nix/profiles
|
||||
profiles="$HOME/.local/state/nix/profiles"
|
||||
rm -rf "$profiles"
|
||||
}
|
||||
|
||||
|
@ -105,11 +55,11 @@ doClearStore() {
|
|||
}
|
||||
|
||||
clearCache() {
|
||||
rm -rf "$cacheDir"
|
||||
rm -rf "${cacheDir?}"
|
||||
}
|
||||
|
||||
clearCacheCache() {
|
||||
rm -f $TEST_HOME/.cache/nix/binary-cache*
|
||||
rm -f "$TEST_HOME/.cache/nix/binary-cache"*
|
||||
}
|
||||
|
||||
startDaemon() {
|
||||
|
@ -122,7 +72,7 @@ startDaemon() {
|
|||
return
|
||||
fi
|
||||
# Start the daemon, wait for the socket to appear.
|
||||
rm -f $NIX_DAEMON_SOCKET_PATH
|
||||
rm -f "$NIX_DAEMON_SOCKET_PATH"
|
||||
PATH=$DAEMON_PATH nix --extra-experimental-features 'nix-command' daemon &
|
||||
_NIX_TEST_DAEMON_PID=$!
|
||||
export _NIX_TEST_DAEMON_PID
|
||||
|
@ -151,14 +101,14 @@ killDaemon() {
|
|||
if [[ "${_NIX_TEST_DAEMON_PID-}" == '' ]]; then
|
||||
return
|
||||
fi
|
||||
kill $_NIX_TEST_DAEMON_PID
|
||||
kill "$_NIX_TEST_DAEMON_PID"
|
||||
for i in {0..100}; do
|
||||
kill -0 $_NIX_TEST_DAEMON_PID 2> /dev/null || break
|
||||
kill -0 "$_NIX_TEST_DAEMON_PID" 2> /dev/null || break
|
||||
sleep 0.1
|
||||
done
|
||||
kill -9 $_NIX_TEST_DAEMON_PID 2> /dev/null || true
|
||||
wait $_NIX_TEST_DAEMON_PID || true
|
||||
rm -f $NIX_DAEMON_SOCKET_PATH
|
||||
kill -9 "$_NIX_TEST_DAEMON_PID" 2> /dev/null || true
|
||||
wait "$_NIX_TEST_DAEMON_PID" || true
|
||||
rm -f "$NIX_DAEMON_SOCKET_PATH"
|
||||
# Indicate daemon is stopped
|
||||
unset _NIX_TEST_DAEMON_PID
|
||||
# Restore old nix remote
|
||||
|
@ -177,14 +127,11 @@ restartDaemon() {
|
|||
startDaemon
|
||||
}
|
||||
|
||||
if [[ $(uname) == Linux ]] && [[ -L /proc/self/ns/user ]] && unshare --user true; then
|
||||
_canUseSandbox=1
|
||||
fi
|
||||
|
||||
isDaemonNewer () {
|
||||
[[ -n "${NIX_DAEMON_PACKAGE:-}" ]] || return 0
|
||||
local requiredVersion="$1"
|
||||
local daemonVersion=$($NIX_DAEMON_PACKAGE/bin/nix daemon --version | cut -d' ' -f3)
|
||||
local daemonVersion
|
||||
daemonVersion=$("$NIX_DAEMON_PACKAGE/bin/nix" daemon --version | cut -d' ' -f3)
|
||||
[[ $(nix eval --expr "builtins.compareVersions ''$daemonVersion'' ''$requiredVersion''") -ge 0 ]]
|
||||
}
|
||||
|
||||
|
@ -237,7 +184,7 @@ expect() {
|
|||
shift
|
||||
"$@" && res=0 || res="$?"
|
||||
# also match "negative" codes, which wrap around to >127
|
||||
if [[ $res -ne $expected && $res -ne $[256 + expected] ]]; then
|
||||
if [[ $res -ne $expected && $res -ne $((256 + expected)) ]]; then
|
||||
echo "Expected exit code '$expected' but got '$res' from command ${*@Q}" >&2
|
||||
return 1
|
||||
fi
|
||||
|
@ -252,7 +199,7 @@ expectStderr() {
|
|||
shift
|
||||
"$@" 2>&1 && res=0 || res="$?"
|
||||
# also match "negative" codes, which wrap around to >127
|
||||
if [[ $res -ne $expected && $res -ne $[256 + expected] ]]; then
|
||||
if [[ $res -ne $expected && $res -ne $((256 + expected)) ]]; then
|
||||
echo "Expected exit code '$expected' but got '$res' from command ${*@Q}" >&2
|
||||
return 1
|
||||
fi
|
||||
|
@ -267,7 +214,7 @@ expectStderr() {
|
|||
# error: This error is expected
|
||||
# EOF
|
||||
assertStderr() {
|
||||
diff -u /dev/stdin <($@ 2>/dev/null 2>&1)
|
||||
diff -u /dev/stdin <("$@" 2>/dev/null 2>&1)
|
||||
}
|
||||
|
||||
needLocalStore() {
|
||||
|
@ -283,11 +230,9 @@ buggyNeedLocalStore() {
|
|||
|
||||
enableFeatures() {
|
||||
local features="$1"
|
||||
sed -i 's/experimental-features .*/& '"$features"'/' "$test_nix_conf_dir"/nix.conf
|
||||
sed -i 's/experimental-features .*/& '"$features"'/' "${test_nix_conf?}"
|
||||
}
|
||||
|
||||
set -x
|
||||
|
||||
onError() {
|
||||
set +x
|
||||
echo "$0: test failed at:" >&2
|
||||
|
@ -311,15 +256,15 @@ callerPrefix() {
|
|||
local i file line fn savedFn
|
||||
# Use `caller`
|
||||
for i in $(seq 0 100); do
|
||||
caller $i > /dev/null || {
|
||||
caller "$i" > /dev/null || {
|
||||
if [[ -n "${file:-}" ]]; then
|
||||
echo "$file:$line: ${savedFn+in call to $savedFn: }"
|
||||
fi
|
||||
break
|
||||
}
|
||||
line="$(caller $i | cut -d' ' -f1)"
|
||||
fn="$(caller $i | cut -d' ' -f2)"
|
||||
file="$(caller $i | cut -d' ' -f3)"
|
||||
line="$(caller "$i" | cut -d' ' -f1)"
|
||||
fn="$(caller "$i" | cut -d' ' -f2)"
|
||||
file="$(caller "$i" | cut -d' ' -f3)"
|
||||
if [[ $file != "${BASH_SOURCE[0]}" ]]; then
|
||||
echo "$file:$line: ${savedFn+in call to $savedFn: }"
|
||||
return
|
||||
|
@ -342,7 +287,7 @@ checkGrepArgs() {
|
|||
for arg in "$@"; do
|
||||
if [[ "$arg" != "${arg//$'\n'/_}" ]]; then
|
||||
echo "$(callerPrefix)newline not allowed in arguments; grep would try each line individually as if connected by an OR operator" >&2
|
||||
return -101
|
||||
return 155 # = -101 mod 256
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
@ -400,4 +345,4 @@ count() {
|
|||
|
||||
trap onError ERR
|
||||
|
||||
fi # COMMON_VARS_AND_FUNCTIONS_SH_SOURCED
|
||||
fi # COMMON_FUNCTIONS_SH_SOURCED
|
|
@ -7,10 +7,10 @@ if isTestOnNixOS; then
|
|||
|
||||
mkdir -p "$test_nix_conf_dir" "$TEST_HOME"
|
||||
|
||||
export NIX_USER_CONF_FILES="$test_nix_conf_dir/nix.conf"
|
||||
export NIX_USER_CONF_FILES="$test_nix_conf"
|
||||
mkdir -p "$test_nix_conf_dir" "$TEST_HOME"
|
||||
! test -e "$test_nix_conf"
|
||||
cat > "$test_nix_conf_dir/nix.conf" <<EOF
|
||||
cat > "$test_nix_conf" <<EOF
|
||||
# TODO: this is not needed for all tests and prevents stable commands from be tested in isolation
|
||||
experimental-features = nix-command flakes
|
||||
flake-registry = $TEST_ROOT/registry.json
|
||||
|
|
5
tests/functional/common/meson.build
Normal file
5
tests/functional/common/meson.build
Normal file
|
@ -0,0 +1,5 @@
|
|||
configure_file(
|
||||
input : 'subst-vars.sh.in',
|
||||
output : 'subst-vars.sh',
|
||||
configuration : test_confdata,
|
||||
)
|
|
@ -1,14 +1,25 @@
|
|||
# shellcheck shell=bash
|
||||
|
||||
set -eu -o pipefail
|
||||
|
||||
if [[ -z "${COMMON_PATHS_SH_SOURCED-}" ]]; then
|
||||
|
||||
COMMON_PATHS_SH_SOURCED=1
|
||||
|
||||
commonDir="$(readlink -f "$(dirname "${BASH_SOURCE[0]-$0}")")"
|
||||
|
||||
# Since this is a generated file
|
||||
# Since these are generated files
|
||||
# shellcheck disable=SC1091
|
||||
source "$commonDir/functions.sh"
|
||||
# shellcheck disable=SC1091
|
||||
source "$commonDir/subst-vars.sh"
|
||||
# Make sure shellcheck knows this will be defined by the above generated snippet
|
||||
: "${bindir?}"
|
||||
: "${bash?}" "${bindir?}"
|
||||
|
||||
export PATH="$bindir:$PATH"
|
||||
if ! isTestOnNixOS; then
|
||||
export SHELL="$bash"
|
||||
export PATH="$bindir:$PATH"
|
||||
fi
|
||||
|
||||
if [[ -n "${NIX_CLIENT_PACKAGE:-}" ]]; then
|
||||
export PATH="$NIX_CLIENT_PACKAGE/bin":$PATH
|
||||
|
@ -18,3 +29,5 @@ DAEMON_PATH="$PATH"
|
|||
if [[ -n "${NIX_DAEMON_PACKAGE:-}" ]]; then
|
||||
DAEMON_PATH="${NIX_DAEMON_PACKAGE}/bin:$DAEMON_PATH"
|
||||
fi
|
||||
|
||||
fi # COMMON_PATHS_SH_SOURCED
|
||||
|
|
|
@ -4,22 +4,14 @@ if [[ -z "${COMMON_SUBST_VARS_SH_SOURCED-}" ]]; then
|
|||
|
||||
COMMON_SUBST_VARS_SH_SOURCED=1
|
||||
|
||||
bash=@bash@
|
||||
bindir=@bindir@
|
||||
export coreutils=@coreutils@
|
||||
#lsof=@lsof@
|
||||
coreutils=@coreutils@
|
||||
|
||||
export dot=@dot@
|
||||
export PAGER=cat
|
||||
export busybox="@sandbox_shell@"
|
||||
dot=@dot@
|
||||
busybox="@sandbox_shell@"
|
||||
|
||||
export version=@PACKAGE_VERSION@
|
||||
export system=@system@
|
||||
|
||||
export BUILD_SHARED_LIBS=@BUILD_SHARED_LIBS@
|
||||
|
||||
if ! isTestOnNixOS; then
|
||||
export SHELL="@bash@"
|
||||
export PATH=@bindir@:$PATH
|
||||
fi
|
||||
version=@PACKAGE_VERSION@
|
||||
system=@system@
|
||||
|
||||
fi
|
||||
|
|
72
tests/functional/common/vars.sh
Normal file
72
tests/functional/common/vars.sh
Normal file
|
@ -0,0 +1,72 @@
|
|||
# shellcheck shell=bash
|
||||
|
||||
set -eu -o pipefail
|
||||
|
||||
if [[ -z "${COMMON_VARS_SH_SOURCED-}" ]]; then
|
||||
|
||||
COMMON_VARS_SH_SOURCED=1
|
||||
|
||||
commonDir="$(readlink -f "$(dirname "${BASH_SOURCE[0]-$0}")")"
|
||||
|
||||
# Since this is a generated file
|
||||
# shellcheck disable=SC1091
|
||||
source "$commonDir/subst-vars.sh"
|
||||
# Make sure shellcheck knows all these will be defined by the above generated snippet
|
||||
: "${bindir?} ${coreutils?} ${dot?} ${SHELL?} ${busybox?} ${version?} ${system?}"
|
||||
export coreutils dot busybox version system
|
||||
|
||||
export PAGER=cat
|
||||
|
||||
source "$commonDir/paths.sh"
|
||||
source "$commonDir/test-root.sh"
|
||||
|
||||
test_nix_conf_dir=$TEST_ROOT/etc
|
||||
# Used in other files
|
||||
# shellcheck disable=SC2034
|
||||
test_nix_conf=$test_nix_conf_dir/nix.conf
|
||||
|
||||
export TEST_HOME=$TEST_ROOT/test-home
|
||||
|
||||
if ! isTestOnNixOS; then
|
||||
export NIX_STORE_DIR
|
||||
if ! NIX_STORE_DIR=$(readlink -f "$TEST_ROOT/store" 2> /dev/null); then
|
||||
# Maybe the build directory is symlinked.
|
||||
export NIX_IGNORE_SYMLINK_STORE=1
|
||||
NIX_STORE_DIR=$TEST_ROOT/store
|
||||
fi
|
||||
export NIX_LOCALSTATE_DIR=$TEST_ROOT/var
|
||||
export NIX_LOG_DIR=$TEST_ROOT/var/log/nix
|
||||
export NIX_STATE_DIR=$TEST_ROOT/var/nix
|
||||
export NIX_CONF_DIR=$test_nix_conf_dir
|
||||
export NIX_DAEMON_SOCKET_PATH=$TEST_ROOT/dSocket
|
||||
unset NIX_USER_CONF_FILES
|
||||
export _NIX_TEST_SHARED=$TEST_ROOT/shared
|
||||
if [[ -n $NIX_STORE ]]; then
|
||||
export _NIX_TEST_NO_SANDBOX=1
|
||||
fi
|
||||
export _NIX_IN_TEST=$TEST_ROOT/shared
|
||||
export _NIX_TEST_NO_LSOF=1
|
||||
export NIX_REMOTE=${NIX_REMOTE_-}
|
||||
|
||||
fi # ! isTestOnNixOS
|
||||
|
||||
unset NIX_PATH
|
||||
export HOME=$TEST_HOME
|
||||
unset XDG_STATE_HOME
|
||||
unset XDG_DATA_HOME
|
||||
unset XDG_CONFIG_HOME
|
||||
unset XDG_CONFIG_DIRS
|
||||
unset XDG_CACHE_HOME
|
||||
|
||||
export IMPURE_VAR1=foo
|
||||
export IMPURE_VAR2=bar
|
||||
|
||||
# Used in other files
|
||||
# shellcheck disable=SC2034
|
||||
cacheDir=$TEST_ROOT/binary-cache
|
||||
|
||||
if [[ $(uname) == Linux ]] && [[ -L /proc/self/ns/user ]] && unshare --user true; then
|
||||
_canUseSandbox=1
|
||||
fi
|
||||
|
||||
fi # COMMON_VARS_SH_SOURCED
|
|
@ -3,7 +3,7 @@
|
|||
source common/test-root.sh
|
||||
source common/paths.sh
|
||||
|
||||
set -o pipefail
|
||||
set -eu -o pipefail
|
||||
|
||||
source characterisation/framework.sh
|
||||
|
||||
|
|
19
tests/functional/dyn-drv/meson.build
Normal file
19
tests/functional/dyn-drv/meson.build
Normal file
|
@ -0,0 +1,19 @@
|
|||
configure_file(
|
||||
input : 'config.nix.in',
|
||||
output : 'config.nix',
|
||||
configuration : test_confdata,
|
||||
)
|
||||
|
||||
suites += {
|
||||
'name': 'dyn-drv',
|
||||
'deps': [],
|
||||
'tests': [
|
||||
'text-hashed-output.sh',
|
||||
'recursive-mod-json.sh',
|
||||
'build-built-drv.sh',
|
||||
'eval-outputOf.sh',
|
||||
'dep-built-drv.sh',
|
||||
'old-daemon-error-hack.sh',
|
||||
],
|
||||
'workdir': meson.current_build_dir(),
|
||||
}
|
28
tests/functional/flakes/meson.build
Normal file
28
tests/functional/flakes/meson.build
Normal file
|
@ -0,0 +1,28 @@
|
|||
suites += {
|
||||
'name': 'flakes',
|
||||
'deps': [],
|
||||
'tests': [
|
||||
'flakes.sh',
|
||||
'develop.sh',
|
||||
'edit.sh',
|
||||
'run.sh',
|
||||
'mercurial.sh',
|
||||
'circular.sh',
|
||||
'init.sh',
|
||||
'inputs.sh',
|
||||
'follow-paths.sh',
|
||||
'bundle.sh',
|
||||
'check.sh',
|
||||
'unlocked-override.sh',
|
||||
'absolute-paths.sh',
|
||||
'absolute-attr-paths.sh',
|
||||
'build-paths.sh',
|
||||
'flake-in-submodule.sh',
|
||||
'prefetch.sh',
|
||||
'eval-cache.sh',
|
||||
'search-root.sh',
|
||||
'config.sh',
|
||||
'show.sh',
|
||||
],
|
||||
'workdir': meson.current_build_dir(),
|
||||
}
|
8
tests/functional/git-hashing/meson.build
Normal file
8
tests/functional/git-hashing/meson.build
Normal file
|
@ -0,0 +1,8 @@
|
|||
suites += {
|
||||
'name': 'git-hashing',
|
||||
'deps': [],
|
||||
'tests': [
|
||||
'simple.sh',
|
||||
],
|
||||
'workdir': meson.current_build_dir(),
|
||||
}
|
|
@ -1,4 +1,5 @@
|
|||
source ../common/vars-and-functions.sh
|
||||
source ../common/vars.sh
|
||||
source ../common/functions.sh
|
||||
|
||||
TODO_NixOS
|
||||
|
||||
|
|
18
tests/functional/local-overlay-store/meson.build
Normal file
18
tests/functional/local-overlay-store/meson.build
Normal file
|
@ -0,0 +1,18 @@
|
|||
suites += {
|
||||
'name': 'local-overlay-store',
|
||||
'deps': [],
|
||||
'tests': [
|
||||
'check-post-init.sh',
|
||||
'redundant-add.sh',
|
||||
'build.sh',
|
||||
'bad-uris.sh',
|
||||
'add-lower.sh',
|
||||
'delete-refs.sh',
|
||||
'delete-duplicate.sh',
|
||||
'gc.sh',
|
||||
'verify.sh',
|
||||
'optimise.sh',
|
||||
'stale-file-handle.sh',
|
||||
],
|
||||
'workdir': meson.current_build_dir(),
|
||||
}
|
266
tests/functional/meson.build
Normal file
266
tests/functional/meson.build
Normal file
|
@ -0,0 +1,266 @@
|
|||
project('nix-functional-tests', 'cpp',
|
||||
version : files('.version'),
|
||||
default_options : [
|
||||
'cpp_std=c++2a',
|
||||
# TODO(Qyriad): increase the warning level
|
||||
'warning_level=1',
|
||||
'debug=true',
|
||||
'optimization=2',
|
||||
'errorlogs=true', # Please print logs for tests that fail
|
||||
],
|
||||
meson_version : '>= 1.3',
|
||||
license : 'LGPL-2.1-or-later',
|
||||
)
|
||||
|
||||
fs = import('fs')
|
||||
|
||||
# Need to combine source and build trees
|
||||
run_command(
|
||||
'rsync',
|
||||
'-a',
|
||||
'--copy-unsafe-links',
|
||||
meson.current_source_dir() / '',
|
||||
meson.current_build_dir() / '',
|
||||
)
|
||||
# This current-source-escaping relative is no good because we don't know
|
||||
# where the build directory will be, therefore we fix it up. Once the
|
||||
# Make build system is gone, we should think about doing this better.
|
||||
scripts_dir = fs.relative_to(
|
||||
meson.current_source_dir() / '..' / '..' / 'scripts',
|
||||
meson.current_build_dir(),
|
||||
)
|
||||
run_command(
|
||||
'sed',
|
||||
'-i', meson.current_build_dir() / 'bash-profile.sh',
|
||||
'-e', 's^../../scripts^@0@^'.format(scripts_dir),
|
||||
)
|
||||
|
||||
nix = find_program('nix')
|
||||
bash = find_program('bash', native : true)
|
||||
busybox = find_program('busybox', native : true, required : false)
|
||||
coreutils = find_program('coreutils', native : true)
|
||||
dot = find_program('dot', native : true, required : false)
|
||||
|
||||
nix_bin_dir = fs.parent(nix.full_path())
|
||||
|
||||
test_confdata = {
|
||||
'bindir': nix_bin_dir,
|
||||
'coreutils': fs.parent(coreutils.full_path()),
|
||||
'dot': dot.found() ? dot.full_path() : '',
|
||||
'bash': bash.full_path(),
|
||||
'sandbox_shell': busybox.found() ? busybox.full_path() : '',
|
||||
'PACKAGE_VERSION': meson.project_version(),
|
||||
'system': host_machine.cpu_family() + '-' + host_machine.system(),
|
||||
}
|
||||
|
||||
# Just configures `common/vars-and-functions.sh.in`.
|
||||
# Done as a subdir() so Meson places it under `common` in the build directory as well.
|
||||
subdir('common')
|
||||
|
||||
config_nix_in = configure_file(
|
||||
input : 'config.nix.in',
|
||||
output : 'config.nix',
|
||||
configuration : test_confdata,
|
||||
)
|
||||
|
||||
suites = [
|
||||
{
|
||||
'name' : 'main',
|
||||
'deps': [],
|
||||
'tests': [
|
||||
'test-infra.sh',
|
||||
'gc.sh',
|
||||
'nix-collect-garbage-d.sh',
|
||||
'remote-store.sh',
|
||||
'legacy-ssh-store.sh',
|
||||
'lang.sh',
|
||||
'lang-gc.sh',
|
||||
'characterisation-test-infra.sh',
|
||||
'experimental-features.sh',
|
||||
'fetchMercurial.sh',
|
||||
'gc-auto.sh',
|
||||
'user-envs.sh',
|
||||
'user-envs-migration.sh',
|
||||
'binary-cache.sh',
|
||||
'multiple-outputs.sh',
|
||||
'nix-build.sh',
|
||||
'gc-concurrent.sh',
|
||||
'repair.sh',
|
||||
'fixed.sh',
|
||||
'export-graph.sh',
|
||||
'timeout.sh',
|
||||
'fetchGitRefs.sh',
|
||||
'gc-runtime.sh',
|
||||
'tarball.sh',
|
||||
'fetchGit.sh',
|
||||
'fetchurl.sh',
|
||||
'fetchPath.sh',
|
||||
'fetchTree-file.sh',
|
||||
'simple.sh',
|
||||
'referrers.sh',
|
||||
'optimise-store.sh',
|
||||
'substitute-with-invalid-ca.sh',
|
||||
'signing.sh',
|
||||
'hash-convert.sh',
|
||||
'hash-path.sh',
|
||||
'gc-non-blocking.sh',
|
||||
'check.sh',
|
||||
'nix-shell.sh',
|
||||
'check-refs.sh',
|
||||
'build-remote-input-addressed.sh',
|
||||
'secure-drv-outputs.sh',
|
||||
'restricted.sh',
|
||||
'fetchGitSubmodules.sh',
|
||||
'fetchGitVerification.sh',
|
||||
'readfile-context.sh',
|
||||
'nix-channel.sh',
|
||||
'recursive.sh',
|
||||
'dependencies.sh',
|
||||
'check-reqs.sh',
|
||||
'build-remote-content-addressed-fixed.sh',
|
||||
'build-remote-content-addressed-floating.sh',
|
||||
'build-remote-trustless-should-pass-0.sh',
|
||||
'build-remote-trustless-should-pass-1.sh',
|
||||
'build-remote-trustless-should-pass-2.sh',
|
||||
'build-remote-trustless-should-pass-3.sh',
|
||||
'build-remote-trustless-should-fail-0.sh',
|
||||
'build-remote-with-mounted-ssh-ng.sh',
|
||||
'nar-access.sh',
|
||||
'impure-eval.sh',
|
||||
'pure-eval.sh',
|
||||
'eval.sh',
|
||||
'repl.sh',
|
||||
'binary-cache-build-remote.sh',
|
||||
'search.sh',
|
||||
'logging.sh',
|
||||
'export.sh',
|
||||
'config.sh',
|
||||
'add.sh',
|
||||
'chroot-store.sh',
|
||||
'filter-source.sh',
|
||||
'misc.sh',
|
||||
'dump-db.sh',
|
||||
'linux-sandbox.sh',
|
||||
'supplementary-groups.sh',
|
||||
'build-dry.sh',
|
||||
'structured-attrs.sh',
|
||||
'shell.sh',
|
||||
'brotli.sh',
|
||||
'zstd.sh',
|
||||
'compression-levels.sh',
|
||||
'nix-copy-ssh.sh',
|
||||
'nix-copy-ssh-ng.sh',
|
||||
'post-hook.sh',
|
||||
'function-trace.sh',
|
||||
'fmt.sh',
|
||||
'eval-store.sh',
|
||||
'why-depends.sh',
|
||||
'derivation-json.sh',
|
||||
'derivation-advanced-attributes.sh',
|
||||
'import-derivation.sh',
|
||||
'nix_path.sh',
|
||||
'case-hack.sh',
|
||||
'placeholders.sh',
|
||||
'ssh-relay.sh',
|
||||
'build.sh',
|
||||
'build-delete.sh',
|
||||
'output-normalization.sh',
|
||||
'selfref-gc.sh',
|
||||
'db-migration.sh',
|
||||
'bash-profile.sh',
|
||||
'pass-as-file.sh',
|
||||
'nix-profile.sh',
|
||||
'suggestions.sh',
|
||||
'store-info.sh',
|
||||
'fetchClosure.sh',
|
||||
'completions.sh',
|
||||
'impure-derivations.sh',
|
||||
'path-from-hash-part.sh',
|
||||
'path-info.sh',
|
||||
'toString-path.sh',
|
||||
'read-only-store.sh',
|
||||
'nested-sandboxing.sh',
|
||||
'impure-env.sh',
|
||||
'debugger.sh',
|
||||
'extra-sandbox-profile.sh',
|
||||
'help.sh',
|
||||
],
|
||||
'workdir': meson.current_build_dir(),
|
||||
},
|
||||
]
|
||||
|
||||
nix_store = dependency('nix-store', required : false)
|
||||
if nix_store.found()
|
||||
subdir('test-libstoreconsumer')
|
||||
suites += {
|
||||
'name': 'libstoreconsumer',
|
||||
'deps': [
|
||||
libstoreconsumer_tester,
|
||||
],
|
||||
'tests': [
|
||||
'test-libstoreconsumer.sh',
|
||||
],
|
||||
'workdir': meson.current_build_dir(),
|
||||
}
|
||||
|
||||
endif
|
||||
|
||||
# Plugin tests require shared libraries support.
|
||||
nix_expr = dependency('nix-expr', required : false)
|
||||
if nix_expr.found() and get_option('default_library') != 'static'
|
||||
subdir('plugins')
|
||||
suites += {
|
||||
'name': 'plugins',
|
||||
'deps': [
|
||||
libplugintest,
|
||||
],
|
||||
'tests': [
|
||||
'plugins.sh',
|
||||
],
|
||||
'workdir': meson.current_build_dir(),
|
||||
}
|
||||
endif
|
||||
|
||||
subdir('ca')
|
||||
subdir('dyn-drv')
|
||||
subdir('flakes')
|
||||
subdir('git-hashing')
|
||||
subdir('local-overlay-store')
|
||||
|
||||
foreach suite : suites
|
||||
foreach script : suite['tests']
|
||||
workdir = suite['workdir']
|
||||
prefix = fs.relative_to(workdir, meson.project_build_root())
|
||||
|
||||
script = script
|
||||
# Turns, e.g., `tests/functional/flakes/show.sh` into a Meson test target called
|
||||
# `functional-flakes-show`.
|
||||
name = fs.replace_suffix(prefix / script, '')
|
||||
|
||||
test(
|
||||
name,
|
||||
bash,
|
||||
args: [
|
||||
'-x',
|
||||
'-e',
|
||||
'-u',
|
||||
'-o', 'pipefail',
|
||||
script,
|
||||
],
|
||||
suite : suite['name'],
|
||||
env : {
|
||||
'TEST_NAME': name,
|
||||
'NIX_REMOTE': '',
|
||||
'PS4': '+(${BASH_SOURCE[0]-$0}:$LINENO) ',
|
||||
},
|
||||
# some tests take 15+ seconds even on an otherwise idle machine, on a loaded machine
|
||||
# this can easily drive them to failure. give them more time than default of 30sec
|
||||
timeout : 300,
|
||||
# Used for target dependency/ordering tracking, not adding compiler flags or anything.
|
||||
depends : suite['deps'],
|
||||
workdir : workdir,
|
||||
# Won't pass until man pages are generated
|
||||
should_fail : suite['name'] == 'main' and script == 'help.sh'
|
||||
)
|
||||
endforeach
|
||||
endforeach
|
|
@ -1,3 +1,5 @@
|
|||
set -eu -o pipefail
|
||||
|
||||
export NIX_BIN_DIR=$(dirname $(type -p nix))
|
||||
# TODO Get Nix and its closure more flexibly
|
||||
export EXTRA_SANDBOX="/nix/store $(dirname $NIX_BIN_DIR)"
|
||||
|
|
|
@ -6,7 +6,10 @@ mkDerivation {
|
|||
name = "nested-sandboxing";
|
||||
busybox = builtins.getEnv "busybox";
|
||||
EXTRA_SANDBOX = builtins.getEnv "EXTRA_SANDBOX";
|
||||
buildCommand = if altitude == 0 then ''
|
||||
buildCommand = ''
|
||||
set -x
|
||||
set -eu -o pipefail
|
||||
'' + (if altitude == 0 then ''
|
||||
echo Deep enough! > $out
|
||||
'' else ''
|
||||
cp -r ${../common} ./common
|
||||
|
@ -20,5 +23,5 @@ mkDerivation {
|
|||
source ./nested-sandboxing/command.sh
|
||||
|
||||
runNixBuild ${storeFun} ${toString altitude} >> $out
|
||||
'';
|
||||
'');
|
||||
}
|
||||
|
|
117
tests/functional/package.nix
Normal file
117
tests/functional/package.nix
Normal file
|
@ -0,0 +1,117 @@
|
|||
{ lib
|
||||
, stdenv
|
||||
, mkMesonDerivation
|
||||
, releaseTools
|
||||
|
||||
, meson
|
||||
, ninja
|
||||
, pkg-config
|
||||
, rsync
|
||||
|
||||
, jq
|
||||
, git
|
||||
, mercurial
|
||||
, util-linux
|
||||
|
||||
, nix-store
|
||||
, nix-expr
|
||||
, nix-ng
|
||||
|
||||
, rapidcheck
|
||||
, gtest
|
||||
, runCommand
|
||||
|
||||
, busybox-sandbox-shell ? null
|
||||
|
||||
# Configuration Options
|
||||
|
||||
, version
|
||||
|
||||
# For running the functional tests against a different pre-built Nix.
|
||||
, test-daemon ? null
|
||||
}:
|
||||
|
||||
let
|
||||
inherit (lib) fileset;
|
||||
in
|
||||
|
||||
mkMesonDerivation (finalAttrs: {
|
||||
pname = "nix-functional-tests";
|
||||
inherit version;
|
||||
|
||||
workDir = ./.;
|
||||
fileset = fileset.unions [
|
||||
../../scripts/nix-profile.sh.in
|
||||
../../.version
|
||||
../../tests/functional
|
||||
./.
|
||||
];
|
||||
|
||||
# Hack for sake of the dev shell
|
||||
passthru.baseNativeBuildInputs = [
|
||||
meson
|
||||
ninja
|
||||
pkg-config
|
||||
rsync
|
||||
|
||||
jq
|
||||
git
|
||||
mercurial
|
||||
] ++ lib.optionals stdenv.hostPlatform.isLinux [
|
||||
# For various sandboxing tests that needs a statically-linked shell,
|
||||
# etc.
|
||||
busybox-sandbox-shell
|
||||
# For Overlay FS tests need `mount`, `umount`, and `unshare`.
|
||||
# TODO use `unixtools` to be precise over which executables instead?
|
||||
util-linux
|
||||
];
|
||||
|
||||
nativeBuildInputs = finalAttrs.passthru.baseNativeBuildInputs ++ [
|
||||
nix-ng
|
||||
];
|
||||
|
||||
buildInputs = [
|
||||
nix-store
|
||||
nix-expr
|
||||
];
|
||||
|
||||
|
||||
preConfigure =
|
||||
# "Inline" .version so it's not a symlink, and includes the suffix.
|
||||
# Do the meson utils, without modification.
|
||||
''
|
||||
chmod u+w ./.version
|
||||
echo ${version} > ../../../.version
|
||||
''
|
||||
# TEMP hack for Meson before make is gone, where
|
||||
# `src/nix-functional-tests` is during the transition a symlink and
|
||||
# not the actual directory directory.
|
||||
+ ''
|
||||
cd $(readlink -e $PWD)
|
||||
echo $PWD | grep tests/functional
|
||||
'';
|
||||
|
||||
mesonCheckFlags = [
|
||||
"--print-errorlogs"
|
||||
];
|
||||
|
||||
preCheck =
|
||||
# See https://github.com/NixOS/nix/issues/2523
|
||||
# Occurs often in tests since https://github.com/NixOS/nix/pull/9900
|
||||
lib.optionalString stdenv.hostPlatform.isDarwin ''
|
||||
export OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES
|
||||
'';
|
||||
|
||||
doCheck = true;
|
||||
|
||||
installPhase = ''
|
||||
touch $out
|
||||
'';
|
||||
|
||||
meta = {
|
||||
platforms = lib.platforms.unix;
|
||||
};
|
||||
|
||||
} // lib.optionalAttrs (test-daemon != null) {
|
||||
NIX_DAEMON_PACKAGE = test-daemon;
|
||||
})
|
|
@ -2,10 +2,11 @@
|
|||
|
||||
source common.sh
|
||||
|
||||
if [[ $BUILD_SHARED_LIBS != 1 ]]; then
|
||||
skipTest "Plugins are not supported"
|
||||
fi
|
||||
for ext in so dylib; do
|
||||
plugin="$PWD/plugins/libplugintest.$ext"
|
||||
[[ -f "$plugin" ]] && break
|
||||
done
|
||||
|
||||
res=$(nix --option setting-set true --option plugin-files $PWD/plugins/libplugintest* eval --expr builtins.anotherNull)
|
||||
res=$(nix --option setting-set true --option plugin-files "$plugin" eval --expr builtins.anotherNull)
|
||||
|
||||
[ "$res"x = "nullx" ]
|
||||
|
|
16
tests/functional/plugins/meson.build
Normal file
16
tests/functional/plugins/meson.build
Normal file
|
@ -0,0 +1,16 @@
|
|||
libplugintest = shared_module(
|
||||
'plugintest',
|
||||
'plugintest.cc',
|
||||
cpp_args : [
|
||||
# TODO(Qyriad): Yes this is how the autoconf+Make system did it.
|
||||
# It would be nice for our headers to be idempotent instead.
|
||||
'-include', 'config-util.hh',
|
||||
'-include', 'config-store.hh',
|
||||
# '-include', 'config-fetchers.hh',
|
||||
'-include', 'config-expr.hh',
|
||||
],
|
||||
dependencies : [
|
||||
dependency('nix-expr'),
|
||||
],
|
||||
build_by_default : false,
|
||||
)
|
|
@ -16,9 +16,6 @@ nix-instantiate --restrict-eval ./simple.nix -I src1=simple.nix -I src2=config.n
|
|||
(! nix-instantiate --restrict-eval --eval -E 'builtins.readFile ./simple.nix')
|
||||
nix-instantiate --restrict-eval --eval -E 'builtins.readFile ./simple.nix' -I src=../..
|
||||
|
||||
(! nix-instantiate --restrict-eval --eval -E 'builtins.readDir ../../src/nix-channel')
|
||||
nix-instantiate --restrict-eval --eval -E 'builtins.readDir ../../src/nix-channel' -I src=../../src
|
||||
|
||||
expectStderr 1 nix-instantiate --restrict-eval --eval -E 'let __nixPath = [ { prefix = "foo"; path = ./.; } ]; in builtins.readFile <foo/simple.nix>' | grepQuiet "forbidden in restricted mode"
|
||||
nix-instantiate --restrict-eval --eval -E 'let __nixPath = [ { prefix = "foo"; path = ./.; } ]; in builtins.readFile <foo/simple.nix>' -I src=.
|
||||
|
||||
|
|
14
tests/functional/test-libstoreconsumer/meson.build
Normal file
14
tests/functional/test-libstoreconsumer/meson.build
Normal file
|
@ -0,0 +1,14 @@
|
|||
libstoreconsumer_tester = executable(
|
||||
'test-libstoreconsumer',
|
||||
'main.cc',
|
||||
cpp_args : [
|
||||
# TODO(Qyriad): Yes this is how the autoconf+Make system did it.
|
||||
# It would be nice for our headers to be idempotent instead.
|
||||
'-include', 'config-util.hh',
|
||||
'-include', 'config-store.hh',
|
||||
],
|
||||
dependencies : [
|
||||
dependency('nix-store'),
|
||||
],
|
||||
build_by_default : false,
|
||||
)
|
Loading…
Reference in a new issue