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:
commit
992f08e78d
10 changed files with 190 additions and 82 deletions
|
@ -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"],
|
||||
},
|
||||
},
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
2
adb/coverage/.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
|||
/adbd.profdata
|
||||
/report
|
114
adb/coverage/gen_coverage.sh
Executable file
114
adb/coverage/gen_coverage.sh
Executable 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
5
adb/coverage/include.sh
Normal 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
22
adb/coverage/report.sh
Executable 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
12
adb/coverage/show.sh
Executable 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
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue