pub struct Runcmd { /* private fields */ }Expand description
The Runcmd context gives a step function access to the ability to run subprocesses as part of a scenario. These subprocesses are run with various environment variables set, and we record the stdout/stderr of the most recent-to-run command for testing purposes.
Implementations§
Source§impl Runcmd
impl Runcmd
Sourcepub fn prepend_to_path<S: Into<OsString>>(&mut self, element: S)
pub fn prepend_to_path<S: Into<OsString>>(&mut self, element: S)
Prepend the given location to the run path
Sourcepub fn stdout_as_string(&self) -> String
pub fn stdout_as_string(&self) -> String
Retrieve the last run command’s stdout as a string.
This does a lossy conversion from utf8 so should always succeed.
Sourcepub fn stderr_as_string(&self) -> String
pub fn stderr_as_string(&self) -> String
Retrieve the last run command’s stderr as a string.
This does a lossy conversion from utf8 so should always succeed.
Sourcepub fn setenv<K: Into<OsString>, V: Into<OsString>>(&mut self, key: K, value: V)
pub fn setenv<K: Into<OsString>, V: Into<OsString>>(&mut self, key: K, value: V)
Set an env var in the Runcmd context
This sets an environment variable into the Runcmd context for use during execution
Sourcepub fn getenv<K: AsRef<OsStr>>(&self, key: K) -> Option<&OsStr>
pub fn getenv<K: AsRef<OsStr>>(&self, key: K) -> Option<&OsStr>
Get an env var from the Runcmd context
This retrieves a set environment variable from the Runcmd context
Sourcepub fn unsetenv<K: AsRef<OsStr>>(&mut self, key: K) -> bool
pub fn unsetenv<K: AsRef<OsStr>>(&mut self, key: K) -> bool
Unset an env var in the Runcmd context
This removes an environment variable (if set) from the Runcmd context and returns whether or not it was removed.
Sourcepub fn join_paths(&self) -> Result<OsString, JoinPathsError>
pub fn join_paths(&self) -> Result<OsString, JoinPathsError>
Join the PATH environment variable and the paths attribute
together properly.
This prepends the paths (in reverse order) to the PATH environment
variable and then returns it.
If there is no PATH in the stored environment then the resultant
path will be entirely made up of the pushed path elements
let mut rc = Runcmd::default();
assert_eq!(rc.join_paths().unwrap(), "");
rc.setenv("PATH", "one");
assert_eq!(rc.join_paths().unwrap(), "one");
rc.prepend_to_path("two");
assert_eq!(rc.join_paths().unwrap(), "two:one");
rc.unsetenv("PATH");
assert_eq!(rc.join_paths().unwrap(), "two");
rc.prepend_to_path("three");
assert_eq!(rc.join_paths().unwrap(), "three:two");
rc.setenv("PATH", "one");
assert_eq!(rc.join_paths().unwrap(), "three:two:one");Sourcepub fn with_forklock<F, R>(&mut self, func: F) -> Result<R, StepError>
pub fn with_forklock<F, R>(&mut self, func: F) -> Result<R, StepError>
Perform an operation with the fork-lock held.
In order to prevent races where one scenario creates a file which is related to executables, and another forks, defeating the sequencing of creation and cleanup, the runcmd core will hold the fork lock while creating subprocesses.
The implied contract therefore is that any step involved in the creation of an executable in-process must hold the fork-lock for the duration of the any code involved in the creation of it which has file descriptors open. For example, the writing out of a script file