#!/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="" TEMPFILES="" # Script under test SUT=$PWD/usb_network.sh TEST_STATUS="OK" test_setup() { echo -n "Testing $1 ..." FAKE_CONFIGFS=$(mktemp -d) TEMPDIRS="${TEMPDIRS} ${FAKE_CONFIGFS}" FAKE_GADGETFS=$FAKE_CONFIGFS/usb_gadget mkdir -p "$FAKE_GADGETFS" } test_teardown() { echo ${TEST_STATUS} if test -n "$TEMPDIRS"; then rm -rf ${TEMPDIRS} fi if test -n "$TEMPFILES"; then rm -f $TEMPFILES fi } test_fail() { echo -n " $@ " >&2 TEST_STATUS="FAIL" test_teardown exit 1 } check_file_content() { local filename="$1" local expected_content="$2" if ! test -f "${filename}"; then test_fail "File ${filename} does not exist!" fi local actual_content=$(cat ${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=(${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" 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[@]} 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 "ECM" check_file_content ${FAKE_GADGETFS}/${gadget_dir}/functions/ecm.usb0/dev_addr "${dev_mac}" check_file_content ${FAKE_GADGETFS}/${gadget_dir}/functions/ecm.usb0/host_addr "${host_mac}" if ! test -d ${FAKE_GADGETFS}/${gadget_dir}/functions/ecm.usb0; then test_fail "Function directory was not created" fi local func_link="${FAKE_GADGETFS}/${gadget_dir}/configs/c.1/ecm.usb0" if ! test -L "${func_link}"; then test_fail "Symlink to the function was not created in the config" fi local link_dest=$(realpath ${func_link}) if [[ $link_dest != ${FAKE_GADGETFS}/${gadget_dir}/functions/ecm.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=(${extra_args} --gadget-dir-name "${gadget_dir}") fi if [[ $iface_name == "" ]]; then iface_name="usb0"; else extra_args=(${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 "ECM" if test -e ${FAKE_GADGETFS}/${gadget_dir}/functions/ecm.usb0/dev_addr; then test_fail "dev_addr should not be set" fi if test -e ${FAKE_GADGETFS}/${gadget_dir}/functions/ecm.usb0/host_addr; then test_fail "host_addr should not be set" fi local func_link="${FAKE_GADGETFS}/${gadget_dir}/configs/c.1/ecm.usb0" if ! test -L "${func_link}"; then test_fail "Symlink to the function was not created in the config" fi local link_dest=$(realpath ${func_link}) if [[ $link_dest != ${FAKE_GADGETFS}/${gadget_dir}/functions/ecm.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" CONFIGFS_HOME=${FAKE_CONFIGFS} ${SUT} --product-id "${product_id}" \ --product-name "${product_name}" \ --bind-device "${bind_device}" \ --iface-name "${iface_name}" 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 "ECM" if ! test -d ${FAKE_GADGETFS}/${gadget_dir}/functions/ecm.${iface_name}; then test_fail "Function directory was not created" fi if test -e ${FAKE_GADGETFS}/${gadget_dir}/functions/ecm.${iface_name}/dev_addr; then test_fail "dev_addr should not be set" fi if test -e ${FAKE_GADGETFS}/${gadget_dir}/functions/ecm.${iface_name}/host_addr; then test_fail "host_addr should not be set" fi local func_link="${FAKE_GADGETFS}/${gadget_dir}/configs/c.1/ecm.${iface_name}" if ! test -L "${func_link}"; then test_fail "Symlink to the function was not created in the config" fi local link_dest=$(realpath ${func_link}) if [[ $link_dest != ${FAKE_GADGETFS}/${gadget_dir}/functions/ecm.${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!"