0001
0002
0003
0004
0005
0006
0007 set -e
0008
0009 TEST_REQS_FW_UPLOAD="yes"
0010 TEST_DIR=$(dirname $0)
0011
0012 progress_states="preparing transferring programming"
0013 errors="hw-error
0014 timeout
0015 device-busy
0016 invalid-file-size
0017 read-write-error
0018 flash-wearout"
0019 error_abort="user-abort"
0020 fwname1=fw1
0021 fwname2=fw2
0022 fwname3=fw3
0023
0024 source $TEST_DIR/fw_lib.sh
0025
0026 check_mods
0027 check_setup
0028 verify_reqs
0029
0030 trap "upload_finish" EXIT
0031
0032 upload_finish() {
0033 local fwdevs="$fwname1 $fwname2 $fwname3"
0034
0035 for name in $fwdevs; do
0036 if [ -e "$DIR/$name" ]; then
0037 echo -n "$name" > "$DIR"/upload_unregister
0038 fi
0039 done
0040 }
0041
0042 upload_fw() {
0043 local name="$1"
0044 local file="$2"
0045
0046 echo 1 > "$DIR"/"$name"/loading
0047 cat "$file" > "$DIR"/"$name"/data
0048 echo 0 > "$DIR"/"$name"/loading
0049 }
0050
0051 verify_fw() {
0052 local name="$1"
0053 local file="$2"
0054
0055 echo -n "$name" > "$DIR"/config_upload_name
0056 if ! cmp "$file" "$DIR"/upload_read > /dev/null 2>&1; then
0057 echo "$0: firmware compare for $name did not match" >&2
0058 exit 1
0059 fi
0060
0061 echo "$0: firmware upload for $name works" >&2
0062 return 0
0063 }
0064
0065 inject_error() {
0066 local name="$1"
0067 local status="$2"
0068 local error="$3"
0069
0070 echo 1 > "$DIR"/"$name"/loading
0071 echo -n "inject":"$status":"$error" > "$DIR"/"$name"/data
0072 echo 0 > "$DIR"/"$name"/loading
0073 }
0074
0075 await_status() {
0076 local name="$1"
0077 local expected="$2"
0078 local status
0079 local i
0080
0081 let i=0
0082 while [ $i -lt 50 ]; do
0083 status=$(cat "$DIR"/"$name"/status)
0084 if [ "$status" = "$expected" ]; then
0085 return 0;
0086 fi
0087 sleep 1e-03
0088 let i=$i+1
0089 done
0090
0091 echo "$0: Invalid status: Expected $expected, Actual $status" >&2
0092 return 1;
0093 }
0094
0095 await_idle() {
0096 local name="$1"
0097
0098 await_status "$name" "idle"
0099 return $?
0100 }
0101
0102 expect_error() {
0103 local name="$1"
0104 local expected="$2"
0105 local error=$(cat "$DIR"/"$name"/error)
0106
0107 if [ "$error" != "$expected" ]; then
0108 echo "Invalid error: Expected $expected, Actual $error" >&2
0109 return 1
0110 fi
0111
0112 return 0
0113 }
0114
0115 random_firmware() {
0116 local bs="$1"
0117 local count="$2"
0118 local file=$(mktemp -p /tmp uploadfwXXX.bin)
0119
0120 dd if=/dev/urandom of="$file" bs="$bs" count="$count" > /dev/null 2>&1
0121 echo "$file"
0122 }
0123
0124 test_upload_cancel() {
0125 local name="$1"
0126 local status
0127
0128 for status in $progress_states; do
0129 inject_error $name $status $error_abort
0130 if ! await_status $name $status; then
0131 exit 1
0132 fi
0133
0134 echo 1 > "$DIR"/"$name"/cancel
0135
0136 if ! await_idle $name; then
0137 exit 1
0138 fi
0139
0140 if ! expect_error $name "$status":"$error_abort"; then
0141 exit 1
0142 fi
0143 done
0144
0145 echo "$0: firmware upload cancellation works"
0146 return 0
0147 }
0148
0149 test_error_handling() {
0150 local name=$1
0151 local status
0152 local error
0153
0154 for status in $progress_states; do
0155 for error in $errors; do
0156 inject_error $name $status $error
0157
0158 if ! await_idle $name; then
0159 exit 1
0160 fi
0161
0162 if ! expect_error $name "$status":"$error"; then
0163 exit 1
0164 fi
0165
0166 done
0167 done
0168 echo "$0: firmware upload error handling works"
0169 }
0170
0171 test_fw_too_big() {
0172 local name=$1
0173 local fw_too_big=`random_firmware 512 5`
0174 local expected="preparing:invalid-file-size"
0175
0176 upload_fw $name $fw_too_big
0177 rm -f $fw_too_big
0178
0179 if ! await_idle $name; then
0180 exit 1
0181 fi
0182
0183 if ! expect_error $name $expected; then
0184 exit 1
0185 fi
0186
0187 echo "$0: oversized firmware error handling works"
0188 }
0189
0190 echo -n "$fwname1" > "$DIR"/upload_register
0191 echo -n "$fwname2" > "$DIR"/upload_register
0192 echo -n "$fwname3" > "$DIR"/upload_register
0193
0194 test_upload_cancel $fwname1
0195 test_error_handling $fwname1
0196 test_fw_too_big $fwname1
0197
0198 fw_file1=`random_firmware 512 4`
0199 fw_file2=`random_firmware 512 3`
0200 fw_file3=`random_firmware 512 2`
0201
0202 upload_fw $fwname1 $fw_file1
0203 upload_fw $fwname2 $fw_file2
0204 upload_fw $fwname3 $fw_file3
0205
0206 verify_fw ${fwname1} ${fw_file1}
0207 verify_fw ${fwname2} ${fw_file2}
0208 verify_fw ${fwname3} ${fw_file3}
0209
0210 echo -n "$fwname1" > "$DIR"/upload_unregister
0211 echo -n "$fwname2" > "$DIR"/upload_unregister
0212 echo -n "$fwname3" > "$DIR"/upload_unregister
0213
0214 exit 0