From 87a004e47a353a4e584d6a7e6c2e376cff11cb25 Mon Sep 17 00:00:00 2001 From: YuCheng Hu Date: Sat, 27 Apr 2024 13:34:32 -0400 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20UUID=20=E6=96=87=E6=A1=A3?= =?UTF-8?q?=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../resources/log4jstructuraldp.properties | 9 +++ .../src/main/resources/logback.xml | 19 ++++++ .../DecodeUUIDStringFromBase64UnitTest.java | 64 +++++++++++++++++++ .../EncodeUUIDToBase64StringUnitTest.java | 62 ++++++++++++++++++ .../UUIDPositiveLongGeneratorUnitTest.java | 22 +++++++ .../src/test/resources/logback.xml | 18 ++++++ 6 files changed, 194 insertions(+) create mode 100644 core-java-modules/core-java-uuid/src/main/resources/log4jstructuraldp.properties create mode 100644 core-java-modules/core-java-uuid/src/main/resources/logback.xml create mode 100644 core-java-modules/core-java-uuid/src/test/java/com/ossez/uuid/DecodeUUIDStringFromBase64UnitTest.java create mode 100644 core-java-modules/core-java-uuid/src/test/java/com/ossez/uuid/EncodeUUIDToBase64StringUnitTest.java create mode 100644 core-java-modules/core-java-uuid/src/test/java/com/ossez/uuid/UUIDPositiveLongGeneratorUnitTest.java create mode 100644 core-java-modules/core-java-uuid/src/test/resources/logback.xml diff --git a/core-java-modules/core-java-uuid/src/main/resources/log4jstructuraldp.properties b/core-java-modules/core-java-uuid/src/main/resources/log4jstructuraldp.properties new file mode 100644 index 0000000000..5bc2bfe4b9 --- /dev/null +++ b/core-java-modules/core-java-uuid/src/main/resources/log4jstructuraldp.properties @@ -0,0 +1,9 @@ + +# Root logger +log4j.rootLogger=INFO, file, stdout + +# Write to console +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.Target=System.out +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n \ No newline at end of file diff --git a/core-java-modules/core-java-uuid/src/main/resources/logback.xml b/core-java-modules/core-java-uuid/src/main/resources/logback.xml new file mode 100644 index 0000000000..56af2d397e --- /dev/null +++ b/core-java-modules/core-java-uuid/src/main/resources/logback.xml @@ -0,0 +1,19 @@ + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core-java-modules/core-java-uuid/src/test/java/com/ossez/uuid/DecodeUUIDStringFromBase64UnitTest.java b/core-java-modules/core-java-uuid/src/test/java/com/ossez/uuid/DecodeUUIDStringFromBase64UnitTest.java new file mode 100644 index 0000000000..a0fffb1027 --- /dev/null +++ b/core-java-modules/core-java-uuid/src/test/java/com/ossez/uuid/DecodeUUIDStringFromBase64UnitTest.java @@ -0,0 +1,64 @@ +package com.ossez.uuid; + +import static org.apache.commons.codec.binary.Base64.decodeBase64; +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.nio.ByteBuffer; +import java.util.Base64; +import java.util.UUID; + +import org.apache.commons.lang3.Conversion; +import org.junit.jupiter.api.Test; + +public class DecodeUUIDStringFromBase64UnitTest { + private final UUID originalUUID = UUID.fromString("cc5f93f7-8cf1-4a51-83c6-e740313a0c6c"); + + @Test + public void givenEncodedString_whenDecodingUsingBase64Decoder_thenGiveExpectedUUID() { + String expectedEncodedString = "UUrxjPeTX8xsDDoxQOfGgw"; + byte[] decodedBytes = Base64.getDecoder() + .decode(expectedEncodedString); + UUID uuid = convertToUUID(decodedBytes); + assertEquals(originalUUID, uuid); + } + + @Test + public void givenEncodedString_whenDecodingUsingByteBufferAndBase64UrlDecoder_thenGiveExpectedUUID() { + String expectedEncodedString = "zF-T94zxSlGDxudAMToMbA"; + byte[] decodedBytes = Base64.getUrlDecoder() + .decode(expectedEncodedString); + ByteBuffer byteBuffer = ByteBuffer.wrap(decodedBytes); + long mostSignificantBits = byteBuffer.getLong(); + long leastSignificantBits = byteBuffer.getLong(); + UUID uuid = new UUID(mostSignificantBits, leastSignificantBits); + assertEquals(originalUUID, uuid); + } + + @Test + public void givenEncodedString_whenDecodingUsingApacheUtils_thenGiveExpectedUUID() { + String expectedEncodedString = "UUrxjPeTX8xsDDoxQOfGgw"; + byte[] decodedBytes = decodeBase64(expectedEncodedString); + UUID uuid = Conversion.byteArrayToUuid(decodedBytes, 0); + assertEquals(originalUUID, uuid); + } + + private UUID convertToUUID(byte[] src) { + long mostSignificantBits = convertBytesToLong(src, 0); + long leastSignificantBits = convertBytesToLong(src, 8); + + return new UUID(mostSignificantBits, leastSignificantBits); + } + + private long convertBytesToLong(byte[] uuidBytes, int start) { + long result = 0; + + for(int i = 0; i < 8; i++) { + int shift = i * 8; + long bits = (255L & (long)uuidBytes[i + start]) << shift; + long mask = 255L << shift; + result = result & ~mask | bits; + } + + return result; + } +} diff --git a/core-java-modules/core-java-uuid/src/test/java/com/ossez/uuid/EncodeUUIDToBase64StringUnitTest.java b/core-java-modules/core-java-uuid/src/test/java/com/ossez/uuid/EncodeUUIDToBase64StringUnitTest.java new file mode 100644 index 0000000000..d8f1b4a13f --- /dev/null +++ b/core-java-modules/core-java-uuid/src/test/java/com/ossez/uuid/EncodeUUIDToBase64StringUnitTest.java @@ -0,0 +1,62 @@ +package com.ossez.uuid; + +import static org.apache.commons.codec.binary.Base64.encodeBase64URLSafeString; +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.nio.ByteBuffer; +import java.util.Base64; +import java.util.UUID; + +import org.apache.commons.lang3.Conversion; +import org.junit.jupiter.api.Test; + +public class EncodeUUIDToBase64StringUnitTest { + private final UUID originalUUID = UUID.fromString("cc5f93f7-8cf1-4a51-83c6-e740313a0c6c"); + + @Test + public void givenUUID_whenEncodingUsingBase64Encoder_thenGiveExpectedEncodedString() { + String expectedEncodedString = "UUrxjPeTX8xsDDoxQOfGgw"; + byte[] uuidBytes = convertToByteArray(originalUUID); + String encodedUUID = Base64.getEncoder().withoutPadding() + .encodeToString(uuidBytes); + assertEquals(expectedEncodedString, encodedUUID); + } + + @Test + public void givenUUID_whenEncodingUsingByteBufferAndBase64UrlEncoder_thenGiveExpectedEncodedString() { + String expectedEncodedString = "zF-T94zxSlGDxudAMToMbA"; + ByteBuffer byteBuffer = ByteBuffer.wrap(new byte[16]); + byteBuffer.putLong(originalUUID.getMostSignificantBits()); + byteBuffer.putLong(originalUUID.getLeastSignificantBits()); + String encodedUUID = Base64.getUrlEncoder().withoutPadding() + .encodeToString(byteBuffer.array()); + assertEquals(expectedEncodedString, encodedUUID); + } + + @Test + public void givenUUID_whenEncodingUsingApacheUtils_thenGiveExpectedEncodedString() { + String expectedEncodedString = "UUrxjPeTX8xsDDoxQOfGgw"; + byte[] bytes = Conversion.uuidToByteArray(originalUUID, new byte[16], 0, 16); + String encodedUUID = encodeBase64URLSafeString(bytes); + assertEquals(expectedEncodedString, encodedUUID); + } + + private byte[] convertToByteArray(UUID uuid) { + byte[] result = new byte[16]; + + long mostSignificantBits = uuid.getMostSignificantBits(); + fillByteArray(0, 8, result, mostSignificantBits); + + long leastSignificantBits = uuid.getLeastSignificantBits(); + fillByteArray(8, 16, result, leastSignificantBits); + + return result; + } + + private static void fillByteArray(int start, int end, byte[] result, long bits) { + for (int i = start; i < end; i++) { + int shift = i * 8; + result[i] = (byte) ((int) (255L & bits >> shift)); + } + } +} diff --git a/core-java-modules/core-java-uuid/src/test/java/com/ossez/uuid/UUIDPositiveLongGeneratorUnitTest.java b/core-java-modules/core-java-uuid/src/test/java/com/ossez/uuid/UUIDPositiveLongGeneratorUnitTest.java new file mode 100644 index 0000000000..e16c866c34 --- /dev/null +++ b/core-java-modules/core-java-uuid/src/test/java/com/ossez/uuid/UUIDPositiveLongGeneratorUnitTest.java @@ -0,0 +1,22 @@ +package com.ossez.uuid; + +import org.junit.jupiter.api.Test; + +import java.util.UUID; + +import static org.assertj.core.api.Assertions.assertThat; + +public class UUIDPositiveLongGeneratorUnitTest { + + @Test + public void whenGetMostSignificantBits_thenAssertPositive() { + long randomPositiveLong = Math.abs(UUID.randomUUID().getMostSignificantBits()); + assertThat(randomPositiveLong).isNotNegative(); + } + + @Test + public void whenGetLeastSignificantBits_thenAssertPositive() { + long randomPositiveLong = Math.abs(UUID.randomUUID().getLeastSignificantBits()); + assertThat(randomPositiveLong).isNotNegative(); + } +} diff --git a/core-java-modules/core-java-uuid/src/test/resources/logback.xml b/core-java-modules/core-java-uuid/src/test/resources/logback.xml new file mode 100644 index 0000000000..a076f8db47 --- /dev/null +++ b/core-java-modules/core-java-uuid/src/test/resources/logback.xml @@ -0,0 +1,18 @@ + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + + + + + + \ No newline at end of file