Bug 573134: include information about the changes in a failed and
authorBrent Baker <brbaker@adobe.com>
Tue, 22 Jun 2010 08:34:59 -0400
changeset 4847 d80095436cb1819ab61c90b131b446c76aec4c6d
parent 4846 a8278f593389bfb8627e9a51f962f12f3b38a67c
child 4848 3ab73daa02912db33113c52af4a3820146eb409b
push id2563
push userbrbaker@adobe.com
push dateTue, 22 Jun 2010 12:35:26 +0000
bugs573134, 544249, 572404
Bug 573134: include information about the changes in a failed and passed build, includes the comments added for sandbox builds or changeset notes for redux builds (p=cpeyer,r+brbaker) Bug 544249: run the selftests against debug/debugger shells in deep phase (r+dschaffe,cpeyer) Bug 572404: fix the mac-deep configuration, was missing a step to clone the source repo (r+brbaker)
build/buildbot/master/argo.py
build/buildbot/master/commonsteps.py
build/buildbot/master/custom/buildbot_ext/status/custommail.py
build/buildbot/master/sandbox.py
build/buildbot/master/tamarinredux.py
build/buildbot/slaves/all/run-selftest-generic.sh
--- a/build/buildbot/master/argo.py
+++ b/build/buildbot/master/argo.py
@@ -1050,17 +1050,17 @@ class argo:
 
 
 
     ##################################
     #### builder for windows-test ####
     ##################################
     windows_test_factory = factory.BuildFactory()
     windows_test_factory.addStep(test_commandline)
-    windows_test_factory.addStep(test_selftest)
+    windows_test_factory.addStep(test_selftest(name="Release", shellname="avmshell"))
     windows_test_factory.addStep(test_generic(name="Release", shellname="avmshell", vmargs="", config="", scriptargs=""))
     windows_test_factory.addStep(test_generic(name="Release-interp", shellname="avmshell", vmargs="-Dinterp", config="", scriptargs=""))
     windows_test_factory.addStep(test_generic(name="Release-wordcode-interp", shellname="avmshell_wordcode", vmargs="-Dinterp", config="", scriptargs=""))
     windows_test_factory.addStep(test_generic(name="Release-jit", shellname="avmshell", vmargs="-Ojit", config="", scriptargs=""))
     windows_test_factory.addStep(test_generic(name="ReleaseDebugger", shellname="avmshell_s", vmargs="", config="", scriptargs=""))
     windows_test_factory.addStep(test_generic(name="Debug", shellname="avmshell_d", vmargs="", config="", scriptargs=""))
     windows_test_factory.addStep(test_generic(name="DebugDebugger", shellname="avmshell_sd", vmargs="", config="", scriptargs=""))
     windows_test_factory.addStep(test_differential)
@@ -1075,17 +1075,17 @@ class argo:
     }
 
 
     ####################################
     #### builder for windows64-test ####
     ####################################
     windows_64_test_factory = factory.BuildFactory()
     windows_64_test_factory.addStep(test_commandline)
-    windows_64_test_factory.addStep(test_selftest)
+    windows_64_test_factory.addStep(test_selftest(name="Release", shellname="avmshell_64"))
     windows_64_test_factory.addStep(test_generic(name="Release", shellname="avmshell_64", vmargs="", config="", scriptargs=""))
     windows_64_test_factory.addStep(test_generic(name="Release-interp", shellname="avmshell_64", vmargs="-Dinterp", config="", scriptargs=""))
     windows_64_test_factory.addStep(test_generic(name="Release-wordcode-interp", shellname="avmshell_wordcode_64", vmargs="-Dinterp", config="", scriptargs=""))
     windows_64_test_factory.addStep(test_generic(name="Release-jit", shellname="avmshell_64", vmargs="-Ojit", config="", scriptargs=""))
     windows_64_test_factory.addStep(test_generic(name="ReleaseDebugger", shellname="avmshell_s_64", vmargs="", config="", scriptargs=""))
     windows_64_test_factory.addStep(test_generic(name="Debug", shellname="avmshell_d_64", vmargs="", config="", scriptargs=""))
     windows_64_test_factory.addStep(test_generic(name="DebugDebugger", shellname="avmshell_sd_64", vmargs="", config="", scriptargs=""))
     windows_64_test_factory.addStep(util_process_clean)
@@ -1099,17 +1099,17 @@ class argo:
     }
 
 
     #########################################
     #### builder for mac-intel-10_4-test ####
     #########################################
     mac_intel_104_test_factory = factory.BuildFactory()
     mac_intel_104_test_factory.addStep(test_commandline)
-    mac_intel_104_test_factory.addStep(test_selftest)
+    mac_intel_104_test_factory.addStep(test_selftest(name="Release", shellname="avmshell_104"))
     mac_intel_104_test_factory.addStep(test_generic(name="Release", shellname="avmshell_104", vmargs="", config="", scriptargs=""))
     mac_intel_104_test_factory.addStep(test_generic(name="Release-interp", shellname="avmshell_104", vmargs="-Dinterp", config="", scriptargs=""))
     mac_intel_104_test_factory.addStep(test_generic(name="Release-wordcode-interp", shellname="avmshell_wordcode_104", vmargs="-Dinterp", config="", scriptargs=""))
     mac_intel_104_test_factory.addStep(test_generic(name="Release-jit", shellname="avmshell_104", vmargs="-Ojit", config="", scriptargs=""))
     mac_intel_104_test_factory.addStep(test_generic(name="ReleaseDebugger", shellname="avmshell_s_104", vmargs="", config="", scriptargs=""))
     mac_intel_104_test_factory.addStep(test_generic(name="Debug", shellname="avmshell_d_104", vmargs="", config="", scriptargs=""))
     mac_intel_104_test_factory.addStep(test_generic(name="DebugDebugger", shellname="avmshell_sd_104", vmargs="", config="", scriptargs=""))
     mac_intel_104_test_factory.addStep(test_differential)
@@ -1124,17 +1124,17 @@ class argo:
     }
 
 
     #########################################
     #### builder for mac-intel-10_5-test ####
     #########################################
     mac_intel_105_test_factory = factory.BuildFactory()
     mac_intel_105_test_factory.addStep(test_commandline)
-    mac_intel_105_test_factory.addStep(test_selftest)
+    mac_intel_105_test_factory.addStep(test_selftest(name="Release", shellname="avmshell"))
     mac_intel_105_test_factory.addStep(test_generic(name="Release", shellname="avmshell", vmargs="", config="", scriptargs=""))
     mac_intel_105_test_factory.addStep(test_generic(name="Release-interp", shellname="avmshell", vmargs="-Dinterp", config="", scriptargs=""))
     mac_intel_105_test_factory.addStep(test_generic(name="Release-wordcode-interp", shellname="avmshell_wordcode", vmargs="-Dinterp", config="", scriptargs=""))
     mac_intel_105_test_factory.addStep(test_generic(name="Release-jit", shellname="avmshell", vmargs="-Ojit", config="", scriptargs=""))
     mac_intel_105_test_factory.addStep(test_generic(name="ReleaseDebugger", shellname="avmshell_s", vmargs="", config="", scriptargs=""))
     mac_intel_105_test_factory.addStep(test_generic(name="Debug", shellname="avmshell_d", vmargs="", config="", scriptargs=""))
     mac_intel_105_test_factory.addStep(test_generic(name="DebugDebugger", shellname="avmshell_sd", vmargs="", config="", scriptargs=""))
     mac_intel_105_test_factory.addStep(test_differential)
@@ -1149,17 +1149,17 @@ class argo:
     }
 
 
     ######################################
     #### builder for mac64-intel-test ####
     ######################################
     mac_intel_64_test_factory = factory.BuildFactory()
     mac_intel_64_test_factory.addStep(test_commandline)
-    mac_intel_64_test_factory.addStep(test_selftest)
+    mac_intel_64_test_factory.addStep(test_selftest(name="Release", shellname="avmshell_64"))
     mac_intel_64_test_factory.addStep(test_generic(name="Release", shellname="avmshell_64", vmargs="", config="", scriptargs=""))
     mac_intel_64_test_factory.addStep(test_generic(name="Release-interp", shellname="avmshell_64", vmargs="-Dinterp", config="", scriptargs=""))
     mac_intel_64_test_factory.addStep(test_generic(name="Release-wordcode-interp", shellname="avmshell_wordcode_64", vmargs="-Dinterp", config="", scriptargs=""))
     mac_intel_64_test_factory.addStep(test_generic(name="Release-jit", shellname="avmshell_64", vmargs="-Ojit", config="", scriptargs=""))
     mac_intel_64_test_factory.addStep(test_generic(name="ReleaseDebugger", shellname="avmshell_s_64", vmargs="", config="", scriptargs=""))
     mac_intel_64_test_factory.addStep(test_generic(name="Debug", shellname="avmshell_d_64", vmargs="", config="", scriptargs=""))
     mac_intel_64_test_factory.addStep(test_generic(name="DebugDebugger", shellname="avmshell_sd_64", vmargs="", config="", scriptargs=""))
     mac_intel_64_test_factory.addStep(util_process_clean)
@@ -1172,17 +1172,17 @@ class argo:
                 'builddir': './argo-mac64-intel-test',
     }
 
     ########################################
     #### builder for mac-ppc-10_4a-test ####
     ########################################
     mac_ppc_104a_test_factory = factory.BuildFactory()
     mac_ppc_104a_test_factory.addStep(test_commandline)
-    mac_ppc_104a_test_factory.addStep(test_selftest)
+    mac_ppc_104a_test_factory.addStep(test_selftest(name="Release", shellname="avmshell_104_ppc"))
     mac_ppc_104a_test_factory.addStep(test_generic(name="Release", shellname="avmshell_104_ppc", vmargs="", config="", scriptargs=""))
     mac_ppc_104a_test_factory.addStep(test_generic(name="Release-interp", shellname="avmshell_104_ppc", vmargs="-Dinterp", config="", scriptargs=""))
     mac_ppc_104a_test_factory.addStep(test_generic(name="Release-wordcode-interp", shellname="avmshell_wordcode_104_ppc", vmargs="-Dinterp", config="", scriptargs=""))
     mac_ppc_104a_test_factory.addStep(test_generic(name="Release-jit", shellname="avmshell_104_ppc", vmargs="-Ojit", config="", scriptargs=""))
     mac_ppc_104a_test_factory.addStep(test_generic(name="Debug", shellname="avmshell_d_104_ppc", vmargs="", config="", scriptargs=""))
     mac_ppc_104a_test_factory.addStep(util_process_clean)
     mac_ppc_104a_test_factory.addStep(util_clean_buildsdir)
 
