blob: e0bc863f913a08b4f1de2935ca563fd4bcbbdeb1 [file] [log] [blame]
Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
Use of this source code is governed by a BSD-style license that can be
found in the LICENSE file.
Intro
-----
We test shill using two sets of tests: unit tests, and integration
tests. The unit tests are built using Google Test [1] and Google Mock
[2]; the integration tests use autotest [3].
Running unit tests
------------------
Here ${BOARD} is a valid board name, like link or x86-generic.
- build the shill_unittest target
- run the resulting shill_unittest binary
- run the unit tests from your host machine under gdb
(chroot)$ FEATURES=test emerge-${BOARD} platform2
(chroot)$ gdb_x86_local --board ${BOARD} \
/build/${BOARD}/var/cache/portage/chromeos-base/platform2/out/Default/shill_unittest
(Of course if the unit tests segfaulted, you wouldn't need the emerge
step since the build directory would have been retained in the course
of the test failing.)
- The emerge workflow given above is incremental. It uses ninja to rebuild only
relevant objects in the shill target.
- You can restrict the test runs to only shill unittests by using
(chroot)$ P2_TEST_FILTER="shill::*" FEATURES=test emerge-${BOARD} platform2
The filter can be made more specific to include googletest filters like
"shill::CellularTest.StartGSMRegister"
- if you want to set a breakpoint in gdb, make sure to include the shill
namespace. e.g., run
(cros-gdb) b shill::EthernetService::GetStorageIdentifier
Breakpoint 2 at 0x5555563cc270: file ethernet_service.cc, line 63.
rather than
(cros-gdb) b EthernetService::GetStorageIdentifier
Function "EthernetService::GetStorageIdentifier" not defined.
Make breakpoint pending on future shared library load? (y or [n]) n
- alternate build command:
- Another way to build which uses the emerge command behind the scenes:
(chroot)$ cros_workon_make --board ${BOARD} platform2
- to see the actual compiler commands that are run:
(chroot)$ CFLAGS="-print-cmdline" cros_workon_make --reconf \
--board=${BOARD} platform2
- to abort compilation on the first error
(chroot)$ MAKEFLAGS="--stop" cros_workon_make --test --board=${BOARD} \
--reconf platform2
Running integration tests
-------------------------
- build a test image, suitable for a VM:
(chroot) src/scripts$ ./build_packages --board=${BOARD}
(chroot) src/scripts$ ./build_image --board=${BOARD} \
--noenable_rootfs_verification test
(chroot) src/scripts$ ./image_to_vm.sh --board=${BOARD} --test_image
- start the VM
(host)$ sudo kvm -m 2048 -vga std -pidfile /tmp/kvm.pid \
-net nic,model=virtio -net user,hostfwd=tcp::9222-:22 \
-hda <path to chroot>/src/build/images/${BOARD}/latest/chromiumos_qemu_image.bin
- DO NOT log in on the console.
(doing so will load a user profile onto shill's profile stack; this
interferes with the test profile that we use in the autotests)
- if you've modified the source after building the image, update shill on
the image, and then restart shill:
(chroot) src/scripts$ ./start_devserver
(chroot) src/scripts$ ssh-keygen -R '[127.0.0.1]:9222'
(chroot) src/scripts$ emerge-${BOARD} platform2
(chroot) src/scripts$ cros deploy 127.0.0.1:9222 platform2
(chroot) src/scripts$ ssh -p 9222 root@127.0.0.1
localhost / # restart shill
- run the tests
(chroot) src/scripts$ test_that 127.0.0.1 WiFiManager
--args="config_file=wifi_vm_config"
--ssh_options="-p 9222"
To run a specific test out of the test suite, use test_pat option to --args.
# Example: To just run the 035CheckWEPKeySyntax test:
(chroot) src/scripts$ test_that 127.0.0.1 WiFiManager
--args="config_file=wifi_vm_config test_pat=035CheckWEPKeySyntax"
--ssh_options="-p 9222"
- configuration note: if you use a different port
(e.g. hostfwd=tcp::9223-:22), you'll need to change:
- the ssh_port argument to test_that
- the port numbers in
<chroot>/third_party/autotest/files/client/config/wifi_vm_config
- debugging test failures
- "grep shill /var/log/messages" for log messages
- "grep wpa_supplicant /var/log/messages" for supplicant log messages
- "wpa_debug debug" to increase supplicant log level
- try resetting the test infrastructure
- rmmod mac80211_hwsim mac80211 cfg80211
- restart wpasupplicant
- rm /tmp/hostapd-test.control/*
- examine autotest log files
- check how far the test got before it failed
$ grep -a ': step ' <test output>/<suite name>/<suite name>.<test name>/debug/<suite name>.<test name>.INFO
e.g.
(chroot) $ grep -a ': step ' /tmp/test_that_latest/network_WiFiRoaming/network_WiFiRoaming.002Suspend/debug/network_WiFiRoaming.002Suspend.INFO
- read the log file
(chroot) $ LESSOPEN= less /tmp/test_that_latest/network_WiFiRoaming/network_WiFiRoaming.002Suspend/debug/network_WiFiRoaming.002Suspend.INFO
(LESSOPEN= prevents less from misinterpreting the logs as binary files,
and piping them through hexdump.)
- additional test suites: we have a number of other WiFi test suites
(in addition to WiFiManager). these are: WiFiMatFunc, WiFiPerf,
WiFiRoaming, WiFiSecMat. the WiFiPerf tests are probably not too
relevant to shill (just yet), but the rest probably are.
[1] http://code.google.com/p/googletest/
[2] http://code.google.com/p/googlemock/
[3] http://autotest.kernel.org/,
http://www.chromium.org/chromium-os/testing/testing-faq