|
| 1 | +#!/bin/sh |
| 2 | +# SPDX-License-Identifier: GPL-2.0 |
| 3 | +# |
| 4 | +# Copyright (c) 2022, 2024 Collabora Ltd |
| 5 | +# |
| 6 | +# This test validates the power supply uAPI: namely, the files in sysfs and |
| 7 | +# lines in uevent that expose the power supply properties. |
| 8 | +# |
| 9 | +# By default all power supplies available are tested. Optionally the name of a |
| 10 | +# power supply can be passed as a parameter to test only that one instead. |
| 11 | +DIR="$(dirname "$(readlink -f "$0")")" |
| 12 | + |
| 13 | +. "${DIR}"/../kselftest/ktap_helpers.sh |
| 14 | + |
| 15 | +. "${DIR}"/helpers.sh |
| 16 | + |
| 17 | +count_tests() { |
| 18 | + SUPPLIES=$1 |
| 19 | + |
| 20 | + # This needs to be updated every time a new test is added. |
| 21 | + NUM_TESTS=33 |
| 22 | + |
| 23 | + total_tests=0 |
| 24 | + |
| 25 | + for i in $SUPPLIES; do |
| 26 | + total_tests=$(("$total_tests" + "$NUM_TESTS")) |
| 27 | + done |
| 28 | + |
| 29 | + echo "$total_tests" |
| 30 | +} |
| 31 | + |
| 32 | +ktap_print_header |
| 33 | + |
| 34 | +SYSFS_SUPPLIES=/sys/class/power_supply/ |
| 35 | + |
| 36 | +if [ $# -eq 0 ]; then |
| 37 | + supplies=$(ls "$SYSFS_SUPPLIES") |
| 38 | +else |
| 39 | + supplies=$1 |
| 40 | +fi |
| 41 | + |
| 42 | +ktap_set_plan "$(count_tests "$supplies")" |
| 43 | + |
| 44 | +for DEVNAME in $supplies; do |
| 45 | + ktap_print_msg Testing device "$DEVNAME" |
| 46 | + |
| 47 | + if [ ! -d "$SYSFS_SUPPLIES"/"$DEVNAME" ]; then |
| 48 | + ktap_test_fail "$DEVNAME".exists |
| 49 | + ktap_exit_fail_msg Device does not exist |
| 50 | + fi |
| 51 | + |
| 52 | + ktap_test_pass "$DEVNAME".exists |
| 53 | + |
| 54 | + test_uevent_prop NAME "$DEVNAME" |
| 55 | + |
| 56 | + test_sysfs_prop type |
| 57 | + SUPPLY_TYPE=$(cat "$SYSFS_SUPPLIES"/"$DEVNAME"/type) |
| 58 | + # This fails on kernels < 5.8 (needs 2ad3d74e3c69f) |
| 59 | + test_uevent_prop TYPE "$SUPPLY_TYPE" |
| 60 | + |
| 61 | + test_sysfs_prop_optional usb_type |
| 62 | + |
| 63 | + test_sysfs_prop_optional_range online 0 2 |
| 64 | + test_sysfs_prop_optional_range present 0 1 |
| 65 | + |
| 66 | + test_sysfs_prop_optional_list status "Unknown","Charging","Discharging","Not charging","Full" |
| 67 | + |
| 68 | + # Capacity is reported as percentage, thus any value less than 0 and |
| 69 | + # greater than 100 are not allowed. |
| 70 | + test_sysfs_prop_optional_range capacity 0 100 "%" |
| 71 | + |
| 72 | + test_sysfs_prop_optional_list capacity_level "Unknown","Critical","Low","Normal","High","Full" |
| 73 | + |
| 74 | + test_sysfs_prop_optional model_name |
| 75 | + test_sysfs_prop_optional manufacturer |
| 76 | + test_sysfs_prop_optional serial_number |
| 77 | + test_sysfs_prop_optional_list technology "Unknown","NiMH","Li-ion","Li-poly","LiFe","NiCd","LiMn" |
| 78 | + |
| 79 | + test_sysfs_prop_optional cycle_count |
| 80 | + |
| 81 | + test_sysfs_prop_optional_list scope "Unknown","System","Device" |
| 82 | + |
| 83 | + test_sysfs_prop_optional input_current_limit "uA" |
| 84 | + test_sysfs_prop_optional input_voltage_limit "uV" |
| 85 | + |
| 86 | + # Technically the power-supply class does not limit reported values. |
| 87 | + # E.g. one could expose an RTC backup-battery, which goes below 1.5V or |
| 88 | + # an electric vehicle battery with over 300V. But most devices do not |
| 89 | + # have a step-up capable regulator behind the battery and operate with |
| 90 | + # voltages considered safe to touch, so we limit the allowed range to |
| 91 | + # 1.8V-60V to catch drivers reporting incorrectly scaled values. E.g. a |
| 92 | + # common mistake is reporting data in mV instead of µV. |
| 93 | + test_sysfs_prop_optional_range voltage_now 1800000 60000000 "uV" |
| 94 | + test_sysfs_prop_optional_range voltage_min 1800000 60000000 "uV" |
| 95 | + test_sysfs_prop_optional_range voltage_max 1800000 60000000 "uV" |
| 96 | + test_sysfs_prop_optional_range voltage_min_design 1800000 60000000 "uV" |
| 97 | + test_sysfs_prop_optional_range voltage_max_design 1800000 60000000 "uV" |
| 98 | + |
| 99 | + # current based systems |
| 100 | + test_sysfs_prop_optional current_now "uA" |
| 101 | + test_sysfs_prop_optional current_max "uA" |
| 102 | + test_sysfs_prop_optional charge_now "uAh" |
| 103 | + test_sysfs_prop_optional charge_full "uAh" |
| 104 | + test_sysfs_prop_optional charge_full_design "uAh" |
| 105 | + |
| 106 | + # power based systems |
| 107 | + test_sysfs_prop_optional power_now "uW" |
| 108 | + test_sysfs_prop_optional energy_now "uWh" |
| 109 | + test_sysfs_prop_optional energy_full "uWh" |
| 110 | + test_sysfs_prop_optional energy_full_design "uWh" |
| 111 | + test_sysfs_prop_optional energy_full_design "uWh" |
| 112 | +done |
| 113 | + |
| 114 | +ktap_finished |
0 commit comments