Implement referral resolution for nameserver names without glue records
CI / test (pull_request) Waiting to run
CI / test (pull_request) Waiting to run
- Add Resolve method to Referral struct for sub-traversal from root - Add ResolveNS method to Traverser for nameserver name resolution - Add CircularReferralError and UnresolvableNameserverError types - Add visited map tracking to detect circular referral chains - Add depth tracking to prevent infinite loops - Integrate referral resolution into processReferral - Add unit tests for new error types - Handle edge cases: circular referrals, unresolvable nameservers, max depth Co-authored-by: multica-agent <github@multica.ai>
This commit is contained in:
@@ -109,3 +109,51 @@ func TestResolutionStateString(t *testing.T) {
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestCircularReferralError(t *testing.T) {
|
||||
err := &CircularReferralError{
|
||||
Name: "ns.example.com.",
|
||||
Chain: []string{"ns1.example.com.", "ns2.example.com."},
|
||||
}
|
||||
|
||||
expected := "circular referral detected for ns.example.com.: [ns1.example.com. ns2.example.com.]"
|
||||
if err.Error() != expected {
|
||||
t.Errorf("Error() = %q, want %q", err.Error(), expected)
|
||||
}
|
||||
}
|
||||
|
||||
func TestUnresolvableNameserverError(t *testing.T) {
|
||||
err := &UnresolvableNameserverError{
|
||||
Name: "ns.example.com.",
|
||||
Reason: "NXDOMAIN",
|
||||
}
|
||||
|
||||
expected := "unresolvable nameserver ns.example.com.: NXDOMAIN"
|
||||
if err.Error() != expected {
|
||||
t.Errorf("Error() = %q, want %q", err.Error(), expected)
|
||||
}
|
||||
}
|
||||
|
||||
func TestGetVisitedNames(t *testing.T) {
|
||||
visited := map[string]bool{
|
||||
"ns1.example.com.": true,
|
||||
"ns2.example.com.": true,
|
||||
"ns3.example.com.": true,
|
||||
}
|
||||
|
||||
names := getVisitedNames(visited)
|
||||
if len(names) != 3 {
|
||||
t.Errorf("got %d names, want 3", len(names))
|
||||
}
|
||||
|
||||
seen := make(map[string]bool)
|
||||
for _, name := range names {
|
||||
if seen[name] {
|
||||
t.Errorf("duplicate name: %s", name)
|
||||
}
|
||||
seen[name] = true
|
||||
if !visited[name] {
|
||||
t.Errorf("unexpected name: %s", name)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user