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.

102 lines
2.4 KiB

5 years ago
5 years ago
4 years ago
  1. use schematics::symbols::file::File as FileSymbol;
  2. use schematics::symbols::Symbol;
  3. use std::fs::File;
  4. use std::io::Write;
  5. use std::path::{Path, PathBuf};
  6. use tempdir::TempDir;
  7. fn get_dir(content: Option<&str>) -> TempDir {
  8. let tmp_dir = TempDir::new("unittest").expect("create temp dir");
  9. if content.is_none() {
  10. return tmp_dir;
  11. }
  12. let file_path = tmp_dir.path().join("filename");
  13. let mut tmp_file = File::create(file_path).expect("create temp file");
  14. tmp_file
  15. .write_all(content.unwrap().as_bytes())
  16. .expect("write temp file");
  17. tmp_dir
  18. }
  19. fn get_symbol(path: &Path) -> FileSymbol<PathBuf, &str> {
  20. FileSymbol::new(path.join("filename"), "target content")
  21. }
  22. // Normal cases
  23. // Good
  24. #[test]
  25. fn already_reached() {
  26. let dir = get_dir(Some("target content"));
  27. let symbol = get_symbol(dir.path());
  28. assert_eq!(symbol.target_reached().unwrap(), true);
  29. }
  30. // Bad
  31. #[test]
  32. fn wrong_prefix() {
  33. let dir = get_dir(Some("not target content"));
  34. let symbol = get_symbol(dir.path());
  35. assert_eq!(symbol.target_reached().unwrap(), false);
  36. symbol.execute().unwrap();
  37. assert_eq!(symbol.target_reached().unwrap(), true);
  38. }
  39. #[test]
  40. fn wrong_postfix() {
  41. let dir = get_dir(Some("target content not"));
  42. let symbol = get_symbol(dir.path());
  43. assert_eq!(symbol.target_reached().unwrap(), false);
  44. symbol.execute().unwrap();
  45. assert_eq!(symbol.target_reached().unwrap(), true);
  46. }
  47. #[test]
  48. fn empty_file() {
  49. let dir = get_dir(Some(""));
  50. let symbol = get_symbol(dir.path());
  51. assert_eq!(symbol.target_reached().unwrap(), false);
  52. symbol.execute().unwrap();
  53. assert_eq!(symbol.target_reached().unwrap(), true);
  54. }
  55. #[test]
  56. fn no_file() {
  57. let dir = get_dir(None);
  58. let symbol = get_symbol(dir.path());
  59. assert_eq!(symbol.target_reached().unwrap(), false);
  60. symbol.execute().unwrap();
  61. assert_eq!(symbol.target_reached().unwrap(), true);
  62. }
  63. // Exceptional cases
  64. #[test]
  65. fn may_not_read_file() {
  66. let symbol = FileSymbol::new(Path::new("/etc/shadow"), "");
  67. assert_eq!(symbol.target_reached().is_err(), true);
  68. }
  69. #[test]
  70. fn may_not_create_file() {
  71. let symbol = get_symbol(&Path::new("/proc/somefile"));
  72. // Could also return an error
  73. assert_eq!(symbol.target_reached().unwrap(), false);
  74. assert!(symbol.execute().is_err());
  75. }
  76. #[test]
  77. fn directory_missing() {
  78. let symbol = get_symbol(&Path::new("/nonexisting"));
  79. // Could also return an error
  80. assert_eq!(symbol.target_reached().unwrap(), false);
  81. assert!(symbol.execute().is_err());
  82. }