Skip to content

Commit

Permalink
Add working-directory directive.
Browse files Browse the repository at this point in the history
  • Loading branch information
dillof committed Dec 27, 2023
1 parent 8d9b865 commit b58f9b4
Show file tree
Hide file tree
Showing 10 changed files with 53 additions and 2 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,4 @@ __pycache__
/nihtest.egg-info
cmake-build-debug/
/build
.DS_Store
6 changes: 5 additions & 1 deletion NEWS.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
# 1.4.0 [Unreleased]

- Add `working-directory` directive.

# 1.3.0 [2023-12-22]

- Add set-modification-time.
- Add `set-modification-time` directive.
- Fix inline stdin data.
- Improve error handling.
- Require python 3.9.
Expand Down
5 changes: 5 additions & 0 deletions manpages/nihtest-case.mdoc
Original file line number Diff line number Diff line change
Expand Up @@ -207,6 +207,11 @@ otherwise the expected text is taken from the following lines of the test case,
.\" .Xr sh 1
.\" command
.\" .Dl ulimit -n 16 .
.It Ic working-directory Ar directory
Run the program in the subdirectory
.Ar directory
inside the sandbox.
The directory will be created if it doesn't exist.
.El
.Sh SEE ALSO
.Xr nihtest 1 ,
Expand Down
6 changes: 6 additions & 0 deletions manpages/nihtest.conf.mdoc
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,12 @@ See
.Xr nihtest-case 5
for details on
.Ic stderr-replace .
.It Ic default-working-directory = Ar directory
Use
.Ar directory
as the working directory if no
.Ic working-directory
directive is found in the test.
.It Ic environment-clear = true
If
.Ic environment-clear
Expand Down
2 changes: 2 additions & 0 deletions nihtest/Configuration.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
"settings": [
"default-program",
"default-stderr-replace",
"default-working-directory",
"features-files",
"keep-sandbox",
"print-results",
Expand Down Expand Up @@ -116,6 +117,7 @@ def __init__(self, args):
settings = config["settings"]
self.default_program = get_value(settings, "default-program")
self.default_stderr_replace = get_array(settings, "default-stderr-replace")
self.default_working_directory = get_value(settings, "default-working-directory")
self.feature_files = get_array(settings, "features-files")
self.keep_sandbox = get_when(settings, "keep-sandbox", When.NEVER)
self.print_results = get_when(settings, "print-results", When.FAILED)
Expand Down
8 changes: 7 additions & 1 deletion nihtest/Sandbox.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ def __init__(self, name, auto_cleanup):
self.auto_cleanup = auto_cleanup
self.entered = False
self.directory = None
self.parent_directory = os.getcwd()
basename = os.path.basename(name)
self.directory = tempfile.mkdtemp(prefix=f"sandbox_{basename}.d", dir=".")

Expand Down Expand Up @@ -35,5 +36,10 @@ def enter(self):
def leave(self):
if not self.entered:
raise RuntimeError("not in sandbox")
os.chdir("..")
os.chdir(self.parent_directory)
self.entered = False

def chdir_top(self):
if not self.entered:
raise RuntimeError("not in sandbox")
os.chdir(os.path.join(self.parent_directory, self.directory))
5 changes: 5 additions & 0 deletions nihtest/Test.py
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,12 @@ def run(self):
if self.case.preload:
environment["LD_PRELOAD"] = " ".join(map(lambda file: self.case.configuration.find_program("lib" + file), self.case.preload))
command = Command.Command(program, self.case.arguments, self.case.stdin, environment=environment)
if self.case.working_directory is not None:
if not os.path.exists(self.case.working_directory):
os.mkdir(self.case.working_directory)
os.chdir(self.case.working_directory)
command.run()
self.sandbox.chdir_top()
files_got = self.list_files()
self.sandbox.leave()

Expand Down
8 changes: 8 additions & 0 deletions nihtest/TestCase.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ def __init__(self, configuration, args):
self.ok = True
self.directories = []
self.modification_times = {}
self.working_directory = configuration.default_working_directory
self.parse_case()
if not self.ok:
raise RuntimeError("invalid test case")
Expand Down Expand Up @@ -199,6 +200,9 @@ def directive_stdin(self, arguments):
def directive_stdout(self, arguments):
self.stdout = self.io_data(arguments)

def directive_working_directory(self, arguments):
self.working_directory = arguments[0]

directives = {
"arguments": Directive(method=directive_arguments,
usage="[argument ...]",
Expand Down Expand Up @@ -260,6 +264,10 @@ def directive_stdout(self, arguments):
usage="[file]",
minimum_arguments=0, maximum_arguments=1,
only_once=True),
"working-directory": Directive(method=directive_working_directory,
usage="directory",
minimum_arguments=1,
only_once=True)
}

def get_program_directories(self):
Expand Down
9 changes: 9 additions & 0 deletions tests/working-directory.input
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
working-directory subdirectory
program cat
arguments ../working-directory-test-file
file working-directory-test-file <>
This file is in the top sandbox directory.
end-of-inline-data
stdout
This file is in the top sandbox directory.
end-of-inline-data
5 changes: 5 additions & 0 deletions tests/working-directory.test
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
program nihtest
arguments case.test
return 0
file case.test working-directory.input
file nihtest.conf nihtest-conf

0 comments on commit b58f9b4

Please sign in to comment.