Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add test for building on an air-gapped system #1760

Merged
merged 5 commits into from
Sep 24, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file not shown.
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
description = "\"Hello, world!\" demonstration project"
name = "hello"
version = "1.0.1"
maintainers = ["[email protected]", "[email protected]"]
maintainers-logins = ["mylogin"]

[[depends-on]]
libhello = "^1.0"

[origin]
url = "file:../../../crates/hello.tgz"
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
version = "1.1"
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
description = "\"Hello, world!\" demonstration project support library"
name = "libhello"
version = "1.0.0"
maintainers = ["[email protected]"]
maintainers-logins = ["mylogin"]

[origin]
url = "file:../../../crates/libhello.tgz"
83 changes: 83 additions & 0 deletions testsuite/tests/workflows/air-gapping/test.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
"""
Test fetching a crate online, and subsequently building offline.
"""


import os
import shutil
import subprocess

from drivers.alr import run_alr
from drivers.asserts import assert_eq, assert_match


# Mock tar, git, curl, gprbuild etc. with dummy scripts
os.mkdir("path-dir")
os.chdir("path-dir")
for executable in ("tar", "git", "hg", "svn", "curl", "gprbuild"):
with open(executable, "w") as f:
f.write("\n".join([
"#!/usr/bin/env python",
"import sys",
"print('Mocked command called')",
"sys.exit(1)"
]))
os.chmod(executable, 0o764)
os.environ["PATH"] = f'{os.getcwd()}{os.pathsep}{os.environ["PATH"]}'
os.chdir("..")


# Run `alr get hello`. This will fail because tar is unavailable.
p = run_alr("get", "hello", quiet=False, complain_on_error=False)
assert_match(".*Mocked command called", p.out)
assert_match(".*Deployment of path .* to .* failed", p.out)

# Disable tar mocking and run `alr get hello` to 'download' the crate and its
# dependencies.
os.remove(os.path.join("path-dir", "tar"))
p = run_alr("get", "hello", quiet=False)
assert_match(r".*hello=1\.0\.1 successfully retrieved", p.out)
assert_match(r".*\+ libhello 1\.0\.0 \(new\)", p.out)

# Re-enable tar mocking and make the index unavailable to simulate disconnection
# from the network
shutil.copy(os.path.join("path-dir", "curl"), os.path.join("path-dir", "tar"))
shutil.move("my_index", "somewhere_else")

# Simulate transferring to a different system by clearing the alr-config
# directory (we keep settings.toml, since it just does various things to isolate
# the test environment) and changing the absolute path of the crate directory.
for f in os.listdir("alr-config"):
if f != "settings.toml":
shutil.rmtree(os.path.join("alr-config", f))
shutil.move(f"hello_1.0.1_filesystem", "hello")

# Run `alr build`. This will fail because gprbuild is unavailable.
os.chdir(f"hello")
p = run_alr("build", quiet=False, complain_on_error=False)
assert_match(".*Mocked command called", p.out)
assert_match(r'.*Command \["gprbuild", .*\] exited with code 1', p.out)

# Disable gprbuild mocking and run `alr build` to build the crate (with tar
# mocking still enabled to check it doesn't try to fetch anything else)
os.remove(os.path.join("..", "path-dir", "gprbuild"))
p = run_alr("build", quiet=False)

# Check the built binary works as expected
assert_eq(
b"Hello, world!\n",
subprocess.run([os.path.join("obj", "hello")], capture_output=True).stdout
)

# Clear out the downloaded dependencies, and verify that `alr build` then
# attempts (and fails) to re-fetch them
shutil.rmtree(os.path.join("alire", "cache", "dependencies"))
p = run_alr("build", quiet=False, complain_on_error=False)
assert_match(
".*Filesystem crate is neither a folder nor a source archive: ",
p.out
)
assert_match(".*Deployment of path .* to .* failed", p.out)


print("SUCCESS")
10 changes: 10 additions & 0 deletions testsuite/tests/workflows/air-gapping/test.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
driver: python-script
# We need 'dependencies.shared=false' anyway for dependencies to be packaged
# inside the workspace, so we only run in sandboxed mode.
build_mode: sandboxed
control:
# Mocking commands this way doesn't work on Windows
- [SKIP, "skip_unix", "Test is Unix-only"]
indexes:
my_index:
in_fixtures: false
Loading