@@ -1211,17 +1211,17 @@ class argo:
     }
 
 
     ########################################
     #### builder for mac-ppc-10_5a-test ####
     ########################################
     mac_ppc_105a_test_factory = factory.BuildFactory()
     mac_ppc_105a_test_factory.addStep(test_commandline)
-    mac_ppc_105a_test_factory.addStep(test_selftest)
+    mac_ppc_105a_test_factory.addStep(test_selftest(name="Release", shellname="avmshell_ppc"))
     mac_ppc_105a_test_factory.addStep(test_generic(name="Release", shellname="avmshell_ppc", vmargs="", config="", scriptargs=""))
     mac_ppc_105a_test_factory.addStep(test_generic(name="Release-interp", shellname="avmshell_ppc", vmargs="-Dinterp", config="", scriptargs=""))
     mac_ppc_105a_test_factory.addStep(test_generic(name="Release-wordcode-interp", shellname="avmshell_wordcode_ppc", vmargs="-Dinterp", config="", scriptargs=""))
     mac_ppc_105a_test_factory.addStep(test_generic(name="Release-jit", shellname="avmshell_ppc", vmargs="-Ojit", config="", scriptargs=""))
     mac_ppc_105a_test_factory.addStep(test_generic(name="Debug", shellname="avmshell_d_ppc", vmargs="", config="", scriptargs=""))
     mac_ppc_105a_test_factory.addStep(util_process_clean)
     mac_ppc_105a_test_factory.addStep(util_clean_buildsdir)
 
@@ -1250,17 +1250,17 @@ class argo:
     }
 
 
     ####################################
     #### builder for mac64-ppc-test ####
     ####################################
     mac_ppc_64_test_factory = factory.BuildFactory()
     mac_ppc_64_test_factory.addStep(test_commandline)
-    mac_ppc_64_test_factory.addStep(test_selftest)
+    mac_ppc_64_test_factory.addStep(test_selftest(name="Release", shellname="avmshell_64_ppc"))
     mac_ppc_64_test_factory.addStep(test_generic(name="Release", shellname="avmshell_64_ppc", vmargs="", config="", scriptargs=""))
     mac_ppc_64_test_factory.addStep(test_generic(name="Release-interp", shellname="avmshell_64_ppc", vmargs="-Dinterp", config="", scriptargs=""))
     mac_ppc_64_test_factory.addStep(test_generic(name="Release-wordcode-interp", shellname="avmshell_wordcode_64_ppc", vmargs="-Dinterp", config="", scriptargs=""))
     mac_ppc_64_test_factory.addStep(test_generic(name="Release-jit", shellname="avmshell_64_ppc", vmargs="-Ojit", config="", scriptargs=""))
     mac_ppc_64_test_factory.addStep(test_generic(name="ReleaseDebugger", shellname="avmshell_s_64_ppc", vmargs="", config="", scriptargs=""))
     mac_ppc_64_test_factory.addStep(test_generic(name="Debug", shellname="avmshell_d_64_ppc", vmargs="", config="", scriptargs=""))
     mac_ppc_64_test_factory.addStep(test_generic(name="DebugDebugger", shellname="avmshell_sd_64_ppc", vmargs="", config="", scriptargs=""))
     mac_ppc_64_test_factory.addStep(util_process_clean)
@@ -1274,17 +1274,17 @@ class argo:
     }
 
 
     ################################
     #### builder for linux-test ####
     ################################
     linux_test_factory = factory.BuildFactory()
     linux_test_factory.addStep(test_commandline)
-    linux_test_factory.addStep(test_selftest)
+    linux_test_factory.addStep(test_selftest(name="Release", shellname="avmshell"))
     linux_test_factory.addStep(test_generic(name="Release", shellname="avmshell", vmargs="", config="", scriptargs=""))
     linux_test_factory.addStep(test_generic(name="Release-interp", shellname="avmshell", vmargs="-Dinterp", config="", scriptargs=""))
     linux_test_factory.addStep(test_generic(name="Release-wordcode-interp", shellname="avmshell_wordcode", vmargs="-Dinterp", config="", scriptargs=""))
     linux_test_factory.addStep(test_generic(name="Release-jit", shellname="avmshell", vmargs="-Ojit", config="", scriptargs=""))
     linux_test_factory.addStep(test_generic(name="ReleaseDebugger", shellname="avmshell_s", vmargs="", config="", scriptargs=""))
     linux_test_factory.addStep(test_generic(name="Debug", shellname="avmshell_d", vmargs="", config="", scriptargs=""))
     linux_test_factory.addStep(test_generic(name="DebugDebugger", shellname="avmshell_sd", vmargs="", config="", scriptargs=""))
     linux_test_factory.addStep(test_differential)
@@ -1299,17 +1299,17 @@ class argo:
     }
 
 
     ##################################
     #### builder for linux64-test ####
     ##################################
     linux_64_test_factory = factory.BuildFactory()
     linux_64_test_factory.addStep(test_commandline)
-    linux_64_test_factory.addStep(test_selftest)
+    linux_64_test_factory.addStep(test_selftest(name="Release", shellname="avmshell_64"))
     linux_64_test_factory.addStep(test_generic(name="Release", shellname="avmshell_64", vmargs="", config="", scriptargs=""))
     linux_64_test_factory.addStep(test_generic(name="Release-interp", shellname="avmshell_64", vmargs="-Dinterp", config="", scriptargs=""))
     linux_64_test_factory.addStep(test_generic(name="Release-wordcode-interp", shellname="avmshell_wordcode_64", vmargs="-Dinterp", config="", scriptargs=""))
     linux_64_test_factory.addStep(test_generic(name="Release-jit", shellname="avmshell_64", vmargs="-Ojit", config="", scriptargs=""))
     linux_64_test_factory.addStep(test_generic(name="ReleaseDebugger", shellname="avmshell_s_64", vmargs="", config="", scriptargs=""))
     linux_64_test_factory.addStep(test_generic(name="Debug", shellname="avmshell_d_64", vmargs="", config="", scriptargs=""))
     linux_64_test_factory.addStep(test_generic(name="DebugDebugger", shellname="avmshell_sd_64", vmargs="", config="", scriptargs=""))
     linux_64_test_factory.addStep(util_process_clean)
@@ -1342,17 +1342,17 @@ class argo:
     }
 
 
     ########################################
     #### builder for solaris-sparc-test ####
     ########################################
     solaris_sparc_test_factory = factory.BuildFactory()
     solaris_sparc_test_factory.addStep(test_commandline)
-    solaris_sparc_test_factory.addStep(test_selftest)
+    solaris_sparc_test_factory.addStep(test_selftest(name="Release", shellname="avmshell"))
     solaris_sparc_test_factory.addStep(test_generic(name="Debug", shellname="avmshell_d", vmargs="", config="", scriptargs=""))
     solaris_sparc_test_factory.addStep(test_generic(name="DebugDebugger", shellname="avmshell_sd", vmargs="", config="", scriptargs=""))
     solaris_sparc_test_factory.addStep(util_process_clean)
     solaris_sparc_test_factory.addStep(util_clean_buildsdir)
 
     solaris_sparc_test_builder = {
                 'name': "solaris-sparc-test-argo",
                 'slavename': "asteamsol4",
@@ -1403,17 +1403,17 @@ class argo:
                 'builddir': './argo-android-test',
     }
     
     
     ##########################################
     #### builder for linux-arm-test       ####
     ##########################################
     linux_arm_test_factory = factory.BuildFactory()
