#!/bin/bash

# Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

# Script to generate stackdumps from BVT failures.

# This can only run inside the chroot since we need minidump_stackwalk.
. "$(dirname $0)/common.sh" || { echo "Unable to load common.sh"; exit 1; }
assert_inside_chroot "$@"

function usage() {
    echo "Usage: $0 url_to_debug_tgz url_to_bvt_test_results"
}

if [ -z "$1" ] ; then
  usage
  die "The URL to symbols tarball (debug.tgz) is required"
fi

if [ -z "$2" ] ; then
  usage
  die "The URL to BVT test results is required"
fi

# Die on any errors.
set -e

BREAKPAD_DIR="debug/breakpad"
DEBUG_TGZ=$(basename $1)
STACKS_GENERATED=""
OUTPUT_DIR=$(mktemp -d)

function generate_stacktrace() {
  echo "$1.txt"
  minidump_stackwalk $1 ${OUTPUT_DIR}/${BREAKPAD_DIR} > $1.txt 2> /dev/null
}

function find_and_generate_stacktraces() {
  find ${OUTPUT_DIR} -name *.dmp |
    while read filename ; do
      generate_stacktrace ${filename}
    done
}

function cleanup() {
  if [ -n "${OUTPUT_DIR}" -a -z "${STACKS_GENERATED}" ] ; then
    rm -rf ${OUTPUT_DIR}
  fi
}

trap cleanup INT TERM EXIT

info "Downloading symbols tarball..."
wget -P ${OUTPUT_DIR} $1
info "Extracting breakpad symbols..."
tar zxf ${OUTPUT_DIR}/${DEBUG_TGZ} -C ${OUTPUT_DIR} ${BREAKPAD_DIR}
rm ${OUTPUT_DIR}/${DEBUG_TGZ}
info "Downloading minidumps from test results..."
wget -q -nv -r -np -A "*.dmp" -P ${OUTPUT_DIR} $2
info "Generating stack traces..."
STACKS_GENERATED=$(find_and_generate_stacktraces)
echo $STACKS_GENERATED
if [ -z "${STACKS_GENERATED}" ] ; then
  warn "No minidumps found"
fi
