1# Copyright 2012 the V8 project authors. All rights reserved. 2# Redistribution and use in source and binary forms, with or without 3# modification, are permitted provided that the following conditions are 4# met: 5# 6# * Redistributions of source code must retain the above copyright 7# notice, this list of conditions and the following disclaimer. 8# * Redistributions in binary form must reproduce the above 9# copyright notice, this list of conditions and the following 10# disclaimer in the documentation and/or other materials provided 11# with the distribution. 12# * Neither the name of Google Inc. nor the names of its 13# contributors may be used to endorse or promote products derived 14# from this software without specific prior written permission. 15# 16# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 28 29import signal 30import copy 31 32from ..local import utils 33 34 35class Output(object): 36 37 def __init__(self, exit_code=0, timed_out=False, stdout=None, stderr=None, 38 pid=None, duration=None): 39 self.exit_code = exit_code 40 self.timed_out = timed_out 41 self.stdout = stdout 42 self.stderr = stderr 43 self.pid = pid 44 self.duration = duration 45 46 def without_text(self): 47 """Returns copy of the output without stdout and stderr.""" 48 other = copy.copy(self) 49 other.stdout = None 50 other.stderr = None 51 return other 52 53 def HasCrashed(self): 54 if utils.IsWindows(): 55 return 0x80000000 & self.exit_code and not (0x3FFFFF00 & self.exit_code) 56 else: 57 # Timed out tests will have exit_code -signal.SIGTERM. 58 if self.timed_out: 59 return False 60 return (self.exit_code < 0 and 61 self.exit_code != -signal.SIGABRT) 62 63 def HasTimedOut(self): 64 return self.timed_out 65 66 def IsSuccess(self): 67 return not self.HasCrashed() and not self.HasTimedOut() 68 69 @property 70 def exit_code_string(self): 71 return "%d [%02X]" % (self.exit_code, self.exit_code & 0xffffffff) 72 73 74class _NullOutput(Output): 75 """Useful to signal that the binary has not been run.""" 76 def __init__(self): 77 super(_NullOutput, self).__init__() 78 79 80# Default instance of the _NullOutput class above. 81NULL_OUTPUT = _NullOutput() 82