import copy
import os
import pathlib
from unittest import mock

import conftest
import mozunit
import pytest
import six

from talos.config import (
    DEFAULTS,
    ConfigurationError,
    get_active_tests,
    get_browser_config,
    get_config,
    get_configs,
    get_test,
)
from talos.test import PageloaderTest

ORIGINAL_DEFAULTS = copy.deepcopy(DEFAULTS)


class mock_test(PageloaderTest):
    keys = [
        "tpmanifest",
        "tpcycles",
        "tppagecycles",
        "tprender",
        "tpchrome",
        "tpmozafterpaint",
        "fnbpaint",
        "tploadnocache",
        "firstpaint",
        "userready",
        "testeventmap",
        "base_vs_ref",
        "mainthread",
        "resolution",
        "cycles",
        "gecko_profile",
        "gecko_profile_interval",
        "gecko_profile_entries",
        "tptimeout",
        "win_counters",
        "linux_counters",
        "mac_counters",
        "tpscrolltest",
        "xperf_counters",
        "timeout",
        "shutdown",
        "profile_path",
        "xperf_providers",
        "xperf_user_providers",
        "xperf_stackwalk",
        "format_pagename",
        "filters",
        "preferences",
        "extensions",
        "setup",
        "cleanup",
        "lower_is_better",
        "alert_threshold",
        "unit",
        "webextensions",
        "profile",
        "tpmozafterpaint",
        "url",
    ]

    tpmozafterpaint = "value"
    firstpaint = "value"
    userready = "value"
    fnbpaint = "value"


class Test_get_active_tests(object):
    def test_raises_exception_for_undefined_test(self):
        with pytest.raises(ConfigurationError):
            get_active_tests({"activeTests": "undefined_test"})

        with pytest.raises(ConfigurationError):
            get_active_tests({"activeTests": "  undefined_test     "})

        with pytest.raises(ConfigurationError):
            get_active_tests({"activeTests": "undef_test:undef_test2:undef_test3"})


class Test_get_test(object):
    global_overrides = {
        "tpmozafterpaint": "overriden",
        "firstpaint": "overriden",
        "userready": "overriden",
        "fnbpaint": "overriden",
    }

    config = {"webserver": "test_webserver"}

    def test_doesnt_override_specific_keys_unless_they_are_null(self):
        test_instance = mock_test()
        test_dict = get_test({}, self.global_overrides, [], test_instance)

        assert test_dict["tpmozafterpaint"] == "value"
        assert test_dict["firstpaint"] == "value"
        assert test_dict["userready"] == "value"
        assert test_dict["fnbpaint"] == "value"

        # nulls still get overriden
        test_instance = mock_test(
            tpmozafterpaint=None, firstpaint=None, userready=None, fnbpaint=None
        )
        test_dict = get_test({}, self.global_overrides, [], test_instance)

        assert test_dict["tpmozafterpaint"] == "overriden"
        assert test_dict["firstpaint"] == "overriden"
        assert test_dict["userready"] == "overriden"
        assert test_dict["fnbpaint"] == "overriden"

    @mock.patch("talos.config.open", create=True)
    def test_interpolate_keys(self, mock_open):
        mock_open.return_value = mock.MagicMock(readlines=lambda: [])

        test_instance = mock_test(
            url="${talos}/test_page.html", tpmanifest="${talos}/file.manifest"
        )

        test_dict = get_test(self.config, self.global_overrides, [], test_instance)
        assert test_dict["url"].startswith("http://test_webserver/")
        assert "${talos}" not in test_dict["url"]
        assert "${talos}" not in test_dict["tpmanifest"]

    def test_build_tpmanifest(self, tmpdir):
        manifest_file = tmpdir.join("file.manifest").ensure(file=True)
        test_instance = mock_test(url="test_page.html", tpmanifest=str(manifest_file))

        test_dict = get_test(self.config, self.global_overrides, [], test_instance)
        assert test_dict["tpmanifest"].endswith(".develop")

    def test_add_counters(self):
        test_instance = mock_test(
            linux_counters=None,
            mac_counters=[],
            win_counters=["counter_a"],
            xperf_counters=["counter_a", "counter_extra"],
        )

        counters = ["counter_a", "counter_b", "counter_c"]
        test_dict = get_test(
            self.config, self.global_overrides, counters, test_instance
        )

        assert test_dict["linux_counters"] == counters
        assert test_dict["mac_counters"] == counters
        assert test_dict["win_counters"] == counters
        assert set(test_dict["xperf_counters"]) == set(counters + ["counter_extra"])


class Test_get_browser_config(object):
    required = (
        "extensions",
        "browser_path",
        "browser_wait",
        "extra_args",
        "buildid",
        "env",
        "init_url",
        "webserver",
    )
    optional = [
        "bcontroller_config",
        "child_process",
        "debug",
        "debugger",
        "debugger_args",
        "develop",
        "e10s",
        "process",
        "framework",
        "repository",
        "sourcestamp",
        "symbols_path",
        "test_timeout",
        "xperf_path",
        "error_filename",
        "no_upload_results",
        "subtests",
        "preferences",
    ]

    def test_that_contains_title(self):
        config_no_optionals = dict.fromkeys(self.required, "")
        config_no_optionals.update(title="is_mandatory")

        browser_config = get_browser_config(config_no_optionals)
        assert browser_config["title"] == "is_mandatory"

    def test_raises_keyerror_for_missing_title(self):
        config_missing_title = dict.fromkeys(self.required, "")

        with pytest.raises(KeyError):
            get_browser_config(config_missing_title)

    def test_raises_keyerror_for_required_keys(self):
        config_missing_required = dict.fromkeys(self.required, "")
        config_missing_required.update(title="is_mandatory")
        del config_missing_required["extensions"]

        with pytest.raises(KeyError):
            get_browser_config(config_missing_required)

    def test_doesnt_raise_on_missing_optionals(self):
        config_missing_optionals = dict.fromkeys(self.required, "")
        config_missing_optionals["title"] = "is_mandatory"

        try:
            get_browser_config(config_missing_optionals)
        except KeyError:
            pytest.fail("Must not raise exception on missing optional")