-    linux_arm_test_factory.addStep(test_selftest)
+    linux_arm_test_factory.addStep(test_selftest(name="Release", shellname="avmshell_neon_arm"))
     linux_arm_test_factory.addStep(test_generic(name="Release-softfloat", shellname="avmshell_neon_arm", vmargs="", config="", scriptargs=""))
     linux_arm_test_factory.addStep(test_generic(name="Release-vfp", shellname="avmshell_neon_arm", vmargs="-Darm_arch 7 -Darm_vfp", config="", scriptargs=""))
     linux_arm_test_factory.addStep(test_generic(name="Release-jit-vfp", shellname="avmshell_neon_arm", vmargs="-Darm_arch 7 -Darm_vfp -Ojit", config="", scriptargs=""))
     linux_arm_test_factory.addStep(util_process_clean)
     linux_arm_test_factory.addStep(util_clean_buildsdir)
 
     linux_arm_test_builder = {
                 'name': "linux-arm-test-argo",
@@ -1686,17 +1686,17 @@ class argo:
     windows_p3_deep_factory = factory.BuildFactory()
     windows_p3_deep_factory.addStep(sync_clean)
     windows_p3_deep_factory.addStep(sync_clone(url=HG_URL))
     windows_p3_deep_factory.addStep(sync_update)
     windows_p3_deep_factory.addStep(bb_slaveupdate(slave="windows-p3-deep"))
     windows_p3_deep_factory.addStep(download_testmedia)
     windows_p3_deep_factory.addStep(test_smoke)
     windows_p3_deep_factory.addStep(test_commandline)
-    windows_p3_deep_factory.addStep(test_selftest)
+    windows_p3_deep_factory.addStep(test_selftest(name="Release", shellname="avmshell"))
     windows_p3_deep_factory.addStep(test_generic(name="Release", shellname="avmshell", vmargs="", config="", scriptargs=""))
     windows_p3_deep_factory.addStep(test_generic(name="Release-interp", shellname="avmshell", vmargs="-Dinterp", config="", scriptargs=""))
     windows_p3_deep_factory.addStep(test_generic(name="Release-wordcode-interp", shellname="avmshell_wordcode", vmargs="-Dinterp", config="", scriptargs=""))
     windows_p3_deep_factory.addStep(test_generic(name="Release-jit", shellname="avmshell", vmargs="-Ojit", config="", scriptargs=""))
     windows_p3_deep_factory.addStep(test_generic(name="ReleaseDebugger", shellname="avmshell_s", vmargs="", config="", scriptargs=""))
     windows_p3_deep_factory.addStep(test_generic(name="Debug", shellname="avmshell_d", vmargs="", config="", scriptargs=""))
     windows_p3_deep_factory.addStep(test_generic(name="DebugDebugger", shellname="avmshell_sd", vmargs="", config="", scriptargs=""))
     #windows_p3_deep_factory.addStep(test_differential)
--- a/build/buildbot/master/commonsteps.py
+++ b/build/buildbot/master/commonsteps.py
@@ -236,23 +236,26 @@ test_smoke = TestSuiteShellCommand(
 test_emulator_smoke_mobile = TestSuiteShellCommand(
             command=['../all/run-smoketests-arm-emulator.sh', WithProperties('%s','revision')],
             env={'branch': WithProperties('%s','branch'), 'silent':WithProperties('%s','silent')},
             description='starting to run smoke tests...',
             descriptionDone='finished smoke tests.',
             name="SmokeTest",
             workdir="../repo/build/buildbot/slaves/scripts")
 
-test_selftest = TestSuiteShellCommand(
-            command=['../all/run-selftest.sh', WithProperties('%s','revision')],
+def test_selftest(name, shellname):
+    # factory.addStep(test_selftest("Release", "avmshell"))
+    return TestSuiteShellCommand(
+            command=['../all/run-selftest-generic.sh', WithProperties('%s','revision'), '%s' % shellname],
             env={'branch': WithProperties('%s','branch'), 'silent':WithProperties('%s','silent')},
-            description='starting selftest release...',
-            descriptionDone='finished selftest release.',
-            name="Testsuite_Selftest",
-            workdir="../repo/build/buildbot/slaves/scripts")
+            description='starting selftest %s...' % name,
+            descriptionDone='finished selftest %s.' % name,
+            name="Testsuite_Selftest_%s" % name,
+            workdir="../repo/build/buildbot/slaves/scripts"
+            )
 
 test_commandline = TestSuiteShellCommand(
             command=['../all/run-commandline-tests.sh', WithProperties('%s','revision')],
             env={'branch': WithProperties('%s','branch'), 'silent':WithProperties('%s','silent')},
             description='starting commandline tests...',
             descriptionDone='finished commandline tests.',
             name="Testsuite_Commandline",
             workdir="../repo/build/buildbot/slaves/scripts")
--- a/build/buildbot/master/custom/buildbot_ext/status/custommail.py
+++ b/build/buildbot/master/custom/buildbot_ext/status/custommail.py
@@ -195,45 +195,58 @@ class CustomMail(AggregateMailNotifier):
             for u in build.getInterestedUsers():
                 d = defer.maybeDeferred(self.lookup.getAddress, u)
                 d.addCallback(recipients.append)
                 dl.append(d)
         d = defer.DeferredList(dl)
         d.addCallback(self._gotRecipients, recipients, m)
         return d
 
+    def getChangesText(changes):
+        text = 'Changes in this build:\n'
+        for n, change in enumerate(changes):
+            text += '\n'
+            text += '%s.\n' % (n+1)
+            text += '    Revision: %s\n' % change.revision
+            text += '    User: %s\n' % change.who
+            commentsList = change.comments.split('\n')
+            if commentsList:
+                text += '    Comments: %s\n' % commentsList.pop(0)
+                # print the rest of the comments (if any)
+                for comment in commentsList:
+                    text += '              %s\n' % comment
+        text += '\n'
+        return text
+    
     def sendAggregateMail(self, cachedResults):
         # cachedResults is a list of dicts: {'name':name, 'build':build, 'results':results}
         projectName = self.status.getProjectName()
         
         # build will be the same for all messages, so just use the first one
         build = cachedResults[0]['build']
         
-        source = build.getSourceStamp().revision
+        sourcestamp = build.getSourceStamp()
+        source = sourcestamp.revision
         
         # Delimiting wht "," causes email subject line to contain a TAB character for some reason
         blamelist = "|".join(build.getResponsibleUsers())
         p = re.compile(" <[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?>")
         blamelist = p.sub("", blamelist)
         
         slaves = []
         results = []
         for result in cachedResults:
             slaves.append(result['name'])
             results.append(result['results'])
 
         text = ''
-        text += "Blame:  %s\n" % blamelist
         text += "Slave(s):  %s\n" % ', '.join(slaves)
         text += "Branch:    %s\n" % self.branch
-        text += "        %s\n" % self.status.getBuildbotURL()
-        text += "Change: %s\n" % source
-        # TODO - handle results other than FAILURE
-        text += "Status: fail"
-        text += "\n"
+        
+        text += self.getChangesText(sourcestamp.changes)
         
         if FAILURE in results:
             text += "Log(s) of failed build steps:\n"
             for result in cachedResults:
                 if result['results'] == FAILURE:
                     build = result['build']
                     text += "  Slave: %s\n" % result['name']
                     for step in build.getSteps():
@@ -317,20 +330,24 @@ class PassedMailNotifier(CustomMail):
                  schedulerGroups,
                  schedulerGroupsSendFirst
                  )
         
     def sendAggregateMail(self, cachedResults):
         # cachedResults is a list of dicts: {'name':name, 'build':build, 'results':results}
         projectName = self.status.getProjectName()
         
+        from dbgp.client import brk
+        brk(host="localhost", port=9000)
+        
         # build will be the same for all messages, so just use the first one
         build = cachedResults[0]['build']
         
-        source = build.getSourceStamp().revision
+        sourcestamp = build.getSourceStamp()
+        source = sourcestamp.revision
         
         # Delimiting wht "," causes email subject line to contain a TAB character for some reason
         blamelist = "|".join(build.getResponsibleUsers())
         p = re.compile(" <[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?>")
         blamelist = p.sub("", blamelist)
         
         slaves = []
         results = []
@@ -338,20 +355,20 @@ class PassedMailNotifier(CustomMail):
             slaves.append(result['name'])
             results.append(result['results'])
 
         # If _any_ build failed, then we do not send this email (failure emails are dealt with separately)
         if FAILURE in results:
             return
 
         text = ''
-        text += "Change: %s\n" % source
-        text += "\n"
-        text += "Congratulations, your %s build has passed all acceptance tests!" % self.branch
+        text += 'Congratulations, your %s build has passed all acceptance tests!\n' % self.branch
         
+        text += '\n'
+        text += self.getChangesText(sourcestamp.changes)
         
         m = Message()
         m.set_payload(text)
         
         m['Date'] = formatdate(localtime=True)
         m['Subject'] = self.subject % { 'result': 'pass',
                                         'blamelist': blamelist,
                                         'branch': self.branch,
--- a/build/buildbot/master/sandbox.py
+++ b/build/buildbot/master/sandbox.py
@@ -989,17 +989,17 @@ class sandbox:
 
 
 
     ##########################################
     #### builder for windows-test-sandbox ####
     ##########################################
     sb_windows_test_factory = factory.BuildFactory()
     sb_windows_test_factory.addStep(test_commandline)
-    sb_windows_test_factory.addStep(test_selftest)
+    sb_windows_test_factory.addStep(test_selftest(name="Release", shellname="avmshell"))
     sb_windows_test_factory.addStep(test_generic(name="Release", shellname="avmshell", vmargs="", config="", scriptargs=""))
     sb_windows_test_factory.addStep(test_generic(name="Release-interp", shellname="avmshell", vmargs="-Dinterp", config="", scriptargs=""))
     sb_windows_test_factory.addStep(test_generic(name="Release-wordcode-interp", shellname="avmshell_wordcode", vmargs="-Dinterp", config="", scriptargs=""))
     sb_windows_test_factory.addStep(test_generic(name="Release-jit", shellname="avmshell", vmargs="-Ojit", config="", scriptargs=""))
     sb_windows_test_factory.addStep(test_generic(name="ReleaseDebugger", shellname="avmshell_s", vmargs="", config="", scriptargs=""))
     sb_windows_test_factory.addStep(test_generic(name="Debug", shellname="avmshell_d", vmargs="", config="", scriptargs=""))
     sb_windows_test_factory.addStep(test_generic(name="DebugDebugger", shellname="avmshell_sd", vmargs="", config="", scriptargs=""))
     sb_windows_test_factory.addStep(test_differential)
@@ -1013,17 +1013,17 @@ class sandbox:
                 'builddir': './sandbox-windows-test',
     }
 
     ############################################
     #### builder for windows64-test-sandbox ####
     ############################################
     sb_windows_64_test_factory = factory.BuildFactory()
     sb_windows_64_test_factory.addStep(test_commandline)
-    sb_windows_64_test_factory.addStep(test_selftest)
+    sb_windows_64_test_factory.addStep(test_selftest(name="Release", shellname="avmshell_64"))
     sb_windows_64_test_factory.addStep(test_generic(name="Release", shellname="avmshell_64", vmargs="", config="", scriptargs=""))
     sb_windows_64_test_factory.addStep(test_generic(name="Release-interp", shellname="avmshell_64", vmargs="-Dinterp", config="", scriptargs=""))
     sb_windows_64_test_factory.addStep(test_generic(name="Release-wordcode-interp", shellname="avmshell_wordcode_64", vmargs="-Dinterp", config="", scriptargs=""))
     sb_windows_64_test_factory.addStep(test_generic(name="Release-jit", shellname="avmshell_64", vmargs="-Ojit", config="", scriptargs=""))
     sb_windows_64_test_factory.addStep(test_generic(name="ReleaseDebugger", shellname="avmshell_s_64", vmargs="", config="", scriptargs=""))
     sb_windows_64_test_factory.addStep(test_generic(name="Debug", shellname="avmshell_d_64", vmargs="", config="", scriptargs=""))
     sb_windows_64_test_factory.addStep(test_generic(name="DebugDebugger", shellname="avmshell_sd_64", vmargs="", config="", scriptargs=""))
     sb_windows_64_test_factory.addStep(util_process_clean)
@@ -1037,17 +1037,17 @@ class sandbox:
     }
 
 
     #################################################
     #### builder for mac-intel-10_4-test-sandbox ####
     #################################################
     sb_mac_intel_104_test_factory = factory.BuildFactory()
     sb_mac_intel_104_test_factory.addStep(test_commandline)
-    sb_mac_intel_104_test_factory.addStep(test_selftest)
+    sb_mac_intel_104_test_factory.addStep(test_selftest(name="Release", shellname="avmshell_104"))
     sb_mac_intel_104_test_factory.addStep(test_generic(name="Release", shellname="avmshell_104", vmargs="", config="", scriptargs=""))
     sb_mac_intel_104_test_factory.addStep(test_generic(name="Release-interp", shellname="avmshell_104", vmargs="-Dinterp", config="", scriptargs=""))
     sb_mac_intel_104_test_factory.addStep(test_generic(name="Release-wordcode-interp", shellname="avmshell_wordcode_104", vmargs="-Dinterp", config="", scriptargs=""))
     sb_mac_intel_104_test_factory.addStep(test_generic(name="Release-jit", shellname="avmshell_104", vmargs="-Ojit", config="", scriptargs=""))
     sb_mac_intel_104_test_factory.addStep(test_generic(name="ReleaseDebugger", shellname="avmshell_s_104", vmargs="", config="", scriptargs=""))
     sb_mac_intel_104_test_factory.addStep(test_generic(name="Debug", shellname="avmshell_d_104", vmargs="", config="", scriptargs=""))
     sb_mac_intel_104_test_factory.addStep(test_generic(name="DebugDebugger", shellname="avmshell_sd_104", vmargs="", config="", scriptargs=""))
     sb_mac_intel_104_test_factory.addStep(test_differential)
