@@ -383,3 +383,38 @@ var _ = Describe("ClusterClient", func() {
383383 })
384384 })
385385})
386+
387+ var _ = Describe ("isLoopback" , func () {
388+ DescribeTable ("should correctly identify loopback addresses" ,
389+ func (host string , expected bool ) {
390+ result := isLoopback (host )
391+ Expect (result ).To (Equal (expected ))
392+ },
393+ // IP addresses
394+ Entry ("IPv4 loopback" , "127.0.0.1" , true ),
395+ Entry ("IPv6 loopback" , "::1" , true ),
396+ Entry ("IPv4 non-loopback" , "192.168.1.1" , false ),
397+ Entry ("IPv6 non-loopback" , "2001:db8::1" , false ),
398+
399+ // Well-known loopback hostnames
400+ Entry ("localhost lowercase" , "localhost" , true ),
401+ Entry ("localhost uppercase" , "LOCALHOST" , true ),
402+ Entry ("localhost mixed case" , "LocalHost" , true ),
403+
404+ // Docker-specific loopbacks
405+ Entry ("host.docker.internal" , "host.docker.internal" , true ),
406+ Entry ("HOST.DOCKER.INTERNAL" , "HOST.DOCKER.INTERNAL" , true ),
407+ Entry ("custom.docker.internal" , "custom.docker.internal" , true ),
408+ Entry ("app.docker.internal" , "app.docker.internal" , true ),
409+
410+ // Non-loopback hostnames
411+ Entry ("redis hostname" , "redis-cluster" , false ),
412+ Entry ("FQDN" , "redis.example.com" , false ),
413+ Entry ("docker but not internal" , "redis.docker.com" , false ),
414+
415+ // Edge cases
416+ Entry ("empty string" , "" , false ),
417+ Entry ("invalid IP" , "256.256.256.256" , false ),
418+ Entry ("partial docker internal" , "docker.internal" , false ),
419+ )
420+ })
0 commit comments