github.com/gravitational/teleport/api@v0.0.0-20240507183017-3110591cbafc/utils/addr_test.go (about)

     1  /*
     2  Copyright 2021 Gravitational, Inc.
     3  
     4  Licensed under the Apache License, Version 2.0 (the "License");
     5  you may not use this file except in compliance with the License.
     6  You may obtain a copy of the License at
     7  
     8      http://www.apache.org/licenses/LICENSE-2.0
     9  
    10  Unless required by applicable law or agreed to in writing, software
    11  distributed under the License is distributed on an "AS IS" BASIS,
    12  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13  See the License for the specific language governing permissions and
    14  limitations under the License.
    15  */
    16  
    17  package utils
    18  
    19  import (
    20  	"context"
    21  	"errors"
    22  	"net"
    23  	"testing"
    24  
    25  	"github.com/stretchr/testify/require"
    26  )
    27  
    28  type mockResolver struct {
    29  	addresses []net.IPAddr
    30  	err       error
    31  }
    32  
    33  func (r *mockResolver) LookupIPAddr(ctx context.Context, host string) ([]net.IPAddr, error) {
    34  	if r.err != nil {
    35  		return nil, r.err
    36  	}
    37  
    38  	return r.addresses, nil
    39  }
    40  
    41  func TestIsLoopback(t *testing.T) {
    42  	testCases := []struct {
    43  		desc     string
    44  		addr     string
    45  		resolver nameResolver
    46  		expect   bool
    47  	}{
    48  		{
    49  			desc:     "localhost should return true",
    50  			addr:     "localhost",
    51  			resolver: net.DefaultResolver,
    52  			expect:   true,
    53  		}, {
    54  			desc:     "localhost with port should return true",
    55  			addr:     "localhost:1234",
    56  			resolver: net.DefaultResolver,
    57  			expect:   true,
    58  		}, {
    59  			desc: "multiple loopback addresses should return true",
    60  			addr: "potato.banana.org",
    61  			resolver: &mockResolver{
    62  				addresses: []net.IPAddr{
    63  					{IP: net.IPv6loopback},
    64  					{IP: []byte{127, 0, 0, 1}},
    65  				},
    66  			},
    67  			expect: true,
    68  		}, {
    69  			desc:     "degenerate hostname should return false",
    70  			addr:     ":1234",
    71  			resolver: net.DefaultResolver,
    72  			expect:   false,
    73  		}, {
    74  			desc:     "degenerate port should return true",
    75  			addr:     "localhost:",
    76  			resolver: net.DefaultResolver,
    77  			expect:   true,
    78  		}, {
    79  			desc:     "DNS failure should return false",
    80  			addr:     "potato.banana.org",
    81  			resolver: &mockResolver{err: errors.New("kaboom")},
    82  			expect:   false,
    83  		}, {
    84  			desc: "non-loopback addr should return false",
    85  			addr: "potato.banana.org",
    86  			resolver: &mockResolver{
    87  				addresses: []net.IPAddr{
    88  					{IP: []byte{192, 168, 0, 1}}, // private, but non-loopback
    89  				},
    90  			},
    91  			expect: false,
    92  		}, {
    93  			desc: "Any non-looback address should return false",
    94  			addr: "potato.banana.org",
    95  			resolver: &mockResolver{
    96  				addresses: []net.IPAddr{
    97  					{IP: net.IPv6loopback},
    98  					{IP: []byte{192, 168, 0, 1}}, // private, but non-loopback
    99  					{IP: []byte{127, 0, 0, 1}},
   100  				},
   101  			},
   102  			expect: false,
   103  		},
   104  	}
   105  
   106  	for _, tc := range testCases {
   107  		t.Run(tc.desc, func(t *testing.T) {
   108  			require.Equal(t, tc.expect, isLoopbackWithResolver(tc.addr, tc.resolver))
   109  		})
   110  	}
   111  }