#!/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
CUR_DIR="$(realpath "$(dirname "${BASH_SOURCE[0]}")")"

export PATH="$PATH:$CUR_DIR"

if [ "$TMPDIR" == "" ]; then
  TMPDIR=/tmp
fi

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

function is_android {
  local out=$1
  gn args $out --list --short | grep 'target_os = "android"' 2>&1 >/dev/null
  return $?
}

function is_mac {
  ! test -d /proc
  return $?
}

function tmux_ensure_bash {
  if [[ $SHELL == *"fish" ]]; then
    tmux send-keys "bash" Enter
  fi
}

function reset_tracing {
  if is_android $OUT; then
    adb shell 'echo 0 > /d/tracing/tracing_on'
  elif ! is_mac; then
    if [ ! -w /sys/kernel/debug ]; then
      echo "debugfs not accessible, try sudo chown -R $USER /sys/kernel/debug"
      sudo chown -R $USER /sys/kernel/debug
    fi

    echo 0 > /sys/kernel/debug/tracing/tracing_on
  fi
}

function adb_supports_push_sync {
  adb --help 2>&1 | grep 'push.*\[--sync\]' 2>&1 >/dev/null
}

function push {
  if is_android $OUT; then
    local maybe_sync=''
    if adb_supports_push_sync; then
      maybe_sync='--sync '
    fi
    echo adb push $maybe_sync $1 $DIR
    adb push $maybe_sync $1 $DIR
  else
    echo cp $1 $DIR
    cp $1 $DIR
  fi
}

function pull {
  if is_android $OUT; then
    echo adb pull $DIR/$1 $2
    adb pull $DIR/$1 $2
  else
    echo mv $DIR/$1 $2
    mv $DIR/$1 $2
  fi
}

background=0

while getopts b o; do
  case "$o" in
    b) background=1;;
    *) echo "Invalid option $o"; exit;;
  esac
done

# 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}"

if is_android $OUT ; then
  DIR=/data/local/tmp
elif is_mac; then
  DIR=$(mktemp -d $TMPDIR/perfetto.XXXXXX)
else
  DIR=$(mktemp -p $TMPDIR -d perfetto.XXXXXX)
fi

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

push $OUT/traced
push $OUT/traced_probes
push $OUT/perfetto
reset_tracing

if is_android $OUT; then
  PREFIX="PERFETTO_CONSUMER_SOCK_NAME=@perfetto_test_consumer PERFETTO_PRODUCER_SOCK_NAME=@perfetto_test_producer"
else
  PREFIX=""
fi

if ! is_monolithic $OUT; then
  PREFIX="$PREFIX LD_LIBRARY_PATH=$DIR"
  push $OUT/libperfetto.so
fi

CONFIG_DEVICE_PATH="$CONFIG"
CMD_OPTS=""
if [[ "$CONFIG" == *.protobuf ]]; then
  CONFIG_DEVICE_PATH="$CONFIG"
  CONFIG_PATH=$OUT/$CONFIG;
  if [[ ! -f $CONFIG_PATH ]]; then
    echo 'Config "'$CONFIG_PATH'" not known.'
    exit 1
  fi
  push $CONFIG_PATH
elif [[ "$CONFIG" != ":test" ]]; then
  CONFIG_DEVICE_PATH="$(basename $CONFIG)"
  CONFIG_PATH=test/configs/$CONFIG
  # Check if this is a valid absolute path
  if [[ ! -f $CONFIG_PATH ]]; then
    CONFIG_PATH=$CONFIG
    if [[ ! -f $CONFIG_PATH ]]; then
      echo 'Config "'$CONFIG'" not known.'
      exit 1
    fi
  fi
  CMD_OPTS="--txt $CMD_OPTS"
  push $CONFIG_PATH
fi

POSTFIX=""

if [[ background -eq 1 ]]; then
  PREFIX="$PREFIX nohup"
  POSTFIX=" &> /dev/null &"
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
if is_android $OUT; then
  tmux send-keys "adb shell" C-m
fi

tmux select-pane -t 1
tmux send-keys "clear" C-m
if is_android $OUT; then
  tmux send-keys "adb shell" C-m
fi

tmux select-pane -t 2
tmux send-keys "clear" C-m
if is_android $OUT; then
  tmux send-keys "adb shell" C-m
fi

sleep 2

tmux select-pane -t 1
tmux_ensure_bash
tmux send-keys "PS1='[traced_probes]$ '" Enter
tmux send-keys "cd $DIR" Enter
tmux send-keys "$PREFIX ./traced $POSTFIX" Enter

tmux select-pane -t 0
tmux_ensure_bash
tmux send-keys "PS1='[traced]$ '" Enter
tmux send-keys "cd $DIR" Enter
tmux send-keys "$PREFIX PERFETTO_METATRACE_FILE=mtrace ./traced_probes $POSTFIX" Enter

tmux select-pane -t 2
tmux_ensure_bash
tmux send-keys "PS1='[consumer]$ '" Enter
tmux send-keys "cd $DIR" Enter
tmux send-keys "$PREFIX ./perfetto $CMD_OPTS -c $CONFIG_DEVICE_PATH -o trace $POSTFIX"

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

tmux -2 attach-session -t demo
if [[ background -eq 1 ]]; then
  exit 0;
fi

reset_tracing

TRACE=$HOME/Downloads/trace
pull trace /tmp/trace.protobuf
echo -e "\n\x1b[32mPulling trace into $TRACE.pbtext\x1b[0m"
$OUT/trace_to_text text < /tmp/trace.protobuf > $TRACE.pbtext
echo -e "\n\x1b[32mPulling trace into $TRACE.json\x1b[0m"
$OUT/trace_to_text systrace < /tmp/trace.protobuf > $TRACE.json
# Keep this last so it can fail.
pull mtrace /tmp/mtrace.json
# Add [ to beginning of file and replace trailing , with ] to turn into valid
# JSON array.
sed -i -e '$ s/.$/]/' /tmp/mtrace.json
sed -i -e '1s/^/[/' /tmp/mtrace.json
