|  | @@ -371,6 +371,39 @@ class PHP7Language:
 | 
	
		
			
				|  |  |    def __str__(self):
 | 
	
		
			
				|  |  |      return 'php7'
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +class ObjcLanguage:
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  def __init__(self):
 | 
	
		
			
				|  |  | +    self.client_cwd = 'src/objective-c/tests'
 | 
	
		
			
				|  |  | +    self.safename = str(self)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  def client_cmd(self, args):
 | 
	
		
			
				|  |  | +    # from args, extract the server port and craft xcodebuild command out of it
 | 
	
		
			
				|  |  | +    for arg in args:
 | 
	
		
			
				|  |  | +      port = re.search('--server_port=(\d+)', arg)
 | 
	
		
			
				|  |  | +      if port:
 | 
	
		
			
				|  |  | +        portnum = port.group(1)
 | 
	
		
			
				|  |  | +        cmdline = 'pod install && xcodebuild -workspace Tests.xcworkspace -scheme InteropTestsLocalSSL -destination name="iPhone 6" HOST_PORT_LOCALSSL=localhost:%s test'%portnum
 | 
	
		
			
				|  |  | +        return [cmdline]
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  def cloud_to_prod_env(self):
 | 
	
		
			
				|  |  | +    return {}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  def global_env(self):
 | 
	
		
			
				|  |  | +    return {}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  def unimplemented_test_cases(self):
 | 
	
		
			
				|  |  | +    # ObjC test runs all cases with the same command. It ignores the testcase
 | 
	
		
			
				|  |  | +    # cmdline argument. Here we return all but one test cases as unimplemented,
 | 
	
		
			
				|  |  | +    # and depend upon ObjC test's behavior that it runs all cases even when
 | 
	
		
			
				|  |  | +    # we tell it to run just one.
 | 
	
		
			
				|  |  | +    return _TEST_CASES[1:]
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  def unimplemented_test_cases_server(self):
 | 
	
		
			
				|  |  | +    return _SKIP_COMPRESSION
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  def __str__(self):
 | 
	
		
			
				|  |  | +    return 'objc'
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  class RubyLanguage:
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -402,7 +435,6 @@ class RubyLanguage:
 | 
	
		
			
				|  |  |    def __str__(self):
 | 
	
		
			
				|  |  |      return 'ruby'
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  class PythonLanguage:
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    def __init__(self):
 | 
	
	
		
			
				|  | @@ -460,6 +492,7 @@ _LANGUAGES = {
 | 
	
		
			
				|  |  |      'node' : NodeLanguage(),
 | 
	
		
			
				|  |  |      'php' :  PHPLanguage(),
 | 
	
		
			
				|  |  |      'php7' :  PHP7Language(),
 | 
	
		
			
				|  |  | +    'objc' : ObjcLanguage(),
 | 
	
		
			
				|  |  |      'ruby' : RubyLanguage(),
 | 
	
		
			
				|  |  |      'python' : PythonLanguage(),
 | 
	
		
			
				|  |  |  }
 | 
	
	
		
			
				|  | @@ -667,7 +700,8 @@ def cloud_to_cloud_jobspec(language, test_case, server_name, server_host,
 | 
	
		
			
				|  |  |      cwd = language.client_cwd
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    environ = language.global_env()
 | 
	
		
			
				|  |  | -  if docker_image:
 | 
	
		
			
				|  |  | +  if docker_image and language.safename != 'objc':
 | 
	
		
			
				|  |  | +    # we can't run client in docker for objc.
 | 
	
		
			
				|  |  |      container_name = dockerjob.random_name('interop_client_%s' % language.safename)
 | 
	
		
			
				|  |  |      cmdline = docker_run_cmdline(cmdline,
 | 
	
		
			
				|  |  |                                   image=docker_image,
 | 
	
	
		
			
				|  | @@ -820,7 +854,7 @@ argp.add_argument('-l', '--language',
 | 
	
		
			
				|  |  |                    choices=['all'] + sorted(_LANGUAGES),
 | 
	
		
			
				|  |  |                    nargs='+',
 | 
	
		
			
				|  |  |                    default=['all'],
 | 
	
		
			
				|  |  | -                  help='Clients to run.')
 | 
	
		
			
				|  |  | +                  help='Clients to run. Objc client can be only run on OSX.')
 | 
	
		
			
				|  |  |  argp.add_argument('-j', '--jobs', default=multiprocessing.cpu_count(), type=int)
 | 
	
		
			
				|  |  |  argp.add_argument('--cloud_to_prod',
 | 
	
		
			
				|  |  |                    default=False,
 | 
	
	
		
			
				|  | @@ -942,6 +976,9 @@ if args.use_docker:
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    build_jobs = []
 | 
	
		
			
				|  |  |    for l in languages_to_build:
 | 
	
		
			
				|  |  | +    if str(l) == 'objc':
 | 
	
		
			
				|  |  | +      # we don't need to build a docker image for objc
 | 
	
		
			
				|  |  | +      continue
 | 
	
		
			
				|  |  |      job = build_interop_image_jobspec(l)
 | 
	
		
			
				|  |  |      docker_images[str(l)] = job.tag
 | 
	
		
			
				|  |  |      build_jobs.append(job)
 |