/* Any copyright is dedicated to the Public Domain.
 * http://creativecommons.org/publicdomain/zero/1.0/ */
/* global BrowserTestUtils, ok, gBrowser, add_task */

"use strict";

/**
 * Checks that we set the CPUMicrocodeVersion annotation.
 * This is a Windows-specific crash annotation.
 */
if (AppConstants.platform == "win") {
  add_task(async function test_cpu_microcode_version_annotation() {
    await BrowserTestUtils.withNewTab(
      {
        gBrowser,
      },
      async function (browser) {
        // Crash the tab
        let annotations = await BrowserTestUtils.crashFrame(browser);

        ok(
          "CPUMicrocodeVersion" in annotations,
          "contains CPU microcode version"
        );
      }
    );
  });
}

/**
 * Checks that Linux sandbox violations are reported as SIGSYS crashes with
 * the syscall number provided in the address field of the minidump's exception
 * stream.
 */
if (AppConstants.platform == "linux") {
  add_task(async function test_sandbox_violation_is_sigsys() {
    await BrowserTestUtils.withNewTab(
      {
        gBrowser,
      },
      async function (browser) {
        // Crash the tab
        let annotations = await BrowserTestUtils.crashFrame(
          browser,
          true,
          true,
          /* Default browsing context */ null,
          { crashType: "CRASH_SYSCALL" }
        );

        const stackTraces = JSON.parse(annotations.StackTraces);

        Assert.ok(
          stackTraces.crash_type.startsWith("SIGSYS"),
          "The crash type is SIGSYS"
        );

        function chroot_syscall_number() {
          // We crash by calling chroot(), see BrowserTestUtilsChild.sys.mjs
          switch (Services.sysinfo.get("arch")) {
            case "x86-64":
              return "0xa1";
            case "aarch64":
              return "0x33";
            default:
              return "0x3d";
          }
        }

        Assert.equal(
          stackTraces.crash_address,
          chroot_syscall_number(),
          "The address corresponds to the chroot() syscall number"
        );
      }
    );
  });
}