class Test_get_config(object):
    @classmethod
    def setup_class(cls):
        cls.argv = "--suite other-e10s --mainthread -e /some/random/path".split()
        cls.argv_unprovided_tests = "-e /some/random/path".split()
        cls.argv_unknown_suite = (
            "--suite random-unknown-suite -e /some/random/path".split()
        )
        cls.argv_overrides_defaults = """
        --suite other-e10s
        --executablePath /some/random/path
        --cycles 20
        --gecko-profile
        --gecko-profile-interval 1000
        --gecko-profile-entries 1000
        --mainthread
        --tpcycles 20
        --mozAfterPaint
        --firstPaint
        --firstNonBlankPaint
        --userReady
        --tppagecycles 20
        """.split()

        cls.argv_ts_paint = "--activeTests ts_paint -e /some/random/path".split()
        cls.argv_ts_paint_webext = (
            "--activeTests ts_paint_webext -e /some/random/path".split()
        )
        cls.argv_ts_paint_heavy = (
            "--activeTests ts_paint_heavy -e /some/random/path".split()
        )
        cls.argv_sessionrestore = (
            "--activeTests sessionrestore -e /some/random/path".split()
        )
        cls.argv_sessionrestore_no_auto_restore = (
            "--activeTests sessionrestore_no_auto_restore -e /some/random/path".split()
        )
        cls.argv_sessionrestore_many_windows = (
            "--activeTests sessionrestore_many_windows -e /some/random/path".split()
        )
        cls.argv_tresize = "--activeTests tresize -e /some/random/path".split()
        cls.argv_cpstartup = "--activeTests cpstartup -e /some/random/path".split()
        cls.argv_tabpaint = "--activeTests tabpaint -e /some/random/path".split()
        cls.argv_tabswitch = "--activeTests tabswitch -e /some/random/path".split()
        cls.argv_tart = "--activeTests tart -e /some/random/path".split()
        cls.argv_damp = "--activeTests damp -e /some/random/path".split()
        cls.argv_glterrain = "--activeTests glterrain -e /some/random/path".split()
        cls.argv_glvideo = "--activeTests glvideo -e /some/random/path".split()
        cls.argv_canvas2dvideo = (
            "--activeTests canvas2dvideo -e /some/random/path".split()
        )
        cls.argv_offscreencanvas_webcodecs_main_webgl_h264 = "--activeTests offscreencanvas_webcodecs_main_webgl_h264 -e /some/random/path".split()
        cls.argv_offscreencanvas_webcodecs_main_webgl_vp9 = "--activeTests offscreencanvas_webcodecs_main_webgl_vp9 -e /some/random/path".split()
        cls.argv_offscreencanvas_webcodecs_main_webgl_av1 = "--activeTests offscreencanvas_webcodecs_main_webgl_av1 -e /some/random/path".split()
        cls.argv_offscreencanvas_webcodecs_worker_webgl_h264 = "--activeTests offscreencanvas_webcodecs_worker_webgl_h264 -e /some/random/path".split()
        cls.argv_offscreencanvas_webcodecs_worker_webgl_vp9 = "--activeTests offscreencanvas_webcodecs_worker_webgl_vp9 -e /some/random/path".split()
        cls.argv_offscreencanvas_webcodecs_worker_webgl_av1 = "--activeTests offscreencanvas_webcodecs_worker_webgl_av1 -e /some/random/path".split()
        cls.argv_offscreencanvas_webcodecs_main_2d_h264 = "--activeTests offscreencanvas_webcodecs_main_2d_h264 -e /some/random/path".split()
        cls.argv_offscreencanvas_webcodecs_main_2d_vp9 = "--activeTests offscreencanvas_webcodecs_main_2d_vp9 -e /some/random/path".split()
        cls.argv_offscreencanvas_webcodecs_main_2d_av1 = "--activeTests offscreencanvas_webcodecs_main_2d_av1 -e /some/random/path".split()
        cls.argv_offscreencanvas_webcodecs_worker_2d_h264 = "--activeTests offscreencanvas_webcodecs_worker_2d_h264 -e /some/random/path".split()
        cls.argv_offscreencanvas_webcodecs_worker_2d_vp9 = "--activeTests offscreencanvas_webcodecs_worker_2d_vp9 -e /some/random/path".split()
        cls.argv_offscreencanvas_webcodecs_worker_2d_av1 = "--activeTests offscreencanvas_webcodecs_worker_2d_av1 -e /some/random/path".split()
        cls.argv_tp5n = "--activeTests tp5n -e /some/random/path".split()
        cls.argv_tp5o = "--activeTests tp5o -e /some/random/path".split()
        cls.argv_tp5o_webext = "--activeTests tp5o_webext -e /some/random/path".split()
        cls.argv_tp5o_scroll = "--activeTests tp5o_scroll -e /some/random/path".split()
        cls.argv_v8_7 = "--activeTests v8_7 -e /some/random/path".split()
        cls.argv_kraken = "--activeTests kraken -e /some/random/path".split()
        cls.argv_basic_compositor_video = (
            "--activeTests basic_compositor_video -e /some/random/path".split()
        )
        cls.argv_dromaeo_css = "--activeTests dromaeo_css -e /some/random/path".split()
        cls.argv_dromaeo_dom = "--activeTests dromaeo_dom -e /some/random/path".split()
        cls.argv_tsvgm = "--activeTests tsvgm -e /some/random/path".split()
        cls.argv_tsvgx = "--activeTests tsvgx -e /some/random/path".split()
        cls.argv_tsvg_static = "--activeTests tsvg_static -e /some/random/path".split()
        cls.argv_tsvgr_opacity = (
            "--activeTests tsvgr_opacity -e /some/random/path".split()
        )
        cls.argv_tscrollx = "--activeTests tscrollx -e /some/random/path".split()
        cls.argv_a11yr = "--activeTests a11yr -e /some/random/path".split()
        cls.argv_perf_reftest = (
            "--activeTests perf_reftest -e /some/random/path".split()
        )
        cls.argv_perf_reftest_singletons = (
            "--activeTests perf_reftest_singletons -e /some/random/path".split()
        )
        cls.argv_pdfpaint = "--activeTests pdfpaint -e /some/random/path".split()

    @classmethod
    def teardown_class(cls):
        conftest.remove_develop_files()

    def test_correctly_overrides_test_valus(self):
        config = get_config(self.argv)
        assert bool(config) is True

        # no null values
        null_keys = [key for key, val in six.iteritems(config) if val is None]
        assert len(null_keys) == 0

        # expected keys are there
        assert config["browser_path"] == "/some/random/path"
        assert config["suite"] == "other-e10s"
        assert config["mainthread"] is True

        # default values overriden
        config = get_config(self.argv_overrides_defaults)
        assert config["basetest"] == ORIGINAL_DEFAULTS["basetest"]

    def test_config_has_tests(self):
        config = get_config(self.argv)
        assert len(config["tests"]) > 0

    def test_global_variable_isnt_modified(self):
        get_config(self.argv)
        assert ORIGINAL_DEFAULTS == DEFAULTS

    def test_raises_except_if_unprovided_tests_on_cli(self):
        with pytest.raises(ConfigurationError):
            get_config(self.argv_unprovided_tests)

        with pytest.raises(ConfigurationError):
            get_config(self.argv_unknown_suite)

    def test_ts_paint_has_expected_attributes(self):
        config = get_config(self.argv_ts_paint)
        test_config = config["tests"][0]

        assert test_config["name"] == "ts_paint"
        assert test_config["cycles"] == 20
        assert test_config["timeout"] == 150
        assert test_config["gecko_profile_startup"] is True
        assert test_config["gecko_profile_entries"] == 10000000
        assert (
            test_config["url"] != "startup_test/tspaint_test.html"
        )  # interpolation was done
        assert test_config["xperf_counters"] == []
        # TODO: these don't work; is this a bug?
        # assert test_config['win7_counters'] == []
        assert test_config["filters"] is not None
        assert test_config["tpmozafterpaint"] is True
        # assert test_config['mainthread'] is False
        # assert test_config['unit'] == 'ms'

    def test_ts_paint_webext_has_expected_attributes(self):
        config = get_config(self.argv_ts_paint_webext)
        test_config = config["tests"][0]

        assert test_config["name"] == "ts_paint_webext"
        assert test_config["cycles"] == 20
        assert test_config["timeout"] == 150
        assert test_config["gecko_profile_startup"] is True
        assert test_config["gecko_profile_entries"] == 10000000
        assert (
            test_config["url"] != "startup_test/tspaint_test.html"
        )  # interpolation was done
        assert test_config["xperf_counters"] == []
        # TODO: these don't work; is this a bug?
        # assert test_config['win7_counters'] == []
        assert test_config["filters"] is not None
        assert test_config["tpmozafterpaint"] is True
        # assert test_config['mainthread'] is False
        # assert test_config['unit'] == 'ms'
        # TODO: this isn't overriden
        # assert test_config['webextensions'] != '${talos}/webextensions/dummy/dummy-signed.xpi'
        assert test_config["preferences"] == {"xpinstall.signatures.required": False}

    def test_ts_paint_heavy_has_expected_attributes(self):
        config = get_config(self.argv_ts_paint_heavy)
        test_config = config["tests"][0]

        assert test_config["name"] == "ts_paint_heavy"
        assert test_config["cycles"] == 20
        assert test_config["timeout"] == 150
        assert test_config["gecko_profile_startup"] is True
        assert test_config["gecko_profile_entries"] == 10000000
        assert (
            test_config["url"] != "startup_test/tspaint_test.html"
        )  # interpolation was done
        assert test_config["xperf_counters"] == []
        # TODO: this doesn't work; is this a bug?
        # assert test_config['win7_counters'] == []
        assert test_config["filters"] is not None
        assert test_config["tpmozafterpaint"] is True
        # assert test_config['mainthread'] is False
        # assert test_config['unit'] == 'ms'
        assert test_config["profile"] == "simple"

    def test_sessionrestore_has_expected_attributes(self):
        config = get_config(self.argv_sessionrestore)
        test_config = config["tests"][0]

        assert test_config["name"] == "sessionrestore"
        assert test_config["cycles"] == 10
        assert test_config["timeout"] == 900
        assert test_config["gecko_profile_startup"] is True
        assert test_config["gecko_profile_entries"] == 10000000
        assert test_config["reinstall"] == [
            "sessionstore.jsonlz4",
            "sessionstore.js",
            "sessionCheckpoints.json",
        ]
        assert test_config["url"] == "about:home"
        assert test_config["preferences"] == {"browser.startup.page": 3}
        # assert test_config['unit'] == 'ms'

    def test_sesssionrestore_no_auto_restore_has_expected_attributes(self):
        config = get_config(self.argv_sessionrestore_no_auto_restore)
        test_config = config["tests"][0]

        assert test_config["name"] == "sessionrestore_no_auto_restore"
        assert test_config["cycles"] == 10
        assert test_config["timeout"] == 900
        assert test_config["gecko_profile_startup"] is True
        assert test_config["gecko_profile_entries"] == 10000000
        assert test_config["reinstall"] == [
            "sessionstore.jsonlz4",
            "sessionstore.js",
            "sessionCheckpoints.json",
        ]
        assert test_config["url"] == "about:home"
        assert test_config["preferences"] == {"browser.startup.page": 1}
        # assert test_config['unit'] == 'ms'

    def test_sessionrestore_many_windows_has_expected_attributes(self):
        config = get_config(self.argv_sessionrestore_many_windows)
        test_config = config["tests"][0]

        assert test_config["name"] == "sessionrestore_many_windows"
        assert test_config["cycles"] == 10
        assert test_config["timeout"] == 900
        assert test_config["gecko_profile_startup"] is True
        assert test_config["gecko_profile_entries"] == 10000000
        assert test_config["reinstall"] == [
            "sessionstore.jsonlz4",
            "sessionstore.js",
            "sessionCheckpoints.json",
        ]
        assert test_config["url"] == "about:home"
        assert test_config["preferences"] == {"browser.startup.page": 3}
        # assert test_config['unit'] == 'ms'

    def test_tresize_has_expected_attributes(self):
        config = get_config(self.argv_tresize)
        test_config = config["tests"][0]

        assert test_config["name"] == "tresize"
        assert test_config["cycles"] == 20
        assert (
            test_config["url"] != "startup_test/tresize/addon/content/tresize-test.html"
        )
        assert test_config["timeout"] == 150
        assert test_config["gecko_profile_interval"] == 2
        assert test_config["gecko_profile_entries"] == 1000000
        assert test_config["tpmozafterpaint"] is True
        assert test_config["filters"] is not None
        # assert test_config['unit'] == 'ms'

    def test_cpstartup_has_expected_attributes(self):
        config = get_config(self.argv_cpstartup)
        test_config = config["tests"][0]

        assert test_config["name"] == "cpstartup"
        assert test_config["tpcycles"] == 1
        assert (
            test_config["tpmanifest"] != "${talos}/tests/cpstartup/cpstartup.manifest"
        )
        assert test_config["tppagecycles"] == 20
        assert test_config["gecko_profile_entries"] == 1000000
        assert test_config["tploadnocache"] is True
        assert test_config["unit"] == "ms"
        assert test_config["preferences"] == {
            "addon.test.cpstartup.webserver": "${webserver}",
            "browser.link.open_newwindow": 3,
            "browser.link.open_newwindow.restriction": 2,
        }

    def test_tabpaint_has_expected_attributes(self):
        config = get_config(self.argv_tabpaint)
        test_config = config["tests"][0]

        assert test_config["name"] == "tabpaint"
        assert test_config["tpcycles"] == 1
        assert test_config["tpmanifest"] != "${talos}/tests/tabpaint/tabpaint.manifest"
        assert test_config["tppagecycles"] == 20
        assert test_config["gecko_profile_entries"] == 1000000
        assert test_config["tploadnocache"] is True
        assert test_config["unit"] == "ms"
        assert test_config["preferences"] == {
            "browser.link.open_newwindow": 3,
            "browser.link.open_newwindow.restriction": 2,
        }

    def test_tabswitch_has_expected_attributes(self):
        config = get_config(self.argv_tabswitch)
        test_config = config["tests"][0]

        assert test_config["name"] == "tabswitch"
        assert test_config["tpcycles"] == 1
        assert (
            test_config["tpmanifest"] != "${talos}/tests/tabswitch/tabswitch.manifest"
        )
        assert test_config["tppagecycles"] == 5
        assert test_config["gecko_profile_entries"] == 5000000
        assert test_config["tploadnocache"] is True
        assert test_config["preferences"] == {
            "addon.test.tabswitch.urlfile": os.path.join(
                "${talos}", "tests", "tp5o.html"
            ),
            "addon.test.tabswitch.webserver": "${webserver}",
            "addon.test.tabswitch.maxurls": -1,
        }
        assert test_config["unit"] == "ms"

    def test_tart_has_expected_attributes(self):
        config = get_config(self.argv_tart)
        test_config = config["tests"][0]

        assert test_config["name"] == "tart"
        assert test_config["tpmanifest"] != "${talos}/tests/tart/tart.manifest"
        assert test_config["tpcycles"] == 1
        assert test_config["tppagecycles"] == 25
        assert test_config["tploadnocache"] is True
        assert test_config["tpmozafterpaint"] is False
        assert test_config["gecko_profile_interval"] == 10
        assert test_config["gecko_profile_entries"] == 1000000
        assert "win_counters" not in test_config
        assert "linux_counters" not in test_config
        assert "mac_counters" not in test_config
        assert test_config["preferences"] == {
            "layout.frame_rate": 0,
            "docshell.event_starvation_delay_hint": 1,
            "dom.send_after_paint_to_content": False,
        }
        assert test_config["filters"] is not None
        assert test_config["unit"] == "ms"

    def test_damp_has_expected_attributes(self):
        config = get_config(self.argv_damp)
        test_config = config["tests"][0]

        assert test_config["name"] == "damp"
        assert test_config["tpmanifest"] != "${talos}/tests/devtools/damp.manifest"
        assert test_config["cycles"] == 5
        assert test_config["tpcycles"] == 1
        assert test_config["tppagecycles"] == 5
        assert test_config["tploadnocache"] is True
        assert test_config["tpmozafterpaint"] is False
        assert test_config["gecko_profile_interval"] == 10
        assert test_config["gecko_profile_entries"] == 1000000
        assert "win_counters" not in test_config
        assert "linux_counters" not in test_config
        assert "mac_counters" not in test_config
        assert test_config["filters"] is not None
        assert test_config["preferences"] == {"devtools.memory.enabled": True}
        assert test_config["unit"] == "ms"

    def test_glterrain_has_expected_attributes(self):
        config = get_config(self.argv_glterrain)
        test_config = config["tests"][0]

        assert test_config["name"] == "glterrain"
        assert test_config["tpmanifest"] != "${talos}/tests/webgl/glterrain.manifest"
        assert test_config["tpcycles"] == 1
        assert test_config["tppagecycles"] == 25
        assert test_config["tploadnocache"] is True
        assert test_config["tpmozafterpaint"] is False
        assert test_config["tpchrome"] is False
        assert test_config["gecko_profile_interval"] == 10
        assert test_config["gecko_profile_entries"] == 2000000
        assert "win_counters" not in test_config
        assert "linux_counters" not in test_config
        assert "mac_counters" not in test_config
        assert test_config["preferences"] == {
            "layout.frame_rate": 0,
            "docshell.event_starvation_delay_hint": 1,
            "dom.send_after_paint_to_content": False,
        }
        assert test_config["filters"] is not None
        assert test_config["unit"] == "frame interval"

    def test_glvideo_has_expected_attributes(self):
        config = get_config(self.argv_glvideo)
        test_config = config["tests"][0]

        assert test_config["name"] == "glvideo"
        assert test_config["tpmanifest"] != "${talos}/tests/webgl/glvideo.manifest"
        assert test_config["tpcycles"] == 1
        assert test_config["tppagecycles"] == 5
        assert test_config["tploadnocache"] is True
        assert test_config["tpmozafterpaint"] is False
        assert test_config["tpchrome"] is False
        assert test_config["gecko_profile_interval"] == 2
        assert test_config["gecko_profile_entries"] == 2000000
        assert "win_counters" not in test_config
        assert "linux_counters" not in test_config
        assert "mac_counters" not in test_config
        assert test_config["filters"] is not None
        assert test_config["unit"] == "ms"

    def test_canvas2dvideo_has_expected_attributes(self):
        config = get_config(self.argv_canvas2dvideo)
        test_config = config["tests"][0]

        assert test_config["name"] == "canvas2dvideo"
        assert (
            test_config["tpmanifest"]
            != "${talos}/tests/canvas2d/canvas2dvideo.manifest"
        )
        assert test_config["tpcycles"] == 1
        assert test_config["tppagecycles"] == 5
        assert test_config["tploadnocache"] is True
        assert test_config["tpmozafterpaint"] is False
        assert test_config["tpchrome"] is False
        assert test_config["gecko_profile_interval"] == 2
        assert test_config["gecko_profile_entries"] == 2000000
        assert "win_counters" not in test_config
        assert "linux_counters" not in test_config
        assert "mac_counters" not in test_config
        assert test_config["filters"] is not None
        assert test_config["unit"] == "ms"

    def test_offscreencanvas_webcodecs_main_webgl_h264_has_expected_attributes(self):
        config = get_config(self.argv_offscreencanvas_webcodecs_main_webgl_h264)
        test_config = config["tests"][0]

        assert test_config["name"] == "offscreencanvas_webcodecs_main_webgl_h264"
        assert (
            test_config["tpmanifest"]
            != "${talos}/tests/offscreencanvas/offscreencanvas_webcodecs_main_webgl_h264.manifest"
        )
        assert test_config["tpcycles"] == 1
        assert test_config["tppagecycles"] == 5
        assert test_config["tploadnocache"] is True
        assert test_config["tpmozafterpaint"] is False
        assert test_config["tpchrome"] is False
        assert test_config["gecko_profile_interval"] == 2
        assert test_config["gecko_profile_entries"] == 2000000
        assert "win_counters" not in test_config
        assert "linux_counters" not in test_config
        assert "mac_counters" not in test_config
        assert test_config["filters"] is not None
        assert test_config["unit"] == "ms"

    def test_offscreencanvas_webcodecs_main_webgl_vp9_has_expected_attributes(self):
        config = get_config(self.argv_offscreencanvas_webcodecs_main_webgl_vp9)
        test_config = config["tests"][0]

        assert test_config["name"] == "offscreencanvas_webcodecs_main_webgl_vp9"
        assert (
            test_config["tpmanifest"]
            != "${talos}/tests/offscreencanvas/offscreencanvas_webcodecs_main_webgl_vp9.manifest"
        )
        assert test_config["tpcycles"] == 1
        assert test_config["tppagecycles"] == 5
        assert test_config["tploadnocache"] is True
        assert test_config["tpmozafterpaint"] is False
        assert test_config["tpchrome"] is False
        assert test_config["gecko_profile_interval"] == 2
        assert test_config["gecko_profile_entries"] == 2000000
        assert "win_counters" not in test_config
        assert "linux_counters" not in test_config
        assert "mac_counters" not in test_config
        assert test_config["filters"] is not None
        assert test_config["unit"] == "ms"

    def test_offscreencanvas_webcodecs_main_webgl_av1_has_expected_attributes(self):
        config = get_config(self.argv_offscreencanvas_webcodecs_main_webgl_av1)
        test_config = config["tests"][0]

        assert test_config["name"] == "offscreencanvas_webcodecs_main_webgl_av1"
        assert (
            test_config["tpmanifest"]
            != "${talos}/tests/offscreencanvas/offscreencanvas_webcodecs_main_webgl_av1.manifest"
        )
        assert test_config["tpcycles"] == 1
        assert test_config["tppagecycles"] == 5
        assert test_config["tploadnocache"] is True
        assert test_config["tpmozafterpaint"] is False
        assert test_config["tpchrome"] is False
        assert test_config["gecko_profile_interval"] == 2
        assert test_config["gecko_profile_entries"] == 2000000
        assert "win_counters" not in test_config
        assert "linux_counters" not in test_config
        assert "mac_counters" not in test_config
        assert test_config["filters"] is not None
        assert test_config["unit"] == "ms"

    def test_offscreencanvas_webcodecs_worker_webgl_h264_has_expected_attributes(self):
        config = get_config(self.argv_offscreencanvas_webcodecs_worker_webgl_h264)
        test_config = config["tests"][0]

        assert test_config["name"] == "offscreencanvas_webcodecs_worker_webgl_h264"
        assert (
            test_config["tpmanifest"]
            != "${talos}/tests/offscreencanvas/offscreencanvas_webcodecs_worker_webgl_h264.manifest"
        )
        assert test_config["tpcycles"] == 1
        assert test_config["tppagecycles"] == 5
        assert test_config["tploadnocache"] is True
        assert test_config["tpmozafterpaint"] is False
        assert test_config["tpchrome"] is False
        assert test_config["gecko_profile_interval"] == 2
        assert test_config["gecko_profile_entries"] == 2000000
        assert "win_counters" not in test_config
        assert "linux_counters" not in test_config
        assert "mac_counters" not in test_config
        assert test_config["filters"] is not None
        assert test_config["unit"] == "ms"

    def test_offscreencanvas_webcodecs_worker_webgl_vp9_has_expected_attributes(self):
        config = get_config(self.argv_offscreencanvas_webcodecs_worker_webgl_vp9)
        test_config = config["tests"][0]

        assert test_config["name"] == "offscreencanvas_webcodecs_worker_webgl_vp9"
        assert (
            test_config["tpmanifest"]
            != "${talos}/tests/offscreencanvas/offscreencanvas_webcodecs_worker_webgl_vp9.manifest"
        )
        assert test_config["tpcycles"] == 1
        assert test_config["tppagecycles"] == 5
        assert test_config["tploadnocache"] is True
        assert test_config["tpmozafterpaint"] is False
        assert test_config["tpchrome"] is False
        assert test_config["gecko_profile_interval"] == 2
        assert test_config["gecko_profile_entries"] == 2000000
        assert "win_counters" not in test_config
        assert "linux_counters" not in test_config
        assert "mac_counters" not in test_config
        assert test_config["filters"] is not None
        assert test_config["unit"] == "ms"

    def test_offscreencanvas_webcodecs_worker_webgl_av1_has_expected_attributes(self):
        config = get_config(self.argv_offscreencanvas_webcodecs_worker_webgl_av1)
        test_config = config["tests"][0]

        assert test_config["name"] == "offscreencanvas_webcodecs_worker_webgl_av1"
        assert (
            test_config["tpmanifest"]
            != "${talos}/tests/offscreencanvas/offscreencanvas_webcodecs_worker_webgl_av1.manifest"
        )
        assert test_config["tpcycles"] == 1
        assert test_config["tppagecycles"] == 5
        assert test_config["tploadnocache"] is True
        assert test_config["tpmozafterpaint"] is False
        assert test_config["tpchrome"] is False
        assert test_config["gecko_profile_interval"] == 2
        assert test_config["gecko_profile_entries"] == 2000000
        assert "win_counters" not in test_config
        assert "linux_counters" not in test_config
        assert "mac_counters" not in test_config
        assert test_config["filters"] is not None
        assert test_config["unit"] == "ms"

    def test_offscreencanvas_webcodecs_main_2d_h264_has_expected_attributes(self):
        config = get_config(self.argv_offscreencanvas_webcodecs_main_2d_h264)
        test_config = config["tests"][0]

        assert test_config["name"] == "offscreencanvas_webcodecs_main_2d_h264"
        assert (
            test_config["tpmanifest"]
            != "${talos}/tests/offscreencanvas/offscreencanvas_webcodecs_main_2d_h264.manifest"
        )
        assert test_config["tpcycles"] == 1
        assert test_config["tppagecycles"] == 5
        assert test_config["tploadnocache"] is True
        assert test_config["tpmozafterpaint"] is False
        assert test_config["tpchrome"] is False
        assert test_config["gecko_profile_interval"] == 2
        assert test_config["gecko_profile_entries"] == 2000000
        assert "win_counters" not in test_config
        assert "linux_counters" not in test_config
        assert "mac_counters" not in test_config
        assert test_config["filters"] is not None
        assert test_config["unit"] == "ms"

    def test_offscreencanvas_webcodecs_main_2d_vp9_has_expected_attributes(self):
        config = get_config(self.argv_offscreencanvas_webcodecs_main_2d_vp9)
        test_config = config["tests"][0]

        assert test_config["name"] == "offscreencanvas_webcodecs_main_2d_vp9"
        assert (
            test_config["tpmanifest"]
            != "${talos}/tests/offscreencanvas/offscreencanvas_webcodecs_main_2d_vp9.manifest"
        )
        assert test_config["tpcycles"] == 1
        assert test_config["tppagecycles"] == 5
        assert test_config["tploadnocache"] is True
        assert test_config["tpmozafterpaint"] is False
        assert test_config["tpchrome"] is False
        assert test_config["gecko_profile_interval"] == 2
        assert test_config["gecko_profile_entries"] == 2000000
        assert "win_counters" not in test_config
        assert "linux_counters" not in test_config
        assert "mac_counters" not in test_config
        assert test_config["filters"] is not None
        assert test_config["unit"] == "ms"

    def test_offscreencanvas_webcodecs_main_2d_av1_has_expected_attributes(self):
        config = get_config(self.argv_offscreencanvas_webcodecs_main_2d_av1)
        test_config = config["tests"][0]

        assert test_config["name"] == "offscreencanvas_webcodecs_main_2d_av1"
        assert (
            test_config["tpmanifest"]
            != "${talos}/tests/offscreencanvas/offscreencanvas_webcodecs_main_2d_av1.manifest"
        )
        assert test_config["tpcycles"] == 1
        assert test_config["tppagecycles"] == 5
        assert test_config["tploadnocache"] is True
        assert test_config["tpmozafterpaint"] is False
        assert test_config["tpchrome"] is False
        assert test_config["gecko_profile_interval"] == 2
        assert test_config["gecko_profile_entries"] == 2000000
        assert "win_counters" not in test_config
        assert "linux_counters" not in test_config
        assert "mac_counters" not in test_config
        assert test_config["filters"] is not None
        assert test_config["unit"] == "ms"

    def test_offscreencanvas_webcodecs_worker_2d_h264_has_expected_attributes(self):
        config = get_config(self.argv_offscreencanvas_webcodecs_worker_2d_h264)
        test_config = config["tests"][0]

        assert test_config["name"] == "offscreencanvas_webcodecs_worker_2d_h264"
        assert (
            test_config["tpmanifest"]
            != "${talos}/tests/offscreencanvas/offscreencanvas_webcodecs_worker_2d_h264.manifest"
        )
        assert test_config["tpcycles"] == 1
        assert test_config["tppagecycles"] == 5
        assert test_config["tploadnocache"] is True
        assert test_config["tpmozafterpaint"] is False
        assert test_config["tpchrome"] is False
        assert test_config["gecko_profile_interval"] == 2
        assert test_config["gecko_profile_entries"] == 2000000
        assert "win_counters" not in test_config
        assert "linux_counters" not in test_config
        assert "mac_counters" not in test_config
        assert test_config["filters"] is not None
        assert test_config["unit"] == "ms"

    def test_offscreencanvas_webcodecs_worker_2d_vp9_has_expected_attributes(self):
        config = get_config(self.argv_offscreencanvas_webcodecs_worker_2d_vp9)
        test_config = config["tests"][0]

        assert test_config["name"] == "offscreencanvas_webcodecs_worker_2d_vp9"
        assert (
            test_config["tpmanifest"]
            != "${talos}/tests/offscreencanvas/offscreencanvas_webcodecs_worker_2d_vp9.manifest"
        )
        assert test_config["tpcycles"] == 1
        assert test_config["tppagecycles"] == 5
        assert test_config["tploadnocache"] is True
        assert test_config["tpmozafterpaint"] is False
        assert test_config["tpchrome"] is False
        assert test_config["gecko_profile_interval"] == 2
        assert test_config["gecko_profile_entries"] == 2000000
        assert "win_counters" not in test_config
        assert "linux_counters" not in test_config
        assert "mac_counters" not in test_config
        assert test_config["filters"] is not None
        assert test_config["unit"] == "ms"

    def test_offscreencanvas_webcodecs_worker_2d_av1_has_expected_attributes(self):
        config = get_config(self.argv_offscreencanvas_webcodecs_worker_2d_av1)
        test_config = config["tests"][0]

        assert test_config["name"] == "offscreencanvas_webcodecs_worker_2d_av1"
        assert (
            test_config["tpmanifest"]
            != "${talos}/tests/offscreencanvas/offscreencanvas_webcodecs_worker_2d_av1.manifest"
        )
        assert test_config["tpcycles"] == 1
        assert test_config["tppagecycles"] == 5
        assert test_config["tploadnocache"] is True
        assert test_config["tpmozafterpaint"] is False
        assert test_config["tpchrome"] is False
        assert test_config["gecko_profile_interval"] == 2
        assert test_config["gecko_profile_entries"] == 2000000
        assert "win_counters" not in test_config
        assert "linux_counters" not in test_config
        assert "mac_counters" not in test_config
        assert test_config["filters"] is not None
        assert test_config["unit"] == "ms"

    @mock.patch("talos.config.build_manifest", conftest.patched_build_manifest)
    def test_tp5n_has_expected_attributes(self):
        config = get_config(self.argv_tp5n)
        test_config = config["tests"][0]

        assert test_config["name"] == "tp5n"
        assert test_config["resolution"] == 20
        assert test_config["tpmanifest"] != "${talos}/tests/tp5n/tp5n.manifest"
        assert test_config["tpcycles"] == 1
        assert test_config["tppagecycles"] == 1
        assert test_config["cycles"] == 1
        assert test_config["tpmozafterpaint"] is True
        assert test_config["tptimeout"] == 5000
        assert test_config["mainthread"] is True
        assert test_config["win_counters"] == []
        assert test_config["linux_counters"] == []
        assert test_config["mac_counters"] == []
        assert test_config["xperf_counters"] == [
            "main_startup_fileio",
            "main_startup_netio",
            "main_normal_fileio",
            "main_normal_netio",
            "nonmain_startup_fileio",
            "nonmain_normal_fileio",
            "nonmain_normal_netio",
            "mainthread_readcount",
            "mainthread_readbytes",
            "mainthread_writecount",
            "mainthread_writebytes",
        ]
        assert test_config["xperf_providers"] == [
            "PROC_THREAD",
            "LOADER",
            "HARD_FAULTS",
            "FILENAME",
            "FILE_IO",
            "FILE_IO_INIT",
        ]
        assert test_config["xperf_user_providers"] == [
            "Mozilla Generic Provider",
            "Microsoft-Windows-TCPIP",
        ]
        assert test_config["xperf_stackwalk"] == [
            "FileCreate",
            "FileRead",
            "FileWrite",
            "FileFlush",
            "FileClose",
        ]
        assert test_config["filters"] is not None
        assert test_config["timeout"] == 1800
        assert test_config["preferences"] == {
            "extensions.enabledScopes": "",
            "talos.logfile": "browser_output.txt",
        }
        assert test_config["unit"] == "ms"

    @mock.patch("talos.config.build_manifest", conftest.patched_build_manifest)
    def test_tp5o_has_expected_attributes(self):
        config = get_config(self.argv_tp5o)
        test_config = config["tests"][0]

        assert test_config["name"] == "tp5o"
        assert test_config["tpcycles"] == 1
        assert test_config["tppagecycles"] == 25
        assert test_config["cycles"] == 1
        assert test_config["tpmozafterpaint"] is True
        assert test_config["tptimeout"] == 5000
        assert test_config["mainthread"] is False
        assert test_config["tpmanifest"] != "${talos}/tests/tp5n/tp5o.manifest"
        assert test_config["win_counters"] == ["% Processor Time"]
        assert test_config["linux_counters"] == ["XRes"]
        assert test_config["mac_counters"] == []
        assert test_config["gecko_profile_interval"] == 2
        assert test_config["gecko_profile_entries"] == 4000000
        assert test_config["filters"] is not None
        assert test_config["timeout"] == 1800
        assert test_config["unit"] == "ms"

    @mock.patch("talos.config.build_manifest", conftest.patched_build_manifest)
    def test_tp5o_webext_has_expected_attributes(self):
        config = get_config(self.argv_tp5o_webext)
        test_config = config["tests"][0]

        assert test_config["name"] == "tp5o_webext"
        assert test_config["tpcycles"] == 1
        assert test_config["tppagecycles"] == 25
        assert test_config["cycles"] == 1
        assert test_config["tpmozafterpaint"] is True
        assert test_config["tptimeout"] == 5000
        assert test_config["mainthread"] is False
        assert test_config["tpmanifest"] != "${talos}/tests/tp5n/tp5o.manifest"
        assert test_config["win_counters"] == ["% Processor Time"]
        assert test_config["linux_counters"] == ["XRes"]
        assert test_config["mac_counters"] == []
        assert test_config["gecko_profile_interval"] == 2
        assert test_config["gecko_profile_entries"] == 4000000
        assert test_config["filters"] is not None
        assert test_config["timeout"] == 1800
        assert test_config["unit"] == "ms"
        assert test_config["webextensions"] == "${talos}/webextensions/dummy/dummy.xpi"
        assert test_config["preferences"] == {"xpinstall.signatures.required": False}

    @mock.patch("talos.config.build_manifest", conftest.patched_build_manifest)
    def test_tp5o_scroll_has_expected_attributes(self):
        config = get_config(self.argv_tp5o_scroll)
        test_config = config["tests"][0]

        assert test_config["name"] == "tp5o_scroll"
        assert test_config["tpmanifest"] != "${talos}/tests/tp5n/tp5o.manifest"
        assert test_config["tpcycles"] == 1
        assert test_config["tppagecycles"] == 12
        assert test_config["gecko_profile_interval"] == 2
        assert test_config["gecko_profile_entries"] == 2000000
        assert test_config["tpscrolltest"] is True
        assert test_config["tpmozafterpaint"] is False
        assert test_config["preferences"] == {
            "layout.frame_rate": 0,
            "docshell.event_starvation_delay_hint": 1,
            "dom.send_after_paint_to_content": False,
            "layout.css.scroll-behavior.spring-constant": "'10'",
            "toolkit.framesRecording.bufferSize": 10000,
        }
        assert test_config["filters"] is not None
        assert test_config["unit"] == "1/FPS"

    def test_v8_7_has_expected_attributes(self):
        config = get_config(self.argv_v8_7)
        test_config = config["tests"][0]

        assert test_config["name"] == "v8_7"
        assert test_config["tpmanifest"] != "${talos}/tests/v8_7/v8.manifest"
        assert test_config["gecko_profile_interval"] == 1
        assert test_config["gecko_profile_entries"] == 1000000
        assert test_config["tpcycles"] == 1
        assert test_config["resolution"] == 20
        assert test_config["tpmozafterpaint"] is False
        assert test_config["preferences"] == {"dom.send_after_paint_to_content": False}
        assert test_config["filters"] is not None
        assert test_config["unit"] == "score"
        assert test_config["lower_is_better"] is False

    def test_kraken_has_expected_attributes(self):
        config = get_config(self.argv_kraken)
        test_config = config["tests"][0]

        assert test_config["name"] == "kraken"
        assert test_config["tpmanifest"] != "${talos}/tests/kraken/kraken.manifest"
        assert test_config["tpcycles"] == 1
        assert test_config["tppagecycles"] == 1
        assert test_config["gecko_profile_interval"] == 1
        assert test_config["gecko_profile_entries"] == 5000000
        assert test_config["tpmozafterpaint"] is False
        assert test_config["tpchrome"] is False
        assert test_config["preferences"] == {"dom.send_after_paint_to_content": False}
        assert test_config["filters"] is not None
        assert test_config["unit"] == "score"

    def test_basic_compositor_video_has_expected_attributes(self):
        config = get_config(self.argv_basic_compositor_video)
        test_config = config["tests"][0]

        assert test_config["name"] == "basic_compositor_video"
        assert test_config["tpmanifest"] != "${talos}/tests/video/video.manifest"
        assert test_config["tpcycles"] == 1
        assert test_config["tppagecycles"] == 12
        assert test_config["tpchrome"] is False
        assert test_config["timeout"] == 10000
        assert test_config["gecko_profile_interval"] == 1
        assert test_config["gecko_profile_entries"] == 2000000
        assert test_config["preferences"] == {
            "full-screen-api.allow-trusted-requests-only": False,
            "layers.acceleration.force-enabled": False,
            "layers.acceleration.disabled": True,
            "layout.frame_rate": 0,
            "docshell.event_starvation_delay_hint": 1,
            "full-screen-api.warning.timeout": 500,
            "media.ruin-av-sync.enabled": True,
        }
        assert test_config["filters"] is not None
        assert test_config["unit"] == "ms/frame"
        assert test_config["lower_is_better"] is True

    def test_dromaeo_css_has_expected_attributes(self):
        config = get_config(self.argv_dromaeo_css)
        test_config = config["tests"][0]

        assert test_config["name"] == "dromaeo_css"
        assert test_config["tpcycles"] == 1
        assert test_config["filters"] is not None
        assert test_config["lower_is_better"] is False
        assert test_config["alert_threshold"] == 5.0
        assert test_config["tpchrome"] is False
        assert test_config["gecko_profile_interval"] == 2
        assert test_config["gecko_profile_entries"] == 10000000
        assert test_config["tpmanifest"] != "${talos}/tests/dromaeo/css.manifest"
        assert test_config["unit"] == "score"

    def test_dromaeo_dom_has_expected_attributes(self):
        config = get_config(self.argv_dromaeo_dom)
        test_config = config["tests"][0]

        assert test_config["name"] == "dromaeo_dom"
        assert test_config["tpcycles"] == 1
        assert test_config["filters"] is not None
        assert test_config["lower_is_better"] is False
        assert test_config["alert_threshold"] == 5.0
        assert test_config["tpchrome"] is False
        assert test_config["gecko_profile_interval"] == 2
        assert test_config["gecko_profile_entries"] == 10000000
        assert test_config["tpmanifest"] != "${talos}/tests/dromaeo/dom.manifest"
        assert test_config["unit"] == "score"

    def test_tsvgm_has_expected_attributes(self):
        config = get_config(self.argv_tsvgm)
        test_config = config["tests"][0]

        assert test_config["name"] == "tsvgm"
        assert test_config["tpmanifest"] != "${talos}/tests/svgx/svgm.manifest"
        assert test_config["tpcycles"] == 1
        assert test_config["tppagecycles"] == 7
        assert test_config["tpmozafterpaint"] is False
        assert test_config["tpchrome"] is False
        assert test_config["gecko_profile_interval"] == 10
        assert test_config["gecko_profile_entries"] == 1000000
        assert test_config["preferences"] == {
            "layout.frame_rate": 0,
            "docshell.event_starvation_delay_hint": 1,
            "dom.send_after_paint_to_content": False,
        }
        assert test_config["filters"] is not None
        assert test_config["unit"] == "ms"

    def test_tsvgx_has_expected_attributes(self):
        config = get_config(self.argv_tsvgx)
        test_config = config["tests"][0]

        assert test_config["name"] == "tsvgx"
        assert test_config["tpmanifest"] != "${talos}/tests/svgx/svgx.manifest"
        assert test_config["tpcycles"] == 1
        assert test_config["tppagecycles"] == 25
        assert test_config["tpmozafterpaint"] is False
        assert test_config["tpchrome"] is False
        assert test_config["gecko_profile_interval"] == 10
        assert test_config["gecko_profile_entries"] == 1000000
        assert test_config["preferences"] == {
            "layout.frame_rate": 0,
            "docshell.event_starvation_delay_hint": 1,
            "dom.send_after_paint_to_content": False,
        }
        assert test_config["filters"] is not None
        assert test_config["unit"] == "ms"

    def test_tsvg_static_has_expected_attributes(self):
        config = get_config(self.argv_tsvg_static)
        test_config = config["tests"][0]

        assert test_config["name"] == "tsvg_static"
        assert (
            test_config["tpmanifest"] != "${talos}/tests/svg_static/svg_static.manifest"
        )
        assert test_config["tpcycles"] == 1
        assert test_config["tppagecycles"] == 25
        assert test_config["tpmozafterpaint"] is True
        assert test_config["tpchrome"] is False
        assert test_config["gecko_profile_interval"] == 1
        assert test_config["gecko_profile_entries"] == 10000000
        assert test_config["filters"] is not None
        assert test_config["unit"] == "ms"

    def test_tsvgr_opacity_has_expected_attributes(self):
        config = get_config(self.argv_tsvgr_opacity)
        test_config = config["tests"][0]

        assert test_config["name"] == "tsvgr_opacity"
        assert (
            test_config["tpmanifest"]
            != "${talos}/tests/svg_opacity/svg_opacity.manifest"
        )
        assert test_config["tpcycles"] == 1
        assert test_config["tppagecycles"] == 25
        assert test_config["tpmozafterpaint"] is True
        assert test_config["tpchrome"] is False
        assert test_config["gecko_profile_interval"] == 1
        assert test_config["gecko_profile_entries"] == 10000000
        assert test_config["filters"] is not None
        assert test_config["unit"] == "ms"

    def test_tscrollx_has_expected_attributes(self):
        config = get_config(self.argv_tscrollx)
        test_config = config["tests"][0]

        assert test_config["name"] == "tscrollx"
        assert test_config["tpmanifest"] != "${talos}/tests/scroll/scroll.manifest"
        assert test_config["tpcycles"] == 1
        assert test_config["tppagecycles"] == 25
        assert test_config["tpmozafterpaint"] is False
        assert test_config["tpchrome"] is False
        assert test_config["gecko_profile_interval"] == 1
        assert test_config["gecko_profile_entries"] == 1000000
        assert test_config["preferences"] == {
            "layout.frame_rate": 0,
            "docshell.event_starvation_delay_hint": 1,
            "dom.send_after_paint_to_content": False,
            "layout.css.scroll-behavior.spring-constant": "'10'",
            "toolkit.framesRecording.bufferSize": 10000,
        }
        assert test_config["filters"] is not None
        assert test_config["unit"] == "ms"

    def test_a11yr_has_expect_attributes(self):
        config = get_config(self.argv_a11yr)
        test_config = config["tests"][0]

        assert test_config["name"] == "a11yr"
        assert test_config["tpmanifest"] != "${talos}/tests/a11y/a11y.manifest"
        assert test_config["tpcycles"] == 1
        assert test_config["tppagecycles"] == 25
        assert test_config["tpmozafterpaint"] is True
        assert test_config["tpchrome"] is False
        assert test_config["preferences"] == {"dom.send_after_paint_to_content": False}
        assert test_config["unit"] == "ms"
        assert test_config["alert_threshold"] == 5.0

    def test_perf_reftest_has_expected_attributes(self):
        config = get_config(self.argv_perf_reftest)
        test_config = config["tests"][0]

        assert test_config["name"] == "perf_reftest"
        assert test_config["base_vs_ref"] is True
        assert (
            test_config["tpmanifest"]
            != "${talos}/tests/perf-reftest/perf_reftest.manifest"
        )
        assert test_config["tpcycles"] == 1
        assert test_config["tppagecycles"] == 10
        assert test_config["tptimeout"] == 30000
        assert test_config["gecko_profile_interval"] == 1
        assert test_config["gecko_profile_entries"] == 2000000
        assert test_config["filters"] is not None
        assert test_config["unit"] == "ms"
        assert test_config["lower_is_better"] is True
        assert test_config["alert_threshold"] == 5.0

    def test_perf_reftest_singletons_has_expected_attributes(self):
        config = get_config(self.argv_perf_reftest_singletons)
        test_config = config["tests"][0]

        assert test_config["name"] == "perf_reftest_singletons"
        assert (
            test_config["tpmanifest"]
            != "${talos}/tests/perf-reftest-singletons/perf_reftest_singletons.manifest"
        )
        assert test_config["tpcycles"] == 1
        assert test_config["tppagecycles"] == 15
        assert test_config["tptimeout"] == 30000
        assert test_config["gecko_profile_interval"] == 1
        assert test_config["gecko_profile_entries"] == 2000000
        assert test_config["filters"] is not None
        assert test_config["unit"] == "ms"
        assert test_config["lower_is_better"] is True
        assert test_config["alert_threshold"] == 5.0


