tests: Document automated mac80211_hwsim test setup
This provides guidance on how to build the test setup, how to run the tests, and how to add new test cases. Signed-hostap: Jouni Malinen <j@w1.fi>
This commit is contained in:
parent
5f3eddac8e
commit
883ab1b9f1
3 changed files with 354 additions and 0 deletions
175
tests/hwsim/README
Normal file
175
tests/hwsim/README
Normal file
|
@ -0,0 +1,175 @@
|
|||
Automated hostapd/wpa_supplicant testing with mac80211_hwsim
|
||||
------------------------------------------------------------
|
||||
|
||||
This directory contains testing infrastructure and test cases to run
|
||||
automated tests of full hostapd and wpa_supplicant functionality. This
|
||||
testing is done with the help of mac80211_hwsim which is Linux kernel
|
||||
driver that simulates IEEE 802.11 radios without requiring any
|
||||
additional hardware. This setup most of the hostapd and wpa_supplicant
|
||||
functionality (and large parts of the Linux cfg80211 and mac80211
|
||||
functionality for that matter) to be tested.
|
||||
|
||||
mac80211_hwsim is loaded with five simulated radios to allow different
|
||||
device combinations to be tested. wlantest is used analyze raw packets
|
||||
captured through the hwsim0 monitor interface that capture all frames
|
||||
sent on all channels. tcpdump is used to store the frames for
|
||||
analysis. Three wpa_supplicant processed are used to control three
|
||||
virtual radios and one hostapd process is used to dynamically control
|
||||
the other two virtual radios. hwsim_test is used to verify that data
|
||||
connection (both unicast and broadcast) works between two netdevs.
|
||||
|
||||
The python scripts and tools in this directory control test case
|
||||
execution. They interact wpa_supplicant and hostapd through control
|
||||
interfaces to perform the operations. In addition, wlantest_cli and
|
||||
hwsim_test are used to verify that operations have been performed
|
||||
correctly and that the network connection works in the expected way.
|
||||
|
||||
These test cases are run automatically against the hostap.git commits
|
||||
for regression testing and to help in keeping the hostap.git master
|
||||
branch in stable state. Results from these tests are available here:
|
||||
http://buildbot.w1.fi:8010/waterfall
|
||||
|
||||
|
||||
Building binaries for testing
|
||||
-----------------------------
|
||||
|
||||
You will need to build (or use already built) components to be
|
||||
tested. These are available in the hostap.git repository and can be
|
||||
built for example as follows:
|
||||
|
||||
cd ../../wpa_supplicant
|
||||
cp ../tests/hwsim/example-wpa_supplicant.config .config
|
||||
make clean
|
||||
make
|
||||
cd ../hostapd
|
||||
cp ../tests/hwsim/example-hostapd.config .config
|
||||
make clean
|
||||
make
|
||||
cd ../wlantest
|
||||
make clean
|
||||
make
|
||||
cd ../mac80211_hwsim/tools
|
||||
make
|
||||
|
||||
The test scripts can find the binaries in the locations where they were
|
||||
built. It is also possible to install hwsim_test and wlantest_cli
|
||||
somewhat on the path to use pre-built tools.
|
||||
|
||||
|
||||
wpaspy
|
||||
------
|
||||
|
||||
The python scripts use wpaspy.py to interact with the wpa_supplicant
|
||||
control interface. This needs to be installed in a way that python can
|
||||
find it. For example, with this command:
|
||||
|
||||
sudo cp ../wpaspy/wpaspy.py /usr/local/lib/python2.7/dist-packages
|
||||
|
||||
|
||||
|
||||
mac80211_hwsim
|
||||
--------------
|
||||
|
||||
mac80211_hwsim kernel module is available from the upstream Linux
|
||||
kernel. Some Linux distributions enable it by default. If that's not the
|
||||
case, you can either enable it in the kernel configuration
|
||||
(CONFIG_MAC80211_HWSIM=m) and rebuild your kernel or use Backports with
|
||||
CPTCFG_MAC80211_HWSIM=m to replace the wireless LAN components in the
|
||||
base kernel.
|
||||
|
||||
|
||||
sudo
|
||||
----
|
||||
|
||||
Some parts of the testing process requires root privileges. The test
|
||||
scripts are currently using sudo to achieve this. To be able to run the
|
||||
tests, you'll probably want to enable sudo with a timeout to not expire
|
||||
password entry very quickly. For example, use this in the sudoers file:
|
||||
|
||||
Defaults env_reset,timestamp_timeout=180
|
||||
|
||||
Or on a dedicated test system, you could even disable password prompting
|
||||
with this in sudoers:
|
||||
|
||||
%sudo ALL=NOPASSWD: ALL
|
||||
|
||||
|
||||
Other network interfaces
|
||||
------------------------
|
||||
|
||||
Some of the test scripts are still using hardcoded interface names, so
|
||||
the easiest way of making things work is to avoid using other network
|
||||
devices that may use conflicting interface names. For example, unload
|
||||
any wireless LAN driver before running the tests and make sure that
|
||||
wlan0..4 gets assigned as the interface names for the mac80211_hwsim
|
||||
radios. It may also be possible to rename the interface expectations in
|
||||
run-tests.py to allow other names to be used.
|
||||
|
||||
|
||||
Running tests
|
||||
-------------
|
||||
|
||||
Simplest way to run a full set of the test cases is by running
|
||||
run-all.sh in tests/hwsim directory. This will use start.sh to load the
|
||||
mac80211_hwsim module and start wpa_supplicant, hostapd, and various
|
||||
test tools. run-tests.sh is then used to run through all the defined
|
||||
test cases and stop-wifi.sh to stop the programs and unload the kernel
|
||||
module.
|
||||
|
||||
run-all.sh can be used to run the same test cases under different
|
||||
conditions:
|
||||
|
||||
# run normal test cases
|
||||
./run-all.sh
|
||||
|
||||
# run normal test cases under valgrind
|
||||
./run-all.sh valgrind
|
||||
|
||||
# run normal test cases with Linux tracing
|
||||
./run-all.sh trace
|
||||
|
||||
# run P2P test cases with concurrent station interface
|
||||
./run-all.sh concurrent
|
||||
|
||||
# run P2P test cases with concurrent station interface under valgrind
|
||||
./run-all.sh concurrent-valgrind
|
||||
|
||||
run-all.sh directs debug logs into the logs subdirectory. Log file names
|
||||
include the current UNIX timestamp and a postfix to identify the
|
||||
specific log:
|
||||
- log0 = wpa_supplicant debug log for the first radio
|
||||
- log1 = wpa_supplicant debug log for the second radio
|
||||
- log2 = wpa_supplicant debug log for the third radio
|
||||
- hostapd = hostapd debug log
|
||||
- hwsim0 = wlantest debug log
|
||||
- hwsim0.dump = pcap containing all frames exchanged during the tests
|
||||
- tcpdump = tcpdump output
|
||||
- run = debug prints from the test scripts
|
||||
- trace.dat = Linux tracing record (if enabled)
|
||||
|
||||
|
||||
For manual testing, ./start.sh can be used to initialize interfaces and
|
||||
programs and run-tests.py to execute one or more test
|
||||
cases. run-tests.py output verbosity can be controlled with -d (more
|
||||
verbose debug output) and -q (less verbose output) on the command
|
||||
line. "-f <test_*.py>" can be used to specify that all test cases from a
|
||||
single file are to be run. Test name as the last command line argument
|
||||
can be specified that a single test case is to be run (e.g.,
|
||||
"./run-tests.py test_ap_pmf_required").
|
||||
|
||||
|
||||
Adding/modifying test cases
|
||||
---------------------------
|
||||
|
||||
All the test cases are defined in the test_*.py files. These are python
|
||||
scripts that can use the local helper classes to interact with the test
|
||||
components. While various python constructs can be used in the scripts,
|
||||
only a minimal level of python knowledge should really be needed to
|
||||
modify and add new test cases. The easiest starting point for this is
|
||||
likely to take a look at some of the example scripts. When working on a
|
||||
new test, run-tests.py with -d and the test case name on the command
|
||||
line is a convenient way of verifying functionality.
|
||||
|
||||
run-tests.py will automatically import all test cases from the test_*.py
|
||||
files in this directory. All functions starting with the "test_" prefix
|
||||
in these files are assumed to be test cases.
|
68
tests/hwsim/example-hostapd.config
Normal file
68
tests/hwsim/example-hostapd.config
Normal file
|
@ -0,0 +1,68 @@
|
|||
#CC=ccache gcc
|
||||
|
||||
CONFIG_DRIVER_TEST=y
|
||||
CONFIG_DRIVER_NONE=y
|
||||
CONFIG_DRIVER_NL80211=y
|
||||
CONFIG_RSN_PREAUTH=y
|
||||
|
||||
#CONFIG_TLS=internal
|
||||
#CONFIG_INTERNAL_LIBTOMMATH=y
|
||||
#CONFIG_INTERNAL_LIBTOMMATH_FAST=y
|
||||
CONFIG_TLS=openssl
|
||||
|
||||
CONFIG_EAP=y
|
||||
CONFIG_EAP_MD5=y
|
||||
CONFIG_EAP_TLS=y
|
||||
CONFIG_EAP_MSCHAPV2=y
|
||||
CONFIG_EAP_PEAP=y
|
||||
CONFIG_EAP_GTC=y
|
||||
CONFIG_EAP_TTLS=y
|
||||
CONFIG_EAP_SIM=y
|
||||
CONFIG_EAP_AKA=y
|
||||
CONFIG_EAP_AKA_PRIME=y
|
||||
CONFIG_EAP_GPSK=y
|
||||
CONFIG_EAP_GPSK_SHA256=y
|
||||
CONFIG_EAP_SAKE=y
|
||||
CONFIG_EAP_PAX=y
|
||||
CONFIG_EAP_PSK=y
|
||||
CONFIG_EAP_VENDOR_TEST=y
|
||||
CONFIG_EAP_FAST=y
|
||||
CONFIG_EAP_IKEV2=y
|
||||
CONFIG_EAP_TNC=y
|
||||
CONFIG_EAP_UNAUTH_TLS=y
|
||||
ifeq ($(CONFIG_TLS), openssl)
|
||||
CONFIG_EAP_PWD=y
|
||||
endif
|
||||
CONFIG_PKCS12=y
|
||||
CONFIG_RADIUS_SERVER=y
|
||||
CONFIG_IPV6=y
|
||||
CONFIG_TLSV11=y
|
||||
CONFIG_TLSV12=y
|
||||
|
||||
CONFIG_FULL_DYNAMIC_VLAN=y
|
||||
CONFIG_LIBNL32=y
|
||||
CONFIG_PEERKEY=y
|
||||
CONFIG_IEEE80211W=y
|
||||
CONFIG_IEEE80211R=y
|
||||
CONFIG_IEEE80211N=y
|
||||
CONFIG_IEEE80211AC=y
|
||||
|
||||
CONFIG_WPS=y
|
||||
CONFIG_WPS2=y
|
||||
CONFIG_WPS_UPNP=y
|
||||
CONFIG_WPS_NFC=y
|
||||
#CONFIG_WPS_STRICT=y
|
||||
CONFIG_WPA_TRACE=y
|
||||
CONFIG_WPA_TRACE_BFD=y
|
||||
|
||||
CONFIG_P2P_MANAGER=y
|
||||
CONFIG_DEBUG_FILE=y
|
||||
CONFIG_WPA_CLI_EDIT=y
|
||||
CONFIG_ACS=y
|
||||
CONFIG_NO_RANDOM_POOL=y
|
||||
CONFIG_WNM=y
|
||||
CONFIG_INTERWORKING=y
|
||||
CONFIG_HS20=y
|
||||
#CONFIG_SQLITE=y
|
||||
CONFIG_SAE=y
|
||||
CFLAGS += -DALL_DH_GROUPS
|
111
tests/hwsim/example-wpa_supplicant.config
Normal file
111
tests/hwsim/example-wpa_supplicant.config
Normal file
|
@ -0,0 +1,111 @@
|
|||
#CC=ccache gcc
|
||||
|
||||
CONFIG_TLS=openssl
|
||||
#CONFIG_TLS=internal
|
||||
#CONFIG_INTERNAL_LIBTOMMATH=y
|
||||
#CONFIG_INTERNAL_LIBTOMMATH_FAST=y
|
||||
|
||||
CONFIG_IEEE8021X_EAPOL=y
|
||||
|
||||
CONFIG_EAP_MD5=y
|
||||
CONFIG_MSCHAPV2=y
|
||||
CONFIG_EAP_TLS=y
|
||||
CONFIG_EAP_PEAP=y
|
||||
CONFIG_EAP_TTLS=y
|
||||
CONFIG_EAP_GTC=y
|
||||
CONFIG_EAP_OTP=y
|
||||
CONFIG_EAP_PSK=y
|
||||
CONFIG_EAP_PAX=y
|
||||
CONFIG_EAP_LEAP=y
|
||||
CONFIG_EAP_SIM=y
|
||||
CONFIG_EAP_AKA=y
|
||||
CONFIG_EAP_AKA_PRIME=y
|
||||
CONFIG_EAP_VENDOR_TEST=y
|
||||
CONFIG_EAP_TLV=y
|
||||
CONFIG_EAP_SAKE=y
|
||||
CONFIG_EAP_GPSK=y
|
||||
CONFIG_EAP_GPSK_SHA256=y
|
||||
CONFIG_EAP_EKE=y
|
||||
CONFIG_EAP_TNC=y
|
||||
CONFIG_EAP_FAST=y
|
||||
CONFIG_EAP_IKEV2=y
|
||||
|
||||
ifeq ($(CONFIG_TLS), openssl)
|
||||
CONFIG_EAP_PWD=y
|
||||
endif
|
||||
|
||||
CONFIG_USIM_SIMULATOR=y
|
||||
CONFIG_SIM_SIMULATOR=y
|
||||
|
||||
#CONFIG_PCSC=y
|
||||
CONFIG_IPV6=y
|
||||
CONFIG_DRIVER_NONE=y
|
||||
CONFIG_PKCS12=y
|
||||
CONFIG_CTRL_IFACE=unix
|
||||
|
||||
CONFIG_WPA_CLI_EDIT=y
|
||||
|
||||
CONFIG_OCSP=y
|
||||
|
||||
#CONFIG_ELOOP_POLL=y
|
||||
|
||||
#CONFIG_CTRL_IFACE_DBUS=y
|
||||
#CONFIG_CTRL_IFACE_DBUS_NEW=y
|
||||
#CONFIG_CTRL_IFACE_DBUS_INTRO=y
|
||||
|
||||
CONFIG_PEERKEY=y
|
||||
CONFIG_IEEE80211W=y
|
||||
CONFIG_IEEE80211R=y
|
||||
CONFIG_IEEE80211N=y
|
||||
|
||||
CONFIG_DEBUG_FILE=y
|
||||
|
||||
CONFIG_WPS=y
|
||||
CONFIG_WPS2=y
|
||||
#CONFIG_WPS_STRICT=y
|
||||
CONFIG_WPS_UPNP=y
|
||||
CONFIG_WPS_NFC=y
|
||||
CONFIG_WPS_ER=y
|
||||
#CONFIG_WPS_REG_DISABLE_OPEN=y
|
||||
|
||||
CONFIG_DRIVER_NL80211=y
|
||||
CFLAGS += -I/usr/include/libnl3
|
||||
CONFIG_LIBNL32=y
|
||||
|
||||
CONFIG_IBSS_RSN=y
|
||||
|
||||
CONFIG_AP=y
|
||||
CONFIG_P2P=y
|
||||
CONFIG_WIFI_DISPLAY=y
|
||||
|
||||
CONFIG_BGSCAN_SIMPLE=y
|
||||
CONFIG_BGSCAN_LEARN=y
|
||||
|
||||
CONFIG_WPA_TRACE=y
|
||||
CONFIG_WPA_TRACE_BFD=y
|
||||
|
||||
CONFIG_TDLS=y
|
||||
CONFIG_TDLS_TESTING=y
|
||||
CONFIG_NO_RANDOM_POOL=y
|
||||
|
||||
CONFIG_TLSV11=y
|
||||
CONFIG_TLSV12=y
|
||||
|
||||
#CONFIG_HT_OVERRIDES=y
|
||||
|
||||
CONFIG_DEBUG_LINUX_TRACING=y
|
||||
|
||||
CONFIG_INTERWORKING=y
|
||||
CONFIG_HS20=y
|
||||
|
||||
CONFIG_AUTOSCAN_EXPONENTIAL=y
|
||||
CONFIG_AUTOSCAN_PERIODIC=y
|
||||
|
||||
CONFIG_EXT_PASSWORD_TEST=y
|
||||
|
||||
CONFIG_EAP_UNAUTH_TLS=y
|
||||
|
||||
CONFIG_SAE=y
|
||||
CFLAGS += -DALL_DH_GROUPS
|
||||
|
||||
CONFIG_WNM=y
|
Loading…
Reference in a new issue