// Copyright 2017 The Cobalt Authors. All Rights Reserved.
//
// 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.

// Defines an interface for setting arbitrary values to be logged (in a
// platform-specific way) whenever a crash occurs.  For example, a platform
// may implement this by uploading the data to a central crash report
// repository that can be examined later.
// Platforms typically have maximum crash log data sizes on the order of 16KB,
// but it varies per platform.
interface H5vccCrashLog {
  // Returns true if the string was successfully set in the crash log, and false
  // if for some reason the string could not be set in the crash log.
  // Sets a (key, value) string pair that should be logged if a crash occurs.
  boolean setString(DOMString key, DOMString value);

  // Induce a crash. This attempts, but does not guarantee, to cause a specified
  // type of crash. The result may vary by platform. This API is intended for
  // reliability testing only.
  void triggerCrash(H5vccCrashType intent);

  // Returns true if Watchdog client was registered.
  //   name, Watchdog client to register.
  //   description, information on the Watchdog client.
  //   watchdog_state, application state to continue monitoring client up to.
  //     Inclusive.
  //   time_interval_milliseconds, maximum number of milliseconds allowed
  //     between pings before triggering a Watchdog violation. Min value of
  //     1000.
  //   time_wait_milliseconds, number of milliseconds to initially wait before
  //     Watchdog violations can be triggered. Reapplies after client resumes
  //     from idle state due to application state changes.
  //   watchdog_replace, behavior with previously registered Watchdog clients
  //     of the same name.
  boolean register(DOMString name, DOMString description,
                   WatchdogState watchdog_state, long long time_interval_milliseconds,
                   long long time_wait_milliseconds, WatchdogReplace watchdog_replace);

  // Returns true if Watchdog client was unregistered. Name determines the
  // Watchdog client to unregister.
  boolean unregister(DOMString name);

  // Returns true if Watchdog client was pinged. Name determines the Watchdog
  // client to ping with ping_info which can either be empty or contain relevant
  // metadata. ping_info has a max length of 128.
  boolean ping(DOMString name, DOMString ping_info);

  // Returns a json string containing the Watchdog violations since the last
  // call, up to 200. Clears internal cache of Watchdog violations to prevent
  // duplicates. Timestamps are stored as strings due to int size constraints.
  // Example json:
  // {
  //   "test-name":{
  //     "description":"test-desc",
  //     "violations":[
  //       {
  //         "monitorState":"kApplicationStateStarted",
  //         "pingInfos":[
  //           {
  //             "info":"test-ping",
  //             "timestampMilliseconds":"1658972623547"
  //           }
  //         ],
  //         "registeredClients":[
  //           "test-name"
  //         ],
  //         "timeIntervalMilliseconds":"5000",
  //         "timeWaitMilliseconds":"0",
  //         "timestampLastPingedMilliseconds":"1658972623547",
  //         "timestampRegisteredMilliseconds":"1658972621890",
  //         "timestampViolationMilliseconds":"1658972629489",
  //         "violationDurationMilliseconds":"942"
  //       }
  //     ]
  //   }
  // }
  DOMString getWatchdogViolations();

  // Gets a persistent Watchdog setting that determines whether or not Watchdog
  // is enabled. When disabled, Watchdog behaves like a stub except that
  // persistent settings can still be get/set. Requires a restart to take
  // effect.
  boolean getPersistentSettingWatchdogEnable();

  // Sets a persistent Watchdog setting that determines whether or not Watchdog
  // is enabled. When disabled, Watchdog behaves like a stub except that
  // persistent settings can still be get/set. Requires a restart to take
  // effect.
  void setPersistentSettingWatchdogEnable(boolean enable_watchdog);

  // Gets a persistent Watchdog setting that determines whether or not a
  // Watchdog violation will trigger a crash.
  boolean getPersistentSettingWatchdogCrash();

  // Sets a persistent Watchdog setting that determines whether or not a
  // Watchdog violation will trigger a crash.
  void setPersistentSettingWatchdogCrash(boolean can_trigger_crash);
};
