OLD | NEW |
---|---|
1 # Copyright 2016 The Chromium Authors. All rights reserved. | 1 # Copyright 2016 The Chromium Authors. All rights reserved. |
2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
4 | 4 |
5 from page_sets.system_health import platforms | 5 from page_sets.system_health import platforms |
6 | 6 |
7 from telemetry import decorators | |
7 from telemetry.page import page | 8 from telemetry.page import page |
9 from telemetry.page import shared_page_state | |
8 | 10 |
9 | 11 |
10 # Extra wait time after the page has loaded required by the loading metric. We | 12 # Extra wait time after the page has loaded required by the loading metric. We |
11 # use it in all benchmarks to avoid divergence between benchmarks. | 13 # use it in all benchmarks to avoid divergence between benchmarks. |
12 # TODO(petrcermak): Switch the memory benchmarks to use it as well. | 14 # TODO(petrcermak): Switch the memory benchmarks to use it as well. |
13 _WAIT_TIME_AFTER_LOAD = 10 | 15 _WAIT_TIME_AFTER_LOAD = 10 |
14 | 16 |
15 | 17 |
18 class _SystemHealthSharedState(shared_page_state.SharedPageState): | |
19 """Shared state which enables disabling stories on individual platforms. | |
20 | |
21 This class adds support for enabling/disabling individual stories on | |
22 individual platforms using the same approaches as for benchmarks: | |
23 | |
24 1. Disabled/Enabled decorator: | |
25 | |
26 @decorators.Disabled('win') | |
27 class Story(system_health_story.SystemHealthStory): | |
28 ... | |
29 | |
30 2. ShouldDisable method: | |
31 | |
32 class Story(system_health_story.SystemHealthStory): | |
33 ... | |
34 | |
35 @classmethod | |
36 def ShouldDisable(cls, possible_browser): | |
37 return possible_browser.platform.GetOSName() == 'win' | |
38 """ | |
39 | |
40 def CanRunStory(self, story): | |
41 return story.CanRun(self.browser) | |
nednguyen
2016/09/07 18:23:51
Hmhh, the api is CanRun(possible_browser), and not
petrcermak
2016/09/08 10:20:44
Yeah. The reason for this is that we are re-using
nednguyen
2016/09/08 12:56:22
We do keep the possible_browser in https://cs.chro
petrcermak
2016/09/08 18:45:10
Done.
| |
42 | |
43 | |
16 class _MetaSystemHealthStory(type): | 44 class _MetaSystemHealthStory(type): |
17 """Metaclass for SystemHealthStory.""" | 45 """Metaclass for SystemHealthStory.""" |
18 | 46 |
19 @property | 47 @property |
20 def ABSTRACT_STORY(cls): | 48 def ABSTRACT_STORY(cls): |
21 """Class field marking whether the class is abstract. | 49 """Class field marking whether the class is abstract. |
22 | 50 |
23 If true, the story will NOT be instantiated and added to a System Health | 51 If true, the story will NOT be instantiated and added to a System Health |
24 story set. This field is NOT inherited by subclasses (that's why it's | 52 story set. This field is NOT inherited by subclasses (that's why it's |
25 defined on the metaclass). | 53 defined on the metaclass). |
26 """ | 54 """ |
27 return cls.__dict__.get('ABSTRACT_STORY', False) | 55 return cls.__dict__.get('ABSTRACT_STORY', False) |
28 | 56 |
29 | 57 |
30 class SystemHealthStory(page.Page): | 58 class SystemHealthStory(page.Page): |
31 """Abstract base class for System Health user stories.""" | 59 """Abstract base class for System Health user stories.""" |
32 __metaclass__ = _MetaSystemHealthStory | 60 __metaclass__ = _MetaSystemHealthStory |
33 | 61 |
34 # The full name of a single page story has the form CASE:GROUP:PAGE (e.g. | 62 # The full name of a single page story has the form CASE:GROUP:PAGE (e.g. |
35 # 'load:search:google'). | 63 # 'load:search:google'). |
36 NAME = NotImplemented | 64 NAME = NotImplemented |
37 URL = NotImplemented | 65 URL = NotImplemented |
38 ABSTRACT_STORY = True | 66 ABSTRACT_STORY = True |
39 SUPPORTED_PLATFORMS = platforms.ALL_PLATFORMS | 67 SUPPORTED_PLATFORMS = platforms.ALL_PLATFORMS |
40 | 68 |
41 def __init__(self, story_set, take_memory_measurement): | 69 def __init__(self, story_set, take_memory_measurement): |
42 case, group, _ = self.NAME.split(':') | 70 case, group, _ = self.NAME.split(':') |
43 super(SystemHealthStory, self).__init__( | 71 super(SystemHealthStory, self).__init__( |
44 page_set=story_set, name=self.NAME, url=self.URL, | 72 shared_page_state_class=_SystemHealthSharedState, page_set=story_set, |
73 name=self.NAME, url=self.URL, | |
45 credentials_path='../data/credentials.json', | 74 credentials_path='../data/credentials.json', |
46 grouping_keys={'case': case, 'group': group}) | 75 grouping_keys={'case': case, 'group': group}) |
47 self._take_memory_measurement = take_memory_measurement | 76 self._take_memory_measurement = take_memory_measurement |
48 | 77 |
78 @classmethod | |
79 def CanRun(cls, possible_browser): | |
80 if (decorators.ShouldSkip(cls, possible_browser)[0] or | |
81 cls.ShouldDisable(possible_browser)): | |
82 return False | |
83 return True | |
84 | |
85 @classmethod | |
86 def ShouldDisable(cls, possible_browser): | |
87 """Override this method to disable a story under specific conditions. | |
88 | |
89 This method is modelled after telemetry.benchmark.Benchmark.ShouldDisable(). | |
90 """ | |
91 del possible_browser | |
92 return False | |
93 | |
49 def _Measure(self, action_runner): | 94 def _Measure(self, action_runner): |
50 if self._take_memory_measurement: | 95 if self._take_memory_measurement: |
51 action_runner.MeasureMemory(deterministic_mode=True) | 96 action_runner.MeasureMemory(deterministic_mode=True) |
52 else: | 97 else: |
53 action_runner.Wait(_WAIT_TIME_AFTER_LOAD) | 98 action_runner.Wait(_WAIT_TIME_AFTER_LOAD) |
54 | 99 |
55 def _Login(self, action_runner): | 100 def _Login(self, action_runner): |
56 pass | 101 pass |
57 | 102 |
58 def _DidLoadDocument(self, action_runner): | 103 def _DidLoadDocument(self, action_runner): |
59 pass | 104 pass |
60 | 105 |
61 def RunNavigateSteps(self, action_runner): | 106 def RunNavigateSteps(self, action_runner): |
62 self._Login(action_runner) | 107 self._Login(action_runner) |
63 super(SystemHealthStory, self).RunNavigateSteps(action_runner) | 108 super(SystemHealthStory, self).RunNavigateSteps(action_runner) |
64 | 109 |
65 def RunPageInteractions(self, action_runner): | 110 def RunPageInteractions(self, action_runner): |
66 action_runner.tab.WaitForDocumentReadyStateToBeComplete() | 111 action_runner.tab.WaitForDocumentReadyStateToBeComplete() |
67 self._DidLoadDocument(action_runner) | 112 self._DidLoadDocument(action_runner) |
68 self._Measure(action_runner) | 113 self._Measure(action_runner) |
OLD | NEW |