# The tests in the Test_get_config class don't currently run, so these
# pdfpaint tests live outside of it for now. See bug 1888132.
@mock.patch("pathlib.Path.unlink", new=mock.MagicMock())
@mock.patch("pathlib.Path.symlink_to", new=mock.MagicMock())
def test_pdfpaint_has_expected_attributes_no_chunk(pdfpaint_dir_info):
    pdfpaint_dir, pdf_count = pdfpaint_dir_info

    Test_get_config.setup_class()
    with mock.patch.dict(
        os.environ, {"MOZ_FETCHES_DIR": "", "MOZBUILD_PATH": str(pdfpaint_dir)}
    ):
        config = get_config(Test_get_config.argv_pdfpaint)

    test_config = config["tests"][0]

    assert test_config["name"] == "pdfpaint"
    assert test_config["tpmanifest"] != "${talos}/tests/pdfpaint/pdfpaint.manifest"

    manifest_content = pathlib.Path(test_config["tpmanifest"]).read_text()
    manifest_lines = manifest_content.split("\n")
    assert len([line for line in manifest_lines if line]) == pdf_count

    assert test_config["tpcycles"] == 1
    assert test_config["tppagecycles"] == 1
    assert test_config["tptimeout"] == 60000
    assert test_config["gecko_profile_entries"] == 16777216
    assert test_config["filters"] is not None
    assert test_config["unit"] == "ms"
    assert test_config["lower_is_better"] is True
    assert test_config["alert_threshold"] == 2.0


