Files
LOGAR/tests/test_hub_server_deep.py
me0nline d9bc8df002
CI Test Suite / Run Component Tests & Pipeline Verification (push) Failing after 20s
Build and Push LOGAR Runner / Build & Push Runner Image (push) Successful in 4m15s
Update runner Dockerfile, workflows, and resolve CI test dependencies
2026-10-03 20:08:30 +02:00

151 lines
5.5 KiB
Python

"""
Comprehensive unit tests for LOGAR Server FastAPI endpoints, state management, and log processing.
"""
import os
import sys
import json
import shutil
import tempfile
import sqlite3
import unittest
from unittest.mock import MagicMock, patch
from src.hub import Server
from src.hub.server_models import (
ClientEnrollRequest,
ClientActionRequest,
HermesTokenCreateRequest,
HermesTokenRevokeRequest
)
from src.hub.auth_manager import SessionManager
class TestHubServerDeep(unittest.TestCase):
def setUp(self):
self.temp_dir = tempfile.mkdtemp()
self.cert_dir = os.path.join(self.temp_dir, "certs")
os.makedirs(self.cert_dir, exist_ok=True)
self.db_path = os.path.join(self.temp_dir, "test_server.db")
self.config_path = os.path.join(self.temp_dir, "server_config.json")
# Initialize test state
Server.StorageEngine.init_db(self.db_path, enrollment_secret="test_secret", max_seats=50)
Server.SERVER_STATE["config"] = {
"db_path": self.db_path,
"enrollment_secret": "test_secret",
"max_seats": 50,
"cert_dir": self.cert_dir,
"encrypt_at_rest": False
}
# Generate and load CA
ca_cert, ca_key, ca_pem, _ = Server.enrollment.generate_ca_if_needed(cert_dir=self.cert_dir)
Server.SERVER_STATE["ca_cert"] = ca_cert
Server.SERVER_STATE["ca_key"] = ca_key
Server.SERVER_STATE["ca_cert_pem"] = ca_pem
def tearDown(self):
shutil.rmtree(self.temp_dir, ignore_errors=True)
def test_server_status_and_update_routes(self):
"""Tests /api/update/status and health check handler."""
status_data = Server.get_update_status(user="admin")
self.assertIn("hosted_packages", status_data)
health = Server.health_check()
self.assertEqual(health.get("status"), "healthy")
def test_client_enrollment_and_action_endpoints(self):
"""Tests client enrollment, listing, revoke, approve, and delete handlers."""
# Ensure license in DB is marked active with seats
conn = sqlite3.connect(self.db_path)
conn.execute("UPDATE license_config SET max_seats = 50, license_status = 'active' WHERE id = 1")
conn.commit()
conn.close()
# Enroll client
enroll_req = ClientEnrollRequest(
client_id="test_agent_deep_01",
hostname="workstation-01",
os="windows",
enrollment_secret="test_secret"
)
enroll_data = Server.enroll_client(enroll_req)
self.assertEqual(enroll_data.get("status"), "success")
self.assertIn("client_cert", enroll_data)
self.assertIn("client_key", enroll_data)
# Check client list
clients_data = Server.list_clients(auth_user="admin")
self.assertGreaterEqual(clients_data.get("active_seats", 0), 1)
# Client action: revoke
action_req = ClientActionRequest(client_id="test_agent_deep_01")
rev_data = Server.revoke_client(action_req, auth_user="admin")
self.assertEqual(rev_data.get("status"), "revoked")
# Reactivate
app_data = Server.approve_client(action_req, auth_user="admin")
self.assertEqual(app_data.get("status"), "active")
# Delete
del_data = Server.delete_client(action_req, auth_user="admin")
self.assertEqual(del_data.get("status"), "deleted")
def test_hermes_tokens_and_auth_routes(self):
"""Tests Hermes API token creation, listing, and revoking handlers."""
# Create token
tok_req = HermesTokenCreateRequest(name="Test Integration Agent")
tok_data = Server.api_create_hermes_token(tok_req, auth_user="admin")
token_val = tok_data.get("token")
self.assertIsNotNone(token_val)
# List tokens
tokens_list = Server.api_list_hermes_tokens(auth_user="admin")
self.assertTrue(any(t.get("token") == token_val for t in tokens_list))
# Revoke token
rev_req = HermesTokenRevokeRequest(token=token_val)
rev_data = Server.api_revoke_hermes_token(rev_req, auth_user="admin")
self.assertEqual(rev_data.get("status"), "success")
def test_process_ingested_logs_and_temporal_tracking(self):
"""Tests processing ingested log entries, deduplication, and anomaly promotion."""
payload = {
"server": "web-prod-01",
"timestamp": "2026-01-01T12:00:00Z",
"logs": [
{
"site_name": "Default-Site",
"server": "web-prod-01",
"signature": "SECURITY_4625_BRUTEFORCE",
"severity": "CRITICAL",
"message": "Repeated failed logon attempts detected from 10.0.0.99",
"os_type": "windows",
"timestamp": "2026-01-01T12:00:00Z"
}
]
}
res = Server.process_ingested_logs(
payload=payload,
db_path=self.db_path,
window_hours=24,
min_runs=1
)
self.assertEqual(res.get("processed"), 1)
# Query database directly to confirm issue recorded
conn = sqlite3.connect(self.db_path)
c = conn.cursor()
c.execute("SELECT signature, severity, run_count FROM active_issues")
row = c.fetchone()
conn.close()
self.assertIsNotNone(row)
self.assertEqual(row[0], "SECURITY_4625_BRUTEFORCE")
self.assertEqual(row[1], "CRITICAL")
self.assertEqual(row[2], 1)
if __name__ == "__main__":
unittest.main()