179 lines · bash
1#!/bin/sh2# SPDX-License-Identifier: GPL-2.03#4# Copyright (c) 2022, 2024 Collabora Ltd5SYSFS_SUPPLIES=/sys/class/power_supply6 7calc() {8 awk "BEGIN { print $* }";9}10 11test_sysfs_prop() {12 PROP="$1"13 VALUE="$2" # optional14 15 PROP_PATH="$SYSFS_SUPPLIES"/"$DEVNAME"/"$PROP"16 TEST_NAME="$DEVNAME".sysfs."$PROP"17 18 if [ -z "$VALUE" ]; then19 ktap_test_result "$TEST_NAME" [ -f "$PROP_PATH" ]20 else21 ktap_test_result "$TEST_NAME" grep -q "$VALUE" "$PROP_PATH"22 fi23}24 25to_human_readable_unit() {26 VALUE="$1"27 UNIT="$2"28 29 case "$VALUE" in30 *[!0-9]* ) return ;; # Not a number31 esac32 33 if [ "$UNIT" = "uA" ]; then34 new_unit="mA"35 div=100036 elif [ "$UNIT" = "uV" ]; then37 new_unit="V"38 div=100000039 elif [ "$UNIT" = "uAh" ]; then40 new_unit="Ah"41 div=100000042 elif [ "$UNIT" = "uW" ]; then43 new_unit="mW"44 div=100045 elif [ "$UNIT" = "uWh" ]; then46 new_unit="Wh"47 div=100000048 else49 return50 fi51 52 value_converted=$(calc "$VALUE"/"$div")53 echo "$value_converted" "$new_unit"54}55 56_check_sysfs_prop_available() {57 PROP=$158 59 PROP_PATH="$SYSFS_SUPPLIES"/"$DEVNAME"/"$PROP"60 TEST_NAME="$DEVNAME".sysfs."$PROP"61 62 if [ ! -e "$PROP_PATH" ] ; then63 ktap_test_skip "$TEST_NAME"64 return 165 fi66 67 if ! cat "$PROP_PATH" >/dev/null; then68 ktap_print_msg "Failed to read"69 ktap_test_fail "$TEST_NAME"70 return 171 fi72 73 return 074}75 76test_sysfs_prop_optional() {77 PROP=$178 UNIT=$2 # optional79 80 TEST_NAME="$DEVNAME".sysfs."$PROP"81 82 _check_sysfs_prop_available "$PROP" || return83 DATA=$(cat "$SYSFS_SUPPLIES"/"$DEVNAME"/"$PROP")84 85 ktap_print_msg "Reported: '$DATA' $UNIT ($(to_human_readable_unit "$DATA" "$UNIT"))"86 ktap_test_pass "$TEST_NAME"87}88 89test_sysfs_prop_optional_range() {90 PROP=$191 MIN=$292 MAX=$393 UNIT=$4 # optional94 95 TEST_NAME="$DEVNAME".sysfs."$PROP"96 97 _check_sysfs_prop_available "$PROP" || return98 DATA=$(cat "$SYSFS_SUPPLIES"/"$DEVNAME"/"$PROP")99 100 if [ "$DATA" -lt "$MIN" ] || [ "$DATA" -gt "$MAX" ]; then101 ktap_print_msg "'$DATA' is out of range (min=$MIN, max=$MAX)"102 ktap_test_fail "$TEST_NAME"103 else104 ktap_print_msg "Reported: '$DATA' $UNIT ($(to_human_readable_unit "$DATA" "$UNIT"))"105 ktap_test_pass "$TEST_NAME"106 fi107}108 109test_sysfs_prop_optional_list() {110 PROP=$1111 LIST=$2112 113 TEST_NAME="$DEVNAME".sysfs."$PROP"114 115 _check_sysfs_prop_available "$PROP" || return116 DATA=$(cat "$SYSFS_SUPPLIES"/"$DEVNAME"/"$PROP")117 118 valid=0119 120 OLDIFS=$IFS121 IFS=","122 for item in $LIST; do123 if [ "$DATA" = "$item" ]; then124 valid=1125 break126 fi127 done128 if [ "$valid" -eq 1 ]; then129 ktap_print_msg "Reported: '$DATA'"130 ktap_test_pass "$TEST_NAME"131 else132 ktap_print_msg "'$DATA' is not a valid value for this property"133 ktap_test_fail "$TEST_NAME"134 fi135 IFS=$OLDIFS136}137 138dump_file() {139 FILE="$1"140 while read -r line; do141 ktap_print_msg "$line"142 done < "$FILE"143}144 145__test_uevent_prop() {146 PROP="$1"147 OPTIONAL="$2"148 VALUE="$3" # optional149 150 UEVENT_PATH="$SYSFS_SUPPLIES"/"$DEVNAME"/uevent151 TEST_NAME="$DEVNAME".uevent."$PROP"152 153 if ! grep -q "POWER_SUPPLY_$PROP=" "$UEVENT_PATH"; then154 if [ "$OPTIONAL" -eq 1 ]; then155 ktap_test_skip "$TEST_NAME"156 else157 ktap_print_msg "Missing property"158 ktap_test_fail "$TEST_NAME"159 fi160 return161 fi162 163 if ! grep -q "POWER_SUPPLY_$PROP=$VALUE" "$UEVENT_PATH"; then164 ktap_print_msg "Invalid value for uevent property, dumping..."165 dump_file "$UEVENT_PATH"166 ktap_test_fail "$TEST_NAME"167 else168 ktap_test_pass "$TEST_NAME"169 fi170}171 172test_uevent_prop() {173 __test_uevent_prop "$1" 0 "$2"174}175 176test_uevent_prop_optional() {177 __test_uevent_prop "$1" 1 "$2"178}179