test_attrs.sh 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  1. #!/bin/bash
  2. set -eu
  3. echo "=== Attr tests ==="
  4. rm -rf blocks
  5. tests/test.py << TEST
  6. lfs_format(&lfs, &cfg) => 0;
  7. lfs_mount(&lfs, &cfg) => 0;
  8. lfs_mkdir(&lfs, "hello") => 0;
  9. lfs_file_open(&lfs, &file[0], "hello/hello",
  10. LFS_O_WRONLY | LFS_O_CREAT) => 0;
  11. lfs_file_write(&lfs, &file[0], "hello", strlen("hello"))
  12. => strlen("hello");
  13. lfs_file_close(&lfs, &file[0]);
  14. lfs_unmount(&lfs) => 0;
  15. TEST
  16. echo "--- Set/get attribute ---"
  17. tests/test.py << TEST
  18. lfs_mount(&lfs, &cfg) => 0;
  19. lfs_setattrs(&lfs, "hello", (struct lfs_attr[]){
  20. {'A', "aaaa", 4},
  21. {'B', "bbbbbb", 6},
  22. {'C', "ccccc", 5}}, 3) => 0;
  23. lfs_getattrs(&lfs, "hello", (struct lfs_attr[]){
  24. {'A', buffer, 4},
  25. {'B', buffer+4, 6},
  26. {'C', buffer+10, 5}}, 3) => 0;
  27. memcmp(buffer, "aaaa", 4) => 0;
  28. memcmp(buffer+4, "bbbbbb", 6) => 0;
  29. memcmp(buffer+10, "ccccc", 5) => 0;
  30. lfs_setattrs(&lfs, "hello", (struct lfs_attr[]){
  31. {'B', "", 0}}, 1) => 0;
  32. lfs_getattrs(&lfs, "hello", (struct lfs_attr[]){
  33. {'A', buffer, 4},
  34. {'B', buffer+4, 6},
  35. {'C', buffer+10, 5}}, 3) => 0;
  36. memcmp(buffer, "aaaa", 4) => 0;
  37. memcmp(buffer+4, "\0\0\0\0\0\0", 6) => 0;
  38. memcmp(buffer+10, "ccccc", 5) => 0;
  39. lfs_setattrs(&lfs, "hello", (struct lfs_attr[]){
  40. {'B', "dddddd", 6}}, 1) => 0;
  41. lfs_getattrs(&lfs, "hello", (struct lfs_attr[]){
  42. {'A', buffer, 4},
  43. {'B', buffer+4, 6},
  44. {'C', buffer+10, 5}}, 3) => 0;
  45. memcmp(buffer, "aaaa", 4) => 0;
  46. memcmp(buffer+4, "dddddd", 6) => 0;
  47. memcmp(buffer+10, "ccccc", 5) => 0;
  48. lfs_setattrs(&lfs, "hello", (struct lfs_attr[]){
  49. {'B', "eee", 3}}, 1) => 0;
  50. lfs_getattrs(&lfs, "hello", (struct lfs_attr[]){
  51. {'A', buffer, 4},
  52. {'B', buffer+4, 6},
  53. {'C', buffer+10, 5}}, 3) => 0;
  54. memcmp(buffer, "aaaa", 4) => 0;
  55. memcmp(buffer+4, "eee\0\0\0", 6) => 0;
  56. memcmp(buffer+10, "ccccc", 5) => 0;
  57. lfs_setattrs(&lfs, "hello", (struct lfs_attr[]){
  58. {'A', buffer, LFS_ATTRS_MAX+1}}, 1) => LFS_ERR_NOSPC;
  59. lfs_setattrs(&lfs, "hello", (struct lfs_attr[]){
  60. {'B', "fffffffff", 9}}, 1) => 0;
  61. lfs_getattrs(&lfs, "hello", (struct lfs_attr[]){
  62. {'A', buffer, 4},
  63. {'B', buffer+4, 6},
  64. {'C', buffer+10, 5}}, 3) => LFS_ERR_RANGE;
  65. lfs_unmount(&lfs) => 0;
  66. TEST
  67. tests/test.py << TEST
  68. lfs_mount(&lfs, &cfg) => 0;
  69. lfs_getattrs(&lfs, "hello", (struct lfs_attr[]){
  70. {'A', buffer, 4},
  71. {'B', buffer+4, 9},
  72. {'C', buffer+13, 5}}, 3) => 0;
  73. memcmp(buffer, "aaaa", 4) => 0;
  74. memcmp(buffer+4, "fffffffff", 9) => 0;
  75. memcmp(buffer+13, "ccccc", 5) => 0;
  76. lfs_file_open(&lfs, &file[0], "hello/hello", LFS_O_RDONLY) => 0;
  77. lfs_file_read(&lfs, &file[0], buffer, sizeof(buffer)) => strlen("hello");
  78. memcmp(buffer, "hello", strlen("hello")) => 0;
  79. lfs_file_close(&lfs, &file[0]);
  80. lfs_unmount(&lfs) => 0;
  81. TEST
  82. echo "--- Set/get fs attribute ---"
  83. tests/test.py << TEST
  84. lfs_mount(&lfs, &cfg) => 0;
  85. lfs_fs_setattrs(&lfs, (struct lfs_attr[]){
  86. {'A', "aaaa", 4},
  87. {'B', "bbbbbb", 6},
  88. {'C', "ccccc", 5}}, 3) => 0;
  89. lfs_fs_getattrs(&lfs, (struct lfs_attr[]){
  90. {'A', buffer, 4},
  91. {'B', buffer+4, 6},
  92. {'C', buffer+10, 5}}, 3) => 0;
  93. memcmp(buffer, "aaaa", 4) => 0;
  94. memcmp(buffer+4, "bbbbbb", 6) => 0;
  95. memcmp(buffer+10, "ccccc", 5) => 0;
  96. lfs_fs_setattrs(&lfs, (struct lfs_attr[]){
  97. {'B', "", 0}}, 1) => 0;
  98. lfs_fs_getattrs(&lfs, (struct lfs_attr[]){
  99. {'A', buffer, 4},
  100. {'B', buffer+4, 6},
  101. {'C', buffer+10, 5}}, 3) => 0;
  102. memcmp(buffer, "aaaa", 4) => 0;
  103. memcmp(buffer+4, "\0\0\0\0\0\0", 6) => 0;
  104. memcmp(buffer+10, "ccccc", 5) => 0;
  105. lfs_fs_setattrs(&lfs, (struct lfs_attr[]){
  106. {'B', "dddddd", 6}}, 1) => 0;
  107. lfs_fs_getattrs(&lfs, (struct lfs_attr[]){
  108. {'A', buffer, 4},
  109. {'B', buffer+4, 6},
  110. {'C', buffer+10, 5}}, 3) => 0;
  111. memcmp(buffer, "aaaa", 4) => 0;
  112. memcmp(buffer+4, "dddddd", 6) => 0;
  113. memcmp(buffer+10, "ccccc", 5) => 0;
  114. lfs_fs_setattrs(&lfs, (struct lfs_attr[]){
  115. {'B', "eee", 3}}, 1) => 0;
  116. lfs_fs_getattrs(&lfs, (struct lfs_attr[]){
  117. {'A', buffer, 4},
  118. {'B', buffer+4, 6},
  119. {'C', buffer+10, 5}}, 3) => 0;
  120. memcmp(buffer, "aaaa", 4) => 0;
  121. memcmp(buffer+4, "eee\0\0\0", 6) => 0;
  122. memcmp(buffer+10, "ccccc", 5) => 0;
  123. lfs_fs_setattrs(&lfs, (struct lfs_attr[]){
  124. {'A', buffer, LFS_ATTRS_MAX+1}}, 1) => LFS_ERR_NOSPC;
  125. lfs_fs_setattrs(&lfs, (struct lfs_attr[]){
  126. {'B', "fffffffff", 9}}, 1) => 0;
  127. lfs_fs_getattrs(&lfs, (struct lfs_attr[]){
  128. {'A', buffer, 4},
  129. {'B', buffer+4, 6},
  130. {'C', buffer+10, 5}}, 3) => LFS_ERR_RANGE;
  131. lfs_unmount(&lfs) => 0;
  132. TEST
  133. tests/test.py << TEST
  134. lfs_mount(&lfs, &cfg) => 0;
  135. lfs_fs_getattrs(&lfs, (struct lfs_attr[]){
  136. {'A', buffer, 4},
  137. {'B', buffer+4, 9},
  138. {'C', buffer+13, 5}}, 3) => 0;
  139. memcmp(buffer, "aaaa", 4) => 0;
  140. memcmp(buffer+4, "fffffffff", 9) => 0;
  141. memcmp(buffer+13, "ccccc", 5) => 0;
  142. lfs_file_open(&lfs, &file[0], "hello/hello", LFS_O_RDONLY) => 0;
  143. lfs_file_read(&lfs, &file[0], buffer, sizeof(buffer)) => strlen("hello");
  144. memcmp(buffer, "hello", strlen("hello")) => 0;
  145. lfs_file_close(&lfs, &file[0]);
  146. lfs_unmount(&lfs) => 0;
  147. TEST
  148. echo "--- Set/get file attribute ---"
  149. tests/test.py << TEST
  150. lfs_mount(&lfs, &cfg) => 0;
  151. lfs_file_open(&lfs, &file[0], "hello/hello", LFS_O_WRONLY) => 0;
  152. struct lfs_attr attr[3];
  153. attr[0] = (struct lfs_attr){'A', "aaaa", 4};
  154. attr[1] = (struct lfs_attr){'B', "bbbbbb", 6};
  155. attr[2] = (struct lfs_attr){'C', "ccccc", 5};
  156. lfs_file_setattrs(&lfs, &file[0], attr, 3) => 0;
  157. lfs_file_getattrs(&lfs, &file[0], (struct lfs_attr[]){
  158. {'A', buffer, 4},
  159. {'B', buffer+4, 6},
  160. {'C', buffer+10, 5}}, 3) => 0;
  161. memcmp(buffer, "aaaa", 4) => 0;
  162. memcmp(buffer+4, "bbbbbb", 6) => 0;
  163. memcmp(buffer+10, "ccccc", 5) => 0;
  164. lfs_file_sync(&lfs, &file[0]) => 0;
  165. attr[0] = (struct lfs_attr){'B', "", 0};
  166. lfs_file_setattrs(&lfs, &file[0], attr, 1) => 0;
  167. lfs_file_getattrs(&lfs, &file[0], (struct lfs_attr[]){
  168. {'A', buffer, 4},
  169. {'B', buffer+4, 6},
  170. {'C', buffer+10, 5}}, 3) => 0;
  171. memcmp(buffer, "aaaa", 4) => 0;
  172. memcmp(buffer+4, "\0\0\0\0\0\0", 6) => 0;
  173. memcmp(buffer+10, "ccccc", 5) => 0;
  174. lfs_file_sync(&lfs, &file[0]) => 0;
  175. attr[0] = (struct lfs_attr){'B', "dddddd", 6};
  176. lfs_file_setattrs(&lfs, &file[0], attr, 1) => 0;
  177. lfs_file_getattrs(&lfs, &file[0], (struct lfs_attr[]){
  178. {'A', buffer, 4},
  179. {'B', buffer+4, 6},
  180. {'C', buffer+10, 5}}, 3) => 0;
  181. memcmp(buffer, "aaaa", 4) => 0;
  182. memcmp(buffer+4, "dddddd", 6) => 0;
  183. memcmp(buffer+10, "ccccc", 5) => 0;
  184. lfs_file_sync(&lfs, &file[0]) => 0;
  185. attr[0] = (struct lfs_attr){'B', "eee", 3};
  186. lfs_file_setattrs(&lfs, &file[0], attr, 1);
  187. lfs_file_getattrs(&lfs, &file[0], (struct lfs_attr[]){
  188. {'A', buffer, 4},
  189. {'B', buffer+4, 6},
  190. {'C', buffer+10, 5}}, 3) => 0;
  191. memcmp(buffer, "aaaa", 4) => 0;
  192. memcmp(buffer+4, "eee\0\0\0", 6) => 0;
  193. memcmp(buffer+10, "ccccc", 5) => 0;
  194. lfs_file_sync(&lfs, &file[0]) => 0;
  195. attr[0] = (struct lfs_attr){'A', buffer, LFS_ATTRS_MAX+1};
  196. lfs_file_setattrs(&lfs, &file[0], attr, 1) => LFS_ERR_NOSPC;
  197. attr[0] = (struct lfs_attr){'B', "fffffffff", 9};
  198. lfs_file_open(&lfs, &file[1], "hello/hello", LFS_O_RDONLY) => 0;
  199. lfs_file_setattrs(&lfs, &file[1], attr, 1) => LFS_ERR_BADF;
  200. lfs_file_close(&lfs, &file[1]) => 0;
  201. lfs_file_setattrs(&lfs, &file[0], attr, 1) => 0;
  202. lfs_file_getattrs(&lfs, &file[0], (struct lfs_attr[]){
  203. {'A', buffer, 4},
  204. {'B', buffer+4, 6},
  205. {'C', buffer+10, 5}}, 3) => LFS_ERR_RANGE;
  206. lfs_file_close(&lfs, &file[0]) => 0;
  207. lfs_unmount(&lfs) => 0;
  208. TEST
  209. tests/test.py << TEST
  210. lfs_mount(&lfs, &cfg) => 0;
  211. lfs_file_open(&lfs, &file[0], "hello/hello", LFS_O_RDONLY) => 0;
  212. lfs_file_getattrs(&lfs, &file[0], (struct lfs_attr[]){
  213. {'A', buffer, 4},
  214. {'B', buffer+4, 9},
  215. {'C', buffer+13, 5}}, 3) => 0;
  216. memcmp(buffer, "aaaa", 4) => 0;
  217. memcmp(buffer+4, "fffffffff", 9) => 0;
  218. memcmp(buffer+13, "ccccc", 5) => 0;
  219. lfs_file_open(&lfs, &file[0], "hello/hello", LFS_O_RDONLY) => 0;
  220. lfs_file_read(&lfs, &file[0], buffer, sizeof(buffer)) => strlen("hello");
  221. memcmp(buffer, "hello", strlen("hello")) => 0;
  222. lfs_file_close(&lfs, &file[0]);
  223. lfs_unmount(&lfs) => 0;
  224. TEST
  225. echo "--- Deferred file attributes ---"
  226. tests/test.py << TEST
  227. lfs_mount(&lfs, &cfg) => 0;
  228. lfs_file_open(&lfs, &file[0], "hello/hello", LFS_O_RDWR) => 0;
  229. struct lfs_attr attr[] = {
  230. {'B', "gggg", 4},
  231. {'C', "", 0},
  232. {'D', "hhhh", 4},
  233. };
  234. lfs_file_setattrs(&lfs, &file[0], attr, 3) => 0;
  235. lfs_file_getattrs(&lfs, &file[0], (struct lfs_attr[]){
  236. {'B', buffer, 9},
  237. {'C', buffer+9, 9},
  238. {'D', buffer+18, 9}}, 3) => 0;
  239. memcmp(buffer, "gggg\0\0\0\0\0", 9) => 0;
  240. memcmp(buffer+9, "\0\0\0\0\0\0\0\0\0", 9) => 0;
  241. memcmp(buffer+18, "hhhh\0\0\0\0\0", 9) => 0;
  242. lfs_getattrs(&lfs, "hello/hello", (struct lfs_attr[]){
  243. {'B', buffer, 9},
  244. {'C', buffer+9, 9},
  245. {'D', buffer+18, 9}}, 3) => 0;
  246. memcmp(buffer, "fffffffff", 9) => 0;
  247. memcmp(buffer+9, "ccccc\0\0\0\0", 9) => 0;
  248. memcmp(buffer+18, "\0\0\0\0\0\0\0\0\0", 9) => 0;
  249. lfs_file_sync(&lfs, &file[0]) => 0;
  250. lfs_getattrs(&lfs, "hello/hello", (struct lfs_attr[]){
  251. {'B', buffer, 9},
  252. {'C', buffer+9, 9},
  253. {'D', buffer+18, 9}}, 3) => 0;
  254. memcmp(buffer, "gggg\0\0\0\0\0", 9) => 0;
  255. memcmp(buffer+9, "\0\0\0\0\0\0\0\0\0", 9) => 0;
  256. memcmp(buffer+18, "hhhh\0\0\0\0\0", 9) => 0;
  257. lfs_file_close(&lfs, &file[0]) => 0;
  258. lfs_unmount(&lfs) => 0;
  259. TEST
  260. echo "--- Results ---"
  261. tests/stats.py