Skip to content

Commit 6e236f3

Browse files
committed
feat: enhance IP address handling in tests with mixed scenarios and edge cases
1 parent d4a97c4 commit 6e236f3

File tree

3 files changed

+121
-4
lines changed

3 files changed

+121
-4
lines changed

pkg/controller/ippool_test.go

Lines changed: 72 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,9 @@ func TestExpandIPPoolAddresses(t *testing.T) {
1818
})
1919
require.NoError(t, err)
2020
require.Equal(t, []string{
21-
"10.0.0.1",
21+
"10.0.0.1/32",
2222
"192.168.1.0/24",
23-
"2001:db8::1",
23+
"2001:db8::1/128",
2424
}, addresses)
2525
}
2626

@@ -70,7 +70,8 @@ func TestExpandIPPoolAddressesEdgeCases(t *testing.T) {
7070
"10.0.0.1",
7171
})
7272
require.NoError(t, err)
73-
require.Equal(t, []string{"10.0.0.1/32"}, addresses)
73+
require.Len(t, addresses, 1)
74+
require.Equal(t, "10.0.0.1/32", addresses[0])
7475
})
7576

7677
t.Run("CIDR normalization", func(t *testing.T) {
@@ -364,6 +365,74 @@ func TestExpandIPPoolAddressesForOVNIntegration(t *testing.T) {
364365
require.Error(t, err)
365366
require.Contains(t, err.Error(), "mixed IPv4 and IPv6")
366367
})
368+
369+
t.Run("Range expansion with simplification", func(t *testing.T) {
370+
// Range that expands to /32 should be simplified
371+
addresses, err := util.ExpandIPPoolAddressesForOVN([]string{
372+
"10.0.0.1..10.0.0.1", // Single IP range
373+
})
374+
require.NoError(t, err)
375+
require.Len(t, addresses, 1)
376+
require.Equal(t, "10.0.0.1", addresses[0])
377+
require.NotContains(t, addresses[0], "/32")
378+
})
379+
380+
t.Run("Range with multiple CIDRs - some simplified", func(t *testing.T) {
381+
addresses, err := util.ExpandIPPoolAddressesForOVN([]string{
382+
"10.0.0.1..10.0.0.5",
383+
})
384+
require.NoError(t, err)
385+
require.NotEmpty(t, addresses)
386+
// Should contain simplified /32 and non-simplified /31
387+
require.Contains(t, addresses, "10.0.0.1") // Simplified from /32
388+
require.Contains(t, addresses, "10.0.0.2/31") // Not /32, keep as-is
389+
require.Contains(t, addresses, "10.0.0.4/31") // Not /32, keep as-is
390+
})
391+
392+
t.Run("Empty input", func(t *testing.T) {
393+
addresses, err := util.ExpandIPPoolAddressesForOVN([]string{})
394+
require.NoError(t, err)
395+
require.Empty(t, addresses)
396+
})
397+
398+
t.Run("Only whitespace entries", func(t *testing.T) {
399+
addresses, err := util.ExpandIPPoolAddressesForOVN([]string{"", " ", "\t"})
400+
require.NoError(t, err)
401+
require.Empty(t, addresses)
402+
})
403+
404+
t.Run("IPv6 single IP simplified", func(t *testing.T) {
405+
addresses, err := util.ExpandIPPoolAddressesForOVN([]string{"2001:db8::1"})
406+
require.NoError(t, err)
407+
require.Len(t, addresses, 1)
408+
require.Equal(t, "2001:db8::1", addresses[0])
409+
require.NotContains(t, addresses[0], "/128")
410+
})
411+
412+
t.Run("IPv6 range with /128 simplified", func(t *testing.T) {
413+
addresses, err := util.ExpandIPPoolAddressesForOVN([]string{"fd00::1..fd00::1"})
414+
require.NoError(t, err)
415+
require.Len(t, addresses, 1)
416+
require.Equal(t, "fd00::1", addresses[0])
417+
})
418+
419+
t.Run("Duplicate IPs deduplicated and simplified", func(t *testing.T) {
420+
addresses, err := util.ExpandIPPoolAddressesForOVN([]string{
421+
"10.0.0.1",
422+
"10.0.0.1",
423+
" 10.0.0.1 ",
424+
})
425+
require.NoError(t, err)
426+
require.Len(t, addresses, 1)
427+
require.Equal(t, "10.0.0.1", addresses[0])
428+
})
429+
430+
t.Run("CIDR normalization preserved", func(t *testing.T) {
431+
addresses, err := util.ExpandIPPoolAddressesForOVN([]string{"192.168.1.5/24"})
432+
require.NoError(t, err)
433+
require.Len(t, addresses, 1)
434+
require.Equal(t, "192.168.1.0/24", addresses[0])
435+
})
367436
}
368437

