github.com/netdata/go.d.plugin@v0.58.1/pkg/iprange/range_test.go (about)

     1  // SPDX-License-Identifier: GPL-3.0-or-later
     2  
     3  package iprange
     4  
     5  import (
     6  	"fmt"
     7  	"math/big"
     8  	"net"
     9  	"testing"
    10  
    11  	"github.com/stretchr/testify/assert"
    12  	"github.com/stretchr/testify/require"
    13  )
    14  
    15  func TestV4Range_String(t *testing.T) {
    16  	tests := map[string]struct {
    17  		input      string
    18  		wantString string
    19  	}{
    20  		"IP":    {input: "192.0.2.0", wantString: "192.0.2.0-192.0.2.0"},
    21  		"Range": {input: "192.0.2.0-192.0.2.10", wantString: "192.0.2.0-192.0.2.10"},
    22  		"CIDR":  {input: "192.0.2.0/24", wantString: "192.0.2.1-192.0.2.254"},
    23  		"Mask":  {input: "192.0.2.0/255.255.255.0", wantString: "192.0.2.1-192.0.2.254"},
    24  	}
    25  
    26  	for name, test := range tests {
    27  		t.Run(name, func(t *testing.T) {
    28  			r, err := ParseRange(test.input)
    29  			require.NoError(t, err)
    30  
    31  			assert.Equal(t, test.wantString, r.String())
    32  		})
    33  	}
    34  }
    35  
    36  func TestV4Range_Family(t *testing.T) {
    37  	tests := map[string]struct {
    38  		input string
    39  	}{
    40  		"IP":    {input: "192.0.2.0"},
    41  		"Range": {input: "192.0.2.0-192.0.2.10"},
    42  		"CIDR":  {input: "192.0.2.0/24"},
    43  		"Mask":  {input: "192.0.2.0/255.255.255.0"},
    44  	}
    45  
    46  	for name, test := range tests {
    47  		t.Run(name, func(t *testing.T) {
    48  			r, err := ParseRange(test.input)
    49  			require.NoError(t, err)
    50  
    51  			assert.Equal(t, V4Family, r.Family())
    52  		})
    53  	}
    54  }
    55  
    56  func TestV4Range_Size(t *testing.T) {
    57  	tests := map[string]struct {
    58  		input    string
    59  		wantSize *big.Int
    60  	}{
    61  		"IP":      {input: "192.0.2.0", wantSize: big.NewInt(1)},
    62  		"Range":   {input: "192.0.2.0-192.0.2.10", wantSize: big.NewInt(11)},
    63  		"CIDR":    {input: "192.0.2.0/24", wantSize: big.NewInt(254)},
    64  		"CIDR 31": {input: "192.0.2.0/31", wantSize: big.NewInt(2)},
    65  		"CIDR 32": {input: "192.0.2.0/32", wantSize: big.NewInt(1)},
    66  		"Mask":    {input: "192.0.2.0/255.255.255.0", wantSize: big.NewInt(254)},
    67  		"Mask 31": {input: "192.0.2.0/255.255.255.254", wantSize: big.NewInt(2)},
    68  		"Mask 32": {input: "192.0.2.0/255.255.255.255", wantSize: big.NewInt(1)},
    69  	}
    70  
    71  	for name, test := range tests {
    72  		t.Run(name, func(t *testing.T) {
    73  			r, err := ParseRange(test.input)
    74  			require.NoError(t, err)
    75  
    76  			assert.Equal(t, test.wantSize, r.Size())
    77  		})
    78  	}
    79  }
    80  
    81  func TestV4Range_Contains(t *testing.T) {
    82  	tests := map[string]struct {
    83  		input    string
    84  		ip       string
    85  		wantFail bool
    86  	}{
    87  		"inside":   {input: "192.0.2.0-192.0.2.10", ip: "192.0.2.5"},
    88  		"outside":  {input: "192.0.2.0-192.0.2.10", ip: "192.0.2.55", wantFail: true},
    89  		"eq start": {input: "192.0.2.0-192.0.2.10", ip: "192.0.2.0"},
    90  		"eq end":   {input: "192.0.2.0-192.0.2.10", ip: "192.0.2.10"},
    91  		"v6":       {input: "192.0.2.0-192.0.2.10", ip: "2001:db8::", wantFail: true},
    92  	}
    93  
    94  	for name, test := range tests {
    95  		name = fmt.Sprintf("%s (range: %s, ip: %s)", name, test.input, test.ip)
    96  		t.Run(name, func(t *testing.T) {
    97  			r, err := ParseRange(test.input)
    98  			require.NoError(t, err)
    99  			ip := net.ParseIP(test.ip)
   100  			require.NotNil(t, ip)
   101  
   102  			if test.wantFail {
   103  				assert.False(t, r.Contains(ip))
   104  			} else {
   105  				assert.True(t, r.Contains(ip))
   106  			}
   107  		})
   108  	}
   109  }
   110  
   111  func TestV6Range_String(t *testing.T) {
   112  	tests := map[string]struct {
   113  		input      string
   114  		wantString string
   115  	}{
   116  		"IP":    {input: "2001:db8::", wantString: "2001:db8::-2001:db8::"},
   117  		"Range": {input: "2001:db8::-2001:db8::10", wantString: "2001:db8::-2001:db8::10"},
   118  		"CIDR":  {input: "2001:db8::/126", wantString: "2001:db8::1-2001:db8::2"},
   119  	}
   120  
   121  	for name, test := range tests {
   122  		t.Run(name, func(t *testing.T) {
   123  			r, err := ParseRange(test.input)
   124  			require.NoError(t, err)
   125  
   126  			assert.Equal(t, test.wantString, r.String())
   127  		})
   128  	}
   129  }
   130  
   131  func TestV6Range_Family(t *testing.T) {
   132  	tests := map[string]struct {
   133  		input string
   134  	}{
   135  		"IP":    {input: "2001:db8::"},
   136  		"Range": {input: "2001:db8::-2001:db8::10"},
   137  		"CIDR":  {input: "2001:db8::/126"},
   138  	}
   139  
   140  	for name, test := range tests {
   141  		t.Run(name, func(t *testing.T) {
   142  			r, err := ParseRange(test.input)
   143  			require.NoError(t, err)
   144  
   145  			assert.Equal(t, V6Family, r.Family())
   146  		})
   147  	}
   148  }
   149  
   150  func TestV6Range_Size(t *testing.T) {
   151  	tests := map[string]struct {
   152  		input    string
   153  		wantSize *big.Int
   154  	}{
   155  		"IP":       {input: "2001:db8::", wantSize: big.NewInt(1)},
   156  		"Range":    {input: "2001:db8::-2001:db8::10", wantSize: big.NewInt(17)},
   157  		"CIDR":     {input: "2001:db8::/120", wantSize: big.NewInt(254)},
   158  		"CIDR 127": {input: "2001:db8::/127", wantSize: big.NewInt(2)},
   159  		"CIDR 128": {input: "2001:db8::/128", wantSize: big.NewInt(1)},
   160  	}
   161  
   162  	for name, test := range tests {
   163  		t.Run(name, func(t *testing.T) {
   164  			r, err := ParseRange(test.input)
   165  			require.NoError(t, err)
   166  
   167  			assert.Equal(t, test.wantSize, r.Size())
   168  		})
   169  	}
   170  }
   171  
   172  func TestV6Range_Contains(t *testing.T) {
   173  	tests := map[string]struct {
   174  		input    string
   175  		ip       string
   176  		wantFail bool
   177  	}{
   178  		"inside":   {input: "2001:db8::-2001:db8::10", ip: "2001:db8::5"},
   179  		"outside":  {input: "2001:db8::-2001:db8::10", ip: "2001:db8::ff", wantFail: true},
   180  		"eq start": {input: "2001:db8::-2001:db8::10", ip: "2001:db8::"},
   181  		"eq end":   {input: "2001:db8::-2001:db8::10", ip: "2001:db8::10"},
   182  		"v4":       {input: "2001:db8::-2001:db8::10", ip: "192.0.2.0", wantFail: true},
   183  	}
   184  
   185  	for name, test := range tests {
   186  		name = fmt.Sprintf("%s (range: %s, ip: %s)", name, test.input, test.ip)
   187  		t.Run(name, func(t *testing.T) {
   188  			r, err := ParseRange(test.input)
   189  			require.NoError(t, err)
   190  			ip := net.ParseIP(test.ip)
   191  			require.NotNil(t, ip)
   192  
   193  			if test.wantFail {
   194  				assert.False(t, r.Contains(ip))
   195  			} else {
   196  				assert.True(t, r.Contains(ip))
   197  			}
   198  		})
   199  	}
   200  }