run_interop_tests.py
Go to the documentation of this file.
1 #!/usr/bin/env python3
2 # Copyright 2015 gRPC authors.
3 #
4 # Licensed under the Apache License, Version 2.0 (the "License");
5 # you may not use this file except in compliance with the License.
6 # You may obtain a copy of the License at
7 #
8 # http://www.apache.org/licenses/LICENSE-2.0
9 #
10 # Unless required by applicable law or agreed to in writing, software
11 # distributed under the License is distributed on an "AS IS" BASIS,
12 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 # See the License for the specific language governing permissions and
14 # limitations under the License.
15 """Run interop (cross-language) tests in parallel."""
16 
17 from __future__ import print_function
18 
19 import argparse
20 import atexit
21 import itertools
22 import json
23 import multiprocessing
24 import os
25 import re
26 import subprocess
27 import sys
28 import tempfile
29 import time
30 import traceback
31 import uuid
32 
33 import six
34 
35 import python_utils.dockerjob as dockerjob
36 import python_utils.jobset as jobset
37 import python_utils.report_utils as report_utils
38 
39 # It's ok to not import because this is only necessary to upload results to BQ.
40 try:
41  from python_utils.upload_test_results import upload_interop_results_to_bq
42 except ImportError as e:
43  print(e)
44 
45 # Docker doesn't clean up after itself, so we do it on exit.
46 atexit.register(lambda: subprocess.call(['stty', 'echo']))
47 
48 ROOT = os.path.abspath(os.path.join(os.path.dirname(sys.argv[0]), '../..'))
49 os.chdir(ROOT)
50 
51 _DEFAULT_SERVER_PORT = 8080
52 
53 _SKIP_CLIENT_COMPRESSION = [
54  'client_compressed_unary', 'client_compressed_streaming'
55 ]
56 
57 _SKIP_SERVER_COMPRESSION = [
58  'server_compressed_unary', 'server_compressed_streaming'
59 ]
60 
61 _SKIP_COMPRESSION = _SKIP_CLIENT_COMPRESSION + _SKIP_SERVER_COMPRESSION
62 
63 _SKIP_ADVANCED = [
64  'status_code_and_message', 'custom_metadata', 'unimplemented_method',
65  'unimplemented_service'
66 ]
67 
68 _SKIP_SPECIAL_STATUS_MESSAGE = ['special_status_message']
69 
70 _ORCA_TEST_CASES = ['orca_per_rpc', 'orca_oob']
71 
72 _GOOGLE_DEFAULT_CREDS_TEST_CASE = 'google_default_credentials'
73 
74 _SKIP_GOOGLE_DEFAULT_CREDS = [
75  _GOOGLE_DEFAULT_CREDS_TEST_CASE,
76 ]
77 
78 _COMPUTE_ENGINE_CHANNEL_CREDS_TEST_CASE = 'compute_engine_channel_credentials'
79 
80 _SKIP_COMPUTE_ENGINE_CHANNEL_CREDS = [
81  _COMPUTE_ENGINE_CHANNEL_CREDS_TEST_CASE,
82 ]
83 
84 _TEST_TIMEOUT = 3 * 60
85 
86 # disable this test on core-based languages,
87 # see https://github.com/grpc/grpc/issues/9779
88 _SKIP_DATA_FRAME_PADDING = ['data_frame_padding']
89 
90 # report suffix "sponge_log.xml" is important for reports to get picked up by internal CI
91 _DOCKER_BUILD_XML_REPORT = 'interop_docker_build/sponge_log.xml'
92 _TESTS_XML_REPORT = 'interop_test/sponge_log.xml'
93 
94 
96 
97  def __init__(self):
98  self.client_cwd = None
99  self.server_cwd = None
100  self.http2_cwd = None
101  self.safename = 'cxx'
102 
103  def client_cmd(self, args):
104  return ['cmake/build/interop_client'] + args
105 
106  def client_cmd_http2interop(self, args):
107  return ['cmake/build/http2_client'] + args
108 
109  def cloud_to_prod_env(self):
110  return {}
111 
112  def server_cmd(self, args):
113  return ['cmake/build/interop_server'] + args
114 
115  def global_env(self):
116  return {}
117 
119  return _SKIP_DATA_FRAME_PADDING + \
120  _SKIP_SPECIAL_STATUS_MESSAGE + \
121  _SKIP_COMPUTE_ENGINE_CHANNEL_CREDS + \
122  _ORCA_TEST_CASES
123 
125  return _ORCA_TEST_CASES
126 
127  def __str__(self):
128  return 'c++'
129 
130 
132 
133  def __init__(self):
134  self.client_cwd = '../grpc-dotnet/output/InteropTestsClient'
135  self.server_cwd = '../grpc-dotnet/output/InteropTestsWebsite'
136  self.safename = str(self)
137 
138  def cloud_to_prod_env(self):
139  return {}
140 
141  def client_cmd(self, args):
142  return ['dotnet', 'exec', 'InteropTestsClient.dll'] + args
143 
144  def server_cmd(self, args):
145  return ['dotnet', 'exec', 'InteropTestsWebsite.dll'] + args
146 
147  def global_env(self):
148  return {}
149 
151  return _SKIP_GOOGLE_DEFAULT_CREDS + \
152  _SKIP_COMPUTE_ENGINE_CHANNEL_CREDS + \
153  _ORCA_TEST_CASES
154 
156  return _ORCA_TEST_CASES
157 
158  def __str__(self):
159  return 'aspnetcore'
160 
161 
163 
164  def __init__(self):
165  self.client_cwd = '../grpc-dart/interop'
166  self.server_cwd = '../grpc-dart/interop'
167  self.http2_cwd = '../grpc-dart/interop'
168  self.safename = str(self)
169 
170  def client_cmd(self, args):
171  return ['dart', 'bin/client.dart'] + args
172 
173  def cloud_to_prod_env(self):
174  return {}
175 
176  def server_cmd(self, args):
177  return ['dart', 'bin/server.dart'] + args
178 
179  def global_env(self):
180  return {}
181 
183  return _SKIP_COMPRESSION + \
184  _SKIP_SPECIAL_STATUS_MESSAGE + \
185  _SKIP_GOOGLE_DEFAULT_CREDS + \
186  _SKIP_COMPUTE_ENGINE_CHANNEL_CREDS + \
187  _ORCA_TEST_CASES
188 
190  return _SKIP_COMPRESSION + _SKIP_SPECIAL_STATUS_MESSAGE + _ORCA_TEST_CASES
191 
192  def __str__(self):
193  return 'dart'
194 
195 
197 
198  def __init__(self):
199  self.client_cwd = '../grpc-java'
200  self.server_cwd = '../grpc-java'
201  self.http2_cwd = '../grpc-java'
202  self.safename = str(self)
203 
204  def client_cmd(self, args):
205  return ['./run-test-client.sh'] + args
206 
207  def client_cmd_http2interop(self, args):
208  return [
209  './interop-testing/build/install/grpc-interop-testing/bin/http2-client'
210  ] + args
211 
212  def cloud_to_prod_env(self):
213  return {}
214 
215  def server_cmd(self, args):
216  return ['./run-test-server.sh'] + args
217 
218  def global_env(self):
219  return {}
220 
222  return []
223 
225  # Does not support CompressedRequest feature.
226  # Only supports CompressedResponse feature for unary.
227  return _SKIP_CLIENT_COMPRESSION + ['server_compressed_streaming']
228 
229  def __str__(self):
230  return 'java'
231 
232 
234 
235  def __init__(self):
236  self.client_cwd = '../grpc-java'
237  self.safename = 'java'
238 
239  def client_cmd(self, args):
240  return ['./run-test-client.sh', '--use_okhttp=true'] + args
241 
242  def cloud_to_prod_env(self):
243  return {}
244 
245  def global_env(self):
246  return {}
247 
249  return _SKIP_DATA_FRAME_PADDING
250 
251  def __str__(self):
252  return 'javaokhttp'
253 
254 
256 
257  def __init__(self):
258  # TODO: this relies on running inside docker
259  self.client_cwd = '/go/src/google.golang.org/grpc/interop/client'
260  self.server_cwd = '/go/src/google.golang.org/grpc/interop/server'
261  self.http2_cwd = '/go/src/google.golang.org/grpc/interop/http2'
262  self.safename = str(self)
263 
264  def client_cmd(self, args):
265  return ['go', 'run', 'client.go'] + args
266 
267  def client_cmd_http2interop(self, args):
268  return ['go', 'run', 'negative_http2_client.go'] + args
269 
270  def cloud_to_prod_env(self):
271  return {}
272 
273  def server_cmd(self, args):
274  return ['go', 'run', 'server.go'] + args
275 
276  def global_env(self):
277  return {'GO111MODULE': 'on'}
278 
280  return _SKIP_COMPRESSION + \
281  _ORCA_TEST_CASES
282 
284  return _SKIP_COMPRESSION + \
285  _ORCA_TEST_CASES
286 
287  def __str__(self):
288  return 'go'
289 
290 
292  """Represents the HTTP/2 Interop Test server
293 
294  This pretends to be a language in order to be built and run, but really it
295  isn't.
296  """
297 
298  def __init__(self):
299  self.server_cwd = None
300  self.safename = str(self)
301 
302  def server_cmd(self, args):
303  return ['python test/http2_test/http2_test_server.py']
304 
305  def cloud_to_prod_env(self):
306  return {}
307 
308  def global_env(self):
309  return {}
310 
312  return _TEST_CASES + \
313  _SKIP_DATA_FRAME_PADDING + \
314  _SKIP_SPECIAL_STATUS_MESSAGE + \
315  _SKIP_GOOGLE_DEFAULT_CREDS + \
316  _SKIP_COMPUTE_ENGINE_CHANNEL_CREDS
317 
319  return _TEST_CASES
320 
321  def __str__(self):
322  return 'http2'
323 
324 
326  """Represents the HTTP/2 Interop Test
327 
328  This pretends to be a language in order to be built and run, but really it
329  isn't.
330  """
331 
332  def __init__(self):
333  self.client_cwd = None
334  self.safename = str(self)
335 
336  def client_cmd(self, args):
337  return ['tools/http2_interop/http2_interop.test', '-test.v'] + args
338 
339  def cloud_to_prod_env(self):
340  return {}
341 
342  def global_env(self):
343  return {}
344 
346  return _TEST_CASES + \
347  _SKIP_SPECIAL_STATUS_MESSAGE + \
348  _SKIP_GOOGLE_DEFAULT_CREDS + \
349  _SKIP_COMPUTE_ENGINE_CHANNEL_CREDS
350 
352  return _TEST_CASES
353 
354  def __str__(self):
355  return 'http2'
356 
357 
359 
360  def __init__(self):
361  self.client_cwd = '../../../../home/appuser/grpc-node'
362  self.server_cwd = '../../../../home/appuser/grpc-node'
363  self.safename = str(self)
364 
365  def client_cmd(self, args):
366  return [
367  'packages/grpc-native-core/deps/grpc/tools/run_tests/interop/with_nvm.sh',
368  'node', '--require', './test/fixtures/native_native',
369  'test/interop/interop_client.js'
370  ] + args
371 
372  def cloud_to_prod_env(self):
373  return {}
374 
375  def server_cmd(self, args):
376  return [
377  'packages/grpc-native-core/deps/grpc/tools/run_tests/interop/with_nvm.sh',
378  'node', '--require', './test/fixtures/native_native',
379  'test/interop/interop_server.js'
380  ] + args
381 
382  def global_env(self):
383  return {}
384 
386  return _SKIP_COMPRESSION + \
387  _SKIP_DATA_FRAME_PADDING + \
388  _SKIP_GOOGLE_DEFAULT_CREDS + \
389  _SKIP_COMPUTE_ENGINE_CHANNEL_CREDS + \
390  _ORCA_TEST_CASES
391 
393  return _SKIP_COMPRESSION + \
394  _ORCA_TEST_CASES
395 
396  def __str__(self):
397  return 'node'
398 
399 
401 
402  def __init__(self):
403  self.client_cwd = '../../../../home/appuser/grpc-node'
404  self.server_cwd = '../../../../home/appuser/grpc-node'
405  self.safename = str(self)
406 
407  def client_cmd(self, args):
408  return [
409  'packages/grpc-native-core/deps/grpc/tools/run_tests/interop/with_nvm.sh',
410  'node', '--require', './test/fixtures/js_js',
411  'test/interop/interop_client.js'
412  ] + args
413 
414  def cloud_to_prod_env(self):
415  return {}
416 
417  def global_env(self):
418  return {}
419 
421  return _SKIP_COMPRESSION + \
422  _SKIP_DATA_FRAME_PADDING + \
423  _SKIP_GOOGLE_DEFAULT_CREDS + \
424  _SKIP_COMPUTE_ENGINE_CHANNEL_CREDS + \
425  _ORCA_TEST_CASES
426 
428  return _ORCA_TEST_CASES
429 
430  def __str__(self):
431  return 'nodepurejs'
432 
433 
435 
436  def __init__(self):
437  self.client_cwd = None
438  self.server_cwd = None
439  self.safename = str(self)
440 
441  def client_cmd(self, args):
442  return ['src/php/bin/interop_client.sh'] + args
443 
444  def cloud_to_prod_env(self):
445  return {}
446 
447  def server_cmd(self, args):
448  return ['src/php/bin/interop_server.sh'] + args
449 
450  def global_env(self):
451  return {}
452 
454  return _SKIP_SERVER_COMPRESSION + \
455  _SKIP_DATA_FRAME_PADDING + \
456  _SKIP_GOOGLE_DEFAULT_CREDS + \
457  _SKIP_COMPUTE_ENGINE_CHANNEL_CREDS + \
458  _ORCA_TEST_CASES
459 
461  return _SKIP_COMPRESSION + \
462  _ORCA_TEST_CASES
463 
464  def __str__(self):
465  return 'php7'
466 
467 
469 
470  def __init__(self):
471  self.client_cwd = 'src/objective-c/tests'
472  self.safename = str(self)
473 
474  def client_cmd(self, args):
475  # from args, extract the server port and craft xcodebuild command out of it
476  for arg in args:
477  port = re.search('--server_port=(\d+)', arg)
478  if port:
479  portnum = port.group(1)
480  cmdline = 'pod install && xcodebuild -workspace Tests.xcworkspace -scheme InteropTestsLocalSSL -destination name="iPhone 6" HOST_PORT_LOCALSSL=localhost:%s test' % portnum
481  return [cmdline]
482 
483  def cloud_to_prod_env(self):
484  return {}
485 
486  def global_env(self):
487  return {}
488 
490  # ObjC test runs all cases with the same command. It ignores the testcase
491  # cmdline argument. Here we return all but one test cases as unimplemented,
492  # and depend upon ObjC test's behavior that it runs all cases even when
493  # we tell it to run just one.
494  return _TEST_CASES[1:] + \
495  _SKIP_COMPRESSION + \
496  _SKIP_DATA_FRAME_PADDING + \
497  _SKIP_SPECIAL_STATUS_MESSAGE + \
498  _SKIP_GOOGLE_DEFAULT_CREDS + \
499  _SKIP_COMPUTE_ENGINE_CHANNEL_CREDS + \
500  _ORCA_TEST_CASES
501 
503  return _SKIP_COMPRESSION + \
504  _ORCA_TEST_CASES
505 
506  def __str__(self):
507  return 'objc'
508 
509 
511 
512  def __init__(self):
513  self.client_cwd = None
514  self.server_cwd = None
515  self.safename = str(self)
516 
517  def client_cmd(self, args):
518  return [
519  'tools/run_tests/interop/with_rvm.sh', 'ruby',
520  'src/ruby/pb/test/client.rb'
521  ] + args
522 
523  def cloud_to_prod_env(self):
524  return {}
525 
526  def server_cmd(self, args):
527  return [
528  'tools/run_tests/interop/with_rvm.sh', 'ruby',
529  'src/ruby/pb/test/server.rb'
530  ] + args
531 
532  def global_env(self):
533  return {}
534 
536  return _SKIP_SERVER_COMPRESSION + \
537  _SKIP_DATA_FRAME_PADDING + \
538  _SKIP_SPECIAL_STATUS_MESSAGE + \
539  _SKIP_GOOGLE_DEFAULT_CREDS + \
540  _SKIP_COMPUTE_ENGINE_CHANNEL_CREDS + \
541  _ORCA_TEST_CASES
542 
544  return _SKIP_COMPRESSION + \
545  _ORCA_TEST_CASES
546 
547  def __str__(self):
548  return 'ruby'
549 
550 
551 _PYTHON_BINARY = 'py39/bin/python'
552 
553 
555 
556  def __init__(self):
557  self.client_cwd = None
558  self.server_cwd = None
559  self.http2_cwd = None
560  self.safename = str(self)
561 
562  def client_cmd(self, args):
563  return [
564  _PYTHON_BINARY, 'src/python/grpcio_tests/setup.py', 'run_interop',
565  '--client', '--args="{}"'.format(' '.join(args))
566  ]
567 
568  def client_cmd_http2interop(self, args):
569  return [
570  _PYTHON_BINARY,
571  'src/python/grpcio_tests/tests/http2/negative_http2_client.py',
572  ] + args
573 
574  def cloud_to_prod_env(self):
575  return {}
576 
577  def server_cmd(self, args):
578  return [
579  _PYTHON_BINARY, 'src/python/grpcio_tests/setup.py', 'run_interop',
580  '--server', '--args="{}"'.format(' '.join(args))
581  ]
582 
583  def global_env(self):
584  return {
585  'LD_LIBRARY_PATH': '{}/libs/opt'.format(DOCKER_WORKDIR_ROOT),
586  'PYTHONPATH': '{}/src/python/gens'.format(DOCKER_WORKDIR_ROOT)
587  }
588 
590  return _SKIP_COMPRESSION + \
591  _SKIP_DATA_FRAME_PADDING + \
592  _SKIP_GOOGLE_DEFAULT_CREDS + \
593  _SKIP_COMPUTE_ENGINE_CHANNEL_CREDS + \
594  _ORCA_TEST_CASES
595 
597  return _SKIP_COMPRESSION + \
598  _ORCA_TEST_CASES
599 
600  def __str__(self):
601  return 'python'
602 
603 
605 
606  def __init__(self):
607  self.client_cwd = None
608  self.server_cwd = None
609  self.http2_cwd = None
610  self.safename = str(self)
611 
612  def client_cmd(self, args):
613  return [
614  _PYTHON_BINARY, 'src/python/grpcio_tests/setup.py', 'run_interop',
615  '--use-asyncio', '--client', '--args="{}"'.format(' '.join(args))
616  ]
617 
618  def client_cmd_http2interop(self, args):
619  return [
620  _PYTHON_BINARY,
621  'src/python/grpcio_tests/tests/http2/negative_http2_client.py',
622  ] + args
623 
624  def cloud_to_prod_env(self):
625  return {}
626 
627  def server_cmd(self, args):
628  return [
629  _PYTHON_BINARY, 'src/python/grpcio_tests/setup.py',
630  'py39/bin/python', 'src/python/grpcio_tests/setup.py',
631  '--args="{}"'.format(' '.join(args))
632  ]
633 
634  def global_env(self):
635  return {
636  'LD_LIBRARY_PATH': '{}/libs/opt'.format(DOCKER_WORKDIR_ROOT),
637  'PYTHONPATH': '{}/src/python/gens'.format(DOCKER_WORKDIR_ROOT)
638  }
639 
641  # TODO(https://github.com/grpc/grpc/issues/21707)
642  return _SKIP_COMPRESSION + \
643  _SKIP_DATA_FRAME_PADDING + \
644  _AUTH_TEST_CASES + \
645  ['timeout_on_sleeping_server'] + \
646  _ORCA_TEST_CASES
647 
649  # TODO(https://github.com/grpc/grpc/issues/21749)
650  return _TEST_CASES + \
651  _AUTH_TEST_CASES + \
652  _HTTP2_TEST_CASES + \
653  _HTTP2_SERVER_TEST_CASES
654 
655  def __str__(self):
656  return 'pythonasyncio'
657 
658 
659 _LANGUAGES = {
660  'c++': CXXLanguage(),
661  'aspnetcore': AspNetCoreLanguage(),
662  'dart': DartLanguage(),
663  'go': GoLanguage(),
664  'java': JavaLanguage(),
665  'javaokhttp': JavaOkHttpClient(),
666  'node': NodeLanguage(),
667  'nodepurejs': NodePureJSLanguage(),
668  'php7': PHP7Language(),
669  'objc': ObjcLanguage(),
670  'ruby': RubyLanguage(),
671  'python': PythonLanguage(),
672  'pythonasyncio': PythonAsyncIOLanguage(),
673 }
674 
675 # languages supported as cloud_to_cloud servers
676 _SERVERS = [
677  'c++', 'node', 'aspnetcore', 'java', 'go', 'ruby', 'python', 'dart',
678  'pythonasyncio', 'php7'
679 ]
680 
681 _TEST_CASES = [
682  'large_unary', 'empty_unary', 'ping_pong', 'empty_stream',
683  'client_streaming', 'server_streaming', 'cancel_after_begin',
684  'cancel_after_first_response', 'timeout_on_sleeping_server',
685  'custom_metadata', 'status_code_and_message', 'unimplemented_method',
686  'client_compressed_unary', 'server_compressed_unary',
687  'client_compressed_streaming', 'server_compressed_streaming',
688  'unimplemented_service', 'special_status_message', 'orca_per_rpc',
689  'orca_oob'
690 ]
691 
692 _AUTH_TEST_CASES = [
693  'compute_engine_creds',
694  'jwt_token_creds',
695  'oauth2_auth_token',
696  'per_rpc_creds',
697  _GOOGLE_DEFAULT_CREDS_TEST_CASE,
698  _COMPUTE_ENGINE_CHANNEL_CREDS_TEST_CASE,
699 ]
700 
701 _HTTP2_TEST_CASES = ['tls', 'framing']
702 
703 _HTTP2_SERVER_TEST_CASES = [
704  'rst_after_header', 'rst_after_data', 'rst_during_data', 'goaway', 'ping',
705  'max_streams', 'data_frame_padding', 'no_df_padding_sanity_test'
706 ]
707 
708 _GRPC_CLIENT_TEST_CASES_FOR_HTTP2_SERVER_TEST_CASES = {
709  'data_frame_padding': 'large_unary',
710  'no_df_padding_sanity_test': 'large_unary'
711 }
712 
713 _HTTP2_SERVER_TEST_CASES_THAT_USE_GRPC_CLIENTS = list(
714  _GRPC_CLIENT_TEST_CASES_FOR_HTTP2_SERVER_TEST_CASES.keys())
715 
716 _LANGUAGES_WITH_HTTP2_CLIENTS_FOR_HTTP2_SERVER_TEST_CASES = [
717  'java', 'go', 'python', 'c++'
718 ]
719 
720 _LANGUAGES_FOR_ALTS_TEST_CASES = ['java', 'go', 'c++', 'python']
721 
722 _SERVERS_FOR_ALTS_TEST_CASES = ['java', 'go', 'c++', 'python']
723 
724 _TRANSPORT_SECURITY_OPTIONS = ['tls', 'alts', 'insecure']
725 
726 _CUSTOM_CREDENTIALS_TYPE_OPTIONS = [
727  'tls', 'google_default_credentials', 'compute_engine_channel_creds'
728 ]
729 
730 DOCKER_WORKDIR_ROOT = '/var/local/git/grpc'
731 
732 
733 def docker_run_cmdline(cmdline, image, docker_args=[], cwd=None, environ=None):
734  """Wraps given cmdline array to create 'docker run' cmdline from it."""
735 
736  # don't use '-t' even when TTY is available, since that would break
737  # the testcases generated by tools/interop_matrix/create_testcases.sh
738  docker_cmdline = ['docker', 'run', '-i', '--rm=true']
739 
740  # turn environ into -e docker args
741  if environ:
742  for k, v in list(environ.items()):
743  docker_cmdline += ['-e', '%s=%s' % (k, v)]
744 
745  # set working directory
746  workdir = DOCKER_WORKDIR_ROOT
747  if cwd:
748  workdir = os.path.join(workdir, cwd)
749  docker_cmdline += ['-w', workdir]
750 
751  docker_cmdline += docker_args + [image] + cmdline
752  return docker_cmdline
753 
754 
755 def manual_cmdline(docker_cmdline, docker_image):
756  """Returns docker cmdline adjusted for manual invocation."""
757  print_cmdline = []
758  for item in docker_cmdline:
759  if item.startswith('--name='):
760  continue
761  if item == docker_image:
762  item = "$docker_image"
763  item = item.replace('"', '\\"')
764  # add quotes when necessary
765  if any(character.isspace() for character in item):
766  item = "\"%s\"" % item
767  print_cmdline.append(item)
768  return ' '.join(print_cmdline)
769 
770 
771 def write_cmdlog_maybe(cmdlog, filename):
772  """Returns docker cmdline adjusted for manual invocation."""
773  if cmdlog:
774  with open(filename, 'w') as logfile:
775  logfile.write('#!/bin/bash\n')
776  logfile.write('# DO NOT MODIFY\n')
777  logfile.write(
778  '# This file is generated by run_interop_tests.py/create_testcases.sh\n'
779  )
780  logfile.writelines("%s\n" % line for line in cmdlog)
781  print('Command log written to file %s' % filename)
782 
783 
784 def bash_cmdline(cmdline):
785  """Creates bash -c cmdline from args list."""
786  # Use login shell:
787  # * makes error messages clearer if executables are missing
788  return ['bash', '-c', ' '.join(cmdline)]
789 
790 
791 def compute_engine_creds_required(language, test_case):
792  """Returns True if given test requires access to compute engine creds."""
793  language = str(language)
794  if test_case == 'compute_engine_creds':
795  return True
796  if test_case == 'oauth2_auth_token' and language == 'c++':
797  # C++ oauth2 test uses GCE creds because C++ only supports JWT
798  return True
799  return False
800 
801 
802 def auth_options(language, test_case, google_default_creds_use_key_file,
803  service_account_key_file, default_service_account):
804  """Returns (cmdline, env) tuple with cloud_to_prod_auth test options."""
805 
806  language = str(language)
807  cmdargs = []
808  env = {}
809 
810  oauth_scope_arg = '--oauth_scope=https://www.googleapis.com/auth/xapi.zoo'
811  key_file_arg = '--service_account_key_file=%s' % service_account_key_file
812  default_account_arg = '--default_service_account=%s' % default_service_account
813 
814  if test_case in ['jwt_token_creds', 'per_rpc_creds', 'oauth2_auth_token']:
815  if language in [
816  'aspnetcore', 'node', 'php7', 'python', 'ruby', 'nodepurejs'
817  ]:
818  env['GOOGLE_APPLICATION_CREDENTIALS'] = service_account_key_file
819  else:
820  cmdargs += [key_file_arg]
821 
822  if test_case in ['per_rpc_creds', 'oauth2_auth_token']:
823  cmdargs += [oauth_scope_arg]
824 
825  if test_case == 'oauth2_auth_token' and language == 'c++':
826  # C++ oauth2 test uses GCE creds and thus needs to know the default account
827  cmdargs += [default_account_arg]
828 
829  if test_case == 'compute_engine_creds':
830  cmdargs += [oauth_scope_arg, default_account_arg]
831 
832  if test_case == _GOOGLE_DEFAULT_CREDS_TEST_CASE:
833  if google_default_creds_use_key_file:
834  env['GOOGLE_APPLICATION_CREDENTIALS'] = service_account_key_file
835  cmdargs += [default_account_arg]
836 
837  if test_case == _COMPUTE_ENGINE_CHANNEL_CREDS_TEST_CASE:
838  cmdargs += [default_account_arg]
839 
840  return (cmdargs, env)
841 
842 
844  if job._spec.container_name:
845  dockerjob.docker_kill(job._spec.container_name)
846  # When the job times out and we decide to kill it,
847  # we need to wait a before restarting the job
848  # to prevent "container name already in use" error.
849  # TODO(jtattermusch): figure out a cleaner way to this.
850  time.sleep(2)
851 
852 
854  test_case,
855  server_host_nickname,
856  server_host,
857  google_default_creds_use_key_file,
858  docker_image=None,
859  auth=False,
860  manual_cmd_log=None,
861  service_account_key_file=None,
862  default_service_account=None,
863  transport_security='tls'):
864  """Creates jobspec for cloud-to-prod interop test"""
865  container_name = None
866  cmdargs = [
867  '--server_host=%s' % server_host, '--server_port=443',
868  '--test_case=%s' % test_case
869  ]
870  if transport_security == 'tls':
871  transport_security_options = ['--use_tls=true']
872  elif transport_security == 'google_default_credentials' and str(
873  language) in ['c++', 'go', 'java', 'javaokhttp']:
874  transport_security_options = [
875  '--custom_credentials_type=google_default_credentials'
876  ]
877  elif transport_security == 'compute_engine_channel_creds' and str(
878  language) in ['go', 'java', 'javaokhttp']:
879  transport_security_options = [
880  '--custom_credentials_type=compute_engine_channel_creds'
881  ]
882  else:
883  print(
884  'Invalid transport security option %s in cloud_to_prod_jobspec. Lang: %s'
885  % (str(language), transport_security))
886  sys.exit(1)
887  cmdargs = cmdargs + transport_security_options
888  environ = dict(language.cloud_to_prod_env(), **language.global_env())
889  if auth:
890  auth_cmdargs, auth_env = auth_options(
891  language, test_case, google_default_creds_use_key_file,
892  service_account_key_file, default_service_account)
893  cmdargs += auth_cmdargs
894  environ.update(auth_env)
895  cmdline = bash_cmdline(language.client_cmd(cmdargs))
896  cwd = language.client_cwd
897 
898  if docker_image:
899  container_name = dockerjob.random_name('interop_client_%s' %
900  language.safename)
901  cmdline = docker_run_cmdline(
902  cmdline,
903  image=docker_image,
904  cwd=cwd,
905  environ=environ,
906  docker_args=['--net=host',
907  '--name=%s' % container_name])
908  if manual_cmd_log is not None:
909  if manual_cmd_log == []:
910  manual_cmd_log.append('echo "Testing ${docker_image:=%s}"' %
911  docker_image)
912  manual_cmd_log.append(manual_cmdline(cmdline, docker_image))
913  cwd = None
914  environ = None
915 
916  suite_name = 'cloud_to_prod_auth' if auth else 'cloud_to_prod'
917  test_job = jobset.JobSpec(cmdline=cmdline,
918  cwd=cwd,
919  environ=environ,
920  shortname='%s:%s:%s:%s:%s' %
921  (suite_name, language, server_host_nickname,
922  test_case, transport_security),
923  timeout_seconds=_TEST_TIMEOUT,
924  flake_retries=4 if args.allow_flakes else 0,
925  timeout_retries=2 if args.allow_flakes else 0,
926  kill_handler=_job_kill_handler)
927  if docker_image:
928  test_job.container_name = container_name
929  return test_job
930 
931 
933  test_case,
934  server_name,
935  server_host,
936  server_port,
937  docker_image=None,
938  transport_security='tls',
939  manual_cmd_log=None):
940  """Creates jobspec for cloud-to-cloud interop test"""
941  interop_only_options = [
942  '--server_host_override=foo.test.google.fr',
943  '--use_test_ca=true',
944  ]
945  if transport_security == 'tls':
946  interop_only_options += ['--use_tls=true']
947  elif transport_security == 'alts':
948  interop_only_options += ['--use_tls=false', '--use_alts=true']
949  elif transport_security == 'insecure':
950  interop_only_options += ['--use_tls=false']
951  else:
952  print(
953  'Invalid transport security option %s in cloud_to_cloud_jobspec.' %
954  transport_security)
955  sys.exit(1)
956 
957  client_test_case = test_case
958  if test_case in _HTTP2_SERVER_TEST_CASES_THAT_USE_GRPC_CLIENTS:
959  client_test_case = _GRPC_CLIENT_TEST_CASES_FOR_HTTP2_SERVER_TEST_CASES[
960  test_case]
961  if client_test_case in language.unimplemented_test_cases():
962  print('asking client %s to run unimplemented test case %s' %
963  (repr(language), client_test_case))
964  sys.exit(1)
965 
966  if test_case in _ORCA_TEST_CASES:
967  interop_only_options += [
968  '--service_config_json=\'{"loadBalancingConfig":[{"test_backend_metrics_load_balancer":{}}]}\''
969  ]
970 
971  common_options = [
972  '--test_case=%s' % client_test_case,
973  '--server_host=%s' % server_host,
974  '--server_port=%s' % server_port,
975  ]
976 
977  if test_case in _HTTP2_SERVER_TEST_CASES:
978  if test_case in _HTTP2_SERVER_TEST_CASES_THAT_USE_GRPC_CLIENTS:
979  client_options = interop_only_options + common_options
980  cmdline = bash_cmdline(language.client_cmd(client_options))
981  cwd = language.client_cwd
982  else:
983  cmdline = bash_cmdline(
984  language.client_cmd_http2interop(common_options))
985  cwd = language.http2_cwd
986  else:
987  cmdline = bash_cmdline(
988  language.client_cmd(common_options + interop_only_options))
989  cwd = language.client_cwd
990 
991  environ = language.global_env()
992  if docker_image and language.safename != 'objc':
993  # we can't run client in docker for objc.
994  container_name = dockerjob.random_name('interop_client_%s' %
995  language.safename)
996  cmdline = docker_run_cmdline(
997  cmdline,
998  image=docker_image,
999  environ=environ,
1000  cwd=cwd,
1001  docker_args=['--net=host',
1002  '--name=%s' % container_name])
1003  if manual_cmd_log is not None:
1004  if manual_cmd_log == []:
1005  manual_cmd_log.append('echo "Testing ${docker_image:=%s}"' %
1006  docker_image)
1007  manual_cmd_log.append(manual_cmdline(cmdline, docker_image))
1008  cwd = None
1009 
1010  test_job = jobset.JobSpec(
1011  cmdline=cmdline,
1012  cwd=cwd,
1013  environ=environ,
1014  shortname='cloud_to_cloud:%s:%s_server:%s:%s' %
1015  (language, server_name, test_case, transport_security),
1016  timeout_seconds=_TEST_TIMEOUT,
1017  flake_retries=4 if args.allow_flakes else 0,
1018  timeout_retries=2 if args.allow_flakes else 0,
1019  kill_handler=_job_kill_handler)
1020  if docker_image:
1021  test_job.container_name = container_name
1022  return test_job
1023 
1024 
1025 def server_jobspec(language,
1026  docker_image,
1027  transport_security='tls',
1028  manual_cmd_log=None):
1029  """Create jobspec for running a server"""
1030  container_name = dockerjob.random_name('interop_server_%s' %
1031  language.safename)
1032  server_cmd = ['--port=%s' % _DEFAULT_SERVER_PORT]
1033  if transport_security == 'tls':
1034  server_cmd += ['--use_tls=true']
1035  elif transport_security == 'alts':
1036  server_cmd += ['--use_tls=false', '--use_alts=true']
1037  elif transport_security == 'insecure':
1038  server_cmd += ['--use_tls=false']
1039  else:
1040  print('Invalid transport security option %s in server_jobspec.' %
1041  transport_security)
1042  sys.exit(1)
1043  cmdline = bash_cmdline(language.server_cmd(server_cmd))
1044  environ = language.global_env()
1045  docker_args = ['--name=%s' % container_name]
1046  if language.safename == 'http2':
1047  # we are running the http2 interop server. Open next N ports beginning
1048  # with the server port. These ports are used for http2 interop test
1049  # (one test case per port).
1050  docker_args += list(
1051  itertools.chain.from_iterable(
1052  ('-p', str(_DEFAULT_SERVER_PORT + i))
1053  for i in range(len(_HTTP2_SERVER_TEST_CASES))))
1054  # Enable docker's healthcheck mechanism.
1055  # This runs a Python script inside the container every second. The script
1056  # pings the http2 server to verify it is ready. The 'health-retries' flag
1057  # specifies the number of consecutive failures before docker will report
1058  # the container's status as 'unhealthy'. Prior to the first 'health_retries'
1059  # failures or the first success, the status will be 'starting'. 'docker ps'
1060  # or 'docker inspect' can be used to see the health of the container on the
1061  # command line.
1062  docker_args += [
1063  '--health-cmd=python test/http2_test/http2_server_health_check.py '
1064  '--server_host=%s --server_port=%d' %
1065  ('localhost', _DEFAULT_SERVER_PORT),
1066  '--health-interval=1s',
1067  '--health-retries=5',
1068  '--health-timeout=10s',
1069  ]
1070 
1071  else:
1072  docker_args += ['-p', str(_DEFAULT_SERVER_PORT)]
1073 
1074  docker_cmdline = docker_run_cmdline(cmdline,
1075  image=docker_image,
1076  cwd=language.server_cwd,
1077  environ=environ,
1078  docker_args=docker_args)
1079  if manual_cmd_log is not None:
1080  if manual_cmd_log == []:
1081  manual_cmd_log.append('echo "Testing ${docker_image:=%s}"' %
1082  docker_image)
1083  manual_cmd_log.append(manual_cmdline(docker_cmdline, docker_image))
1084  server_job = jobset.JobSpec(cmdline=docker_cmdline,
1085  environ=environ,
1086  shortname='interop_server_%s' % language,
1087  timeout_seconds=30 * 60)
1088  server_job.container_name = container_name
1089  return server_job
1090 
1091 
1092 def build_interop_image_jobspec(language, tag=None):
1093  """Creates jobspec for building interop docker image for a language"""
1094  if not tag:
1095  tag = 'grpc_interop_%s:%s' % (language.safename, uuid.uuid4())
1096  env = {
1097  'INTEROP_IMAGE': tag,
1098  'BASE_NAME': 'grpc_interop_%s' % language.safename
1099  }
1100  build_job = jobset.JobSpec(
1101  cmdline=['tools/run_tests/dockerize/build_interop_image.sh'],
1102  environ=env,
1103  shortname='build_docker_%s' % (language),
1104  timeout_seconds=30 * 60)
1105  build_job.tag = tag
1106  return build_job
1107 
1108 
1110  match = re.search(r'\{"cases[^\]]*\]\}', stdout)
1111  if not match:
1112  return None
1113 
1114  results = json.loads(match.group(0))
1115  skipped = 0
1116  passed = 0
1117  failed = 0
1118  failed_cases = []
1119  for case in results['cases']:
1120  if case.get('skipped', False):
1121  skipped += 1
1122  else:
1123  if case.get('passed', False):
1124  passed += 1
1125  else:
1126  failed += 1
1127  failed_cases.append(case.get('name', "NONAME"))
1128  return {
1129  'passed': passed,
1130  'failed': failed,
1131  'skipped': skipped,
1132  'failed_cases': ', '.join(failed_cases),
1133  'percent': 1.0 * passed / (passed + failed)
1134  }
1135 
1136 
1137 # A dictionary of prod servers to test against.
1138 # See go/grpc-interop-tests (internal-only) for details.
1139 prod_servers = {
1140  'default': 'grpc-test.sandbox.googleapis.com',
1141  'gateway_v4': 'grpc-test4.sandbox.googleapis.com',
1142 }
1143 
1144 argp = argparse.ArgumentParser(description='Run interop tests.')
1145 argp.add_argument('-l',
1146  '--language',
1147  choices=['all'] + sorted(_LANGUAGES),
1148  nargs='+',
1149  default=['all'],
1150  help='Clients to run. Objc client can be only run on OSX.')
1151 argp.add_argument('-j', '--jobs', default=multiprocessing.cpu_count(), type=int)
1152 argp.add_argument('--cloud_to_prod',
1153  default=False,
1154  action='store_const',
1155  const=True,
1156  help='Run cloud_to_prod tests.')
1157 argp.add_argument('--cloud_to_prod_auth',
1158  default=False,
1159  action='store_const',
1160  const=True,
1161  help='Run cloud_to_prod_auth tests.')
1162 argp.add_argument('--google_default_creds_use_key_file',
1163  default=False,
1164  action='store_const',
1165  const=True,
1166  help=('Whether or not we should use a key file for the '
1167  'google_default_credentials test case, e.g. by '
1168  'setting env var GOOGLE_APPLICATION_CREDENTIALS.'))
1169 argp.add_argument('--prod_servers',
1170  choices=list(prod_servers.keys()),
1171  default=['default'],
1172  nargs='+',
1173  help=('The servers to run cloud_to_prod and '
1174  'cloud_to_prod_auth tests against.'))
1175 argp.add_argument('-s',
1176  '--server',
1177  choices=['all'] + sorted(_SERVERS),
1178  nargs='+',
1179  help='Run cloud_to_cloud servers in a separate docker ' +
1180  'image. Servers can only be started automatically if ' +
1181  '--use_docker option is enabled.',
1182  default=[])
1183 argp.add_argument(
1184  '--override_server',
1185  action='append',
1186  type=lambda kv: kv.split('='),
1187  help=
1188  'Use servername=HOST:PORT to explicitly specify a server. E.g. csharp=localhost:50000',
1189  default=[])
1190 # TODO(jtattermusch): the default service_account_key_file only works when --use_docker is used.
1191 argp.add_argument(
1192  '--service_account_key_file',
1193  type=str,
1194  help='The service account key file to use for some auth interop tests.',
1195  default='/root/service_account/grpc-testing-ebe7c1ac7381.json')
1196 argp.add_argument(
1197  '--default_service_account',
1198  type=str,
1199  help='Default GCE service account email to use for some auth interop tests.',
1200  default='830293263384-compute@developer.gserviceaccount.com')
1201 argp.add_argument(
1202  '-t',
1203  '--travis',
1204  default=False,
1205  action='store_const',
1206  const=True,
1207  help='When set, indicates that the script is running on CI (= not locally).'
1208 )
1209 argp.add_argument('-v',
1210  '--verbose',
1211  default=False,
1212  action='store_const',
1213  const=True)
1214 argp.add_argument(
1215  '--use_docker',
1216  default=False,
1217  action='store_const',
1218  const=True,
1219  help='Run all the interop tests under docker. That provides ' +
1220  'additional isolation and prevents the need to install ' +
1221  'language specific prerequisites. Only available on Linux.')
1222 argp.add_argument(
1223  '--allow_flakes',
1224  default=False,
1225  action='store_const',
1226  const=True,
1227  help=
1228  'Allow flaky tests to show as passing (re-runs failed tests up to five times)'
1229 )
1230 argp.add_argument('--manual_run',
1231  default=False,
1232  action='store_const',
1233  const=True,
1234  help='Prepare things for running interop tests manually. ' +
1235  'Preserve docker images after building them and skip '
1236  'actually running the tests. Only print commands to run by ' +
1237  'hand.')
1238 argp.add_argument(
1239  '--http2_interop',
1240  default=False,
1241  action='store_const',
1242  const=True,
1243  help='Enable HTTP/2 client edge case testing. (Bad client, good server)')
1244 argp.add_argument(
1245  '--http2_server_interop',
1246  default=False,
1247  action='store_const',
1248  const=True,
1249  help=
1250  'Enable HTTP/2 server edge case testing. (Includes positive and negative tests'
1251 )
1252 argp.add_argument('--transport_security',
1253  choices=_TRANSPORT_SECURITY_OPTIONS,
1254  default='tls',
1255  type=str,
1256  nargs='?',
1257  const=True,
1258  help='Which transport security mechanism to use.')
1259 argp.add_argument(
1260  '--custom_credentials_type',
1261  choices=_CUSTOM_CREDENTIALS_TYPE_OPTIONS,
1262  default=_CUSTOM_CREDENTIALS_TYPE_OPTIONS,
1263  nargs='+',
1264  help=
1265  'Credential types to test in the cloud_to_prod setup. Default is to test with all creds types possible.'
1266 )
1267 argp.add_argument(
1268  '--skip_compute_engine_creds',
1269  default=False,
1270  action='store_const',
1271  const=True,
1272  help='Skip auth tests requiring access to compute engine credentials.')
1273 argp.add_argument(
1274  '--internal_ci',
1275  default=False,
1276  action='store_const',
1277  const=True,
1278  help=(
1279  '(Deprecated, has no effect) Put reports into subdirectories to improve '
1280  'presentation of results by Internal CI.'))
1281 argp.add_argument('--bq_result_table',
1282  default='',
1283  type=str,
1284  nargs='?',
1285  help='Upload test results to a specified BQ table.')
1286 args = argp.parse_args()
1287 
1288 servers = set(s for s in itertools.chain.from_iterable(
1289  _SERVERS if x == 'all' else [x] for x in args.server))
1290 # ALTS servers are only available for certain languages.
1291 if args.transport_security == 'alts':
1292  servers = servers.intersection(_SERVERS_FOR_ALTS_TEST_CASES)
1293 
1294 if args.use_docker:
1295  if not args.travis:
1296  print('Seen --use_docker flag, will run interop tests under docker.')
1297  print('')
1298  print(
1299  'IMPORTANT: The changes you are testing need to be locally committed'
1300  )
1301  print(
1302  'because only the committed changes in the current branch will be')
1303  print('copied to the docker environment.')
1304  time.sleep(5)
1305 
1306 if args.manual_run and not args.use_docker:
1307  print('--manual_run is only supported with --use_docker option enabled.')
1308  sys.exit(1)
1309 
1310 if not args.use_docker and servers:
1311  print(
1312  'Running interop servers is only supported with --use_docker option enabled.'
1313  )
1314  sys.exit(1)
1315 
1316 # we want to include everything but objc in 'all'
1317 # because objc won't run on non-mac platforms
1318 all_but_objc = set(six.iterkeys(_LANGUAGES)) - set(['objc'])
1319 languages = set(_LANGUAGES[l] for l in itertools.chain.from_iterable(
1320  all_but_objc if x == 'all' else [x] for x in args.language))
1321 # ALTS interop clients are only available for certain languages.
1322 if args.transport_security == 'alts':
1323  alts_languages = set(_LANGUAGES[l] for l in _LANGUAGES_FOR_ALTS_TEST_CASES)
1324  languages = languages.intersection(alts_languages)
1325 
1326 languages_http2_clients_for_http2_server_interop = set()
1327 if args.http2_server_interop:
1328  languages_http2_clients_for_http2_server_interop = set(
1329  _LANGUAGES[l]
1330  for l in _LANGUAGES_WITH_HTTP2_CLIENTS_FOR_HTTP2_SERVER_TEST_CASES
1331  if 'all' in args.language or l in args.language)
1332 
1333 http2Interop = Http2Client() if args.http2_interop else None
1334 http2InteropServer = Http2Server() if args.http2_server_interop else None
1335 
1336 docker_images = {}
1337 if args.use_docker:
1338  # languages for which to build docker images
1339  languages_to_build = set(_LANGUAGES[k]
1340  for k in set([str(l) for l in languages] +
1341  [s for s in servers]))
1342  languages_to_build = languages_to_build | languages_http2_clients_for_http2_server_interop
1343 
1344  if args.http2_interop:
1345  languages_to_build.add(http2Interop)
1346 
1347  if args.http2_server_interop:
1348  languages_to_build.add(http2InteropServer)
1349 
1350  build_jobs = []
1351  for l in languages_to_build:
1352  if str(l) == 'objc':
1353  # we don't need to build a docker image for objc
1354  continue
1356  docker_images[str(l)] = job.tag
1357  build_jobs.append(job)
1358 
1359  if build_jobs:
1360  jobset.message('START',
1361  'Building interop docker images.',
1362  do_newline=True)
1363  if args.verbose:
1364  print('Jobs to run: \n%s\n' % '\n'.join(str(j) for j in build_jobs))
1365 
1366  num_failures, build_resultset = jobset.run(build_jobs,
1367  newline_on_success=True,
1368  maxjobs=args.jobs)
1369 
1370  report_utils.render_junit_xml_report(build_resultset,
1371  _DOCKER_BUILD_XML_REPORT)
1372 
1373  if num_failures == 0:
1374  jobset.message('SUCCESS',
1375  'All docker images built successfully.',
1376  do_newline=True)
1377  else:
1378  jobset.message('FAILED',
1379  'Failed to build interop docker images.',
1380  do_newline=True)
1381  for image in six.itervalues(docker_images):
1382  dockerjob.remove_image(image, skip_nonexistent=True)
1383  sys.exit(1)
1384 
1385 server_manual_cmd_log = [] if args.manual_run else None
1386 client_manual_cmd_log = [] if args.manual_run else None
1387 
1388 # Start interop servers.
1389 server_jobs = {}
1390 server_addresses = {}
1391 try:
1392  for s in servers:
1393  lang = str(s)
1394  spec = server_jobspec(_LANGUAGES[lang],
1395  docker_images.get(lang),
1396  args.transport_security,
1397  manual_cmd_log=server_manual_cmd_log)
1398  if not args.manual_run:
1399  job = dockerjob.DockerJob(spec)
1400  server_jobs[lang] = job
1401  server_addresses[lang] = ('localhost',
1402  job.mapped_port(_DEFAULT_SERVER_PORT))
1403  else:
1404  # don't run the server, set server port to a placeholder value
1405  server_addresses[lang] = ('localhost', '${SERVER_PORT}')
1406 
1407  http2_server_job = None
1408  if args.http2_server_interop:
1409  # launch a HTTP2 server emulator that creates edge cases
1410  lang = str(http2InteropServer)
1411  spec = server_jobspec(http2InteropServer,
1412  docker_images.get(lang),
1413  manual_cmd_log=server_manual_cmd_log)
1414  if not args.manual_run:
1415  http2_server_job = dockerjob.DockerJob(spec)
1416  server_jobs[lang] = http2_server_job
1417  else:
1418  # don't run the server, set server port to a placeholder value
1419  server_addresses[lang] = ('localhost', '${SERVER_PORT}')
1420 
1421  jobs = []
1422  if args.cloud_to_prod:
1423  if args.transport_security not in ['tls']:
1424  print('TLS is always enabled for cloud_to_prod scenarios.')
1425  for server_host_nickname in args.prod_servers:
1426  for language in languages:
1427  for test_case in _TEST_CASES:
1428  if not test_case in language.unimplemented_test_cases():
1429  if not test_case in _SKIP_ADVANCED + _SKIP_COMPRESSION + _SKIP_SPECIAL_STATUS_MESSAGE + _ORCA_TEST_CASES:
1430  for transport_security in args.custom_credentials_type:
1431  # google_default_credentials not yet supported by all languages
1432  if transport_security == 'google_default_credentials' and str(
1433  language) not in [
1434  'c++', 'go', 'java', 'javaokhttp'
1435  ]:
1436  continue
1437  # compute_engine_channel_creds not yet supported by all languages
1438  if transport_security == 'compute_engine_channel_creds' and str(
1439  language) not in [
1440  'go', 'java', 'javaokhttp'
1441  ]:
1442  continue
1444  language,
1445  test_case,
1446  server_host_nickname,
1447  prod_servers[server_host_nickname],
1448  google_default_creds_use_key_file=args.
1449  google_default_creds_use_key_file,
1450  docker_image=docker_images.get(
1451  str(language)),
1452  manual_cmd_log=client_manual_cmd_log,
1453  service_account_key_file=args.
1454  service_account_key_file,
1455  default_service_account=args.
1456  default_service_account,
1457  transport_security=transport_security)
1458  jobs.append(test_job)
1459  if args.http2_interop:
1460  for test_case in _HTTP2_TEST_CASES:
1461  test_job = cloud_to_prod_jobspec(
1462  http2Interop,
1463  test_case,
1464  server_host_nickname,
1465  prod_servers[server_host_nickname],
1466  google_default_creds_use_key_file=args.
1467  google_default_creds_use_key_file,
1468  docker_image=docker_images.get(str(http2Interop)),
1469  manual_cmd_log=client_manual_cmd_log,
1470  service_account_key_file=args.service_account_key_file,
1471  default_service_account=args.default_service_account,
1472  transport_security=args.transport_security)
1473  jobs.append(test_job)
1474 
1475  if args.cloud_to_prod_auth:
1476  if args.transport_security not in ['tls']:
1477  print('TLS is always enabled for cloud_to_prod scenarios.')
1478  for server_host_nickname in args.prod_servers:
1479  for language in languages:
1480  for test_case in _AUTH_TEST_CASES:
1481  if (not args.skip_compute_engine_creds or
1483  language, test_case)):
1484  if not test_case in language.unimplemented_test_cases():
1485  if test_case == _GOOGLE_DEFAULT_CREDS_TEST_CASE:
1486  transport_security = 'google_default_credentials'
1487  elif test_case == _COMPUTE_ENGINE_CHANNEL_CREDS_TEST_CASE:
1488  transport_security = 'compute_engine_channel_creds'
1489  else:
1490  transport_security = 'tls'
1491  if transport_security not in args.custom_credentials_type:
1492  continue
1493  test_job = cloud_to_prod_jobspec(
1494  language,
1495  test_case,
1496  server_host_nickname,
1497  prod_servers[server_host_nickname],
1498  google_default_creds_use_key_file=args.
1499  google_default_creds_use_key_file,
1500  docker_image=docker_images.get(str(language)),
1501  auth=True,
1502  manual_cmd_log=client_manual_cmd_log,
1503  service_account_key_file=args.
1504  service_account_key_file,
1505  default_service_account=args.
1506  default_service_account,
1507  transport_security=transport_security)
1508  jobs.append(test_job)
1509  for server in args.override_server:
1510  server_name = server[0]
1511  (server_host, server_port) = server[1].split(':')
1512  server_addresses[server_name] = (server_host, server_port)
1513 
1514  for server_name, server_address in list(server_addresses.items()):
1515  (server_host, server_port) = server_address
1516  server_language = _LANGUAGES.get(server_name, None)
1517  skip_server = [] # test cases unimplemented by server
1518  if server_language:
1519  skip_server = server_language.unimplemented_test_cases_server()
1520  for language in languages:
1521  for test_case in _TEST_CASES:
1522  if not test_case in language.unimplemented_test_cases():
1523  if not test_case in skip_server:
1524  test_job = cloud_to_cloud_jobspec(
1525  language,
1526  test_case,
1527  server_name,
1528  server_host,
1529  server_port,
1530  docker_image=docker_images.get(str(language)),
1531  transport_security=args.transport_security,
1532  manual_cmd_log=client_manual_cmd_log)
1533  jobs.append(test_job)
1534 
1535  if args.http2_interop:
1536  for test_case in _HTTP2_TEST_CASES:
1537  if server_name == "go":
1538  # TODO(carl-mastrangelo): Reenable after https://github.com/grpc/grpc-go/issues/434
1539  continue
1540  test_job = cloud_to_cloud_jobspec(
1541  http2Interop,
1542  test_case,
1543  server_name,
1544  server_host,
1545  server_port,
1546  docker_image=docker_images.get(str(http2Interop)),
1547  transport_security=args.transport_security,
1548  manual_cmd_log=client_manual_cmd_log)
1549  jobs.append(test_job)
1550 
1551  if args.http2_server_interop:
1552  if not args.manual_run:
1553  http2_server_job.wait_for_healthy(timeout_seconds=600)
1554  for language in languages_http2_clients_for_http2_server_interop:
1555  for test_case in set(_HTTP2_SERVER_TEST_CASES) - set(
1556  _HTTP2_SERVER_TEST_CASES_THAT_USE_GRPC_CLIENTS):
1557  offset = sorted(_HTTP2_SERVER_TEST_CASES).index(test_case)
1558  server_port = _DEFAULT_SERVER_PORT + offset
1559  if not args.manual_run:
1560  server_port = http2_server_job.mapped_port(server_port)
1561  test_job = cloud_to_cloud_jobspec(
1562  language,
1563  test_case,
1564  str(http2InteropServer),
1565  'localhost',
1566  server_port,
1567  docker_image=docker_images.get(str(language)),
1568  manual_cmd_log=client_manual_cmd_log)
1569  jobs.append(test_job)
1570  for language in languages:
1571  # HTTP2_SERVER_TEST_CASES_THAT_USE_GRPC_CLIENTS is a subset of
1572  # HTTP_SERVER_TEST_CASES, in which clients use their gRPC interop clients rather
1573  # than specialized http2 clients, reusing existing test implementations.
1574  # For example, in the "data_frame_padding" test, use language's gRPC
1575  # interop clients and make them think that they're running "large_unary"
1576  # test case. This avoids implementing a new test case in each language.
1577  for test_case in _HTTP2_SERVER_TEST_CASES_THAT_USE_GRPC_CLIENTS:
1578  if test_case not in language.unimplemented_test_cases():
1579  offset = sorted(_HTTP2_SERVER_TEST_CASES).index(test_case)
1580  server_port = _DEFAULT_SERVER_PORT + offset
1581  if not args.manual_run:
1582  server_port = http2_server_job.mapped_port(server_port)
1583  if args.transport_security != 'insecure':
1584  print(
1585  ('Creating grpc client to http2 server test case '
1586  'with insecure connection, even though '
1587  'args.transport_security is not insecure. Http2 '
1588  'test server only supports insecure connections.'))
1589  test_job = cloud_to_cloud_jobspec(
1590  language,
1591  test_case,
1592  str(http2InteropServer),
1593  'localhost',
1594  server_port,
1595  docker_image=docker_images.get(str(language)),
1596  transport_security='insecure',
1597  manual_cmd_log=client_manual_cmd_log)
1598  jobs.append(test_job)
1599 
1600  if not jobs:
1601  print('No jobs to run.')
1602  for image in six.itervalues(docker_images):
1603  dockerjob.remove_image(image, skip_nonexistent=True)
1604  sys.exit(1)
1605 
1606  if args.manual_run:
1607  print('All tests will skipped --manual_run option is active.')
1608 
1609  if args.verbose:
1610  print('Jobs to run: \n%s\n' % '\n'.join(str(job) for job in jobs))
1611 
1612  num_failures, resultset = jobset.run(jobs,
1613  newline_on_success=True,
1614  maxjobs=args.jobs,
1615  skip_jobs=args.manual_run)
1616  if args.bq_result_table and resultset:
1617  upload_interop_results_to_bq(resultset, args.bq_result_table)
1618  if num_failures:
1619  jobset.message('FAILED', 'Some tests failed', do_newline=True)
1620  else:
1621  jobset.message('SUCCESS', 'All tests passed', do_newline=True)
1622 
1623  write_cmdlog_maybe(server_manual_cmd_log, 'interop_server_cmds.sh')
1624  write_cmdlog_maybe(client_manual_cmd_log, 'interop_client_cmds.sh')
1625 
1626  report_utils.render_junit_xml_report(resultset, _TESTS_XML_REPORT)
1627 
1628  for name, job in list(resultset.items()):
1629  if "http2" in name:
1630  job[0].http2results = aggregate_http2_results(job[0].message)
1631 
1632  http2_server_test_cases = (_HTTP2_SERVER_TEST_CASES
1633  if args.http2_server_interop else [])
1634 
1635  if num_failures:
1636  sys.exit(1)
1637  else:
1638  sys.exit(0)
1639 finally:
1640  # Check if servers are still running.
1641  for server, job in list(server_jobs.items()):
1642  if not job.is_running():
1643  print('Server "%s" has exited prematurely.' % server)
1644 
1645  dockerjob.finish_jobs([j for j in six.itervalues(server_jobs)])
1646 
1647  for image in six.itervalues(docker_images):
1648  if not args.manual_run:
1649  print('Removing docker image %s' % image)
1650  dockerjob.remove_image(image)
1651  else:
1652  print('Preserving docker image: %s' % image)
xds_interop_client.str
str
Definition: xds_interop_client.py:487
run_interop_tests.GoLanguage.safename
safename
Definition: run_interop_tests.py:262
run_interop_tests.PythonAsyncIOLanguage.__str__
def __str__(self)
Definition: run_interop_tests.py:655
run_interop_tests.RubyLanguage.cloud_to_prod_env
def cloud_to_prod_env(self)
Definition: run_interop_tests.py:523
run_interop_tests.PythonLanguage.client_cwd
client_cwd
Definition: run_interop_tests.py:557
run_interop_tests.CXXLanguage.client_cmd
def client_cmd(self, args)
Definition: run_interop_tests.py:103
run_interop_tests.Http2Server.unimplemented_test_cases
def unimplemented_test_cases(self)
Definition: run_interop_tests.py:311
run_interop_tests.JavaOkHttpClient.__str__
def __str__(self)
Definition: run_interop_tests.py:251
http2_test_server.format
format
Definition: http2_test_server.py:118
run_interop_tests.Http2Client.cloud_to_prod_env
def cloud_to_prod_env(self)
Definition: run_interop_tests.py:339
run_interop_tests.PythonLanguage.unimplemented_test_cases
def unimplemented_test_cases(self)
Definition: run_interop_tests.py:589
run_interop_tests.PythonAsyncIOLanguage.server_cwd
server_cwd
Definition: run_interop_tests.py:608
run_interop_tests.RubyLanguage
Definition: run_interop_tests.py:510
run_interop_tests.Http2Client.global_env
def global_env(self)
Definition: run_interop_tests.py:342
run_interop_tests.CXXLanguage.unimplemented_test_cases_server
def unimplemented_test_cases_server(self)
Definition: run_interop_tests.py:124
run_interop_tests.Http2Client.safename
safename
Definition: run_interop_tests.py:334
run_interop_tests.CXXLanguage.client_cwd
client_cwd
Definition: run_interop_tests.py:98
python_utils.report_utils
Definition: report_utils.py:1
run_interop_tests.GoLanguage.client_cmd_http2interop
def client_cmd_http2interop(self, args)
Definition: run_interop_tests.py:267
run_interop_tests.RubyLanguage.client_cmd
def client_cmd(self, args)
Definition: run_interop_tests.py:517
capstone.range
range
Definition: third_party/bloaty/third_party/capstone/bindings/python/capstone/__init__.py:6
run_interop_tests.ObjcLanguage.cloud_to_prod_env
def cloud_to_prod_env(self)
Definition: run_interop_tests.py:483
run_interop_tests.AspNetCoreLanguage.unimplemented_test_cases_server
def unimplemented_test_cases_server(self)
Definition: run_interop_tests.py:155
run_interop_tests.PythonAsyncIOLanguage
Definition: run_interop_tests.py:604
run_interop_tests.ObjcLanguage.safename
safename
Definition: run_interop_tests.py:472
run_interop_tests.manual_cmdline
def manual_cmdline(docker_cmdline, docker_image)
Definition: run_interop_tests.py:755
run_interop_tests.PythonLanguage.server_cwd
server_cwd
Definition: run_interop_tests.py:558
run_interop_tests.AspNetCoreLanguage.__str__
def __str__(self)
Definition: run_interop_tests.py:158
run_interop_tests.DartLanguage.__init__
def __init__(self)
Definition: run_interop_tests.py:164
run_interop_tests.DartLanguage.http2_cwd
http2_cwd
Definition: run_interop_tests.py:167
run_interop_tests.Http2Client.unimplemented_test_cases
def unimplemented_test_cases(self)
Definition: run_interop_tests.py:345
run_interop_tests.PHP7Language.unimplemented_test_cases_server
def unimplemented_test_cases_server(self)
Definition: run_interop_tests.py:460
run_interop_tests.PHP7Language.client_cmd
def client_cmd(self, args)
Definition: run_interop_tests.py:441
run_interop_tests.PythonAsyncIOLanguage.unimplemented_test_cases_server
def unimplemented_test_cases_server(self)
Definition: run_interop_tests.py:648
run_interop_tests.JavaOkHttpClient.client_cmd
def client_cmd(self, args)
Definition: run_interop_tests.py:239
run_interop_tests.Http2Server.unimplemented_test_cases_server
def unimplemented_test_cases_server(self)
Definition: run_interop_tests.py:318
run_interop_tests.Http2Client.__str__
def __str__(self)
Definition: run_interop_tests.py:354
run_interop_tests.ObjcLanguage.__init__
def __init__(self)
Definition: run_interop_tests.py:470
run_interop_tests.AspNetCoreLanguage.server_cmd
def server_cmd(self, args)
Definition: run_interop_tests.py:144
run_interop_tests.CXXLanguage.safename
safename
Definition: run_interop_tests.py:101
run_interop_tests.GoLanguage.client_cwd
client_cwd
Definition: run_interop_tests.py:259
run_interop_tests.DartLanguage.safename
safename
Definition: run_interop_tests.py:168
run_interop_tests.GoLanguage.__init__
def __init__(self)
Definition: run_interop_tests.py:257
run_interop_tests.GoLanguage
Definition: run_interop_tests.py:255
run_interop_tests.CXXLanguage.cloud_to_prod_env
def cloud_to_prod_env(self)
Definition: run_interop_tests.py:109
run_interop_tests.Http2Server.cloud_to_prod_env
def cloud_to_prod_env(self)
Definition: run_interop_tests.py:305
run_interop_tests.JavaLanguage
Definition: run_interop_tests.py:196
run_interop_tests.CXXLanguage.client_cmd_http2interop
def client_cmd_http2interop(self, args)
Definition: run_interop_tests.py:106
run_interop_tests.NodeLanguage.unimplemented_test_cases
def unimplemented_test_cases(self)
Definition: run_interop_tests.py:385
run_interop_tests.Http2Server.server_cmd
def server_cmd(self, args)
Definition: run_interop_tests.py:302
run_interop_tests.compute_engine_creds_required
def compute_engine_creds_required(language, test_case)
Definition: run_interop_tests.py:791
run_interop_tests.CXXLanguage
Definition: run_interop_tests.py:95
run_interop_tests.PHP7Language
Definition: run_interop_tests.py:434
run_interop_tests.PHP7Language.server_cmd
def server_cmd(self, args)
Definition: run_interop_tests.py:447
run_interop_tests.PHP7Language.unimplemented_test_cases
def unimplemented_test_cases(self)
Definition: run_interop_tests.py:453
run_interop_tests.NodePureJSLanguage.unimplemented_test_cases_server
def unimplemented_test_cases_server(self)
Definition: run_interop_tests.py:427
run_interop_tests.DartLanguage.client_cwd
client_cwd
Definition: run_interop_tests.py:165
run_interop_tests.RubyLanguage.global_env
def global_env(self)
Definition: run_interop_tests.py:532
run_interop_tests.build_interop_image_jobspec
def build_interop_image_jobspec(language, tag=None)
Definition: run_interop_tests.py:1092
run_interop_tests.Http2Client
Definition: run_interop_tests.py:325
python_utils.dockerjob
Definition: dockerjob.py:1
run_interop_tests.CXXLanguage.server_cwd
server_cwd
Definition: run_interop_tests.py:99
run_interop_tests.JavaLanguage.unimplemented_test_cases
def unimplemented_test_cases(self)
Definition: run_interop_tests.py:221
run_interop_tests.NodePureJSLanguage.unimplemented_test_cases
def unimplemented_test_cases(self)
Definition: run_interop_tests.py:420
run_interop_tests.JavaOkHttpClient.safename
safename
Definition: run_interop_tests.py:237
run_interop_tests.NodeLanguage.unimplemented_test_cases_server
def unimplemented_test_cases_server(self)
Definition: run_interop_tests.py:392
python_utils.upload_test_results
Definition: upload_test_results.py:1
run_interop_tests.PythonLanguage
Definition: run_interop_tests.py:554
run_interop_tests.JavaOkHttpClient.__init__
def __init__(self)
Definition: run_interop_tests.py:235
run_interop_tests.PythonAsyncIOLanguage.global_env
def global_env(self)
Definition: run_interop_tests.py:634
run_interop_tests.NodePureJSLanguage.client_cmd
def client_cmd(self, args)
Definition: run_interop_tests.py:407
run_interop_tests.DartLanguage.server_cwd
server_cwd
Definition: run_interop_tests.py:166
run_interop_tests.server_jobspec
def server_jobspec(language, docker_image, transport_security='tls', manual_cmd_log=None)
Definition: run_interop_tests.py:1025
run_interop_tests.NodeLanguage.safename
safename
Definition: run_interop_tests.py:363
run_interop_tests.NodePureJSLanguage
Definition: run_interop_tests.py:400
run_interop_tests.bash_cmdline
def bash_cmdline(cmdline)
Definition: run_interop_tests.py:784
run_interop_tests.RubyLanguage.safename
safename
Definition: run_interop_tests.py:515
run_interop_tests.Http2Server.safename
safename
Definition: run_interop_tests.py:300
run_interop_tests.NodeLanguage
Definition: run_interop_tests.py:358
run_interop_tests.docker_run_cmdline
def docker_run_cmdline(cmdline, image, docker_args=[], cwd=None, environ=None)
Definition: run_interop_tests.py:733
run_interop_tests.RubyLanguage.__init__
def __init__(self)
Definition: run_interop_tests.py:512
run_interop_tests.NodePureJSLanguage.cloud_to_prod_env
def cloud_to_prod_env(self)
Definition: run_interop_tests.py:414
run_interop_tests.JavaLanguage.client_cwd
client_cwd
Definition: run_interop_tests.py:199
run_interop_tests.GoLanguage.http2_cwd
http2_cwd
Definition: run_interop_tests.py:261
run_interop_tests.GoLanguage.client_cmd
def client_cmd(self, args)
Definition: run_interop_tests.py:264
run_interop_tests.ObjcLanguage
Definition: run_interop_tests.py:468
run_interop_tests.JavaOkHttpClient
Definition: run_interop_tests.py:233
run_interop_tests.PythonAsyncIOLanguage.safename
safename
Definition: run_interop_tests.py:610
run_interop_tests.PythonLanguage.safename
safename
Definition: run_interop_tests.py:560
run_interop_tests.JavaLanguage.__str__
def __str__(self)
Definition: run_interop_tests.py:229
run_interop_tests.PythonAsyncIOLanguage.unimplemented_test_cases
def unimplemented_test_cases(self)
Definition: run_interop_tests.py:640
run_interop_tests.PHP7Language.cloud_to_prod_env
def cloud_to_prod_env(self)
Definition: run_interop_tests.py:444
run_interop_tests._job_kill_handler
def _job_kill_handler(job)
Definition: run_interop_tests.py:843
run_interop_tests.JavaOkHttpClient.client_cwd
client_cwd
Definition: run_interop_tests.py:236
run_interop_tests.PythonAsyncIOLanguage.client_cmd
def client_cmd(self, args)
Definition: run_interop_tests.py:612
python_utils.jobset
Definition: jobset.py:1
run_interop_tests.PythonAsyncIOLanguage.http2_cwd
http2_cwd
Definition: run_interop_tests.py:609
run_interop_tests.NodeLanguage.client_cmd
def client_cmd(self, args)
Definition: run_interop_tests.py:365
run_interop_tests.JavaLanguage.cloud_to_prod_env
def cloud_to_prod_env(self)
Definition: run_interop_tests.py:212
run_interop_tests.PythonLanguage.__init__
def __init__(self)
Definition: run_interop_tests.py:556
run_interop_tests.NodeLanguage.server_cmd
def server_cmd(self, args)
Definition: run_interop_tests.py:375
run_interop_tests.PythonAsyncIOLanguage.server_cmd
def server_cmd(self, args)
Definition: run_interop_tests.py:627
run_interop_tests.JavaLanguage.server_cwd
server_cwd
Definition: run_interop_tests.py:200
run_interop_tests.auth_options
def auth_options(language, test_case, google_default_creds_use_key_file, service_account_key_file, default_service_account)
Definition: run_interop_tests.py:802
run_interop_tests.PythonLanguage.global_env
def global_env(self)
Definition: run_interop_tests.py:583
run_interop_tests.NodePureJSLanguage.client_cwd
client_cwd
Definition: run_interop_tests.py:403
run_interop_tests.AspNetCoreLanguage
Definition: run_interop_tests.py:131
run_interop_tests.NodePureJSLanguage.__str__
def __str__(self)
Definition: run_interop_tests.py:430
run_interop_tests.CXXLanguage.http2_cwd
http2_cwd
Definition: run_interop_tests.py:100
run_interop_tests.CXXLanguage.__str__
def __str__(self)
Definition: run_interop_tests.py:127
run_interop_tests.PythonLanguage.client_cmd_http2interop
def client_cmd_http2interop(self, args)
Definition: run_interop_tests.py:568
run_interop_tests.CXXLanguage.global_env
def global_env(self)
Definition: run_interop_tests.py:115
run_interop_tests.NodePureJSLanguage.server_cwd
server_cwd
Definition: run_interop_tests.py:404
run_interop_tests.ObjcLanguage.client_cmd
def client_cmd(self, args)
Definition: run_interop_tests.py:474
run_interop_tests.NodeLanguage.cloud_to_prod_env
def cloud_to_prod_env(self)
Definition: run_interop_tests.py:372
run_interop_tests.GoLanguage.server_cmd
def server_cmd(self, args)
Definition: run_interop_tests.py:273
run_interop_tests.PythonLanguage.cloud_to_prod_env
def cloud_to_prod_env(self)
Definition: run_interop_tests.py:574
run_interop_tests.JavaOkHttpClient.global_env
def global_env(self)
Definition: run_interop_tests.py:245
run_interop_tests.NodePureJSLanguage.safename
safename
Definition: run_interop_tests.py:405
run_interop_tests.NodeLanguage.__init__
def __init__(self)
Definition: run_interop_tests.py:360
run_interop_tests.NodePureJSLanguage.__init__
def __init__(self)
Definition: run_interop_tests.py:402
run_interop_tests.DartLanguage.__str__
def __str__(self)
Definition: run_interop_tests.py:192
run_interop_tests.GoLanguage.unimplemented_test_cases
def unimplemented_test_cases(self)
Definition: run_interop_tests.py:279
run_interop_tests.PHP7Language.safename
safename
Definition: run_interop_tests.py:439
run_interop_tests.PythonAsyncIOLanguage.client_cmd_http2interop
def client_cmd_http2interop(self, args)
Definition: run_interop_tests.py:618
run_interop_tests.PythonAsyncIOLanguage.client_cwd
client_cwd
Definition: run_interop_tests.py:607
run_interop_tests.Http2Server.__str__
def __str__(self)
Definition: run_interop_tests.py:321
run_interop_tests.JavaLanguage.unimplemented_test_cases_server
def unimplemented_test_cases_server(self)
Definition: run_interop_tests.py:224
run_interop_tests.ObjcLanguage.unimplemented_test_cases
def unimplemented_test_cases(self)
Definition: run_interop_tests.py:489
run_interop_tests.RubyLanguage.server_cmd
def server_cmd(self, args)
Definition: run_interop_tests.py:526
run_interop_tests.Http2Server.server_cwd
server_cwd
Definition: run_interop_tests.py:299
run_interop_tests.DartLanguage.unimplemented_test_cases_server
def unimplemented_test_cases_server(self)
Definition: run_interop_tests.py:189
run_interop_tests.ObjcLanguage.__str__
def __str__(self)
Definition: run_interop_tests.py:506
run_interop_tests.RubyLanguage.__str__
def __str__(self)
Definition: run_interop_tests.py:547
run_interop_tests.PythonLanguage.http2_cwd
http2_cwd
Definition: run_interop_tests.py:559
run_interop_tests.GoLanguage.server_cwd
server_cwd
Definition: run_interop_tests.py:260
run_interop_tests.PythonLanguage.__str__
def __str__(self)
Definition: run_interop_tests.py:600
run_interop_tests.CXXLanguage.unimplemented_test_cases
def unimplemented_test_cases(self)
Definition: run_interop_tests.py:118
run_interop_tests.JavaLanguage.global_env
def global_env(self)
Definition: run_interop_tests.py:218
run_interop_tests.RubyLanguage.server_cwd
server_cwd
Definition: run_interop_tests.py:514
run_interop_tests.DartLanguage
Definition: run_interop_tests.py:162
run_interop_tests.AspNetCoreLanguage.server_cwd
server_cwd
Definition: run_interop_tests.py:135
run_interop_tests.GoLanguage.__str__
def __str__(self)
Definition: run_interop_tests.py:287
run_interop_tests.Http2Client.unimplemented_test_cases_server
def unimplemented_test_cases_server(self)
Definition: run_interop_tests.py:351
run_interop_tests.PythonLanguage.server_cmd
def server_cmd(self, args)
Definition: run_interop_tests.py:577
run_interop_tests.GoLanguage.cloud_to_prod_env
def cloud_to_prod_env(self)
Definition: run_interop_tests.py:270
run_interop_tests.DartLanguage.global_env
def global_env(self)
Definition: run_interop_tests.py:179
run_interop_tests.NodePureJSLanguage.global_env
def global_env(self)
Definition: run_interop_tests.py:417
run_interop_tests.AspNetCoreLanguage.cloud_to_prod_env
def cloud_to_prod_env(self)
Definition: run_interop_tests.py:138
run_interop_tests.CXXLanguage.server_cmd
def server_cmd(self, args)
Definition: run_interop_tests.py:112
index
int index
Definition: bloaty/third_party/protobuf/php/ext/google/protobuf/protobuf.h:1184
run_interop_tests.GoLanguage.unimplemented_test_cases_server
def unimplemented_test_cases_server(self)
Definition: run_interop_tests.py:283
run_interop_tests.AspNetCoreLanguage.client_cwd
client_cwd
Definition: run_interop_tests.py:134
run_interop_tests.ObjcLanguage.global_env
def global_env(self)
Definition: run_interop_tests.py:486
cpp.gmock_class.set
set
Definition: bloaty/third_party/googletest/googlemock/scripts/generator/cpp/gmock_class.py:44
run_interop_tests.JavaLanguage.http2_cwd
http2_cwd
Definition: run_interop_tests.py:201
run_interop_tests.RubyLanguage.unimplemented_test_cases
def unimplemented_test_cases(self)
Definition: run_interop_tests.py:535
run_interop_tests.CXXLanguage.__init__
def __init__(self)
Definition: run_interop_tests.py:97
run_interop_tests.ObjcLanguage.unimplemented_test_cases_server
def unimplemented_test_cases_server(self)
Definition: run_interop_tests.py:502
run_interop_tests.Http2Client.client_cwd
client_cwd
Definition: run_interop_tests.py:333
run_interop_tests.JavaLanguage.server_cmd
def server_cmd(self, args)
Definition: run_interop_tests.py:215
run_interop_tests.ObjcLanguage.client_cwd
client_cwd
Definition: run_interop_tests.py:471
run_interop_tests.PythonLanguage.client_cmd
def client_cmd(self, args)
Definition: run_interop_tests.py:562
run_interop_tests.JavaLanguage.safename
safename
Definition: run_interop_tests.py:202
run_interop_tests.PHP7Language.__init__
def __init__(self)
Definition: run_interop_tests.py:436
run_interop_tests.Http2Server.__init__
def __init__(self)
Definition: run_interop_tests.py:298
run_interop_tests.Http2Server
Definition: run_interop_tests.py:291
run_interop_tests.NodeLanguage.__str__
def __str__(self)
Definition: run_interop_tests.py:396
run_interop_tests.PythonLanguage.unimplemented_test_cases_server
def unimplemented_test_cases_server(self)
Definition: run_interop_tests.py:596
run_interop_tests.PythonAsyncIOLanguage.cloud_to_prod_env
def cloud_to_prod_env(self)
Definition: run_interop_tests.py:624
run_interop_tests.DartLanguage.client_cmd
def client_cmd(self, args)
Definition: run_interop_tests.py:170
run_interop_tests.write_cmdlog_maybe
def write_cmdlog_maybe(cmdlog, filename)
Definition: run_interop_tests.py:771
run_interop_tests.AspNetCoreLanguage.client_cmd
def client_cmd(self, args)
Definition: run_interop_tests.py:141
run_interop_tests.GoLanguage.global_env
def global_env(self)
Definition: run_interop_tests.py:276
open
#define open
Definition: test-fs.c:46
run_interop_tests.PHP7Language.__str__
def __str__(self)
Definition: run_interop_tests.py:464
run_interop_tests.DartLanguage.server_cmd
def server_cmd(self, args)
Definition: run_interop_tests.py:176
run_interop_tests.PHP7Language.client_cwd
client_cwd
Definition: run_interop_tests.py:437
python_utils.upload_test_results.upload_interop_results_to_bq
def upload_interop_results_to_bq(resultset, bq_table)
Definition: upload_test_results.py:145
run_interop_tests.NodeLanguage.client_cwd
client_cwd
Definition: run_interop_tests.py:361
run_interop_tests.JavaLanguage.__init__
def __init__(self)
Definition: run_interop_tests.py:198
run_interop_tests.JavaOkHttpClient.cloud_to_prod_env
def cloud_to_prod_env(self)
Definition: run_interop_tests.py:242
run_interop_tests.AspNetCoreLanguage.__init__
def __init__(self)
Definition: run_interop_tests.py:133
run_interop_tests.NodeLanguage.global_env
def global_env(self)
Definition: run_interop_tests.py:382
run_interop_tests.AspNetCoreLanguage.global_env
def global_env(self)
Definition: run_interop_tests.py:147
len
int len
Definition: abseil-cpp/absl/base/internal/low_level_alloc_test.cc:46
run_interop_tests.DartLanguage.cloud_to_prod_env
def cloud_to_prod_env(self)
Definition: run_interop_tests.py:173
run_interop_tests.NodeLanguage.server_cwd
server_cwd
Definition: run_interop_tests.py:362
run_interop_tests.JavaOkHttpClient.unimplemented_test_cases
def unimplemented_test_cases(self)
Definition: run_interop_tests.py:248
run_interop_tests.PHP7Language.server_cwd
server_cwd
Definition: run_interop_tests.py:438
run_interop_tests.cloud_to_prod_jobspec
def cloud_to_prod_jobspec(language, test_case, server_host_nickname, server_host, google_default_creds_use_key_file, docker_image=None, auth=False, manual_cmd_log=None, service_account_key_file=None, default_service_account=None, transport_security='tls')
Definition: run_interop_tests.py:853
run_interop_tests.cloud_to_cloud_jobspec
def cloud_to_cloud_jobspec(language, test_case, server_name, server_host, server_port, docker_image=None, transport_security='tls', manual_cmd_log=None)
Definition: run_interop_tests.py:932
split
static void split(const char *s, char ***ss, size_t *ns)
Definition: debug/trace.cc:111
run_interop_tests.AspNetCoreLanguage.safename
safename
Definition: run_interop_tests.py:136
run_interop_tests.Http2Client.__init__
def __init__(self)
Definition: run_interop_tests.py:332
run_interop_tests.DartLanguage.unimplemented_test_cases
def unimplemented_test_cases(self)
Definition: run_interop_tests.py:182
run_interop_tests.Http2Server.global_env
def global_env(self)
Definition: run_interop_tests.py:308
run_interop_tests.JavaLanguage.client_cmd_http2interop
def client_cmd_http2interop(self, args)
Definition: run_interop_tests.py:207
run_interop_tests.PHP7Language.global_env
def global_env(self)
Definition: run_interop_tests.py:450
run_interop_tests.aggregate_http2_results
def aggregate_http2_results(stdout)
Definition: run_interop_tests.py:1109
run_interop_tests.Http2Client.client_cmd
def client_cmd(self, args)
Definition: run_interop_tests.py:336
run_interop_tests.RubyLanguage.client_cwd
client_cwd
Definition: run_interop_tests.py:513
run_interop_tests.RubyLanguage.unimplemented_test_cases_server
def unimplemented_test_cases_server(self)
Definition: run_interop_tests.py:543
run_interop_tests.JavaLanguage.client_cmd
def client_cmd(self, args)
Definition: run_interop_tests.py:204
run_interop_tests.PythonAsyncIOLanguage.__init__
def __init__(self)
Definition: run_interop_tests.py:606
run_interop_tests.AspNetCoreLanguage.unimplemented_test_cases
def unimplemented_test_cases(self)
Definition: run_interop_tests.py:150


grpc
Author(s):
autogenerated on Fri May 16 2025 03:00:08