12d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng#!/bin/bash
22d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng
32d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng#
42d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng# Copyright 2015 The Android Open Source Project
52d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng#
62d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng# Licensed under the Apache License, Version 2.0 (the "License");
72d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng# you may not use this file except in compliance with the License.
82d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng# You may obtain a copy of the License at
92d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng#
102d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng# http://www.apache.org/licenses/LICENSE-2.0
112d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng#
122d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng# Unless required by applicable law or agreed to in writing, software
132d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng# distributed under the License is distributed on an "AS IS" BASIS,
142d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
152d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng# See the License for the specific language governing permissions and
162d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng# limitations under the License.
172d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng#
182d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng
192d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng# Builds and pushes the test vendor library to a connected device and starts
202d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng# logcat with project-specific tag filters. If the --test-channel flag is set,
212d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng# logcat is started in a separate process and the test channel is run in the
228bb61fe28ac339276acf1b5b1616a6e56e2cccacDennis Cheng# current shell. The kTestChannelEnabled flag must be set in the vendor manager
238bb61fe28ac339276acf1b5b1616a6e56e2cccacDennis Cheng# if the test channel is to be used. Also ensure that 'lunch' has been run for
248bb61fe28ac339276acf1b5b1616a6e56e2cccacDennis Cheng# the appropriate device.
252d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng
262d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Chengif [[ "$#" -ne 2 && "$#" -ne 4 ]]; then
272d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng  echo "Usage:"
282d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng  echo "./build_and_run.sh [/path/to/aosp] [device_name] or"
292d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng  echo "./build_and_run.sh [/path/to/aosp] [device_name] --test-channel [port]"
302d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng  exit 1
312d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Chengfi
322d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng
332d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng# Exit the script if any command fails.
342d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Chengset -e
352d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng
362d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng# The home directory for AOSP.
372d96c88025c80d4d7e0e341cfdbf278596340b66Dennis ChengAOSP_ABS=$1
382d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng# The name of the device to build for.
392d96c88025c80d4d7e0e341cfdbf278596340b66Dennis ChengDEVICE=$2
402d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng
412d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng# The location of Bluetooth within AOSP.
422d96c88025c80d4d7e0e341cfdbf278596340b66Dennis ChengBT_REL=/system/bt
432d96c88025c80d4d7e0e341cfdbf278596340b66Dennis ChengBT_ABS=${AOSP_ABS}${BT_REL}
442d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng
452d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng# The location of the test vendor library.
462d96c88025c80d4d7e0e341cfdbf278596340b66Dennis ChengTEST_VENDOR_LIB_REL=/vendor_libs/test_vendor_lib
472d96c88025c80d4d7e0e341cfdbf278596340b66Dennis ChengTEST_VENDOR_LIB_ABS=${BT_ABS}${TEST_VENDOR_LIB_REL}
482d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng
492d96c88025c80d4d7e0e341cfdbf278596340b66Dennis ChengDEVICE_TARGET_REL=/out/target/product
502d96c88025c80d4d7e0e341cfdbf278596340b66Dennis ChengDEVICE_TARGET_ABS=${AOSP_ABS}${DEVICE_TARGET_REL}
512d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng
522d96c88025c80d4d7e0e341cfdbf278596340b66Dennis ChengVENDOR_SYMBOLS_REL=/symbols/system/vendor/lib
532d96c88025c80d4d7e0e341cfdbf278596340b66Dennis ChengVENDOR_SYMBOLS_ABS=${DEVICE_TARGET_ABS}/${DEVICE}/${VENDOR_SYMBOLS_REL}
542d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng
552d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng# The name of the object built by the test vendor library.
562d96c88025c80d4d7e0e341cfdbf278596340b66Dennis ChengTEST_VENDOR_LIB=test-vendor.so
572d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng# The name of the regular vendor object to be replaced by $TEST_VENDOR_LIB.
582d96c88025c80d4d7e0e341cfdbf278596340b66Dennis ChengVENDOR_LIB=libbt-vendor.so
59bf7db3143fda4dc8391c92ec25dc93b9725ec225Dennis Cheng# The config file specifying controller properties.
60bf7db3143fda4dc8391c92ec25dc93b9725ec225Dennis ChengCONTROLLER_PROPERTIES=controller_properties.json
612d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng
622d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Chengif [[ "$#" -eq 4 && $3 == "--test-channel" ]]; then
632d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng  TEST_CHANNEL_PORT=$4
642d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng  TEST_CHANNEL_REL=/scripts
652d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng  TEST_CHANNEL_ABS=${TEST_VENDOR_LIB_ABS}${TEST_CHANNEL_REL}
662d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng
672d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng  # Start logcat in a subshell.
682d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng  x-terminal-emulator -e "scripts/build_and_run.sh ${AOSP_ABS} ${DEVICE}"
692d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng
702d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng  echo "Setting up build environment."
712d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng  cd ${AOSP_ABS}
722d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng  source build/envsetup.sh
732d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng
742d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng  # Forward local port to the same port on the device.
752d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng  echo "Forwarding port ${TEST_CHANNEL_PORT} to device."
762d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng  adb forward tcp:${TEST_CHANNEL_PORT} tcp:${TEST_CHANNEL_PORT}
772d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng
782d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng  # Turn Bluetooth on. Requires user approval via a dialog on the device.
792d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng  echo "Enabling Bluetooth. Please see dialog on device."
802d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng  adb shell am start -a android.bluetooth.adapter.action.REQUEST_ENABLE
812d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng
822d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng  # Start the test channel once Bluetooth is on and logcat has started.
832d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng  read -p "Press [ENTER] once Bluetooth is enabling AND logcat has started."
842d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng
852d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng  # Start the test channel.
862d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng  python ${TEST_CHANNEL_ABS}/test_channel.py localhost ${TEST_CHANNEL_PORT}
872d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Chengelse
882d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng  echo "Setting up build environment."
892d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng  cd ${AOSP_ABS}
902d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng  source build/envsetup.sh
912d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng
922d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng  echo "Navigating to test vendor library: ${TEST_VENDOR_LIB_ABS}"
932d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng  cd ${TEST_VENDOR_LIB_ABS}
942d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng
952d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng  echo "Building test vendor library."
962d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng  mm
972d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng
982d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng  echo "Remounting device rootfs."
992d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng  adb shell mount -o remount,rw /
1002d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng  adb remount
1012d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng
1022d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng  # Replace the actual vendor library with the test vendor library.
1032d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng  mv ${DEVICE_TARGET_ABS}/${DEVICE}/system/lib/${TEST_VENDOR_LIB} \
1042d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng    ${VENDOR_SYMBOLS_ABS}/${VENDOR_LIB}
1052d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng
1062d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng  # Push the test vendor library to the device.
1072d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng  echo "Pushing the test vendor library to device: $DEVICE"
1082d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng  adb push ${VENDOR_SYMBOLS_ABS}/${VENDOR_LIB} /vendor/lib
1092d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng
110bf7db3143fda4dc8391c92ec25dc93b9725ec225Dennis Cheng  echo "Pushing controller properties."
111bf7db3143fda4dc8391c92ec25dc93b9725ec225Dennis Cheng  adb push ${TEST_VENDOR_LIB_ABS}/data/${CONTROLLER_PROPERTIES} /etc/bluetooth/
112bf7db3143fda4dc8391c92ec25dc93b9725ec225Dennis Cheng
1132d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng  echo "Pushing libevent."
1142d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng  adb push ${DEVICE_TARGET_ABS}/${DEVICE}/system/lib/libevent.so /system/lib/
1152d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng
1162d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng  echo "Pushing libchrome."
1172d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng  adb push ${DEVICE_TARGET_ABS}/${DEVICE}/system/lib/libchrome.so /system/lib/
1182d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng
1192d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng  # Clear logcat.
1202d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng  adb logcat -c
1212d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng
1222d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng  # Run logcat with filters.
1232d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng  adb logcat bt_btif:D bt_btif_core:D bt_hci:D bt_main:D bt_vendor:D \
1242d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng   bte_logmsg:D command_packet:D dual_mode_controller:D event_packet:D \
1258bb61fe28ac339276acf1b5b1616a6e56e2cccacDennis Cheng   hci_transport:D hci_handler:D packet:D packet_stream:D \
1268bb61fe28ac339276acf1b5b1616a6e56e2cccacDennis Cheng   test_channel_transport:D vendor_manager:D *:S
1272d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Chengfi
128