From c381bacd239ee683ab833c4ffc6ae0daae5fb67b Mon Sep 17 00:00:00 2001 From: Thomas Kammerlocher Date: Mon, 22 Jan 2024 07:19:07 +0100 Subject: [PATCH] #341 added automatic string split to max 64 bytes and added test for string splitting (#362) * #341 added automatic string split to max 64 bytes and added test for string splitting. * #362 hash changed in this test due to array splitting --- .../metadata/cbor/CBORMetadataList.java | 19 +++++++++++++++---- .../client/metadata/cbor/CBORMetadataMap.java | 9 +++++++-- .../metadata/cbor/CBORMetadataListTest.java | 8 ++++++-- .../metadata/cbor/CBORMetadataMapTest.java | 8 ++++++-- .../transaction/spec/AuxiliaryDataTest.java | 2 +- 5 files changed, 35 insertions(+), 11 deletions(-) diff --git a/metadata/src/main/java/com/bloxbean/cardano/client/metadata/cbor/CBORMetadataList.java b/metadata/src/main/java/com/bloxbean/cardano/client/metadata/cbor/CBORMetadataList.java index 0791178c..ed45cc35 100644 --- a/metadata/src/main/java/com/bloxbean/cardano/client/metadata/cbor/CBORMetadataList.java +++ b/metadata/src/main/java/com/bloxbean/cardano/client/metadata/cbor/CBORMetadataList.java @@ -4,6 +4,7 @@ import com.bloxbean.cardano.client.metadata.MetadataList; import com.bloxbean.cardano.client.metadata.MetadataMap; import com.bloxbean.cardano.client.util.JsonUtil; +import com.bloxbean.cardano.client.util.StringUtils; import java.math.BigInteger; import java.util.ArrayList; @@ -36,16 +37,26 @@ public CBORMetadataList addNegative(BigInteger value) { @Override public CBORMetadataList add(String value) { - checkLength(value); - array.add(new UnicodeString(value)); + if (checkLength(value) > 64) { + CBORMetadataList cborMetadataList = new CBORMetadataList(); + cborMetadataList.addAll(StringUtils.splitStringEveryNCharacters(value, 64)); + array.add(cborMetadataList.getArray()); + } else { + array.add(new UnicodeString(value)); + } return this; } @Override public CBORMetadataList addAll(String[] value) { for (String str : value) { - checkLength(str); - array.add(new UnicodeString(str)); + if (checkLength(str) > 64) { + CBORMetadataList cborMetadataList = new CBORMetadataList(); + cborMetadataList.addAll(StringUtils.splitStringEveryNCharacters(str, 64)); + array.add(cborMetadataList.getArray()); + } else { + array.add(new UnicodeString(str)); + } } return this; } diff --git a/metadata/src/main/java/com/bloxbean/cardano/client/metadata/cbor/CBORMetadataMap.java b/metadata/src/main/java/com/bloxbean/cardano/client/metadata/cbor/CBORMetadataMap.java index 8ce56180..2a13799b 100644 --- a/metadata/src/main/java/com/bloxbean/cardano/client/metadata/cbor/CBORMetadataMap.java +++ b/metadata/src/main/java/com/bloxbean/cardano/client/metadata/cbor/CBORMetadataMap.java @@ -46,8 +46,13 @@ public CBORMetadataMap put(BigInteger key, byte[] value) { @Override public CBORMetadataMap put(BigInteger key, String value) { - checkLength(value); - map.put(new UnsignedInteger(key), new UnicodeString(value)); + if (checkLength(value) > 64) { + CBORMetadataList cborMetadataList = new CBORMetadataList(); + cborMetadataList.addAll(StringUtils.splitStringEveryNCharacters(value, 64)); + map.put(new UnsignedInteger(key), cborMetadataList.getArray()); + } else { + map.put(new UnsignedInteger(key), new UnicodeString(value)); + } return this; } diff --git a/metadata/src/test/java/com/bloxbean/cardano/client/metadata/cbor/CBORMetadataListTest.java b/metadata/src/test/java/com/bloxbean/cardano/client/metadata/cbor/CBORMetadataListTest.java index 0029e9c9..e1389f03 100644 --- a/metadata/src/test/java/com/bloxbean/cardano/client/metadata/cbor/CBORMetadataListTest.java +++ b/metadata/src/test/java/com/bloxbean/cardano/client/metadata/cbor/CBORMetadataListTest.java @@ -8,6 +8,7 @@ import java.math.BigInteger; import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertTrue; class CBORMetadataListTest { @@ -21,13 +22,16 @@ void testRemove() { list.add("value5"); list.add("value6"); list.add("value7"); + list.add("Extra Long string of more than 64 Bytes................................"); System.out.println(list.toJson()); - assertThat(list.size()).isEqualTo(7); + assertThat(list.size()).isEqualTo(8); + + assertTrue(list.getValueAt(7) instanceof CBORMetadataList); list.removeItem("value5"); list.removeItem(BigInteger.valueOf(4)); - assertThat(list.size()).isEqualTo(5); + assertThat(list.size()).isEqualTo(6); assertThat(list.getValueAt(4)).isNotEqualTo("value5"); assertThat(list.getValueAt(4)).isEqualTo("value7"); } diff --git a/metadata/src/test/java/com/bloxbean/cardano/client/metadata/cbor/CBORMetadataMapTest.java b/metadata/src/test/java/com/bloxbean/cardano/client/metadata/cbor/CBORMetadataMapTest.java index f38a36bd..5970d6d2 100644 --- a/metadata/src/test/java/com/bloxbean/cardano/client/metadata/cbor/CBORMetadataMapTest.java +++ b/metadata/src/test/java/com/bloxbean/cardano/client/metadata/cbor/CBORMetadataMapTest.java @@ -8,6 +8,7 @@ import java.math.BigInteger; import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertTrue; class CBORMetadataMapTest { @@ -17,13 +18,16 @@ void testRemove() throws CborException { metadataMap.put("key1", "value1"); metadataMap.put("key2", BigInteger.valueOf(123)); metadataMap.put("key3", "value3"); + metadataMap.put("key4", "Extra Long string of more than 64 Bytes................................"); metadataMap.put(new BigInteger("123456"), "value4"); - assertThat(metadataMap.keys()).hasSize(4); + assertTrue(metadataMap.get("key4") instanceof CBORMetadataList); + + assertThat(metadataMap.keys()).hasSize(5); metadataMap.remove("key1"); metadataMap.remove(new BigInteger("123456")); - assertThat(metadataMap.keys()).hasSize(2); + assertThat(metadataMap.keys()).hasSize(3); assertThat(metadataMap.get("key2")).isEqualTo(BigInteger.valueOf(123)); assertThat(metadataMap.get("key3")).isEqualTo("value3"); diff --git a/transaction-spec/src/test/java/com/bloxbean/cardano/client/transaction/spec/AuxiliaryDataTest.java b/transaction-spec/src/test/java/com/bloxbean/cardano/client/transaction/spec/AuxiliaryDataTest.java index 2a6764b6..5b9d6fc0 100644 --- a/transaction-spec/src/test/java/com/bloxbean/cardano/client/transaction/spec/AuxiliaryDataTest.java +++ b/transaction-spec/src/test/java/com/bloxbean/cardano/client/transaction/spec/AuxiliaryDataTest.java @@ -109,7 +109,7 @@ public void getAuxiliaryDataHash_whenPlutusScriptAndMetadata() throws CborSerial byte[] auxHashBytes = auxiliaryData.getAuxiliaryDataHash(); String auxHash = HexUtil.encodeHexString(auxHashBytes); - assertThat(auxHash).isEqualTo("591ad666282de3400e798f7a78957410624b0bb7bcbc004325eafc869818f142"); + assertThat(auxHash).isEqualTo("9754d68a3d8bdc75150c415eba8a0b0623e10db17ee4a7a33883efc05f9cdc0b"); } @Test