# 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.

# Shell function library for functions specific to creating test
# images from dev images.  This file also contains additional
# functions and initialization shared between build_image and
# mod_image_for_test.sh.
#

# Emerges chromeos-test onto the image.
emerge_chromeos_test() {
  # Determine the root dir for test packages.
  local root_dev_dir="${root_fs_dir}/usr/local"

  emerge_to_image --root="${root_fs_dir}" chromeos-test-init
  emerge_to_image --root="${root_dev_dir}" chromeos-test
}

prepare_hwid_for_factory() {
  local hwid_dest="$1/hwid"
  local hwid_src="${BOARD_ROOT}/usr/share/chromeos-hwid"

  # Force refreshing source folder in build root folder
  sudo rm -rf "${hwid_src}" "${hwid_dest}"
  emerge_to_image chromeos-hwid
  if [ -d "${hwid_src}" ]; then
    # TODO(hungte) After being archived by chromite, the HWID files will be in
    # factory_test/hwid; we should move it to top level folder.
    cp -r "${hwid_src}" "${hwid_dest}"
  else
    echo "Skipping HWID: No HWID bundles found."
  fi
}

# Converts a dev image into a test or factory test image
# Takes as an arg the name of the image to be created.
mod_image_for_test () {
  local image_name="$1"

  trap unmount_image EXIT
  mount_image "${BUILD_DIR}/${image_name}" \
    "${root_fs_dir}" "${stateful_fs_dir}"

  emerge_chromeos_test

  BACKDOOR=0
  if [ $FLAGS_standard_backdoor -eq $FLAGS_TRUE ]; then
    BACKDOOR=1
  fi

  local mod_test_script="${SCRIPTS_DIR}/mod_for_test_scripts/test_setup.sh"
  # Run test setup script to modify the image
  sudo -E GCLIENT_ROOT="${GCLIENT_ROOT}" ROOT_FS_DIR="${root_fs_dir}" \
    STATEFUL_DIR="${stateful_fs_dir}" ARCH="${ARCH}" BACKDOOR="${BACKDOOR}" \
    BOARD_ROOT="${BOARD_ROOT}" \
    "${mod_test_script}"

  # Legacy parameter (used by mod_image_for_test.sh --factory)
  [ -n "${FLAGS_factory}" ] || FLAGS_factory=${FLAGS_FALSE}

  if [ ${FLAGS_factory} -eq ${FLAGS_TRUE} ] ||
      should_build_image "${CHROMEOS_FACTORY_TEST_IMAGE_NAME}"; then
    emerge_to_image --root="${root_fs_dir}" factorytest-init
    INSTALL_MASK="${FACTORY_TEST_INSTALL_MASK}"
    emerge_to_image --root="${root_fs_dir}/usr/local" \
      chromeos-base/autotest chromeos-base/autotest-all \
      chromeos-base/chromeos-factory
    prepare_hwid_for_factory "${BUILD_DIR}"

    local mod_factory_script
    mod_factory_script="${SCRIPTS_DIR}/mod_for_factory_scripts/factory_setup.sh"
    # Run factory setup script to modify the image
    sudo -E GCLIENT_ROOT="${GCLIENT_ROOT}" ROOT_FS_DIR="${root_fs_dir}" \
            BOARD="${BOARD}" "${mod_factory_script}"
  fi

  # Re-run ldconfig to fix /etc/ldconfig.so.cache.
  sudo ldconfig -r "${root_fs_dir}"

  cleanup_mounts
  trap - EXIT

  if [[ ${skip_kernelblock_install} -ne 1 ]]; then
    # Now make it bootable with the flags from build_image.
    if should_build_image ${image_name}; then
      "${SCRIPTS_DIR}/bin/cros_make_image_bootable" "${BUILD_DIR}" \
         ${image_name} --force_developer_mode
    fi
  fi
}
