import subunit
import testtools
import subunithelper
+import tempfile
from email.mime.application import MIMEApplication
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
cleanup_list = []
-os.putenv('CC', "ccache gcc")
+os.environ['CC'] = "ccache gcc"
tasks = {
"source3" : [ ("autogen", "./autogen.sh", "text/plain"),
("install", "make install", "text/plain"),
("test", "TDB_NO_FSYNC=1 make subunit-test", "text/x-subunit") ],
- "source4/lib/ldb" : [ ("configure", "./configure --enable-developer -C ${PREFIX}", "text/plain"),
+ "lib/ldb" : [ ("configure", "./configure --enable-developer -C ${PREFIX}", "text/plain"),
("make", "make -j", "text/plain"),
("install", "make install", "text/plain"),
("test", "make test", "text/plain") ],
@property
def failure_reason(self):
- return "failed '%s' with exit code %d" % (self.command, self.exitcode)
+ raise NotImplementedError(self.failure_reason)
@property
def failed(self):
stdout=self.tree.stdout, stderr=self.tree.stderr,
stdin=self.stdin)
+ @property
+ def failure_reason(self):
+ return "failed '%s' with exit code %d" % (self.command, self.exitcode)
+
class AbortingTestResult(subunithelper.TestsuiteEnabledTestResult):
self.stage.proc.terminate()
+class FailureTrackingTestResult(subunithelper.TestsuiteEnabledTestResult):
+
+ def __init__(self, stage):
+ super(FailureTrackingTestResult, self).__init__()
+ self.stage = stage
+
+ def addError(self, test, details=None):
+ if self.stage.failed_test is None:
+ self.stage.failed_test = ("error", test)
+
+ def addFailure(self, test, details=None):
+ if self.stage.failed_test is None:
+ self.stage.failed_test = ("failure", test)
+
+
class SubunitTreeStageBuilder(TreeStageBuilder):
def __init__(self, tree, name, command, fail_quickly=False):
super(SubunitTreeStageBuilder, self).__init__(tree, name, command,
fail_quickly)
- self.failed_tests = []
+ self.failed_test = None
self.subunit_path = os.path.join(gitroot,
"%s.%s.subunit" % (self.tree.tag, self.name))
self.tree.logfiles.append(
self.subunit = open(self.subunit_path, 'w')
formatter = subunithelper.PlainFormatter(False, True, {})
- clients = [formatter, subunit.TestProtocolClient(self.subunit)]
+ clients = [formatter, subunit.TestProtocolClient(self.subunit),
+ FailureTrackingTestResult(self)]
if fail_quickly:
clients.append(AbortingTestResult(self))
self.subunit_server = subunit.TestProtocolServer(
self.subunit.close()
return self.exitcode
+ @property
+ def failure_reason(self):
+ if self.failed_test:
+ return "failed '%s' with %s in test %s" (self.command, self.failed_test[0], self.failed_test[1])
+ else:
+ return "failed '%s' with exit code %d in unknown test" % (self.command, self.exitcode)
+
class TreeBuilder(object):
'''handle build of one directory'''
run_cmd(["git", "push", "pushto", "+HEAD:master"], show=True,
dir=test_master)
-def_testbase = os.getenv("AUTOBUILD_TESTBASE", "/memdisk/%s" % os.getenv('USER'))
+def_testbase = os.getenv("AUTOBUILD_TESTBASE")
+if def_testbase is None:
+ if os.path.exists("/memdisk"):
+ def_testbase = "/memdisk/%s" % os.getenv('USER')
+ else:
+ def_testbase = os.path.join(tempfile.gettempdir(), "autobuild-%s" % os.getenv("USER"))
parser = OptionParser()
parser.add_option("--repository", help="repository to run tests for", default=None, type=str)
msg = MIMEMultipart()
msg['Subject'] = 'autobuild failure for task %s during %s' % (
- failed_task, failed_stage)
+ failed_task, failed_stage.name)
msg['From'] = 'autobuild@samba.org'
msg['To'] = options.email