| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178 |
- #!/bin/sh
- # SPDX-License-Identifier: GPL-2.0
- #
- # Copyright (c) 2022, 2024 Collabora Ltd
- SYSFS_SUPPLIES=/sys/class/power_supply
- calc() {
- awk "BEGIN { print $* }";
- }
- test_sysfs_prop() {
- PROP="$1"
- VALUE="$2" # optional
- PROP_PATH="$SYSFS_SUPPLIES"/"$DEVNAME"/"$PROP"
- TEST_NAME="$DEVNAME".sysfs."$PROP"
- if [ -z "$VALUE" ]; then
- ktap_test_result "$TEST_NAME" [ -f "$PROP_PATH" ]
- else
- ktap_test_result "$TEST_NAME" grep -q "$VALUE" "$PROP_PATH"
- fi
- }
- to_human_readable_unit() {
- VALUE="$1"
- UNIT="$2"
- case "$VALUE" in
- *[!0-9]* ) return ;; # Not a number
- esac
- if [ "$UNIT" = "uA" ]; then
- new_unit="mA"
- div=1000
- elif [ "$UNIT" = "uV" ]; then
- new_unit="V"
- div=1000000
- elif [ "$UNIT" = "uAh" ]; then
- new_unit="Ah"
- div=1000000
- elif [ "$UNIT" = "uW" ]; then
- new_unit="mW"
- div=1000
- elif [ "$UNIT" = "uWh" ]; then
- new_unit="Wh"
- div=1000000
- else
- return
- fi
- value_converted=$(calc "$VALUE"/"$div")
- echo "$value_converted" "$new_unit"
- }
- _check_sysfs_prop_available() {
- PROP=$1
- PROP_PATH="$SYSFS_SUPPLIES"/"$DEVNAME"/"$PROP"
- TEST_NAME="$DEVNAME".sysfs."$PROP"
- if [ ! -e "$PROP_PATH" ] ; then
- ktap_test_skip "$TEST_NAME"
- return 1
- fi
- if ! cat "$PROP_PATH" >/dev/null; then
- ktap_print_msg "Failed to read"
- ktap_test_fail "$TEST_NAME"
- return 1
- fi
- return 0
- }
- test_sysfs_prop_optional() {
- PROP=$1
- UNIT=$2 # optional
- TEST_NAME="$DEVNAME".sysfs."$PROP"
- _check_sysfs_prop_available "$PROP" || return
- DATA=$(cat "$SYSFS_SUPPLIES"/"$DEVNAME"/"$PROP")
- ktap_print_msg "Reported: '$DATA' $UNIT ($(to_human_readable_unit "$DATA" "$UNIT"))"
- ktap_test_pass "$TEST_NAME"
- }
- test_sysfs_prop_optional_range() {
- PROP=$1
- MIN=$2
- MAX=$3
- UNIT=$4 # optional
- TEST_NAME="$DEVNAME".sysfs."$PROP"
- _check_sysfs_prop_available "$PROP" || return
- DATA=$(cat "$SYSFS_SUPPLIES"/"$DEVNAME"/"$PROP")
- if [ "$DATA" -lt "$MIN" ] || [ "$DATA" -gt "$MAX" ]; then
- ktap_print_msg "'$DATA' is out of range (min=$MIN, max=$MAX)"
- ktap_test_fail "$TEST_NAME"
- else
- ktap_print_msg "Reported: '$DATA' $UNIT ($(to_human_readable_unit "$DATA" "$UNIT"))"
- ktap_test_pass "$TEST_NAME"
- fi
- }
- test_sysfs_prop_optional_list() {
- PROP=$1
- LIST=$2
- TEST_NAME="$DEVNAME".sysfs."$PROP"
- _check_sysfs_prop_available "$PROP" || return
- DATA=$(cat "$SYSFS_SUPPLIES"/"$DEVNAME"/"$PROP")
- valid=0
- OLDIFS=$IFS
- IFS=","
- for item in $LIST; do
- if [ "$DATA" = "$item" ]; then
- valid=1
- break
- fi
- done
- if [ "$valid" -eq 1 ]; then
- ktap_print_msg "Reported: '$DATA'"
- ktap_test_pass "$TEST_NAME"
- else
- ktap_print_msg "'$DATA' is not a valid value for this property"
- ktap_test_fail "$TEST_NAME"
- fi
- IFS=$OLDIFS
- }
- dump_file() {
- FILE="$1"
- while read -r line; do
- ktap_print_msg "$line"
- done < "$FILE"
- }
- __test_uevent_prop() {
- PROP="$1"
- OPTIONAL="$2"
- VALUE="$3" # optional
- UEVENT_PATH="$SYSFS_SUPPLIES"/"$DEVNAME"/uevent
- TEST_NAME="$DEVNAME".uevent."$PROP"
- if ! grep -q "POWER_SUPPLY_$PROP=" "$UEVENT_PATH"; then
- if [ "$OPTIONAL" -eq 1 ]; then
- ktap_test_skip "$TEST_NAME"
- else
- ktap_print_msg "Missing property"
- ktap_test_fail "$TEST_NAME"
- fi
- return
- fi
- if ! grep -q "POWER_SUPPLY_$PROP=$VALUE" "$UEVENT_PATH"; then
- ktap_print_msg "Invalid value for uevent property, dumping..."
- dump_file "$UEVENT_PATH"
- ktap_test_fail "$TEST_NAME"
- else
- ktap_test_pass "$TEST_NAME"
- fi
- }
- test_uevent_prop() {
- __test_uevent_prop "$1" 0 "$2"
- }
- test_uevent_prop_optional() {
- __test_uevent_prop "$1" 1 "$2"
- }
|