A library for writing host-specific, single-binary configuration management and deployment tools
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

99 lines
2.3 KiB

4 years ago
  1. use async_trait::async_trait;
  2. use schematics::async_utils::sleep;
  3. use schematics::loggers::{Logger, StoringLogger};
  4. use schematics::resources::{AcmeUser, Cert, Csr, GitCheckout};
  5. use schematics::symbols::Symbol;
  6. use schematics::Setup;
  7. use schematics::SymbolRunner;
  8. use std::cell::RefCell;
  9. use std::error::Error;
  10. use std::fmt::Debug;
  11. use std::rc::Rc;
  12. use std::time::Duration;
  13. #[derive(Clone, Debug)]
  14. struct TestSymbolRunner {
  15. count: Rc<RefCell<usize>>,
  16. }
  17. #[async_trait(?Send)]
  18. impl SymbolRunner for TestSymbolRunner {
  19. async fn run_symbol<S: Symbol + Debug, L: Logger>(
  20. &self,
  21. _symbol: &S,
  22. _logger: &L,
  23. _force: bool,
  24. ) -> Result<bool, Box<dyn Error>> {
  25. *self.count.borrow_mut() += 1;
  26. sleep(Duration::from_millis(0)).await;
  27. Ok(false)
  28. }
  29. }
  30. #[test]
  31. fn can_create_an_acme_user() {
  32. let count = Rc::new(RefCell::new(0));
  33. let runner = TestSymbolRunner {
  34. count: Rc::clone(&count),
  35. };
  36. let setup = Setup::new(runner, StoringLogger::new());
  37. assert_eq!((setup.add(AcmeUser).unwrap().0).0, "acme");
  38. }
  39. #[test]
  40. fn runs_only_once() {
  41. let count = Rc::new(RefCell::new(0));
  42. let runner = TestSymbolRunner {
  43. count: Rc::clone(&count),
  44. };
  45. let setup = Setup::new(runner, StoringLogger::new());
  46. assert_eq!(
  47. (setup.add(Csr("somehost")).unwrap().0)
  48. .as_ref()
  49. .to_str()
  50. .unwrap(),
  51. "/etc/ssl/local_certs/somehost.csr",
  52. );
  53. assert_eq!(
  54. (setup.add(Csr("somehost")).unwrap().0)
  55. .as_ref()
  56. .to_str()
  57. .unwrap(),
  58. "/etc/ssl/local_certs/somehost.csr",
  59. );
  60. assert_eq!(*count.borrow(), 2 + 5); // Key and CSR + 5 dirs
  61. }
  62. #[test]
  63. fn can_create_an_acme_cert() {
  64. let count = Rc::new(RefCell::new(0));
  65. let runner = TestSymbolRunner {
  66. count: Rc::clone(&count),
  67. };
  68. let setup = Setup::new(runner, StoringLogger::new());
  69. assert_eq!(
  70. (setup.add(Cert("somehost")).unwrap().0)
  71. .as_ref()
  72. .to_str()
  73. .unwrap(),
  74. "/etc/ssl/local_certs/somehost.crt",
  75. );
  76. assert_eq!(*count.borrow(), 19);
  77. }
  78. #[test]
  79. fn can_create_a_git_checkout() {
  80. let count = Rc::new(RefCell::new(0));
  81. let runner = TestSymbolRunner {
  82. count: Rc::clone(&count),
  83. };
  84. let setup = Setup::new(runner, StoringLogger::new());
  85. setup
  86. .add(GitCheckout(
  87. "/tmp/somepath".into(),
  88. "/tmp/some_src_repo",
  89. "master",
  90. ))
  91. .unwrap();
  92. assert_eq!(*count.borrow(), 3);
  93. }