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.

108 lines
2.5 KiB

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