@@ -4,6 +4,9 @@ package caddy_remote_host
4
4
// public API see package caddy_remote_host_test.
5
5
6
6
import (
7
+ "context"
8
+ "errors"
9
+ "net"
7
10
"testing"
8
11
9
12
"github.com/caddyserver/caddy/v2"
@@ -19,5 +22,81 @@ func TestMatchRemoteHost_Provision(t *testing.T) {
19
22
require .NoError (t , err )
20
23
assert .NotNil (t , subject .logger )
21
24
assert .NotNil (t , subject .cache )
25
+ assert .Nil (t , subject .resolver )
22
26
assert .NotNil (t , hostRegex )
23
27
}
28
+
29
+ type lookupResult struct {
30
+ ips []net.IPAddr
31
+ err error
32
+ }
33
+
34
+ func resolvesTo (ips ... string ) lookupResult {
35
+ r := lookupResult {ips : make ([]net.IPAddr , len (ips ))}
36
+ for i , ip := range ips {
37
+ r .ips [i ] = net.IPAddr {IP : net .ParseIP (ip )}
38
+ }
39
+ return r
40
+ }
41
+
42
+ type mockResolver struct {
43
+ addrs map [string ]lookupResult
44
+ }
45
+
46
+ func (m * mockResolver ) LookupIPAddr (_ context.Context , h string ) ([]net.IPAddr , error ) {
47
+ if result , ok := m .addrs [h ]; ok {
48
+ return result .ips , result .err
49
+ }
50
+ return nil , errors .New ("no suitable address found" )
51
+ }
52
+
53
+ func TestMatchRemoteHost_resolveIPs (t * testing.T ) {
54
+ mock := & mockResolver {
55
+ addrs : map [string ]lookupResult {
56
+ "example.com" : resolvesTo ("127.0.0.1" , "127.0.0.2" ),
57
+ "example.org" : resolvesTo ("::1" , "fe80::1" ),
58
+ "nil.records.example" : {},
59
+ "no.records.example" : {ips : make ([]net.IPAddr , 0 )},
60
+ },
61
+ }
62
+
63
+ subject := MatchRemoteHost {resolver : mock }
64
+ for host := range mock .addrs {
65
+ subject .Hosts = append (subject .Hosts , host )
66
+ }
67
+
68
+ require .NoError (t , subject .Provision (caddy.Context {}))
69
+ ips , err := subject .resolveIPs ()
70
+ require .NoError (t , err )
71
+
72
+ var haveIPs []string
73
+ for _ , result := range mock .addrs {
74
+ for _ , ip := range result .ips {
75
+ haveIPs = append (haveIPs , ip .String ())
76
+ }
77
+ }
78
+
79
+ wantIPs := make ([]string , len (ips ))
80
+ for i , ip := range ips {
81
+ wantIPs [i ] = ip .String ()
82
+ }
83
+
84
+ assert .ElementsMatch (t , haveIPs , wantIPs )
85
+ }
86
+
87
+ func TestMatchRemoteHost_resolveIPs_failure (t * testing.T ) {
88
+ subject := MatchRemoteHost {
89
+ Hosts : []string {"example.com" },
90
+ resolver : & mockResolver {map [string ]lookupResult {
91
+ "example.com" : {err : & net.DNSError {Err : "no suitable host found" }},
92
+ }},
93
+ }
94
+
95
+ require .NoError (t , subject .Provision (caddy.Context {}))
96
+
97
+ ips , err := subject .resolveIPs ()
98
+ // XXX: the expected message is constructed within package net
99
+ // and might change with future Go versions
100
+ assert .EqualError (t , err , "lookup : no suitable host found" )
101
+ assert .Empty (t , ips )
102
+ }
0 commit comments