This is an automated email from the ASF dual-hosted git repository.

zwoop pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/trafficserver.git


The following commit(s) were added to refs/heads/master by this push:
     new 274b266ad8 Hrw autest refactor (#12371)
274b266ad8 is described below

commit 274b266ad89fb571b338c674537302b43749de4e
Author: Leif Hedstrom <[email protected]>
AuthorDate: Mon Oct 13 14:01:29 2025 -0600

    Hrw autest refactor (#12371)
    
    * Refactoring and cleanup of HRW autest
    Adds the new Manager for this shindig
    
    * Added a few more tests around recent fixes
---
 tests/autest.sh.in                                 |   2 +-
 tests/gold_tests/lib/ats_autest.py                 | 153 ++++++++++++
 ...{header_rewrite-client.gold => client-url.gold} |   0
 .../pluginTest/header_rewrite/gold/cond-elif.gold  |   2 +-
 ...der_rewrite_cond_cache.gold => cond_cache.gold} |  26 +-
 .../header_rewrite/gold/cond_cache_first.gold      |  15 ++
 ...r_rewrite_cond_method.gold => cond_method.gold} |   0
 ..._ssn_txn_count.gold => cond_ssn_txn_count.gold} |  12 +-
 .../pluginTest/header_rewrite/gold/ext-sets.gold   |   2 +-
 .../header_rewrite/gold/header_rewrite-502.gold    |   5 -
 ...rewrite-l_value.gold => implicit_hook_fie.gold} |   6 +-
 ...rite-l_value.gold => implicit_hook_no_fie.gold} |   5 +-
 ...rite-l_value.gold => implicit_hook_prefix.gold} |   6 +-
 .../{header_rewrite-l_value.gold => l_value.gold}  |   0
 .../header_rewrite/header_rewrite.test.py          |  95 --------
 .../header_rewrite/header_rewrite_bundle.test.py   | 270 +++++++++++++++++++++
 .../header_rewrite_cond_cache.test.py              |  67 -----
 .../header_rewrite_cond_method.test.py             |  73 ------
 .../header_rewrite_cond_ssn_txn_count.test.py      | 101 --------
 .../header_rewrite_effective_address.test.py       |  56 -----
 .../header_rewrite/header_rewrite_l_value.test.py  |  60 -----
 .../header_rewrite/header_rewrite_url.test.py      | 112 ---------
 .../rules/{rule.conf => implicit_hook.conf}        |  21 +-
 .../pluginTest/header_rewrite/rules/rule.conf      |   1 +
 .../header_rewrite/rules/rule_client.conf          |   2 +-
 .../header_rewrite/rules/rule_cond_method.conf     |   2 +-
 .../rules/rule_effective_address.conf              |   3 +-
 .../header_rewrite/rules/rule_l_value.conf         |   2 +
 28 files changed, 484 insertions(+), 615 deletions(-)

diff --git a/tests/autest.sh.in b/tests/autest.sh.in
index 97136bdcc1..51afd8d53a 100755
--- a/tests/autest.sh.in
+++ b/tests/autest.sh.in
@@ -5,7 +5,7 @@
 #
 
 export LD_LIBRARY_PATH=${CMAKE_INSTALL_PREFIX}/lib
-export PYTHONPATH=${CMAKE_CURRENT_SOURCE_DIR}/gold_tests/remap:$PYTHONPATH
+export 
PYTHONPATH=${CMAKE_CURRENT_SOURCE_DIR}/gold_tests/remap:${CMAKE_CURRENT_SOURCE_DIR}/gold_tests/lib:$PYTHONPATH
 
 # Define tests to skip for CURL_UDS_FLAG
 if [ -n "${CURL_UDS_FLAG}" ]; then