369438
func TestExpandIPPoolAddressesGeneralUse(t *testing.T) {

pkg/ipam/ip_range_list_test.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1305,9 +1305,13 @@ func TestIPRangeListToCIDRs(t *testing.T) {
13051305
result, err := rangeList.ToCIDRs()
13061306
require.NoError(t, err)
13071307
// Should be merged into 10.0.0.1..10.0.0.10
1308+
// Which converts to: 10.0.0.1/32, 10.0.0.2/31, 10.0.0.4/30, 10.0.0.8/31, 10.0.0.10/32
13081309
require.NotEmpty(t, result)
13091310
require.Contains(t, result, "10.0.0.1/32")
1310-
require.Contains(t, result, "10.0.0.8/30")
1311+
require.Contains(t, result, "10.0.0.2/31")
1312+
require.Contains(t, result, "10.0.0.4/30")
1313+
require.Contains(t, result, "10.0.0.8/31")
1314+
require.Contains(t, result, "10.0.0.10/32")
13111315
})
13121316

13131317
t.Run("Multiple separate ranges", func(t *testing.T) {

pkg/util/ippool_test.go

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package util
33
import (
44
"math/big"
55
"net"
6+
"strings"
67
"testing"
78

89
"github.com/stretchr/testify/require"
@@ -257,6 +258,29 @@ func TestExpandIPPoolAddressesMixedAllowed(t *testing.T) {
257258
require.NoError(t, err)
258259
require.NotEmpty(t, result)
259260
})
261+
262+
t.Run("Complex mixed scenario", func(t *testing.T) {
263+
result, err := ExpandIPPoolAddresses([]string{
264+
"10.0.0.1",
265+
"192.168.0.0/16",
266+
"2001:db8::1..2001:db8::10",
267+
"fd00::/64",
268+
})
269+
require.NoError(t, err)
270+
require.NotEmpty(t, result)
271+
// Should contain both IPv4 and IPv6
272+
hasIPv4 := false
273+
hasIPv6 := false
274+
for _, addr := range result {
275+
if strings.Contains(addr, ":") {
276+
hasIPv6 = true
277+
} else {
278+
hasIPv4 = true
279+
}
280+
}
281+
require.True(t, hasIPv4, "Should contain IPv4 addresses")
282+
require.True(t, hasIPv6, "Should contain IPv6 addresses")
283+
})
260284
}
261285

262286
func TestCanonicalizeIPPoolEntries(t *testing.T) {
@@ -601,6 +625,26 @@ func TestSimplifyOVNAddress(t *testing.T) {
601625
result := simplifyOVNAddress("2001:db8::/127")
602626
require.Equal(t, "2001:db8::/127", result)
603627
})
628+
629+
t.Run("Edge case - /30", func(t *testing.T) {
630+
result := simplifyOVNAddress("10.0.0.0/30")
631+
require.Equal(t, "10.0.0.0/30", result)
632+
})
633+
634+
t.Run("Edge case - /126", func(t *testing.T) {
635+
result := simplifyOVNAddress("2001:db8::/126")
636+
require.Equal(t, "2001:db8::/126", result)
637+
})
638+
639+
t.Run("Empty string", func(t *testing.T) {
640+
result := simplifyOVNAddress("")
641+
require.Equal(t, "", result)
642+
})
643+
644+
t.Run("No slash at all", func(t *testing.T) {
645+
result := simplifyOVNAddress("10.0.0.1")
646+
require.Equal(t, "10.0.0.1", result)
647+
})
604648
}
605649

606650
func TestCompareIP(t *testing.T) {

0 commit comments

Comments
 (0)