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.

100 lines
2.4 KiB

4 years ago
  1. use async_trait::async_trait;
  2. use schematics::async_utils::{run, 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!((run(setup.add(AcmeUser)).unwrap().0).0, "acme");
  38. }
  39. #[test]
  40. fn runs_only_once() {
  41. run(async {
  42. let count = Rc::new(RefCell::new(0));
  43. let runner = TestSymbolRunner {
  44. count: Rc::clone(&count),
  45. };
  46. let setup = Setup::new(runner, StoringLogger::new());
  47. assert_eq!(
  48. (setup.add(Csr("somehost")).await.unwrap().0)
  49. .as_ref()
  50. .to_str()
  51. .unwrap(),
  52. "/etc/ssl/local_certs/somehost.csr",
  53. );
  54. assert_eq!(
  55. (setup.add(Csr("somehost")).await.unwrap().0)
  56. .as_ref()
  57. .to_str()
  58. .unwrap(),
  59. "/etc/ssl/local_certs/somehost.csr",
  60. );
  61. assert_eq!(*count.borrow(), 2 + 5); // Key and CSR + 5 dirs
  62. });
  63. }
  64. #[test]
  65. fn can_create_an_acme_cert() {
  66. let count = Rc::new(RefCell::new(0));
  67. let runner = TestSymbolRunner {
  68. count: Rc::clone(&count),
  69. };
  70. let setup = Setup::new(runner, StoringLogger::new());
  71. assert_eq!(
  72. (run(setup.add(Cert("somehost"))).unwrap().0)
  73. .as_ref()
  74. .to_str()
  75. .unwrap(),
  76. "/etc/ssl/local_certs/somehost.crt",
  77. );
  78. assert_eq!(*count.borrow(), 19);
  79. }
  80. #[test]
  81. fn can_create_a_git_checkout() {
  82. let count = Rc::new(RefCell::new(0));
  83. let runner = TestSymbolRunner {
  84. count: Rc::clone(&count),
  85. };
  86. let setup = Setup::new(runner, StoringLogger::new());
  87. run(setup.add(GitCheckout(
  88. "/tmp/somepath".into(),
  89. "/tmp/some_src_repo",
  90. "master",
  91. )))
  92. .unwrap();
  93. assert_eq!(*count.borrow(), 3);
  94. }