Compare commits

..

No commits in common. "67b6f90fe0b1618195ace6eaddf73d6c94b25517" and "10edcd42826bca247f129c768507aaa1d5fe4c0a" have entirely different histories.

8 changed files with 141 additions and 197 deletions

View file

@ -1,36 +1,7 @@
use std::path::{Path as ActualPath, PathBuf};
#[derive(Clone, Debug)]
pub struct Path(PathBuf);
// FIXME: This is a specialization since with Path: Into<PathBuf>
// it would overwrite impl<T> From <T> for T
//impl<T: Into<PathBuf>> From<T> for Path {
// fn from(v: T) -> Self {
// Path(v.into())
// }
//}
macro_rules! path_from {
( $t:ty ) => {
impl From<$t> for Path {
fn from(v: $t) -> Self {
Self(v.into())
}
}
};
}
path_from!(String);
path_from!(&str);
path_from!(PathBuf);
impl From<Path> for PathBuf {
fn from(v: Path) -> Self {
v.0
}
}
pub struct Path(pub PathBuf);
impl AsRef<ActualPath> for Path {
fn as_ref(&self) -> &ActualPath {
&self.0

View file

@ -65,7 +65,7 @@ impl<D> SymbolBuilder<Key<D>> for DefaultBuilder {
target: &<Key<D> as Resource>::Artifact,
(): <Self::Prerequisites as ToArtifact>::Artifact,
) -> Self::Symbol {
KeySymbol::new(StdCommandRunner, target.clone().into())
KeySymbol::new(StdCommandRunner, target.0.clone())
}
}
@ -84,8 +84,8 @@ impl<D: Clone> SymbolBuilder<Csr<D>> for DefaultBuilder {
CsrSymbol::new(
StdCommandRunner,
resource.0.clone(),
key.into(),
target.clone().into(),
key.0,
target.0.clone(),
)
}
}
@ -124,11 +124,11 @@ impl<D: Clone> SymbolBuilder<Cert<D>> for DefaultBuilder {
CertSymbol::new(
resource.0.clone(),
SetuidCommandRunner::new(user_name.0, &StdCommandRunner),
root_cert.into(),
account_key.into(),
challenges_dir.into(),
csr.into(),
target.clone().into(),
root_cert.0,
account_key.0,
challenges_dir.0,
csr.0,
target.0.clone(),
)
}
}
@ -145,7 +145,7 @@ impl<D: Clone> SymbolBuilder<CertChain<D>> for DefaultBuilder {
target: &<CertChain<D> as Resource>::Artifact,
(cert, root_cert): <Self::Prerequisites as ToArtifact>::Artifact,
) -> Self::Symbol {
ConcatSymbol::new([cert.into(), root_cert.into()], target.clone().into())
ConcatSymbol::new([cert.0, root_cert.0], target.0.clone())
}
}
@ -161,7 +161,7 @@ impl<D: Clone> SymbolBuilder<KeyAndCertBundle<D>> for DefaultBuilder {
target: &<KeyAndCertBundle<D> as Resource>::Artifact,
(cert_chain, key): <Self::Prerequisites as ToArtifact>::Artifact,
) -> Self::Symbol {
ConcatSymbol::new([key.into(), cert_chain.into()], target.clone().into())
ConcatSymbol::new([key.0, cert_chain.0], target.0.clone())
}
}
@ -210,7 +210,7 @@ impl SymbolBuilder<DefaultServer> for DefaultBuilder {
) -> Self::Symbol {
(
FileSymbol::new(
target.clone().into(),
target.0.clone(),
nginx::default_server(challenges_snippet_path),
),
ReloadServiceSymbol::new(StdCommandRunner, "nginx"),
@ -239,8 +239,14 @@ impl<D: AsRef<str> + Clone + Display> SymbolBuilder<ServeCustom<D>> for DefaultB
) -> Self::Symbol {
(
FileSymbol::new(
target.clone().into(),
nginx::server_config(&resource.0, cert, key, &resource.1, challenges_snippet_path),
target.0.clone(),
nginx::server_config(
&resource.0,
cert.0,
key.0,
&resource.1,
challenges_snippet_path,
),
),
ReloadServiceSymbol::new(StdCommandRunner, "nginx"),
)
@ -274,11 +280,11 @@ impl<D: Clone + Display, P: AsRef<Path>> SymbolBuilder<ServePhp<D, P>> for Defau
) -> Self::Symbol {
(
FileSymbol::new(
target.clone().into(),
target.0.clone(),
nginx::server_config(
&resource.0,
cert,
key,
cert.0,
key.0,
nginx::php_snippet(resource.2, &pool.0, &resource.1) + &resource.3,
challenges_snippet_path,
),
@ -323,11 +329,11 @@ impl<D: Clone + Display, P: Clone + AsRef<Path>> SymbolBuilder<ServeService<D, P
) -> Self::Symbol {
(
FileSymbol::new(
target.clone().into(),
target.0.clone(),
nginx::server_config(
&resource.0,
cert,
key,
cert.0,
key.0,
nginx::proxy_snippet(&socket.0, &resource.3),
challenges_snippet_path,
),
@ -358,11 +364,11 @@ impl<D: AsRef<str> + Clone + Display> SymbolBuilder<ServeRedir<D>> for DefaultBu
) -> Self::Symbol {
(
FileSymbol::new(
target.clone().into(),
target.0.clone(),
nginx::server_config(
&resource.0,
cert,
key,
cert.0,
key.0,
nginx::redir_snippet(resource.1.as_ref()),
challenges_snippet_path,
),
@ -395,11 +401,11 @@ impl<D: AsRef<str> + Clone + Display, P: AsRef<Path>> SymbolBuilder<ServeStatic<
) -> Self::Symbol {
(
FileSymbol::new(
target.clone().into(),
target.0.clone(),
nginx::server_config(
&resource.0,
cert,
key,
cert.0,
key.0,
nginx::static_snippet(resource.1.as_ref()),
challenges_snippet_path,
),
@ -424,8 +430,8 @@ impl<D: Clone> SymbolBuilder<PhpFpmPool<D>> for DefaultBuilder {
) -> Self::Symbol {
(
FileSymbol::new(
conf_path.clone().into(),
php_fpm_pool_config(&user_name.0, &socket_path, resource.1),
conf_path.0.clone(),
php_fpm_pool_config(&user_name.0, &socket_path.0, resource.1),
),
ReloadServiceSymbol::new(StdCommandRunner, service_name.0.clone()),
)
@ -448,7 +454,7 @@ impl<D, P: AsRef<Path>> SymbolBuilder<SystemdSocketService<D, P>> for DefaultBui
) -> Self::Symbol {
(
FileSymbol::new(
conf_path.clone().into(),
conf_path.0.clone(),
if resource.4 {
systemd_nodejs_service(&resource.2, socket_path, &resource.3)
} else {
@ -462,7 +468,7 @@ impl<D, P: AsRef<Path>> SymbolBuilder<SystemdSocketService<D, P>> for DefaultBui
),
SystemdUserSessionSymbol::new(user_name.0.clone(), &StdCommandRunner),
UserServiceSymbol::new(
socket_path.clone().into(),
socket_path.0.clone(),
user_name.0.clone(),
resource.1,
&StdCommandRunner,
@ -511,7 +517,7 @@ impl<P: Clone + AsRef<Path>> SymbolBuilder<StoredDirectory<P>> for DefaultBuilde
) -> Self::Symbol {
SavedDirectorySymbol::new(
resource.1.clone(),
SimpleStorage::new(target.clone().into()),
SimpleStorage::new(target.0.clone()),
StorageDirection::Store,
StdCommandRunner,
)
@ -530,7 +536,7 @@ impl<P: Clone + AsRef<Path>> SymbolBuilder<LoadedDirectory<P>> for DefaultBuilde
) -> Self::Symbol {
SavedDirectorySymbol::new(
resource.1.clone(),
SimpleStorage::new(target.clone().into()),
SimpleStorage::new(target.0.clone()),
StorageDirection::Load,
StdCommandRunner,
)
@ -609,8 +615,8 @@ impl SymbolBuilder<AcmeChallengesDir> for DefaultBuilder {
user_name: <Self::Prerequisites as ToArtifact>::Artifact,
) -> Self::Symbol {
(
DirSymbol::new(target.clone().into()),
OwnerSymbol::new(target.clone().into(), user_name.0, StdCommandRunner),
DirSymbol::new(target.0.clone()),
OwnerSymbol::new(target.0.clone(), user_name.0, StdCommandRunner),
)
}
}
@ -628,7 +634,7 @@ impl SymbolBuilder<AcmeChallengesNginxSnippet> for DefaultBuilder {
challenges_dir: <Self::Prerequisites as ToArtifact>::Artifact,
) -> Self::Symbol {
FileSymbol::new(
target.clone().into(),
target.0.clone(),
nginx::acme_challenges_snippet(challenges_dir),
)
}
@ -650,8 +656,8 @@ impl SymbolBuilder<AcmeAccountKey> for DefaultBuilder {
user_name: <Self::Prerequisites as ToArtifact>::Artifact,
) -> Self::Symbol {
(
KeySymbol::new(StdCommandRunner, target.clone().into()),
OwnerSymbol::new(target.clone().into(), user_name.0, StdCommandRunner),
KeySymbol::new(StdCommandRunner, target.0.clone()),
OwnerSymbol::new(target.0.clone(), user_name.0, StdCommandRunner),
)
}
}
@ -666,7 +672,7 @@ impl SymbolBuilder<AcmeRootCert> for DefaultBuilder {
target: &<AcmeRootCert as Resource>::Artifact,
(): <Self::Prerequisites as ToArtifact>::Artifact,
) -> Self::Symbol {
FileSymbol::new(target.clone().into(), LETS_ENCRYPT_X3_CROSS_SIGNED)
FileSymbol::new(target.0.clone(), LETS_ENCRYPT_X3_CROSS_SIGNED)
}
}
@ -699,7 +705,7 @@ impl<D: Clone> SymbolBuilder<MariaDbDatabase<D>> for DefaultBuilder {
(db_name, _, data_path): &<MariaDbDatabase<D> as Resource>::Artifact,
_: <Self::Prerequisites as ToArtifact>::Artifact,
) -> Self::Symbol {
let db_dump = SimpleStorage::new(data_path.clone().into());
let db_dump = SimpleStorage::new(data_path.0.clone());
(
MariaDbDatabaseSymbol::new(db_name.0.clone(), db_dump.clone(), &StdCommandRunner),
MariaDbDumpSymbol::new(db_name.0.clone(), db_dump, &StdCommandRunner),

View file

@ -54,7 +54,7 @@ impl<P, D: AsRef<str>> ResourceLocator<Key<D>> for DefaultLocator<P> {
type Prerequisites = Dir<PathBuf>;
fn locate(resource: &Key<D>) -> (<Key<D> as Resource>::Artifact, Self::Prerequisites) {
(
PathArtifact::from(format!("/etc/ssl/private/{}.key", resource.0.as_ref())),
PathArtifact(format!("/etc/ssl/private/{}.key", resource.0.as_ref()).into()),
Dir("/etc/ssl/private".into()),
)
}
@ -64,7 +64,7 @@ impl<P, D: AsRef<str>> ResourceLocator<Csr<D>> for DefaultLocator<P> {
type Prerequisites = Dir<PathBuf>;
fn locate(resource: &Csr<D>) -> (<Csr<D> as Resource>::Artifact, Self::Prerequisites) {
(
PathArtifact::from(format!("/etc/ssl/local_certs/{}.csr", resource.0.as_ref())),
PathArtifact(format!("/etc/ssl/local_certs/{}.csr", resource.0.as_ref()).into()),
Dir("/etc/ssl/local_certs".into()),
)
}
@ -74,7 +74,7 @@ impl<P, D: AsRef<str>> ResourceLocator<Cert<D>> for DefaultLocator<P> {
type Prerequisites = Dir<PathBuf>;
fn locate(resource: &Cert<D>) -> (<Cert<D> as Resource>::Artifact, Self::Prerequisites) {
(
PathArtifact::from(format!("/etc/ssl/local_certs/{}.crt", resource.0.as_ref())),
PathArtifact(format!("/etc/ssl/local_certs/{}.crt", resource.0.as_ref()).into()),
Dir("/etc/ssl/local_certs".into()),
)
}
@ -86,10 +86,7 @@ impl<P, D: AsRef<str>> ResourceLocator<CertChain<D>> for DefaultLocator<P> {
resource: &CertChain<D>,
) -> (<CertChain<D> as Resource>::Artifact, Self::Prerequisites) {
(
PathArtifact::from(format!(
"/etc/ssl/local_certs/{}.chained.crt",
resource.0.as_ref()
)),
PathArtifact(format!("/etc/ssl/local_certs/{}.chained.crt", resource.0.as_ref()).into()),
Dir("/etc/ssl/local_certs".into()),
)
}
@ -104,10 +101,7 @@ impl<P, D: AsRef<str>> ResourceLocator<KeyAndCertBundle<D>> for DefaultLocator<P
Self::Prerequisites,
) {
(
PathArtifact::from(format!(
"/etc/ssl/private/{}.with_key.crt",
resource.0.as_ref()
)),
PathArtifact(format!("/etc/ssl/private/{}.with_key.crt", resource.0.as_ref()).into()),
Dir("/etc/ssl/private".into()),
)
}
@ -158,7 +152,7 @@ impl<POLICY: Policy, P: AsRef<Path>> ResourceLocator<StoredDirectory<P>>
<StoredDirectory<P> as Resource>::Artifact,
Self::Prerequisites,
) {
(PathArtifact::from(POLICY::path_for_data(resource.0)), ())
(PathArtifact(POLICY::path_for_data(resource.0)), ())
}
}
@ -173,7 +167,7 @@ impl<POLICY: Policy, P: AsRef<Path>> ResourceLocator<LoadedDirectory<P>>
Self::Prerequisites,
) {
(
PathArtifact::from(POLICY::path_for_data(resource.0)),
PathArtifact(POLICY::path_for_data(resource.0)),
Dir(resource.1.as_ref().parent().unwrap().into()),
)
}
@ -186,7 +180,7 @@ impl<P: Policy> ResourceLocator<AcmeAccountKey> for DefaultLocator<P> {
) -> (<AcmeAccountKey as Resource>::Artifact, Self::Prerequisites) {
let acme_user = P::acme_user();
let home = P::user_home(acme_user);
(PathArtifact::from(home.join("account.key")), Dir(home))
(PathArtifact(home.join("account.key")), Dir(home))
}
}
@ -208,7 +202,7 @@ impl<P: Policy> ResourceLocator<AcmeChallengesDir> for DefaultLocator<P> {
) {
let acme_user = P::acme_user();
let home = P::user_home(acme_user);
(PathArtifact::from(home.join("challenges")), Dir(home))
(PathArtifact(home.join("challenges")), Dir(home))
}
}
@ -221,7 +215,7 @@ impl<P: Policy> ResourceLocator<AcmeChallengesNginxSnippet> for DefaultLocator<P
Self::Prerequisites,
) {
(
PathArtifact::from("/etc/nginx/snippets/acme-challenge.conf"),
PathArtifact("/etc/nginx/snippets/acme-challenge.conf".into()),
(),
)
}
@ -235,7 +229,7 @@ impl<P: Policy> ResourceLocator<AcmeRootCert> for DefaultLocator<P> {
let acme_user = P::acme_user();
let home = P::user_home(acme_user);
(
PathArtifact::from(home.join("lets_encrypt_x3_cross_signed.pem")),
PathArtifact(home.join("lets_encrypt_x3_cross_signed.pem")),
Dir(home),
)
}
@ -251,7 +245,7 @@ impl<P: Policy, D: AsRef<str>> ResourceLocator<UserForDomain<D>> for DefaultLoca
) {
let user_name = P::user_name_for_domain(resource.0.as_ref());
let home = P::user_home(&user_name);
((UserNameArtifact(user_name), PathArtifact::from(home)), ())
((UserNameArtifact(user_name), PathArtifact(home)), ())
}
}
@ -274,7 +268,7 @@ impl<P> ResourceLocator<DefaultServer> for DefaultLocator<P> {
fn locate(
_resource: &DefaultServer,
) -> (<DefaultServer as Resource>::Artifact, Self::Prerequisites) {
(PathArtifact::from("/etc/nginx/sites-enabled/default"), ())
(PathArtifact("/etc/nginx/sites-enabled/default".into()), ())
}
}
@ -284,7 +278,7 @@ impl<D: AsRef<Path>, POLICY> ResourceLocator<ServeCustom<D>> for DefaultLocator<
resource: &ServeCustom<D>,
) -> (<ServeCustom<D> as Resource>::Artifact, Self::Prerequisites) {
(
PathArtifact::from(("/etc/nginx/sites-enabled/".as_ref() as &Path).join(&resource.0)),
PathArtifact(("/etc/nginx/sites-enabled/".as_ref() as &Path).join(&resource.0)),
(),
)
}
@ -296,7 +290,7 @@ impl<D: AsRef<Path>, P, POLICY> ResourceLocator<ServePhp<D, P>> for DefaultLocat
resource: &ServePhp<D, P>,
) -> (<ServePhp<D, P> as Resource>::Artifact, Self::Prerequisites) {
(
PathArtifact::from(("/etc/nginx/sites-enabled/".as_ref() as &Path).join(&resource.0)),
PathArtifact(("/etc/nginx/sites-enabled/".as_ref() as &Path).join(&resource.0)),
(),
)
}
@ -311,7 +305,7 @@ impl<D: AsRef<Path>, P, POLICY> ResourceLocator<ServeService<D, P>> for DefaultL
Self::Prerequisites,
) {
(
PathArtifact::from(("/etc/nginx/sites-enabled/".as_ref() as &Path).join(&resource.0)),
PathArtifact(("/etc/nginx/sites-enabled/".as_ref() as &Path).join(&resource.0)),
(),
)
}
@ -323,7 +317,7 @@ impl<D: AsRef<Path>, POLICY> ResourceLocator<ServeRedir<D>> for DefaultLocator<P
resource: &ServeRedir<D>,
) -> (<ServeRedir<D> as Resource>::Artifact, Self::Prerequisites) {
(
PathArtifact::from(("/etc/nginx/sites-enabled/".as_ref() as &Path).join(&resource.0)),
PathArtifact(("/etc/nginx/sites-enabled/".as_ref() as &Path).join(&resource.0)),
(),
)
}
@ -338,7 +332,7 @@ impl<D: AsRef<Path>, P, POLICY> ResourceLocator<ServeStatic<D, P>> for DefaultLo
Self::Prerequisites,
) {
(
PathArtifact::from(("/etc/nginx/sites-enabled/".as_ref() as &Path).join(&resource.0)),
PathArtifact(("/etc/nginx/sites-enabled/".as_ref() as &Path).join(&resource.0)),
(),
)
}
@ -353,11 +347,8 @@ impl<D: Clone + AsRef<str>, P: Policy> ResourceLocator<PhpFpmPool<D>> for Defaul
let php_version = P::php_version();
(
(
PathArtifact::from(format!("/run/php/{}.sock", user.0)),
PathArtifact::from(format!(
"/etc/php/{}/fpm/pool.d/{}.conf",
php_version, user.0
)),
PathArtifact(format!("/run/php/{}.sock", user.0).into()),
PathArtifact(format!("/etc/php/{}/fpm/pool.d/{}.conf", php_version, user.0).into()),
user,
ServiceNameArtifact(format!("php{}-fpm", php_version)),
),
@ -377,12 +368,12 @@ impl<D: Clone + AsRef<str>, P, POLICY: Policy> ResourceLocator<SystemdSocketServ
Self::Prerequisites,
) {
let ((user_name, home_path), ()) = Self::locate(&UserForDomain(&resource.0));
let config = home_path.as_ref().join(".config");
let config = home_path.0.join(".config");
let service_dir_path = config.join("systemd/user");
(
(
PathArtifact::from(format!("/var/tmp/{}-{}.socket", user_name.0, resource.1)),
PathArtifact::from(service_dir_path.join(format!("{}.service", resource.1))),
PathArtifact(format!("/var/tmp/{}-{}.socket", user_name.0, resource.1).into()),
PathArtifact(service_dir_path.join(format!("{}.service", resource.1))),
user_name.clone(),
),
(Dir(service_dir_path), Owner(user_name.0, config)),
@ -403,7 +394,7 @@ impl<D: AsRef<str>, P: Policy> ResourceLocator<MariaDbDatabase<D>> for DefaultLo
(
DatabaseNameArtifact(user_name.0.clone()),
user_name.clone(),
PathArtifact::from(P::path_for_data(format!("{}.sql", user_name.0))),
PathArtifact(P::path_for_data(format!("{}.sql", user_name.0))),
),
(),
)

View file

@ -22,6 +22,12 @@ pub enum SymbolRunError {
}
impl Error for SymbolRunError {
fn description(&self) -> &str {
match self {
Self::Symbol(_) => "Symbol execution error",
Self::ExecuteDidNotReach(_) => "Target not reached after executing symbol",
}
}
fn cause(&self) -> Option<&dyn Error> {
match self {
Self::Symbol(ref e) => Some(&**e),
@ -34,7 +40,7 @@ impl fmt::Display for SymbolRunError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::Symbol(ref e) => write!(f, "{}", e),
Self::ExecuteDidNotReach(_) => write!(f, "Target not reached after executing symbol"),
Self::ExecuteDidNotReach(_) => write!(f, "{}", self.description()),
}
}
}
@ -149,6 +155,7 @@ where
}
}
/*
#[cfg(test)]
mod test {
use std::cell::RefCell;
@ -165,7 +172,11 @@ mod test {
Error(()),
}
impl Error for DummySymbolError {}
impl Error for DummySymbolError {
fn description(&self) -> &str {
return "Description";
}
}
impl fmt::Display for DummySymbolError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
@ -174,39 +185,28 @@ mod test {
}
#[derive(Debug)]
struct DummySymbol<T, E> {
_target_reached: RefCell<T>,
_execute: RefCell<E>,
struct DummySymbol<'a> {
_execute: &'a dyn Fn() -> Result<(), Box<dyn Error>>,
_target_reached: &'a dyn Fn() -> Result<bool, Box<dyn Error>>,
}
impl<
E: Iterator<Item = Result<(), Box<dyn Error>>>,
T: Iterator<Item = Result<bool, Box<dyn Error>>>,
> Symbol for DummySymbol<T, E>
{
impl<'b> Symbol for DummySymbol<'b> {
fn target_reached(&self) -> Result<bool, Box<dyn Error>> {
self._target_reached.borrow_mut().next().unwrap()
(self._target_reached)()
}
fn execute(&self) -> Result<(), Box<dyn Error>> {
self._execute.borrow_mut().next().unwrap()
(self._execute)()
}
}
impl<
E: Iterator<Item = Result<(), Box<dyn Error>>>,
T: Iterator<Item = Result<bool, Box<dyn Error>>>,
> DummySymbol<T, E>
{
fn new<
IE: IntoIterator<IntoIter = E, Item = Result<(), Box<dyn Error>>>,
IT: IntoIterator<IntoIter = T, Item = Result<bool, Box<dyn Error>>>,
>(
target_reached: IT,
execute: IE,
) -> Self {
Self {
_target_reached: RefCell::new(target_reached.into_iter()),
_execute: RefCell::new(execute.into_iter()),
impl<'a> DummySymbol<'a> {
fn new(
target_reached: &'a dyn Fn() -> Result<bool, Box<dyn Error>>,
execute: &'a dyn Fn() -> Result<(), Box<dyn Error>>,
) -> DummySymbol<'a> {
DummySymbol {
_target_reached: target_reached,
_execute: execute,
}
}
}
@ -223,37 +223,44 @@ mod test {
impl Logger for DummyLogger {
fn write(&mut self, line: &str) {
self.log.push(line.into());
self.log.push(From::from(line));
}
fn debug(&mut self, line: &str) {
self.log.push(line.into());
self.log.push(From::from(line));
}
}
#[test]
fn nothing_needed_to_be_done() {
let result = InitializingSymbolRunner::new(DummyLogger::new())
.run_symbol(&DummySymbol::new(vec![Ok(true)], vec![Ok(())]), false);
.run_symbol(&DummySymbol::new(&|| Ok(true), &|| Ok(())));
assert!(result.is_ok());
}
#[test]
fn everything_is_ok() {
let result = InitializingSymbolRunner::new(DummyLogger::new()).run_symbol(
&DummySymbol::new(vec![Ok(true), Ok(false)], vec![Ok(())]),
false,
);
let first = RefCell::new(true);
let result = InitializingSymbolRunner::new(DummyLogger::new()).run_symbol(&DummySymbol::new(
&|| {
let mut _first = first.borrow_mut();
Ok(if *_first {
*_first = false;
true
} else {
false
})
},
&|| Ok(()),
));
assert!(result.is_ok());
}
#[test]
fn executing_did_not_change_state() {
let result = InitializingSymbolRunner::new(DummyLogger::new()).run_symbol(
&DummySymbol::new(vec![Ok(false), Ok(false)], vec![Ok(())]),
false,
);
let result = InitializingSymbolRunner::new(DummyLogger::new())
.run_symbol(&DummySymbol::new(&|| Ok(false), &|| Ok(())));
assert_eq!(
result.unwrap_err().to_string(),
result.unwrap_err().description(),
"Target not reached after executing symbol"
);
}
@ -261,14 +268,11 @@ mod test {
#[test]
fn executing_did_not_work() {
let err = InitializingSymbolRunner::new(DummyLogger::new())
.run_symbol(
&DummySymbol::new(
vec![Ok(false)],
vec![Err(Box::new(DummySymbolError::Error(())) as Box<dyn Error>)],
),
false,
)
.run_symbol(&DummySymbol::new(&|| Ok(false), &|| {
Err(Box::new(DummySymbolError::Error(())))
}))
.unwrap_err();
assert_eq!(err.to_string(), "Dummy symbol error");
assert_eq!(err.description(), "Description");
}
}
*/

View file

@ -348,49 +348,24 @@ mod test {
#[test]
fn correctly_handles_symbol_tuples() {
let (count, setup) = get_setup();
setup
.run_symbol(
(TestSymbol { reached: false }, TestSymbol { reached: false }),
false,
)
.unwrap();
setup.run_symbol((TestSymbol { reached: false }, TestSymbol { reached: false }), false).unwrap();
assert_eq!(*count.borrow(), 2);
let (count, setup) = get_setup();
setup
.run_symbol(
(TestSymbol { reached: true }, TestSymbol { reached: false }),
false,
)
.unwrap();
setup.run_symbol((TestSymbol { reached: true }, TestSymbol { reached: false }), false).unwrap();
assert_eq!(*count.borrow(), 1);
// An unreached symbol forces all further symbols
let (count, setup) = get_setup();
setup
.run_symbol(
(TestSymbol { reached: false }, TestSymbol { reached: true }),
false,
)
.unwrap();
setup.run_symbol((TestSymbol { reached: false }, TestSymbol { reached: true }), false).unwrap();
assert_eq!(*count.borrow(), 2);
let (count, setup) = get_setup();
setup
.run_symbol(
(TestSymbol { reached: true }, TestSymbol { reached: true }),
false,
)
.unwrap();
setup.run_symbol((TestSymbol { reached: true }, TestSymbol { reached: true }), false).unwrap();
assert_eq!(*count.borrow(), 0);
let (count, setup) = get_setup();
setup
.run_symbol(
(TestSymbol { reached: true }, TestSymbol { reached: true }),
true,
)
.unwrap();
setup.run_symbol((TestSymbol { reached: true }, TestSymbol { reached: true }), true).unwrap();
assert_eq!(*count.borrow(), 2);
}
}

View file

@ -40,7 +40,7 @@ impl<C: CommandRunner, P: AsRef<Path>> Symbol for Key<C, P> {
],
)?;
// FIXME check bytes
Ok(stdout.ends_with(b"RSA key ok\n"))
Ok(stdout.ends_with("RSA key ok\n".as_bytes()))
}
fn execute(&self) -> Result<(), Box<dyn Error>> {

View file

@ -30,17 +30,11 @@ fn runs_only_once() {
};
let mut setup = Setup::new(runner);
assert_eq!(
(setup.add(Csr("somehost")).unwrap().0)
.as_ref()
.to_str()
.unwrap(),
(setup.add(Csr("somehost")).unwrap().0).0.to_str().unwrap(),
"/etc/ssl/local_certs/somehost.csr",
);
assert_eq!(
(setup.add(Csr("somehost")).unwrap().0)
.as_ref()
.to_str()
.unwrap(),
(setup.add(Csr("somehost")).unwrap().0).0.to_str().unwrap(),
"/etc/ssl/local_certs/somehost.csr",
);
assert_eq!(*count.borrow(), 2 + 5); // Key and CSR + 5 dirs
@ -54,10 +48,7 @@ fn can_create_an_acme_cert() {
};
let mut setup = Setup::new(runner);
assert_eq!(
(setup.add(Cert("somehost")).unwrap().0)
.as_ref()
.to_str()
.unwrap(),
(setup.add(Cert("somehost")).unwrap().0).0.to_str().unwrap(),
"/etc/ssl/local_certs/somehost.crt",
);
assert_eq!(*count.borrow(), 15);

View file

@ -103,12 +103,12 @@ fn empty_storage() {
);
assert!(storage.read_filename().is_err());
assert_eq!(
storage.read_filename().unwrap_err().to_string(),
storage.read_filename().unwrap_err().description(),
"entity not found"
);
assert!(storage.recent_date().is_err());
assert_eq!(
storage.recent_date().unwrap_err().to_string(),
storage.recent_date().unwrap_err().description(),
"entity not found"
);
}
@ -125,11 +125,14 @@ fn empty_storage_for_filename() {
);
assert!(storage.read_filename().is_err());
assert_eq!(
storage.read_filename().unwrap_err().to_string(),
storage.read_filename().unwrap_err().description(),
"Not found"
);
assert!(storage.recent_date().is_err());
assert_eq!(storage.recent_date().unwrap_err().to_string(), "Not found");
assert_eq!(
storage.recent_date().unwrap_err().description(),
"Not found"
);
}
#[test]
@ -144,9 +147,12 @@ fn bad_file() {
);
assert!(storage.read_filename().is_err());
assert_eq!(
storage.read_filename().unwrap_err().to_string(),
storage.read_filename().unwrap_err().description(),
"Not found"
);
assert!(storage.recent_date().is_err());
assert_eq!(storage.recent_date().unwrap_err().to_string(), "Not found");
assert_eq!(
storage.recent_date().unwrap_err().description(),
"Not found"
);
}