a7dc917021
ISSUES CLOSED: #319
88 lines
2.6 KiB
Python
88 lines
2.6 KiB
Python
"""ASV benchmarks for secure template rendering.
|
|
|
|
Measures the overhead introduced by security checks in the
|
|
template rendering pipeline.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from cleveragents.templates.secure_renderer import (
|
|
SecureTemplateRenderer,
|
|
TemplateConfig,
|
|
render_template_secure,
|
|
validate_template,
|
|
)
|
|
|
|
|
|
class RenderBench:
|
|
"""Benchmark secure template rendering throughput."""
|
|
|
|
timeout = 60
|
|
|
|
def setup(self) -> None:
|
|
self.renderer = SecureTemplateRenderer(
|
|
config=TemplateConfig(
|
|
allowed_keys=frozenset({"name", "role", "project"}),
|
|
),
|
|
)
|
|
self.template = "Hello {name}, you are {role} on {project}"
|
|
self.context = {
|
|
"name": "Alice",
|
|
"role": "developer",
|
|
"project": "cleveragents",
|
|
}
|
|
|
|
def time_render_simple(self) -> None:
|
|
"""Benchmark rendering a simple template."""
|
|
self.renderer.render(self.template, self.context)
|
|
|
|
def time_render_no_placeholders(self) -> None:
|
|
"""Benchmark rendering template with no placeholders."""
|
|
self.renderer.render("Static text with no vars", {})
|
|
|
|
def time_render_many_placeholders(self) -> None:
|
|
"""Benchmark rendering template with many placeholders."""
|
|
tpl = " ".join(f"{{k{i}}}" for i in range(50))
|
|
ctx = {f"k{i}": f"v{i}" for i in range(50)}
|
|
renderer = SecureTemplateRenderer(config=TemplateConfig())
|
|
renderer.render(tpl, ctx)
|
|
|
|
|
|
class ValidateBench:
|
|
"""Benchmark template validation throughput."""
|
|
|
|
timeout = 60
|
|
|
|
def setup(self) -> None:
|
|
self.safe_template = "Hello {name}, role={role}"
|
|
self.unsafe_template = "{obj.__class__.__init__.__globals__}"
|
|
|
|
def time_validate_safe(self) -> None:
|
|
"""Benchmark validating a safe template."""
|
|
validate_template(self.safe_template)
|
|
|
|
def time_validate_unsafe(self) -> None:
|
|
"""Benchmark validating an unsafe template."""
|
|
validate_template(self.unsafe_template)
|
|
|
|
def time_validate_with_allowlist(self) -> None:
|
|
"""Benchmark validating with an allowlist."""
|
|
validate_template(
|
|
self.safe_template,
|
|
allowed_keys=frozenset({"name", "role"}),
|
|
)
|
|
|
|
|
|
class ConvenienceFunctionBench:
|
|
"""Benchmark the convenience render_template_secure function."""
|
|
|
|
timeout = 60
|
|
|
|
def time_convenience_render(self) -> None:
|
|
"""Benchmark the convenience function."""
|
|
render_template_secure(
|
|
"Hello {name}",
|
|
{"name": "World"},
|
|
allowed_keys=frozenset({"name"}),
|
|
)
|