1import os
2from talos import filter, utils
3
4"""
5test definitions for Talos
6"""
7
8_TESTS = {}  # internal dict of Talos test classes
9
10
11def register_test():
12    """Decorator to register Talos test classes"""
13    def wrapper(klass):
14        assert issubclass(klass, Test)
15        assert klass.name() not in _TESTS
16
17        _TESTS[klass.name()] = klass
18        return klass
19    return wrapper
20
21
22def test_dict():
23    """Return the dict of the registered test classes"""
24    return _TESTS
25
26
27class Test(object):
28    """abstract base class for a Talos test case"""
29    cycles = None  # number of cycles
30    keys = []
31    desktop = True
32    filters = filter.ignore_first.prepare(1) + filter.median.prepare()
33    lower_is_better = True
34    alert_threshold = 2.0
35
36    @classmethod
37    def name(cls):
38        return cls.__name__
39
40    @classmethod
41    def description(cls):
42        if cls.__doc__ is None:
43            return "No documentation available yet."
44        else:
45            doc = cls.__doc__
46            description_lines = [i.strip() for i in doc.strip().splitlines()]
47            return "\n".join(description_lines)
48
49    def __init__(self, **kw):
50        self.update(**kw)
51
52    def update(self, **kw):
53        self.__dict__.update(kw)
54
55    def items(self):
56        """
57        returns a list of 2-tuples
58        """
59        retval = [('name', self.name())]
60        for key in self.keys:
61            value = getattr(self, key, None)
62            if value is not None:
63                retval.append((key, value))
64        return retval
65
66    def __str__(self):
67        """string form appropriate for YAML output"""
68        items = self.items()
69
70        key, value = items.pop(0)
71        lines = ["- %s: %s" % (key, value)]
72        for key, value in items:
73            lines.append('  %s: %s' % (key, value))
74        return '\n'.join(lines)
75
76
77# ts-style startup tests (ts, twinopen, ts_cold, etc)
78# The overall test number is calculated by excluding the max opening time
79# and taking an average of the remaining numbers.
80class TsBase(Test):
81    """abstract base class for ts-style tests"""
82    keys = [
83        'url',
84        'url_timestamp',
85        'timeout',
86        'cycles',
87        'shutdown',      # If True, collect data on shutdown (using the value
88                         # provided by __startTimestamp/__endTimestamp).
89                         # Otherwise, ignore shutdown data
90                         # (__startTimestamp/__endTimestamp is still
91                         # required but ignored).
92        'profile_path',  # The path containing the template profile. This
93                         # directory is copied to the temporary profile during
94                         # initialization of the test. If some of the files may
95                         # be overwritten by Firefox and need to be reinstalled
96                         # before each pass, use key |reinstall|
97        'sps_profile',
98        'sps_profile_interval',
99        'sps_profile_entries',
100        'sps_profile_startup',
101        'preferences',
102        'xperf_counters',
103        'xperf_providers',
104        'xperf_user_providers',
105        'xperf_stackwalk',
106        'tpmozafterpaint',
107        'extensions',
108        'filters',
109        'setup',
110        'cleanup',
111        'reinstall',     # A list of files from the profile directory that
112                         # should be copied to the temporary profile prior to
113                         # running each cycle, to avoid one cycle overwriting
114                         # the data used by the next another cycle (may be used
115                         # e.g. for sessionstore.js to ensure that all cycles
116                         # use the exact same sessionstore.js, rather than a
117                         # more recent copy).
118    ]
119
120
121@register_test()
122class ts_paint(TsBase):
123    """
124    Launches tspaint_test.html with the current timestamp in the url,
125    waits for [MozAfterPaint and onLoad] to fire, then records the end
126    time and calculates the time to startup.
127    """
128    cycles = 20
129    timeout = 150
130    sps_profile_startup = True
131    sps_profile_entries = 10000000
132    url = 'startup_test/tspaint_test.html'
133    shutdown = False
134    xperf_counters = []
135    win7_counters = []
136    filters = filter.ignore_first.prepare(1) + filter.median.prepare()
137    tpmozafterpaint = True
138    rss = False
139    mainthread = False
140    responsiveness = False
141    unit = 'ms'
142
143
144@register_test()
145class sessionrestore(TsBase):
146    """
147    A start up test measuring the time it takes to load a sessionstore.js file.
148
149    1. Set up Firefox to restore from a given sessionstore.js file.
150    2. Launch Firefox.
151    3. Measure the delta between firstPaint and sessionRestored.
152    """
153    extensions = \
154        '${talos}/startup_test/sessionrestore/addon/sessionrestore-signed.xpi'
155    cycles = 10
156    timeout = 1000000
157    sps_profile_startup = True
158    sps_profile_entries = 10000000
159    profile_path = '${talos}/startup_test/sessionrestore/profile'
160    url = 'startup_test/sessionrestore/index.html'
161    shutdown = False
162    reinstall = ['sessionstore.js', 'sessionCheckpoints.json']
163    # Restore the session
164    preferences = {'browser.startup.page': 3}
165    unit = 'ms'
166
167
168@register_test()
169class sessionrestore_no_auto_restore(sessionrestore):
170    """
171    A start up test measuring the time it takes to load a sessionstore.js file.
172
173    1. Set up Firefox to *not* restore automatically from sessionstore.js file.
174    2. Launch Firefox.
175    3. Measure the delta between firstPaint and sessionRestored.
176    """
177    # Restore about:home
178    preferences = {'browser.startup.page': 1}
179
180
181@register_test()
182class tpaint(TsBase):
183    """
184    Tests the amount of time it takes the open a new window. This test does
185    not include startup time. Multiple test windows are opened in succession,
186    results reported are the average amount of time required to create and
187    display a window in the running instance of the browser.
188    (Measures ctrl-n performance.)
189    """
190    url = 'file://${talos}/startup_test/tpaint.html?auto=1'
191    timeout = 300
192    sps_profile_interval = 1
193    sps_profile_entries = 2000000
194    tpmozafterpaint = True
195    filters = filter.ignore_first.prepare(5) + filter.median.prepare()
196    unit = 'ms'
197
198
199@register_test()
200class tresize(TsBase):
201    """
202    This test does some resize thing.
203    """
204    extensions = '${talos}/startup_test/tresize/addon/tresize-signed.xpi'
205    cycles = 20
206    url = 'startup_test/tresize/addon/content/tresize-test.html'
207    timeout = 150
208    sps_profile_interval = 2
209    sps_profile_entries = 1000000
210    tpmozafterpaint = True
211    filters = filter.ignore_first.prepare(5) + filter.median.prepare()
212    unit = 'ms'
213
214
215# pageloader tests(tp5, etc)
216
217# The overall test number is determined by first calculating the median
218# page load time for each page in the set (excluding the max page load
219# per individual page). The max median from that set is then excluded and
220# the average is taken; that becomes the number reported to the tinderbox
221# waterfall.
222
223
224class PageloaderTest(Test):
225    """abstract base class for a Talos Pageloader test"""
226    tpmanifest = None  # test manifest
227    tpcycles = 1  # number of time to run each page
228    cycles = None
229    timeout = None
230    keys = ['tpmanifest', 'tpcycles', 'tppagecycles', 'tprender', 'tpchrome',
231            'tpmozafterpaint', 'tploadnocache', 'rss', 'mainthread',
232            'resolution', 'cycles', 'sps_profile', 'sps_profile_interval',
233            'sps_profile_entries', 'tptimeout', 'win_counters', 'w7_counters',
234            'linux_counters', 'mac_counters', 'tpscrolltest', 'xperf_counters',
235            'timeout', 'shutdown', 'responsiveness', 'profile_path',
236            'xperf_providers', 'xperf_user_providers', 'xperf_stackwalk',
237            'filters', 'preferences', 'extensions', 'setup', 'cleanup',
238            'lower_is_better', 'alert_threshold', 'unit']
239
240
241@register_test()
242class tabpaint(PageloaderTest):
243    """
244    Tests the amount of time it takes to open new tabs, triggered from
245    both the parent process and the content process.
246    """
247    extensions = '${talos}/tests/tabpaint/tabpaint-signed.xpi'
248    tpmanifest = '${talos}/tests/tabpaint/tabpaint.manifest'
249    tppagecycles = 20
250    sps_profile_entries = 1000000
251    tploadnocache = True
252    unit = 'ms'
253    preferences = {
254        # By default, Talos is configured to open links from
255        # content in new windows. We're overriding them so that
256        # they open in new tabs instead.
257        # See http://kb.mozillazine.org/Browser.link.open_newwindow
258        # and http://kb.mozillazine.org/Browser.link.open_newwindow.restriction
259        'browser.link.open_newwindow': 3,
260        'browser.link.open_newwindow.restriction': 2,
261    }
262
263
264@register_test()
265class tps(PageloaderTest):
266    """
267    Tests the amount of time it takes to switch between tabs
268    """
269    extensions = '${talos}/tests/tabswitch/tabswitch-signed.xpi'
270    tpmanifest = '${talos}/tests/tabswitch/tps.manifest'
271    tppagecycles = 5
272    sps_profile_entries = 1000000
273    tploadnocache = True
274    preferences = {
275        'addon.test.tabswitch.urlfile': os.path.join('${talos}',
276                                                     'tests',
277                                                     'tp5o.html'),
278        'addon.test.tabswitch.webserver': '${webserver}',
279        # limit the page set number for winxp as we have issues.
280        # see https://bugzilla.mozilla.org/show_bug.cgi?id=1195288
281        'addon.test.tabswitch.maxurls':
282            45 if utils.PLATFORM_TYPE == 'win_' else -1,
283    }
284    unit = 'ms'
285
286
287@register_test()
288class tart(PageloaderTest):
289    """
290    Tab Animation Regression Test
291    Tests tab animation on these cases:
292    1. Simple: single new tab of about:blank open/close without affecting
293       (shrinking/expanding) other tabs.
294    2. icon: same as above with favicons and long title instead of about:blank.
295    3. Newtab: newtab open with thumbnails preview - without affecting other
296       tabs, with and without preload.
297    4. Fade: opens a tab, then measures fadeout/fadein (tab animation without
298       the overhead of opening/closing a tab).
299    - Case 1 is tested with DPI scaling of 1.
300    - Case 2 is tested with DPI scaling of 1.0 and 2.0.
301    - Case 3 is tested with the default scaling of the test system.
302    - Case 4 is tested with DPI scaling of 2.0 with the "icon" tab
303      (favicon and long title).
304    - Each animation produces 3 test results:
305      - error: difference between the designated duration and the actual
306        completion duration from the trigger.
307      - half: average interval over the 2nd half of the animation.
308      - all: average interval over all recorded intervals.
309    """
310    tpmanifest = '${talos}/tests/tart/tart.manifest'
311    extensions = '${talos}/tests/tart/addon/tart-signed.xpi'
312    tpcycles = 1
313    tppagecycles = 25
314    tploadnocache = True
315    tpmozafterpaint = False
316    sps_profile_interval = 10
317    sps_profile_entries = 1000000
318    win_counters = w7_counters = linux_counters = mac_counters = None
319    """
320    ASAP mode
321    The recording API is broken with OMTC before ~2013-11-27
322    After ~2013-11-27, disabling OMTC will also implicitly disable
323    OGL HW composition to disable OMTC with older firefox builds, also
324    set 'layers.offmainthreadcomposition.enabled': False
325    """
326    preferences = {'layout.frame_rate': 0,
327                   'docshell.event_starvation_delay_hint': 1,
328                   'dom.send_after_paint_to_content': False}
329    filters = filter.ignore_first.prepare(1) + filter.median.prepare()
330    unit = 'ms'
331
332
333@register_test()
334class cart(PageloaderTest):
335    """
336    Customize Animation Regression Test
337    Tests Australis customize animations (default DPI scaling). Uses the
338    TART addon but with a different URL.
339    Reports the same animation values as TART (.half/.all/.error).
340    All comments for TART also apply here (e.g. for ASAP+OMTC, etc)
341    Subtests are:
342    1-customize-enter - from triggering customize mode until it's ready for
343    the user
344    2-customize-exit  - exiting customize
345    3-customize-enter-css - only the CSS animation part of entering customize
346    """
347    tpmanifest = '${talos}/tests/tart/cart.manifest'
348    extensions = '${talos}/tests/tart/addon/tart-signed.xpi'
349    tpcycles = 1
350    tppagecycles = 25
351    tploadnocache = True
352    tpmozafterpaint = False
353    sps_profile_interval = 1
354    sps_profile_entries = 10000000
355    win_counters = w7_counters = linux_counters = mac_counters = None
356    """
357    ASAP mode
358    """
359    preferences = {'layout.frame_rate': 0,
360                   'docshell.event_starvation_delay_hint': 1,
361                   'dom.send_after_paint_to_content': False}
362    filters = filter.ignore_first.prepare(1) + filter.median.prepare()
363    unit = 'ms'
364
365
366@register_test()
367class damp(PageloaderTest):
368    """
369    Devtools At Maximum Performance
370    Tests the speed of DevTools toolbox open, close, and page reload
371    for each tool, across a very simple and very complicated page.
372    """
373    tpmanifest = '${talos}/tests/devtools/damp.manifest'
374    extensions = '${talos}/tests/devtools/addon/devtools-signed.xpi'
375    tpcycles = 1
376    tppagecycles = 25
377    tploadnocache = True
378    tpmozafterpaint = False
379    sps_profile_interval = 10
380    sps_profile_entries = 1000000
381    win_counters = w7_counters = linux_counters = mac_counters = None
382    filters = filter.ignore_first.prepare(1) + filter.median.prepare()
383    preferences = {'devtools.memory.enabled': True,
384                   'addon.test.damp.webserver': '${webserver}'}
385    unit = 'ms'
386
387
388@register_test()
389class glterrain(PageloaderTest):
390    """
391    Simple rotating WebGL scene with moving light source over a
392    textured terrain.
393    Measures average frame intervals.
394    The same sequence is measured 4 times for combinations of alpha and
395    antialias as canvas properties.
396    Each of these 4 runs is reported as a different test name.
397    """
398    tpmanifest = '${talos}/tests/webgl/glterrain.manifest'
399    tpcycles = 1
400    tppagecycles = 25
401    tploadnocache = True
402    tpmozafterpaint = False
403    sps_profile_interval = 10
404    sps_profile_entries = 2000000
405    win_counters = w7_counters = linux_counters = mac_counters = None
406    """ ASAP mode """
407    preferences = {'layout.frame_rate': 0,
408                   'docshell.event_starvation_delay_hint': 1,
409                   'dom.send_after_paint_to_content': False}
410    filters = filter.ignore_first.prepare(1) + filter.median.prepare()
411    unit = 'frame interval'
412
413
414@register_test()
415class tp5n(PageloaderTest):
416    """
417    Tests the time it takes Firefox to load the tp5 web page test set.
418
419    The tp5 is an updated web page test set to 100 pages from April 8th, 2011.
420    Effort was made for the pages to no longer be splash screens/login
421    pages/home pages but to be pages that better reflect the actual content
422    of the site in question.
423    """
424    resolution = 20
425    shutdown = True
426    tpmanifest = '${talos}/tests/tp5n/tp5n.manifest'
427    tpcycles = 1
428    tppagecycles = 1
429    cycles = 1
430    tpmozafterpaint = True
431    tptimeout = 5000
432    rss = True
433    mainthread = True
434    w7_counters = []
435    win_counters = []
436    linux_counters = []
437    mac_counters = []
438    xperf_counters = ['main_startup_fileio', 'main_startup_netio',
439                      'main_normal_fileio', 'main_normal_netio',
440                      'nonmain_startup_fileio', 'nonmain_normal_fileio',
441                      'nonmain_normal_netio', 'mainthread_readcount',
442                      'mainthread_readbytes', 'mainthread_writecount',
443                      'mainthread_writebytes']
444    xperf_providers = ['PROC_THREAD', 'LOADER', 'HARD_FAULTS', 'FILENAME',
445                       'FILE_IO', 'FILE_IO_INIT']
446    xperf_user_providers = ['Mozilla Generic Provider',
447                            'Microsoft-Windows-TCPIP']
448    xperf_stackwalk = ['FileCreate', 'FileRead', 'FileWrite', 'FileFlush',
449                       'FileClose']
450    filters = filter.ignore_first.prepare(1) + filter.median.prepare()
451    timeout = 1800
452    setup = '${talos}/xtalos/start_xperf.py -c ${talos}/bcontroller.json'
453    cleanup = '${talos}/xtalos/parse_xperf.py -c ${talos}/bcontroller.json'
454    preferences = {'extensions.enabledScopes': '',
455                   'talos.logfile': 'browser_output.txt'}
456    unit = 'ms'
457
458
459@register_test()
460class tp5o(PageloaderTest):
461    """
462    Derived from the tp5n pageset, this is the 49 most reliable webpages.
463    """
464    tpcycles = 1
465    tppagecycles = 25
466    cycles = 1
467    tpmozafterpaint = True
468    tptimeout = 5000
469    rss = True
470    mainthread = False
471    tpmanifest = '${talos}/tests/tp5n/tp5o.manifest'
472    win_counters = ['Main_RSS', 'Private Bytes', '% Processor Time']
473    w7_counters = ['Main_RSS', 'Private Bytes', '% Processor Time',
474                   'Modified Page List Bytes']
475    linux_counters = ['Private Bytes', 'XRes', 'Main_RSS']
476    mac_counters = ['Main_RSS']
477    responsiveness = True
478    sps_profile_interval = 2
479    sps_profile_entries = 4000000
480    filters = filter.ignore_first.prepare(5) + filter.median.prepare()
481    timeout = 1800
482    unit = 'ms'
483
484
485@register_test()
486class tp5o_scroll(PageloaderTest):
487    """
488    Tests scroll (like tscrollx does, including ASAP) but on the tp5o pageset.
489    """
490    tpmanifest = '${talos}/tests/tp5n/tp5o.manifest'
491    tpcycles = 1
492    tppagecycles = 12
493    sps_profile_interval = 2
494    sps_profile_entries = 2000000
495
496    tpscrolltest = True
497    """ASAP mode"""
498    tpmozafterpaint = False
499    preferences = {'layout.frame_rate': 0,
500                   'docshell.event_starvation_delay_hint': 1,
501                   'dom.send_after_paint_to_content': False,
502                   'layout.css.scroll-behavior.spring-constant': "'10'",
503                   'toolkit.framesRecording.bufferSize': 10000}
504    filters = filter.ignore_first.prepare(1) + filter.median.prepare()
505    unit = '1/FPS'
506
507
508@register_test()
509class v8_7(PageloaderTest):
510    """
511    This is the V8 (version 7) javascript benchmark taken verbatim and
512    slightly modified to fit into our pageloader extension and talos harness.
513
514    The previous version of this test is V8 version 5 which was run on
515    selective branches and operating systems.
516    """
517    tpmanifest = '${talos}/tests/v8_7/v8.manifest'
518    sps_profile_interval = 1
519    sps_profile_entries = 1000000
520    tpcycles = 1
521    resolution = 20
522    tpmozafterpaint = False
523    preferences = {'dom.send_after_paint_to_content': False}
524    filters = filter.v8_subtest.prepare()
525    unit = 'score'
526    lower_is_better = False
527
528
529@register_test()
530class kraken(PageloaderTest):
531    """
532    This is the Kraken javascript benchmark taken verbatim and slightly
533    modified to fit into our pageloader extension and talos harness.
534    """
535    tpmanifest = '${talos}/tests/kraken/kraken.manifest'
536    tpcycles = 1
537    tppagecycles = 1
538    sps_profile_interval = 0.1
539    sps_profile_entries = 1000000
540    tpmozafterpaint = False
541    preferences = {'dom.send_after_paint_to_content': False}
542    filters = filter.mean.prepare()
543    unit = 'score'
544
545
546@register_test()
547class basic_compositor_video(PageloaderTest):
548    """
549    Video test
550    """
551    tpmanifest = '${talos}/tests/video/video.manifest'
552    tpcycles = 1
553    tppagecycles = 12
554    timeout = 10000
555    sps_profile_interval = 1
556    sps_profile_entries = 2000000
557    preferences = {'full-screen-api.allow-trusted-requests-only': False,
558                   'layers.acceleration.force-enabled': False,
559                   'layers.acceleration.disabled': True,
560                   'layout.frame_rate': 0,
561                   'docshell.event_starvation_delay_hint': 1,
562                   'full-screen-api.warning.timeout': 500,
563                   'media.ruin-av-sync.enabled': True}
564    filters = filter.ignore_first.prepare(1) + filter.median.prepare()
565    unit = 'ms/frame'
566    lower_is_better = True
567
568
569@register_test()
570class tcanvasmark(PageloaderTest):
571    """
572    CanvasMark benchmark v0.6
573    """
574    tpmanifest = '${talos}/tests/canvasmark/canvasmark.manifest'
575    win_counters = w7_counters = linux_counters = mac_counters = None
576    tpcycles = 5
577    tppagecycles = 1
578    timeout = 900
579    sps_profile_interval = 10
580    sps_profile_entries = 2500000
581    tpmozafterpaint = False
582    preferences = {'dom.send_after_paint_to_content': False}
583    filters = filter.ignore_first.prepare(1) + filter.median.prepare()
584    unit = 'score'
585    lower_is_better = False
586
587
588class dromaeo(PageloaderTest):
589    """abstract base class for dramaeo tests"""
590    filters = filter.dromaeo.prepare()
591    lower_is_better = False
592    alert_threshold = 5.0
593
594
595@register_test()
596class dromaeo_css(dromaeo):
597    """
598    Dromaeo suite of tests for JavaScript performance testing.
599    See the Dromaeo wiki (https://wiki.mozilla.org/Dromaeo)
600    for more information.
601
602    Each page in the manifest is part of the dromaemo css benchmark.
603    """
604    sps_profile_interval = 2
605    sps_profile_entries = 10000000
606    tpmanifest = '${talos}/tests/dromaeo/css.manifest'
607    unit = 'score'
608
609
610@register_test()
611class dromaeo_dom(dromaeo):
612    """
613    Dromaeo suite of tests for JavaScript performance testing.
614    See the Dromaeo wiki (https://wiki.mozilla.org/Dromaeo)
615    for more information.
616
617    Each page in the manifest is part of the dromaemo dom benchmark.
618    """
619    sps_profile_interval = 2
620    sps_profile_entries = 10000000
621    tpmanifest = '${talos}/tests/dromaeo/dom.manifest'
622    tpdisable_e10s = True
623    unit = 'score'
624
625
626@register_test()
627class tsvgm(PageloaderTest):
628    """
629    An svg-only number that measures SVG rendering performance.
630    """
631    tpmanifest = '${talos}/tests/svgx/svgm.manifest'
632    tpcycles = 1
633    tppagecycles = 7
634    tpmozafterpaint = False
635    sps_profile_interval = 10
636    sps_profile_entries = 1000000
637    """ASAP mode"""
638    preferences = {'layout.frame_rate': 0,
639                   'docshell.event_starvation_delay_hint': 1,
640                   'dom.send_after_paint_to_content': False}
641    filters = filter.ignore_first.prepare(2) + filter.median.prepare()
642    unit = 'ms'
643
644
645@register_test()
646class tsvgx(PageloaderTest):
647    """
648    An svg-only number that measures SVG rendering performance.
649    """
650    tpmanifest = '${talos}/tests/svgx/svgx.manifest'
651    tpcycles = 1
652    tppagecycles = 25
653    tpmozafterpaint = False
654    sps_profile_interval = 10
655    sps_profile_entries = 1000000
656    """ASAP mode"""
657    preferences = {'layout.frame_rate': 0,
658                   'docshell.event_starvation_delay_hint': 1,
659                   'dom.send_after_paint_to_content': False}
660    filters = filter.ignore_first.prepare(5) + filter.median.prepare()
661    unit = 'ms'
662
663
664@register_test()
665class tsvgr_opacity(PageloaderTest):
666    """
667    An svg-only number that measures SVG rendering performance.
668    """
669    tpmanifest = '${talos}/tests/svg_opacity/svg_opacity.manifest'
670    tpcycles = 1
671    tppagecycles = 25
672    tpmozafterpaint = True
673    sps_profile_interval = 1
674    sps_profile_entries = 10000000
675    filters = filter.ignore_first.prepare(5) + filter.median.prepare()
676    unit = 'ms'
677
678
679@register_test()
680class tscrollx(PageloaderTest):
681    """
682    This test does some scrolly thing.
683    """
684    tpmanifest = '${talos}/tests/scroll/scroll.manifest'
685    tpcycles = 1
686    tppagecycles = 25
687    tpmozafterpaint = False
688    sps_profile_interval = 1
689    sps_profile_entries = 1000000
690    """ ASAP mode """
691    preferences = {'layout.frame_rate': 0,
692                   'docshell.event_starvation_delay_hint': 1,
693                   'dom.send_after_paint_to_content': False,
694                   'layout.css.scroll-behavior.spring-constant': "'10'",
695                   'toolkit.framesRecording.bufferSize': 10000}
696    filters = filter.ignore_first.prepare(5) + filter.median.prepare()
697    unit = 'ms'
698
699
700@register_test()
701class a11yr(PageloaderTest):
702    """
703    This test ensures basic a11y tables and permutations do not cause
704    performance regressions.
705    """
706    tpmanifest = '${talos}/tests/a11y/a11y.manifest'
707    tpcycles = 1
708    tppagecycles = 25
709    tpmozafterpaint = True
710    preferences = {'dom.send_after_paint_to_content': False}
711    unit = 'ms'
712    alert_threshold = 5.0
713