@mock.patch("pathlib.Path.unlink", new=mock.MagicMock())
@mock.patch("pathlib.Path.symlink_to", new=mock.MagicMock())
def test_pdfpaint_has_expected_attributes_with_chunk(pdfpaint_dir_info):
    pdfpaint_dir, _ = pdfpaint_dir_info

    Test_get_config.setup_class()
    args = Test_get_config.argv_pdfpaint + ["--pdfPaintChunk", "1"]
    with mock.patch.dict(
        os.environ,
        {"MOZ_FETCHES_DIR": str(pdfpaint_dir), "MOZBUILD_PATH": ""},
    ):
        config = get_config(args)

    test_config = config["tests"][0]

    assert test_config["name"] == "pdfpaint"
    assert test_config["tpmanifest"] != "${talos}/tests/pdfpaint/pdfpaint.manifest"

    manifest_content = pathlib.Path(test_config["tpmanifest"]).read_text()
    manifest_lines = manifest_content.split("\n")
    assert len([line for line in manifest_lines if line]) == 100

    assert test_config["tpcycles"] == 1
    assert test_config["tppagecycles"] == 15
    assert test_config["tptimeout"] == 60000
    assert test_config["gecko_profile_entries"] == 16777216
    assert test_config["filters"] is not None
    assert test_config["unit"] == "ms"
    assert test_config["lower_is_better"] is True
    assert test_config["alert_threshold"] == 2.0


