debian-forge/debian-forge-tests/test-atomic-blueprint-generator.py
robojerk 502e1469ae
Some checks failed
Checks / Spelling (push) Has been cancelled
Checks / Python Linters (push) Has been cancelled
Checks / Shell Linters (push) Has been cancelled
Checks / 📦 Packit config lint (push) Has been cancelled
Checks / 🔍 Check for valid snapshot urls (push) Has been cancelled
Checks / 🔍 Check JSON files for formatting consistency (push) Has been cancelled
Generate / Documentation (push) Has been cancelled
Generate / Test Data (push) Has been cancelled
Tests / Unittest (push) Has been cancelled
Tests / Assembler test (legacy) (push) Has been cancelled
Tests / Smoke run: unittest as normal user on default runner (push) Has been cancelled
Move composer scripts to root directory and add comprehensive Debian Atomic support
2025-08-23 08:02:45 -07:00

365 lines
13 KiB
Python

#!/usr/bin/env python3
"""
Test Debian Atomic Blueprint Generator for Debian Forge
This script tests the enhanced blueprint generation system for
Debian atomic images.
"""
import json
import os
import sys
import tempfile
from pathlib import Path
# Add current directory to Python path
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
def test_blueprint_generator_import():
"""Test importing the blueprint generator"""
print("Testing blueprint generator import...")
try:
from debian_atomic_blueprint_generator import DebianAtomicBlueprintGenerator, AtomicBlueprintConfig
print(" ✅ Blueprint generator imported successfully")
return True
except ImportError as e:
print(f" ❌ Failed to import blueprint generator: {e}")
return False
def test_atomic_blueprint_config():
"""Test AtomicBlueprintConfig dataclass"""
print("\nTesting AtomicBlueprintConfig dataclass...")
try:
from debian_atomic_blueprint_generator import AtomicBlueprintConfig
config = AtomicBlueprintConfig(
name="test-config",
description="Test configuration",
version="1.0.0",
base_packages=["systemd", "ostree"]
)
if config.name != "test-config":
print(" ❌ Config name not set correctly")
return False
if len(config.base_packages) != 2:
print(" ❌ Base packages not set correctly")
return False
print(" ✅ AtomicBlueprintConfig works correctly")
return True
except Exception as e:
print(f" ❌ AtomicBlueprintConfig test failed: {e}")
return False
def test_blueprint_generator_initialization():
"""Test blueprint generator initialization"""
print("\nTesting blueprint generator initialization...")
try:
from debian_atomic_blueprint_generator import DebianAtomicBlueprintGenerator
generator = DebianAtomicBlueprintGenerator()
if not hasattr(generator, 'base_packages'):
print(" ❌ Base packages not initialized")
return False
if len(generator.base_packages) == 0:
print(" ❌ No base packages defined")
return False
print(" ✅ Blueprint generator initialization works correctly")
return True
except Exception as e:
print(f" ❌ Blueprint generator initialization test failed: {e}")
return False
def test_base_blueprint_generation():
"""Test base blueprint generation"""
print("\nTesting base blueprint generation...")
try:
from debian_atomic_blueprint_generator import DebianAtomicBlueprintGenerator
generator = DebianAtomicBlueprintGenerator()
blueprint = generator.generate_base_blueprint()
# Check required fields
required_fields = ["name", "description", "version", "packages"]
for field in required_fields:
if field not in blueprint:
print(f" ❌ Missing required field: {field}")
return False
# Check packages
if not blueprint["packages"]:
print(" ❌ No packages in blueprint")
return False
# Check customizations
if "customizations" not in blueprint:
print(" ❌ No customizations in blueprint")
return False
print(" ✅ Base blueprint generation works correctly")
return True
except Exception as e:
print(f" ❌ Base blueprint generation test failed: {e}")
return False
def test_specialized_blueprint_generation():
"""Test specialized blueprint generation"""
print("\nTesting specialized blueprint generation...")
try:
from debian_atomic_blueprint_generator import DebianAtomicBlueprintGenerator
generator = DebianAtomicBlueprintGenerator()
# Test workstation blueprint
workstation = generator.generate_workstation_blueprint()
if workstation["name"] != "debian-atomic-workstation":
print(" ❌ Workstation blueprint name incorrect")
return False
# Test server blueprint
server = generator.generate_server_blueprint()
if server["name"] != "debian-atomic-server":
print(" ❌ Server blueprint name incorrect")
return False
# Test container blueprint
container = generator.generate_container_blueprint()
if container["name"] != "debian-atomic-container":
print(" ❌ Container blueprint name incorrect")
return False
# Test minimal blueprint
minimal = generator.generate_minimal_blueprint()
if minimal["name"] != "debian-atomic-minimal":
print(" ❌ Minimal blueprint name incorrect")
return False
print(" ✅ Specialized blueprint generation works correctly")
return True
except Exception as e:
print(f" ❌ Specialized blueprint generation test failed: {e}")
return False
def test_osbuild_manifest_generation():
"""Test OSBuild manifest generation"""
print("\nTesting OSBuild manifest generation...")
try:
from debian_atomic_blueprint_generator import DebianAtomicBlueprintGenerator
generator = DebianAtomicBlueprintGenerator()
blueprint = generator.generate_base_blueprint()
manifest = generator.generate_osbuild_manifest(blueprint)
# Check manifest structure
if "version" not in manifest:
print(" ❌ Manifest missing version")
return False
if "pipelines" not in manifest:
print(" ❌ Manifest missing pipelines")
return False
if len(manifest["pipelines"]) == 0:
print(" ❌ No pipelines in manifest")
return False
# Check stages
build_pipeline = manifest["pipelines"][0]
if "stages" not in build_pipeline:
print(" ❌ Build pipeline missing stages")
return False
stage_types = [stage["type"] for stage in build_pipeline["stages"]]
expected_stages = ["org.osbuild.debootstrap", "org.osbuild.apt", "org.osbuild.ostree.commit"]
for expected in expected_stages:
if expected not in stage_types:
print(f" ❌ Missing expected stage: {expected}")
return False
print(" ✅ OSBuild manifest generation works correctly")
return True
except Exception as e:
print(f" ❌ OSBuild manifest generation test failed: {e}")
return False
def test_blueprint_validation():
"""Test blueprint validation"""
print("\nTesting blueprint validation...")
try:
from debian_atomic_blueprint_generator import DebianAtomicBlueprintGenerator
generator = DebianAtomicBlueprintGenerator()
# Test valid blueprint
valid_blueprint = generator.generate_base_blueprint()
validation = generator.validate_blueprint(valid_blueprint)
if not validation["valid"]:
print(f" ❌ Valid blueprint marked as invalid: {validation['errors']}")
return False
# Test invalid blueprint (missing required fields)
invalid_blueprint = {"name": "test"}
invalid_validation = generator.validate_blueprint(invalid_blueprint)
if invalid_validation["valid"]:
print(" ❌ Invalid blueprint marked as valid")
return False
print(" ✅ Blueprint validation works correctly")
return True
except Exception as e:
print(f" ❌ Blueprint validation test failed: {e}")
return False
def test_blueprint_save_load():
"""Test blueprint save and load"""
print("\nTesting blueprint save and load...")
try:
from debian_atomic_blueprint_generator import DebianAtomicBlueprintGenerator
generator = DebianAtomicBlueprintGenerator()
blueprint = generator.generate_base_blueprint()
with tempfile.TemporaryDirectory() as temp_dir:
# Test save
saved_path = generator.save_blueprint(blueprint, temp_dir)
if not os.path.exists(saved_path):
print(" ❌ Blueprint file not saved")
return False
# Test load
with open(saved_path, 'r') as f:
loaded_blueprint = json.load(f)
if loaded_blueprint["name"] != blueprint["name"]:
print(" ❌ Loaded blueprint name doesn't match")
return False
if len(loaded_blueprint["packages"]) != len(blueprint["packages"]):
print(" ❌ Loaded blueprint packages don't match")
return False
print(" ✅ Blueprint save and load works correctly")
return True
except Exception as e:
print(f" ❌ Blueprint save and load test failed: {e}")
return False
def test_all_blueprints_generation():
"""Test generation of all blueprint types"""
print("\nTesting all blueprints generation...")
try:
from debian_atomic_blueprint_generator import DebianAtomicBlueprintGenerator
generator = DebianAtomicBlueprintGenerator()
with tempfile.TemporaryDirectory() as temp_dir:
saved_files = generator.generate_all_blueprints(temp_dir)
if len(saved_files) == 0:
print(" ❌ No blueprints generated")
return False
# Check if all files exist
for file_path in saved_files:
if not os.path.exists(file_path):
print(f" ❌ Blueprint file not found: {file_path}")
return False
# Check expected blueprint types
expected_types = ["base", "workstation", "server", "container", "minimal"]
found_types = []
for file_path in saved_files:
filename = Path(file_path).stem
for bp_type in expected_types:
if bp_type in filename:
found_types.append(bp_type)
break
if len(found_types) != len(expected_types):
print(f" ❌ Expected {len(expected_types)} blueprint types, found {len(found_types)}")
return False
print(" ✅ All blueprints generation works correctly")
return True
except Exception as e:
print(f" ❌ All blueprints generation test failed: {e}")
return False
def main():
"""Main test function"""
print("Debian Atomic Blueprint Generator Test for Debian Forge")
print("=" * 60)
tests = [
("Blueprint Generator Import", test_blueprint_generator_import),
("AtomicBlueprintConfig", test_atomic_blueprint_config),
("Blueprint Generator Initialization", test_blueprint_generator_initialization),
("Base Blueprint Generation", test_base_blueprint_generation),
("Specialized Blueprint Generation", test_specialized_blueprint_generation),
("OSBuild Manifest Generation", test_osbuild_manifest_generation),
("Blueprint Validation", test_blueprint_validation),
("Blueprint Save and Load", test_blueprint_save_load),
("All Blueprints Generation", test_all_blueprints_generation)
]
results = []
for test_name, test_func in tests:
try:
result = test_func()
results.append((test_name, result))
except Exception as e:
print(f"{test_name} test failed with exception: {e}")
results.append((test_name, False))
# Summary
print("\n" + "=" * 60)
print("TEST SUMMARY")
print("=" * 60)
passed = 0
total = len(results)
for test_name, result in results:
status = "✅ PASS" if result else "❌ FAIL"
print(f"{test_name}: {status}")
if result:
passed += 1
print(f"\nOverall: {passed}/{total} tests passed")
if passed == total:
print("🎉 All tests passed! Debian atomic blueprint generator is ready.")
return 0
else:
print("⚠️ Some tests failed. Please review the issues above.")
return 1
if __name__ == '__main__':
sys.exit(main())