// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

library fuchsia.feedback;

using fuchsia.mem;
using zx;

/// Provides the ability to file crash reports.
[Discoverable]
protocol CrashReporter {
    /// Files a crash `report`.
    ///
    /// This could mean generating a crash report in a local crash report database or uploading the
    /// crash report to a remote crash server depending on the FIDL server's configuration.
    File(CrashReport report) -> () error zx.status;
};

const uint32 MAX_PROGRAM_NAME_LENGTH = 1024;
const uint32 MAX_NUM_ANNOTATIONS_PER_CRASH_REPORT = 32;
const uint32 MAX_NUM_ATTACHMENTS_PER_CRASH_REPORT = 16;
const uint32 MAX_EVENT_ID_LENGTH = 128;

/// Represents a crash report.
resource table CrashReport {
    /// The name of the program that crashed, e.g., the process or component's name.
    1: string:MAX_PROGRAM_NAME_LENGTH program_name;

    /// How long the program was running before it crashed.
    6: zx.duration program_uptime;

    /// The specific report that depends on the type of crashes.
    2: SpecificCrashReport specific_report;

    /// A vector of key-value string pairs representing arbitrary data that should be attached to a
    /// crash report.
    ///
    /// Keys should be unique as only the latest value for a given key in the vector will be
    /// considered.
    3: vector<Annotation>:MAX_NUM_ANNOTATIONS_PER_CRASH_REPORT annotations;

    /// A vector of key-value string-to-VMO pairs representing arbitrary data that should be
    /// attached to a crash report.
    ///
    /// Keys should be unique as only the latest value for a given key in the vector will be
    /// considered.
    4: vector<Attachment>:MAX_NUM_ATTACHMENTS_PER_CRASH_REPORT attachments;

    /// A text ID that the crash server can use to group multiple crash reports related to the
    /// same event.
    ///
    /// Unlike the crash signature, crash reports sharing the same ID correspond to different
    /// crashes, but can be considered as belonging to the same event, e.g., a crash in a low-level
    /// server causing a crash in a high-level UI widget.
    5: string:MAX_EVENT_ID_LENGTH event_id;
};

/// Represents a specific crash report.
///
/// Add a new member when the server needs to special case how it handles certain annotations and
/// attachments for a given type of crashes, e.g., a `RuntimeCrashReport` for Javascript.
flexible resource union SpecificCrashReport {
    /// Intended for arbitrary crashes, e.g., OOM, out-of-disk.
    1: GenericCrashReport generic;

    /// Intended for a native exception.
    2: NativeCrashReport native;

    /// Intended for a Dart exception.
    3: RuntimeCrashReport dart;
};

const uint32 MAX_CRASH_SIGNATURE_LENGTH = 128;

/// Represents a generic crash report.
table GenericCrashReport {
    /// A text signature that the crash server can use to track the same crash over time, e.g.,
    /// "kernel-panic" or "oom".
    ///
    /// Unlike the event ID, crash reports sharing the same signature correspond to the same crash,
    /// but happening over multiple events, e.g., a null pointer exception in a server whenever
    /// asked the same request.
    ///
    /// Must match [a-z\-]+, i.e. only lowercase letters and hyphens or this will result in a
    /// ZX_ERR_INVALID_ARGS epitaph.
    1: string:MAX_CRASH_SIGNATURE_LENGTH crash_signature;
};

/// Represents a crash report for a native exception out of which the client has built a minidump.
resource table NativeCrashReport {
    /// The core dump in the Minidump format.
    1: fuchsia.mem.Buffer minidump;
};

const uint32 MAX_EXCEPTION_TYPE_LENGTH = 128;
const uint32 MAX_EXCEPTION_MESSAGE_LENGTH = 2048;

/// Represents a crash report for a runtime exception, applicable to most languages.
resource table RuntimeCrashReport {
    /// The exception type, e.g., "FileSystemException".
    1: string:MAX_EXCEPTION_TYPE_LENGTH exception_type;

    /// The exception message, e.g., "cannot open file".
    2: string:MAX_EXCEPTION_MESSAGE_LENGTH exception_message;

    /// The text representation of the exception stack trace.
    3: fuchsia.mem.Buffer exception_stack_trace;
};