@@ -1063,17 +1063,17 @@ class sandbox:
 
 
 
     #################################################
     #### builder for mac-intel-10_5-test-sandbox ####
     #################################################
     sb_mac_intel_105_test_factory = factory.BuildFactory()
     sb_mac_intel_105_test_factory.addStep(test_commandline)
-    sb_mac_intel_105_test_factory.addStep(test_selftest)
+    sb_mac_intel_105_test_factory.addStep(test_selftest(name="Release", shellname="avmshell"))
     sb_mac_intel_105_test_factory.addStep(test_generic(name="Release", shellname="avmshell", vmargs="", config="", scriptargs=""))
     sb_mac_intel_105_test_factory.addStep(test_generic(name="Release-interp", shellname="avmshell", vmargs="-Dinterp", config="", scriptargs=""))
     sb_mac_intel_105_test_factory.addStep(test_generic(name="Release-wordcode-interp", shellname="avmshell_wordcode", vmargs="-Dinterp", config="", scriptargs=""))
     sb_mac_intel_105_test_factory.addStep(test_generic(name="Release-jit", shellname="avmshell", vmargs="-Ojit", config="", scriptargs=""))
     sb_mac_intel_105_test_factory.addStep(test_generic(name="ReleaseDebugger", shellname="avmshell_s", vmargs="", config="", scriptargs=""))
     sb_mac_intel_105_test_factory.addStep(test_generic(name="Debug", shellname="avmshell_d", vmargs="", config="", scriptargs=""))
     sb_mac_intel_105_test_factory.addStep(test_generic(name="DebugDebugger", shellname="avmshell_sd", vmargs="", config="", scriptargs=""))
     sb_mac_intel_105_test_factory.addStep(test_differential)
@@ -1087,17 +1087,17 @@ class sandbox:
                 'builddir': './sandbox-mac-intel-10_5-test',
     }
 
     ##############################################
     #### builder for mac64-intel-test-sandbox ####
     ##############################################
     sb_mac_intel_64_test_factory = factory.BuildFactory()
     sb_mac_intel_64_test_factory.addStep(test_commandline)
-    sb_mac_intel_64_test_factory.addStep(test_selftest)
+    sb_mac_intel_64_test_factory.addStep(test_selftest(name="Release", shellname="avmshell_64"))
     sb_mac_intel_64_test_factory.addStep(test_generic(name="Release", shellname="avmshell_64", vmargs="", config="", scriptargs=""))
     sb_mac_intel_64_test_factory.addStep(test_generic(name="Release-interp", shellname="avmshell_64", vmargs="-Dinterp", config="", scriptargs=""))
     sb_mac_intel_64_test_factory.addStep(test_generic(name="Release-wordcode-interp", shellname="avmshell_wordcode_64", vmargs="-Dinterp", config="", scriptargs=""))
     sb_mac_intel_64_test_factory.addStep(test_generic(name="Release-jit", shellname="avmshell_64", vmargs="-Ojit", config="", scriptargs=""))
     sb_mac_intel_64_test_factory.addStep(test_generic(name="ReleaseDebugger", shellname="avmshell_s_64", vmargs="", config="", scriptargs=""))
     sb_mac_intel_64_test_factory.addStep(test_generic(name="Debug", shellname="avmshell_d_64", vmargs="", config="", scriptargs=""))
     sb_mac_intel_64_test_factory.addStep(test_generic(name="DebugDebugger", shellname="avmshell_sd_64", vmargs="", config="", scriptargs=""))
     sb_mac_intel_64_test_factory.addStep(util_process_clean)
@@ -1111,17 +1111,17 @@ class sandbox:
     }
 
 
     ################################################
     #### builder for mac-ppc-10_4a-test-sandbox ####
     ################################################
     sb_mac_ppc_104a_test_factory = factory.BuildFactory()
     sb_mac_ppc_104a_test_factory.addStep(test_commandline)
-    sb_mac_ppc_104a_test_factory.addStep(test_selftest)
+    sb_mac_ppc_104a_test_factory.addStep(test_selftest(name="Release", shellname="avmshell_104_ppc"))
     sb_mac_ppc_104a_test_factory.addStep(test_generic(name="Release", shellname="avmshell_104_ppc", vmargs="", config="", scriptargs=""))
     sb_mac_ppc_104a_test_factory.addStep(test_generic(name="Release-interp", shellname="avmshell_104_ppc", vmargs="-Dinterp", config="", scriptargs=""))
     sb_mac_ppc_104a_test_factory.addStep(test_generic(name="Release-wordcode-interp", shellname="avmshell_wordcode_104_ppc", vmargs="-Dinterp", config="", scriptargs=""))
     sb_mac_ppc_104a_test_factory.addStep(test_generic(name="Release-jit", shellname="avmshell_104_ppc", vmargs="-Ojit", config="", scriptargs=""))
     sb_mac_ppc_104a_test_factory.addStep(test_generic(name="Debug", shellname="avmshell_d_104_ppc", vmargs="", config="", scriptargs=""))
     sb_mac_ppc_104a_test_factory.addStep(util_process_clean)
     sb_mac_ppc_104a_test_factory.addStep(util_clean_buildsdir)
 
@@ -1150,17 +1150,17 @@ class sandbox:
     }
 
 
     ################################################
     #### builder for mac-ppc-10_5a-test-sandbox ####
     ################################################
     sb_mac_ppc_105a_test_factory = factory.BuildFactory()
     sb_mac_ppc_105a_test_factory.addStep(test_commandline)
-    sb_mac_ppc_105a_test_factory.addStep(test_selftest)
+    sb_mac_ppc_105a_test_factory.addStep(test_selftest(name="Release", shellname="avmshell_ppc"))
     sb_mac_ppc_105a_test_factory.addStep(test_generic(name="Release", shellname="avmshell_ppc", vmargs="", config="", scriptargs=""))
     sb_mac_ppc_105a_test_factory.addStep(test_generic(name="Release-interp", shellname="avmshell_ppc", vmargs="-Dinterp", config="", scriptargs=""))
     sb_mac_ppc_105a_test_factory.addStep(test_generic(name="Release-wordcode-interp", shellname="avmshell_wordcode_ppc", vmargs="-Dinterp", config="", scriptargs=""))
     sb_mac_ppc_105a_test_factory.addStep(test_generic(name="Release-jit", shellname="avmshell_ppc", vmargs="-Ojit", config="", scriptargs=""))
     sb_mac_ppc_105a_test_factory.addStep(test_generic(name="Debug", shellname="avmshell_d_ppc", vmargs="", config="", scriptargs=""))
     sb_mac_ppc_105a_test_factory.addStep(util_process_clean)
     sb_mac_ppc_105a_test_factory.addStep(util_clean_buildsdir)
 
@@ -1188,17 +1188,17 @@ class sandbox:
     }
 
 
     ############################################
     #### builder for mac64-ppc-test-sandbox ####
     ############################################
     sb_mac_ppc_64_test_factory = factory.BuildFactory()
     sb_mac_ppc_64_test_factory.addStep(test_commandline)
-    sb_mac_ppc_64_test_factory.addStep(test_selftest)
+    sb_mac_ppc_64_test_factory.addStep(test_selftest(name="Release", shellname="avmshell_64_ppc"))
     sb_mac_ppc_64_test_factory.addStep(test_generic(name="Release", shellname="avmshell_64_ppc", vmargs="", config="", scriptargs=""))
     sb_mac_ppc_64_test_factory.addStep(test_generic(name="Release-interp", shellname="avmshell_64_ppc", vmargs="-Dinterp", config="", scriptargs=""))
     sb_mac_ppc_64_test_factory.addStep(test_generic(name="Release-wordcode-interp", shellname="avmshell_wordcode_64_ppc", vmargs="-Dinterp", config="", scriptargs=""))
     sb_mac_ppc_64_test_factory.addStep(test_generic(name="Release-jit", shellname="avmshell_64_ppc", vmargs="-Ojit", config="", scriptargs=""))
     sb_mac_ppc_64_test_factory.addStep(test_generic(name="ReleaseDebugger", shellname="avmshell_s_64_ppc", vmargs="", config="", scriptargs=""))
     sb_mac_ppc_64_test_factory.addStep(test_generic(name="Debug", shellname="avmshell_d_64_ppc", vmargs="", config="", scriptargs=""))
     sb_mac_ppc_64_test_factory.addStep(test_generic(name="DebugDebugger", shellname="avmshell_sd_64_ppc", vmargs="", config="", scriptargs=""))
     sb_mac_ppc_64_test_factory.addStep(util_process_clean)
@@ -1212,17 +1212,17 @@ class sandbox:
     }
 
 
     ########################################
     #### builder for linux-test-sandbox ####
     ########################################
     sb_linux_test_factory = factory.BuildFactory()
     sb_linux_test_factory.addStep(test_commandline)
-    sb_linux_test_factory.addStep(test_selftest)
+    sb_linux_test_factory.addStep(test_selftest(name="Release", shellname="avmshell"))
     sb_linux_test_factory.addStep(test_generic(name="Release", shellname="avmshell", vmargs="", config="", scriptargs=""))
     sb_linux_test_factory.addStep(test_generic(name="Release-interp", shellname="avmshell", vmargs="-Dinterp", config="", scriptargs=""))
     sb_linux_test_factory.addStep(test_generic(name="Release-wordcode-interp", shellname="avmshell_wordcode", vmargs="-Dinterp", config="", scriptargs=""))
     sb_linux_test_factory.addStep(test_generic(name="Release-jit", shellname="avmshell", vmargs="-Ojit", config="", scriptargs=""))
     sb_linux_test_factory.addStep(test_generic(name="ReleaseDebugger", shellname="avmshell_s", vmargs="", config="", scriptargs=""))
     sb_linux_test_factory.addStep(test_generic(name="Debug", shellname="avmshell_d", vmargs="", config="", scriptargs=""))
     sb_linux_test_factory.addStep(test_generic(name="DebugDebugger", shellname="avmshell_sd", vmargs="", config="", scriptargs=""))
     sb_linux_test_factory.addStep(test_differential)
