|  | @@ -179,6 +179,12 @@ class CLanguage(object):
 | 
	
		
			
				|  |  |    def build_steps(self):
 | 
	
		
			
				|  |  |      return []
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +  def post_tests_steps(self):
 | 
	
		
			
				|  |  | +    if self.platform == 'windows':
 | 
	
		
			
				|  |  | +      return []
 | 
	
		
			
				|  |  | +    else:
 | 
	
		
			
				|  |  | +      return [['tools/run_tests/post_tests_c.sh']]
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |    def makefile_name(self):
 | 
	
		
			
				|  |  |      return 'Makefile'
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -204,6 +210,9 @@ class NodeLanguage(object):
 | 
	
		
			
				|  |  |    def build_steps(self):
 | 
	
		
			
				|  |  |      return [['tools/run_tests/build_node.sh']]
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +  def post_tests_steps(self):
 | 
	
		
			
				|  |  | +    return []
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |    def makefile_name(self):
 | 
	
		
			
				|  |  |      return 'Makefile'
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -229,6 +238,9 @@ class PhpLanguage(object):
 | 
	
		
			
				|  |  |    def build_steps(self):
 | 
	
		
			
				|  |  |      return [['tools/run_tests/build_php.sh']]
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +  def post_tests_steps(self):
 | 
	
		
			
				|  |  | +    return []
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |    def makefile_name(self):
 | 
	
		
			
				|  |  |      return 'Makefile'
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -276,6 +288,9 @@ class PythonLanguage(object):
 | 
	
		
			
				|  |  |                         do_newline=True)
 | 
	
		
			
				|  |  |      return commands
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +  def post_tests_steps(self):
 | 
	
		
			
				|  |  | +    return []
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |    def makefile_name(self):
 | 
	
		
			
				|  |  |      return 'Makefile'
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -301,6 +316,9 @@ class RubyLanguage(object):
 | 
	
		
			
				|  |  |    def build_steps(self):
 | 
	
		
			
				|  |  |      return [['tools/run_tests/build_ruby.sh']]
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +  def post_tests_steps(self):
 | 
	
		
			
				|  |  | +    return []
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |    def makefile_name(self):
 | 
	
		
			
				|  |  |      return 'Makefile'
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -349,6 +367,9 @@ class CSharpLanguage(object):
 | 
	
		
			
				|  |  |      else:
 | 
	
		
			
				|  |  |        return [['tools/run_tests/build_csharp.sh']]
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +  def post_tests_steps(self):
 | 
	
		
			
				|  |  | +    return []
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |    def makefile_name(self):
 | 
	
		
			
				|  |  |      return 'Makefile'
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -374,6 +395,9 @@ class ObjCLanguage(object):
 | 
	
		
			
				|  |  |    def build_steps(self):
 | 
	
		
			
				|  |  |      return [['src/objective-c/tests/build_tests.sh']]
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +  def post_tests_steps(self):
 | 
	
		
			
				|  |  | +    return []
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |    def makefile_name(self):
 | 
	
		
			
				|  |  |      return 'Makefile'
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -399,6 +423,9 @@ class Sanity(object):
 | 
	
		
			
				|  |  |    def build_steps(self):
 | 
	
		
			
				|  |  |      return []
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +  def post_tests_steps(self):
 | 
	
		
			
				|  |  | +    return []
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |    def makefile_name(self):
 | 
	
		
			
				|  |  |      return 'Makefile'
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -637,6 +664,11 @@ build_steps.extend(set(
 | 
	
		
			
				|  |  |                     for l in languages
 | 
	
		
			
				|  |  |                     for cmdline in l.build_steps()))
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +post_tests_steps = list(set(
 | 
	
		
			
				|  |  | +                        jobset.JobSpec(cmdline, environ={'CONFIG': cfg})
 | 
	
		
			
				|  |  | +                        for cfg in build_configs
 | 
	
		
			
				|  |  | +                        for l in languages
 | 
	
		
			
				|  |  | +                        for cmdline in l.post_tests_steps()))
 | 
	
		
			
				|  |  |  runs_per_test = args.runs_per_test
 | 
	
		
			
				|  |  |  forever = args.forever
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -821,6 +853,10 @@ def _build_and_run(
 | 
	
		
			
				|  |  |        tree = ET.ElementTree(root)
 | 
	
		
			
				|  |  |        tree.write(xml_report, encoding='UTF-8')
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +  if not jobset.run(post_tests_steps, maxjobs=1, stop_on_failure=True,
 | 
	
		
			
				|  |  | +                    newline_on_success=newline_on_success, travis=travis):
 | 
	
		
			
				|  |  | +    return 3
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |    if cache: cache.save()
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    return 0
 |