brbzull0 opened a new issue, #13617:
URL: https://github.com/apache/trafficserver/issues/13617

   ### Impact
   
   Test-only defect, no production impact. Introduced by #13146, now on 
`master`.
   
   Test G of `config_reload_plugin_api.test.py` is the only test asserting that 
a **core**
   reload task does not carry the `[plugin: <name>]` attribution tag that
   `traffic_ctl config status` adds for plugin-owned tasks. 
`ExcludesExpression` compiles its
   first argument as a regex, and the unescaped brackets in `'ip_allow 
[plugin]'` make it a
   character class rather than a literal. The pattern cannot match the 
command's output in
   the correct case *or* in the regressed case, so the assertion passes 
unconditionally.
   
   If core reload tasks ever started being reported as plugin-owned, this test 
would still go
   green and the regression would ship undetected. Nothing else covers that 
behaviour.
   
   ```
   Version:  master @ 83335d4eff9694061409d889c73627a847f46d24
   Platform: test-only; not platform specific
   Config:   none
   ```
   
   ### Proof
   
   `ExcludesExpression` compiles its first argument as a regex and applies 
`re.search` per
   line, and `IncludesExpression` is an alias of `ContainsExpression`, so all 
three matchers
   behave this way:
   
   ```python
   # autest/testers/__init__.py:16
   from .contains_expression import ContainsExpression as IncludesExpression
   # autest/testers/excludes_expression.py:38-42
   if isinstance(regexp, str):
       regexp = re.compile(regexp, reflags)
   ```
   
   The assertion, at
   
https://github.com/apache/trafficserver/blob/83335d4eff9694061409d889c73627a847f46d24/tests/gold_tests/jsonrpc/config_reload_plugin_api.test.py#L271-L272
   
   ```python
   tr.Processes.Default.Streams.stdout = Testers.ExcludesExpression(
       'ip_allow [plugin]', 'Core task ip_allow must not have [plugin] tag')
   ```
   
   `[plugin]` is a character class matching one of `p l u g i n`, so the 
pattern is
   `ip_allow ` followed by one of those six characters. The tag it is meant to 
detect is
   built at
   
https://github.com/apache/trafficserver/blob/83335d4eff9694061409d889c73627a847f46d24/src/traffic_ctl/CtrlPrinters.cc#L345-L350
   
   ```cpp
     // Build label and right-aligned duration
     std::string label = std::string(status_icon(f.status)) + " " + fname;
     if (!f.meta.plugin_name.empty()) {
       label += " [plugin: " + f.meta.plugin_name + "]";
     }
   ```
   
   so the character following `ip_allow ` is `[`, which is not in the class. 
Found by
   inspection, then confirmed by running the exact pattern the test passes:
   
   ```python
   import re
   pat = re.compile('ip_allow [plugin]')   # exactly what the test passes
   good = "  * ip_allow ................  12ms"          # core task, no tag
   bad  = "  * ip_allow [plugin: my_plugin] ....  12ms"  # the regression it 
guards
   for line in (good, bad):
       print(bool(pat.search(line)))
   ```
   
   Observed:
   
   ```
   core task      (want: no match)   search=False   ExcludesExpression -> PASS
   wrongly tagged (want: MATCH)      search=False   ExcludesExpression -> PASS
   ```
   
   Expected, the second case must fail. With `r'ip_allow.*\[plugin:'`:
   
   ```
   core task      (want: no match)   search=False   ExcludesExpression -> PASS
   wrongly tagged (want: MATCH)      search=True    ExcludesExpression -> FAIL
   ```
   
   The two positive assertions in the same file are already written correctly as
   `r'\[plugin: '` (lines 130 and 167); this negative one was missed.
   
   A sweep of all 502 files under `tests/gold_tests` on `master` found 12 other 
bracketed
   matchers, all of them the intentional `[Uu]sing HTTP/?2` in the `h2` tests. 
This is the
   only instance of the defect.
   
   ### Proposed change
   
   ```diff
   --- a/tests/gold_tests/jsonrpc/config_reload_plugin_api.test.py
   +++ b/tests/gold_tests/jsonrpc/config_reload_plugin_api.test.py
   @@ -268,8 +268,8 @@
    tr.Processes.Default.Env = ts.Env
    tr.Processes.Default.ReturnCode = 0
   -tr.Processes.Default.Streams.stdout = Testers.ExcludesExpression(
   -    'ip_allow [plugin]', 'Core task ip_allow must not have [plugin] tag')
   +tr.Processes.Default.Streams.stdout = Testers.ExcludesExpression(
   +    r'ip_allow.*\[plugin:', 'Core task ip_allow must not have a [plugin: 
<name>] tag')
    tr.StillRunningAfter = ts
   ```
   
   `.*` rather than a literal space, because the label goes through 
`sanitize_label()` and a
   dot fill sits between the task name and the duration, so the tag is not 
adjacent to the
   name at every column width. Matching the `[plugin:` prefix rather than a full
   `[plugin: <name>]` keeps the assertion independent of the plugin name.
   
   No production code changes, no compatibility impact, nothing to backport 
beyond wherever
   #13146 lands.
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to