def test_pdfpaint_fails_on_bad_chunk(pdfpaint_dir_info):
    pdfpaint_dir, _ = pdfpaint_dir_info

    Test_get_config.setup_class()
    args = Test_get_config.argv_pdfpaint + ["--pdfPaintChunk", "10"]
    with pytest.raises(ConfigurationError):
        with mock.patch.dict(
            os.environ,
            {"MOZ_FETCHES_DIR": str(pdfpaint_dir), "MOZBUILD_PATH": ""},
        ):
            get_config(args)


@mock.patch("pathlib.Path.unlink", new=mock.MagicMock())
@mock.patch("pathlib.Path.symlink_to", new=mock.MagicMock())
def test_pdfpaint_with_pdf_name(pdfpaint_dir_info):
    pdfpaint_dir, _ = pdfpaint_dir_info

    Test_get_config.setup_class()
    args = Test_get_config.argv_pdfpaint + ["--pdfPaintName", "1"]
    with mock.patch.dict(
        os.environ,
        {"MOZ_FETCHES_DIR": str(pdfpaint_dir), "MOZBUILD_PATH": ""},
    ):
        config = get_config(args)

    test_config = config["tests"][0]

    assert test_config["name"] == "pdfpaint"
    assert test_config["tpmanifest"] != "${talos}/tests/pdfpaint/pdfpaint.manifest"

    manifest_content = pathlib.Path(test_config["tpmanifest"]).read_text()
    manifest_lines = manifest_content.split("\n")
    assert len([line for line in manifest_lines if line]) == 1
    assert manifest_lines[0].split("/")[-1] == "1"

    assert test_config["tpcycles"] == 1
    assert test_config["tppagecycles"] == 15


@mock.patch("talos.config.get_browser_config")
@mock.patch("talos.config.get_config")
def test_get_configs(get_config_mock, get_browser_config_mock):
    # unpacks in right order
    get_config_mock.return_value = "first"
    get_browser_config_mock.return_value = "second"

    first, second = get_configs()
    assert (first, second) == ("first", "second")


if __name__ == "__main__":
    mozunit.main()
