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

# Serivce to persist crash test state files across reboots.
# This should only be installed on test images.

description "Set up crash test flag files"
author      "chromium-os-dev@chromium.org"

# Start after startup, when /var/ is mounted.
# This will be before crash_reporter starts because `stopping` is a hook,
# meaning that "the emitter waits for it to complete before carrying on", per
# http://upstart.ubuntu.com/cookbook/#hooks.
# crash_reporter has `start on starting boot-services`, so it will start just
# before boot_services. boot_services, in turn, `starts on stopped startup`.
start on stopping startup
task
oom score -100  # This is extremely unlikely to run out of memory

script
  (
    copy_and_decrement_or_remove() {
      source="$1"
      cp -v "${source}" /run/crash_reporter/
      if [ "$(cat "${source}")" -le 1 ]; then
        rm -v "${source}"
      else
        echo "$(($(cat "${source}") - 1))" > ${source}
      fi
    }

    set -x
    echo "$(date --iso-8601=ns): Running persist-crash-test"
    source_dir="/mnt/stateful_partition/unencrypted/preserve"
    if [ -f "${source_dir}/crash-test-in-progress" ]; then
      copy_and_decrement_or_remove "${source_dir}/crash-test-in-progress"
    fi

    if [ -f "${source_dir}/mock-consent" ]; then
      copy_and_decrement_or_remove "${source_dir}/mock-consent"
    fi
    echo "$(date --iso-8601=ns): Finished persist-crash-test"
  ) >> /run/crash-reporter-early-init.log 2>&1
end script
