| 
					
				 | 
			
			
				@@ -277,7 +277,8 @@ _TESTS_TO_RUN_MULTIPLE_RPCS = ['path_matching', 'header_matching'] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 # Tests that make UnaryCall with test metadata. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 _TESTS_TO_SEND_METADATA = ['header_matching'] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 _TEST_METADATA_KEY = 'xds_md' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-_TEST_METADATA_VALUE = 'exact_match' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+_TEST_METADATA_VALUE_UNARY = 'unary_yranu' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+_TEST_METADATA_VALUE_EMPTY = 'empty_ytpme' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 _PATH_MATCHER_NAME = 'path-matcher' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 _BASE_TEMPLATE_NAME = 'test-template' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 _BASE_INSTANCE_GROUP_NAME = 'test-ig' 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1025,25 +1026,85 @@ def test_header_matching(gcp, original_backend_service, instance_group, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     try: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         # A list of tuples (route_rules, expected_instances). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        test_cases = [( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            [{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                'priority': 0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                # Header ExactMatch -> alternate_backend_service. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                # EmptyCall is sent with the metadata. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                'matchRules': [{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    'prefixMatch': 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        '/', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    'headerMatches': [{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        'headerName': _TEST_METADATA_KEY, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        'exactMatch': _TEST_METADATA_VALUE 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    }] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        test_cases = [ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            ( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                [{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    'priority': 0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    # Header ExactMatch -> alternate_backend_service. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    # EmptyCall is sent with the metadata. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    'matchRules': [{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        'prefixMatch': 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            '/', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        'headerMatches': [{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            'headerName': _TEST_METADATA_KEY, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            'exactMatch': _TEST_METADATA_VALUE_EMPTY 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        }] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    }], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    'service': alternate_backend_service.url 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 }], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                'service': alternate_backend_service.url 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            }], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                "EmptyCall": alternate_backend_instances, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                "UnaryCall": original_backend_instances 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            })] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    "EmptyCall": alternate_backend_instances, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    "UnaryCall": original_backend_instances 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                }), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            ( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                [{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    'priority': 0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    # Header PrefixMatch -> alternate_backend_service. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    # UnaryCall is sent with the metadata. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    'matchRules': [{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        'prefixMatch': 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            '/', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        'headerMatches': [{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            'headerName': _TEST_METADATA_KEY, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            'prefixMatch': _TEST_METADATA_VALUE_UNARY[:2] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        }] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    }], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    'service': alternate_backend_service.url 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                }], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    "EmptyCall": original_backend_instances, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    "UnaryCall": alternate_backend_instances 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                }), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            ( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                [{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    'priority': 0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    # Header SuffixMatch -> alternate_backend_service. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    # EmptyCall is sent with the metadata. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    'matchRules': [{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        'prefixMatch': 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            '/', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        'headerMatches': [{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            'headerName': _TEST_METADATA_KEY, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            'suffixMatch': _TEST_METADATA_VALUE_EMPTY[-2:] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        }] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    }], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    'service': alternate_backend_service.url 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                }], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    "EmptyCall": alternate_backend_instances, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    "UnaryCall": original_backend_instances 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                }), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            ( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                [{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    'priority': 0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    # Header invert ExactMatch -> alternate_backend_service. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    # EmptyCall is sent with the metadata, so will be sent to original. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    'matchRules': [{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        'prefixMatch': 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            '/', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        'headerMatches': [{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            'headerName': _TEST_METADATA_KEY, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            'exactMatch': _TEST_METADATA_VALUE_EMPTY, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            'invertMatch': True 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        }] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    }], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    'service': alternate_backend_service.url 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                }], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    "EmptyCall": original_backend_instances, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    "UnaryCall": alternate_backend_instances 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                }), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         for (route_rules, expected_instances) in test_cases: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             logger.info('patching url map with %s -> alternative', 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1060,7 +1121,7 @@ def test_header_matching(gcp, original_backend_service, instance_group, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 original_backend_instances + alternate_backend_instances, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 _WAIT_FOR_STATS_SEC) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            retry_count = 10 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            retry_count = 20 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             # Each attempt takes about 10 seconds, 10 retries is equivalent to 100 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             # seconds timeout. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             for i in range(retry_count): 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -2067,8 +2128,11 @@ try: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 rpcs_to_send = '--rpc="UnaryCall"' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             if test_case in _TESTS_TO_SEND_METADATA: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                metadata_to_send = '--metadata="EmptyCall:{key}:{value}"'.format( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    key=_TEST_METADATA_KEY, value=_TEST_METADATA_VALUE) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                metadata_to_send = '--metadata="EmptyCall:{keyE}:{valueE},UnaryCall:{keyU}:{valueU}"'.format( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    keyE=_TEST_METADATA_KEY, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    valueE=_TEST_METADATA_VALUE_EMPTY, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    keyU=_TEST_METADATA_KEY, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    valueU=_TEST_METADATA_VALUE_UNARY) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             else: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 # Setting the arg explicitly to empty with '--metadata=""' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 # makes C# client fail 
			 |