Skip to content

Commit

Permalink
Test for running without home
Browse files Browse the repository at this point in the history
  • Loading branch information
mosteo committed Oct 2, 2024
1 parent e51e5a7 commit 6d5bbae
Show file tree
Hide file tree
Showing 6 changed files with 97 additions and 1 deletion.
2 changes: 1 addition & 1 deletion src/alire/alire-platforms-common.adb
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ package body Alire.Platforms.Common is

function Unix_Home_Folder return String
is
Home_Var : constant String := OS_Lib.Getenv ("HOME", "unset");
Home_Var : constant String := OS_Lib.Getenv ("HOME", "unset");
Maybe_Windows : constant Boolean := Home_Var = "unset"
and then GNAT.OS_Lib.Directory_Separator = '\';
begin
Expand Down
1 change: 1 addition & 0 deletions src/alr/alr-commands-version.adb
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@ package body Alr.Commands.Version is

Add ("");
Add ("CONFIGURATION");
Add ("home folder:", Alire.Platforms.Folders.Home);
Add ("settings folder:", Alire.Settings.Edit.Path);
Add ("cache folder:", Alire.Cache.Path);
Add ("vault folder:", Paths.Vault.Path);
Expand Down
40 changes: 40 additions & 0 deletions testsuite/tests/dockerized/misc/no-home/test.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
"""
Verify that alr can run with no HOME set, or with it set to an
unwritable/nonexistent directory.
NOTE: This same test is duplicated to be run under docker as a regular user.
"""

import os
from drivers.alr import run_alr


def check_no_home():
# Verify that alr is using the fallback home directory.
p = run_alr("--format", "version")
assert """{
"key": "home folder",
"value": "/tmp"
}""" in p.out, "Unexpected output: " + p.out


# Remove HOME
os.environ.pop("HOME", None)
check_no_home()

# Set HOME to a nonexistent directory
fake_home = "/tmp/fake_home_for_alr"
assert not os.path.exists(fake_home)
os.environ["HOME"] = fake_home
check_no_home()

# Set HOME to an unwritable directory
# Under our docker, we should be a regular user and this should succeed
os.makedirs(fake_home)
os.chmod(fake_home, 0o444)
check_no_home()
# Cleanup
os.chmod(fake_home, 0o777)
os.rmdir(fake_home)


print("SUCCESS")
7 changes: 7 additions & 0 deletions testsuite/tests/dockerized/misc/no-home/test.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
driver: docker-wrapper
build_mode: both
control:
- [SKIP, "skip_docker", "Test is Docker-only"]
- [SKIP, "skip_unix", "Test is Unix-only"]
indexes:
compiler_only_index: {}
42 changes: 42 additions & 0 deletions testsuite/tests/misc/no-home/test.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
"""
Verify that alr can run with no HOME set, or with it set to an
unwritable/nonexistent directory.
NOTE: This same test is duplicated to be run under docker as a regular user.
"""

import os
from drivers.alr import run_alr


def check_no_home():
# Verify that alr is using the fallback home directory.
p = run_alr("--format", "version")
assert """{
"key": "home folder",
"value": "/tmp"
}""" in p.out, "Unexpected output: " + p.out


# Remove HOME
os.environ.pop("HOME", None)
check_no_home()

# Set HOME to a nonexistent directory
fake_home = "/tmp/fake_home_for_alr"
assert not os.path.exists(fake_home)
os.environ["HOME"] = fake_home
check_no_home()

# Set HOME to an unwritable directory
# This will fail if running under root, in which case we skip this part.
# This is tested properly under docker
if os.getuid() != 0:
os.makedirs(fake_home)
os.chmod(fake_home, 0o444)
check_no_home()
# Cleanup
os.chmod(fake_home, 0o777)
os.rmdir(fake_home)


print("SUCCESS")
6 changes: 6 additions & 0 deletions testsuite/tests/misc/no-home/test.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
driver: python-script
build_mode: both
control:
- [SKIP, "skip_unix", "Test is Unix-only"]
indexes:
compiler_only_index: {}

0 comments on commit 6d5bbae

Please sign in to comment.