File: range_test.go

package info (click to toggle)
incus 6.0.5-7
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 25,788 kB
  • sloc: sh: 16,313; ansic: 3,121; python: 457; makefile: 337; ruby: 51; sql: 50; lisp: 6
file content (136 lines) | stat: -rw-r--r-- 2,755 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
package iprange_test

import (
	"net"
	"strings"
	"testing"

	"github.com/stretchr/testify/assert"

	"github.com/lxc/incus/v6/internal/iprange"
)

// parseRange is a custom parse function to not depend on other packages.
func parseRange(rangeString string) iprange.Range {
	ips := strings.Split(rangeString, "-")

	start := net.ParseIP(ips[0])

	var end net.IP
	if len(ips) == 2 {
		end = net.ParseIP(ips[1])
	}

	return iprange.Range{
		Start: start,
		End:   end,
	}
}

func TestRange_ContainsIP(t *testing.T) {
	type containsIPTest struct {
		name        string
		rangeString string // a string of format <ip>-<ip> optionally just an <ip>
		testIP      string
		expected    bool
	}

	tests := []containsIPTest{
		{
			name:        "ip below range",
			rangeString: "10.10.0.0-10.16.0.0",
			testIP:      "10.0.0.1",
			expected:    false,
		},
		{
			name:        "ip is lower bound",
			rangeString: "10.10.0.0-10.16.0.0",
			testIP:      "10.10.0.0",
			expected:    true,
		},
		{
			name:        "ip in range",
			rangeString: "10.10.0.0-10.16.0.0",
			testIP:      "10.12.59.1",
			expected:    true,
		},
		{
			name:        "ip is upper bound",
			rangeString: "10.10.0.0-10.16.0.0",
			testIP:      "10.16.0.0",
			expected:    true,
		},
		{
			name:        "ip above range",
			rangeString: "10.10.0.0-10.16.0.0",
			testIP:      "10.23.59.1",
			expected:    false,
		},
		{
			name:        "range has no end and ip is below range",
			rangeString: "10.10.0.1",
			testIP:      "10.2.59.1",
			expected:    false,
		},
		{
			name:        "range has no end and ip is in range",
			rangeString: "10.10.0.1",
			testIP:      "10.10.0.1",
			expected:    true,
		},
		{
			name:        "range has no end and ip is above range",
			rangeString: "10.10.0.1",
			testIP:      "10.23.59.1",
			expected:    false,
		},
	}

	for _, test := range tests {
		t.Run(test.name, func(t *testing.T) {
			// arrange
			r := parseRange(test.rangeString)
			testIP := net.ParseIP(test.testIP)

			// act
			isContained := r.ContainsIP(testIP)

			// assert
			assert.Equal(t, test.expected, isContained)
		})
	}
}

func TestRange_String(t *testing.T) {
	type stringTest struct {
		name        string
		rangeString string // a string of format <ip>-<ip> optionally just an <ip>
		expected    string
	}

	tests := []stringTest{
		{
			name:        "start and end",
			rangeString: "10.10.0.0-10.16.0.5",
			expected:    "10.10.0.0-10.16.0.5",
		},
		{
			name:        "start only",
			rangeString: "10.10.0.0",
			expected:    "10.10.0.0",
		},
	}

	for _, test := range tests {
		t.Run(test.name, func(t *testing.T) {
			// arrange
			r := parseRange(test.rangeString)

			// act
			s := r.String()

			// assert
			assert.Equal(t, test.expected, s)
		})
	}
}