Merge changes I26f823e2,Iaff2b157,I82a0d54f,I7e4b6fda,I268367b8

* changes:
  adbd: improve coverage by compiling less code.
  adb: refactor and relocate coverage script.
  adbd: test TCP in coverage.
  adb: allow wait-for-disconnect to match offline for TCP devices.
  adbd: add unit tests to coverage report.
This commit is contained in:
Josh Gao 2020-04-22 03:27:47 +00:00 committed by Gerrit Code Review
commit 992f08e78d
10 changed files with 190 additions and 82 deletions

View file

@ -165,7 +165,6 @@ libadb_srcs = [
"adb_unique_fd.cpp",
"adb_utils.cpp",
"fdevent/fdevent.cpp",
"fdevent/fdevent_poll.cpp",
"services.cpp",
"sockets.cpp",
"socket_spec.cpp",
@ -176,6 +175,17 @@ libadb_srcs = [
"types.cpp",
]
libadb_darwin_srcs = [
"fdevent/fdevent_poll.cpp",
]
libadb_windows_srcs = [
"fdevent/fdevent_poll.cpp",
"sysdeps_win32.cpp",
"sysdeps/win32/errno.cpp",
"sysdeps/win32/stat.cpp",
]
libadb_posix_srcs = [
"sysdeps_unix.cpp",
"sysdeps/posix/network.cpp",
@ -219,7 +229,7 @@ cc_library_host_static {
srcs: ["client/usb_linux.cpp"] + libadb_linux_srcs,
},
darwin: {
srcs: ["client/usb_osx.cpp"],
srcs: ["client/usb_osx.cpp"] + libadb_darwin_srcs,
},
not_windows: {
srcs: libadb_posix_srcs,
@ -228,10 +238,7 @@ cc_library_host_static {
enabled: true,
srcs: [
"client/usb_windows.cpp",
"sysdeps_win32.cpp",
"sysdeps/win32/errno.cpp",
"sysdeps/win32/stat.cpp",
],
] + libadb_windows_srcs,
shared_libs: ["AdbWinApi"],
},
},

View file

@ -89,18 +89,13 @@ void start_device_log(void) {
int adb_trace_mask;
std::string get_trace_setting_from_env() {
std::string get_trace_setting() {
#if ADB_HOST
const char* setting = getenv("ADB_TRACE");
if (setting == nullptr) {
setting = "";
}
return std::string(setting);
}
std::string get_trace_setting() {
#if ADB_HOST
return get_trace_setting_from_env();
return setting;
#else
return android::base::GetProperty("persist.adb.trace_mask", "");
#endif

View file

@ -1,63 +0,0 @@
#!/bin/bash
# Copyright (C) 2020 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.
set -euxo pipefail
adb root
adb shell logcat -c -G128M
adb shell setprop persist.adb.trace_mask 1
adb shell killall adbd
# TODO: Add `adb transport-id` and wait-for-offline on it.
sleep 5
adb wait-for-device shell rm "/data/misc/trace/*"
./test_device.py
# Dump traces from the currently running adbd.
adb shell killall -37 adbd
echo Waiting for adbd to finish dumping traces
sleep 5
TRACEDIR=`mktemp -d`
adb pull /data/misc/trace "$TRACEDIR"/
echo Pulled traces to $TRACEDIR
# Identify which of the trace files are actually adbd, in case something else exited simultaneously.
ADBD_PIDS=$(adb shell "logcat -d -s adbd --format=process | grep 'adbd started' | cut -c 3-7 | tr -d ' ' | sort | uniq")
mkdir "$TRACEDIR"/adbd_traces
adb shell 'setprop persist.adb.trace_mask 0; killall adbd'
IFS=$'\n'
for PID in $ADBD_PIDS; do
cp "$TRACEDIR"/trace/clang-$PID-*.profraw "$TRACEDIR"/adbd_traces 2>/dev/null || true
done
llvm-profdata merge --output="$TRACEDIR"/adbd.profdata "$TRACEDIR"/adbd_traces/*
cd $ANDROID_BUILD_TOP
llvm-cov report --instr-profile="$TRACEDIR"/adbd.profdata \
$ANDROID_PRODUCT_OUT/apex/com.android.adbd/bin/adbd \
--show-region-summary=false \
/proc/self/cwd/system/core/adb
llvm-cov show --instr-profile="$TRACEDIR"/adbd.profdata \
$ANDROID_PRODUCT_OUT/apex/com.android.adbd/bin/adbd \
--format=html \
/proc/self/cwd/system/core/adb > $TRACEDIR/report.html

2
adb/coverage/.gitignore vendored Normal file
View file

@ -0,0 +1,2 @@
/adbd.profdata
/report

114
adb/coverage/gen_coverage.sh Executable file
View file

@ -0,0 +1,114 @@
#!/bin/bash
set -euxo pipefail
OUTPUT_DIR=$(dirname "$0")
. "$OUTPUT_DIR"/include.sh
TRACEDIR=`mktemp -d`
### Make sure we can connect to the device.
# Get the device's wlan0 address.
IP_ADDR=$(adb shell ip route get 0.0.0.0 oif wlan0 | sed -En -e 's/.*src (\S+)\s.*/\1/p')
REMOTE_PORT=5555
REMOTE=$IP_ADDR:$REMOTE_PORT
LOCAL_SERIAL=$(adb shell getprop ro.serialno)
# Check that we can connect to it.
adb disconnect
adb tcpip $REMOTE_PORT
# TODO: Add `adb transport-id` and wait-for-offline on it.
sleep 5
adb connect $REMOTE
REMOTE_FETCHED_SERIAL=$(adb -s $REMOTE shell getprop ro.serialno)
if [[ "$LOCAL_SERIAL" != "$REMOTE_FETCHED_SERIAL" ]]; then
echo "Mismatch: local serial = $LOCAL_SERIAL, remote serial = $REMOTE_FETCHED_SERIAL"
exit 1
fi
# Back to USB, and make sure adbd is root.
adb disconnect $REMOTE
adb root
adb wait-for-device usb
# TODO: Add `adb transport-id` and wait-for-offline on it.
sleep 5
adb wait-for-device
### Run the adb unit tests and fetch traces from them.
mkdir "$TRACEDIR"/test_traces
adb shell rm -rf /data/local/tmp/adb_coverage
adb shell mkdir /data/local/tmp/adb_coverage
for TEST in $ADB_TESTS; do
adb shell LLVM_PROFILE_FILE=/data/local/tmp/adb_coverage/$TEST.profraw /data/nativetest64/$TEST/$TEST
adb pull /data/local/tmp/adb_coverage/$TEST.profraw "$TRACEDIR"/test_traces/
done
adb pull /data/local/tmp/adb_coverage "$TRACEDIR"/test_traces
# Clear logcat and increase the buffer to something ridiculous so we can fetch the pids of adbd later.
adb shell logcat -c -G128M
# Turn on extremely verbose logging so as to not count debug logging against us.
adb shell setprop persist.adb.trace_mask 1
### Run test_device.py over USB.
adb shell killall adbd
# TODO: Add `adb transport-id` and wait-for-offline on it.
sleep 5
adb wait-for-device shell rm -rf "/data/misc/trace/*" /data/local/tmp/adb_coverage/
"$OUTPUT_DIR"/../test_device.py
# Do a usb reset to exercise the disconnect code.
adb_usbreset
adb wait-for-device
# Dump traces from the currently running adbd.
adb shell killall -37 adbd
echo Waiting for adbd to finish dumping traces
sleep 5
# Restart adbd in tcp mode.
adb tcpip $REMOTE_PORT
sleep 5
adb connect $REMOTE
adb -s $REMOTE wait-for-device
# Run test_device.py again.
ANDROID_SERIAL=$REMOTE "$OUTPUT_DIR"/../test_device.py
# Dump traces again.
adb disconnect $REMOTE
adb shell killall -37 adbd
echo Waiting for adbd to finish dumping traces
sleep 5
adb pull /data/misc/trace "$TRACEDIR"/
echo Pulled traces to $TRACEDIR
# Identify which of the trace files are actually adbd, in case something else exited simultaneously.
ADBD_PIDS=$(adb shell "logcat -d -s adbd --format=process | grep 'adbd started' | cut -c 3-7 | tr -d ' ' | sort | uniq")
mkdir "$TRACEDIR"/adbd_traces
adb shell 'setprop persist.adb.trace_mask 0; killall adbd'
IFS=$'\n'
for PID in $ADBD_PIDS; do
cp "$TRACEDIR"/trace/clang-$PID-*.profraw "$TRACEDIR"/adbd_traces 2>/dev/null || true
done
unset IFS
### Merge the traces.
llvm-profdata merge --output="$OUTPUT_DIR"/adbd.profdata "$TRACEDIR"/adbd_traces/* "$TRACEDIR"/test_traces/*

5
adb/coverage/include.sh Normal file
View file

@ -0,0 +1,5 @@
ADB_TESTS="adbd_test adb_crypto_test adb_pairing_auth_test adb_pairing_connection_test adb_tls_connection_test"
ADB_TEST_BINARIES=""
for TEST in $ADB_TESTS; do
ADB_TEST_BINARIES="--object=$ANDROID_PRODUCT_OUT/data/nativetest64/$TEST/$TEST $ADB_TEST_BINARIES"
done

22
adb/coverage/report.sh Executable file
View file

@ -0,0 +1,22 @@
#!/bin/bash
set -euxo pipefail
OUTPUT_DIR=$(realpath $(dirname "$0"))
. "$OUTPUT_DIR"/include.sh
rm -rf "$OUTPUT_DIR"/report
cd $ANDROID_BUILD_TOP
llvm-cov show --instr-profile="$OUTPUT_DIR"/adbd.profdata \
$ANDROID_PRODUCT_OUT/apex/com.android.adbd/bin/adbd \
/proc/self/cwd/system/core/adb \
$ADB_TEST_BINARIES \
--show-region-summary=false \
--format=html -o "$OUTPUT_DIR"/report
llvm-cov report --instr-profile="$OUTPUT_DIR"/adbd.profdata \
$ANDROID_PRODUCT_OUT/apex/com.android.adbd/bin/adbd \
/proc/self/cwd/system/core/adb \
$ADB_TEST_BINARIES \
--show-region-summary=false

12
adb/coverage/show.sh Executable file
View file

@ -0,0 +1,12 @@
#!/bin/bash
set -euxo pipefail
OUTPUT_DIR=$(realpath $(dirname "$0"))
. "$OUTPUT_DIR"/include.sh
cd $ANDROID_BUILD_TOP
llvm-cov show --instr-profile="$OUTPUT_DIR"/adbd.profdata \
$ANDROID_PRODUCT_OUT/apex/com.android.adbd/bin/adbd \
/proc/self/cwd/system/core/adb \
$ADB_TEST_BINARIES

View file

@ -27,7 +27,10 @@
#include "adb_utils.h"
#include "fdevent.h"
#include "fdevent_epoll.h"
#if !defined(__linux__)
#include "fdevent_poll.h"
#endif
using namespace std::chrono_literals;
using std::chrono::duration_cast;

View file

@ -202,11 +202,22 @@ static void wait_service(unique_fd fd, std::string serial, TransportId transport
transport_id, &is_ambiguous, &error);
for (const auto& state : states) {
// wait-for-disconnect uses kCsOffline, we don't actually want to wait for 'offline'.
if ((t == nullptr && state == kCsOffline) || (t != nullptr && state == kCsAny) ||
(t != nullptr && state == t->GetConnectionState())) {
SendOkay(fd);
return;
if (state == kCsOffline) {
// Special case for wait-for-disconnect:
// We want to wait for USB devices to completely disappear, but TCP devices can
// go into the offline state, since we automatically reconnect.
if (!t) {
SendOkay(fd);
return;
} else if (!t->GetUsbHandle()) {
SendOkay(fd);
return;
}
} else {
if (t && (state == kCsAny || state == t->GetConnectionState())) {
SendOkay(fd);
return;
}
}
}