57 lines
1.8 KiB
Python
57 lines
1.8 KiB
Python
|
|
"""Tests for script execution MySQL persist compaction."""
|
||
|
|
|
||
|
|
import json
|
||
|
|
|
||
|
|
from server.infrastructure.redis.script_execution_store import (
|
||
|
|
MYSQL_RESULTS_SOFT_LIMIT_BYTES,
|
||
|
|
PERSIST_STDIO_MAX_CHARS,
|
||
|
|
compact_results_for_mysql_persist,
|
||
|
|
pack_mysql_results_blob,
|
||
|
|
)
|
||
|
|
|
||
|
|
|
||
|
|
def test_compact_truncates_long_stdio():
|
||
|
|
results = {
|
||
|
|
"1": {
|
||
|
|
"status": "success",
|
||
|
|
"exit_code": 0,
|
||
|
|
"stdout": "x" * 2000,
|
||
|
|
"stderr": "y" * 100,
|
||
|
|
},
|
||
|
|
}
|
||
|
|
compact = compact_results_for_mysql_persist(results)
|
||
|
|
assert len(compact["1"]["stdout"]) <= PERSIST_STDIO_MAX_CHARS
|
||
|
|
assert compact["1"]["stdout_truncated"] is True
|
||
|
|
assert compact["1"]["stderr"] == "y" * 100
|
||
|
|
|
||
|
|
|
||
|
|
def test_pack_mysql_fits_large_batch_like_production():
|
||
|
|
"""366 servers with mysql warning stderr — must fit under old TEXT limit after compact."""
|
||
|
|
results = {
|
||
|
|
str(i): {
|
||
|
|
"status": "success" if i <= 256 else "failed",
|
||
|
|
"exit_code": 0 if i <= 256 else 1,
|
||
|
|
"stdout": "",
|
||
|
|
"stderr": "mysql: [Warning] Using a password on the command line interface can be insecure.\n",
|
||
|
|
}
|
||
|
|
for i in range(1, 367)
|
||
|
|
}
|
||
|
|
blob = pack_mysql_results_blob(results, [{"action": "execution_finished", "detail": "ok"}])
|
||
|
|
assert len(blob.encode("utf-8")) < 65535
|
||
|
|
|
||
|
|
|
||
|
|
def test_pack_mysql_under_soft_limit_for_huge_output():
|
||
|
|
results = {
|
||
|
|
str(i): {
|
||
|
|
"status": "failed",
|
||
|
|
"exit_code": 1,
|
||
|
|
"stdout": "line\n" * 500,
|
||
|
|
"stderr": "err\n" * 500,
|
||
|
|
}
|
||
|
|
for i in range(1, 401)
|
||
|
|
}
|
||
|
|
blob = pack_mysql_results_blob(results, [])
|
||
|
|
assert len(blob.encode("utf-8")) <= MYSQL_RESULTS_SOFT_LIMIT_BYTES
|
||
|
|
data = json.loads(blob)
|
||
|
|
assert data["1"].get("persist_summary_only") or data["1"].get("stdout_truncated")
|