From bdbb8da05ffb9f14eecef604dda1993b6c3d92f0 Mon Sep 17 00:00:00 2001 From: nathan Date: Thu, 20 Aug 2020 22:39:17 +0200 Subject: [PATCH] Fixed issues with mac address conversion + added unit test --- src/dorkbox/netUtil/Mac.kt | 23 +++++++++++------- test/dorkbox/netUtil/NetUtilTest.kt | 37 ++++++++++++++++------------- 2 files changed, 35 insertions(+), 25 deletions(-) diff --git a/src/dorkbox/netUtil/Mac.kt b/src/dorkbox/netUtil/Mac.kt index 07ead50..58c79b8 100644 --- a/src/dorkbox/netUtil/Mac.kt +++ b/src/dorkbox/netUtil/Mac.kt @@ -242,12 +242,13 @@ object Mac { * Converts a long into a properly formatted lower-case string */ fun toStringLowerCase(mac: Long): String { - // we only use the right-most 6 bytes (of 8 bytes). val macBytes = toBytes(mac) - // mac should have 6 bytes. + // mac should have AT LEAST bytes. val buf = StringBuilder() - (0..8).forEach { index -> + + // we only use the right-most 6 bytes (of 8 bytes). + (2..7).forEach { index -> val byte = macBytes[index] if (buf.isNotEmpty()) { buf.append(':') @@ -257,7 +258,7 @@ object Mac { buf.append('0') } - buf.append(Integer.toHexString(byte.toInt() and 0xFF)) + buf.append(Integer.toHexString(byte.toUByte().toInt())) } return buf.toString() @@ -268,9 +269,9 @@ object Mac { // we only use the right-most 6 bytes. val macBytes = toBytes(mac) - // mac should have 6 bytes. + // we only use the right-most 6 bytes (of 8 bytes). var bytesWritten = 0 - (0..8).forEach { index -> + (2..7).forEach { index -> val byte = macBytes[index] if (bytesWritten != 0) { @@ -346,7 +347,12 @@ object Mac { } fun toLong(mac: ByteArray): Long { - return ((mac[5].toLong() and 0xff) + (mac[4].toLong() and 0xff shl 8) + (mac[3].toLong() and 0xff shl 16) + (mac[2].toLong() and 0xff shl 24) + (mac[1].toLong() and 0xff shl 32) + (mac[0].toLong() and 0xff shl 40)) + return ((mac[5].toLong() and 0xff) + + (mac[4].toLong() and 0xff shl 8) + + (mac[3].toLong() and 0xff shl 16) + + (mac[2].toLong() and 0xff shl 24) + + (mac[1].toLong() and 0xff shl 32) + + (mac[0].toLong() and 0xff shl 40)) } fun toLong(mac: String, delimiter: MacDelimiter? = MacDelimiter.COLON): Long { @@ -370,8 +376,7 @@ object Mac { for (i in 0 until MAC_ADDRESS_LENGTH) { val element = elements[i] - addressInBytes[i] = element!!.toInt(16) - .toByte() + addressInBytes[i] = element!!.toInt(16).toByte() } } catch (e: Exception) { Common.logger.error("Error parsing MAC address '{}'", mac, e) diff --git a/test/dorkbox/netUtil/NetUtilTest.kt b/test/dorkbox/netUtil/NetUtilTest.kt index f1a3fc3..6f639e9 100644 --- a/test/dorkbox/netUtil/NetUtilTest.kt +++ b/test/dorkbox/netUtil/NetUtilTest.kt @@ -745,6 +745,11 @@ class NetUtilTest { } } + @Test + fun testMac() { + assertEquals("12:12:12:12:12:12", Mac.toStringLowerCase(Mac.toLong("12:12:12:12:12:12"))) + } + @Test fun testIsPrivate() { assertTrue(IPv4.isPrivate("192.168.23.102")) @@ -755,27 +760,27 @@ class NetUtilTest { @Test fun testIp4Range() { - assertTrue("", IPv4.isInRange(IPv4.toInt("10.10.10.5"), IPv4.toInt("10.10.10.10"), 24)) - assertTrue("", IPv4.isInRange(IPv4.toInt("10.0.0.5"), IPv4.toInt("10.10.10.10"), 8)) - assertFalse("", IPv4.isInRange(IPv4.toInt("11.0.0.5"), IPv4.toInt("10.10.10.10"), 8)) - assertTrue("", IPv4.isInRange(IPv4.toInt("11.0.0.5"), IPv4.toInt("10.10.10.10"), 1)) - assertTrue("", IPv4.isInRange(IPv4.toInt("11.0.0.5"), IPv4.toInt("10.10.10.10"), 0)) - assertFalse("", IPv4.isInRange(IPv4.toInt("11.0.0.5"), IPv4.toInt("10.10.10.10"), 32)) - assertTrue("", IPv4.isInRange(IPv4.toInt("10.10.10.10"), IPv4.toInt("10.10.10.10"), 32)) - assertTrue("", IPv4.isInRange(IPv4.toInt("10.10.10.10"), IPv4.toInt("10.10.10.10"), 31)) - assertTrue("", IPv4.isInRange(IPv4.toInt("10.10.10.10"), IPv4.toInt("10.10.10.10"), 30)) - assertTrue("", IPv4.isInRange(IPv4.toInt("192.168.42.14"), IPv4.toInt("192.168.0.0"), 16)) - assertTrue("", IPv4.isInRange(IPv4.toInt("192.168.0.0"), IPv4.toInt("192.168.0.0"), 16)) + assertTrue(IPv4.isInRange("10.10.10.5", "10.10.10.10", 24)) + assertTrue(IPv4.isInRange("10.0.0.5", "10.10.10.10", 8)) + assertFalse(IPv4.isInRange("11.0.0.5", "10.10.10.10", 8)) + assertTrue(IPv4.isInRange("11.0.0.5", "10.10.10.10", 1)) + assertTrue(IPv4.isInRange("11.0.0.5", "10.10.10.10", 0)) + assertFalse(IPv4.isInRange("11.0.0.5", "10.10.10.10", 32)) + assertTrue(IPv4.isInRange("10.10.10.10", "10.10.10.10", 32)) + assertTrue(IPv4.isInRange("10.10.10.10", "10.10.10.10", 31)) + assertTrue(IPv4.isInRange("10.10.10.10", "10.10.10.10", 30)) + assertTrue(IPv4.isInRange("192.168.42.14", "192.168.0.0", 16)) + assertTrue(IPv4.isInRange("192.168.0.0", "192.168.0.0", 16)) } @Test fun testCidr() { - assertTrue("", IPv4.isValidCidr("10.10.10.5/0")) - assertTrue("", IPv4.isValidCidr("10.10.10.5/24")) - assertTrue("", IPv4.isValidCidr("10.10.10.5/32")) - assertFalse("", IPv4.isValidCidr("10.10.10.5/33")) - assertFalse("", IPv4.isValidCidr("10.10.10.5/-1")) + assertTrue(IPv4.isValidCidr("10.10.10.5/0")) + assertTrue(IPv4.isValidCidr("10.10.10.5/24")) + assertTrue(IPv4.isValidCidr("10.10.10.5/32")) + assertFalse(IPv4.isValidCidr("10.10.10.5/33")) + assertFalse(IPv4.isValidCidr("10.10.10.5/-1")) } @Test