aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/functional/common/vars-and-functions.sh.in1
-rw-r--r--tests/functional/config.sh12
-rw-r--r--tests/functional/experimental-features.sh8
-rw-r--r--tests/functional/gc-runtime.nix36
-rw-r--r--tests/functional/gc-runtime.sh32
-rw-r--r--tests/functional/nix-profile.sh42
-rw-r--r--tests/nixos/default.nix2
-rw-r--r--tests/nixos/nix-upgrade-nix.nix80
-rw-r--r--tests/nixos/remote-builds-ssh-ng.nix4
-rw-r--r--tests/unit/libstore-support/tests/path.cc78
-rw-r--r--tests/unit/libstore/path.cc70
-rw-r--r--tests/unit/libutil-support/tests/hash.cc15
-rw-r--r--tests/unit/libutil/tests.cc39
-rw-r--r--tests/unit/libutil/url-name.cc69
-rw-r--r--tests/unit/meson.build1
15 files changed, 395 insertions, 94 deletions
diff --git a/tests/functional/common/vars-and-functions.sh.in b/tests/functional/common/vars-and-functions.sh.in
index b054bf834..3d2e44024 100644
--- a/tests/functional/common/vars-and-functions.sh.in
+++ b/tests/functional/common/vars-and-functions.sh.in
@@ -24,7 +24,6 @@ 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_-}
unset NIX_PATH
export TEST_HOME=$TEST_ROOT/test-home
diff --git a/tests/functional/config.sh b/tests/functional/config.sh
index 723f575ed..46d606d3f 100644
--- a/tests/functional/config.sh
+++ b/tests/functional/config.sh
@@ -40,19 +40,19 @@ files=$(nix-build --verbose --version | grep "User config" | cut -d ':' -f2- | x
# Test that it's possible to load the config from a custom location
here=$(readlink -f "$(dirname "${BASH_SOURCE[0]}")")
export NIX_USER_CONF_FILES=$here/config/nix-with-substituters.conf
-var=$(nix show-config | grep '^substituters =' | cut -d '=' -f 2 | xargs)
+var=$(nix config show | grep '^substituters =' | cut -d '=' -f 2 | xargs)
[[ $var == https://example.com ]]
# Test that it's possible to load config from the environment
-prev=$(nix show-config | grep '^cores' | cut -d '=' -f 2 | xargs)
+prev=$(nix config show | grep '^cores' | cut -d '=' -f 2 | xargs)
export NIX_CONFIG="cores = 4242"$'\n'"experimental-features = nix-command flakes"
-exp_cores=$(nix show-config | grep '^cores' | cut -d '=' -f 2 | xargs)
-exp_features=$(nix show-config | grep '^experimental-features' | cut -d '=' -f 2 | xargs)
+exp_cores=$(nix config show | grep '^cores' | cut -d '=' -f 2 | xargs)
+exp_features=$(nix config show | grep '^experimental-features' | cut -d '=' -f 2 | xargs)
[[ $prev != $exp_cores ]]
[[ $exp_cores == "4242" ]]
[[ $exp_features == "flakes nix-command" ]]
# Test that it's possible to retrieve a single setting's value
-val=$(nix show-config | grep '^warn-dirty' | cut -d '=' -f 2 | xargs)
-val2=$(nix show-config warn-dirty)
+val=$(nix config show | grep '^warn-dirty' | cut -d '=' -f 2 | xargs)
+val2=$(nix config show warn-dirty)
[[ $val == $val2 ]]
diff --git a/tests/functional/experimental-features.sh b/tests/functional/experimental-features.sh
index 607bf0a8e..9ee4a53d4 100644
--- a/tests/functional/experimental-features.sh
+++ b/tests/functional/experimental-features.sh
@@ -31,7 +31,7 @@ source common.sh
NIX_CONFIG='
experimental-features = nix-command
accept-flake-config = true
-' nix show-config accept-flake-config 1>$TEST_ROOT/stdout 2>$TEST_ROOT/stderr
+' nix config show accept-flake-config 1>$TEST_ROOT/stdout 2>$TEST_ROOT/stderr
grepQuiet "false" $TEST_ROOT/stdout
grepQuiet "Ignoring setting 'accept-flake-config' because experimental feature 'flakes' is not enabled" $TEST_ROOT/stderr
@@ -39,7 +39,7 @@ grepQuiet "Ignoring setting 'accept-flake-config' because experimental feature '
NIX_CONFIG='
accept-flake-config = true
experimental-features = nix-command
-' nix show-config accept-flake-config 1>$TEST_ROOT/stdout 2>$TEST_ROOT/stderr
+' nix config show accept-flake-config 1>$TEST_ROOT/stdout 2>$TEST_ROOT/stderr
grepQuiet "false" $TEST_ROOT/stdout
grepQuiet "Ignoring setting 'accept-flake-config' because experimental feature 'flakes' is not enabled" $TEST_ROOT/stderr
@@ -47,7 +47,7 @@ grepQuiet "Ignoring setting 'accept-flake-config' because experimental feature '
NIX_CONFIG='
experimental-features = nix-command flakes
accept-flake-config = true
-' nix show-config accept-flake-config 1>$TEST_ROOT/stdout 2>$TEST_ROOT/stderr
+' nix config show accept-flake-config 1>$TEST_ROOT/stdout 2>$TEST_ROOT/stderr
grepQuiet "true" $TEST_ROOT/stdout
grepQuietInverse "Ignoring setting 'accept-flake-config'" $TEST_ROOT/stderr
@@ -55,7 +55,7 @@ grepQuietInverse "Ignoring setting 'accept-flake-config'" $TEST_ROOT/stderr
NIX_CONFIG='
accept-flake-config = true
experimental-features = nix-command flakes
-' nix show-config accept-flake-config 1>$TEST_ROOT/stdout 2>$TEST_ROOT/stderr
+' nix config show accept-flake-config 1>$TEST_ROOT/stdout 2>$TEST_ROOT/stderr
grepQuiet "true" $TEST_ROOT/stdout
grepQuietInverse "Ignoring setting 'accept-flake-config'" $TEST_ROOT/stderr
diff --git a/tests/functional/gc-runtime.nix b/tests/functional/gc-runtime.nix
index ee5980bdf..4303e0880 100644
--- a/tests/functional/gc-runtime.nix
+++ b/tests/functional/gc-runtime.nix
@@ -1,17 +1,29 @@
with import ./config.nix;
-mkDerivation {
- name = "gc-runtime";
- builder =
- # Test inline source file definitions.
- builtins.toFile "builder.sh" ''
- mkdir $out
+{
+ environ = mkDerivation {
+ name = "gc-runtime-environ";
+ buildCommand = "mkdir $out; echo environ > $out/environ";
+ };
- cat > $out/program <<EOF
- #! ${shell}
- sleep 10000
- EOF
+ open = mkDerivation {
+ name = "gc-runtime-open";
+ buildCommand = "mkdir $out; echo open > $out/open";
+ };
- chmod +x $out/program
- '';
+ program = mkDerivation {
+ name = "gc-runtime-program";
+ builder =
+ # Test inline source file definitions.
+ builtins.toFile "builder.sh" ''
+ mkdir $out
+
+ cat > $out/program <<EOF
+ #! ${shell}
+ sleep 10000 < \$1
+ EOF
+
+ chmod +x $out/program
+ '';
+ };
}
diff --git a/tests/functional/gc-runtime.sh b/tests/functional/gc-runtime.sh
index dc1826a55..6e17acfc0 100644
--- a/tests/functional/gc-runtime.sh
+++ b/tests/functional/gc-runtime.sh
@@ -1,38 +1,44 @@
source common.sh
-case $system in
- *linux*)
- ;;
- *)
- skipTest "Not running Linux";
-esac
-
set -m # enable job control, needed for kill
profiles="$NIX_STATE_DIR"/profiles
rm -rf $profiles
-nix-env -p $profiles/test -f ./gc-runtime.nix -i gc-runtime
+nix-env -p $profiles/test -f ./gc-runtime.nix -i gc-runtime-{program,environ,open}
-outPath=$(nix-env -p $profiles/test -q --no-name --out-path gc-runtime)
-echo $outPath
+programPath=$(nix-env -p $profiles/test -q --no-name --out-path gc-runtime-program)
+environPath=$(nix-env -p $profiles/test -q --no-name --out-path gc-runtime-environ)
+openPath=$(nix-env -p $profiles/test -q --no-name --out-path gc-runtime-open)
+echo $programPath $environPath $openPath
echo "backgrounding program..."
-$profiles/test/program &
+export environPath
+$profiles/test/program $openPath/open &
sleep 2 # hack - wait for the program to get started
child=$!
echo PID=$child
-nix-env -p $profiles/test -e gc-runtime
+nix-env -p $profiles/test -e gc-runtime-{program,environ,open}
nix-env -p $profiles/test --delete-generations old
nix-store --gc
kill -- -$child
-if ! test -e $outPath; then
+if ! test -e $programPath; then
echo "running program was garbage collected!"
exit 1
fi
+if ! test -e $environPath; then
+ echo "file in environment variable was garbage collected!"
+ exit 1
+fi
+
+if ! test -e $openPath; then
+ echo "opened file was garbage collected!"
+ exit 1
+fi
+
exit 0
diff --git a/tests/functional/nix-profile.sh b/tests/functional/nix-profile.sh
index 7c478a0cd..ed014f9ef 100644
--- a/tests/functional/nix-profile.sh
+++ b/tests/functional/nix-profile.sh
@@ -47,9 +47,9 @@ cp ./config.nix $flake1Dir/
# Test upgrading from nix-env.
nix-env -f ./user-envs.nix -i foo-1.0
-nix profile list | grep -A2 'Index:.*0' | grep 'Store paths:.*foo-1.0'
+nix profile list | grep -A2 'Name:.*foo' | grep 'Store paths:.*foo-1.0'
nix profile install $flake1Dir -L
-nix profile list | grep -A4 'Index:.*1' | grep 'Locked flake URL:.*narHash'
+nix profile list | grep -A4 'Name:.*flake1' | grep 'Locked flake URL:.*narHash'
[[ $($TEST_HOME/.nix-profile/bin/hello) = "Hello World" ]]
[ -e $TEST_HOME/.nix-profile/share/man ]
(! [ -e $TEST_HOME/.nix-profile/include ])
@@ -60,7 +60,7 @@ nix profile diff-closures | grep 'env-manifest.nix: ε → ∅'
# Test XDG Base Directories support
export NIX_CONFIG="use-xdg-base-directories = true"
-nix profile remove 1
+nix profile remove flake1 2>&1 | grep 'removed 1 packages'
nix profile install $flake1Dir
[[ $($TEST_HOME/.local/state/nix/profile/bin/hello) = "Hello World" ]]
unset NIX_CONFIG
@@ -68,7 +68,7 @@ unset NIX_CONFIG
# Test upgrading a package.
printf NixOS > $flake1Dir/who
printf 2.0 > $flake1Dir/version
-nix profile upgrade 1
+nix profile upgrade flake1
[[ $($TEST_HOME/.nix-profile/bin/hello) = "Hello NixOS" ]]
nix profile history | grep "packages.$system.default: 1.0, 1.0-man -> 2.0, 2.0-man"
@@ -81,7 +81,7 @@ nix profile rollback
# Test uninstall.
[ -e $TEST_HOME/.nix-profile/bin/foo ]
-nix profile remove 0
+nix profile remove "foo" 2>&1 | grep 'removed 1 packages'
(! [ -e $TEST_HOME/.nix-profile/bin/foo ])
nix profile history | grep 'foo: 1.0 -> ∅'
nix profile diff-closures | grep 'Version 3 -> 4'
@@ -89,10 +89,18 @@ nix profile diff-closures | grep 'Version 3 -> 4'
# Test installing a non-flake package.
nix profile install --file ./simple.nix ''
[[ $(cat $TEST_HOME/.nix-profile/hello) = "Hello World!" ]]
-nix profile remove 1
+nix profile remove simple 2>&1 | grep 'removed 1 packages'
nix profile install $(nix-build --no-out-link ./simple.nix)
[[ $(cat $TEST_HOME/.nix-profile/hello) = "Hello World!" ]]
+# Test packages with same name from different sources
+mkdir $TEST_ROOT/simple-too
+cp ./simple.nix ./config.nix simple.builder.sh $TEST_ROOT/simple-too
+nix profile install --file $TEST_ROOT/simple-too/simple.nix ''
+nix profile list | grep -A4 'Name:.*simple' | grep 'Name:.*simple-1'
+nix profile remove simple 2>&1 | grep 'removed 1 packages'
+nix profile remove simple-1 2>&1 | grep 'removed 1 packages'
+
# Test wipe-history.
nix profile wipe-history
[[ $(nix profile history | grep Version | wc -l) -eq 1 ]]
@@ -100,11 +108,11 @@ nix profile wipe-history
# Test upgrade to CA package.
printf true > $flake1Dir/ca.nix
printf 3.0 > $flake1Dir/version
-nix profile upgrade 0
+nix profile upgrade flake1
nix profile history | grep "packages.$system.default: 1.0, 1.0-man -> 3.0, 3.0-man"
# Test new install of CA package.
-nix profile remove 0
+nix profile remove flake1 2>&1 | grep 'removed 1 packages'
printf 4.0 > $flake1Dir/version
printf Utrecht > $flake1Dir/who
nix profile install $flake1Dir
@@ -112,26 +120,27 @@ nix profile install $flake1Dir
[[ $(nix path-info --json $(realpath $TEST_HOME/.nix-profile/bin/hello) | jq -r .[].ca) =~ fixed:r:sha256: ]]
# Override the outputs.
-nix profile remove 0 1
+nix profile remove simple flake1
nix profile install "$flake1Dir^*"
[[ $($TEST_HOME/.nix-profile/bin/hello) = "Hello Utrecht" ]]
[ -e $TEST_HOME/.nix-profile/share/man ]
[ -e $TEST_HOME/.nix-profile/include ]
printf Nix > $flake1Dir/who
-nix profile upgrade 0
+nix profile list
+nix profile upgrade flake1
[[ $($TEST_HOME/.nix-profile/bin/hello) = "Hello Nix" ]]
[ -e $TEST_HOME/.nix-profile/share/man ]
[ -e $TEST_HOME/.nix-profile/include ]
-nix profile remove 0
+nix profile remove flake1 2>&1 | grep 'removed 1 packages'
nix profile install "$flake1Dir^man"
(! [ -e $TEST_HOME/.nix-profile/bin/hello ])
[ -e $TEST_HOME/.nix-profile/share/man ]
(! [ -e $TEST_HOME/.nix-profile/include ])
# test priority
-nix profile remove 0
+nix profile remove flake1
# Make another flake.
flake2Dir=$TEST_ROOT/flake2
@@ -185,3 +194,12 @@ nix profile install $flake2Dir --priority 0
clearProfiles
nix profile install $(nix build $flake1Dir --no-link --print-out-paths)
expect 1 nix profile install --impure --expr "(builtins.getFlake ''$flake2Dir'').packages.$system.default"
+
+# Test upgrading from profile version 2.
+clearProfiles
+mkdir -p $TEST_ROOT/import-profile
+outPath=$(nix build --no-link --print-out-paths $flake1Dir/flake.nix^out)
+printf '{ "version": 2, "elements": [ { "active": true, "attrPath": "legacyPackages.x86_64-linux.hello", "originalUrl": "flake:nixpkgs", "outputs": null, "priority": 5, "storePaths": [ "%s" ], "url": "github:NixOS/nixpkgs/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" } ] }' "$outPath" > $TEST_ROOT/import-profile/manifest.json
+nix build --profile $TEST_HOME/.nix-profile $(nix store add-path $TEST_ROOT/import-profile)
+nix profile list | grep -A4 'Name:.*hello' | grep "Store paths:.*$outPath"
+nix profile remove hello 2>&1 | grep 'removed 1 packages, kept 0 packages'
diff --git a/tests/nixos/default.nix b/tests/nixos/default.nix
index f7a8588e5..3d0a1f0c6 100644
--- a/tests/nixos/default.nix
+++ b/tests/nixos/default.nix
@@ -141,6 +141,8 @@ in
nix-copy = runNixOSTestFor "x86_64-linux" ./nix-copy.nix;
+ nix-upgrade-nix = runNixOSTestFor "x86_64-linux" ./nix-upgrade-nix.nix;
+
nssPreload = runNixOSTestFor "x86_64-linux" ./nss-preload.nix;
githubFlakes = runNixOSTestFor "x86_64-linux" ./github-flakes.nix;
diff --git a/tests/nixos/nix-upgrade-nix.nix b/tests/nixos/nix-upgrade-nix.nix
new file mode 100644
index 000000000..039b2d9b3
--- /dev/null
+++ b/tests/nixos/nix-upgrade-nix.nix
@@ -0,0 +1,80 @@
+{ lib, config, ... }:
+
+/**
+ * Test that nix upgrade-nix works regardless of whether /nix/var/nix/profiles/default
+ * is a nix-env style profile or a nix profile style profile.
+ */
+
+let
+ pkgs = config.nodes.machine.nixpkgs.pkgs;
+
+ lix = pkgs.nix;
+ lixVersion = lib.getVersion lix;
+
+ newNix = pkgs.nixVersions.unstable;
+ newNixVersion = lib.getVersion newNix;
+
+in {
+ name = "nix-upgrade-nix";
+
+ nodes = {
+ machine = { config, lib, pkgs, ... }: {
+ virtualisation.writableStore = true;
+ virtualisation.additionalPaths = [ pkgs.hello.drvPath ];
+ nix.settings.substituters = lib.mkForce [ ];
+ nix.settings.experimental-features = [ "nix-command" "flakes" ];
+ services.getty.autologinUser = "root";
+
+ };
+ };
+
+ testScript = { nodes }: ''
+ # fmt: off
+
+ start_all()
+
+ machine.succeed("nix --version >&2")
+
+ # Install Lix into the default profile, overriding /run/current-system/sw/bin/nix,
+ # and thus making Lix think we're not on NixOS.
+ machine.succeed("nix-env --install '${lib.getBin lix}' --profile /nix/var/nix/profiles/default >&2")
+
+ # Make sure that correctly got inserted into our PATH.
+ default_profile_nix_path = machine.succeed("command -v nix")
+ print(default_profile_nix_path)
+ assert default_profile_nix_path.strip() == "/nix/var/nix/profiles/default/bin/nix", \
+ f"{default_profile_nix_path.strip()=} != /nix/var/nix/profiles/default/bin/nix"
+
+ # And that it's the Nix we specified.
+ default_profile_version = machine.succeed("nix --version")
+ assert "${lixVersion}" in default_profile_version, f"${lixVersion} not in {default_profile_version}"
+
+ # Upgrade to a different version of Nix, and make sure that also worked.
+
+ machine.succeed("nix upgrade-nix --store-path ${newNix} >&2")
+ default_profile_version = machine.succeed("nix --version")
+ print(default_profile_version)
+ assert "${newNixVersion}" in default_profile_version, f"${newNixVersion} not in {default_profile_version}"
+
+ # Now 'break' this profile -- use nix profile on it so nix-env will no longer work on it.
+ machine.succeed(
+ "nix profile install --profile /nix/var/nix/profiles/default '${pkgs.hello.drvPath}^*' >&2"
+ )
+
+ # Confirm that nix-env is broken.
+ machine.fail(
+ "nix-env --query --installed --profile /nix/var/nix/profiles/default >&2"
+ )
+
+ # And use nix upgrade-nix one more time, on the `nix profile` style profile.
+ # (Specifying Lix by full path so we can use --store-path.)
+ machine.succeed(
+ "${lib.getBin lix}/bin/nix upgrade-nix --store-path '${lix}' >&2"
+ )
+
+ default_profile_version = machine.succeed("nix --version")
+ print(default_profile_version)
+ assert "${lixVersion}" in default_profile_version, f"${lixVersion} not in {default_profile_version}"
+ '';
+
+}
diff --git a/tests/nixos/remote-builds-ssh-ng.nix b/tests/nixos/remote-builds-ssh-ng.nix
index 5ff471607..8deb9a504 100644
--- a/tests/nixos/remote-builds-ssh-ng.nix
+++ b/tests/nixos/remote-builds-ssh-ng.nix
@@ -95,6 +95,10 @@ in
builder.succeed("mkdir -p -m 700 /root/.ssh")
builder.copy_from_host("key.pub", "/root/.ssh/authorized_keys")
builder.wait_for_unit("sshd.service")
+
+ out = client.fail("nix-build ${expr nodes.client 1} 2>&1")
+ assert "error: failed to start SSH connection to 'root@builder': Host key verification failed" in out, f"No host verification error in {out}"
+
client.succeed(f"ssh -o StrictHostKeyChecking=no {builder.name} 'echo hello world' >&2")
# Perform a build
diff --git a/tests/unit/libstore-support/tests/path.cc b/tests/unit/libstore-support/tests/path.cc
index ffc4fc607..8ddda8027 100644
--- a/tests/unit/libstore-support/tests/path.cc
+++ b/tests/unit/libstore-support/tests/path.cc
@@ -1,3 +1,4 @@
+#include <rapidcheck/gen/Arbitrary.h>
#include <regex>
#include <rapidcheck.h>
@@ -20,65 +21,60 @@ void showValue(const StorePath & p, std::ostream & os)
namespace rc {
using namespace nix;
-Gen<StorePathName> Arbitrary<StorePathName>::arbitrary()
+Gen<char> storePathChar()
{
- auto len = *gen::inRange<size_t>(
- 1,
- StorePath::MaxPathLen - StorePath::HashLen);
-
- std::string pre;
- pre.reserve(len);
-
- for (size_t c = 0; c < len; ++c) {
- switch (auto i = *gen::inRange<uint8_t>(0, 10 + 2 * 26 + 6)) {
+ return rc::gen::apply([](uint8_t i) -> char {
+ switch (i) {
case 0 ... 9:
- pre += static_cast<uint8_t>('0' + i);
- break;
+ return '0' + i;
case 10 ... 35:
- pre += static_cast<uint8_t>('A' + (i - 10));
- break;
+ return 'A' + (i - 10);
case 36 ... 61:
- pre += static_cast<uint8_t>('a' + (i - 36));
- break;
+ return 'a' + (i - 36);
case 62:
- pre += '+';
- break;
+ return '+';
case 63:
- pre += '-';
- break;
+ return '-';
case 64:
- // names aren't permitted to start with a period,
- // so just fall through to the next case here
- if (c != 0) {
- pre += '.';
- break;
- }
- [[fallthrough]];
+ return '.';
case 65:
- pre += '_';
- break;
+ return '_';
case 66:
- pre += '?';
- break;
+ return '?';
case 67:
- pre += '=';
- break;
+ return '=';
default:
assert(false);
}
- }
+ },
+ gen::inRange<uint8_t>(0, 10 + 2 * 26 + 6));
+}
- return gen::just(StorePathName {
- .name = std::move(pre),
- });
+Gen<StorePathName> Arbitrary<StorePathName>::arbitrary()
+{
+ return gen::construct<StorePathName>(
+ gen::suchThat(
+ gen::container<std::string>(storePathChar()),
+ [](const std::string & s) {
+ return
+ !( s == ""
+ || s == "."
+ || s == ".."
+ || s.starts_with(".-")
+ || s.starts_with("..-")
+ );
+ }
+ )
+ );
}
Gen<StorePath> Arbitrary<StorePath>::arbitrary()
{
- return gen::just(StorePath {
- *gen::arbitrary<Hash>(),
- (*gen::arbitrary<StorePathName>()).name,
- });
+ return
+ gen::construct<StorePath>(
+ gen::arbitrary<Hash>(),
+ gen::apply([](StorePathName n){ return n.name; }, gen::arbitrary<StorePathName>())
+ );
}
} // namespace rc
diff --git a/tests/unit/libstore/path.cc b/tests/unit/libstore/path.cc
index 30631b5fd..213b6e95f 100644
--- a/tests/unit/libstore/path.cc
+++ b/tests/unit/libstore/path.cc
@@ -39,7 +39,12 @@ TEST_DONT_PARSE(double_star, "**")
TEST_DONT_PARSE(star_first, "*,foo")
TEST_DONT_PARSE(star_second, "foo,*")
TEST_DONT_PARSE(bang, "foo!o")
-TEST_DONT_PARSE(dotfile, ".gitignore")
+TEST_DONT_PARSE(dot, ".")
+TEST_DONT_PARSE(dot_dot, "..")
+TEST_DONT_PARSE(dot_dot_dash, "..-1")
+TEST_DONT_PARSE(dot_dash, ".-1")
+TEST_DONT_PARSE(dot_dot_dash_a, "..-a")
+TEST_DONT_PARSE(dot_dash_a, ".-a")
#undef TEST_DONT_PARSE
@@ -63,6 +68,11 @@ TEST_DO_PARSE(underscore, "foo_bar")
TEST_DO_PARSE(period, "foo.txt")
TEST_DO_PARSE(question_mark, "foo?why")
TEST_DO_PARSE(equals_sign, "foo=foo")
+TEST_DO_PARSE(dotfile, ".gitignore")
+TEST_DO_PARSE(triple_dot_a, "...a")
+TEST_DO_PARSE(triple_dot_1, "...1")
+TEST_DO_PARSE(triple_dot_dash, "...-")
+TEST_DO_PARSE(triple_dot, "...")
#undef TEST_DO_PARSE
@@ -84,6 +94,64 @@ RC_GTEST_FIXTURE_PROP(
RC_ASSERT(p == store->parseStorePath(store->printStorePath(p)));
}
+
+RC_GTEST_FIXTURE_PROP(
+ StorePathTest,
+ prop_check_regex_eq_parse,
+ ())
+{
+ static auto nameFuzzer =
+ rc::gen::container<std::string>(
+ rc::gen::oneOf(
+ // alphanum, repeated to weigh heavier
+ rc::gen::oneOf(
+ rc::gen::inRange('0', '9'),
+ rc::gen::inRange('a', 'z'),
+ rc::gen::inRange('A', 'Z')
+ ),
+ // valid symbols
+ rc::gen::oneOf(
+ rc::gen::just('+'),
+ rc::gen::just('-'),
+ rc::gen::just('.'),
+ rc::gen::just('_'),
+ rc::gen::just('?'),
+ rc::gen::just('=')
+ ),
+ // symbols for scary .- and ..- cases, repeated for weight
+ rc::gen::just('.'), rc::gen::just('.'),
+ rc::gen::just('.'), rc::gen::just('.'),
+ rc::gen::just('-'), rc::gen::just('-'),
+ // ascii symbol ranges
+ rc::gen::oneOf(
+ rc::gen::inRange(' ', '/'),
+ rc::gen::inRange(':', '@'),
+ rc::gen::inRange('[', '`'),
+ rc::gen::inRange('{', '~')
+ ),
+ // typical whitespace
+ rc::gen::oneOf(
+ rc::gen::just(' '),
+ rc::gen::just('\t'),
+ rc::gen::just('\n'),
+ rc::gen::just('\r')
+ ),
+ // some chance of control codes, non-ascii or other garbage we missed
+ rc::gen::inRange('\0', '\xff')
+ ));
+
+ auto name = *nameFuzzer;
+
+ std::string path = store->storeDir + "/575s52sh487i0ylmbs9pvi606ljdszr0-" + name;
+ bool parsed = false;
+ try {
+ store->parseStorePath(path);
+ parsed = true;
+ } catch (const BadStorePath &) {
+ }
+ RC_ASSERT(parsed == std::regex_match(std::string { name }, nameRegex));
+}
+
#endif
}
diff --git a/tests/unit/libutil-support/tests/hash.cc b/tests/unit/libutil-support/tests/hash.cc
index 577e9890e..7cc994b40 100644
--- a/tests/unit/libutil-support/tests/hash.cc
+++ b/tests/unit/libutil-support/tests/hash.cc
@@ -11,10 +11,17 @@ using namespace nix;
Gen<Hash> Arbitrary<Hash>::arbitrary()
{
- Hash hash(htSHA1);
- for (size_t i = 0; i < hash.hashSize; ++i)
- hash.hash[i] = *gen::arbitrary<uint8_t>();
- return gen::just(hash);
+ Hash prototype(htSHA1);
+ return
+ gen::apply(
+ [](const std::vector<uint8_t> & v) {
+ Hash hash(htSHA1);
+ assert(v.size() == hash.hashSize);
+ std::copy(v.begin(), v.end(), hash.hash);
+ return hash;
+ },
+ gen::container<std::vector<uint8_t>>(prototype.hashSize, gen::arbitrary<uint8_t>())
+ );
}
}
diff --git a/tests/unit/libutil/tests.cc b/tests/unit/libutil/tests.cc
index f55c56548..720370066 100644
--- a/tests/unit/libutil/tests.cc
+++ b/tests/unit/libutil/tests.cc
@@ -404,6 +404,45 @@ namespace nix {
ASSERT_EQ(rewriteStrings("this and that", rewrites), "that and that");
}
+ TEST(rewriteStrings, intransitive) {
+ StringMap rewrites;
+ // transitivity can happen both in forward and reverse iteration order of the rewrite map.
+ rewrites["a"] = "b";
+ rewrites["b"] = "c";
+ rewrites["e"] = "b";
+
+ ASSERT_EQ(rewriteStrings("abcde", rewrites), "bccdb");
+ }
+
+ TEST(rewriteStrings, nonoverlapping) {
+ StringMap rewrites;
+ rewrites["ab"] = "ca";
+
+ ASSERT_EQ(rewriteStrings("abb", rewrites), "cab");
+ }
+
+ TEST(rewriteStrings, differentLength) {
+ StringMap rewrites;
+ rewrites["a"] = "an has a trea";
+
+ ASSERT_EQ(rewriteStrings("cat", rewrites), "can has a treat");
+ }
+
+ TEST(rewriteStrings, sorted) {
+ StringMap rewrites;
+ rewrites["a"] = "meow";
+ rewrites["abc"] = "puppy";
+
+ ASSERT_EQ(rewriteStrings("abcde", rewrites), "meowbcde");
+ }
+
+ TEST(rewriteStrings, multiple) {
+ StringMap rewrites;
+ rewrites["a"] = "b";
+
+ ASSERT_EQ(rewriteStrings("a1a2a3a", rewrites), "b1b2b3b");
+ }
+
TEST(rewriteStrings, doesntOccur) {
StringMap rewrites;
rewrites["foo"] = "bar";
diff --git a/tests/unit/libutil/url-name.cc b/tests/unit/libutil/url-name.cc
new file mode 100644
index 000000000..164bb26d7
--- /dev/null
+++ b/tests/unit/libutil/url-name.cc
@@ -0,0 +1,69 @@
+#include "url-name.hh"
+#include <gtest/gtest.h>
+
+namespace nix {
+
+/* ----------- tests for url-name.hh --------------------------------------------------*/
+
+ TEST(getNameFromURL, getNameFromURL) {
+ ASSERT_EQ(getNameFromURL(parseURL("path:/home/user/project")), "project");
+ ASSERT_EQ(getNameFromURL(parseURL("path:~/repos/nixpkgs#packages.x86_64-linux.hello")), "hello");
+ ASSERT_EQ(getNameFromURL(parseURL("path:~/repos/nixpkgs#legacyPackages.x86_64-linux.hello")), "hello");
+ ASSERT_EQ(getNameFromURL(parseURL("path:~/repos/nixpkgs#packages.x86_64-linux.Hello")), "Hello");
+ ASSERT_EQ(getNameFromURL(parseURL("path:.#nonStandardAttr.mylaptop")), "mylaptop");
+ ASSERT_EQ(getNameFromURL(parseURL("path:./repos/myflake#nonStandardAttr.mylaptop")), "mylaptop");
+ ASSERT_EQ(getNameFromURL(parseURL("path:./nixpkgs#packages.x86_64-linux.complex^bin,man")), "complex");
+ ASSERT_EQ(getNameFromURL(parseURL("path:./myproj#packages.x86_64-linux.default^*")), "myproj");
+
+ ASSERT_EQ(getNameFromURL(parseURL("github:NixOS/nixpkgs#packages.x86_64-linux.hello")), "hello");
+ ASSERT_EQ(getNameFromURL(parseURL("github:NixOS/nixpkgs#hello")), "hello");
+ ASSERT_EQ(getNameFromURL(parseURL("github:NixOS/nix#packages.x86_64-linux.default")), "nix");
+ ASSERT_EQ(getNameFromURL(parseURL("github:NixOS/nix#")), "nix");
+ ASSERT_EQ(getNameFromURL(parseURL("github:NixOS/nix")), "nix");
+ ASSERT_EQ(getNameFromURL(parseURL("github:cachix/devenv/main#packages.x86_64-linux.default")), "devenv");
+ ASSERT_EQ(getNameFromURL(parseURL("github:edolstra/nix-warez?rev=1234&dir=blender&ref=master")), "blender");
+
+ ASSERT_EQ(getNameFromURL(parseURL("gitlab:NixOS/nixpkgs#packages.x86_64-linux.hello")), "hello");
+ ASSERT_EQ(getNameFromURL(parseURL("gitlab:NixOS/nixpkgs#hello")), "hello");
+ ASSERT_EQ(getNameFromURL(parseURL("gitlab:NixOS/nix#packages.x86_64-linux.default")), "nix");
+ ASSERT_EQ(getNameFromURL(parseURL("gitlab:NixOS/nix#")), "nix");
+ ASSERT_EQ(getNameFromURL(parseURL("gitlab:NixOS/nix")), "nix");
+ ASSERT_EQ(getNameFromURL(parseURL("gitlab:cachix/devenv/main#packages.x86_64-linux.default")), "devenv");
+
+ ASSERT_EQ(getNameFromURL(parseURL("sourcehut:NixOS/nixpkgs#packages.x86_64-linux.hello")), "hello");
+ ASSERT_EQ(getNameFromURL(parseURL("sourcehut:NixOS/nixpkgs#hello")), "hello");
+ ASSERT_EQ(getNameFromURL(parseURL("sourcehut:NixOS/nix#packages.x86_64-linux.default")), "nix");
+ ASSERT_EQ(getNameFromURL(parseURL("sourcehut:NixOS/nix#")), "nix");
+ ASSERT_EQ(getNameFromURL(parseURL("sourcehut:NixOS/nix")), "nix");
+ ASSERT_EQ(getNameFromURL(parseURL("sourcehut:cachix/devenv/main#packages.x86_64-linux.default")), "devenv");
+
+ ASSERT_EQ(getNameFromURL(parseURL("git://github.com/edolstra/dwarffs")), "dwarffs");
+ ASSERT_EQ(getNameFromURL(parseURL("git://github.com/edolstra/nix-warez?dir=blender")), "blender");
+ ASSERT_EQ(getNameFromURL(parseURL("git+file:///home/user/project")), "project");
+ ASSERT_EQ(getNameFromURL(parseURL("git+file:///home/user/project?ref=fa1e2d23a22")), "project");
+ ASSERT_EQ(getNameFromURL(parseURL("git+ssh://git@github.com/someuser/my-repo#")), "my-repo");
+ ASSERT_EQ(getNameFromURL(parseURL("git+git://github.com/someuser/my-repo?rev=v1.2.3")), "my-repo");
+ ASSERT_EQ(getNameFromURL(parseURL("git+ssh:///home/user/project?dir=subproject&rev=v2.4")), "subproject");
+ ASSERT_EQ(getNameFromURL(parseURL("git+http://not-even-real#packages.x86_64-linux.hello")), "hello");
+ ASSERT_EQ(getNameFromURL(parseURL("git+https://not-even-real#packages.aarch64-darwin.hello")), "hello");
+
+ ASSERT_EQ(getNameFromURL(parseURL("tarball+http://github.com/NixOS/nix/archive/refs/tags/2.18.1#packages.x86_64-linux.jq")), "jq");
+ ASSERT_EQ(getNameFromURL(parseURL("tarball+https://github.com/NixOS/nix/archive/refs/tags/2.18.1#packages.x86_64-linux.hg")), "hg");
+ ASSERT_EQ(getNameFromURL(parseURL("tarball+file:///home/user/Downloads/nixpkgs-2.18.1#packages.aarch64-darwin.ripgrep")), "ripgrep");
+
+ ASSERT_EQ(getNameFromURL(parseURL("https://github.com/NixOS/nix/archive/refs/tags/2.18.1.tar.gz#packages.x86_64-linux.pv")), "pv");
+ ASSERT_EQ(getNameFromURL(parseURL("http://github.com/NixOS/nix/archive/refs/tags/2.18.1.tar.gz#packages.x86_64-linux.pv")), "pv");
+
+ ASSERT_EQ(getNameFromURL(parseURL("file:///home/user/project?ref=fa1e2d23a22")), "project");
+ ASSERT_EQ(getNameFromURL(parseURL("file+file:///home/user/project?ref=fa1e2d23a22")), "project");
+ ASSERT_EQ(getNameFromURL(parseURL("file+http://not-even-real#packages.x86_64-linux.hello")), "hello");
+ ASSERT_EQ(getNameFromURL(parseURL("file+http://gitfantasy.com/org/user/notaflake")), "notaflake");
+ ASSERT_EQ(getNameFromURL(parseURL("file+https://not-even-real#packages.aarch64-darwin.hello")), "hello");
+
+ ASSERT_EQ(getNameFromURL(parseURL("https://www.github.com/")), std::nullopt);
+ ASSERT_EQ(getNameFromURL(parseURL("path:.")), std::nullopt);
+ ASSERT_EQ(getNameFromURL(parseURL("file:.#")), std::nullopt);
+ ASSERT_EQ(getNameFromURL(parseURL("path:.#packages.x86_64-linux.default")), std::nullopt);
+ ASSERT_EQ(getNameFromURL(parseURL("path:.#packages.x86_64-linux.default^*")), std::nullopt);
+ }
+}
diff --git a/tests/unit/meson.build b/tests/unit/meson.build
index ae850df47..339ac9a4a 100644
--- a/tests/unit/meson.build
+++ b/tests/unit/meson.build
@@ -52,6 +52,7 @@ libutil_tests_sources = files(
'libutil/suggestions.cc',
'libutil/tests.cc',
'libutil/url.cc',
+ 'libutil/url-name.cc',
'libutil/xml-writer.cc',
)