Skip to content

Commit 021c3ea

Browse files
author
Ravi Sankar Penta
committed
Added test cases for dns proxy egress router mode
1 parent 001ff55 commit 021c3ea

File tree

1 file changed

+255
-0
lines changed

1 file changed

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

0 commit comments

Comments
 (0)