| #!/bin/bash |
| # Copyright 2021 Google LLC |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| |
| |
| TEMPDIRS=() |
| # Script under test |
| SUT=$PWD/usb_network.sh |
| |
| TEST_STATUS="OK" |
| |
| test_setup() { |
| echo -n "Testing $1 ..." |
| FAKE_CONFIGFS="$(mktemp -d)" |
| TEMPDIRS+=("${FAKE_CONFIGFS}") |
| FAKE_GADGETFS="$FAKE_CONFIGFS"/usb_gadget |
| mkdir -p "$FAKE_GADGETFS" |
| } |
| |
| test_teardown() { |
| echo ${TEST_STATUS} |
| rm -rf -- "${TEMPDIRS[@]}" |
| TEMPDIRS=() |
| } |
| |
| test_fail() { |
| echo -n " $* " >&2 |
| TEST_STATUS=FAIL |
| |
| test_teardown |
| exit 1 |
| } |
| |
| check_file_content() { |
| local filename="$1" |
| local expected_content="$2" |
| |
| if [[ ! -f ${filename} ]]; then |
| test_fail "File ${filename} does not exist!" |
| fi |
| |
| local actual_content |
| actual_content=$(<"${filename}") |
| if [[ $expected_content != "$actual_content" ]]; then |
| test_fail "Expected ${expected_content}, got ${actual_content}" |
| fi |
| } |
| |
| test_gadget_creation_with_defaults() { |
| local extra_args=() |
| local gadget_dir="$1" |
| if [[ $gadget_dir == "" ]]; then |
| gadget_dir="g1"; |
| else |
| extra_args+=(--gadget-dir-name "${gadget_dir}") |
| fi |
| local product_name="Souvenier BMC" |
| local product_id="0xcafe" |
| local host_mac="ab:cd:ef:10:11:12" |
| local dev_mac="12:11:10:ef:cd:ab" |
| local bind_device="f80002000.udc" |
| if ! CONFIGFS_HOME="${FAKE_CONFIGFS}" "${SUT}" --product-id "${product_id}" \ |
| --product-name "${product_name}" \ |
| --host-mac "${host_mac}" \ |
| --dev-mac "${dev_mac}" \ |
| --bind-device "${bind_device}" \ |
| "${extra_args[@]}"; then |
| test_fail "${SUT} failed" |
| fi |
| |
| if [[ ! -d ${FAKE_GADGETFS}/${gadget_dir} ]]; then |
| test_fail "Gadget was not created!" |
| fi |
| |
| check_file_content "${FAKE_GADGETFS}/${gadget_dir}/idVendor" "0x18d1" |
| check_file_content "${FAKE_GADGETFS}/${gadget_dir}/idProduct" "${product_id}" |
| check_file_content "${FAKE_GADGETFS}/${gadget_dir}/strings/0x409/manufacturer" "Google" |
| check_file_content "${FAKE_GADGETFS}/${gadget_dir}/strings/0x409/product" "${product_name}" |
| check_file_content "${FAKE_GADGETFS}/${gadget_dir}/configs/c.1/MaxPower" "100" |
| check_file_content "${FAKE_GADGETFS}/${gadget_dir}/configs/c.1/strings/0x409/configuration" "EEM" |
| check_file_content "${FAKE_GADGETFS}/${gadget_dir}/functions/eem.usb0/dev_addr" "${dev_mac}" |
| check_file_content "${FAKE_GADGETFS}/${gadget_dir}/functions/eem.usb0/host_addr" "${host_mac}" |
| |
| if [[ ! -d ${FAKE_GADGETFS}/${gadget_dir}/functions/eem.usb0 ]]; then |
| test_fail "Function directory was not created" |
| fi |
| |
| local func_link="${FAKE_GADGETFS}/${gadget_dir}/configs/c.1/ee.usb0" |
| if [[ ! -L ${func_link} ]]; then |
| test_fail "Symlink to the function was not created in the config" |
| fi |
| |
| local link_dest |
| link_dest="$(realpath "${func_link}")" |
| if [[ $link_dest != "${FAKE_GADGETFS}/${gadget_dir}/functions/eem.usb0" ]]; then |
| test_fail "Symlink points to the wrong file/dir" |
| fi |
| |
| check_file_content "${FAKE_GADGETFS}/${gadget_dir}/UDC" "${bind_device}" |
| } |
| |
| test_gadget_creation_with_override() { |
| mkdir -p "${FAKE_GADGETFS}"/g1/{strings,configs,functions} |
| touch "${FAKE_GADGETFS}"/g1/{idVendor,idProduct} |
| |
| test_gadget_creation_with_defaults |
| } |
| |
| test_gadget_stopping() { |
| local extra_args=() |
| local gadget_dir="$1" |
| local iface_name="$2" |
| if [[ $gadget_dir == "" ]]; then |
| gadget_dir="g1"; |
| else |
| extra_args+=(--gadget-dir-name "${gadget_dir}") |
| fi |
| |
| if [[ $iface_name == "" ]]; then |
| iface_name="usb0"; |
| else |
| extra_args+=(--iface-name "${iface_name}") |
| fi |
| |
| CONFIGFS_HOME=${FAKE_CONFIGFS} ${SUT} "${extra_args[@]}" stop |
| |
| if test -d "${FAKE_GADGETFS}/${gadget_dir}"; then |
| test_fail "Gadget was not removed!" |
| fi |
| } |
| |
| test_gadget_creation_no_macs() { |
| local gadget_dir="g1"; |
| local product_name="Souvenier BMC" |
| local product_id="0xcafe" |
| local bind_device="f80002000.udc" |
| CONFIGFS_HOME=${FAKE_CONFIGFS} ${SUT} --product-id "${product_id}" \ |
| --product-name "${product_name}" \ |
| --bind-device "${bind_device}" |
| |
| if test $? -ne 0; then |
| test_fail "${SUT} failed" |
| fi |
| |
| if ! test -d "${FAKE_GADGETFS}/${gadget_dir}"; then |
| test_fail "Gadget was not created!" |
| fi |
| |
| check_file_content "${FAKE_GADGETFS}/${gadget_dir}/idVendor" "0x18d1" |
| check_file_content "${FAKE_GADGETFS}/${gadget_dir}/idProduct" "${product_id}" |
| check_file_content "${FAKE_GADGETFS}/${gadget_dir}/strings/0x409/manufacturer" "Google" |
| check_file_content "${FAKE_GADGETFS}/${gadget_dir}/strings/0x409/product" "${product_name}" |
| check_file_content "${FAKE_GADGETFS}/${gadget_dir}/configs/c.1/MaxPower" "100" |
| check_file_content "${FAKE_GADGETFS}/${gadget_dir}/configs/c.1/strings/0x409/configuration" "EEM" |
| |
| if [[ -e ${FAKE_GADGETFS}/${gadget_dir}/functions/eem.usb0/dev_addr ]]; then |
| test_fail "dev_addr should not be set" |
| fi |
| |
| if [[ -e ${FAKE_GADGETFS}/${gadget_dir}/functions/eem.usb0/host_addr ]]; then |
| test_fail "host_addr should not be set" |
| fi |
| |
| local func_link="${FAKE_GADGETFS}/${gadget_dir}/configs/c.1/eem.usb0" |
| if [[ ! -L ${func_link} ]]; then |
| test_fail "Symlink to the function was not created in the config" |
| fi |
| |
| local link_dest |
| link_dest="$(realpath "${func_link}")" |
| if [[ $link_dest != ${FAKE_GADGETFS}/${gadget_dir}/functions/eem.usb0 ]]; then |
| test_fail "Symlink points to the wrong file/dir" |
| fi |
| |
| check_file_content "${FAKE_GADGETFS}/${gadget_dir}/UDC" "${bind_device}" |
| } |
| |
| test_gadget_creation_alt_iface() { |
| local gadget_dir="g1"; |
| local product_name="Souvenier BMC" |
| local product_id="0xcafe" |
| local bind_device="f80002000.udc" |
| local iface_name="iface0" |
| if ! CONFIGFS_HOME=${FAKE_CONFIGFS} ${SUT} --product-id "${product_id}" \ |
| --product-name "${product_name}" \ |
| --bind-device "${bind_device}" \ |
| --iface-name "${iface_name}"; then |
| test_fail "${SUT} failed" |
| fi |
| |
| if [[ ! -d "${FAKE_GADGETFS}/${gadget_dir}" ]]; then |
| test_fail "Gadget was not created!" |
| fi |
| |
| check_file_content "${FAKE_GADGETFS}/${gadget_dir}/idVendor" "0x18d1" |
| check_file_content "${FAKE_GADGETFS}/${gadget_dir}/idProduct" "${product_id}" |
| check_file_content "${FAKE_GADGETFS}/${gadget_dir}/strings/0x409/manufacturer" "Google" |
| check_file_content "${FAKE_GADGETFS}/${gadget_dir}/strings/0x409/product" "${product_name}" |
| check_file_content "${FAKE_GADGETFS}/${gadget_dir}/configs/c.1/MaxPower" "100" |
| check_file_content "${FAKE_GADGETFS}/${gadget_dir}/configs/c.1/strings/0x409/configuration" "EEM" |
| |
| if [[ ! -d ${FAKE_GADGETFS}/${gadget_dir}/functions/eem.${iface_name} ]]; then |
| test_fail "Function directory was not created" |
| fi |
| |
| if [[ -e ${FAKE_GADGETFS}/${gadget_dir}/functions/eem.${iface_name}/dev_addr ]]; then |
| test_fail "dev_addr should not be set" |
| fi |
| |
| if [[ -e ${FAKE_GADGETFS}/${gadget_dir}/functions/eem.${iface_name}/host_addr ]]; then |
| test_fail "host_addr should not be set" |
| fi |
| |
| local func_link="${FAKE_GADGETFS}/${gadget_dir}/configs/c.1/eem.${iface_name}" |
| if [[ ! -L ${func_link} ]]; then |
| test_fail "Symlink to the function was not created in the config" |
| fi |
| |
| local link_dest |
| link_dest="$(realpath "${func_link}")" |
| if [[ $link_dest != "${FAKE_GADGETFS}/${gadget_dir}/functions/eem.${iface_name}" ]]; then |
| test_fail "Symlink points to the wrong file/dir" |
| fi |
| |
| check_file_content "${FAKE_GADGETFS}/${gadget_dir}/UDC" "${bind_device}" |
| } |
| |
| |
| # ------------------------------------------------------------------- |
| test_setup "Device Creation" |
| |
| test_gadget_creation_with_defaults |
| |
| test_teardown |
| # ------------------------------------------------------------------- |
| |
| # ------------------------------------------------------------------- |
| test_setup "Device Creation With Override" |
| |
| test_gadget_creation_with_override |
| |
| test_teardown |
| # ------------------------------------------------------------------- |
| |
| # ------------------------------------------------------------------- |
| test_setup "Test Device Stop" |
| |
| test_gadget_creation_with_defaults |
| test_gadget_stopping |
| |
| test_teardown |
| # ------------------------------------------------------------------- |
| |
| # ------------------------------------------------------------------- |
| test_setup "Device Creation/Stopping, Alternative Name" |
| |
| test_gadget_creation_with_defaults "gAlt" |
| test_gadget_stopping "gAlt" |
| |
| test_teardown |
| # ------------------------------------------------------------------- |
| |
| # ------------------------------------------------------------------- |
| test_setup "Device Creation without MAC Addrs" |
| |
| test_gadget_creation_no_macs |
| |
| test_teardown |
| # ------------------------------------------------------------------- |
| |
| # ------------------------------------------------------------------- |
| test_setup "Device Creation/Stopping, Alternative Interface" |
| |
| test_gadget_creation_alt_iface |
| |
| test_teardown |
| # ------------------------------------------------------------------- |
| |
| echo "SUCCESS!" |