prvng_core/nulib/tests/test_coredns.nu
2025-10-07 10:32:04 +01:00

322 lines
9.8 KiB
Plaintext

# CoreDNS Integration Tests
# Comprehensive tests for CoreDNS functionality
use ../lib_provisioning/coredns/corefile.nu *
use ../lib_provisioning/coredns/zones.nu *
use ../lib_provisioning/coredns/service.nu *
use ../lib_provisioning/utils/log.nu *
# Test suite runner
export def main [] {
print "\nCoreD NS Integration Test Suite\n================================\n"
let results = [
(test-corefile-generation)
(test-zone-file-creation)
(test-zone-record-management)
(test-corefile-validation)
(test-zone-validation)
(test-dns-config)
]
let total = $results | length
let passed = $results | where passed == true | length
let failed = $total - $passed
print $"\n\nTest Summary\n============"
print $"Total: ($total)"
print $"Passed: ($passed) ✓"
print $"Failed: ($failed) ($failed | if $in > 0 { '✗' } else { '' })"
if $failed > 0 {
print "\n❌ Some tests failed"
exit 1
} else {
print "\n✅ All tests passed!"
}
}
# Test Corefile generation
def test-corefile-generation [] -> record {
print "Test: Corefile Generation"
let test_config = {
mode: "local"
local: {
port: 5353
zones_path: "/tmp/test-coredns/zones"
zones: ["test.local", "example.local"]
}
upstream: ["8.8.8.8", "1.1.1.1"]
enable_logging: true
enable_metrics: true
metrics_port: 9153
dynamic_updates: {
enabled: true
}
}
try {
let corefile = generate-corefile $test_config
# Check if corefile contains expected elements
let has_zones = ($corefile | str contains "test.local") and ($corefile | str contains "example.local")
let has_forward = $corefile | str contains "forward ."
let has_upstream = ($corefile | str contains "8.8.8.8") and ($corefile | str contains "1.1.1.1")
let has_metrics = $corefile | str contains "prometheus"
if $has_zones and $has_forward and $has_upstream and $has_metrics {
print " ✓ Corefile generated successfully"
{ test: "corefile_generation", passed: true }
} else {
print " ✗ Corefile missing expected elements"
{ test: "corefile_generation", passed: false, error: "Missing elements" }
}
} catch {|err|
print $" ✗ Failed: ($err.msg)"
{ test: "corefile_generation", passed: false, error: $err.msg }
}
}
# Test zone file creation
def test-zone-file-creation [] -> record {
print "Test: Zone File Creation"
let test_zone = "test.local"
let test_zones_path = "/tmp/test-coredns/zones"
try {
# Create test directory
mkdir $test_zones_path
# Create zone file
let result = create-zone-file $test_zone $test_zones_path --config {}
if $result {
let zone_file = $"($test_zones_path)/($test_zone).zone"
if ($zone_file | path exists) {
let content = open $zone_file
# Check for required elements
let has_origin = $content | str contains "$ORIGIN"
let has_soa = $content | str contains "SOA"
let has_ns = $content | str contains "NS"
if $has_origin and $has_soa and $has_ns {
print " ✓ Zone file created with required records"
# Cleanup
rm -rf $test_zones_path
{ test: "zone_file_creation", passed: true }
} else {
print " ✗ Zone file missing required records"
rm -rf $test_zones_path
{ test: "zone_file_creation", passed: false, error: "Missing records" }
}
} else {
print " ✗ Zone file not created"
{ test: "zone_file_creation", passed: false, error: "File not found" }
}
} else {
print " ✗ create-zone-file returned false"
{ test: "zone_file_creation", passed: false, error: "Function returned false" }
}
} catch {|err|
print $" ✗ Failed: ($err.msg)"
{ test: "zone_file_creation", passed: false, error: $err.msg }
}
}
# Test zone record management
def test-zone-record-management [] -> record {
print "Test: Zone Record Management"
let test_zone = "test.local"
let test_zones_path = "/tmp/test-coredns/zones"
try {
# Create test directory and zone
mkdir $test_zones_path
create-zone-file $test_zone $test_zones_path --config {}
# Add A record
let add_result = add-a-record $test_zone "server01" "10.0.1.10" --zones-path $test_zones_path
if not $add_result {
print " ✗ Failed to add A record"
rm -rf $test_zones_path
return { test: "zone_record_management", passed: false, error: "Failed to add record" }
}
# List records
let records = list-zone-records $test_zone --zones-path $test_zones_path
let has_record = $records | any {|r| $r.name == "server01" and $r.value == "10.0.1.10"}
if not $has_record {
print " ✗ Added record not found in zone"
rm -rf $test_zones_path
return { test: "zone_record_management", passed: false, error: "Record not found" }
}
# Remove record
let remove_result = remove-record $test_zone "server01" --zones-path $test_zones_path
if not $remove_result {
print " ✗ Failed to remove record"
rm -rf $test_zones_path
return { test: "zone_record_management", passed: false, error: "Failed to remove" }
}
# Verify removal
let records_after = list-zone-records $test_zone --zones-path $test_zones_path
let still_exists = $records_after | any {|r| $r.name == "server01"}
if $still_exists {
print " ✗ Record still exists after removal"
rm -rf $test_zones_path
return { test: "zone_record_management", passed: false, error: "Record not removed" }
}
print " ✓ Record management working correctly"
# Cleanup
rm -rf $test_zones_path
{ test: "zone_record_management", passed: true }
} catch {|err|
print $" ✗ Failed: ($err.msg)"
rm -rf $test_zones_path
{ test: "zone_record_management", passed: false, error: $err.msg }
}
}
# Test Corefile validation
def test-corefile-validation [] -> record {
print "Test: Corefile Validation"
let test_dir = "/tmp/test-coredns"
try {
mkdir $test_dir
# Create valid Corefile
let valid_corefile = $"($test_dir)/Corefile.valid"
$"test.local:5353 {
file /zones/test.local.zone
log
errors
}
.:5353 {
forward . 8.8.8.8
log
errors
}" | save -f $valid_corefile
let validation = validate-corefile $valid_corefile
if $validation.valid {
print " ✓ Valid Corefile validated successfully"
rm -rf $test_dir
{ test: "corefile_validation", passed: true }
} else {
print $" ✗ Valid Corefile marked as invalid: ($validation.errors)"
rm -rf $test_dir
{ test: "corefile_validation", passed: false, error: "Validation failed" }
}
} catch {|err|
print $" ✗ Failed: ($err.msg)"
rm -rf $test_dir
{ test: "corefile_validation", passed: false, error: $err.msg }
}
}
# Test zone validation
def test-zone-validation [] -> record {
print "Test: Zone Validation"
let test_zone = "test.local"
let test_zones_path = "/tmp/test-coredns/zones"
try {
# Create valid zone file
mkdir $test_zones_path
create-zone-file $test_zone $test_zones_path --config {}
let validation = validate-zone-file $test_zone --zones-path $test_zones_path
if $validation.valid {
print " ✓ Valid zone file validated successfully"
rm -rf "/tmp/test-coredns"
{ test: "zone_validation", passed: true }
} else {
print $" ✗ Valid zone marked as invalid: ($validation.errors)"
rm -rf "/tmp/test-coredns"
{ test: "zone_validation", passed: false, error: "Validation failed" }
}
} catch {|err|
print $" ✗ Failed: ($err.msg)"
rm -rf "/tmp/test-coredns"
{ test: "zone_validation", passed: false, error: $err.msg }
}
}
# Test DNS configuration
def test-dns-config [] -> record {
print "Test: DNS Configuration"
try {
let test_config = {
mode: "local"
local: {
enabled: true
deployment_type: "binary"
port: 5353
zones: ["test.local"]
}
upstream: ["8.8.8.8"]
default_ttl: 300
}
# Test config structure
let has_mode = $test_config.mode? != null
let has_local = $test_config.local? != null
let has_upstream = $test_config.upstream? != null
if $has_mode and $has_local and $has_upstream {
print " ✓ DNS configuration structure valid"
{ test: "dns_config", passed: true }
} else {
print " ✗ DNS configuration missing required fields"
{ test: "dns_config", passed: false, error: "Missing fields" }
}
} catch {|err|
print $" ✗ Failed: ($err.msg)"
{ test: "dns_config", passed: false, error: $err.msg }
}
}
# Individual test runners for selective testing
export def "test corefile" [] {
test-corefile-generation
}
export def "test zones" [] {
test-zone-file-creation
test-zone-record-management
test-zone-validation
}
export def "test validation" [] {
test-corefile-validation
test-zone-validation
}
export def "test config" [] {
test-dns-config
}