1 # This Source Code Form is subject to the terms of the Mozilla Public
2 # License, v. 2.0. If a copy of the MPL was not distributed with this
3 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
7 from mozperftest
.argparser
import FLAVORS
8 from mozperftest
.hooks
import Hooks
9 from mozperftest
.layers
import Layers
, StopRunError
10 from mozperftest
.metrics
import pick_metrics
11 from mozperftest
.system
import pick_system
12 from mozperftest
.test
import pick_test
13 from mozperftest
.utils
import MachLogger
15 SYSTEM
, TEST
, METRICS
= 0, 1, 2
18 class MachEnvironment(MachLogger
):
19 def __init__(self
, mach_cmd
, flavor
="desktop-browser", hooks
=None, **kwargs
):
20 MachLogger
.__init
__(self
, mach_cmd
)
21 self
._mach
_cmd
= mach_cmd
22 self
._mach
_args
= dict(
23 [(self
._normalize
(key
), value
) for key
, value
in kwargs
.items()]
26 if flavor
not in FLAVORS
:
27 raise NotImplementedError(flavor
)
28 for layer
in (pick_system
, pick_test
, pick_metrics
):
29 self
.add_layer(layer(self
, flavor
, mach_cmd
))
31 # we just load an empty Hooks instance
32 hooks
= Hooks(mach_cmd
)
35 @contextlib.contextmanager
39 # used to trigger __enter__/__exit__
45 def _normalize(self
, name
):
46 if name
.startswith("--"):
48 return name
.replace("-", "_")
50 def set_arg(self
, name
, value
):
51 """Sets the argument"""
52 # see if we want to restrict to existing keys
53 self
._mach
_args
[self
._normalize
(name
)] = value
55 def get_arg(self
, name
, default
=None, layer
=None):
56 name
= self
._normalize
(name
)
58 res
= self
._mach
_args
.get(name
, marker
)
60 # trying with the name prefixed with the layer name
61 if layer
is not None and not name
.startswith(layer
.name
):
62 name
= "%s_%s" % (layer
.name
, name
)
63 return self
._mach
_args
.get(name
, default
)
67 def get_layer(self
, name
):
68 for layer
in self
.layers
:
69 if isinstance(layer
, Layers
):
70 found
= layer
.get_layer(name
)
73 elif layer
.name
== name
:
77 def add_layer(self
, layer
):
78 self
.layers
.append(layer
)
81 # freeze args (XXX do we need to freeze more?)
82 self
._saved
_mach
_args
= copy
.deepcopy(self
._mach
_args
)
85 self
._mach
_args
= self
._saved
_mach
_args
86 self
._saved
_mach
_args
= None
88 def run(self
, metadata
):
89 # run the system and test layers
91 with self
.layers
[SYSTEM
] as syslayer
, self
.layers
[TEST
] as testlayer
:
92 metadata
= testlayer(syslayer(metadata
))
94 # then run the metrics layers
95 with self
.layers
[METRICS
] as metrics
:
96 metadata
= metrics(metadata
)
98 # ends the cycle but without bubbling up the error
105 def __exit__(self
, type, value
, traceback
):