#!/bin/bash
# Copyright (C) 2018 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 -e

function is_monolithic() {
  local out=$1
  gn args $out --list --short | grep 'monolithic_binaries = true' > /dev/null
  return $?
}

# If not set guess the OUT dir using the latest directory.
if [ ! -f "$OUT/args.gn" ]; then
  echo "OUT=$OUT doesn't look like an output directory."
  echo "Please specify a directory by doing: export OUT=out/xxx"
  exit 1
fi

# You can set the config to one of the files under test/configs e.g.
# CONFIG=ftrace.cfg or to :test. Defaults to :test.
CONFIG="${CONFIG:-:test}"

ninja -C $OUT traced traced_probes perfetto trace_to_text test/configs

set -x
adb push $OUT/traced /data/local/tmp/
adb push $OUT/traced_probes /data/local/tmp/
adb push $OUT/perfetto /data/local/tmp/
set +x

PREFIX=""
if ! is_monolithic $OUT;  then
  PREFIX="LD_LIBRARY_PATH=/data/local/tmp"
  set -x
  adb push $OUT/libtraced_shared.so /data/local/tmp/
  set +x
fi

CONFIG_DEVICE_PATH=$CONFIG
if [[ "$CONFIG" != ":test" ]]; then
  CONFIG_DEVICE_PATH=/data/local/tmp/$CONFIG.protobuf
  CONFIG_PATH=$OUT/$CONFIG.protobuf;
  if [[ ! -f $CONFIG_PATH ]]; then
    echo 'Config "'$CONFIG_PATH'" not known.'
    exit 1
  fi
  set -x
  adb push $CONFIG_PATH /data/local/tmp/
  set +x
fi

if tmux has-session -t demo; then
  tmux kill-session -t demo
fi
tmux -2 new-session -d -s demo

if tmux -V | awk '{split($2, ver, "."); if (ver[1] < 2) exit 1 ; else if (ver[1] == 2 && ver[2] < 1) exit 1 }'; then
  tmux set-option -g mouse on
else
  tmux set-option -g mode-mouse on
  tmux set-option -g mouse-resize-pane on
  tmux set-option -g mouse-select-pane on
  tmux set-option -g mouse-select-window on
fi

tmux split-window -v
tmux split-window -v

tmux select-layout even-vertical

tmux select-pane -t 0
tmux send-keys "clear" C-m
tmux send-keys "adb shell" C-m

tmux select-pane -t 1
tmux send-keys "clear" C-m
tmux send-keys "adb shell" C-m

tmux select-pane -t 2
tmux send-keys "clear" C-m
tmux send-keys "adb shell" C-m

sleep 2

tmux select-pane -t 1
tmux send-keys "$PREFIX /data/local/tmp/traced" Enter

tmux select-pane -t 0
tmux send-keys "$PREFIX /data/local/tmp/traced_probes" Enter

tmux select-pane -t 2
tmux send-keys "$PREFIX /data/local/tmp/perfetto -c $CONFIG_DEVICE_PATH -o /data/local/tmp/trace"

# Select consumer pane.
tmux select-pane -t 2

tmux -2 attach-session -t demo

TRACE=$HOME/Downloads/trace.json
echo -e "\n\x1b[32mPulling trace into $TRACE\x1b[0m"
set -x
adb pull /data/local/tmp/trace /tmp/trace.protobuf
$OUT/trace_to_text systrace < /tmp/trace.protobuf > $TRACE