@@ -1237,17 +1237,17 @@ class sandbox:
     }
 
 
     ##########################################
     #### builder for linux64-test-sandbox ####
     ##########################################
     sb_linux_64_test_factory = factory.BuildFactory()
     sb_linux_64_test_factory.addStep(test_commandline)
-    sb_linux_64_test_factory.addStep(test_selftest)
+    sb_linux_64_test_factory.addStep(test_selftest(name="Release", shellname="avmshell_64"))
     sb_linux_64_test_factory.addStep(test_generic(name="Release", shellname="avmshell_64", vmargs="", config="", scriptargs=""))
     sb_linux_64_test_factory.addStep(test_generic(name="Release-interp", shellname="avmshell_64", vmargs="-Dinterp", config="", scriptargs=""))
     sb_linux_64_test_factory.addStep(test_generic(name="Release-wordcode-interp", shellname="avmshell_wordcode_64", vmargs="-Dinterp", config="", scriptargs=""))
     sb_linux_64_test_factory.addStep(test_generic(name="Release-jit", shellname="avmshell_64", vmargs="-Ojit", config="", scriptargs=""))
     sb_linux_64_test_factory.addStep(test_generic(name="ReleaseDebugger", shellname="avmshell_s_64", vmargs="", config="", scriptargs=""))
     sb_linux_64_test_factory.addStep(test_generic(name="Debug", shellname="avmshell_d_64", vmargs="", config="", scriptargs=""))
     sb_linux_64_test_factory.addStep(test_generic(name="DebugDebugger", shellname="avmshell_sd_64", vmargs="", config="", scriptargs=""))
     sb_linux_64_test_factory.addStep(util_process_clean)
@@ -1279,17 +1279,17 @@ class sandbox:
     }
 
 
     ########################################
     #### builder for solaris-sparc-test ####
     ########################################
     sb_solaris_sparc_test_factory = factory.BuildFactory()
     sb_solaris_sparc_test_factory.addStep(test_commandline)
-    sb_solaris_sparc_test_factory.addStep(test_selftest)
+    sb_solaris_sparc_test_factory.addStep(test_selftest(name="Release", shellname="avmshell"))
     sb_solaris_sparc_test_factory.addStep(test_generic(name="Debug", shellname="avmshell_d", vmargs="", config="", scriptargs=""))
     sb_solaris_sparc_test_factory.addStep(test_generic(name="DebugDebugger", shellname="avmshell_sd", vmargs="", config="", scriptargs=""))
     sb_solaris_sparc_test_factory.addStep(util_process_clean)
     sb_solaris_sparc_test_factory.addStep(util_clean_buildsdir)
 
     sb_solaris_sparc_test_builder = {
                 'name': "solaris-sparc-test-sandbox",
                 'slavename': "asteamsol4",
@@ -1339,17 +1339,17 @@ class sandbox:
                 'factory': sb_android_test_factory,
                 'builddir': './sandbox-android-test',
     }
     
     ##########################################
     #### builder for linux-arm-test       ####
     ##########################################
     sb_linux_arm_test_factory = factory.BuildFactory()
-    sb_linux_arm_test_factory.addStep(test_selftest)
+    sb_linux_arm_test_factory.addStep(test_selftest(name="Release", shellname="avmshell_neon_arm"))
     sb_linux_arm_test_factory.addStep(test_generic(name="Release-softfloat", shellname="avmshell_neon_arm", vmargs="", config="", scriptargs=""))
     sb_linux_arm_test_factory.addStep(test_generic(name="Release-vfp", shellname="avmshell_neon_arm", vmargs="-Darm_arch 7 -Darm_vfp", config="", scriptargs=""))
     sb_linux_arm_test_factory.addStep(test_generic(name="Release-jit-vfp", shellname="avmshell_neon_arm", vmargs="-Darm_arch 7 -Darm_vfp -Ojit", config="", scriptargs=""))
     sb_linux_arm_test_factory.addStep(util_process_clean)
     sb_linux_arm_test_factory.addStep(util_clean_buildsdir)
 
     sb_linux_arm_test_builder = {
                 'name': "linux-arm-test-sandbox",
--- a/build/buildbot/master/tamarinredux.py
+++ b/build/buildbot/master/tamarinredux.py
@@ -1131,17 +1131,17 @@ class tamarinredux:
 
 
 
     ##################################
     #### builder for windows-test ####
     ##################################
     windows_test_factory = factory.BuildFactory()
     windows_test_factory.addStep(test_commandline)
-    windows_test_factory.addStep(test_selftest)
+    windows_test_factory.addStep(test_selftest(name="Release", shellname="avmshell"))
     windows_test_factory.addStep(test_generic(name="Release", shellname="avmshell", vmargs="", config="", scriptargs=""))
     windows_test_factory.addStep(test_generic(name="Release-interp", shellname="avmshell", vmargs="-Dinterp", config="", scriptargs=""))
     windows_test_factory.addStep(test_generic(name="Release-wordcode-interp", shellname="avmshell_wordcode", vmargs="-Dinterp", config="", scriptargs=""))
     windows_test_factory.addStep(test_generic(name="Release-jit", shellname="avmshell", vmargs="-Ojit", config="", scriptargs=""))
     windows_test_factory.addStep(test_generic(name="ReleaseDebugger", shellname="avmshell_s", vmargs="", config="", scriptargs=""))
     windows_test_factory.addStep(test_generic(name="Debug", shellname="avmshell_d", vmargs="", config="", scriptargs=""))
     windows_test_factory.addStep(test_generic(name="DebugDebugger", shellname="avmshell_sd", vmargs="", config="", scriptargs=""))
     windows_test_factory.addStep(test_differential)
@@ -1156,17 +1156,17 @@ class tamarinredux:
     }
 
 
     ####################################
     #### builder for windows64-test ####
     ####################################
     windows_64_test_factory = factory.BuildFactory()
     windows_64_test_factory.addStep(test_commandline)
-    windows_64_test_factory.addStep(test_selftest)
+    windows_64_test_factory.addStep(test_selftest(name="Release", shellname="avmshell_64"))
     windows_64_test_factory.addStep(test_generic(name="Release", shellname="avmshell_64", vmargs="", config="", scriptargs=""))
     windows_64_test_factory.addStep(test_generic(name="Release-interp", shellname="avmshell_64", vmargs="-Dinterp", config="", scriptargs=""))
     windows_64_test_factory.addStep(test_generic(name="Release-wordcode-interp", shellname="avmshell_wordcode_64", vmargs="-Dinterp", config="", scriptargs=""))
     windows_64_test_factory.addStep(test_generic(name="Release-jit", shellname="avmshell_64", vmargs="-Ojit", config="", scriptargs=""))
     windows_64_test_factory.addStep(test_generic(name="ReleaseDebugger", shellname="avmshell_s_64", vmargs="", config="", scriptargs=""))
     windows_64_test_factory.addStep(test_generic(name="Debug", shellname="avmshell_d_64", vmargs="", config="", scriptargs=""))
     windows_64_test_factory.addStep(test_generic(name="DebugDebugger", shellname="avmshell_sd_64", vmargs="", config="", scriptargs=""))
     windows_64_test_factory.addStep(util_process_clean)
@@ -1180,17 +1180,17 @@ class tamarinredux:
     }
 
 
     #########################################
     #### builder for mac-intel-10_4-test ####
     #########################################
     mac_intel_104_test_factory = factory.BuildFactory()
     mac_intel_104_test_factory.addStep(test_commandline)
-    mac_intel_104_test_factory.addStep(test_selftest)
+    mac_intel_104_test_factory.addStep(test_selftest(name="Release", shellname="avmshell_104"))
     mac_intel_104_test_factory.addStep(test_generic(name="Release", shellname="avmshell_104", vmargs="", config="", scriptargs=""))
     mac_intel_104_test_factory.addStep(test_generic(name="Release-interp", shellname="avmshell_104", vmargs="-Dinterp", config="", scriptargs=""))
     mac_intel_104_test_factory.addStep(test_generic(name="Release-wordcode-interp", shellname="avmshell_wordcode_104", vmargs="-Dinterp", config="", scriptargs=""))
     mac_intel_104_test_factory.addStep(test_generic(name="Release-jit", shellname="avmshell_104", vmargs="-Ojit", config="", scriptargs=""))
     mac_intel_104_test_factory.addStep(test_generic(name="ReleaseDebugger", shellname="avmshell_s_104", vmargs="", config="", scriptargs=""))
     mac_intel_104_test_factory.addStep(test_generic(name="Debug", shellname="avmshell_d_104", vmargs="", config="", scriptargs=""))
     mac_intel_104_test_factory.addStep(test_generic(name="DebugDebugger", shellname="avmshell_sd_104", vmargs="", config="", scriptargs=""))
     mac_intel_104_test_factory.addStep(test_differential)
@@ -1205,17 +1205,17 @@ class tamarinredux:
     }
 
 
     #########################################
     #### builder for mac-intel-10_5-test ####
     #########################################
     mac_intel_105_test_factory = factory.BuildFactory()
     mac_intel_105_test_factory.addStep(test_commandline)
-    mac_intel_105_test_factory.addStep(test_selftest)
+    mac_intel_105_test_factory.addStep(test_selftest(name="Release", shellname="avmshell"))
     mac_intel_105_test_factory.addStep(test_generic(name="Release", shellname="avmshell", vmargs="", config="", scriptargs=""))
     mac_intel_105_test_factory.addStep(test_generic(name="Release-interp", shellname="avmshell", vmargs="-Dinterp", config="", scriptargs=""))
     mac_intel_105_test_factory.addStep(test_generic(name="Release-wordcode-interp", shellname="avmshell_wordcode", vmargs="-Dinterp", config="", scriptargs=""))
     mac_intel_105_test_factory.addStep(test_generic(name="Release-jit", shellname="avmshell", vmargs="-Ojit", config="", scriptargs=""))
     mac_intel_105_test_factory.addStep(test_generic(name="ReleaseDebugger", shellname="avmshell_s", vmargs="", config="", scriptargs=""))
     mac_intel_105_test_factory.addStep(test_generic(name="Debug", shellname="avmshell_d", vmargs="", config="", scriptargs=""))
     mac_intel_105_test_factory.addStep(test_generic(name="DebugDebugger", shellname="avmshell_sd", vmargs="", config="", scriptargs=""))
     mac_intel_105_test_factory.addStep(test_differential)
