Skip to content

Commit 39825e5

Browse files
author
Ravi Sankar Penta
committed
Added test cases for dns proxy egress router mode
1 parent f06aa9e commit 39825e5

File tree

1 file changed

+288
-0
lines changed

1 file changed

+288
-0
lines changed
Lines changed: 288 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,288 @@
1+
package egress_dns_proxy_test
2+
3+
import (
4+
"fmt"
5+
"os/exec"
6+
"regexp"
7+
"strings"
8+
"testing"
9+
)
10+
11+
func TestHAProxyFrontendBackendConf(t *testing.T) {
12+
tests := []struct {
13+
src string
14+
dest string
15+
frontends []string
16+
backends []string
17+
}{
18+
// Single destination IP
19+
{
20+
src: "1.2.3.4",
21+
dest: "80 11.12.13.14",
22+
frontends: []string{`
23+
frontend fe1
24+
bind :80
25+
default_backend be1`},
26+
backends: []string{`
27+
backend be1
28+
server dest1 11.12.13.14:80 check`},
29+
},
30+
// Multiple destination IPs
31+
{
32+
src: "1.2.3.4",
33+
dest: "80 11.12.13.14\n8080 21.22.23.24 100",
34+
frontends: []string{`
35+
frontend fe1
36+
bind :80
37+
default_backend be1`, `
38+
frontend fe2
39+
bind :8080
40+
default_backend be2`},
41+
backends: []string{`
42+
backend be1
43+
server dest1 11.12.13.14:80 check`, `
44+
backend be2
45+
server dest2 21.22.23.24:100 check`},
46+
},
47+
// Single destination domain name
48+
{
49+
src: "1.2.3.4",
50+
dest: "80 example.com",
51+
frontends: []string{`
52+
frontend fe1
53+
bind :80
54+
default_backend be1`},
55+
backends: []string{`
56+
backend be1
57+
server dest1 example.com:80 check resolvers dns-resolver`},
58+
},
59+
// Multiple destination domain names
60+
{
61+
src: "1.2.3.4",
62+
dest: "80 example.com\n8080 foo.com 100",
63+
frontends: []string{`
64+
frontend fe1
65+
bind :80
66+
default_backend be1`, `
67+
frontend fe2
68+
bind :8080
69+
default_backend be2`},
70+
backends: []string{`
71+
backend be1
72+
server dest1 example.com:80 check resolvers dns-resolver`, `
73+
backend be2
74+
server dest2 foo.com:100 check resolvers dns-resolver`},
75+
},
76+
// Destination IP and destination domain name
77+
{
78+
src: "1.2.3.4",
79+
dest: "80 11.12.13.14\n8080 example.com 100",
80+
frontends: []string{`
81+
frontend fe1
82+
bind :80
83+
default_backend be1`, `
84+
frontend fe2
85+
bind :8080
86+
default_backend be2`},
87+
backends: []string{`
88+
backend be1
89+
server dest1 11.12.13.14:80 check`, `
90+
backend be2
91+
server dest2 example.com:100 check resolvers dns-resolver`},
92+
},
93+
// Destination with comments and blank lines
94+
{
95+
src: "1.2.3.4",
96+
dest: `
97+
# My DNS proxy egress router rules
98+
99+
# Port 80 forwards to 11.12.13.14
100+
80 11.12.13.14
101+
102+
# Port 8080 forwards to port 100 on example.com
103+
8080 example.com 100
104+
105+
# Skip this rule for now
106+
# 9000 foo.com 200
107+
108+
# End
109+
`,
110+
frontends: []string{`
111+
frontend fe1
112+
bind :80
113+
default_backend be1`, `
114+
frontend fe2
115+
bind :8080
116+
default_backend be2`},
117+
backends: []string{`
118+
backend be1
119+
server dest1 11.12.13.14:80 check`, `
120+
backend be2
121+
server dest2 example.com:100 check resolvers dns-resolver`},
122+
},
123+
}
124+
125+
frontendRegex := regexp.MustCompile("\nfrontend ")
126+
backendRegex := regexp.MustCompile("\nbackend ")
127+
128+
for n, test := range tests {
129+
cmd := exec.Command("./egress-dns-proxy.sh")
130+
cmd.Env = []string{
131+
fmt.Sprintf("EGRESS_DESTINATION=%s", test.dest),
132+
fmt.Sprintf("EGRESS_SOURCE=%s", test.src),
133+
fmt.Sprintf("EGRESS_DNS_PROXY_MODE=unit-test"),
134+
}
135+
outBytes, err := cmd.CombinedOutput()
136+
if err != nil {
137+
t.Fatalf("test %d unexpected error %v, output: %q", n+1, err, string(outBytes))
138+
}
139+
out := string(outBytes)
140+
for _, frontend := range test.frontends {
141+
if !strings.Contains(out, frontend) {
142+
t.Fatalf("test %d expected frontend in output %q but got %q", n+1, frontend, out)
143+
}
144+
}
145+
matches := frontendRegex.FindAllStringIndex(out, -1)
146+
if len(matches) != len(test.frontends) {
147+
t.Fatalf("test %d number of frontends mismatch, expected %q but got %q", n+1, test.frontends, out)
148+
}
149+
150+
for _, backend := range test.backends {
151+
if !strings.Contains(out, backend) {
152+
t.Fatalf("test %d expected backend in output %q but got %q", n+1, backend, out)
153+
}
154+
}
155+
matches = backendRegex.FindAllStringIndex(out, -1)
156+
if len(matches) != len(test.backends) {
157+
t.Fatalf("test %d number of backends mismatch, expected %q but got %q", n+1, test.backends, out)
158+
}
159+
}
160+
}
161+
162+
func TestHAProxyFrontendBackendConfBad(t *testing.T) {
163+
tests := []struct {
164+
src string
165+
dest string
166+
err string
167+
}{
168+
{
169+
src: "",
170+
dest: "80 11.12.13.14",
171+
err: "Must specify EGRESS_SOURCE",
172+
},
173+
{
174+
src: "not an IP addr",
175+
dest: "80 11.12.13.14",
176+
err: "EGRESS_SOURCE must be IPv4 address",
177+
},
178+
{
179+
src: "1.2.3.4",
180+
dest: "",
181+
err: "Must specify EGRESS_DESTINATION",
182+
},
183+
{
184+
src: "1.2.3.4",
185+
dest: "80 11.12.13.14\ninvalid",
186+
err: "Bad destination 'invalid'",
187+
},
188+
{
189+
src: "1.2.3.4",
190+
dest: "80 11.12.13.14\n8080 invalid",
191+
err: "Bad destination '8080 invalid'",
192+
},
193+
{
194+
src: "1.2.3.4",
195+
dest: "99999 11.12.13.14",
196+
err: "Invalid port: 99999, must be in the range 1 to 65535",
197+
},
198+
{
199+
src: "1.2.3.4",
200+
dest: "80 11.12.13.14 88888",
201+
err: "Invalid port: 88888, must be in the range 1 to 65535",
202+
},
203+
{
204+
src: "1.2.3.4",
205+
dest: "80 11.12.13.14\n80 21.22.23.24 100",
206+
err: "Proxy port 80 already used, must be unique for each destination",
207+
},
208+
}
209+
210+
for n, test := range tests {
211+
cmd := exec.Command("./egress-dns-proxy.sh")
212+
cmd.Env = []string{
213+
"EGRESS_DNS_PROXY_MODE=unit-test",
214+
fmt.Sprintf("EGRESS_SOURCE=%s", test.src),
215+
fmt.Sprintf("EGRESS_DESTINATION=%s", test.dest),
216+
}
217+
out, err := cmd.CombinedOutput()
218+
out_lines := strings.Split(string(out), "\n")
219+
got := out_lines[len(out_lines)-2]
220+
if err == nil {
221+
t.Fatalf("test %d expected error %q but got output %q", n+1, test.err, got)
222+
}
223+
if got != test.err {
224+
t.Fatalf("test %d expected output %q but got %q", n+1, test.err, got)
225+
}
226+
}
227+
}
228+
229+
func TestHAProxyDefaults(t *testing.T) {
230+
defaults := `
231+
global
232+
log 127.0.0.1 local2
233+
234+
chroot /var/lib/haproxy
235+
pidfile /var/run/haproxy.pid
236+
maxconn 4000
237+
user haproxy
238+
group haproxy
239+
240+
defaults
241+
log global
242+
mode tcp
243+
option dontlognull
244+
option tcplog
245+
option redispatch
246+
retries 3
247+
timeout http-request 100s
248+
timeout queue 1m
249+
timeout connect 10s
250+
timeout client 1m
251+
timeout server 1m
252+
timeout http-keep-alive 100s
253+
timeout check 10s
254+
`
255+
cmd := exec.Command("./egress-dns-proxy.sh")
256+
cmd.Env = []string{
257+
"EGRESS_DNS_PROXY_MODE=unit-test",
258+
"EGRESS_SOURCE=1.2.3.4",
259+
"EGRESS_DESTINATION=80 11.12.13.14",
260+
}
261+
out, err := cmd.CombinedOutput()
262+
if err != nil {
263+
t.Fatalf("unexpected error %v", err)
264+
}
265+
if !strings.Contains(string(out), defaults) {
266+
t.Fatalf("expected defaults in output %q but got %q", defaults, string(out))
267+
}
268+
}
269+
270+
func TestHAProxyResolver(t *testing.T) {
271+
resolverRegex := "resolvers dns-resolver\n *(nameserver ns.*)+\n +"
272+
273+
cmd := exec.Command("./egress-dns-proxy.sh")
274+
cmd.Env = []string{
275+
"EGRESS_DNS_PROXY_MODE=unit-test",
276+
"EGRESS_SOURCE=1.2.3.4",
277+
"EGRESS_DESTINATION=80 11.12.13.14",
278+
}
279+
outBytes, err := cmd.CombinedOutput()
280+
if err != nil {
281+
t.Fatalf("unexpected error %v", err)
282+
}
283+
out := string(outBytes)
284+
match, er := regexp.MatchString(resolverRegex, out)
285+
if !match || er != nil {
286+
t.Fatalf("dns resolver section not found in output %q", out)
287+
}
288+
}

0 commit comments

Comments
 (0)