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