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.

103 lines
2.5 KiB

  1. extern crate schematics;
  2. extern crate tempdir;
  3. use std::fs::File;
  4. use std::io::Write;
  5. use std::path::Path;
  6. use tempdir::TempDir;
  7. use schematics::symbols::Symbol;
  8. use schematics::symbols::file::File as FileSymbol;
  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.write_all(content.unwrap().as_bytes()).expect("write temp file");
  17. tmp_dir
  18. }
  19. fn get_symbol(path: &Path) -> FileSymbol<&str, String> {
  20. FileSymbol::new(String::from(path.join("filename").to_str().unwrap()), "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 = get_symbol(&Path::new("/etc/passwd"));
  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. }