Restructure the agent and tray binary blocks around an auto-detected current-release upload plus a separate legacy/rollback upload that stages a version without seizing current. Order staged versions by version number for the active-version dropdown, add a PE version detect route, and drop stale dev-status tags and manual-staging copy.
58 lines
2.2 KiB
Python
58 lines
2.2 KiB
Python
"""Unit tests for the versioned agent binary store helpers.
|
|
|
|
Covers the pure, context-free helpers: version validation, PE magic and PE
|
|
file-version parsing. The staging/retention paths that touch the Flask instance
|
|
directory are exercised through the API tests; here we keep to the logic that
|
|
needs no app context.
|
|
|
|
The PE version parser walks the resource directory to the outer image's
|
|
RT_VERSION resource (not the first VS_FIXEDFILEINFO signature in the bytes),
|
|
because a self-contained single-file .NET exe bundles many framework assemblies
|
|
that each carry their own version block. Building a full PE with a resource
|
|
directory inline is impractical here, so the parser's correctness is verified
|
|
against real agent binaries in the API/integration layer; these unit tests pin
|
|
the surrounding validators and the malformed-input contract (never raises,
|
|
returns None).
|
|
"""
|
|
|
|
from plugins.endpoints.api import agentstore
|
|
|
|
|
|
def test_is_valid_version_accepts_dotted_numeric():
|
|
assert agentstore.is_valid_version('1')
|
|
assert agentstore.is_valid_version('1.6.3')
|
|
assert agentstore.is_valid_version('1.6.3.0')
|
|
|
|
|
|
def test_is_valid_version_rejects_bad_input():
|
|
assert not agentstore.is_valid_version('')
|
|
assert not agentstore.is_valid_version('v1.6')
|
|
assert not agentstore.is_valid_version('1.6.3.0.1')
|
|
assert not agentstore.is_valid_version('../etc')
|
|
assert not agentstore.is_valid_version('latest')
|
|
|
|
|
|
def test_is_valid_binary_key():
|
|
assert agentstore.is_valid_binary_key('agent')
|
|
assert agentstore.is_valid_binary_key('tray')
|
|
assert not agentstore.is_valid_binary_key('other')
|
|
|
|
|
|
def test_looks_like_pe():
|
|
assert agentstore.looks_like_pe(b'MZ\x90\x00')
|
|
assert not agentstore.looks_like_pe(b'PK\x03\x04')
|
|
assert not agentstore.looks_like_pe(b'')
|
|
|
|
|
|
def test_read_pe_file_version_none_on_non_pe():
|
|
assert agentstore.read_pe_file_version(b'not a pe file') is None
|
|
|
|
|
|
def test_read_pe_file_version_none_on_truncated_pe():
|
|
# MZ header but nothing else valid: must return None, never raise.
|
|
assert agentstore.read_pe_file_version(b'MZ' + b'\x00' * 200) is None
|
|
|
|
|
|
def test_read_pe_file_version_none_on_empty():
|
|
assert agentstore.read_pe_file_version(b'') is None
|