github.com/letsencrypt/boulder@v0.20251208.0/ratelimits/utilities_test.go (about) 1 package ratelimits 2 3 import ( 4 "net/netip" 5 "slices" 6 "testing" 7 8 "github.com/letsencrypt/boulder/identifier" 9 ) 10 11 func TestCoveringIdentifiers(t *testing.T) { 12 cases := []struct { 13 name string 14 idents identifier.ACMEIdentifiers 15 wantErr string 16 want []string 17 }{ 18 { 19 name: "empty string", 20 idents: identifier.ACMEIdentifiers{ 21 identifier.NewDNS(""), 22 }, 23 wantErr: "name is blank", 24 want: nil, 25 }, 26 { 27 name: "two subdomains of same domain", 28 idents: identifier.NewDNSSlice([]string{"www.example.com", "example.com"}), 29 want: []string{"example.com"}, 30 }, 31 { 32 name: "three subdomains across two domains", 33 idents: identifier.NewDNSSlice([]string{"www.example.com", "example.com", "www.example.co.uk"}), 34 want: []string{"example.co.uk", "example.com"}, 35 }, 36 { 37 name: "three subdomains across two domains, plus a bare TLD", 38 idents: identifier.NewDNSSlice([]string{"www.example.com", "example.com", "www.example.co.uk", "co.uk"}), 39 want: []string{"co.uk", "example.co.uk", "example.com"}, 40 }, 41 { 42 name: "two subdomains of same domain, one of them long", 43 idents: identifier.NewDNSSlice([]string{"foo.bar.baz.www.example.com", "baz.example.com"}), 44 want: []string{"example.com"}, 45 }, 46 { 47 name: "a domain and two of its subdomains", 48 idents: identifier.NewDNSSlice([]string{"github.io", "foo.github.io", "bar.github.io"}), 49 want: []string{"bar.github.io", "foo.github.io", "github.io"}, 50 }, 51 { 52 name: "a domain and an IPv4 address", 53 idents: identifier.ACMEIdentifiers{ 54 identifier.NewDNS("example.com"), 55 identifier.NewIP(netip.MustParseAddr("127.0.0.1")), 56 }, 57 want: []string{"127.0.0.1/32", "example.com"}, 58 }, 59 { 60 name: "an IPv6 address", 61 idents: identifier.ACMEIdentifiers{ 62 identifier.NewIP(netip.MustParseAddr("3fff:aaa:aaaa:aaaa:abad:0ff1:cec0:ffee")), 63 }, 64 want: []string{"3fff:aaa:aaaa:aaaa::/64"}, 65 }, 66 { 67 name: "four IP addresses in three prefixes", 68 idents: identifier.ACMEIdentifiers{ 69 identifier.NewIP(netip.MustParseAddr("127.0.0.1")), 70 identifier.NewIP(netip.MustParseAddr("127.0.0.254")), 71 identifier.NewIP(netip.MustParseAddr("3fff:aaa:aaaa:aaaa:abad:0ff1:cec0:ffee")), 72 identifier.NewIP(netip.MustParseAddr("3fff:aaa:aaaa:ffff:abad:0ff1:cec0:ffee")), 73 }, 74 want: []string{"127.0.0.1/32", "127.0.0.254/32", "3fff:aaa:aaaa:aaaa::/64", "3fff:aaa:aaaa:ffff::/64"}, 75 }, 76 } 77 for _, tc := range cases { 78 t.Run(tc.name, func(t *testing.T) { 79 t.Parallel() 80 81 got, err := coveringIdentifiers(tc.idents) 82 if err != nil && err.Error() != tc.wantErr { 83 t.Errorf("Got unwanted error %#v", err.Error()) 84 } 85 if err == nil && tc.wantErr != "" { 86 t.Errorf("Got no error, wanted %#v", tc.wantErr) 87 } 88 if !slices.Equal(got, tc.want) { 89 t.Errorf("Got %#v, but want %#v", got, tc.want) 90 } 91 }) 92 } 93 }