151 lines
5.5 KiB
Python
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()
|