@@ -1230,17 +1230,17 @@ class tamarinredux:
     }
 
 
     ######################################
     #### builder for mac64-intel-test ####
     ######################################
     mac_intel_64_test_factory = factory.BuildFactory()
     mac_intel_64_test_factory.addStep(test_commandline)
-    mac_intel_64_test_factory.addStep(test_selftest)
+    mac_intel_64_test_factory.addStep(test_selftest(name="Release", shellname="avmshell_64"))
     mac_intel_64_test_factory.addStep(test_generic(name="Release", shellname="avmshell_64", vmargs="", config="", scriptargs=""))
     mac_intel_64_test_factory.addStep(test_generic(name="Release-interp", shellname="avmshell_64", vmargs="-Dinterp", config="", scriptargs=""))
     mac_intel_64_test_factory.addStep(test_generic(name="Release-wordcode-interp", shellname="avmshell_wordcode_64", vmargs="-Dinterp", config="", scriptargs=""))
     mac_intel_64_test_factory.addStep(test_generic(name="Release-jit", shellname="avmshell_64", vmargs="-Ojit", config="", scriptargs=""))
     mac_intel_64_test_factory.addStep(test_generic(name="ReleaseDebugger", shellname="avmshell_s_64", vmargs="", config="", scriptargs=""))
     mac_intel_64_test_factory.addStep(test_generic(name="Debug", shellname="avmshell_d_64", vmargs="", config="", scriptargs=""))
     mac_intel_64_test_factory.addStep(test_generic(name="DebugDebugger", shellname="avmshell_sd_64", vmargs="", config="", scriptargs=""))
     mac_intel_64_test_factory.addStep(util_process_clean)
@@ -1253,17 +1253,17 @@ class tamarinredux:
                 'builddir': './mac64-intel-test',
     }
 
     ########################################
     #### builder for mac-ppc-10_4a-test ####
     ########################################
     mac_ppc_104a_test_factory = factory.BuildFactory()
     mac_ppc_104a_test_factory.addStep(test_commandline)
-    mac_ppc_104a_test_factory.addStep(test_selftest)
+    mac_ppc_104a_test_factory.addStep(test_selftest(name="Release", shellname="avmshell_104_ppc"))
     mac_ppc_104a_test_factory.addStep(test_generic(name="Release", shellname="avmshell_104_ppc", vmargs="", config="", scriptargs=""))
     mac_ppc_104a_test_factory.addStep(test_generic(name="Release-interp", shellname="avmshell_104_ppc", vmargs="-Dinterp", config="", scriptargs=""))
     mac_ppc_104a_test_factory.addStep(test_generic(name="Release-wordcode-interp", shellname="avmshell_wordcode_104_ppc", vmargs="-Dinterp", config="", scriptargs=""))
     mac_ppc_104a_test_factory.addStep(test_generic(name="Release-jit", shellname="avmshell_104_ppc", vmargs="-Ojit", config="", scriptargs=""))
     mac_ppc_104a_test_factory.addStep(test_generic(name="Debug", shellname="avmshell_d_104_ppc", vmargs="", config="", scriptargs=""))
     mac_ppc_104a_test_factory.addStep(util_process_clean)
     mac_ppc_104a_test_factory.addStep(util_clean_buildsdir)
 
@@ -1292,17 +1292,17 @@ class tamarinredux:
     }
 
 
     ########################################
     #### builder for mac-ppc-10_5a-test ####
     ########################################
     mac_ppc_105a_test_factory = factory.BuildFactory()
     mac_ppc_105a_test_factory.addStep(test_commandline)
-    mac_ppc_105a_test_factory.addStep(test_selftest)
+    mac_ppc_105a_test_factory.addStep(test_selftest(name="Release", shellname="avmshell_ppc"))
     mac_ppc_105a_test_factory.addStep(test_generic(name="Release", shellname="avmshell_ppc", vmargs="", config="", scriptargs=""))
     mac_ppc_105a_test_factory.addStep(test_generic(name="Release-interp", shellname="avmshell_ppc", vmargs="-Dinterp", config="", scriptargs=""))
     mac_ppc_105a_test_factory.addStep(test_generic(name="Release-wordcode-interp", shellname="avmshell_wordcode_ppc", vmargs="-Dinterp", config="", scriptargs=""))
     mac_ppc_105a_test_factory.addStep(test_generic(name="Release-jit", shellname="avmshell_ppc", vmargs="-Ojit", config="", scriptargs=""))
     mac_ppc_105a_test_factory.addStep(test_generic(name="Debug", shellname="avmshell_d_ppc", vmargs="", config="", scriptargs=""))
     mac_ppc_105a_test_factory.addStep(util_process_clean)
     mac_ppc_105a_test_factory.addStep(util_clean_buildsdir)
 
@@ -1331,17 +1331,17 @@ class tamarinredux:
     }
 
 
     ####################################
     #### builder for mac64-ppc-test ####
     ####################################
     mac_ppc_64_test_factory = factory.BuildFactory()
     mac_ppc_64_test_factory.addStep(test_commandline)
-    mac_ppc_64_test_factory.addStep(test_selftest)
+    mac_ppc_64_test_factory.addStep(test_selftest(name="Release", shellname="avmshell_64_ppc"))
     mac_ppc_64_test_factory.addStep(test_generic(name="Release", shellname="avmshell_64_ppc", vmargs="", config="", scriptargs=""))
     mac_ppc_64_test_factory.addStep(test_generic(name="Release-interp", shellname="avmshell_64_ppc", vmargs="-Dinterp", config="", scriptargs=""))
     mac_ppc_64_test_factory.addStep(test_generic(name="Release-wordcode-interp", shellname="avmshell_wordcode_64_ppc", vmargs="-Dinterp", config="", scriptargs=""))
     mac_ppc_64_test_factory.addStep(test_generic(name="Release-jit", shellname="avmshell_64_ppc", vmargs="-Ojit", config="", scriptargs=""))
     mac_ppc_64_test_factory.addStep(test_generic(name="ReleaseDebugger", shellname="avmshell_s_64_ppc", vmargs="", config="", scriptargs=""))
     mac_ppc_64_test_factory.addStep(test_generic(name="Debug", shellname="avmshell_d_64_ppc", vmargs="", config="", scriptargs=""))
     mac_ppc_64_test_factory.addStep(test_generic(name="DebugDebugger", shellname="avmshell_sd_64_ppc", vmargs="", config="", scriptargs=""))
     mac_ppc_64_test_factory.addStep(util_process_clean)
@@ -1355,17 +1355,17 @@ class tamarinredux:
     }
 
 
     ################################
     #### builder for linux-test ####
     ################################
     linux_test_factory = factory.BuildFactory()
     linux_test_factory.addStep(test_commandline)
-    linux_test_factory.addStep(test_selftest)
+    linux_test_factory.addStep(test_selftest(name="Release", shellname="avmshell"))
     linux_test_factory.addStep(test_generic(name="Release", shellname="avmshell", vmargs="", config="", scriptargs=""))
     linux_test_factory.addStep(test_generic(name="Release-interp", shellname="avmshell", vmargs="-Dinterp", config="", scriptargs=""))
     linux_test_factory.addStep(test_generic(name="Release-wordcode-interp", shellname="avmshell_wordcode", vmargs="-Dinterp", config="", scriptargs=""))
     linux_test_factory.addStep(test_generic(name="Release-jit", shellname="avmshell", vmargs="-Ojit", config="", scriptargs=""))
     linux_test_factory.addStep(test_generic(name="ReleaseDebugger", shellname="avmshell_s", vmargs="", config="", scriptargs=""))
     linux_test_factory.addStep(test_generic(name="Debug", shellname="avmshell_d", vmargs="", config="", scriptargs=""))
     linux_test_factory.addStep(test_generic(name="DebugDebugger", shellname="avmshell_sd", vmargs="", config="", scriptargs=""))
     linux_test_factory.addStep(test_differential)
@@ -1380,17 +1380,17 @@ class tamarinredux:
     }
 
 
     ##################################
     #### builder for linux64-test ####
     ##################################
     linux_64_test_factory = factory.BuildFactory()
     linux_64_test_factory.addStep(test_commandline)
-    linux_64_test_factory.addStep(test_selftest)
+    linux_64_test_factory.addStep(test_selftest(name="Release", shellname="avmshell_64"))
     linux_64_test_factory.addStep(test_generic(name="Release", shellname="avmshell_64", vmargs="", config="", scriptargs=""))
     linux_64_test_factory.addStep(test_generic(name="Release-interp", shellname="avmshell_64", vmargs="-Dinterp", config="", scriptargs=""))
     linux_64_test_factory.addStep(test_generic(name="Release-wordcode-interp", shellname="avmshell_wordcode_64", vmargs="-Dinterp", config="", scriptargs=""))
     linux_64_test_factory.addStep(test_generic(name="Release-jit", shellname="avmshell_64", vmargs="-Ojit", config="", scriptargs=""))
     linux_64_test_factory.addStep(test_generic(name="ReleaseDebugger", shellname="avmshell_s_64", vmargs="", config="", scriptargs=""))
     linux_64_test_factory.addStep(test_generic(name="Debug", shellname="avmshell_d_64", vmargs="", config="", scriptargs=""))
     linux_64_test_factory.addStep(test_generic(name="DebugDebugger", shellname="avmshell_sd_64", vmargs="", config="", scriptargs=""))
     linux_64_test_factory.addStep(util_process_clean)
@@ -1423,17 +1423,17 @@ class tamarinredux:
     }
 
 
     ########################################
     #### builder for solaris-sparc-test ####
     ########################################
     solaris_sparc_test_factory = factory.BuildFactory()
     solaris_sparc_test_factory.addStep(test_commandline)
-    solaris_sparc_test_factory.addStep(test_selftest)
+    solaris_sparc_test_factory.addStep(test_selftest(name="Release", shellname="avmshell"))
     solaris_sparc_test_factory.addStep(test_generic(name="Debug", shellname="avmshell_d", vmargs="", config="", scriptargs=""))
     solaris_sparc_test_factory.addStep(test_generic(name="DebugDebugger", shellname="avmshell_sd", vmargs="", config="", scriptargs=""))
     solaris_sparc_test_factory.addStep(util_process_clean)
     solaris_sparc_test_factory.addStep(util_clean_buildsdir)
 
     solaris_sparc_test_builder = {
                 'name': "solaris-sparc-test",
                 'slavename': "asteamsol4",
@@ -1484,17 +1484,17 @@ class tamarinredux:
                 'builddir': './android-test',
     }
     
     
     ##########################################
     #### builder for linux-arm-test       ####
     ##########################################
     linux_arm_test_factory = factory.BuildFactory()
