aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xtests/chattr.test155
-rw-r--r--toys/other/lsattr.c1
2 files changed, 40 insertions, 116 deletions
diff --git a/tests/chattr.test b/tests/chattr.test
index d7dec0bc..cefc84b9 100755
--- a/tests/chattr.test
+++ b/tests/chattr.test
@@ -28,131 +28,56 @@ _t="abcdefghijklmnopqrstuvwxyz"
_empty="--------------------"
-# 'i' -- immutable
+# Check +i (immutable) works by trying to write to and remove the file.
_i="----i---------------"
-testing "[-/+]i FILE[write]" "$IN && touch testFile &&
+testing "immutable" "$IN && echo "$_t" > testFile &&
chattr +i testFile && lsattr testFile | clean &&
- date > testFile 2>/dev/null; chattr -i testFile;
- rm -rf testFile; $OUT " "$_i testFile\n" "" ""
-testing "[-/+]i FILE[re-write]" "$IN && touch testFile &&
- chattr +i testFile && date > testFile 2>/dev/null ||
- chattr -i testFile && date > testFile 2>/dev/null &&
- lsattr testFile | clean; rm -rf testFile 2>/dev/null; $OUT" \
- "$_empty testFile\n" "" ""
-testing "[-/+]i FILE[append]" "$IN && date > testFile &&
- chattr +i testFile && date >> testFile 2>/dev/null ||
- lsattr testFile | clean && chattr -i testFile; rm -rf testFile; $OUT" \
- "$_i testFile\n" "" ""
-testing "[-/+]i FILE[move]" "$IN && date > testFile &&
- chattr +i testFile && mv testFile testFile1 2>/dev/null ||
- lsattr testFile | clean && chattr -i testFile; rm -rf testFile; $OUT" \
- "$_i testFile\n" "" ""
-testing "[-/+]i FILE[delete]" "$IN && touch testFile && chattr +i testFile &&
- rm -f testFile 2>/dev/null || lsattr testFile | clean &&
- chattr -i testFile; rm -rf testFile; $OUT" "$_i testFile\n" "" ""
-testing "[-/+]i FILE[read]" "$IN && echo "$_t" > testFile &&
- chattr +i testFile && cat testFile && lsattr testFile | clean &&
- chattr -i testFile; rm -rf testFile; $OUT" "$_t\n$_i testFile\n" "" ""
+ date > testFile 2>/dev/null; rm testFile; chattr -i testFile;
+ cat testFile; rm -rf testFile; $OUT " "$_i testFile\n$_t\n" "" ""
-# 'a' --- append-only
+# Check +a (append-only) works by failing to write and succeeding in appending.
_a="-----a--------------"
-testing "[-/+]a FILE[write]" "$IN && echo "$_t" > testFile &&
- chattr +a testFile && echo $_t > testFile || lsattr testFile | clean &&
- chattr -a testFile; rm -rf testFile; $OUT" "$_a testFile\n" "" ""
-testing "[-/+]a FILE[re-write]" "$IN && echo "$_t" > testFile &&
- chattr +a testFile && echo $_t > testFile || lsattr testFile | clean &&
- chattr -a testFile && echo $_t > testFile && cat testFile &&
- lsattr testFile | clean; rm -rf testFile;
- $OUT" "$_a testFile\n$_t\n$_empty testFile\n" "" ""
-testing "[-/+]a FILE[append]" "$IN && echo "$_t" > testFile &&
- chattr +a testFile && echo $_t >> testFile && cat testFile &&
- lsattr testFile | clean && chattr -a testFile; rm -rf testFile; $OUT" \
- "$_t\n$_t\n$_a testFile\n" "" ""
-testing "[-/+]a FILE[move]" "$IN && echo "$_t" > testFile &&
- chattr +a testFile && mv testFile testFile1 ||
- lsattr testFile | clean && chattr -a testFile; rm -rf testFile; $OUT" \
- "$_a testFile\n" "" ""
-testing "[-/+]a FILE[delete]" "$IN && echo "$_t" > testFile &&
- chattr +a testFile && rm -f testFile || lsattr testFile | clean &&
- chattr -a testFile; rm -rf testFile; $OUT" "$_a testFile\n" "" ""
-testing "[-/+]a FILE[read]" "$IN && echo "$_t" > testFile &&
- chattr +a testFile && cat testFile && lsattr testFile | clean &&
- chattr -a testFile; rm -rf testFile; $OUT" "$_t\n$_a testFile\n" "" ""
+testing "append-only" "$IN && echo "$_t" > testFile &&
+ chattr +a testFile &&
+ echo $_t >> testFile &&
+ date > testFile || lsattr testFile | clean &&
+ chattr -a testFile; cat testFile; rm -rf testFile; $OUT" \
+ "$_a testFile\n$_t\n$_t\n" "" ""
-for attr in "A" "a" "c" "D" "d" "i" "j" "s" "S" "t" "T" "u"
-do
- testing "[-/+]$attr FILE" "$IN && echo "$_t" > testFile &&
- chattr +$attr testFile && cat testFile && chattr -$attr testFile &&
- lsattr testFile | clean; rm -rf testFile; $OUT" "$_t\n$_empty testFile\n" "" ""
+# For the rest, just toggle the bits back and forth (where supported).
+# Note that some file system/kernel combinations do return success but
+# silently ignore your request: +T on 4.19 f2fs, or +F on 5.2i ext4,
+# for example, so we're deliberately a bit selective here.
+for attr in "A" "c" "d" "e" "j" "P" "S" "s" "t" "u"; do
+ echo "$_t" > testFile && chattr +$attr testFile 2>/dev/null || SKIPNEXT=1
+ # Check that $attr is in the lsattr output, then that - turns it back off.
+ testing "toggle $attr" "lsattr testFile | awk '{print \$1}' > attrs;
+ grep -q $attr attrs || cat attrs; cat testFile && chattr -$attr testFile &&
+ lsattr testFile | clean; rm -rf testFile" "$_t\n$_empty testFile\n" "" ""
done
-for attr in "A" "a" "c" "D" "d" "i" "j" "s" "S" "t" "T" "u"
-do
- testing "-$attr FILE" "$IN && echo "$_t" > testFile && chattr -$attr testFile &&
- cat testFile && lsattr testFile | clean; rm -rf testFile; $OUT" "$_t\n$_empty testFile\n" "" ""
-done
+_aA="-----a-A------------"
+testing "multiple bits" "$IN && touch testFile &&
+ chattr +Aa testFile && lsattr testFile | clean &&
+ chattr -Aa testFile && lsattr testFile | clean;
+ rm -rf testFile; $OUT" "$_aA testFile\n$_empty testFile\n" "" ""
-testing "[-/+]AacDdijsStTu FILE" "$IN && echo "$_t" > testFile &&
- chattr +AacDdijsStTu testFile && cat testFile && chattr -AacDdijsStTu testFile &&
- lsattr testFile | clean; rm -rf testFile; $OUT" "$_t\n$_empty testFile\n" "" ""
-testing "[-/+]AacDdijsStTu(random) FILE" \
- "$IN && echo "$_t" > testFile &&
- chattr +AacDdijsStTu testFile && cat testFile && chattr -A testFile &&
- chattr -a testFile && chattr -c testFile && chattr -D testFile &&
- chattr -d testFile && chattr -i testFile && chattr -j testFile &&
- chattr -s testFile && chattr -S testFile && chattr -t testFile &&
- chattr -T testFile && chattr -u testFile && lsattr testFile | clean &&
- chattr -AacDdijsStTu testFile; rm -rf testFile; $OUT" \
- "$_t\n$_empty testFile\n" "" ""
-testing "[-/+]AacDdijsStTu FILE*" "$IN &&
- echo "$_t" > testFile && echo "$_t" > testFile1 &&
- echo "$_t" > testFile2 && echo "$_t" > testFile3 &&
- echo "$_t" > testFile4 && echo "$_t" > testFile5 &&
- echo "$_t" > testFile6 && echo "$_t" > testFile7 &&
- echo "$_t" > testFile8 && echo "$_t" > testFile9 &&
- echo "$_t" > testFile10 && echo "$_t" > testFile11 &&
- chattr +AacDdijsStTu testFile* &&
- cat testFile9 && chattr -AacDdijsStTu testFile* &&
- lsattr testFile* | clean; rm -rf testFile*; $OUT" \
- "$_t\n$_empty testFile\n$_empty testFile_\n$_empty testFile_\n$_empty testFile_\n$_empty testFile_\n$_empty testFile_\n$_empty testFile_\n$_empty testFile_\n$_empty testFile_\n$_empty testFile_\n$_empty testFile_\n$_empty testFile_\n" "" ""
+testing "multiple files" "$IN && touch fileA && touch fileB &&
+ chattr +Aa fileA fileB && lsattr fileA fileB | clean &&
+ chattr -Aa fileA fileB && lsattr fileA fileB | clean;
+ rm -rf testFile*; $OUT" \
+ "$_aA fileA\n$_aA fileB\n$_empty fileA\n$_empty fileB\n" "" ""
-# 'A' --- no-atime
-_A="-------A------------"
-# 's' --- secure erase
-_s="s-------------------"
-testing "[-/+]AacDdijsStTu(random) FILE*" \
- "$IN && echo "$_t" > testFile &&
- chattr +AacDdijsStTu testFile* && cat testFile && chattr -A testFile* &&
- chattr -a testFile* && chattr -c testFile* && chattr -D testFile* &&
- chattr -d testFile* && chattr -i testFile* && chattr -j testFile* &&
- chattr -s testFile* && chattr -S testFile* && chattr -t testFile* &&
- chattr -T testFile* && chattr -u testFile* && lsattr testFile | clean;
- rm -rf testFile; $OUT" \
- "$_t\n$_empty testFile\n" "" ""
-testing "[-/+]i FILE[write]" \
- "$IN && echo "$_t" > testFile &&
- chattr +i testFile &&
- echo \"$_t\" > testFile || lsattr testFile | clean && chattr -i testFile;
- rm -rf testFile; $OUT" "$_i testFile\n" "" ""
-testing "[-/+]A FILE[write]" \
- "$IN && echo "$_t" > testFile && chattr +A testFile &&
- echo \"$_t\" > testFile && lsattr testFile | clean && chattr -A testFile;
- rm -rf testFile; $OUT" "$_A testFile\n" "" ""
-testing "[-/+]s FILE[write]" \
- "$IN && echo "$_t" > testFile && chattr +s testFile &&
- echo \"$_t\" > testFile && lsattr testFile | clean && chattr -s testFile
- rm -rf testFile; $OUT" "$_s testFile\n" "" ""
-NOSPACE=1 testing "-v version FILE[write]" \
- "$IN && echo "$_t" > testFile &&
- chattr -v 1234 testFile && echo \"$_t\" > testFile &&
- lsattr -v testFile | clean; rm -rf testFile" \
- "_ $_empty testFile\n" "" ""
+touch testFile; chattr -v 1234 testFile 2>/dev/null || SKIPNEXT=1
+testing "-v version" "lsattr -v testFile | awk '{print \$1}' &&
+ chattr -v 4567 testFile && lsattr -v testFile | awk '{print \$1}';
+ rm -rf testFile" "1234\n4567\n" "" ""
-testing "-R [-/+]a FILE" "$IN && touch aa && chattr -R +A aa &&
- lsattr aa | clean && chattr -R -A aa; rm -rf aa; $OUT" "$_A aa\n" "" ""
-testing "-R [-/+]a FILE.." "$IN && touch aa bb &&
- chattr -R +A aa bb && lsattr aa bb | clean &&
- chattr -R -A aa bb; rm -rf aa bb; $OUT" "$_A aa\n$_A bb\n" "" ""
+mkdir -p a/b/c && touch a/b/c/fA a/b/c/fB
+testing "-R" "chattr -R +a a && lsattr a/b/c/fA a/b/c/fB | clean &&
+ chattr -R -a a && rm -rf a" \
+ "$_a a/b/c/fA\n$_a a/b/c/fB\n" "" ""
+rm -rf a
# Clean up
rm -rf testattr
diff --git a/toys/other/lsattr.c b/toys/other/lsattr.c
index 090ac318..cd236b9e 100644
--- a/toys/other/lsattr.c
+++ b/toys/other/lsattr.c
@@ -353,5 +353,4 @@ void chattr_main(void)
if (!(TT.add || TT.rm || TT.set || FLAG(p) || FLAG(v)))
error_exit("need '-p', '-v', '=', '-', or '+'");
for (; *argv; argv++) dirtree_read(*argv, update_attr);
- toys.exitval = 0; //always set success at this point.
}