Better perfetto probe preset documentation and help

- Add basic help text to config/probe/perfetto/trace_config/*.txtpb
  files
- ./cb.py describe perfetto now prints the trace config preset help

Change-Id: I7384c92fe3b1e5cf9f36824e7c3dbecf0d779dfb
Reviewed-on: https://chromium-review.googlesource.com/c/crossbench/+/7703920
Commit-Queue: Patrick Thier <pthier@chromium.org>
Auto-Submit: Camillo Bruni <cbruni@chromium.org>
Reviewed-by: Patrick Thier <pthier@chromium.org>
diff --git a/config/probe/perfetto/trace_config/default.txtpb b/config/probe/perfetto/trace_config/default.txtpb
index 9051445..55054ca 100644
--- a/config/probe/perfetto/trace_config/default.txtpb
+++ b/config/probe/perfetto/trace_config/default.txtpb
@@ -1,3 +1,4 @@
+# Default perfetto configuration for Chromium.
 buffers: {
     size_kb: 524288
     fill_policy: DISCARD
diff --git a/config/probe/perfetto/trace_config/gma_webview.txtpb b/config/probe/perfetto/trace_config/gma_webview.txtpb
index 2259e5c..bbbfbe6 100644
--- a/config/probe/perfetto/trace_config/gma_webview.txtpb
+++ b/config/probe/perfetto/trace_config/gma_webview.txtpb
@@ -1,3 +1,4 @@
+# Perfetto configuration for GMA Webview.
 buffers {
   size_kb: 524288
   fill_policy: RING_BUFFER
diff --git a/config/probe/perfetto/trace_config/v8-profiling.txtpb b/config/probe/perfetto/trace_config/v8-profiling.txtpb
index 4c32b5a..9fd9edb 100644
--- a/config/probe/perfetto/trace_config/v8-profiling.txtpb
+++ b/config/probe/perfetto/trace_config/v8-profiling.txtpb
@@ -1,3 +1,4 @@
+# Perfetto configuration for V8 profiling.
 buffers {
   size_kb: 524288
   fill_policy: DISCARD
diff --git a/config/probe/perfetto/trace_config/v8.txtpb b/config/probe/perfetto/trace_config/v8.txtpb
index fe3400c..b78c66d 100644
--- a/config/probe/perfetto/trace_config/v8.txtpb
+++ b/config/probe/perfetto/trace_config/v8.txtpb
@@ -1,3 +1,4 @@
+# Perfetto configuration for V8.
 buffers {
   size_kb: 524288
   fill_policy: DISCARD
diff --git a/config/probe/perfetto/trace_config/v8_gc.txtpb b/config/probe/perfetto/trace_config/v8_gc.txtpb
index 05f430d..d53b539 100644
--- a/config/probe/perfetto/trace_config/v8_gc.txtpb
+++ b/config/probe/perfetto/trace_config/v8_gc.txtpb
@@ -1,3 +1,4 @@
+# Perfetto configuration for V8 garbage collection.
 buffers {
   size_kb: 524288
   fill_policy: DISCARD
diff --git a/crossbench/probes/cb_perfetto/perfetto.py b/crossbench/probes/cb_perfetto/perfetto.py
index b4396ed..e89a206 100644
--- a/crossbench/probes/cb_perfetto/perfetto.py
+++ b/crossbench/probes/cb_perfetto/perfetto.py
@@ -113,9 +113,29 @@
   @override
   def help_text_items(cls) -> list[tuple[str, str]]:
     help_items = super().help_text_items()
-    help_items.append(("presets", ",".join(cls.presets().keys())))
+    preset_help: list[str] = []
+    for name, path in cls.presets().items():
+      help_str = cls._trace_config_help(name, path)
+      preset_help.append(help_str)
+    help_items.append(("trace_config presets", "\n".join(preset_help)))
     return help_items
 
+  @classmethod
+  def _trace_config_help(cls, name: str, path: pth.LocalPath) -> str:
+    comments: list[str] = []
+    with path.open(encoding="utf-8") as f:
+      for line in f:
+        line = line.strip()
+        if not line:
+          continue
+        if not line.startswith("#"):
+          break
+        comments.append(line[1:].strip())
+    if comments:
+      description = " ".join(comments)
+      return f"{name}\n  {description}\n"
+    return f"{name}\n"
+
 
 def has_v8_code_data_source(trace_config: trace_config_pb2.TraceConfig) -> bool:
   return has_data_source(trace_config, "dev.v8.code")
@@ -149,6 +169,13 @@
 
   @classmethod
   @override
+  def help_text_items(cls) -> list[tuple[str, str]]:
+    items = super().help_text_items()
+    items.extend(TraceConfig.help_text_items())
+    return items
+
+  @classmethod
+  @override
   def config_parser(cls) -> ProbeConfigParser[Self]:
     parser = super().config_parser()
     parser.add_default_argument(
diff --git a/tests/crossbench/base.py b/tests/crossbench/base.py
index 73b8852..3da74c2 100644
--- a/tests/crossbench/base.py
+++ b/tests/crossbench/base.py
@@ -34,6 +34,7 @@
 from crossbench.cli.config.network import NetworkConfig
 from crossbench.cli.config.secrets import Secrets
 from crossbench.cli.subcommand.benchmark import BenchmarkSubcommand
+from crossbench.config import config_dir
 from crossbench.probes.cb_perfetto.perfetto import TraceConfig
 from crossbench.runner.runner import Runner
 from tests.crossbench import mock_browser
@@ -135,6 +136,7 @@
 
   def setup_perfetto_config_presets(self):
     self.setup_config_dir(TraceConfig.preset_dir())
+    self.setup_config_dir(config_dir() / "doc/probe")
 
   def setup_config_dir(self, config_dir):
     self.fs.add_real_directory(config_dir, lazy_read=True)
diff --git a/tests/crossbench/probes/test_perfetto.py b/tests/crossbench/probes/test_perfetto.py
index d250fe4..3addccd 100644
--- a/tests/crossbench/probes/test_perfetto.py
+++ b/tests/crossbench/probes/test_perfetto.py
@@ -299,8 +299,8 @@
     dummy_preset = TraceConfig.preset_dir() / "dummy_preset.txtpb"
     self.fs.create_file(dummy_preset)
     help_items = TraceConfig.help_text_items()
-    self.assertTrue(any(k == "presets" for k, v in help_items))
-    presets_str = dict(help_items)["presets"]
+    self.assertTrue(any(k == "trace_config presets" for k, v in help_items))
+    presets_str = dict(help_items)["trace_config presets"]
     self.assertIn("dummy_preset", presets_str)
 
   def test_create_context_desktop(self):
diff --git a/tests/crossbench/probes/test_probe.py b/tests/crossbench/probes/test_probe.py
index ff3b7c4..9f50abf 100644
--- a/tests/crossbench/probes/test_probe.py
+++ b/tests/crossbench/probes/test_probe.py
@@ -10,7 +10,7 @@
 from crossbench.probes.all import CONFIGURABLE_INTERNAL_PROBES, \
     DEFAULT_INTERNAL_PROBES, GENERAL_PURPOSE_PROBES, INTERNAL_PROBES, \
     NON_CONFIGURABLE_INTERNAL_PROBES, OPTIONAL_INTERNAL_PROBES
-from crossbench.probes.cb_perfetto.perfetto import PerfettoProbe
+from crossbench.probes.cb_perfetto.perfetto import PerfettoProbe, TraceConfig
 from crossbench.probes.cb_perfetto.tracing import TracingProbe
 from crossbench.probes.chrome_histograms import ChromeHistogramsProbe
 from crossbench.probes.chromium_pgo import ChromiumPgoProbe
@@ -154,10 +154,11 @@
             set(OPTIONAL_INTERNAL_PROBES)))
 
   def test_help(self):
+    TraceConfig.presets.cache_clear()
     self.setup_perfetto_config_presets()
     for probe_cls in self.probe_classes():
       help_text = probe_cls.help_text()
-      self.assertTrue(help)
+      self.assertTrue(help_text)
       summary = probe_cls.summary_text()
       self.assertTrue(summary)
       self.assertIn(summary, help_text)