1*cf5a6c84SAndroid Build Coastguard Worker#!/bin/bash 2*cf5a6c84SAndroid Build Coastguard Worker 3*cf5a6c84SAndroid Build Coastguard Worker# Copyright 2013 Divya Kothari <[email protected]> 4*cf5a6c84SAndroid Build Coastguard Worker# Copyright 2013 Robin Mittal <[email protected]> 5*cf5a6c84SAndroid Build Coastguard Worker 6*cf5a6c84SAndroid Build Coastguard Worker#testing "name" "command" "result" "infile" "stdin" 7*cf5a6c84SAndroid Build Coastguard Worker 8*cf5a6c84SAndroid Build Coastguard Workerumask 022 9*cf5a6c84SAndroid Build Coastguard Worker 10*cf5a6c84SAndroid Build Coastguard WorkerPERM="---""--x""-w-""-wx""r--""r-x""rw-""rwx" 11*cf5a6c84SAndroid Build Coastguard Worker 12*cf5a6c84SAndroid Build Coastguard Workernum2perm() 13*cf5a6c84SAndroid Build Coastguard Worker{ 14*cf5a6c84SAndroid Build Coastguard Worker for i in 0 1 2 15*cf5a6c84SAndroid Build Coastguard Worker do 16*cf5a6c84SAndroid Build Coastguard Worker num=${1:$i:1} 17*cf5a6c84SAndroid Build Coastguard Worker printf "%s" ${PERM:$(($num*3)):3} 18*cf5a6c84SAndroid Build Coastguard Worker done 19*cf5a6c84SAndroid Build Coastguard Worker echo 20*cf5a6c84SAndroid Build Coastguard Worker} 21*cf5a6c84SAndroid Build Coastguard Worker 22*cf5a6c84SAndroid Build Coastguard Worker# Creating test files to test chmod command 23*cf5a6c84SAndroid Build Coastguard Workermkdir dir 24*cf5a6c84SAndroid Build Coastguard Workertouch file 25*cf5a6c84SAndroid Build Coastguard Worker 26*cf5a6c84SAndroid Build Coastguard Worker# We don't need to test all 512 permissions 27*cf5a6c84SAndroid Build Coastguard Workerfor U in $(seq 0 7); do for G in 0 3 6; do for O in 0 7; do for T in dir file; do 28*cf5a6c84SAndroid Build Coastguard Worker chmod 777 $T 2>/dev/null 29*cf5a6c84SAndroid Build Coastguard Worker rm -rf $T 30*cf5a6c84SAndroid Build Coastguard Worker if [ "$T" == file ]; then 31*cf5a6c84SAndroid Build Coastguard Worker touch file 32*cf5a6c84SAndroid Build Coastguard Worker C=- 33*cf5a6c84SAndroid Build Coastguard Worker else 34*cf5a6c84SAndroid Build Coastguard Worker mkdir dir 35*cf5a6c84SAndroid Build Coastguard Worker C=d 36*cf5a6c84SAndroid Build Coastguard Worker fi 37*cf5a6c84SAndroid Build Coastguard Worker testing "$U$G$O $T" "chmod $U$G$O $T && ls -ld $T | cut -d' ' -f 1" \ 38*cf5a6c84SAndroid Build Coastguard Worker "${C}$(num2perm $U$G$O)\n" "" "" 39*cf5a6c84SAndroid Build Coastguard Workerdone; done; done; done 40*cf5a6c84SAndroid Build Coastguard Workerunset U G O T C 41*cf5a6c84SAndroid Build Coastguard Worker 42*cf5a6c84SAndroid Build Coastguard Workerrm -rf dir file && mkdir dir && touch file 640 43*cf5a6c84SAndroid Build Coastguard Workertesting "750 dir 640 file" "chmod 750 dir 640 file && 44*cf5a6c84SAndroid Build Coastguard Worker ls -ld 640 dir file | cut -d' ' -f 1 | cut -d. -f 1" \ 45*cf5a6c84SAndroid Build Coastguard Worker "-rwxr-x---\ndrwxr-x---\n-rwxr-x---\n" "" "" 46*cf5a6c84SAndroid Build Coastguard Worker 47*cf5a6c84SAndroid Build Coastguard Workerchtest() 48*cf5a6c84SAndroid Build Coastguard Worker{ 49*cf5a6c84SAndroid Build Coastguard Worker chmod -fR 700 dir file 2>/dev/null 50*cf5a6c84SAndroid Build Coastguard Worker rm -rf dir file && mkdir dir && touch file 51*cf5a6c84SAndroid Build Coastguard Worker testing "$1 dir file" \ 52*cf5a6c84SAndroid Build Coastguard Worker "chmod $1 dir file && ls -ld dir file | cut -d' ' -f 1 | cut -d. -f 1" \ 53*cf5a6c84SAndroid Build Coastguard Worker "$2" "" "" 54*cf5a6c84SAndroid Build Coastguard Worker} 55*cf5a6c84SAndroid Build Coastguard Worker 56*cf5a6c84SAndroid Build Coastguard Workerchtest 666 "drw-rw-rw-\n-rw-rw-rw-\n" 57*cf5a6c84SAndroid Build Coastguard Workerchtest 765 "drwxrw-r-x\n-rwxrw-r-x\n" 58*cf5a6c84SAndroid Build Coastguard Workerchtest u=r "dr--r-xr-x\n-r--r--r--\n" 59*cf5a6c84SAndroid Build Coastguard Workerchtest u=w "d-w-r-xr-x\n--w-r--r--\n" 60*cf5a6c84SAndroid Build Coastguard Workerchtest u=x "d--xr-xr-x\n---xr--r--\n" 61*cf5a6c84SAndroid Build Coastguard Workerchtest u+r "drwxr-xr-x\n-rw-r--r--\n" 62*cf5a6c84SAndroid Build Coastguard Workerchtest u+w "drwxr-xr-x\n-rw-r--r--\n" 63*cf5a6c84SAndroid Build Coastguard Workerchtest u+x "drwxr-xr-x\n-rwxr--r--\n" 64*cf5a6c84SAndroid Build Coastguard Workerchtest u-r "d-wxr-xr-x\n--w-r--r--\n" 65*cf5a6c84SAndroid Build Coastguard Workerchtest u-w "dr-xr-xr-x\n-r--r--r--\n" 66*cf5a6c84SAndroid Build Coastguard Workerchtest u-x "drw-r-xr-x\n-rw-r--r--\n" 67*cf5a6c84SAndroid Build Coastguard Workerchtest g=r "drwxr--r-x\n-rw-r--r--\n" 68*cf5a6c84SAndroid Build Coastguard Workerchtest g=w "drwx-w-r-x\n-rw--w-r--\n" 69*cf5a6c84SAndroid Build Coastguard Workerchtest g=x "drwx--xr-x\n-rw---xr--\n" 70*cf5a6c84SAndroid Build Coastguard Workerchtest g+r "drwxr-xr-x\n-rw-r--r--\n" 71*cf5a6c84SAndroid Build Coastguard Workerchtest g+w "drwxrwxr-x\n-rw-rw-r--\n" 72*cf5a6c84SAndroid Build Coastguard Workerchtest g+x "drwxr-xr-x\n-rw-r-xr--\n" 73*cf5a6c84SAndroid Build Coastguard Workerchtest g-r "drwx--xr-x\n-rw----r--\n" 74*cf5a6c84SAndroid Build Coastguard Workerchtest g-w "drwxr-xr-x\n-rw-r--r--\n" 75*cf5a6c84SAndroid Build Coastguard Workerchtest g-x "drwxr--r-x\n-rw-r--r--\n" 76*cf5a6c84SAndroid Build Coastguard Workerchtest o=r "drwxr-xr--\n-rw-r--r--\n" 77*cf5a6c84SAndroid Build Coastguard Workerchtest o=w "drwxr-x-w-\n-rw-r---w-\n" 78*cf5a6c84SAndroid Build Coastguard Workerchtest o=x "drwxr-x--x\n-rw-r----x\n" 79*cf5a6c84SAndroid Build Coastguard Workerchtest o+r "drwxr-xr-x\n-rw-r--r--\n" 80*cf5a6c84SAndroid Build Coastguard Workerchtest o+w "drwxr-xrwx\n-rw-r--rw-\n" 81*cf5a6c84SAndroid Build Coastguard Workerchtest o+x "drwxr-xr-x\n-rw-r--r-x\n" 82*cf5a6c84SAndroid Build Coastguard Workerchtest o-r "drwxr-x--x\n-rw-r-----\n" 83*cf5a6c84SAndroid Build Coastguard Workerchtest o-w "drwxr-xr-x\n-rw-r--r--\n" 84*cf5a6c84SAndroid Build Coastguard Workerchtest o-x "drwxr-xr--\n-rw-r--r--\n" 85*cf5a6c84SAndroid Build Coastguard Workerchtest a=r "dr--r--r--\n-r--r--r--\n" 86*cf5a6c84SAndroid Build Coastguard Workerchtest a=w "d-w--w--w-\n--w--w--w-\n" 87*cf5a6c84SAndroid Build Coastguard Workerchtest a=x "d--x--x--x\n---x--x--x\n" 88*cf5a6c84SAndroid Build Coastguard Workerchtest a+r "drwxr-xr-x\n-rw-r--r--\n" 89*cf5a6c84SAndroid Build Coastguard Workerchtest a+w "drwxrwxrwx\n-rw-rw-rw-\n" 90*cf5a6c84SAndroid Build Coastguard Workerchtest a+x "drwxr-xr-x\n-rwxr-xr-x\n" 91*cf5a6c84SAndroid Build Coastguard Workerchtest a-r "d-wx--x--x\n--w-------\n" 92*cf5a6c84SAndroid Build Coastguard Workerchtest a-w "dr-xr-xr-x\n-r--r--r--\n" 93*cf5a6c84SAndroid Build Coastguard Workerchtest a-x "drw-r--r--\n-rw-r--r--\n" 94*cf5a6c84SAndroid Build Coastguard Workerchtest =r "dr--r--r--\n-r--r--r--\n" 95*cf5a6c84SAndroid Build Coastguard Workerchtest =w "d-w-------\n--w-------\n" 96*cf5a6c84SAndroid Build Coastguard Workerchtest =x "d--x--x--x\n---x--x--x\n" 97*cf5a6c84SAndroid Build Coastguard Workerchtest +r "drwxr-xr-x\n-rw-r--r--\n" 98*cf5a6c84SAndroid Build Coastguard Workerchtest +w "drwxr-xr-x\n-rw-r--r--\n" 99*cf5a6c84SAndroid Build Coastguard Workerchtest +x "drwxr-xr-x\n-rwxr-xr-x\n" 100*cf5a6c84SAndroid Build Coastguard Workerchtest -r "d-wx--x--x\n--w-------\n" 101*cf5a6c84SAndroid Build Coastguard Workerchtest -w "dr-xr-xr-x\n-r--r--r--\n" 102*cf5a6c84SAndroid Build Coastguard Workerchtest -x "drw-r--r--\n-rw-r--r--\n" 103*cf5a6c84SAndroid Build Coastguard Workerchtest a-w,a+x "dr-xr-xr-x\n-r-xr-xr-x\n" 104*cf5a6c84SAndroid Build Coastguard Worker 105*cf5a6c84SAndroid Build Coastguard Worker# macOS doesn't allow +s in /tmp 106*cf5a6c84SAndroid Build Coastguard Workertouch s-supported 107*cf5a6c84SAndroid Build Coastguard Workerchmod +s s-supported 2>/dev/null || SKIP=99 108*cf5a6c84SAndroid Build Coastguard Workerrm s-supported 109*cf5a6c84SAndroid Build Coastguard Workerchtest g+s "drwxr-sr-x\n-rw-r-Sr--\n" 110*cf5a6c84SAndroid Build Coastguard Workerchtest u+s "drwsr-xr-x\n-rwSr--r--\n" 111*cf5a6c84SAndroid Build Coastguard Workerchtest +s "drwsr-sr-x\n-rwSr-Sr--\n" 112*cf5a6c84SAndroid Build Coastguard Workerchtest o+s "drwxr-xr-x\n-rw-r--r--\n" 113*cf5a6c84SAndroid Build Coastguard WorkerSKIP=0 114*cf5a6c84SAndroid Build Coastguard Worker 115*cf5a6c84SAndroid Build Coastguard Workerchtest +t "drwxr-xr-t\n-rw-r--r-T\n" 116*cf5a6c84SAndroid Build Coastguard Workerchtest a=r+w+x "drwxrwxrwx\n-rwxrwxrwx\n" 117*cf5a6c84SAndroid Build Coastguard Workerchtest u+rwX-s,g+rX-ws,o+rX-wt "drwxr-xr-x\n-rw-r--r--\n" 118*cf5a6c84SAndroid Build Coastguard Workerchtest u+rwX,u-s,g+rX,g-ws,o+rX,o-wt "drwxr-xr-x\n-rw-r--r--\n" 119*cf5a6c84SAndroid Build Coastguard Worker 120*cf5a6c84SAndroid Build Coastguard Worker# (chtest starts off with a directory that's +x...) 121*cf5a6c84SAndroid Build Coastguard Workertesting "+X" \ 122*cf5a6c84SAndroid Build Coastguard Worker "mkdir -m 000 Xd && touch Xf && chmod +X Xd Xf && ls -ld Xd Xf | cut -d' ' -f 1" \ 123*cf5a6c84SAndroid Build Coastguard Worker "d--x--x--x\n-rw-r--r--\n" "" "" 124*cf5a6c84SAndroid Build Coastguard Worker 125*cf5a6c84SAndroid Build Coastguard Workermkdir foo 126*cf5a6c84SAndroid Build Coastguard Workerln -s bar foo/baz 127*cf5a6c84SAndroid Build Coastguard Worker# If you explicitly ask us, we'll try (and fail) to chmod a symlink. 128*cf5a6c84SAndroid Build Coastguard Workertesting "-R symlink arg" 'chmod -R 750 foo/baz 2>/dev/null; echo $?' "1\n" "" "" 129*cf5a6c84SAndroid Build Coastguard Worker# If you only imply that you might want us to do that, we'll skip it. 130*cf5a6c84SAndroid Build Coastguard Workertesting "-R symlink recurse" 'chmod -R 750 foo; echo $?' "0\n" "" "" 131*cf5a6c84SAndroid Build Coastguard Worker 132*cf5a6c84SAndroid Build Coastguard Worker# Removing test files for cleanup purpose 133*cf5a6c84SAndroid Build Coastguard Workerrm -rf dir file 134