blob: bd0ad08a0033a3aca75db79ab378580b25b8ff95 [file] [log] [blame]
#!/boot/bin/sh
#
# Copyright 2018 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
# Fuchsia WLAN smoke test
#
# This code is an end-to-end integration test
# This code is designed as a quick-n-dirty smoke test of WLAN functionality.
# This integration test largely involves an external system from the WLAN
# access point to the Internet, which makes testing performed in
# uncontrolled environment.
TEST_LOG="$1"
[ -z ${TEST_LOG} ] && TEST_LOG="/tmp/wlan-doctor.log"
WLAN_DISCONNECT_QUERY_PERIOD=2 # seconds
WLAN_DISCONNECT_QUERY_RETRY_MAX=10
WLAN_CONNECT_QUERY_PERIOD=5 # seconds
WLAN_CONNECT_QUERY_RETRY_MAX=10
DHCP_QUERY_RETRY_PERIOD=1 # seconds
DHCP_QUERY_RETRY_MAX=5
log () {
msg="$*"
now=$(date)
echo "${now} wlan smoke: ${msg}"
echo "${now} wlan smoke: ${msg}" >> ${TEST_LOG}
}
log_pass() {
msg="$*"
log "[PASS] ${msg}"
}
log_fail() {
msg="$*"
log "[FAIL] ${msg}"
}
ping_dst() {
dst="$1"
cmd="ping -c 2 ${dst}"
${cmd} > /dev/null 2>&1
if [ "$?" -ne 0 ]; then
log_fail "${cmd}"
return 1
else
log_pass "${cmd}"
return 0
fi
}
test_ping() {
# Google Public DNS server
ping_dst 8.8.8.8 "$@"
# OpenDNS
ping_dst 208.67.222.222 "$@"
}
test_dns() {
# Use ping until nslookup is ready
ping_dst www.google.com
ping_dst fuchsia.com
}
get_file_size() {
filepath="$1"
ls_output=$(ls -l "${filepath}")
filesize=$(echo "${ls_output}" | tr -s '[:space:]' | cut -f5 -d " ")
echo "${filesize}"
}
curl_md5sum() {
url="$1"
tmp_file="/tmp/wlan_smoke_md5sum.tmp"
md5_wanted="$2"
speed=$(curl -sw "%{speed_download}" -o "${tmp_file}" "${url}" | cut -f 1 -d ".")
speed=$((speed/1024))
md5_download=$(md5sum "${tmp_file}" | cut -f 1 -d " ")
msg="curl_md5sum ${speed}kB/s ${url}"
if [ "${md5_download}" = "${md5_wanted}" ]; then
log_pass "${msg}"
else
log_fail "${msg}"
fi
}
test_curl_md5sum() {
curl_md5sum http://ovh.net/files/1Mb.dat 62501d556539559fb422943553cd235a
# curl_md5sum http://ovh.net/files/1Mio.dat 6cb91af4ed4c60c11613b75cd1fc6116
# curl_md5sum http://ovh.net/files/10Mb.dat 241cead4562ebf274f76f2e991750b9d
# curl_md5sum http://ovh.net/files/10Mio.dat ecf2a421f46ab33f277fa2aaaf141780
# curl_md5sum http://ipv4.download.thinkbroadband.com/5MB.zip b3215c06647bc550406a9c8ccc378756
}
check_wlan_status() {
status=$(wlan status | head -n 1 | cut -f 2 -d':' | tr -d '[:space:]')
echo "${status}"
}
wlan_disconnect() {
for i in $(seq 1 ${WLAN_DISCONNECT_QUERY_RETRY_MAX}); do
status=$(check_wlan_status)
if [ "${status}" = "scanning" ]; then
log_pass "disconnect"
return 0
fi
log "attempting to disconnect (${i} / ${WLAN_DISCONNECT_QUERY_RETRY_MAX})"
wlan disconnect > /dev/null
sleep ${WLAN_DISCONNECT_QUERY_PERIOD}
done
log_fail "fails to disconnect"
return 1
}
wlan_connect() {
ssid=$1
for i in $(seq 1 ${WLAN_CONNECT_QUERY_RETRY_MAX}); do
status=$(check_wlan_status)
if [ "${status}" = "associated" ]; then
log_pass "connect to ${ssid}"
return 0
fi
log "attempting to connect to ${ssid} (${i} / ${WLAN_CONNECT_QUERY_RETRY_MAX})"
wlan connect "${ssid}" > /dev/null
sleep ${WLAN_CONNECT_QUERY_PERIOD}
done
log_fail "fails to connect to ${ssid}"
return 1
}
wait_for_dhcp() {
for i in $(seq 1 ${DHCP_QUERY_RETRY_MAX}); do
inet_addr=$(get_wlan_inet_addr)
if [ ! -z "${inet_addr}" ]; then
log_pass "dhcp address: ${inet_addr}"
return 0
fi
sleep "${DHCP_QUERY_RETRY_PERIOD}"
done
}
get_wlan_inet_addr() {
wlan_iface=$(ifconfig | grep ^wlan | tr '[:blank:]' ' ' | cut -f1 -d' ')
wlan_inet_addr=$(ifconfig $wlan_iface | grep "inet addr" | cut -f2 -d':' | cut -f1 -d' ' | grep ".")
echo "${wlan_inet_addr}"
}
get_eth_iface_list() {
iface_list=$(ifconfig | grep ^en | cut -f1 -d'\t')
echo "${iface_list}"
}
test_setup() {
rm -rf "${TEST_LOG}" > /dev/null
for eth_iface in "$@"
do
ifconfig "${eth_iface}" down
done
}
test_teardown() {
# Restore to the original state
for eth_iface in "$@"
do
ifconfig "${eth_iface}" up
done
}
run() {
cmd="$*"
${cmd}
if [ "$?" -ne 0 ]; then
log_fail "failed in ${cmd}"
return 1
fi
}
main() {
log "Start"
eth_iface_list=$(get_eth_iface_list)
run test_setup "${eth_iface_list}"
run wlan_disconnect
run wlan_connect GoogleGuest
run wait_for_dhcp
log "Starting traffic tests"
run test_ping
run test_dns
run test_curl_md5sum
log "Ending traffic tests"
run wlan_disconnect
run test_teardown "${eth_iface_list}"
log "End"
}
main