-    linux_arm_test_factory.addStep(test_selftest)
+    linux_arm_test_factory.addStep(test_selftest(name="Release", shellname="avmshell_neon_arm"))
     linux_arm_test_factory.addStep(test_generic(name="Release-softfloat", shellname="avmshell_neon_arm", vmargs="", config="", scriptargs=""))
     linux_arm_test_factory.addStep(test_generic(name="Release-vfp", shellname="avmshell_neon_arm", vmargs="-Darm_arch 7 -Darm_vfp", config="", scriptargs=""))
     linux_arm_test_factory.addStep(test_generic(name="Release-jit-vfp", shellname="avmshell_neon_arm", vmargs="-Darm_arch 7 -Darm_vfp -Ojit", config="", scriptargs=""))
     linux_arm_test_factory.addStep(util_process_clean)
     linux_arm_test_factory.addStep(util_clean_buildsdir)
 
     linux_arm_test_builder = {
                 'name': "linux-arm-test",
@@ -1754,16 +1754,19 @@ class tamarinredux:
     windows_deep_factory.addStep(sync_clean)
     windows_deep_factory.addStep(sync_clone(url=HG_URL))
     windows_deep_factory.addStep(sync_update)
     windows_deep_factory.addStep(bb_slaveupdate(slave="windows-deep"))
     windows_deep_factory.addStep(download_testmedia)
     windows_deep_factory.addStep(deep_release_esc)
     windows_deep_factory.addStep(deep_codecoverage)
     windows_deep_factory.addStep(test_misc)
+    windows_deep_factory.addStep(test_selftest(name="Debug", shellname="avmshell_d"))
+    windows_deep_factory.addStep(test_selftest(name="ReleaseDebugger", shellname="avmshell_s"))
+    windows_deep_factory.addStep(test_selftest(name="DebugDebugger", shellname="avmshell_sd"))
     windows_deep_factory.addStep(compile_generic(name="Release-api", shellname="avmshell_api", args="--enable-shell --enable-api-versioning", upload="true"))
     windows_deep_factory.addStep(test_generic(name="Release-api", shellname="avmshell_api", vmargs="", config="", scriptargs="versioning/"))
     windows_deep_factory.addStep(compile_generic(name="ReleaseDebugger-air", shellname="avmshell_air", args="--enable-shell --enable-override-global-new --enable-use-system-malloc --enable-debugger", upload="true"))
     windows_deep_factory.addStep(test_generic(name="ReleaseDebugger-air", shellname="avmshell_air", vmargs="", config="", scriptargs=""))
     windows_deep_factory.addStep(test_generic(name="Release-Dgreedy", shellname="avmshell", vmargs="-Dgreedy", config="", scriptargs="--timeout=180 --random"))
     windows_deep_factory.addStep(test_generic(name="Release_Verify", shellname="avmshell_sd", vmargs="", config="", scriptargs="--verify --timeout=300 --random"))
     windows_deep_factory.addStep(util_process_clean)
     windows_deep_factory.addStep(util_clean_buildsdir)
@@ -1775,16 +1778,17 @@ class tamarinredux:
                 'builddir': './windows-deep',
     }
 
     ##################################
     #### builder for mac-deep ####
     ##################################
     mac_deep_factory = factory.BuildFactory()
     mac_deep_factory.addStep(sync_clean)
