Robot Framework Integrated Development Environment (RIDE)
status.py
Go to the documentation of this file.
1 # Copyright 2008-2015 Nokia Networks
2 # Copyright 2016- Robot Framework Foundation
3 #
4 # Licensed under the Apache License, Version 2.0 (the "License");
5 # you may not use this file except in compliance with the License.
6 # You may obtain a copy of the License at
7 #
8 # http://www.apache.org/licenses/LICENSE-2.0
9 #
10 # Unless required by applicable law or agreed to in writing, software
11 # distributed under the License is distributed on an "AS IS" BASIS,
12 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 # See the License for the specific language governing permissions and
14 # limitations under the License.
15 
16 from robotide.lib.robot.errors import ExecutionFailed, PassExecution
17 from robotide.lib.robot.utils import html_escape, py2to3, unic
18 
19 
20 @py2to3
21 class Failure():
22 
23  def __init__(self):
24  self.setupsetup = None
25  self.testtest = None
26  self.teardownteardown = None
27 
28  def __nonzero__(self):
29  return bool(self.setupsetup or self.testtest or self.teardownteardown)
30 
31 
32 @py2to3
33 class Exit():
34 
35  def __init__(self, failure_mode=False, error_mode=False,
36  skip_teardown_mode=False):
37  self.failure_modefailure_mode = failure_mode
38  self.error_modeerror_mode = error_mode
39  self.skip_teardown_modeskip_teardown_mode = skip_teardown_mode
40  self.failurefailure = False
41  self.errorerror = False
42  self.fatalfatal = False
43 
44  def failure_occurred(self, failure=None, critical=False):
45  if isinstance(failure, ExecutionFailed) and failure.exit:
46  self.fatalfatal = True
47  if critical and self.failure_modefailure_mode:
48  self.failurefailure = True
49 
50  def error_occurred(self):
51  if self.error_modeerror_mode:
52  self.errorerror = True
53 
54  @property
55  teardown_allowed = property
56 
57  def teardown_allowed(self):
58  return not (self.skip_teardown_modeskip_teardown_mode and self)
59 
60  def __nonzero__(self):
61  return self.failurefailure or self.errorerror or self.fatalfatal
62 
63 
65 
66  def __init__(self, parent=None, *exit_modes):
67  self.parentparent = parent
68  self.childrenchildren = []
69  self.failurefailure = Failure()
70  self.exitexit = parent.exit if parent else Exit(*exit_modes)
71  self._teardown_allowed_teardown_allowed = False
72  if parent:
73  parent.children.append(self)
74 
75  def setup_executed(self, failure=None):
76  if failure and not isinstance(failure, PassExecution):
77  self.failurefailure.setup = unic(failure)
78  self.exitexit.failure_occurred(failure)
79  self._teardown_allowed_teardown_allowed = True
80 
81  def teardown_executed(self, failure=None):
82  if failure and not isinstance(failure, PassExecution):
83  self.failurefailure.teardown = unic(failure)
84  self.exitexit.failure_occurred(failure)
85 
87  self.exitexit.failure_occurred(critical=True)
88 
89  def error_occurred(self):
90  self.exitexit.error_occurred()
91 
92  @property
93  teardown_allowed = property
94 
95  def teardown_allowed(self):
96  return self.exitexit.teardown_allowed and self._teardown_allowed_teardown_allowed
97 
98  @property
99  failures = property
100 
101  def failures(self):
102  return bool(self.parentparent and self.parentparent.failures or
103  self.failurefailure or self.exitexit)
104 
105  def _parent_failures(self):
106  return self.parentparent and self.parentparent.failures
107 
108  @property
109  status = property
110 
111  def status(self):
112  return 'FAIL' if self.failuresfailuresfailures else 'PASS'
113 
114  @property
115  message = property
116 
117  def message(self):
118  if self.failurefailure or self.exitexit:
119  return self._my_message_my_message()
120  if self.parentparent and self.parentparent.failures:
121  return self._parent_message_parent_message()
122  return ''
123 
124  def _my_message(self):
125  raise NotImplementedError
126 
127  def _parent_message(self):
128  return ParentMessage(self.parentparent).message
129 
130 
132 
133  def __init__(self, parent=None, exit_on_failure_mode=False,
134  exit_on_error_mode=False,
135  skip_teardown_on_exit_mode=False):
136  _ExecutionStatus.__init__(self, parent, exit_on_failure_mode,
137  exit_on_error_mode,
138  skip_teardown_on_exit_mode)
139 
140  def _my_message(self):
141  return SuiteMessage(self).message
142 
143 
145 
146  def __init__(self, parent, critical):
147  _ExecutionStatus.__init__(self, parent)
148  self.exitexitexit = parent.exit
149  self._critical_critical = critical
150 
151  def test_failed(self, failure):
152  self.failurefailure.test = unic(failure)
153  self.exitexitexit.failure_occurred(failure, self._critical_critical)
154 
155  def _my_message(self):
156  return TestMessage(self).message
157 
158 
159 class _Message():
160  setup_message = NotImplemented
161  teardown_message = NotImplemented
162  also_teardown_message = NotImplemented
163 
164  def __init__(self, status):
165  self.failurefailure = status.failure
166 
167  @property
168  message = property
169 
170  def message(self):
171  message = self._get_message_before_teardown_get_message_before_teardown()
172  return self._get_message_after_teardown_get_message_after_teardown(message)
173 
175  if self.failurefailure.setup:
176  return self._format_setup_or_teardown_message_format_setup_or_teardown_message(self.setup_messagesetup_message,
177  self.failurefailure.setup)
178  return self.failurefailure.test or ''
179 
180  def _format_setup_or_teardown_message(self, prefix, message):
181  if message.startswith('*HTML*'):
182  prefix = '*HTML* ' + prefix
183  message = message[6:].lstrip()
184  return prefix % message
185 
186  def _get_message_after_teardown(self, message):
187  if not self.failurefailure.teardown:
188  return message
189  if not message:
190  return self._format_setup_or_teardown_message_format_setup_or_teardown_message(self.teardown_messageteardown_message,
191  self.failurefailure.teardown)
192  return self._format_message_with_teardown_message_format_message_with_teardown_message(message)
193 
195  teardown = self.failurefailure.teardown
196  if teardown.startswith('*HTML*'):
197  teardown = teardown[6:].lstrip()
198  if not message.startswith('*HTML*'):
199  message = '*HTML* ' + html_escape(message)
200  elif message.startswith('*HTML*'):
201  teardown = html_escape(teardown)
202  return self.also_teardown_messagealso_teardown_message % (message, teardown)
203 
204 
206  setup_message = 'Setup failed:\n%s'
207  teardown_message = 'Teardown failed:\n%s'
208  also_teardown_message = '%s\n\nAlso teardown failed:\n%s'
209  exit_on_fatal_message = 'Test execution stopped due to a fatal error.'
210  exit_on_failure_message = \
211  'Critical failure occurred and exit-on-failure mode is in use.'
212  exit_on_error_message = 'Error occurred and exit-on-error mode is in use.'
213 
214  def __init__(self, status):
215  _Message.__init__(self, status)
216  self.exitexit = status.exit
217 
218  @property
219  message = property
220 
221  def message(self):
222  message = super(TestMessage, self).message
223  if message:
224  return message
225  if self.exitexit.failure:
226  return self.exit_on_failure_messageexit_on_failure_message
227  if self.exitexit.fatal:
228  return self.exit_on_fatal_messageexit_on_fatal_message
229  if self.exitexit.error:
230  return self.exit_on_error_messageexit_on_error_message
231  return ''
232 
233 
235  setup_message = 'Suite setup failed:\n%s'
236  teardown_message = 'Suite teardown failed:\n%s'
237  also_teardown_message = '%s\n\nAlso suite teardown failed:\n%s'
238 
239 
241  setup_message = 'Parent suite setup failed:\n%s'
242  teardown_message = 'Parent suite teardown failed:\n%s'
243  also_teardown_message = '%s\n\nAlso parent suite teardown failed:\n%s'
244 
245  def __init__(self, status):
246  while status.parent and status.parent.failures:
247  status = status.parent
248  SuiteMessage.__init__(self, status)
def __init__(self, failure_mode=False, error_mode=False, skip_teardown_mode=False)
Definition: status.py:36
def failure_occurred(self, failure=None, critical=False)
Definition: status.py:44
def __init__(self, parent=None, exit_on_failure_mode=False, exit_on_error_mode=False, skip_teardown_on_exit_mode=False)
Definition: status.py:135
def __init__(self, parent, critical)
Definition: status.py:146
def __init__(self, parent=None, *exit_modes)
Definition: status.py:66
def _format_message_with_teardown_message(self, message)
Definition: status.py:194
def _format_setup_or_teardown_message(self, prefix, message)
Definition: status.py:180
def _get_message_after_teardown(self, message)
Definition: status.py:186
def html_escape(text, linkify=True)
Definition: markuputils.py:40