| OLD | NEW |
| 1 # Copyright 2014 The Chromium Authors. All rights reserved. | 1 # Copyright 2014 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 import logging | 5 import logging |
| 6 import optparse | 6 import optparse |
| 7 import os | 7 import os |
| 8 import sys | 8 import sys |
| 9 import time | 9 import time |
| 10 | 10 |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 105 try: | 105 try: |
| 106 state.DidRunUserStory(results) | 106 state.DidRunUserStory(results) |
| 107 except Exception: | 107 except Exception: |
| 108 if not has_existing_exception: | 108 if not has_existing_exception: |
| 109 raise | 109 raise |
| 110 # Print current exception and propagate existing exception. | 110 # Print current exception and propagate existing exception. |
| 111 exception_formatter.PrintFormattedException( | 111 exception_formatter.PrintFormattedException( |
| 112 msg='Exception from DidRunUserStory: ') | 112 msg='Exception from DidRunUserStory: ') |
| 113 | 113 |
| 114 class UserStoryGroup(object): | 114 class UserStoryGroup(object): |
| 115 def __init__(self, shared_user_story_state_class): | 115 def __init__(self, shared_state_class): |
| 116 self._shared_user_story_state_class = shared_user_story_state_class | 116 self._shared_state_class = shared_state_class |
| 117 self._user_stories = [] | 117 self._user_stories = [] |
| 118 | 118 |
| 119 @property | 119 @property |
| 120 def shared_user_story_state_class(self): | 120 def shared_state_class(self): |
| 121 return self._shared_user_story_state_class | 121 return self._shared_state_class |
| 122 | 122 |
| 123 @property | 123 @property |
| 124 def user_stories(self): | 124 def user_stories(self): |
| 125 return self._user_stories | 125 return self._user_stories |
| 126 | 126 |
| 127 def AddUserStory(self, user_story): | 127 def AddUserStory(self, user_story): |
| 128 assert (user_story.shared_user_story_state_class is | 128 assert (user_story.shared_state_class is |
| 129 self._shared_user_story_state_class) | 129 self._shared_state_class) |
| 130 self._user_stories.append(user_story) | 130 self._user_stories.append(user_story) |
| 131 | 131 |
| 132 | 132 |
| 133 def StoriesGroupedByStateClass(user_story_set, allow_multiple_groups): | 133 def StoriesGroupedByStateClass(user_story_set, allow_multiple_groups): |
| 134 """ Returns a list of user story groups which each contains user stories with | 134 """ Returns a list of user story groups which each contains user stories with |
| 135 the same shared_user_story_state_class. | 135 the same shared_state_class. |
| 136 | 136 |
| 137 Example: | 137 Example: |
| 138 Assume A1, A2, A3 are user stories with same shared user story class, and | 138 Assume A1, A2, A3 are user stories with same shared user story class, and |
| 139 similar for B1, B2. | 139 similar for B1, B2. |
| 140 If their orders in user story set is A1 A2 B1 B2 A3, then the grouping will | 140 If their orders in user story set is A1 A2 B1 B2 A3, then the grouping will |
| 141 be [A1 A2] [B1 B2] [A3]. | 141 be [A1 A2] [B1 B2] [A3]. |
| 142 | 142 |
| 143 It's purposefully done this way to make sure that order of user | 143 It's purposefully done this way to make sure that order of user |
| 144 stories are the same of that defined in user_story_set. It's recommended that | 144 stories are the same of that defined in user_story_set. It's recommended that |
| 145 user stories with the same states should be arranged next to each others in | 145 user stories with the same states should be arranged next to each others in |
| 146 user story sets to reduce the overhead of setting up & tearing down the | 146 user story sets to reduce the overhead of setting up & tearing down the |
| 147 shared user story state. | 147 shared user story state. |
| 148 """ | 148 """ |
| 149 user_story_groups = [] | 149 user_story_groups = [] |
| 150 user_story_groups.append( | 150 user_story_groups.append( |
| 151 UserStoryGroup(user_story_set[0].shared_user_story_state_class)) | 151 UserStoryGroup(user_story_set[0].shared_state_class)) |
| 152 for user_story in user_story_set: | 152 for user_story in user_story_set: |
| 153 if (user_story.shared_user_story_state_class is not | 153 if (user_story.shared_state_class is not |
| 154 user_story_groups[-1].shared_user_story_state_class): | 154 user_story_groups[-1].shared_state_class): |
| 155 if not allow_multiple_groups: | 155 if not allow_multiple_groups: |
| 156 raise ValueError('This UserStorySet is only allowed to have one ' | 156 raise ValueError('This UserStorySet is only allowed to have one ' |
| 157 'SharedUserStoryState but contains the following ' | 157 'SharedState but contains the following ' |
| 158 'SharedUserStoryState classes: %s, %s.\n Either ' | 158 'SharedState classes: %s, %s.\n Either ' |
| 159 'remove the extra SharedUserStoryStates or override ' | 159 'remove the extra SharedStates or override ' |
| 160 'allow_mixed_story_states.' % ( | 160 'allow_mixed_story_states.' % ( |
| 161 user_story_groups[-1].shared_user_story_state_class, | 161 user_story_groups[-1].shared_state_class, |
| 162 user_story.shared_user_story_state_class)) | 162 user_story.shared_state_class)) |
| 163 user_story_groups.append( | 163 user_story_groups.append( |
| 164 UserStoryGroup(user_story.shared_user_story_state_class)) | 164 UserStoryGroup(user_story.shared_state_class)) |
| 165 user_story_groups[-1].AddUserStory(user_story) | 165 user_story_groups[-1].AddUserStory(user_story) |
| 166 return user_story_groups | 166 return user_story_groups |
| 167 | 167 |
| 168 | 168 |
| 169 def Run(test, user_story_set, expectations, finder_options, results, | 169 def Run(test, user_story_set, expectations, finder_options, results, |
| 170 max_failures=None): | 170 max_failures=None): |
| 171 """Runs a given test against a given page_set with the given options. | 171 """Runs a given test against a given page_set with the given options. |
| 172 | 172 |
| 173 Stop execution for unexpected exceptions such as KeyboardInterrupt. | 173 Stop execution for unexpected exceptions such as KeyboardInterrupt. |
| 174 We "white list" certain exceptions for which the user story runner | 174 We "white list" certain exceptions for which the user story runner |
| (...skipping 26 matching lines...) Expand all Loading... |
| 201 user_stories, | 201 user_stories, |
| 202 user_story_set.allow_mixed_story_states) | 202 user_story_set.allow_mixed_story_states) |
| 203 | 203 |
| 204 for group in user_story_groups: | 204 for group in user_story_groups: |
| 205 state = None | 205 state = None |
| 206 try: | 206 try: |
| 207 for _ in xrange(finder_options.pageset_repeat): | 207 for _ in xrange(finder_options.pageset_repeat): |
| 208 for user_story in group.user_stories: | 208 for user_story in group.user_stories: |
| 209 for _ in xrange(finder_options.page_repeat): | 209 for _ in xrange(finder_options.page_repeat): |
| 210 if not state: | 210 if not state: |
| 211 state = group.shared_user_story_state_class( | 211 state = group.shared_state_class( |
| 212 test, finder_options, user_story_set) | 212 test, finder_options, user_story_set) |
| 213 results.WillRunPage(user_story) | 213 results.WillRunPage(user_story) |
| 214 try: | 214 try: |
| 215 _WaitForThermalThrottlingIfNeeded(state.platform) | 215 _WaitForThermalThrottlingIfNeeded(state.platform) |
| 216 _RunUserStoryAndProcessErrorIfNeeded( | 216 _RunUserStoryAndProcessErrorIfNeeded( |
| 217 expectations, user_story, results, state) | 217 expectations, user_story, results, state) |
| 218 except exceptions.Error: | 218 except exceptions.Error: |
| 219 # Catch all Telemetry errors to give the story a chance to retry. | 219 # Catch all Telemetry errors to give the story a chance to retry. |
| 220 # The retry is enabled by tearing down the state and creating | 220 # The retry is enabled by tearing down the state and creating |
| 221 # a new state instance in the next iteration. | 221 # a new state instance in the next iteration. |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 332 logging.warning('Device is thermally throttled before running ' | 332 logging.warning('Device is thermally throttled before running ' |
| 333 'performance tests, results will vary.') | 333 'performance tests, results will vary.') |
| 334 | 334 |
| 335 | 335 |
| 336 def _CheckThermalThrottling(platform): | 336 def _CheckThermalThrottling(platform): |
| 337 if not platform.CanMonitorThermalThrottling(): | 337 if not platform.CanMonitorThermalThrottling(): |
| 338 return | 338 return |
| 339 if platform.HasBeenThermallyThrottled(): | 339 if platform.HasBeenThermallyThrottled(): |
| 340 logging.warning('Device has been thermally throttled during ' | 340 logging.warning('Device has been thermally throttled during ' |
| 341 'performance tests, results will vary.') | 341 'performance tests, results will vary.') |
| OLD | NEW |