Test Manifest TOML
==================

This linter verifies syntax for ManifestParser TOML files.

Run Locally
-----------

This Test Manifest linter can be run using mach:

.. parsed-literal::

    $ ./mach lint --linter test-manifest-toml <file paths>


Configuration
-------------

The configuration excludes all non-ManifestParser TOML files (as well as
generated TOML manifests).

Conditional Expressions
-----------------------
In order to make conditional expressions (e.g. **skip-if**, **run-if**)
consistent and machine readable it is important that the
variable comparisons come before flags and are in a specific
order (ranking). Not all comparisons are required, but when
they appear they should be in ranked order.

What to put in **run-if**: should specify platform(s) where this test *should* run. This can be very general, e.g. ``os == 'linux'``.

What to put in **skip-if**: platforms where the test currently does not run and has a bug to resolve the issue (with as much detail on the buggy conditions as possible).

Expression ranks:

1. **os** == 'android' (or 'linux', 'mac', 'win')
2. **os_version** == '14' (see below: Platforms that are currently supported in CI)
3. **arch** == 'aarch64' (or 'x86', 'x86_64', deprecated 'armeabi-v7a')
4. **display** == 'wayland' (or 'x11' -- on linux only)
5. **buildapp** == 'browser'
6. **appname** == 'firefox' (or 'seamonkey', 'thunderbird')
7. **build_type** FLAG, one of: asan, ccov, debug, tsan, opt
8. **variant** FLAG

   * a11y_checks
   * condprof
   * e10s
   * emewmf
   * fission
   * headless
   * http2
   * http3
   * inc_origin_init
   * mda_gpu
   * msix
   * nogpu
   * remote_async
   * snapshot
   * socketprocess_e10s
   * socketprocess_networking
   * swgl
   * trainhop
   * vertical_tab
   * wmfme
   * xorigin

9. **other** FLAG

   * artifact
   * crashreporter
   * datareporting
   * devedition
   * early_beta_or_earlier
   * false (*deprecated*)
   * gecko_profiler
   * isolated_process
   * is_emulator
   * is_ubuntu (*deprecated*)
   * msix
   * nightly_build
   * release_or_beta
   * require_signing
   * sessionHistoryInParent
   * sync
   * true
   * updater
   * verify
   * verify_standalone


Notes
-----
Certain build types have special significance:
* ``opt`` implies => ``!asan && !ccov && !debug && !tsan``
* Instead of ``!debug`` use separate conditions for ``asan``, ``ccov`` (rarely used), ``opt``, and ``tsan``

Errors Detected
---------------
* Invalid TOML
* Disabling a path by commenting out the section
* Conditional contains explicit ||
* Conditional is NOT an array
* Missing include file
* Invalid combinations of platform and build-types (not present in CI)

   * ``"os == 'linux' && os_version == '22.04' && asan"``
   * ``"os == 'linux' && os_version == '22.04' && tsan"``
   * ``"os == 'win' && tsan``

* Non canonically formed conditions

   * superfluous expression parenthesis
   * unknown variables, flags or values
   * variables and flags out of canonical order

Warnings Detected (fixable)
---------------------------
* Missing DEFAULT section
* Sections not in alphabetical order
* Section name not double quoted

Non idiomatic manifest warnings (fixable)
-----------------------------------------
* Using ``processor`` instead of ``arch``
* Using ``bits`` instead of ``arch``
* Using ``android_version`` instead of ``os_version``
* Using platform combination variables: ``apple_catalina``, ``apple_silicon``, ``win10_2009``, ``win11_2009`` (unused)
* Platforms no longer used by CI: ``Linux 18.04`` (not enforced -- will be deprecated soon), ``MacOS 11.20``, ``Windows 11.2009``
* Not specifying display on Linux
* Specifying display ``x11`` on Linux 22.04 where only ``wayland`` is supported
* Specifying display ``wayland`` on Linux 24.04 where only ``x11`` is supported
* Using ``!debug`` instead of ``asan``, ``opt``, or ``tsan``
* Using literal boolean values for single variables like ``debug == false``

Platforms that are currently supported in CI
--------------------------------------------
* ``os`` one of ``android``, ``linux``, ``mac``, ``win``
* ``os_version`` depends on os

   * ``os == 'android'``

      * ``os_version == '14'`` arch: aarch64, x86_64

   * ``os == 'linux'``

      * ``os_version == '22.04'`` arch: aarch64, x86_64
      * ``os_version == '24.04'`` arch: aarch64, x86_64

   * ``os == 'mac'``

      * ``os_version == '10.15'`` arch: x86_64
      * ``os_version == '14.70'`` arch: x86_64
      * ``os_version == '15.30'`` arch: aarch64

   * ``os == 'win'``

      * ``os_version == '10.2009'`` arch: x86_64
      * ``os_version == '10.26100'`` arch: aarch64, x86, x86_64

* ``display`` required for linux

   * ``os == 'linux'``

      * ``os_version == '22.04'`` display: wayland
      * ``os_version == '24.04'`` display: x11


Sources
-------

* :searchfox:`Configuration (YAML) <tools/lint/test-manifest-toml.yml>`
* :searchfox:`Source <tools/lint/test-manifest-toml/__init__.py>`

Developer Information
---------------------
* The linter relies on code in: ``testing/mozbase/manifestparser/manifestparser/``
   * In particular the "legal" values for variables are defined in: ``token.py``
* The linter self-test can be run with: ``./mach python-test --subsuite mozlint tools/lint/test/test_manifest_toml.py``
