|  | @@ -468,6 +468,8 @@ _HTTP2_TEST_CASES = ['tls', 'framing']
 | 
	
		
			
				|  |  |  _HTTP2_BADSERVER_TEST_CASES = ['rst_after_header', 'rst_after_data', 'rst_during_data',
 | 
	
		
			
				|  |  |                       'goaway', 'ping', 'max_streams']
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +_LANGUAGES_FOR_HTTP2_BADSERVER_TESTS = ['java', 'python']
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  DOCKER_WORKDIR_ROOT = '/var/local/git/grpc'
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  def docker_run_cmdline(cmdline, image, docker_args=[], cwd=None, environ=None):
 | 
	
	
		
			
				|  | @@ -830,8 +832,13 @@ if not args.use_docker and servers:
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  languages = set(_LANGUAGES[l]
 | 
	
		
			
				|  |  |                  for l in itertools.chain.from_iterable(
 | 
	
		
			
				|  |  | -                      _LANGUAGES.iterkeys() if x == 'all' else [x]
 | 
	
		
			
				|  |  | -                      for x in args.language))
 | 
	
		
			
				|  |  | +                    _LANGUAGES.iterkeys() if x == 'all' else [x]
 | 
	
		
			
				|  |  | +                    for x in args.language))
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +languages_http2_badserver_interop = set()
 | 
	
		
			
				|  |  | +if args.http2_badserver_interop:
 | 
	
		
			
				|  |  | +  languages_http2_badserver_interop = set(
 | 
	
		
			
				|  |  | +      _LANGUAGES[l] for l in _LANGUAGES_FOR_HTTP2_BADSERVER_TESTS)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  http2Interop = Http2Client() if args.http2_interop else None
 | 
	
		
			
				|  |  |  http2InteropServer = Http2Server() if args.http2_badserver_interop else None
 | 
	
	
		
			
				|  | @@ -839,8 +846,10 @@ http2InteropServer = Http2Server() if args.http2_badserver_interop else None
 | 
	
		
			
				|  |  |  docker_images={}
 | 
	
		
			
				|  |  |  if args.use_docker:
 | 
	
		
			
				|  |  |    # languages for which to build docker images
 | 
	
		
			
				|  |  | -  languages_to_build = set(_LANGUAGES[k] for k in set([str(l) for l in languages] +
 | 
	
		
			
				|  |  | -                                                    [s for s in servers]))
 | 
	
		
			
				|  |  | +  languages_to_build = set(
 | 
	
		
			
				|  |  | +      _LANGUAGES[k] for k in set([str(l) for l in languages] + [s for s in servers]))
 | 
	
		
			
				|  |  | +  languages_to_build = languages_to_build | languages_http2_badserver_interop
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |    if args.http2_interop:
 | 
	
		
			
				|  |  |      languages_to_build.add(http2Interop)
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -934,19 +943,18 @@ try:
 | 
	
		
			
				|  |  |      skip_server = []  # test cases unimplemented by server
 | 
	
		
			
				|  |  |      if server_language:
 | 
	
		
			
				|  |  |        skip_server = server_language.unimplemented_test_cases_server()
 | 
	
		
			
				|  |  | -    if not args.http2_badserver_interop:
 | 
	
		
			
				|  |  | -      for language in languages:
 | 
	
		
			
				|  |  | -        for test_case in _TEST_CASES:
 | 
	
		
			
				|  |  | -          if not test_case in language.unimplemented_test_cases():
 | 
	
		
			
				|  |  | -            if not test_case in skip_server:
 | 
	
		
			
				|  |  | -              test_job = cloud_to_cloud_jobspec(language,
 | 
	
		
			
				|  |  | -                                                test_case,
 | 
	
		
			
				|  |  | -                                                server_name,
 | 
	
		
			
				|  |  | -                                                server_host,
 | 
	
		
			
				|  |  | -                                                server_port,
 | 
	
		
			
				|  |  | -                                                docker_image=docker_images.get(str(language)),
 | 
	
		
			
				|  |  | -                                                insecure=args.insecure)
 | 
	
		
			
				|  |  | -              jobs.append(test_job)
 | 
	
		
			
				|  |  | +    for language in languages:
 | 
	
		
			
				|  |  | +      for test_case in _TEST_CASES:
 | 
	
		
			
				|  |  | +        if not test_case in language.unimplemented_test_cases():
 | 
	
		
			
				|  |  | +          if not test_case in skip_server:
 | 
	
		
			
				|  |  | +            test_job = cloud_to_cloud_jobspec(language,
 | 
	
		
			
				|  |  | +                                              test_case,
 | 
	
		
			
				|  |  | +                                              server_name,
 | 
	
		
			
				|  |  | +                                              server_host,
 | 
	
		
			
				|  |  | +                                              server_port,
 | 
	
		
			
				|  |  | +                                              docker_image=docker_images.get(str(language)),
 | 
	
		
			
				|  |  | +                                              insecure=args.insecure)
 | 
	
		
			
				|  |  | +            jobs.append(test_job)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      if args.http2_interop:
 | 
	
		
			
				|  |  |        for test_case in _HTTP2_TEST_CASES:
 | 
	
	
		
			
				|  | @@ -963,7 +971,7 @@ try:
 | 
	
		
			
				|  |  |          jobs.append(test_job)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      if args.http2_badserver_interop:
 | 
	
		
			
				|  |  | -      for language in languages:
 | 
	
		
			
				|  |  | +      for language in languages_http2_badserver_interop:
 | 
	
		
			
				|  |  |          for test_case in _HTTP2_BADSERVER_TEST_CASES:
 | 
	
		
			
				|  |  |            test_job = cloud_to_cloud_jobspec(language,
 | 
	
		
			
				|  |  |                                              test_case,
 | 
	
	
		
			
				|  | @@ -992,9 +1000,13 @@ try:
 | 
	
		
			
				|  |  |      if "http2" in name:
 | 
	
		
			
				|  |  |        job[0].http2results = aggregate_http2_results(job[0].message)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +  http2_badserver_test_cases = (
 | 
	
		
			
				|  |  | +      _HTTP2_BADSERVER_TEST_CASES if args.http2_badserver_interop else [])
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |    report_utils.render_interop_html_report(
 | 
	
		
			
				|  |  |        set([str(l) for l in languages]), servers, _TEST_CASES, _AUTH_TEST_CASES,
 | 
	
		
			
				|  |  | -      _HTTP2_TEST_CASES, resultset, num_failures,
 | 
	
		
			
				|  |  | +      _HTTP2_TEST_CASES, http2_badserver_test_cases,
 | 
	
		
			
				|  |  | +      _LANGUAGES_FOR_HTTP2_BADSERVER_TESTS, resultset, num_failures,
 | 
	
		
			
				|  |  |        args.cloud_to_prod_auth or args.cloud_to_prod, args.prod_servers,
 | 
	
		
			
				|  |  |        args.http2_interop)
 | 
	
		
			
				|  |  |  
 |