main.rs 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. use another_ext4::{Ext4, InodeMode, EXT4_ROOT_INO};
  2. use block_file::BlockFile;
  3. use simple_logger::SimpleLogger;
  4. use std::sync::Arc;
  5. mod block_file;
  6. const ROOT_INO: u32 = EXT4_ROOT_INO;
  7. fn make_ext4() {
  8. let _ = std::process::Command::new("rm")
  9. .args(["-rf", "ext4.img"])
  10. .status();
  11. let _ = std::process::Command::new("dd")
  12. .args(["if=/dev/zero", "of=ext4.img", "bs=1M", "count=512"])
  13. .status();
  14. let _ = std::process::Command::new("mkfs.ext4")
  15. .args(["ext4.img"])
  16. .output();
  17. }
  18. fn open_ext4() -> Ext4 {
  19. let file = BlockFile::new("ext4.img");
  20. println!("creating ext4");
  21. let mut ext4 = Ext4::load(Arc::new(file)).expect("open ext4 failed");
  22. ext4.init().expect("init ext4 failed");
  23. ext4
  24. }
  25. fn mkdir_test(ext4: &mut Ext4) {
  26. let dir_mode: InodeMode = InodeMode::DIRECTORY | InodeMode::ALL_RWX;
  27. ext4.generic_create(ROOT_INO, "d1", dir_mode)
  28. .expect("mkdir failed");
  29. ext4.generic_create(ROOT_INO, "d1/d2", dir_mode)
  30. .expect("mkdir failed");
  31. ext4.generic_create(ROOT_INO, "d1/d2/d3", dir_mode)
  32. .expect("mkdir failed");
  33. ext4.generic_create(ROOT_INO, "d1/d2/d3/d4", dir_mode)
  34. .expect("mkdir failed");
  35. ext4.generic_create(ROOT_INO, "d2", dir_mode)
  36. .expect("mkdir failed");
  37. ext4.generic_create(ROOT_INO, "d2/d3", dir_mode)
  38. .expect("mkdir failed");
  39. ext4.generic_create(ROOT_INO, "d2/d3/d4", dir_mode)
  40. .expect("mkdir failed");
  41. ext4.generic_create(ROOT_INO, "d3", dir_mode)
  42. .expect("mkdir failed");
  43. }
  44. fn create_test(ext4: &mut Ext4) {
  45. let file_mode: InodeMode = InodeMode::FILE | InodeMode::ALL_RWX;
  46. ext4.generic_create(ROOT_INO, "d1/d2/d3/d4/f1", file_mode)
  47. .expect("open failed");
  48. ext4.generic_create(ROOT_INO, "d3/f0", file_mode)
  49. .expect("open failed");
  50. ext4.generic_create(ROOT_INO, "d3/f1", file_mode)
  51. .expect("open failed");
  52. ext4.generic_create(ROOT_INO, "f1", file_mode)
  53. .expect("open failed");
  54. }
  55. fn read_write_test(ext4: &mut Ext4) {
  56. let wbuffer = "hello world".as_bytes();
  57. let file = ext4.generic_lookup(ROOT_INO, "d3/f0").expect("open failed");
  58. ext4.write(file, 0, wbuffer).expect("write failed");
  59. let mut rbuffer = vec![0u8; wbuffer.len() + 100]; // Test end of file
  60. let rcount = ext4.read(file, 0, &mut rbuffer).expect("read failed");
  61. assert_eq!(wbuffer, &rbuffer[..rcount]);
  62. }
  63. fn large_read_write_test(ext4: &mut Ext4) {
  64. let wbuffer = vec![99u8; 1024 * 1024 * 16];
  65. let file = ext4.generic_lookup(ROOT_INO, "d3/f1").expect("open failed");
  66. ext4.write(file, 0, &wbuffer).expect("write failed");
  67. let mut rbuffer = vec![0u8; wbuffer.len()];
  68. let rcount = ext4.read(file, 0, &mut rbuffer).expect("read failed");
  69. assert_eq!(wbuffer, &rbuffer[..rcount]);
  70. }
  71. fn remove_file_test(ext4: &mut Ext4) {
  72. ext4.generic_remove(ROOT_INO, "d3/f0")
  73. .expect("remove file failed");
  74. ext4.generic_lookup(ROOT_INO, "d3/f0")
  75. .expect_err("file not removed");
  76. ext4.generic_remove(ROOT_INO, "d3/f1")
  77. .expect("remove file failed");
  78. ext4.generic_lookup(ROOT_INO, "d3/f1")
  79. .expect_err("file not removed");
  80. ext4.generic_remove(ROOT_INO, "f1")
  81. .expect("remove file failed");
  82. ext4.generic_lookup(ROOT_INO, "f1")
  83. .expect_err("file not removed");
  84. ext4.generic_remove(ROOT_INO, "d1/not_exist")
  85. .expect_err("remove file failed");
  86. }
  87. fn xattr_test(ext4: &mut Ext4) {
  88. let file_mode: InodeMode = InodeMode::FILE | InodeMode::ALL_RWX;
  89. let file = ext4
  90. .generic_create(ROOT_INO, "f2", file_mode)
  91. .expect("Create failed");
  92. ext4.setxattr(file, "user.testone", "hello world".as_bytes())
  93. .expect("setxattr failed");
  94. ext4.setxattr(file, "user.testtwo", "world hello".as_bytes())
  95. .expect("setxattr failed");
  96. let names = ext4.listxattr(file).expect("listxattr failed");
  97. assert_eq!(names, vec!["user.testone", "user.testtwo"]);
  98. let value = ext4
  99. .getxattr(file, "user.testone")
  100. .expect("getxattr failed");
  101. assert_eq!(value, "hello world".as_bytes());
  102. let value = ext4
  103. .getxattr(file, "user.testtwo")
  104. .expect("getxattr failed");
  105. assert_eq!(value, "world hello".as_bytes());
  106. let names = ext4.listxattr(file).expect("listxattr failed");
  107. assert_eq!(names, vec!["user.testone", "user.testtwo"]);
  108. ext4.removexattr(file, "user.testone")
  109. .expect("removexattr failed");
  110. ext4.getxattr(file, "user.testone")
  111. .expect_err("getxattr failed");
  112. let names = ext4.listxattr(file).expect("listxattr failed");
  113. assert_eq!(names, vec!["user.testtwo"]);
  114. }
  115. fn main() {
  116. SimpleLogger::new().init().unwrap();
  117. log::set_max_level(log::LevelFilter::Off);
  118. make_ext4();
  119. println!("ext4.img created");
  120. let mut ext4 = open_ext4();
  121. println!("ext4 opened");
  122. mkdir_test(&mut ext4);
  123. println!("mkdir test done");
  124. create_test(&mut ext4);
  125. println!("create test done");
  126. read_write_test(&mut ext4);
  127. println!("read write test done");
  128. large_read_write_test(&mut ext4);
  129. println!("large read write test done");
  130. remove_file_test(&mut ext4);
  131. println!("remove file test done");
  132. xattr_test(&mut ext4);
  133. println!("xattr test done");
  134. }