From ed0644035f5f53c451f3a26d9adeb6a1d653095d Mon Sep 17 00:00:00 2001 From: rcourtman Date: Mon, 1 Dec 2025 20:34:48 +0000 Subject: [PATCH] test: Add tests for sanitizeGuestAddressStrings, parseContainerConfigNetworks, mergeNVMeTempsIntoDisks - sanitizeGuestAddressStrings: IPv6 loopback with CIDR (::1/128) edge case (96.2% -> 100%) - parseContainerConfigNetworks: parts without equals, mac/ips/ip6addr/ip6prefix key variants, whitespace-only values, all-empty results (97.2% -> 100%) - mergeNVMeTempsIntoDisks: NVMe disk with no legacy temps (continue branch), more disks than temps (break branch) (97% -> 100%) --- internal/monitoring/container_parsing_test.go | 97 +++++++++++++++++++ internal/monitoring/helpers_test.go | 2 + internal/monitoring/merge_temps_test.go | 53 ++++++++++ 3 files changed, 152 insertions(+) diff --git a/internal/monitoring/container_parsing_test.go b/internal/monitoring/container_parsing_test.go index 7a0f9d6..68f5c79 100644 --- a/internal/monitoring/container_parsing_test.go +++ b/internal/monitoring/container_parsing_test.go @@ -434,6 +434,103 @@ func TestParseContainerConfigNetworks(t *testing.T) { }, }, }, + { + name: "parts without equals sign skipped", + input: map[string]interface{}{ + "net0": "name=eth0,invalidpart,hwaddr=AA:BB:CC:DD:EE:FF", + }, + want: []containerNetworkDetails{ + { + Name: "eth0", + MAC: "AA:BB:CC:DD:EE:FF", + }, + }, + }, + { + name: "mac key variant", + input: map[string]interface{}{ + "net0": "name=eth0,mac=AA:BB:CC:DD:EE:FF", + }, + want: []containerNetworkDetails{ + { + Name: "eth0", + MAC: "AA:BB:CC:DD:EE:FF", + }, + }, + }, + { + name: "ips key variant", + input: map[string]interface{}{ + "net0": "name=eth0,ips=192.168.1.100", + }, + want: []containerNetworkDetails{ + { + Name: "eth0", + Addresses: []string{"192.168.1.100"}, + }, + }, + }, + { + name: "ip6addr key variant", + input: map[string]interface{}{ + "net0": "name=eth0,ip6addr=2001:db8::1", + }, + want: []containerNetworkDetails{ + { + Name: "eth0", + Addresses: []string{"2001:db8::1"}, + }, + }, + }, + { + name: "ip6prefix key variant", + input: map[string]interface{}{ + "net0": "name=eth0,ip6prefix=2001:db8::", + }, + want: []containerNetworkDetails{ + { + Name: "eth0", + Addresses: []string{"2001:db8::"}, + }, + }, + }, + { + name: "whitespace only interface value", + input: map[string]interface{}{ + "net0": " ", + }, + want: nil, + }, + { + name: "all empty net values returns nil", + input: map[string]interface{}{ + "net0": "", + "net1": " ", + }, + want: nil, + }, + { + name: "only unrecognized keys uses key as name", + input: map[string]interface{}{ + "net0": "unknown=value,other=data", + }, + want: []containerNetworkDetails{ + { + Name: "net0", + }, + }, + }, + { + name: "value parts only without equals", + input: map[string]interface{}{ + "net0": "noequals,alsonoequals", + }, + want: []containerNetworkDetails{ + { + Name: "net0", + }, + }, + }, } for _, tt := range tests { diff --git a/internal/monitoring/helpers_test.go b/internal/monitoring/helpers_test.go index f8cb366..f189059 100644 --- a/internal/monitoring/helpers_test.go +++ b/internal/monitoring/helpers_test.go @@ -434,6 +434,8 @@ func TestSanitizeGuestAddressStrings(t *testing.T) { {name: "filters loopback from list", input: "192.168.1.1,127.0.0.1,10.0.0.1", want: []string{"192.168.1.1", "10.0.0.1"}}, {name: "ipv6 zone identifier stripped", input: "2001:db8::1%eth0", want: []string{"2001:db8::1"}}, {name: "whitespace trimmed", input: " 192.168.1.100 ", want: []string{"192.168.1.100"}}, + // Edge case: ::1 with CIDR notation to hit the HasPrefix(lower, "::1") check after CIDR stripping + {name: "loopback ipv6 with cidr", input: "::1/128", want: nil}, } for _, tc := range cases { diff --git a/internal/monitoring/merge_temps_test.go b/internal/monitoring/merge_temps_test.go index b145ee1..503e398 100644 --- a/internal/monitoring/merge_temps_test.go +++ b/internal/monitoring/merge_temps_test.go @@ -231,6 +231,59 @@ func TestMergeNVMeTempsIntoDisks(t *testing.T) { {Node: "node1", DevPath: "/dev/nvme0n1", Type: "nvme", Temperature: 0}, }, }, + { + name: "NVMe disk with no legacy temps for node (continue branch)", + disks: []models.PhysicalDisk{ + {Node: "node1", DevPath: "/dev/nvme0n1", Type: "nvme", Temperature: 0}, + {Node: "node2", DevPath: "/dev/nvme0n1", Type: "nvme", Temperature: 0}, + }, + nodes: []models.Node{ + { + Name: "node1", + Temperature: &models.Temperature{ + Available: true, + NVMe: []models.NVMeTemp{ + {Device: "nvme0", Temp: 45.0}, + }, + }, + }, + { + Name: "node2", + Temperature: &models.Temperature{ + Available: true, + // No NVMe temps for node2, but SMART is empty too + }, + }, + }, + expected: []models.PhysicalDisk{ + {Node: "node1", DevPath: "/dev/nvme0n1", Type: "nvme", Temperature: 45}, + {Node: "node2", DevPath: "/dev/nvme0n1", Type: "nvme", Temperature: 0}, + }, + }, + { + name: "more NVMe disks than temps (break branch)", + disks: []models.PhysicalDisk{ + {Node: "node1", DevPath: "/dev/nvme0n1", Type: "nvme", Temperature: 0}, + {Node: "node1", DevPath: "/dev/nvme1n1", Type: "nvme", Temperature: 0}, + {Node: "node1", DevPath: "/dev/nvme2n1", Type: "nvme", Temperature: 0}, + }, + nodes: []models.Node{ + { + Name: "node1", + Temperature: &models.Temperature{ + Available: true, + NVMe: []models.NVMeTemp{ + {Device: "nvme0", Temp: 40.0}, + }, + }, + }, + }, + expected: []models.PhysicalDisk{ + {Node: "node1", DevPath: "/dev/nvme0n1", Type: "nvme", Temperature: 40}, + {Node: "node1", DevPath: "/dev/nvme1n1", Type: "nvme", Temperature: 0}, + {Node: "node1", DevPath: "/dev/nvme2n1", Type: "nvme", Temperature: 0}, + }, + }, } for _, tt := range tests {