blob: 273917f74068b151d4d97cd83fee64d99f25ec32 [file] [log] [blame]
Copyright (C) 2012 The Android Open Source Project
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.
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 for Chrome OS
--------------------------------
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} shill
(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} shill
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} shill
- to see the actual compiler commands that are run:
(chroot)$ CFLAGS="-print-cmdline" cros_workon_make --reconf \
--board=${BOARD} shill
- to abort compilation on the first error
(chroot)$ MAKEFLAGS="--stop" cros_workon_make --test --board=${BOARD} \
--reconf shill
Running unit tests for Chrome OS with the address sanitizer
-----------------------------------------------------------
USE="asan clang wimax" TEST_FILTER="shill::*" emerge-${BOARD} shill
This also turns on "wimax" and its tests, since this is disabled on most
platforms.
Running unit tests for Android
------------------------------
Currently, only native unit tests are supported on Android, meaning that unit tests
can only be run on the target device.
The test binary is located at /data/nativetest/shill_test/shill_test.
By default, it does not have the execute permissions due to inherited
directory security policy. Consequently, before running the unit tests,
you will need to grant execute permissions to the test binary using
the following command:
chmod +x /data/nativetest/shill_test/shill_test
To run all unit tests:
/data/nativetest/shill_test/shill_test
To run specific unit tests using filter:
/data/nativetest/shill_test/shill_test --gtest_filter=<TestClassName>.<TestName>
For example:
/data/nativetest/shill_test/shill_test --gtest_filter=WiFiMainTest.OnNewWiphy
/data/nativetest/shill_test/shill_test --gtest_filter=WiFiMainTest.*
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