#!/bin/bash

# Copyright (c) 2010 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.

# --- BEGIN COMMON.SH BOILERPLATE ---
# Load common CrOS utilities.  Inside the chroot this file is installed in
# /usr/lib/crosutils.  Outside the chroot we find it relative to the script's
# location.
find_common_sh() {
  local common_paths=(/usr/lib/crosutils $(dirname "$(readlink -f "$0")"))
  local path

  SCRIPT_ROOT=
  for path in "${common_paths[@]}"; do
    if [ -r "${path}/common.sh" ]; then
      SCRIPT_ROOT=${path}
      break
    fi
  done
}

find_common_sh
. "${SCRIPT_ROOT}/common.sh" || (echo "Unable to load common.sh" && exit 1)
# --- END COMMON.SH BOILERPLATE ---

# Flags
DEFINE_string root ""      \
  "The root file system to check."

# Parse command line
FLAGS "$@" || exit 1
eval set -- "${FLAGS_ARGV}"

# Die on any errors
set -e

# Check all parts of a pipe
set -o pipefail

ROOT="$FLAGS_root"
if [[ ! -d "$ROOT" ]]; then
  echo "Error: Root FS does not exist ($ROOT)"
  exit 1
fi

BINARIES="$ROOT/usr/bin/Xorg
          $ROOT/usr/bin/chromeos-wm
          $ROOT/boot/vmlinuz
          $ROOT/sbin/session_manager
          $ROOT/bin/sed
          $ROOT/opt/google/chrome/chrome"

EXITCODE=0
for i in $BINARIES; do
  if ! [[ -f $i ]]; then
    echo test_build_root: Cannot find $i
    EXITCODE=1
  fi
done

# Extract the version number from lines like:
# kCrosAPIMinVersion = 29,
# kCrosAPIVersion = 30
extract_cros_version() {
  NAME="$1"
  FILE="$2"
  VERSION=$(perl -ne "print \$1 if /^\\s*${NAME}\\s*=\\s*(\\d+)/" "$FILE")
  test -z "$VERSION" && die "Failed to get $NAME from $FILE"
  echo $VERSION
}

# Check the libcros version compatibility, like we do in libcros at run time.
# See also platform/cros/version_check.cc and load.cc.
check_cros_version() {
  CHROME_CROS="${ROOT}/opt/google/chrome/include/chromeos_cros_api.h"
  SYSTEM_CROS="${ROOT}/usr/include/cros/chromeos_cros_api.h"

  if [ ! -f "$SYSTEM_CROS" ]; then
    echo "test_build_root: Missing libcros headers."
    return 1
  fi


  if [ ! -f "$CHROME_CROS" ]; then
    # For compatiblity with old versions of Chrome which don't install headers
    # and already check the libcros version, skip the check here.
    return 0
  fi

  # Get the version of libcros in the chromium tree.
  VERSION=$(extract_cros_version kCrosAPIVersion "${CHROME_CROS}")

  # Get the min version of libcros in the chromium os tree.
  MIN_VERSION=$(extract_cros_version kCrosAPIMinVersion "${SYSTEM_CROS}")

  # Get the max version of libcros in the chromium os tree.
  MAX_VERSION=$(extract_cros_version kCrosAPIVersion "${SYSTEM_CROS}")

  if [ "$MIN_VERSION" -gt "$VERSION" ]; then
    echo "test_build_root: System libcros not compatible with Chromium."
    echo "Chromium requires version $VERSION, but system provides $MIN_VERSION"
    echo "or later."
    return 1
  fi
  if [ "$VERSION" -gt "$MAX_VERSION" ]; then
    echo "test_build_root: System libcros not compatible with Chromium headers."
    echo "Chromium requires version $VERSION, but system provides $MAX_VERSION"
    echo "or earlier."
    return 1
  fi
  return 0
}

check_cros_version || EXITCODE=1

exit $EXITCODE
