(t *testing.T)
| 599 | } |
| 600 | |
| 601 | func TestFailover(t *testing.T) { |
| 602 | server_fail_s := dnstest.NewMultipleServer(func(w dns.ResponseWriter, r *dns.Msg) { |
| 603 | ret := new(dns.Msg) |
| 604 | ret.SetRcode(r, dns.RcodeServerFailure) |
| 605 | w.WriteMsg(ret) |
| 606 | }) |
| 607 | defer server_fail_s.Close() |
| 608 | |
| 609 | server_refused_s := dnstest.NewMultipleServer(func(w dns.ResponseWriter, r *dns.Msg) { |
| 610 | ret := new(dns.Msg) |
| 611 | ret.SetRcode(r, dns.RcodeRefused) |
| 612 | w.WriteMsg(ret) |
| 613 | }) |
| 614 | defer server_refused_s.Close() |
| 615 | |
| 616 | s := dnstest.NewMultipleServer(func(w dns.ResponseWriter, r *dns.Msg) { |
| 617 | ret := new(dns.Msg) |
| 618 | ret.SetReply(r) |
| 619 | ret.Answer = append(ret.Answer, test.A("example.org. IN A 127.0.0.1")) |
| 620 | w.WriteMsg(ret) |
| 621 | }) |
| 622 | defer s.Close() |
| 623 | |
| 624 | tests := []struct { |
| 625 | input string |
| 626 | hasRecord bool |
| 627 | failMsg string |
| 628 | }{ |
| 629 | {fmt.Sprintf( |
| 630 | `forward . %s %s %s { |
| 631 | policy sequential |
| 632 | failover ServFail Refused |
| 633 | }`, server_fail_s.Addr, server_refused_s.Addr, s.Addr), true, "If failover is set, records should be returned as long as one of the upstreams is work"}, |
| 634 | {fmt.Sprintf( |
| 635 | `forward . %s %s %s { |
| 636 | policy sequential |
| 637 | }`, server_fail_s.Addr, server_refused_s.Addr, s.Addr), false, "If failover is not set and the first upstream is not work, no records should be returned"}, |
| 638 | {fmt.Sprintf( |
| 639 | `forward . %s %s %s { |
| 640 | policy sequential |
| 641 | }`, s.Addr, server_fail_s.Addr, server_refused_s.Addr), true, "Although failover is not set, as long as the first upstream is work, there should be has a record return"}, |
| 642 | } |
| 643 | |
| 644 | for i, testCase := range tests { |
| 645 | c := caddy.NewTestController("dns", testCase.input) |
| 646 | fs, err := parseForward(c) |
| 647 | |
| 648 | f := fs[0] |
| 649 | if err != nil { |
| 650 | t.Errorf("Test #%d: Failed to create forwarder: %s", i, err) |
| 651 | } |
| 652 | f.OnStartup() |
| 653 | defer f.OnShutdown() |
| 654 | |
| 655 | // Reduce per-upstream read timeout to make the test fit within the |
| 656 | // per-query deadline defaultTimeout of 5 seconds. |
| 657 | for _, p := range f.proxies { |
| 658 | p.SetReadTimeout(500 * time.Millisecond) |
nothing calls this directly
no test coverage detected
searching dependent graphs…