+    mac_deep_factory.addStep(sync_clone(url=HG_URL))
     mac_deep_factory.addStep(sync_update)
     mac_deep_factory.addStep(bb_slaveupdate(slave="mac-deep"))
     mac_deep_factory.addStep(download_testmedia)
     mac_deep_factory.addStep(TestSuiteShellCommand(
                      command=['./run-brightspot.sh', WithProperties('%s','revision')],
                      description='running brightspot tests...',
                      descriptionDone='finished running brightspot tests.',
                      name="RunBrightspot",
@@ -1807,17 +1811,20 @@ class tamarinredux:
     windows_p3_deep_factory = factory.BuildFactory()
     windows_p3_deep_factory.addStep(sync_clean)
     windows_p3_deep_factory.addStep(sync_clone(url=HG_URL))
     windows_p3_deep_factory.addStep(sync_update)
     windows_p3_deep_factory.addStep(bb_slaveupdate(slave="windows-p3-deep"))
     windows_p3_deep_factory.addStep(download_testmedia)
     windows_p3_deep_factory.addStep(test_smoke)
     windows_p3_deep_factory.addStep(test_commandline)
-    windows_p3_deep_factory.addStep(test_selftest)
+    windows_p3_deep_factory.addStep(test_selftest(name="Release", shellname="avmshell"))
+    windows_p3_deep_factory.addStep(test_selftest(name="Debug", shellname="avmshell_d"))
+    windows_p3_deep_factory.addStep(test_selftest(name="ReleaseDebugger", shellname="avmshell_s"))
+    windows_p3_deep_factory.addStep(test_selftest(name="DebugDebugger", shellname="avmshell_sd"))
     windows_p3_deep_factory.addStep(test_generic(name="Release", shellname="avmshell", vmargs="", config="", scriptargs=""))
     windows_p3_deep_factory.addStep(test_generic(name="Release-interp", shellname="avmshell", vmargs="-Dinterp", config="", scriptargs=""))
     windows_p3_deep_factory.addStep(test_generic(name="Release-wordcode-interp", shellname="avmshell_wordcode", vmargs="-Dinterp", config="", scriptargs=""))
     windows_p3_deep_factory.addStep(test_generic(name="Release-jit", shellname="avmshell", vmargs="-Ojit", config="", scriptargs=""))
     windows_p3_deep_factory.addStep(test_generic(name="ReleaseDebugger", shellname="avmshell_s", vmargs="", config="", scriptargs=""))
     windows_p3_deep_factory.addStep(test_generic(name="Debug", shellname="avmshell_d", vmargs="", config="", scriptargs=""))
     windows_p3_deep_factory.addStep(test_generic(name="DebugDebugger", shellname="avmshell_sd", vmargs="", config="", scriptargs=""))
     #windows_p3_deep_factory.addStep(test_differential)
@@ -1866,16 +1873,22 @@ class tamarinredux:
     #### builder for mac-ppc-deep ####
     ##################################
     mac_ppc_deep_factory = factory.BuildFactory()
     mac_ppc_deep_factory.addStep(sync_clean)
     mac_ppc_deep_factory.addStep(sync_clone(url=HG_URL))
     mac_ppc_deep_factory.addStep(sync_update)
     mac_ppc_deep_factory.addStep(bb_slaveupdate(slave="mac-ppc-deep"))
     mac_ppc_deep_factory.addStep(download_testmedia)
+    mac_ppc_deep_factory.addStep(test_selftest(name="Debug", shellname="avmshell_d_ppc"))
+    mac_ppc_deep_factory.addStep(test_selftest(name="Debug64", shellname="avmshell_d_64_ppc"))
+    mac_ppc_deep_factory.addStep(test_selftest(name="ReleaseDebugger", shellname="avmshell_s_ppc"))
+    mac_ppc_deep_factory.addStep(test_selftest(name="ReleaseDebugger64", shellname="avmshell_s_64_ppc"))
+    mac_ppc_deep_factory.addStep(test_selftest(name="DebugDebugger", shellname="avmshell_sd_ppc"))
+    mac_ppc_deep_factory.addStep(test_selftest(name="DebugDebugger64", shellname="avmshell_sd_64_ppc"))
     mac_ppc_deep_factory.addStep(test_generic(name="Debug", shellname="avmshell_d_ppc", vmargs="", config="ppc-mac-tvm-debug-deep", scriptargs=""))
     mac_ppc_deep_factory.addStep(test_generic(name="DebugDebugger", shellname="avmshell_sd_ppc", vmargs="", config="ppc-mac-tvm-debugdebugger-deep", scriptargs=""))
     mac_ppc_deep_factory.addStep(test_generic(name="Debug64", shellname="avmshell_d_64_ppc", vmargs="", config="ppc-mac-tvm-debug-deep", scriptargs=""))
     mac_ppc_deep_factory.addStep(test_generic(name="DebugDebugger64", shellname="avmshell_sd_64_ppc", vmargs="", config="ppc-mac-tvm-debugdebugger-deep", scriptargs=""))
     mac_ppc_deep_factory.addStep(deep_release_esc)
     mac_ppc_deep_factory.addStep(test_misc)
     mac_ppc_deep_factory.addStep(compile_generic(name="Release-api", shellname="avmshell_api_ppc", args="--enable-shell --enable-api-versioning", upload="true"))
     mac_ppc_deep_factory.addStep(test_generic(name="Release-api", shellname="avmshell_api_ppc", vmargs="", config="", scriptargs="versioning/"))
@@ -1897,16 +1910,19 @@ class tamarinredux:
     #### builder for solaris-sparc-deep ####
     ########################################
     solaris_sparc_deep_factory = factory.BuildFactory()
     solaris_sparc_deep_factory.addStep(sync_clean)
     solaris_sparc_deep_factory.addStep(sync_clone(url=HG_URL))
     solaris_sparc_deep_factory.addStep(sync_update)
     solaris_sparc_deep_factory.addStep(bb_slaveupdate(slave="solaris-sparc-deep"))
     solaris_sparc_deep_factory.addStep(download_testmedia)
+    solaris_sparc_deep_factory.addStep(test_selftest(name="Debug", shellname="avmshell_d"))
+    solaris_sparc_deep_factory.addStep(test_selftest(name="ReleaseDebugger", shellname="avmshell_s"))
+    solaris_sparc_deep_factory.addStep(test_selftest(name="DebugDebugger", shellname="avmshell_sd"))
     solaris_sparc_deep_factory.addStep(test_generic(name="Debug", shellname="avmshell_d", vmargs="", config="sparc-sol-tvm-debug-deep", scriptargs=""))
     solaris_sparc_deep_factory.addStep(test_generic(name="DebugDebugger", shellname="avmshell_sd", vmargs="", config="sparc-sol-tvm-debugdebugger-deep", scriptargs=""))
     #solaris_deep_factory.addStep(deep_release_esc)
     solaris_sparc_deep_factory.addStep(test_misc)
     solaris_sparc_deep_factory.addStep(compile_generic(name="Release-api", shellname="avmshell_api", args="--enable-shell --enable-api-versioning", upload="true"))
     solaris_sparc_deep_factory.addStep(test_generic(name="Release-api", shellname="avmshell_api", vmargs="", config="", scriptargs="versioning/"))
     solaris_sparc_deep_factory.addStep(test_generic(name="Release-Dgreedy", shellname="avmshell", vmargs="-Dgreedy", config="", scriptargs="--timeout=180 --random"))
     solaris_sparc_deep_factory.addStep(test_generic(name="Release_Verify", shellname="avmshell_sd", vmargs="", config="", scriptargs="--verify --timeout=300 --random"))
@@ -1924,16 +1940,19 @@ class tamarinredux:
     #### builder for windows64-deep ####
     ##################################
     windows_64_deep_factory = factory.BuildFactory()
     windows_64_deep_factory.addStep(sync_clean)
     windows_64_deep_factory.addStep(sync_clone(url=HG_URL))
     windows_64_deep_factory.addStep(sync_update)
     windows_64_deep_factory.addStep(bb_slaveupdate(slave="windows64-deep"))
     windows_64_deep_factory.addStep(download_testmedia)
+    windows_64_deep_factory.addStep(test_selftest(name="Debug", shellname="avmshell_d_64"))
+    windows_64_deep_factory.addStep(test_selftest(name="ReleaseDebugger", shellname="avmshell_s_64"))
+    windows_64_deep_factory.addStep(test_selftest(name="DebugDebugger", shellname="avmshell_sd_64"))
     windows_64_deep_factory.addStep(compile_generic(name="ReleaseDebugger-air", shellname="avmshell_air_64", args="--enable-shell --enable-override-global-new --enable-use-system-malloc --enable-debugger --target=x86_64-win", upload="true"))
     windows_64_deep_factory.addStep(test_generic(name="ReleaseDebugger-air", shellname="avmshell_air_64", vmargs="", config="", scriptargs=""))
     windows_64_deep_factory.addStep(test_generic(name="Debug", shellname="avmshell_d_64", vmargs="", config="x64-win-tvm-debug-deep", scriptargs=""))
     windows_64_deep_factory.addStep(test_generic(name="DebugDebugger", shellname="avmshell_sd_64", vmargs="", config="x64-win-tvm-debugdebugger-deep", scriptargs=""))
     windows_64_deep_factory.addStep(deep_release_esc)
     windows_64_deep_factory.addStep(test_generic(name="ReleaseDebugger-Dverifyall", shellname="avmshell_s_64", vmargs="-Dverifyall", config="", scriptargs=""))
     windows_64_deep_factory.addStep(test_generic(name="DebugDebugger-Dverifyall", shellname="avmshell_sd_64", vmargs="-Dverifyall", config="", scriptargs=""))
     windows_64_deep_factory.addStep( TestSuiteShellCommand(
@@ -1985,16 +2004,19 @@ class tamarinredux:
     #### builder for linux-deep   ####
     ##################################
     linux_deep_factory = factory.BuildFactory()
     linux_deep_factory.addStep(sync_clean)
     linux_deep_factory.addStep(sync_clone(url=HG_URL))
     linux_deep_factory.addStep(sync_update)
     linux_deep_factory.addStep(bb_slaveupdate(slave="linux-deep"))
     linux_deep_factory.addStep(download_testmedia)
+    linux_deep_factory.addStep(test_selftest(name="Debug", shellname="avmshell_d"))
+    linux_deep_factory.addStep(test_selftest(name="ReleaseDebugger", shellname="avmshell_s"))
+    linux_deep_factory.addStep(test_selftest(name="DebugDebugger", shellname="avmshell_sd"))
     linux_deep_factory.addStep(test_generic(name="Release-Djitordie", shellname="avmshell", vmargs="-Djitordie", config="", scriptargs=""))
     linux_deep_factory.addStep(test_generic(name="ReleaseDebugger-nodebugger", shellname="avmshell_s", vmargs="-Dnodebugger", config="", scriptargs=""))
     linux_deep_factory.addStep(test_generic(name="DebugDebugger-nodebugger", shellname="avmshell_sd", vmargs="-Dnodebugger", config="", scriptargs=""))
     linux_deep_factory.addStep(compile_generic(name="Release-nojit", shellname="avmshell_nojit", args="--enable-shell --disable-jit", upload="true"))
     linux_deep_factory.addStep(test_generic(name="Release-nojit", shellname="avmshell_nojit", vmargs="", config="x86-lnx-tvm-release-nojit", scriptargs=""))
     linux_deep_factory.addStep(compile_generic(name="Release-system-malloc", shellname="avmshell_sysmalloc", args="--enable-shell --enable-use-system-malloc", upload="true"))
     linux_deep_factory.addStep(test_generic(name="Release-system-malloc", shellname="avmshell_sysmalloc", vmargs="", config="x86-lnx-tvm-release-use-system-malloc", scriptargs=""))
     linux_deep_factory.addStep(test_misc)
@@ -2020,16 +2042,17 @@ class tamarinredux:
     #### builder for linux-arm-deep   ####
     ######################################
     linux_arm_deep_factory = factory.BuildFactory()
     linux_arm_deep_factory.addStep(sync_clean)
     linux_arm_deep_factory.addStep(sync_clone(url=HG_URL))
     linux_arm_deep_factory.addStep(sync_update)
     linux_arm_deep_factory.addStep(bb_slaveupdate(slave="linux-arm-deep"))
     linux_arm_deep_factory.addStep(download_testmedia)
+    linux_arm_deep_factory.addStep(test_selftest(name="Debug", shellname="avmshell_neon_arm_d"))
     linux_arm_deep_factory.addStep(test_generic(name="Debug-softfloat", shellname="avmshell_neon_arm_d", vmargs="", config="", scriptargs=""))
     linux_arm_deep_factory.addStep(test_generic(name="Release-softfloat-deep", shellname="avmshell_neon_arm", vmargs="", config="arm-lnx-tvm-release-deep", scriptargs=""))
     linux_arm_deep_factory.addStep(test_generic(name="Release-deep", shellname="avmshell_neon_arm", vmargs="-Darm_arch 7 -Darm_vfp", config="arm-lnx-tvm-release-deep", scriptargs=""))
     linux_arm_deep_factory.addStep(test_generic(name="Release-Dinterp-deep", shellname="avmshell_neon_arm", vmargs="-Dinterp", config="arm-lnx-tvm-release-Dinterp-deep", scriptargs=""))
     linux_arm_deep_factory.addStep(util_process_clean)
     linux_arm_deep_factory.addStep(util_clean_buildsdir)
 
     linux_arm_deep_builder = {
new file mode 100755
--- /dev/null
+++ b/build/buildbot/slaves/all/run-selftest-generic.sh
@@ -0,0 +1,123 @@
+#!/bin/bash
+#  ***** BEGIN LICENSE BLOCK *****
+#  Version: MPL 1.1/GPL 2.0/LGPL 2.1
+# 
+#  The contents of this file are subject to the Mozilla Public License Version
+#  1.1 (the "License"); you may not use this file except in compliance with
+#  the License. You may obtain a copy of the License at
+#  http://www.mozilla.org/MPL/
+# 
+#  Software distributed under the License is distributed on an "AS IS" basis,
+#  WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+#  for the specific language governing rights and limitations under the
+#  License.
+# 
+#  The Original Code is [Open Source Virtual Machine.].
+# 
+#  The Initial Developer of the Original Code is
+#  Adobe System Incorporated.
+#  Portions created by the Initial Developer are Copyright (C) 2010
+#  the Initial Developer. All Rights Reserved.
+# 
+#  Contributor(s):
+#    Adobe AS3 Team
+# 
+#  Alternatively, the contents of this file may be used under the terms of
+#  either the GNU General Public License Version 2 or later (the "GPL"), or
+#  the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+#  in which case the provisions of the GPL or the LGPL are applicable instead
+#  of those above. If you wish to allow use of your version of this file only
+#  under the terms of either the GPL or the LGPL, and not to allow others to
+#  use your version of this file under the terms of the MPL, indicate your
+#  decision by deleting the provisions above and replace them with the notice
+#  and other provisions required by the GPL or the LGPL. If you do not delete
+#  the provisions above, a recipient may use your version of this file under
+#  the terms of any one of the MPL, the GPL or the LGPL.
+# 
+#  ***** END LICENSE BLOCK ****
+(set -o igncr) 2>/dev/null && set -o igncr; # comment is needed
+
+
+##
+# Bring in the environment variables
+##
+. ./environment.sh
+
+
+##
+# Calculate the change number and change id
+##
+. ../all/util-calculate-change.sh $1
+
+
+showhelp ()
+{
+    echo ""
+    echo "usage: run-selftest-generic.sh <change> <filename>"
+    echo "  <change>     build number of shell to test"
+    echo "  <filename>   name of the shell, do not include file extenstion"
+    exit 1
+}
+
+if [ "$#" -lt 2 ]
+then
+    echo "not enough args passed"
+    showhelp
+fi
+
+filename=$2
+
+export shell=$filename$shell_extension
+
+
+##
+# Download the AVMSHELL if it does not exist
+##
+if [ ! -e "$buildsdir/$change-${changeid}/$platform/$shell" ]; then
+    echo "Download AVMSHELL: ${shell}"
+    ../all/util-download.sh $vmbuilds/$branch/$change-${changeid}/$platform/$shell $buildsdir/$change-${changeid}/$platform/$shell
+    ret=$?
+    test "$ret" = "0" || {
+        echo "Downloading of $shell failed"
+        rm -f $buildsdir/$change-${changeid}/$platform/$shell
+        exit 1
+    }
+    chmod +x $buildsdir/$change-${changeid}/$platform/$shell
+fi
+
+
+
+##
+# Ensure that the system is clean and ready
+##
+cd $basedir/build/buildbot/slaves/scripts
+../all/util-acceptance-clean.sh
+
+AVM=$buildsdir/$change-${changeid}/$platform/$shell
+
+$AVM -Dselftest > selftest.out 2>&1
+ret=$?
+
+cat selftest.out
+
+passes=`grep pass selftest.out | wc -l`
+fails=`grep fail selftest.out | wc -l`
+
+# a non-zero exit code indicates an avm crash, therefore increment the failures by 1
+if [ "$ret" -ne "0" ]; then
+    let fails=fails+1
+fi
+
+echo "passes            : $passes"
+echo "failures          : $fails"
+
+rm selftest.out
+
+##
+# Ensure that the system is torn down and clean
+##
+cd $basedir/build/buildbot/slaves/scripts
+../all/util-acceptance-teardown.sh
+
+exit $ret
+