mirror of
https://github.com/coredns/coredns.git
synced 2026-04-09 13:35:33 -04:00
fix(test): fix flaky view server block ordering test (#8031)
This commit is contained in:
@@ -173,6 +173,9 @@ func TestViewServerBlockOrdering(t *testing.T) {
|
|||||||
// the query. An unfiltered block declared before a filtered block will
|
// the query. An unfiltered block declared before a filtered block will
|
||||||
// catch all queries, shadowing the filtered block.
|
// catch all queries, shadowing the filtered block.
|
||||||
//
|
//
|
||||||
|
// All scenarios use distinct zone names and are combined into a single
|
||||||
|
// Corefile/server instance to avoid stop/start races with SO_REUSEPORT.
|
||||||
|
//
|
||||||
// See https://github.com/coredns/coredns/issues/7733
|
// See https://github.com/coredns/coredns/issues/7733
|
||||||
|
|
||||||
corefile := `example.org:0 {
|
corefile := `example.org:0 {
|
||||||
@@ -183,12 +186,11 @@ func TestViewServerBlockOrdering(t *testing.T) {
|
|||||||
t.Fatalf("Could not get CoreDNS serving instance: %s", err)
|
t.Fatalf("Could not get CoreDNS serving instance: %s", err)
|
||||||
}
|
}
|
||||||
port := addr[strings.LastIndex(addr, ":")+1:]
|
port := addr[strings.LastIndex(addr, ":")+1:]
|
||||||
tmp.Stop()
|
|
||||||
|
|
||||||
t.Run("filtered blocks before unfiltered", func(t *testing.T) {
|
corefile = `
|
||||||
// Filtered blocks are listed first, unfiltered catch-all is last.
|
# Scenario: filtered blocks before unfiltered (order-test)
|
||||||
// Each view handles its matching queries; the catch-all handles the rest.
|
# Filtered blocks are listed first, unfiltered catch-all is last.
|
||||||
corefile := `
|
# Each view handles its matching queries; the catch-all handles the rest.
|
||||||
order-test:` + port + ` {
|
order-test:` + port + ` {
|
||||||
view v-a {
|
view v-a {
|
||||||
expr type() == 'A'
|
expr type() == 'A'
|
||||||
@@ -210,23 +212,10 @@ func TestViewServerBlockOrdering(t *testing.T) {
|
|||||||
5.6.7.8 test.order-test
|
5.6.7.8 test.order-test
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
`
|
|
||||||
i, addr, _, err := CoreDNSServerAndPorts(corefile)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("Could not start server: %s", err)
|
|
||||||
}
|
|
||||||
defer i.Stop()
|
|
||||||
|
|
||||||
viewTest(t, "A routed to v-a", addr, "test.order-test.", dns.TypeA, dns.RcodeSuccess,
|
# Scenario: unfiltered block first (order-test2)
|
||||||
[]dns.RR{test.A("test.order-test. 303 IN A 1.2.3.4")})
|
# Unfiltered block is declared first. It matches all queries, so the
|
||||||
viewTest(t, "AAAA routed to v-aaaa", addr, "test.order-test.", dns.TypeAAAA, dns.RcodeSuccess,
|
# filtered block below it is effectively shadowed.
|
||||||
[]dns.RR{test.AAAA("test.order-test. 303 IN AAAA 1:2:3::4")})
|
|
||||||
})
|
|
||||||
|
|
||||||
t.Run("unfiltered block first", func(t *testing.T) {
|
|
||||||
// Unfiltered block is declared first. It matches all queries, so the
|
|
||||||
// filtered block below it is effectively shadowed.
|
|
||||||
corefile := `
|
|
||||||
order-test2:` + port + ` {
|
order-test2:` + port + ` {
|
||||||
hosts {
|
hosts {
|
||||||
5.6.7.8 test.order-test2
|
5.6.7.8 test.order-test2
|
||||||
@@ -240,23 +229,10 @@ func TestViewServerBlockOrdering(t *testing.T) {
|
|||||||
1.2.3.4 test.order-test2
|
1.2.3.4 test.order-test2
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
`
|
|
||||||
i, addr, _, err := CoreDNSServerAndPorts(corefile)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("Could not start server: %s", err)
|
|
||||||
}
|
|
||||||
defer i.Stop()
|
|
||||||
|
|
||||||
// The unfiltered block catches everything, so A goes to it (5.6.7.8).
|
# Scenario: unfiltered block in the middle (order-test3)
|
||||||
viewTest(t, "A hits unfiltered", addr, "test.order-test2.", dns.TypeA, dns.RcodeSuccess,
|
# The first view catches A queries. The unfiltered block catches
|
||||||
[]dns.RR{test.A("test.order-test2. 303 IN A 5.6.7.8")})
|
# everything else, shadowing the second filtered block.
|
||||||
})
|
|
||||||
|
|
||||||
t.Run("unfiltered block in the middle", func(t *testing.T) {
|
|
||||||
// A filtered block, then unfiltered, then another filtered block.
|
|
||||||
// The first view catches A queries. The unfiltered block catches
|
|
||||||
// everything else, shadowing the second filtered block.
|
|
||||||
corefile := `
|
|
||||||
order-test3:` + port + ` {
|
order-test3:` + port + ` {
|
||||||
view v-a {
|
view v-a {
|
||||||
expr type() == 'A'
|
expr type() == 'A'
|
||||||
@@ -278,18 +254,52 @@ func TestViewServerBlockOrdering(t *testing.T) {
|
|||||||
1:2:3::4 test.order-test3
|
1:2:3::4 test.order-test3
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
`
|
|
||||||
i, addr, _, err := CoreDNSServerAndPorts(corefile)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("Could not start server: %s", err)
|
|
||||||
}
|
|
||||||
defer i.Stop()
|
|
||||||
|
|
||||||
// A is caught by v-a (first block).
|
# Scenario: no catch-all (order-test4)
|
||||||
viewTest(t, "A routed to v-a", addr, "test.order-test3.", dns.TypeA, dns.RcodeSuccess,
|
# Only filtered blocks. Queries not matching any view get REFUSED.
|
||||||
[]dns.RR{test.A("test.order-test3. 303 IN A 1.2.3.4")})
|
order-test4:` + port + ` {
|
||||||
// MX has no matching view, hits the unfiltered block -> 5.6.7.8 (hosts only has A).
|
view v-a {
|
||||||
// AAAA view is shadowed by unfiltered, so AAAA also hits unfiltered.
|
expr type() == 'A'
|
||||||
viewTest(t, "AAAA hits unfiltered (shadowed view)", addr, "test.order-test3.", dns.TypeAAAA, dns.RcodeSuccess, nil)
|
}
|
||||||
})
|
hosts {
|
||||||
|
1.2.3.4 test.order-test4
|
||||||
|
}
|
||||||
|
}
|
||||||
|
order-test4:` + port + ` {
|
||||||
|
view v-aaaa {
|
||||||
|
expr type() == 'AAAA'
|
||||||
|
}
|
||||||
|
hosts {
|
||||||
|
1:2:3::4 test.order-test4
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`
|
||||||
|
|
||||||
|
i, addr, _, err := CoreDNSServerAndPorts(corefile)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("Could not start server: %s", err)
|
||||||
|
}
|
||||||
|
defer i.Stop()
|
||||||
|
tmp.Stop()
|
||||||
|
|
||||||
|
// filtered blocks before unfiltered — views handle matching types, catch-all handles the rest
|
||||||
|
viewTest(t, "A routed to v-a", addr, "test.order-test.", dns.TypeA, dns.RcodeSuccess,
|
||||||
|
[]dns.RR{test.A("test.order-test. 303 IN A 1.2.3.4")})
|
||||||
|
viewTest(t, "AAAA routed to v-aaaa", addr, "test.order-test.", dns.TypeAAAA, dns.RcodeSuccess,
|
||||||
|
[]dns.RR{test.AAAA("test.order-test. 303 IN AAAA 1:2:3::4")})
|
||||||
|
viewTest(t, "MX falls through to catch-all", addr, "test.order-test.", dns.TypeMX, dns.RcodeSuccess, nil)
|
||||||
|
|
||||||
|
// unfiltered block first — catches everything, view is shadowed
|
||||||
|
viewTest(t, "A hits unfiltered", addr, "test.order-test2.", dns.TypeA, dns.RcodeSuccess,
|
||||||
|
[]dns.RR{test.A("test.order-test2. 303 IN A 5.6.7.8")})
|
||||||
|
|
||||||
|
// unfiltered block in the middle — v-a catches A, unfiltered shadows v-aaaa
|
||||||
|
viewTest(t, "A routed to v-a (middle)", addr, "test.order-test3.", dns.TypeA, dns.RcodeSuccess,
|
||||||
|
[]dns.RR{test.A("test.order-test3. 303 IN A 1.2.3.4")})
|
||||||
|
viewTest(t, "AAAA hits unfiltered (shadowed view)", addr, "test.order-test3.", dns.TypeAAAA, dns.RcodeSuccess, nil)
|
||||||
|
|
||||||
|
// no catch-all — matching view works, non-matching type is REFUSED
|
||||||
|
viewTest(t, "A routed to v-a (no catch-all)", addr, "test.order-test4.", dns.TypeA, dns.RcodeSuccess,
|
||||||
|
[]dns.RR{test.A("test.order-test4. 303 IN A 1.2.3.4")})
|
||||||
|
viewTest(t, "MX refused without catch-all", addr, "test.order-test4.", dns.TypeMX, dns.RcodeRefused, nil)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user