Skip to content

Commit

Permalink
Added IPAddressLocalityChecker + test for checking if an IP address i…
Browse files Browse the repository at this point in the history
…s local or not.
  • Loading branch information
flemming-n-larsen committed Sep 15, 2024
1 parent 530a8b1 commit fa559ed
Show file tree
Hide file tree
Showing 3 changed files with 84 additions and 0 deletions.
2 changes: 2 additions & 0 deletions gui-app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@ plugins {
dependencies {
implementation(libs.kotlinx.serialization.json)
implementation(libs.miglayout.swing)

testImplementation(testLibs.kotest.junit5)
}

java {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package dev.robocode.tankroyale.gui.util

import java.net.InetAddress
import java.net.Inet4Address
import java.net.Inet6Address

fun isLocalAddress(ipAddress: String): Boolean {
return try {
val addr = InetAddress.getByName(ipAddress)
when (addr) {
is Inet4Address -> isLocalIPv4(addr)
is Inet6Address -> isLocalIPv6(addr)
else -> false
}
} catch (e: Exception) {
println("Error: ${e.message}")
false
}
}

private fun isLocalIPv4(addr: Inet4Address): Boolean {
return addr.isLoopbackAddress ||
addr.isLinkLocalAddress ||
addr.isSiteLocalAddress ||
addr.hostAddress.startsWith("169.254.") // IPv4 link-local
}

private fun isLocalIPv6(addr: Inet6Address): Boolean {
return addr.isLoopbackAddress ||
addr.isLinkLocalAddress ||
addr.isSiteLocalAddress ||
addr.hostAddress.lowercase().startsWith("fc") || // ULA
addr.hostAddress.lowercase().startsWith("fd") // ULA
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package dev.robocode.tankroyale.gui.util

import io.kotest.core.spec.style.StringSpec
import io.kotest.matchers.shouldBe

class IPAddressLocalityCheckerTest : StringSpec({
"isLocalAddress should return true for local addresses" {
val localAddresses = listOf(
"127.0.0.1",
"10.0.0.1",
"192.168.1.1",
"172.16.0.1",
"::1",
"fe80::1234:5678:9abc",
"fc00::1",
"fd00::1",
"fe80:0:0:0:d4da:d362:c269:663f%ethernet_32769",
)
localAddresses.forEach {
isLocalAddress(it) shouldBe true
}
}

"isLocalAddress should return false for non-local valid addresses" {
val nonLocalAddresses = listOf(
"8.8.8.8",
"2001:db8::1",
)
nonLocalAddresses.forEach {
isLocalAddress(it) shouldBe false
}
}

"isLocalAddress should return false for invalid addresses" {
val nonLocalAddresses = listOf(
"1",
"1.2",
"1.2.3",
"1.2.3:1",
"1:2:3:4:5:6:7:8",
"::",
"::2",
)
nonLocalAddresses.forEach {
isLocalAddress(it) shouldBe false
}
}
})

0 comments on commit fa559ed

Please sign in to comment.