@@ -383,3 +383,38 @@ var _ = Describe("ClusterClient", func() {
383
383
})
384
384
})
385
385
})
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