diff --git a/tests/gold_tests/lib/ats_autest.py 
b/tests/gold_tests/lib/ats_autest.py
new file mode 100644
index 0000000000..34aa0fca1e
--- /dev/null
+++ b/tests/gold_tests/lib/ats_autest.py
@@ -0,0 +1,153 @@
+'''
+Shared library code for ATS autest tests. Add and update this file as needed.
+'''
+#  Licensed to the Apache Software Foundation (ASF) under one
+#  or more contributor license agreements.  See the NOTICE file
+#  distributed with this work for additional information
+#  regarding copyright ownership.  The ASF licenses this file
+#  to you under the Apache License, Version 2.0 (the
+#  "License"); you may not use this file except in compliance
+#  with the License.  You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+#  Unless required by applicable law or agreed to in writing, software
+#  distributed under the License is distributed on an "AS IS" BASIS,
+#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#  See the License for the specific language governing permissions and
+#  limitations under the License.
+
+import glob
+import os
+import time
+
+
+class ATSTestManager:
+    """
+    A comprehensive test management class for Apache Traffic Server tests.
+    """
+    host_example = "Host: www.example.com"
+    conn_keepalive = "Connection: keep-alive"
+
+    def __init__(self, Test, When, test_name="ts"):
+        """
+        Initialize the ATSTestManager with ATS and origin server processes.
+        """
+        self.Test = Test
+        self.When = When
+        self.ts = self.Test.MakeATSProcess(test_name)
+        self.server = self.Test.MakeOriginServer("server")
+
+        self.ats_port = self.ts.Variables.port
+        self.origin_port = self.server.Variables.Port
+        self.run_dir = self.Test.RunDirectory
+        self.localhost = f"127.0.0.1:{self.ats_port}"
+
+        self.started = False
+
+        # Default response header template
+        self.default_response_header = {
+            "headers": "HTTP/1.1 200 OK\r\nConnection: close\r\n\r\n",
+            "timestamp": "1469733493.993",
+            "body": ""
+        }
+
+    def enable_diagnostics(self, tags="http_hdrs"):
+        """
+        Configure debug logging for the ATS process.
+        """
+        self.ts.Disk.records_config.update(
+            {
+                'proxy.config.diags.debug.enabled': 1,
+                'proxy.config.diags.show_location': 0,
+                'proxy.config.diags.debug.tags': tags,
+            })
+
+    def add_server_responses(self, responses, log_file="sessionfile.log"):
+        """
+        Add responses to the origin server for the given request/response 
pairs.
+        """
+        for req, resp in responses:
+            if resp is None:
+                resp = self.default_response_header
+            self.server.addResponse(log_file, req, resp)
+
+    def add_remap_rules(self, remap_rules, disable_tls=True):
+        """
+        Add remap rules to the ATS configuration.
+
+        This method processes a list of remap rule dictionaries and adds them 
to the
+        remap.config file. Each rule can have associated plugins with 
parameters.
+        """
+        for rule in remap_rules:
+            plugin_args = self._build_plugin_args(rule["plugins"])
+
+            self.ts.Disk.remap_config.AddLine(f'map http://{rule["from"]} 
http://{rule["to"]} {plugin_args}')
+            if not disable_tls:
+                self.ts.Disk.remap_config.AddLine(f'map https://{rule["from"]} 
http://{rule["to"]} {plugin_args}')
+
+    def _build_plugin_args(self, plugins):
+        """
+        Build plugin arguments string from plugins list.
+        """
+        if not plugins:
+            return ""
+
+        return " ".join(f'@plugin={plugin}.so ' + " ".join(f'@pparam={p}' for 
p in params) for plugin, params in plugins)
+
+    def execute_tests(self, test_runs):
+        """
+        Execute all configured test runs.
+        """
+        for test in test_runs:
+            if not 'desc' in test:
+                raise ValueError("Test run must include 'desc' key")
+            tr = self.Test.AddTestRun(test["desc"])
+
+            # Start processes before the first test
+            if not self.started:
+                tr.Processes.Default.StartBefore(self.server, 
ready=self.When.PortOpen(self.origin_port))
+                tr.Processes.Default.StartBefore(self.ts)
+                self.started = True
+
+            if curl := test.get("curl"):
+                tr.MakeCurlCommand(curl, ts=self.ts)
+            elif multi := test.get("multi_curl"):
+                tr.MakeCurlCommandMulti(multi, ts=self.ts)
+
+            if gold := test.get("gold"):
+                tr.Processes.Default.Streams.stderr = gold
+
+            tr.StillRunningAfter = self.server
+
+    def set_traffic_out_content(self, content_file):
+        """
+        Set the traffic.out content file for debugging.
+
+        Args:
+            content_file (str): Path to the content file
+        """
+        self.ts.Disk.traffic_out.Content = content_file
+
+    def copy_files(self, source, pattern, destination_dir=None):
+        """
+        Copy files using either glob pattern matching or explicit file list.
+
+        This method supports two modes:
+        1. Pattern matching: When source is a string directory path, it finds 
all files
+           matching the glob pattern and copies them to the destination.
+        2. Explicit file list: When source is a list of file paths, it copies 
each
+           file directly (pattern parameter is ignored in this case).
+        """
+        if destination_dir is None:
+            destination_dir = self.run_dir
+
+        if isinstance(source, list):
+            for file_path in source:
+                self.ts.Setup.CopyAs(file_path, destination_dir)
+        elif pattern is not None:
+            for file_path in glob.glob(os.path.join(self.Test.TestDirectory, 
source, pattern)):
+                relative_path = os.path.relpath(file_path, 
self.Test.TestDirectory)
+                self.ts.Setup.CopyAs(relative_path, destination_dir)
+        else:
+            raise ValueError("Either 'source' must be a list of files or 
'pattern' must be provided with a source directory.")
diff --git 
a/tests/gold_tests/pluginTest/header_rewrite/gold/header_rewrite-client.gold 
b/tests/gold_tests/pluginTest/header_rewrite/gold/client-url.gold
similarity index 100%
rename from 
tests/gold_tests/pluginTest/header_rewrite/gold/header_rewrite-client.gold
rename to tests/gold_tests/pluginTest/header_rewrite/gold/client-url.gold
diff --git a/tests/gold_tests/pluginTest/header_rewrite/gold/cond-elif.gold 
b/tests/gold_tests/pluginTest/header_rewrite/gold/cond-elif.gold
index 47d536e76a..cb9d993ccf 100644
--- a/tests/gold_tests/pluginTest/header_rewrite/gold/cond-elif.gold
+++ b/tests/gold_tests/pluginTest/header_rewrite/gold/cond-elif.gold
@@ -1,5 +1,5 @@
 ``
-> GET ``/from_path/hrw-sets.png``
+> GET http://www.example.com/from_1/hrw-sets.png``
 > Host: www.example.com``
 > User-Agent: curl/``
 ``
diff --git 
a/tests/gold_tests/pluginTest/header_rewrite/gold/header_rewrite_cond_cache.gold
 b/tests/gold_tests/pluginTest/header_rewrite/gold/cond_cache.gold
similarity index 59%
rename from 
tests/gold_tests/pluginTest/header_rewrite/gold/header_rewrite_cond_cache.gold
rename to tests/gold_tests/pluginTest/header_rewrite/gold/cond_cache.gold
index 34836be3a5..691e868bb4 100644
--- 
a/tests/gold_tests/pluginTest/header_rewrite/gold/header_rewrite_cond_cache.gold
+++ b/tests/gold_tests/pluginTest/header_rewrite/gold/cond_cache.gold
@@ -1,25 +1,11 @@
 ``
-> GET / HTTP/1.1
+> GET /from_5/ HTTP/1.1
 > Host: www.example.com
 > User-Agent: curl/``
 > Accept: */*
 ``
 < HTTP/1.1 200 OK
-< Cache-Control: max-age=10,public
-< Content-Length: 6
-< Date: ``
-< Age: ``
-< Connection: keep-alive
-< Server: ATS/{}
-< Cache-Result: miss
-``
-> GET / HTTP/1.1
-> Host: www.example.com
-> User-Agent: curl/``
-> Accept: */*
-``
-< HTTP/1.1 200 OK
-< Cache-Control: max-age=10,public
+< Cache-Control: max-age=5,public
 < Content-Length: 6
 < Date: ``
 < Age: ``
@@ -27,13 +13,13 @@
 < Server: ATS/{}
 < Cache-Result: hit-fresh
 ``
-> GET / HTTP/1.1
+> GET /from_5/ HTTP/1.1
 > Host: www.example.com
 > User-Agent: curl/``
 > Accept: */*
 ``
 < HTTP/1.1 200 OK
-< Cache-Control: max-age=10,public
+< Cache-Control: max-age=5,public
 < Content-Length: 6
 < Date: ``
 < Age: ``
@@ -41,13 +27,13 @@
 < Server: ATS/{}
 < Cache-Result: hit-stale
 ``
-> GET / HTTP/1.1
+> GET /from_5/ HTTP/1.1
 > Host: www.example.com
 > User-Agent: curl/``
 > Accept: */*
 ``
 < HTTP/1.1 200 OK
-< Cache-Control: max-age=10,public
+< Cache-Control: max-age=5,public
 < Content-Length: 6
 < Date: ``
 < Age: ``
diff --git 
a/tests/gold_tests/pluginTest/header_rewrite/gold/cond_cache_first.gold 
b/tests/gold_tests/pluginTest/header_rewrite/gold/cond_cache_first.gold
new file mode 100644
index 0000000000..d2187d01b3
--- /dev/null
+++ b/tests/gold_tests/pluginTest/header_rewrite/gold/cond_cache_first.gold
@@ -0,0 +1,15 @@
+``
+> GET /from_5/ HTTP/1.1
+> Host: www.example.com
+> User-Agent: curl/``
+> Accept: */*
+``
+< HTTP/1.1 200 OK
+< Cache-Control: max-age=5,public
+< Content-Length: 6
+< Date: ``
+< Age: ``
+< Connection: keep-alive
+< Server: ATS/{}
+< Cache-Result: miss
+``
diff --git 
a/tests/gold_tests/pluginTest/header_rewrite/gold/header_rewrite_cond_method.gold
 b/tests/gold_tests/pluginTest/header_rewrite/gold/cond_method.gold
similarity index 100%
rename from 
tests/gold_tests/pluginTest/header_rewrite/gold/header_rewrite_cond_method.gold
rename to tests/gold_tests/pluginTest/header_rewrite/gold/cond_method.gold
diff --git 
a/tests/gold_tests/pluginTest/header_rewrite/gold/header_rewrite_cond_ssn_txn_count.gold
 b/tests/gold_tests/pluginTest/header_rewrite/gold/cond_ssn_txn_count.gold
similarity index 86%
rename from 
tests/gold_tests/pluginTest/header_rewrite/gold/header_rewrite_cond_ssn_txn_count.gold
rename to 
tests/gold_tests/pluginTest/header_rewrite/gold/cond_ssn_txn_count.gold
index 482d736e13..23997b81cb 100644
--- 
a/tests/gold_tests/pluginTest/header_rewrite/gold/header_rewrite_cond_ssn_txn_count.gold
+++ b/tests/gold_tests/pluginTest/header_rewrite/gold/cond_ssn_txn_count.gold
@@ -1,5 +1,5 @@
 ``
-> GET /hello HTTP/1.1
+> GET /from_4/hello HTTP/1.1
 > Host: www.example.com
 > User-Agent: curl/``
 > Accept: */*
@@ -13,7 +13,7 @@
 < Connection: keep-alive
 < 
 ``
-> GET /hello HTTP/1.1
+> GET /from_4/hello HTTP/1.1
 > Host: www.example.com
 > User-Agent: curl/``
 > Accept: */*
@@ -27,7 +27,7 @@
 < Connection: keep-alive
 < 
 ``
-> GET /hello HTTP/1.1
+> GET /from_4/hello HTTP/1.1
 > Host: www.example.com
 > User-Agent: curl/``
 > Accept: */*
@@ -41,7 +41,7 @@
 < Connection: keep-alive
 < 
 ``
-> GET /hello HTTP/1.1
+> GET /from_4/hello HTTP/1.1
 > Host: www.example.com
 > User-Agent: curl/``
 > Accept: */*
@@ -55,7 +55,7 @@
 < Connection: close
 < 
 ``
-> GET /world HTTP/1.1
+> GET /from_4/world HTTP/1.1
 > Host: www.example.com
 > User-Agent: curl/``
 > Accept: */*
@@ -68,4 +68,4 @@
 < Age: ``
 < Connection: close
 < 
-``
\ No newline at end of file
+``
diff --git a/tests/gold_tests/pluginTest/header_rewrite/gold/ext-sets.gold 
b/tests/gold_tests/pluginTest/header_rewrite/gold/ext-sets.gold
index 24bcc106a6..b307246705 100644
--- a/tests/gold_tests/pluginTest/header_rewrite/gold/ext-sets.gold
+++ b/tests/gold_tests/pluginTest/header_rewrite/gold/ext-sets.gold
@@ -1,5 +1,5 @@
 ``
-> GET ``/from_path/hrw-sets.png``
+> GET http://www.example.com/from_1/hrw-sets.png``
 > Host: www.example.com``
 > User-Agent: curl/``
 ``
diff --git 
a/tests/gold_tests/pluginTest/header_rewrite/gold/header_rewrite-502.gold 
b/tests/gold_tests/pluginTest/header_rewrite/gold/header_rewrite-502.gold
deleted file mode 100644
index 27ca4f0d60..0000000000
--- a/tests/gold_tests/pluginTest/header_rewrite/gold/header_rewrite-502.gold
+++ /dev/null
@@ -1,5 +0,0 @@
-``
-> GET ``503``
-``
-< ``502``
-``
diff --git 
a/tests/gold_tests/pluginTest/header_rewrite/gold/header_rewrite-l_value.gold 
b/tests/gold_tests/pluginTest/header_rewrite/gold/implicit_hook_fie.gold
similarity index 74%
copy from 
tests/gold_tests/pluginTest/header_rewrite/gold/header_rewrite-l_value.gold
copy to tests/gold_tests/pluginTest/header_rewrite/gold/implicit_hook_fie.gold
index 9e2e304abc..523bc694cb 100644
--- 
a/tests/gold_tests/pluginTest/header_rewrite/gold/header_rewrite-l_value.gold
+++ b/tests/gold_tests/pluginTest/header_rewrite/gold/implicit_hook_fie.gold
@@ -3,6 +3,8 @@
 > Host: www.example.com``
 > User-Agent: curl/``
 > Accept: */*
+> Proxy-Connection: Keep-Alive
+> X-Fie: Fie
 ``
 < HTTP/1.1 200 OK
 < Date: ``
@@ -10,7 +12,5 @@
 < Transfer-Encoding: chunked
 < Proxy-Connection: keep-alive
 < Server: ATS/``
-< X-First: First
-< X-Last: Last
-< 
+< X-Response-Foo: Yes
 ``
diff --git 
a/tests/gold_tests/pluginTest/header_rewrite/gold/header_rewrite-l_value.gold 
b/tests/gold_tests/pluginTest/header_rewrite/gold/implicit_hook_no_fie.gold
similarity index 79%
copy from 
tests/gold_tests/pluginTest/header_rewrite/gold/header_rewrite-l_value.gold
copy to 
tests/gold_tests/pluginTest/header_rewrite/gold/implicit_hook_no_fie.gold
index 9e2e304abc..4b3f6bba11 100644
--- 
a/tests/gold_tests/pluginTest/header_rewrite/gold/header_rewrite-l_value.gold
+++ b/tests/gold_tests/pluginTest/header_rewrite/gold/implicit_hook_no_fie.gold
@@ -3,6 +3,7 @@
 > Host: www.example.com``
 > User-Agent: curl/``
 > Accept: */*
+> Proxy-Connection: Keep-Alive
 ``
 < HTTP/1.1 200 OK
 < Date: ``
@@ -10,7 +11,5 @@
 < Transfer-Encoding: chunked
 < Proxy-Connection: keep-alive
 < Server: ATS/``
-< X-First: First
-< X-Last: Last
-< 
+< X-Response-Foo: No
 ``
diff --git 
a/tests/gold_tests/pluginTest/header_rewrite/gold/header_rewrite-l_value.gold 
b/tests/gold_tests/pluginTest/header_rewrite/gold/implicit_hook_prefix.gold
similarity index 71%
copy from 
tests/gold_tests/pluginTest/header_rewrite/gold/header_rewrite-l_value.gold
copy to 
tests/gold_tests/pluginTest/header_rewrite/gold/implicit_hook_prefix.gold
index 9e2e304abc..4f7e6ea588 100644
--- 
a/tests/gold_tests/pluginTest/header_rewrite/gold/header_rewrite-l_value.gold
+++ b/tests/gold_tests/pluginTest/header_rewrite/gold/implicit_hook_prefix.gold
@@ -3,6 +3,8 @@
 > Host: www.example.com``
 > User-Agent: curl/``
 > Accept: */*
+> Proxy-Connection: Keep-Alive
+> X-Client-Foo: fOoBar
 ``
 < HTTP/1.1 200 OK
 < Date: ``
@@ -10,7 +12,5 @@
 < Transfer-Encoding: chunked
 < Proxy-Connection: keep-alive
 < Server: ATS/``
-< X-First: First
-< X-Last: Last
-< 
+< X-Response-Foo: Prefix
 ``
diff --git 
a/tests/gold_tests/pluginTest/header_rewrite/gold/header_rewrite-l_value.gold 
b/tests/gold_tests/pluginTest/header_rewrite/gold/l_value.gold
similarity index 100%
rename from 
tests/gold_tests/pluginTest/header_rewrite/gold/header_rewrite-l_value.gold
rename to tests/gold_tests/pluginTest/header_rewrite/gold/l_value.gold
diff --git a/tests/gold_tests/pluginTest/header_rewrite/header_rewrite.test.py 
b/tests/gold_tests/pluginTest/header_rewrite/header_rewrite.test.py
deleted file mode 100644
index b8c6477ca0..0000000000
--- a/tests/gold_tests/pluginTest/header_rewrite/header_rewrite.test.py
+++ /dev/null
@@ -1,95 +0,0 @@
-'''
-'''
-#  Licensed to the Apache Software Foundation (ASF) under one
-#  or more contributor license agreements.  See the NOTICE file
-#  distributed with this work for additional information
-#  regarding copyright ownership.  The ASF licenses this file
-#  to you under the Apache License, Version 2.0 (the
-#  "License"); you may not use this file except in compliance
-#  with the License.  You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-#  Unless required by applicable law or agreed to in writing, software
-#  distributed under the License is distributed on an "AS IS" BASIS,
-#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#  See the License for the specific language governing permissions and
-#  limitations under the License.
-
-import os
-
-Test.Summary = '''
-Test a basic remap of a http connection
-'''
-
-Test.ContinueOnFail = True
-# Define default ATS
-ts = Test.MakeATSProcess("ts")
-server = Test.MakeOriginServer("server")
-
-Test.testName = ""
-request_header = {"headers": "GET / HTTP/1.1\r\nHost: 
www.example.com\r\n\r\n", "timestamp": "1469733493.993", "body": ""}
-response_header = {"headers": "HTTP/1.1 200 OK\r\nConnection: close\r\n\r\n", 
"timestamp": "1469733493.993", "body": ""}
-server.addResponse("sessionfile.log", request_header, response_header)
-
-request_header = {"headers": "GET /503 HTTP/1.1\r\nHost: 
www.example.com\r\n\r\n", "timestamp": "1469733493.993", "body": ""}
-response_header = {
-    "headers": "HTTP/1.1 503 Service Unavailable\r\nConnection: close\r\n\r\n",
-    "timestamp": "1469733493.993",
-    "body": ""
-}
-server.addResponse("sessionfile.log", request_header, response_header)
-
-ts.Disk.records_config.update(
-    {
-        'proxy.config.diags.debug.enabled': 1,
-        'proxy.config.diags.show_location': 0,
-        'proxy.config.diags.debug.tags': 'header|http',
-    })
-# The following rule changes the status code returned from origin server to 303
-ts.Setup.CopyAs('rules/rule.conf', Test.RunDirectory)
-ts.Disk.plugin_config.AddLine('header_rewrite.so 
{0}/rule.conf'.format(Test.RunDirectory))
-ts.Disk.remap_config.AddLine('map http://www.example.com 
http://127.0.0.1:{0}'.format(server.Variables.Port))
-ts.Disk.remap_config.AddLine('map http://www.example.com:8080 
http://127.0.0.1:{0}'.format(server.Variables.Port))
-
-# Add logging configuration to test the new plugin tag field
-ts.Disk.logging_yaml.AddLines(
-    '''
-logging:
-  formats:
-    - name: plugin_status
-      format: '%<cqhm> %<cqup> %<pssc> %<prscs>'
-  logs:
-    - filename: plugin-status-test
-      format: plugin_status
-'''.split("\n"))
-
-plugin_status_log = os.path.join(ts.Variables.LOGDIR, 'plugin-status-test.log')
-ts.Disk.File(plugin_status_log, exists=True, 
content='gold/plugin-status-test.gold')
-
-# call localhost straight
-tr = Test.AddTestRun("Header Rewrite 200 to 303")
-tr.MakeCurlCommand(
-    '--proxy 127.0.0.1:{0} "http://www.example.com"; -H "Proxy-Connection: 
keep-alive" --verbose'.format(ts.Variables.port), ts=ts)
-tr.Processes.Default.ReturnCode = 0
-tr.Processes.Default.StartBefore(server, 
ready=When.PortOpen(server.Variables.Port))
-tr.Processes.Default.StartBefore(Test.Processes.ts)
-tr.Processes.Default.Streams.stderr = "gold/header_rewrite-303.gold"
-tr.StillRunningAfter = server
-
-tr = Test.AddTestRun("Header Rewrite 503 to 502")
-tr.MakeCurlCommand(
-    '--proxy 127.0.0.1:{0} "http://www.example.com/503"; -H "Proxy-Connection: 
keep-alive" --verbose'.format(ts.Variables.port),
-    ts=ts)
-tr.Processes.Default.ReturnCode = 0
-tr.Processes.Default.Streams.stderr = "gold/header_rewrite-502.gold"
-tr.StillRunningAfter = server
-
-ts.Disk.traffic_out.Content = "gold/header_rewrite-tag.gold"
-
-# Verify the plugin status log file contains the expected plugin tag
-
-# Wait for log file to appear, then wait one extra second to make sure TS is 
done writing it.
-tr = Test.AddTestRun()
-tr.Processes.Default.Command = (os.path.join(Test.Variables.AtsTestToolsDir, 
'condwait') + f' 60 1 -f {plugin_status_log}')
-tr.Processes.Default.ReturnCode = 0
diff --git 
a/tests/gold_tests/pluginTest/header_rewrite/header_rewrite_bundle.test.py 
b/tests/gold_tests/pluginTest/header_rewrite/header_rewrite_bundle.test.py
new file mode 100644
index 0000000000..4e7d0fbd49
--- /dev/null
+++ b/tests/gold_tests/pluginTest/header_rewrite/header_rewrite_bundle.test.py
@@ -0,0 +1,270 @@
+'''
+Test header_rewrite with URL conditions and operators.
+'''
+#  Licensed to the Apache Software Foundation (ASF) under one
+#  or more contributor license agreements.  See the NOTICE file
+#  distributed with this work for additional information
+#  regarding copyright ownership.  The ASF licenses this file
+#  to you under the Apache License, Version 2.0 (the
+#  "License"); you may not use this file except in compliance
+#  with the License.  You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+#  Unless required by applicable law or agreed to in writing, software
+#  distributed under the License is distributed on an "AS IS" BASIS,
+#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#  See the License for the specific language governing permissions and
+#  limitations under the License.
+
+import ats_autest
+
+Test.Summary = '''
+A set of remap rules and tests for header_rewrite.
+'''
+Test.ContinueOnFail = True
+
+# Setup ATS and origin, define some convenience variables
+mgr = ats_autest.ATSTestManager(Test, When)
+
+# Common debug logging config
+mgr.enable_diagnostics(tags="header_rewrite")
+mgr.ts.Disk.records_config.update(
+    {
+        'proxy.config.http.insert_response_via_str': 0,
+        'proxy.config.http.auth_server_session_private': 1,
+        'proxy.config.http.server_session_sharing.pool': 'global',
+        'proxy.config.http.server_session_sharing.match': 'both'
+    })
+
+# mgr.ts.Disk.traffic_out.Content = "gold/header_rewrite-tag.gold"
+
+#############################################################################
+# Setup all the remap rules
+#
+url_base = "www.example.com/from"
+origin_base = f'127.0.0.1:{mgr.origin_port}/to'
+
+remap_rules = [
+    {
+        "from": "no_path.com/",
+        "to": "no_path.com?name=brian/",
+        "plugins": [("header_rewrite", [f"{mgr.run_dir}/set_redirect.conf"])]
+    }, {
+        "from": f"{url_base}_1/",
+        "to": f"{origin_base}_1/",
+        "plugins": [("header_rewrite", [f"{mgr.run_dir}/rule_client.conf"])]
+    }, {
+        "from": f"{url_base}_2/",
+        "to": f"{origin_base}_2/",
+        "plugins": [("header_rewrite", 
[f"{mgr.run_dir}/rule_cond_method.conf"])]
+    }, {
+        "from": f"{url_base}_3/",
+        "to": f"{origin_base}_3/",
+        "plugins": [("header_rewrite", [f"{mgr.run_dir}/rule_l_value.conf"])]
+    }, {
+        "from": f"{url_base}_4/",
+        "to": f"{origin_base}_4/",
+        "plugins": [("header_rewrite", 
[f"{mgr.run_dir}/rule_set_header_after_ssn_txn_count.conf"])]
+    }, {
+        "from": f"{url_base}_5/",
+        "to": f"{origin_base}_5/",
+        "plugins": [("header_rewrite", 
[f"{mgr.run_dir}/rule_add_cache_result_header.conf"])]
+    }, {
+        "from": f"{url_base}_6/",
+        "to": f"{origin_base}_6/",
+        "plugins": [("header_rewrite", 
[f"{mgr.run_dir}/rule_effective_address.conf"])]
+    }, {
+        "from": f"{url_base}_7/",
+        "to": f"{origin_base}_7/",
+        "plugins": [("header_rewrite", [f"{mgr.run_dir}/rule.conf"])]
+    }, {
+        "from": f"{url_base}_8/",
+        "to": f"{origin_base}_8/",
+        "plugins": [("header_rewrite", [f"{mgr.run_dir}/implicit_hook.conf"])]
+    }
+]
+
+mgr.copy_files('rules/', pattern='*.conf')
+mgr.add_remap_rules(remap_rules)
+
+#############################################################################
+# Setup the origin server rquest/response pairs
+#
+def_resp = {"headers": "HTTP/1.1 200 OK\r\nConnection: close\r\n\r\n", 
"timestamp": "1469733493.993", "body": ""}
+origin_rules = [
+    ({
+        "headers": "GET / HTTP/1.1\r\nHost: no_path.com\r\n\r\n",
+        "timestamp": "1469733493.993",
+        "body": "",
+    }, def_resp),
+    (
+        {
+            "headers": "GET /to_1/hello?=foo=bar HTTP/1.1\r\nHost: 
www.example.com\r\n\r\n",
+            "timestamp": "1469733493.993",
+            "body": "",
+        }, def_resp),
+    (
+        {
+            "headers": "GET /to_1/hrw-sets.png HTTP/1.1\r\nHost: 
www.example.com\r\n\r\n",
+            "timestamp": "1469733493.993",
+            "body": ""
+        }, def_resp),
+    ({
+        "headers": "GET /to_2/ HTTP/1.1\r\nHost: www.example.com\r\n\r\n",
+        "timestamp": "1469733493.993",
+        "body": ""
+    }, def_resp),
+    ({
+        "headers": "GET /to_3/ HTTP/1.1\r\nHost: www.example.com\r\n\r\n",
+        "timestamp": "1469733493.993",
+        "body": ""
+    }, def_resp),
+    (
+        {
+            "headers": "GET /to_4/hello HTTP/1.1\r\nHost: 
www.example.com\r\nContent-Length: 0\r\n\r\n",
+            "timestamp": "1469733493.993",
+            "body": ""
+        }, {
+            "headers": "HTTP/1.1 200 OK\r\nServer: microserver\r\n"
+                       "Content-Length: 0\r\n\r\n",
+            "timestamp": "1469733493.993",
+            "body": ""
+        }),
+    (
+        {
+            "headers": "GET /to_4/world HTTP/1.1\r\nContent-Length: 0\r\n"
+                       "Host: www.example.com\r\n\r\n",
+            "timestamp": "1469733493.993",
+            "body": "a\r\na\r\na\r\n\r\n"
+        }, {
+            "headers": "HTTP/1.1 200 OK\r\nServer: microserver\r\n"
+                       "Connection: close\r\nContent-Length: 0\r\n\r\n",
+            "timestamp": "1469733493.993",
+            "body": ""
+        }),
+    (
+        {
+            "headers": "GET /to_5/ HTTP/1.1\r\nHost: www.example.com\r\n\r\n",
+            "timestamp": "1469733493.993",
+            "body": ""
+        }, {
+            "headers": "HTTP/1.1 200 OK\r\nConnection: close\r\nCache-Control: 
max-age=5,public\r\n\r\n",
+            "timestamp": "1469733493.993",
+            "body": "CACHED"
+        }),
+    ({
+        "headers": "GET /to_6/ HTTP/1.1\r\nHost: www.example.com\r\n\r\n",
+        "timestamp": "1469733493.993",
+        "body": ""
+    }, def_resp),
+    ({
+        "headers": "GET /to_7/ HTTP/1.1\r\nHost: www.example.com\r\n\r\n",
+        "timestamp": "1469733493.993",
+        "body": ""
+    }, def_resp),
+    ({
+        "headers": "GET /to_8/ HTTP/1.1\r\nHost: www.example.com\r\n\r\n",
+        "timestamp": "1469733493.993",
+        "body": ""
+    }, def_resp),
+]
+mgr.add_server_responses(origin_rules)
+
+# Create all the test cases
+curl_proxy = f'--proxy {mgr.localhost} --verbose'
+expected_log = "gold/header_rewrite-tag.gold"
+
+test_runs = [
+    {
+        "desc": "Setup cache hit for tests later (cache hit /miss)",
+        "curl": f'-s -v -H "{mgr.host_example}" {mgr.localhost}/from_5/',
+        "gold": "gold/cond_cache_first.gold",
+    },
+    {
+        "desc": "TO-URL redirect test",
+        "curl": f'--head http://{mgr.localhost} -H "Host: no_path.com" 
--verbose',
+        "gold": "gold/set-redirect.gold",
+    },
+    {
+        "desc": "CLIENT-URL test",
+        "curl": f'{curl_proxy} "http://{url_base}_1/hello?=foo=bar";',
+        "gold": "gold/client-url.gold",
+    },
+    {
+        "desc": "sets matching",
+        "curl": f'{curl_proxy} "http://{url_base}_1/hrw-sets.png"; -H 
"X-Testing: foo,bar"',
+        "gold": "gold/ext-sets.gold",
+    },
+    {
+        "desc": "elif condition",
+        "curl": f'{curl_proxy} "http://{url_base}_1/hrw-sets.png"; -H 
"X-Testing: elif"',
+        "gold": "gold/cond-elif.gold",
+    },
+    {
+        "desc": "cond method GET",
+        "curl": f'{curl_proxy} "http://{url_base}_2/";',
+        "gold": "gold/cond_method.gold",
+    },
+    {
+        "desc": "cond method DELETE",
+        "curl": f'--request DELETE {curl_proxy} "http://{url_base}_2/";',
+        "gold": "gold/cond_method.gold",
+    },
+    {
+        "desc": "End [L] #5423",
+        "curl": f'{curl_proxy} "http://{url_base}_3/";',
+        "gold": "gold/l_value.gold",
+    },
+    {
+        "desc": "SSN-TXN-COUNT condition",
+
+        # Force last one with close connection header, this is also reflected 
in the response ^.
+        # if I do not do this, then the microserver will fail to close and 
when shutting down the process will
+        # fail with -9.
+        "multi_curl":
+            (
+                f'{{curl}} -v -H "{mgr.host_example}" -H 
"{mgr.conn_keepalive}" {mgr.localhost}/from_4/hello &&'
+                f'{{curl}} -v -H "{mgr.host_example}" -H 
"{mgr.conn_keepalive}" {mgr.localhost}/from_4/hello &&'
+                f'{{curl}} -v -H "{mgr.host_example}" -H 
"{mgr.conn_keepalive}" {mgr.localhost}/from_4/hello &&'
+                f'{{curl}} -v -H "{mgr.host_example}" -H 
"{mgr.conn_keepalive}" {mgr.localhost}/from_4/hello &&'
+                f'{{curl}} -v -H "{mgr.host_example}" -H "Connection: close" 
{mgr.localhost}/from_4/world'),
+        "gold": "gold/cond_ssn_txn_count.gold"
+    },
+    {
+        "desc": "Cache condition test - miss, hit-fresh, hit-stale, hit-fresh",
+        "multi_curl":
+            (
+                f'{{curl}} -s -v -H "{mgr.host_example}" 
{mgr.localhost}/from_5/ && '
+                f'sleep 8 && {{curl}} -s -v -H "{mgr.host_example}" 
{mgr.localhost}/from_5/ && '
+                f'{{curl}} -s -v -H "{mgr.host_example}" 
{mgr.localhost}/from_5/'),
+        "gold": "gold/cond_cache.gold",
+    },
+    {
+        "desc": "Effective address test",
+        "curl": f'{curl_proxy} "http://{url_base}_6/"; -H "Real-IP: 1.2.3.4"',
+        "gold": "gold/header_rewrite_effective_address.gold",
+    },
+    {
+        "desc": "Status change test (200 to 303)",
+        "curl": f'{curl_proxy} "http://{url_base}_7/";',
+        "gold": "gold/header_rewrite-303.gold",
+    },
+    {
+        "desc": "Implicit hook test - no X-Fie header (expect X-Response-Foo: 
No)",
+        "curl": f'{curl_proxy} "http://{url_base}_8/";',
+        "gold": "gold/implicit_hook_no_fie.gold",
+    },
+    {
+        "desc": "Implicit hook test - X-Fie: Fie (expect X-Response-Foo: Yes)",
+        "curl": f'{curl_proxy} "http://{url_base}_8/"; -H "X-Fie: Fie"',
+        "gold": "gold/implicit_hook_fie.gold",
+    },
+    {
+        "desc": "Implicit hook test - X-Client-Foo: fOoBar (expect 
X-Response-Foo: Prefix)",
+        "curl": f'{curl_proxy} "http://{url_base}_8/"; -H "X-Client-Foo: 
fOoBar"',
+        "gold": "gold/implicit_hook_prefix.gold",
+    },
+]
+
+mgr.execute_tests(test_runs)
diff --git 
a/tests/gold_tests/pluginTest/header_rewrite/header_rewrite_cond_cache.test.py 
b/tests/gold_tests/pluginTest/header_rewrite/header_rewrite_cond_cache.test.py
deleted file mode 100644
index 28d29b3a56..0000000000
--- 
a/tests/gold_tests/pluginTest/header_rewrite/header_rewrite_cond_cache.test.py
+++ /dev/null
@@ -1,67 +0,0 @@
-'''
-Test cache lookup results in CACHE condition
-'''
-#  Licensed to the Apache Software Foundation (ASF) under one
-#  or more contributor license agreements.  See the NOTICE file
-#  distributed with this work for additional information
-#  regarding copyright ownership.  The ASF licenses this file
-#  to you under the Apache License, Version 2.0 (the
-#  "License"); you may not use this file except in compliance
-#  with the License.  You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-#  Unless required by applicable law or agreed to in writing, software
-#  distributed under the License is distributed on an "AS IS" BASIS,
-#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#  See the License for the specific language governing permissions and
-#  limitations under the License.
-Test.ContinueOnFail = True
-ts = Test.MakeATSProcess("ts")
-server = Test.MakeOriginServer("server")
-
-Test.testName = "CACHE"
-
-# Request from client
-request_header = {"headers": "GET / HTTP/1.1\r\nHost: 
www.example.com\r\n\r\n", "timestamp": "1469733493.993", "body": ""}
-# Expected response from the origin server
-response_header = {
-    "headers": "HTTP/1.1 200 OK\r\nConnection: close\r\nCache-Control: 
max-age=10,public\r\n\r\n",
-    "timestamp": "1469733493.993",
-    "body": "CACHED"
-}
-
-# add request/response
-server.addResponse("sessionlog.log", request_header, response_header)
-ts.Disk.records_config.update({
-    'proxy.config.diags.debug.enabled': 1,
-    'proxy.config.diags.debug.tags': 'http',
-})
-
-# This rule adds the cache header with results of the cache lookup results
-# (ie. "hit-fresh", "hit-stale", "miss", "none")
-ts.Setup.CopyAs('rules/rule_add_cache_result_header.conf', Test.RunDirectory)
-
-ts.Disk.plugin_config.AddLine('header_rewrite.so 
{0}/rule_add_cache_result_header.conf'.format(Test.RunDirectory))
-ts.Disk.remap_config.AddLine('map http://www.example.com 
http://127.0.0.1:{0}'.format(server.Variables.Port))
-ts.Disk.remap_config.AddLine('map / 
http://127.0.0.1:{0}'.format(server.Variables.Port))
-
-# Commands to get the following response headers
-# 1. miss (empty cache)
-# 2. hit-fresh (content served within 10s cache)
-# 3. hit-stale (waited 15s, after 10s cache)
-# 2. hit-fresh (content served within 10s cache)
-curlRequest = (
-    '{{curl}} -s -v -H "Host: www.example.com" http://127.0.0.1:{0};'
-    '{{curl}} -v -H "Host: www.example.com" http://127.0.0.1:{0};'
-    'sleep 15; {{curl}} -s -v -H "Host: www.example.com" http://127.0.0.1:{0};'
-    '{{curl}} -s -v -H "Host: www.example.com" http://127.0.0.1:{0}')
-
-# Test Case
-tr = Test.AddTestRun()
-tr.MakeCurlCommandMulti(curlRequest.format(ts.Variables.port), ts=ts)
-tr.Processes.Default.ReturnCode = 0
-tr.Processes.Default.StartBefore(server)
-tr.Processes.Default.StartBefore(ts)
-tr.Processes.Default.Streams.stderr = "gold/header_rewrite_cond_cache.gold"
-tr.StillRunningAfter = server
diff --git 
a/tests/gold_tests/pluginTest/header_rewrite/header_rewrite_cond_method.test.py 
b/tests/gold_tests/pluginTest/header_rewrite/header_rewrite_cond_method.test.py
deleted file mode 100644
index a3e3babce2..0000000000
--- 
a/tests/gold_tests/pluginTest/header_rewrite/header_rewrite_cond_method.test.py
+++ /dev/null
@@ -1,73 +0,0 @@
-'''
-'''
-#  Licensed to the Apache Software Foundation (ASF) under one
-#  or more contributor license agreements.  See the NOTICE file
-#  distributed with this work for additional information
-#  regarding copyright ownership.  The ASF licenses this file
-#  to you under the Apache License, Version 2.0 (the
-#  "License"); you may not use this file except in compliance
-#  with the License.  You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-#  Unless required by applicable law or agreed to in writing, software
-#  distributed under the License is distributed on an "AS IS" BASIS,
-#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#  See the License for the specific language governing permissions and
-#  limitations under the License.
-
-Test.Summary = '''
-Test header_rewrite with METHOD conditions and operators.
-'''
-
-Test.ContinueOnFail = True
-# Define default ATS
-ts = Test.MakeATSProcess("ts")
-server = Test.MakeOriginServer("server")
-
-Test.testName = "header_rewrite_method_condition"
-request_get = {"headers": "GET / HTTP/1.1\r\nHost: www.example.com\r\n\r\n", 
"timestamp": "1469733493.993", "body": ""}
-request_delete = {"headers": "DELETE / HTTP/1.1\r\nHost: 
www.example.com\r\n\r\n", "timestamp": "1469733493.993", "body": ""}
-# expected response from the origin server
-response = {"headers": "HTTP/1.1 200 OK\r\nConnection: close\r\n\r\n", 
"timestamp": "1469733493.993", "body": ""}
-
-# add response to the server dictionary
-session_file = "sessionfile.log"
-server.addResponse(session_file, request_get, response)
-server.addResponse(session_file, request_delete, response)
-ts.Disk.records_config.update(
-    {
-        'proxy.config.diags.debug.enabled': 1,
-        'proxy.config.diags.show_location': 0,
-        'proxy.config.diags.debug.tags': 'header.*',
-        'proxy.config.http.insert_response_via_str': 0,
-    })
-# The following rule inserts a via header if the request method is a GET or 
DELETE
-conf_name = "rule_cond_method.conf"
-ts.Setup.CopyAs('rules/{0}'.format(conf_name), Test.RunDirectory)
-ts.Disk.plugin_config.AddLine('header_rewrite.so 
{0}/{1}'.format(Test.RunDirectory, conf_name))
-ts.Disk.remap_config.AddLine('map http://www.example.com 
http://127.0.0.1:{0}'.format(server.Variables.Port))
-
-# Test method in READ_REQUEST_HDR_HOOK.
-expected_output = "gold/header_rewrite_cond_method.gold"
-expected_log = "gold/header_rewrite-tag.gold"
-tr = Test.AddTestRun()
-tr.MakeCurlCommand(
-    '--proxy 127.0.0.1:{0} "http://www.example.com"; -H "Proxy-Connection: 
keep-alive" --verbose'.format(ts.Variables.port), ts=ts)
-tr.Processes.Default.ReturnCode = 0
-tr.Processes.Default.StartBefore(server, 
ready=When.PortOpen(server.Variables.Port))
-tr.Processes.Default.StartBefore(Test.Processes.ts)
-tr.Processes.Default.Streams.stderr = expected_output
-tr.StillRunningAfter = server
-ts.Disk.traffic_out.Content = expected_log
-
-# Test method in SEND_REQUEST_HDR_HOOK.
-tr = Test.AddTestRun()
-tr.MakeCurlCommand(
-    '--request DELETE --proxy 127.0.0.1:{0} "http://www.example.com"; -H 
"Proxy-Connection: keep-alive" --verbose'.format(
-        ts.Variables.port),
-    ts=ts)
-tr.Processes.Default.ReturnCode = 0
-tr.Processes.Default.Streams.stderr = expected_output
-tr.StillRunningAfter = server
-ts.Disk.traffic_out.Content = expected_log
diff --git 
a/tests/gold_tests/pluginTest/header_rewrite/header_rewrite_cond_ssn_txn_count.test.py
 
b/tests/gold_tests/pluginTest/header_rewrite/header_rewrite_cond_ssn_txn_count.test.py
deleted file mode 100644
index 363ae29796..0000000000
--- 
a/tests/gold_tests/pluginTest/header_rewrite/header_rewrite_cond_ssn_txn_count.test.py
+++ /dev/null
@@ -1,101 +0,0 @@
-'''
-Test adding a close connection header when SSN-TXN-COUNT reach a limit
-'''
-#  Licensed to the Apache Software Foundation (ASF) under one
-#  or more contributor license agreements.  See the NOTICE file
-#  distributed with this work for additional information
-#  regarding copyright ownership.  The ASF licenses this file
-#  to you under the Apache License, Version 2.0 (the
-#  "License"); you may not use this file except in compliance
-#  with the License.  You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-#  Unless required by applicable law or agreed to in writing, software
-#  distributed under the License is distributed on an "AS IS" BASIS,
-#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#  See the License for the specific language governing permissions and
-#  limitations under the License.
-
-ts = Test.MakeATSProcess("ts")
-server = Test.MakeOriginServer("server")
-
-Test.testName = "SSN-TXN-COUNT"
-
-# Test SSN-TXN-COUNT condition.
-request_header_hello = {
-    "headers": "GET /hello HTTP/1.1\r\nHost: 
www.example.com\r\nContent-Length: 0\r\n\r\n",
-    "timestamp": "1469733493.993",
-    "body": ""
-}
-response_header_hello = {
-    "headers": "HTTP/1.1 200 OK\r\nServer: microserver\r\n"
-               "Content-Length: 0\r\n\r\n",
-    "timestamp": "1469733493.993",
-    "body": ""
-}
-
-request_header_world = {
-    "headers": "GET /world HTTP/1.1\r\nContent-Length: 0\r\n"
-               "Host: www.example.com\r\n\r\n",
-    "timestamp": "1469733493.993",
-    "body": "a\r\na\r\na\r\n\r\n"
-}
-response_header_world = {
-    "headers": "HTTP/1.1 200 OK\r\nServer: microserver\r\n"
-               "Connection: close\r\nContent-Length: 0\r\n\r\n",
-    "timestamp": "1469733493.993",
-    "body": ""
-}
-
-# add request/response
-server.addResponse("sessionlog.log", request_header_hello, 
response_header_hello)
-server.addResponse("sessionlog.log", request_header_world, 
response_header_world)
-
-ts.Disk.records_config.update(
-    {
-        'proxy.config.diags.debug.enabled': 1,
-        'proxy.config.diags.debug.tags': 'header.*',
-        'proxy.config.http.auth_server_session_private': 1,
-        'proxy.config.http.server_session_sharing.pool': 'global',
-        'proxy.config.http.server_session_sharing.match': 'both',
-    })
-
-# In case we need this in the future, just remove the comments.
-# ts.Disk.logging_yaml.AddLines(
-#     '''
-# logging:
-#   formats:
-#     - name: long
-#       format: "SSTC:%<sstc>"
-#   logs:
-#     - filename: rewrite.log.txt
-#       format: long
-# '''.split("\n")
-# )
-
-# This rule adds the connection header to close it after the number of 
transactions from a single
-# session is > 2. This test the new SSN-TXN-COUNT condition.
-ts.Setup.CopyAs('rules/rule_set_header_after_ssn_txn_count.conf', 
Test.RunDirectory)
-
-ts.Disk.remap_config.AddLine(
-    'map / http://127.0.0.1:{0} @plugin=header_rewrite.so 
@pparam={1}/rule_set_header_after_ssn_txn_count.conf'.format(
-        server.Variables.Port, Test.RunDirectory))
-
-curlRequest = (
-    '{{curl}} -v -H\'Host: www.example.com\' -H\'Connection: keep-alive\' 
http://127.0.0.1:{0}/hello &&'
-    '{{curl}} -v -H\'Host: www.example.com\' -H\'Connection: keep-alive\' 
http://127.0.0.1:{0}/hello &&'
-    '{{curl}} -v -H\'Host: www.example.com\' -H\'Connection: keep-alive\' 
http://127.0.0.1:{0}/hello &&'
-    '{{curl}} -v -H\'Host: www.example.com\' -H\'Connection: keep-alive\' 
http://127.0.0.1:{0}/hello &&'
-    # I have to force last one with close connection header, this is also 
reflected in the response ^.
-    # if I do not do this, then the microserver will fail to close and when 
shutting down the process will
-    # fail with -9.
-    '{{curl}} -v -H\'Host: www.example.com\' -H\'Connection: close\' 
http://127.0.0.1:{0}/world')
-
-tr = Test.AddTestRun("Add connection close header when ssn-txn-count > 2")
-tr.MakeCurlCommandMulti(curlRequest.format(ts.Variables.port), ts=ts)
-tr.Processes.Default.ReturnCode = 0
-tr.Processes.Default.StartBefore(server)
-tr.Processes.Default.StartBefore(ts)
-tr.Processes.Default.Streams.stderr = 
"gold/header_rewrite_cond_ssn_txn_count.gold"
-tr.StillRunningAfter = server
diff --git 
a/tests/gold_tests/pluginTest/header_rewrite/header_rewrite_effective_address.test.py
 
b/tests/gold_tests/pluginTest/header_rewrite/header_rewrite_effective_address.test.py
deleted file mode 100644
index 47aa54002d..0000000000
--- 
a/tests/gold_tests/pluginTest/header_rewrite/header_rewrite_effective_address.test.py
+++ /dev/null
@@ -1,56 +0,0 @@
-'''
-'''
-#  Licensed to the Apache Software Foundation (ASF) under one
-#  or more contributor license agreements.  See the NOTICE file
-#  distributed with this work for additional information
-#  regarding copyright ownership.  The ASF licenses this file
-#  to you under the Apache License, Version 2.0 (the
-#  "License"); you may not use this file except in compliance
-#  with the License.  You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-#  Unless required by applicable law or agreed to in writing, software
-#  distributed under the License is distributed on an "AS IS" BASIS,
-#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#  See the License for the specific language governing permissions and
-#  limitations under the License.
-
-Test.Summary = '''
-Test header_rewrite set-effective-address operator.
-'''
-
-Test.ContinueOnFail = True
-# Define default ATS
-ts = Test.MakeATSProcess("ts")
-server = Test.MakeOriginServer("server")
-
-Test.testName = "header_rewrite_effective_address"
-request_get = {"headers": "GET / HTTP/1.1\r\nHost: www.example.com\r\n\r\n", 
"timestamp": "1469733493.993", "body": ""}
-# expected response from the origin server
-response = {"headers": "HTTP/1.1 200 OK\r\nConnection: close\r\n\r\n", 
"timestamp": "1469733493.993", "body": ""}
-
-# add response to the server dictionary
-session_file = "sessionfile.log"
-server.addResponse(session_file, request_get, response)
-ts.Disk.records_config.update(
-    {
-        'proxy.config.diags.debug.enabled': 1,
-        'proxy.config.diags.debug.tags': 'header_rewrite|dbg_header_rewrite',
-    })
-# The following rule inserts a via header if the request method is a GET or 
DELETE
-conf_name = "rule_effective_address.conf"
-ts.Setup.CopyAs(f'rules/{conf_name}', Test.RunDirectory)
-ts.Disk.plugin_config.AddLine(f'header_rewrite.so 
{Test.RunDirectory}/{conf_name}')
-ts.Disk.remap_config.AddLine(f'map http://www.example.com 
http://127.0.0.1:{server.Variables.Port}')
-
-# Test that the IP address in Real-IP request header is returned in 
Effective-IP response header.
-expected_output = "gold/header_rewrite_effective_address.gold"
-tr = Test.AddTestRun()
-tr.MakeCurlCommand(
-    f'--http1.1 -H "Host: www.example.com" -H "Real-IP: 1.2.3.4" --verbose 
"http://127.0.0.1:{ts.Variables.port}";', ts=ts)
-tr.Processes.Default.ReturnCode = 0
-tr.Processes.Default.StartBefore(server)
-tr.Processes.Default.StartBefore(Test.Processes.ts)
-tr.Processes.Default.Streams.stderr = expected_output
-tr.StillRunningAfter = server
diff --git 
a/tests/gold_tests/pluginTest/header_rewrite/header_rewrite_l_value.test.py 
b/tests/gold_tests/pluginTest/header_rewrite/header_rewrite_l_value.test.py
deleted file mode 100644
index 5c04f72570..0000000000
--- a/tests/gold_tests/pluginTest/header_rewrite/header_rewrite_l_value.test.py
+++ /dev/null
@@ -1,60 +0,0 @@
-'''
-'''
-#  Licensed to the Apache Software Foundation (ASF) under one
-#  or more contributor license agreements.  See the NOTICE file
-#  distributed with this work for additional information
-#  regarding copyright ownership.  The ASF licenses this file
-#  to you under the Apache License, Version 2.0 (the
-#  "License"); you may not use this file except in compliance
-#  with the License.  You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-#  Unless required by applicable law or agreed to in writing, software
-#  distributed under the License is distributed on an "AS IS" BASIS,
-#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#  See the License for the specific language governing permissions and
-#  limitations under the License.
-
-Test.Summary = '''
-Test for a regression of the issue fixed in
-https://github.com/apache/trafficserver/pull/5423
-Insertion of header rewrite directives in to the output
-'''
-
-Test.ContinueOnFail = True
-# Define default ATS
-ts = Test.MakeATSProcess("ts")
-server = Test.MakeOriginServer("server")
-
-Test.testName = ""
-request_header = {"headers": "GET / HTTP/1.1\r\nHost: 
www.example.com\r\n\r\n", "timestamp": "1469733493.993", "body": ""}
-# expected response from the origin server
-response_header = {"headers": "HTTP/1.1 200 OK\r\nConnection: close\r\n\r\n", 
"timestamp": "1469733493.993", "body": ""}
-
-# add response to the server dictionary
-server.addResponse("sessionfile.log", request_header, response_header)
-ts.Disk.records_config.update(
-    {
-        'proxy.config.diags.debug.enabled': 1,
-        'proxy.config.diags.show_location': 0,
-        'proxy.config.diags.debug.tags': 'header.*',
-    })
-
-# The following rule adds X-First and X-Last headers
-ts.Setup.CopyAs('rules/rule_l_value.conf', Test.RunDirectory)
-
-ts.Disk.plugin_config.AddLine('header_rewrite.so 
{0}/rule_l_value.conf'.format(Test.RunDirectory))
-ts.Disk.remap_config.AddLine('map http://www.example.com 
http://127.0.0.1:{0}'.format(server.Variables.Port))
-ts.Disk.remap_config.AddLine('map http://www.example.com:8080 
http://127.0.0.1:{0}'.format(server.Variables.Port))
-
-# [L] test
-tr = Test.AddTestRun("Header Rewrite End [L]")
-tr.MakeCurlCommand(
-    '--proxy 127.0.0.1:{0} "http://www.example.com"; -H "Proxy-Connection: 
keep-alive" --verbose'.format(ts.Variables.port), ts=ts)
-tr.Processes.Default.ReturnCode = 0
-tr.Processes.Default.StartBefore(server, 
ready=When.PortOpen(server.Variables.Port))
-tr.Processes.Default.StartBefore(Test.Processes.ts)
-tr.Processes.Default.Streams.stderr = "gold/header_rewrite-l_value.gold"
-tr.StillRunningAfter = server
-ts.Disk.traffic_out.Content = "gold/header_rewrite-tag.gold"
diff --git 
a/tests/gold_tests/pluginTest/header_rewrite/header_rewrite_url.test.py 
b/tests/gold_tests/pluginTest/header_rewrite/header_rewrite_url.test.py
deleted file mode 100644
index b4bbf900cb..0000000000
--- a/tests/gold_tests/pluginTest/header_rewrite/header_rewrite_url.test.py
+++ /dev/null
@@ -1,112 +0,0 @@
-'''
-Test header_rewrite with URL conditions and operators.
-'''
-#  Licensed to the Apache Software Foundation (ASF) under one
-#  or more contributor license agreements.  See the NOTICE file
-#  distributed with this work for additional information
-#  regarding copyright ownership.  The ASF licenses this file
-#  to you under the Apache License, Version 2.0 (the
-#  "License"); you may not use this file except in compliance
-#  with the License.  You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-#  Unless required by applicable law or agreed to in writing, software
-#  distributed under the License is distributed on an "AS IS" BASIS,
-#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#  See the License for the specific language governing permissions and
-#  limitations under the License.
-
-Test.Summary = '''
-Test header_rewrite with URL conditions and operators.
-'''
-
-Test.ContinueOnFail = True
-ts = Test.MakeATSProcess("ts")
-server = Test.MakeOriginServer("server")
-
-# Configure the server to return 200 responses. The rewrite rules below set a
-# non-200 status, so if curl gets a 200 response something went wrong.
-Test.testName = ""
-response_header = {"headers": "HTTP/1.1 200 OK\r\nConnection: close\r\n\r\n", 
"timestamp": "1469733493.993", "body": ""}
-request_header = {
-    "headers": "GET /to_path/hello?=foo=bar HTTP/1.1\r\nHost: 
www.example.com\r\n\r\n",
-    "timestamp": "1469733493.993",
-    "body": ""
-}
-server.addResponse("sessionfile.log", request_header, response_header)
-request_header = {
-    "headers": "GET /to_path/hrw-sets.png HTTP/1.1\r\nHost: 
www.example.com\r\n\r\n",
-    "timestamp": "1469733493.993",
-    "body": ""
-}
-server.addResponse("sessionfile.log", request_header, response_header)
-request_header = {"headers": "GET / HTTP/1.1\r\nHost: no_path.com\r\n\r\n", 
"timestamp": "1469733493.993", "body": ""}
-server.addResponse("sessionfile.log", request_header, response_header)
-
-ts.Disk.records_config.update(
-    {
-        'proxy.config.diags.debug.enabled': 1,
-        'proxy.config.diags.show_location': 0,
-        'proxy.config.diags.debug.tags': 'header.*',
-    })
-# The following rule changes the status code returned from origin server to 303
-ts.Setup.CopyAs('rules/rule_client.conf', Test.RunDirectory)
-ts.Setup.CopyAs('rules/set_redirect.conf', Test.RunDirectory)
-
-# This configuration makes use of CLIENT-URL in conditions.
-ts.Disk.remap_config.AddLine(
-    'map http://www.example.com/from_path/ http://127.0.0.1:{0}/to_path/ '
-    '@plugin=header_rewrite.so 
@pparam={1}/rule_client.conf'.format(server.Variables.Port, Test.RunDirectory))
-ts.Disk.remap_config.AddLine(
-    'map http://www.example.com:8080/from_path/ http://127.0.0.1:{0}/to_path/ '
-    '@plugin=header_rewrite.so 
@pparam={1}/rule_client.conf'.format(server.Variables.Port, Test.RunDirectory))
-# This configuration makes use of TO-URL in a set-redirect operator.
-ts.Disk.remap_config.AddLine(
-    'map http://no_path.com http://no_path.com?name=brian/ '
-    '@plugin=header_rewrite.so 
@pparam={0}/set_redirect.conf'.format(Test.RunDirectory))
-
-# Test CLIENT-URL.
-tr = Test.AddTestRun()
-tr.MakeCurlCommand(
-    '--proxy 127.0.0.1:{0} "http://www.example.com/from_path/hello?=foo=bar"; '
-    '-H "Proxy-Connection: keep-alive" --verbose'.format(ts.Variables.port),
-    ts=ts)
-tr.Processes.Default.ReturnCode = 0
-tr.Processes.Default.StartBefore(server, 
ready=When.PortOpen(server.Variables.Port))
-tr.Processes.Default.StartBefore(Test.Processes.ts)
-tr.Processes.Default.Streams.stderr = "gold/header_rewrite-client.gold"
-tr.StillRunningAfter = server
-ts.Disk.traffic_out.Content = "gold/header_rewrite-tag.gold"
-
-# Test TO-URL in a set-redirect operator.
-tr = Test.AddTestRun()
-tr.MakeCurlCommand('--head 127.0.0.1:{0} -H "Host: no_path.com" 
--verbose'.format(ts.Variables.port), ts=ts)
-tr.Processes.Default.ReturnCode = 0
-tr.Processes.Default.Streams.stderr = "gold/set-redirect.gold"
-tr.StillRunningAfter = server
-ts.Disk.traffic_out.Content = "gold/header_rewrite-tag.gold"
-
-# Test HRW sets matching
-tr = Test.AddTestRun()
-tr.MakeCurlCommand(
-    '--proxy 127.0.0.1:{0} "http://www.example.com/from_path/hrw-sets.png"; '
-    '-H "Proxy-Connection: keep-alive" -H "X-Testing: foo,bar" '
-    '--verbose'.format(ts.Variables.port),
-    ts=ts)
-tr.Processes.Default.ReturnCode = 0
-tr.Processes.Default.Streams.stderr = "gold/ext-sets.gold"
-tr.StillRunningAfter = server
-ts.Disk.traffic_out.Content = "gold/header_rewrite-tag.gold"
-
-# Test HRW elif
-tr = Test.AddTestRun()
-tr.MakeCurlCommand(
-    '--proxy 127.0.0.1:{0} "http://www.example.com/from_path/hrw-sets.png"; '
-    '-H "Proxy-Connection: keep-alive" -H "X-Testing: elif" '
-    '--verbose'.format(ts.Variables.port),
-    ts=ts)
-tr.Processes.Default.ReturnCode = 0
-tr.Processes.Default.Streams.stderr = "gold/cond-elif.gold"
-tr.StillRunningAfter = server
-ts.Disk.traffic_out.Content = "gold/header_rewrite-tag.gold"
diff --git a/tests/gold_tests/pluginTest/header_rewrite/rules/rule.conf 
b/tests/gold_tests/pluginTest/header_rewrite/rules/implicit_hook.conf
similarity index 56%
copy from tests/gold_tests/pluginTest/header_rewrite/rules/rule.conf
copy to tests/gold_tests/pluginTest/header_rewrite/rules/implicit_hook.conf
index 982ef6a4fa..0f909f1046 100644
--- a/tests/gold_tests/pluginTest/header_rewrite/rules/rule.conf
+++ b/tests/gold_tests/pluginTest/header_rewrite/rules/implicit_hook.conf
@@ -15,9 +15,22 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-cond %{STATUS} =200
-  set-status 303
+cond %{SEND_RESPONSE_HDR_HOOK} [AND]
+cond %{CLIENT-HEADER:X-Client-Foo} ="foo" [NOCASE,PRE]
+  set-header X-Response-Foo "Prefix"
 elif
-  cond %{STATUS} =503
-    set-status 502
+  cond %{CLIENT-HEADER:X-Client-Foo} ="bar"
+    set-header X-Response-Foo "Never"
+elif
+  cond %{CLIENT-HEADER:X-Client-Foo} ="" [NOT]
+    set-header X-Response-Foo "Yes"
+else
+  set-header X-Response-Foo "No"
 
+# ToDo: This should use the implicit hook of %{REMAP_PSEUDO_HOOK}, needs #12557
+cond %{REMAP_PSEUDO_HOOK} [AND]
+cond %{CLIENT-HEADER:X-Fie} ="fie" [NOCASE]
+  add-header X-Client-Foo "Yes"
+elif
+  cond %{CLIENT-HEADER:X-Fie} ="nope"
+    add-header X-client-Foo "Yes"
diff --git a/tests/gold_tests/pluginTest/header_rewrite/rules/rule.conf 
b/tests/gold_tests/pluginTest/header_rewrite/rules/rule.conf
index 982ef6a4fa..3a472618f9 100644
--- a/tests/gold_tests/pluginTest/header_rewrite/rules/rule.conf
+++ b/tests/gold_tests/pluginTest/header_rewrite/rules/rule.conf
@@ -15,6 +15,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
+cond %{READ_RESPONSE_HDR_HOOK} [AND]
 cond %{STATUS} =200
   set-status 303
 elif
diff --git a/tests/gold_tests/pluginTest/header_rewrite/rules/rule_client.conf 
b/tests/gold_tests/pluginTest/header_rewrite/rules/rule_client.conf
index 6d38d81059..e298a8bed1 100644
--- a/tests/gold_tests/pluginTest/header_rewrite/rules/rule_client.conf
+++ b/tests/gold_tests/pluginTest/header_rewrite/rules/rule_client.conf
@@ -15,7 +15,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-cond %{CLIENT-URL:PATH} /^from_path/
+cond %{CLIENT-URL:PATH} /^from_1\//
 cond %{CLIENT-URL:SCHEME} =http
 cond %{CLIENT-URL:HOST} =www.example.com
 cond %{CLIENT-URL:QUERY} /foo=bar/
diff --git 
a/tests/gold_tests/pluginTest/header_rewrite/rules/rule_cond_method.conf 
b/tests/gold_tests/pluginTest/header_rewrite/rules/rule_cond_method.conf
index 0b600f4560..a244509bd0 100644
--- a/tests/gold_tests/pluginTest/header_rewrite/rules/rule_cond_method.conf
+++ b/tests/gold_tests/pluginTest/header_rewrite/rules/rule_cond_method.conf
@@ -15,7 +15,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-cond %{READ_REQUEST_HDR_HOOK}
+cond %{REMAP_PSEUDO_HOOK}
 cond %{METHOD} (GET,PUSH)
 set-config proxy.config.http.insert_response_via_str 1 [L]
 
diff --git 
a/tests/gold_tests/pluginTest/header_rewrite/rules/rule_effective_address.conf 
b/tests/gold_tests/pluginTest/header_rewrite/rules/rule_effective_address.conf
index 143a2c3b43..f7c84b18a5 100644
--- 
a/tests/gold_tests/pluginTest/header_rewrite/rules/rule_effective_address.conf
+++ 
b/tests/gold_tests/pluginTest/header_rewrite/rules/rule_effective_address.conf
@@ -15,9 +15,8 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-cond %{READ_REQUEST_HDR_HOOK}
+cond %{REMAP_PSEUDO_HOOK}
   set-effective-address %{HEADER:Real-IP}
 
 cond %{SEND_RESPONSE_HDR_HOOK}
   set-header Effective-IP %{INBOUND:REMOTE-ADDR}
-
diff --git a/tests/gold_tests/pluginTest/header_rewrite/rules/rule_l_value.conf 
b/tests/gold_tests/pluginTest/header_rewrite/rules/rule_l_value.conf
index e80a8e4f7f..82e530a777 100644
--- a/tests/gold_tests/pluginTest/header_rewrite/rules/rule_l_value.conf
+++ b/tests/gold_tests/pluginTest/header_rewrite/rules/rule_l_value.conf
@@ -19,3 +19,5 @@ cond %{SEND_RESPONSE_HDR_HOOK}
  set-header X-First "First"
  set-header X-Last "Last" [L]
 
+cond %{SEND_RESPONSE_HDR_HOOK}
+ set-header X-Not-Here "Stop"

Reply via email to