Skip to content

Commit 840aa44

Browse files
authored
Convert BedrockJsonParserTest from Groovy to Java (#1291)
- Replace Groovy/Spock tests with Java/JUnit for both aws-sdk v1.11 and v2.2 - Remove groovy plugin from build.gradle.kts - Needed to unblock version bump for Java: #1287 - Tests all pass locally --- Without my changes, #1287 fails with: ``` > Task :instrumentation:aws-sdk:compileTestGroovy FAILED [Incubating] Problems report is available at: file:///aws-otel-java-instrumentation/build/reports/problems/problems-report.html FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':instrumentation:aws-sdk:compileTestGroovy'. > Cannot infer Groovy class path because no Groovy Jar was found on class path: [/aws-otel-java-instrumentation/instrumentation/aws-sdk/build/classes/java/main, /aws-otel-java-instrumentation/instrumentation/aws-sdk/build/classes/groovy/main, /aws-otel-java-instrumentation/instrumentation/aws-sdk/build/resources/main, .gradle/caches/modules-2/files-2.1/io.opentelemetry.javaagent/opentelemetry-testing-common/2.23.0-alpha/eb485192aa9e081a7c3aa51261e403c97ab5f567/opentelemetry-testing-common-2.23.0-alpha.jar, .gradle/caches/modules-2/files-2.1/org.assertj/assertj-core/3.27.6/8f34ccd6808899ad1d0aac6a770b73191f2f2a53/assertj-core-3.27.6.jar, .gradle/caches/modules-2/files-2.1/org.junit.platform/junit-platform-commons/1.14.1/3d6d355ba36d7620bfef87b896708a975accc108/junit-platform-commons-1.14.1.jar, .gradle/caches/modules-2/files-2.1/org.junit.jupiter/junit-jupiter-params/5.14.1/8f2932b4a69f3831370fed1c09253108684fb606/junit-jupiter-params-5.14.1.jar, .gradle/caches/modules-2/files-2.1/org.junit.jupiter/junit-jupiter-api/5.14.1/8943c1d7f3ad50a08fa654e92d9241dc632bbc4c/junit-jupiter-api-5.14.1.jar, .gradle/caches/modules-2/files-2.1/com.google.guava/guava/33.0.0-jre/161ba27964a62f241533807a46b8711b13c1d94b/guava-33.0.0-jre.jar, .gradle/caches/modules-2/files-2.1/org.mockito/mockito-core/5.14.2/f7bf936008d7664e2002c3faf0c02071c8d10e7c/mockito-core-5.14.2.jar, .gradle/caches/modules-2/files-2.1/io.opentelemetry.javaagent/opentelemetry-javaagent-extension-api/2.23.0-alpha/941502c69bb659f1b48f5d38ec16e7f5ee50a878/opentelemetry-javaagent-extension-api-2.23.0-alpha.jar, .gradle/caches/modules-2/files-2.1/software.amazon.awssdk/aws-core/2.30.17/463e1ea4800b49c59b6a4c03aa586cbc02e80487/aws-core-2.30.17.jar, .gradle/caches/modules-2/files-2.1/com.amazonaws/aws-java-sdk-lambda/1.12.599/28b5c5d0d21510ff10bee2f7f3b3a517ee33fb05/aws-java-sdk-lambda-1.12.599.jar, .gradle/caches/modules-2/files-2.1/com.amazonaws/aws-java-sdk-kinesis/1.12.599/bb24d050d5a2cd72c600f40ad5ea076123ab1eaa/aws-java-sdk-kinesis-1.12.599.jar, .gradle/caches/modules-2/files-2.1/com.amazonaws/aws-java-sdk-sns/1.12.599/1817044490e7313cf19c1e75966fe220dad52715/aws-java-sdk-sns-1.12.599.jar, .gradle/caches/modules-2/files-2.1/com.amazonaws/aws-java-sdk-stepfunctions/1.12.599/99bc59dceac8ae482b36dddcdb1e50a5b9b61ba5/aws-java-sdk-stepfunctions-1.12.599.jar, .gradle/caches/modules-2/files-2.1/com.amazonaws/aws-java-sdk-secretsmanager/1.12.599/2d41fd13f14f6f94082ce5a42e8d439c3d73e088/aws-java-sdk-secretsmanager-1.12.599.jar, .gradle/caches/modules-2/files-2.1/com.amazonaws/aws-java-sdk-sqs/1.12.599/cc222cfc42e7a92f5e4f27c91a6a1eecaabe01ab/aws-java-sdk-sqs-1.12.599.jar, .gradle/caches/modules-2/files-2.1/com.amazonaws/aws-java-sdk-core/1.12.599/4a8b77c2b540478287809eab6bf41c5fba15ab2/aws-java-sdk-core-1.12.599.jar, .gradle/caches/modules-2/files-2.1/com.amazonaws/jmespath-java/1.12.599/a67dca1aafaccbfcb6cdea0580ec6ae0ce9b0e80/jmespath-java-1.12.599.jar, .gradle/caches/modules-2/files-2.1/com.fasterxml.jackson.dataformat/jackson-dataformat-cbor/2.16.0/35e8b7bf4fc1d078766bb155103d433ed5bb1627/jackson-dataformat-cbor-2.16.0.jar, .gradle/caches/modules-2/files-2.1/com.fasterxml.jackson.core/jackson-databind/2.16.0/3a6b7f8ff7b30d518bbd65678e9c30cd881f19a7/jackson-databind-2.16.0.jar, .gradle/caches/modules-2/files-2.1/com.fasterxml.jackson.core/jackson-annotations/2.16.0/dc30995f7428c0a405eba9b8c619b20d2b3b9905/jackson-annotations-2.16.0.jar, .gradle/caches/modules-2/files-2.1/com.fasterxml.jackson.core/jackson-core/2.16.0/899e5cf01be55fbf094ad72b2edb0c5df99111ee/jackson-core-2.16.0.jar, .gradle/caches/modules-2/files-2.1/software.amazon.awssdk/auth/2.30.17/a638f4402418f54b35ef3376766560ef1de7b9bc/auth-2.30.17.jar, .gradle/caches/modules-2/files-2.1/software.amazon.awssdk/regions/2.30.17/5ae4cf39882bdc0bb16570468f0ed799b6d45d22/regions-2.30.17.jar, .gradle/caches/modules-2/files-2.1/software.amazon.awssdk/sdk-core/2.30.17/ae6cfbcc910012a47f3644481966792450606ec3/sdk-core-2.30.17.jar, .gradle/caches/modules-2/files-2.1/software.amazon.awssdk/http-auth/2.30.17/4e107f6954542cd7e26e74c1bef8dcfbf7f47a57/http-auth-2.30.17.jar, .gradle/caches/modules-2/files-2.1/software.amazon.awssdk/http-auth-aws/2.30.17/fe5b732a3d1763cc6b59cf8bbfe2cc97fc598fbd/http-auth-aws-2.30.17.jar, .gradle/caches/modules-2/files-2.1/software.amazon.awssdk/http-auth-spi/2.30.17/8dc0afbfcf107499395ddc0e7f260f2e83a46cb7/http-auth-spi-2.30.17.jar, .gradle/caches/modules-2/files-2.1/software.amazon.awssdk/identity-spi/2.30.17/489796efca47bbee755463bf4752dcdb14717431/identity-spi-2.30.17.jar, .gradle/caches/modules-2/files-2.1/software.amazon.awssdk/profiles/2.30.17/a83727f88ea2dc3a3e4d40784dc96dc50bbbf3e8/profiles-2.30.17.jar, .gradle/caches/modules-2/files-2.1/software.amazon.awssdk/http-client-spi/2.30.17/dbd9b5047d6a89b496307adbeebe8c78ca435516/http-client-spi-2.30.17.jar, .gradle/caches/modules-2/files-2.1/software.amazon.awssdk/metrics-spi/2.30.17/e1d6878f993d4821d220965fff1151294206bd4b/metrics-spi-2.30.17.jar, .gradle/caches/modules-2/files-2.1/software.amazon.awssdk/retries/2.30.17/5c3d9a53708f17a2572efb684ad24bd4c9d06dd9/retries-2.30.17.jar, .gradle/caches/modules-2/files-2.1/software.amazon.awssdk/retries-spi/2.30.17/662a4448bcde42354ceb668c44da8099a36db94a/retries-spi-2.30.17.jar, .gradle/caches/modules-2/files-2.1/software.amazon.awssdk/json-utils/2.30.17/7be564b623bbc294cc2a5fb139c0a9e9144521fd/json-utils-2.30.17.jar, .gradle/caches/modules-2/files-2.1/software.amazon.awssdk/checksums/2.30.17/3f9aa0acf56e937b52e381edafe13705ea4f72a5/checksums-2.30.17.jar, .gradle/caches/modules-2/files-2.1/software.amazon.awssdk/utils/2.30.17/f84e7f65d70f1237f09f38b2e35b9e622e64abc8/utils-2.30.17.jar, .gradle/caches/modules-2/files-2.1/org.slf4j/slf4j-api/2.0.17/d9e58ac9c7779ba3bf8142aff6c830617a7fe60f/slf4j-api-2.0.17.jar, .gradle/caches/modules-2/files-2.1/commons-logging/commons-logging/1.2/4bfc12adfe4842bf07b657f0369c4cb522955686/commons-logging-1.2.jar, .gradle/caches/modules-2/files-2.1/net.bytebuddy/byte-buddy/1.17.7/3856bfab61beb23e099a0d6629f2ba8de4b98ace/byte-buddy-1.17.7.jar, .gradle/caches/modules-2/files-2.1/net.bytebuddy/byte-buddy-agent/1.15.4/58e850dde88f3cf20f41f659440bef33f6c4fe02/byte-buddy-agent-1.15.4.jar, .gradle/caches/modules-2/files-2.1/software.amazon.awssdk/endpoints-spi/2.30.17/520db16b07deb8bc205bf7b7135fa9341ba986fc/endpoints-spi-2.30.17.jar, .gradle/caches/modules-2/files-2.1/software.amazon.awssdk/http-auth-aws-eventstream/2.30.17/38ccfb02520f759dfa5c1fd9bc9fe59efe0dd80b/http-auth-aws-eventstream-2.30.17.jar, .gradle/caches/modules-2/files-2.1/software.amazon.awssdk/checksums-spi/2.30.17/5d85888dd48a56f534a7d3d0c417131a51ee4c4/checksums-spi-2.30.17.jar, .gradle/caches/modules-2/files-2.1/software.amazon.awssdk/annotations/2.30.17/aec87f2dd6f3b0d81e9059a2ce2f06617af42c0f/annotations-2.30.17.jar, .gradle/caches/modules-2/files-2.1/io.opentelemetry.instrumentation/opentelemetry-instrumentation-api-incubator/2.23.0-alpha/7cf06b8cbcbc91c178c29d24d57dada9d5629c76/opentelemetry-instrumentation-api-incubator-2.23.0-alpha.jar, .gradle/caches/modules-2/files-2.1/io.opentelemetry.semconv/opentelemetry-semconv-incubating/1.37.0-alpha/3ac6c12a55b25cea4cb9ddab3f8187bd8175c5db/opentelemetry-semconv-incubating-1.37.0-alpha.jar, .gradle/caches/modules-2/files-2.1/org.reactivestreams/reactive-streams/1.0.4/3864a1320d97d7b045f729a326e1e077661f31b7/reactive-streams-1.0.4.jar, .gradle/caches/modules-2/files-2.1/org.awaitility/awaitility/4.3.0/f0c0bc1e404e500bab3f498b922eaedeae1c0207/awaitility-4.3.0.jar, .gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpclient/4.5.14/1194890e6f56ec29177673f2f12d0b8e627dec98/httpclient-4.5.14.jar, .gradle/caches/modules-2/files-2.1/commons-codec/commons-codec/1.15/49d94806b6e3dc933dacbd8acb0fdbab8ebd1e5d/commons-codec-1.15.jar, .gradle/caches/modules-2/files-2.1/org.hamcrest/hamcrest/2.2/1820c0968dba3a11a1b30669bb1f01978a91dedc/hamcrest-2.2.jar, .gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpcore/4.4.16/51cf043c87253c9f58b539c9f7e44c8894223850/httpcore-4.4.16.jar, .gradle/caches/modules-2/files-2.1/software.amazon.awssdk/third-party-jackson-core/2.30.17/8655eeeedd8ab81dd9c07a1ea6a628f159bf5fc8/third-party-jackson-core-2.30.17.jar, .gradle/caches/modules-2/files-2.1/com.google.guava/failureaccess/1.0.2/c4a06a64e650562f30b7bf9aaec1bfed43aca12b/failureaccess-1.0.2.jar, .gradle/caches/modules-2/files-2.1/com.google.guava/listenablefuture/9999.0-empty-to-avoid-conflict-with-guava/b421526c5f297295adef1c886e5246c39d4ac629/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar, .gradle/caches/modules-2/files-2.1/com.google.code.findbugs/annotations/3.0.1u2/89a670596c98e416fb2583c08ae34cc5c3ce2097/annotations-3.0.1u2.jar, .gradle/caches/modules-2/files-2.1/com.google.code.findbugs/jsr305/3.0.2/25ea2e8b0c338a877313bd4672d3fe056ea78f0d/jsr305-3.0.2.jar, .gradle/caches/modules-2/files-2.1/org.checkerframework/checker-qual/3.41.0/8be6df7f1e9bccb19f8f351b3651f0bac2f5e0c/checker-qual-3.41.0.jar, .gradle/caches/modules-2/files-2.1/com.google.errorprone/error_prone_annotations/2.23.0/43a27853b6c7d54893e0b1997c2c778c347179eb/error_prone_annotations-2.23.0.jar, .gradle/caches/modules-2/files-2.1/com.google.j2objc/j2objc-annotations/2.8/c85270e307e7b822f1086b93689124b89768e273/j2objc-annotations-2.8.jar, .gradle/caches/modules-2/files-2.1/io.opentelemetry/opentelemetry-sdk-extension-autoconfigure-spi/1.57.0/db5faebe7a57fe96a85582e3f91bd7cba14b2bc6/opentelemetry-sdk-extension-autoconfigure-spi-1.57.0.jar, .gradle/caches/modules-2/files-2.1/io.opentelemetry/opentelemetry-sdk-testing/1.57.0/d8a544a3d60e1ea73baa3db41ddf99a0a52e130c/opentelemetry-sdk-testing-1.57.0.jar, .gradle/caches/modules-2/files-2.1/io.opentelemetry/opentelemetry-sdk/1.57.0/94f6c46c10c76dce5c21b74c0c6792ab764743f3/opentelemetry-sdk-1.57.0.jar, .gradle/caches/modules-2/files-2.1/io.opentelemetry.instrumentation/opentelemetry-instrumentation-api/2.23.0/8ac3bc292c19a9bfd3165fb7603c353815c39c74/opentelemetry-instrumentation-api-2.23.0.jar, .gradle/caches/modules-2/files-2.1/io.opentelemetry/opentelemetry-sdk-trace/1.57.0/a5caccfd73b8ef0c6169ffc256c86ace53729c6d/opentelemetry-sdk-trace-1.57.0.jar, .gradle/caches/modules-2/files-2.1/io.opentelemetry/opentelemetry-sdk-metrics/1.57.0/f341639db647253c4225560a6e199c98a68a3583/opentelemetry-sdk-metrics-1.57.0.jar, .gradle/caches/modules-2/files-2.1/io.opentelemetry/opentelemetry-sdk-logs/1.57.0/a93e61071c96f78d263434d417d6d49a6a42f72c/opentelemetry-sdk-logs-1.57.0.jar, .gradle/caches/modules-2/files-2.1/io.opentelemetry/opentelemetry-sdk-common/1.57.0/98790475a09fc7e442be762475d03f92f1dbf22e/opentelemetry-sdk-common-1.57.0.jar, .gradle/caches/modules-2/files-2.1/io.opentelemetry/opentelemetry-api-incubator/1.57.0-alpha/7c7773621e93c0b28e2b95de8bcb21601b074c11/opentelemetry-api-incubator-1.57.0-alpha.jar, .gradle/caches/modules-2/files-2.1/io.opentelemetry/opentelemetry-api/1.57.0/165669e71f583d1850bca050d5afe9f18e722b2e/opentelemetry-api-1.57.0.jar, .gradle/caches/modules-2/files-2.1/io.opentelemetry/opentelemetry-context/1.57.0/3e9212282c7b886d341cfc57ea116c24e9a2539a/opentelemetry-context-1.57.0.jar, .gradle/caches/modules-2/files-2.1/io.opentelemetry/opentelemetry-common/1.57.0/8f4cd60ad6255d57b397878a5af835e81d9693c8/opentelemetry-common-1.57.0.jar, .gradle/caches/modules-2/files-2.1/io.opentelemetry.semconv/opentelemetry-semconv/1.37.0/c6f9a930842c93c08fd87349db3defcbc228e925/opentelemetry-semconv-1.37.0.jar, .gradle/caches/modules-2/files-2.1/net.bytebuddy/byte-buddy-dep/1.18.2/a91c32f8a57d4c856897e092e9cac8114fd6e81f/byte-buddy-dep-1.18.2.jar, .gradle/caches/modules-2/files-2.1/software.amazon.eventstream/eventstream/1.0.1/6ff8649dffc5190366ada897ba8525a836297784/eventstream-1.0.1.jar, .gradle/caches/modules-2/files-2.1/software.amazon.ion/ion-java/1.0.2/ee9dacea7726e495f8352b81c12c23834ffbc564/ion-java-1.0.2.jar, .gradle/caches/modules-2/files-2.1/joda-time/joda-time/2.8.1/f5bfc718c95a7b1d3c371bb02a188a4df18361a9/joda-time-2.8.1.jar, .gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-commons/9.9/db9165a3bf908ded6b08612d583a15d1d0c7bda0/asm-commons-9.9.jar, .gradle/caches/modules-2/files-2.1/codes.rafael.asmjdkbridge/asm-jdk-bridge/0.0.13/8c0569eac7d573e9db9d4cfddc17a936d2bac539/asm-jdk-bridge-0.0.13.jar, .gradle/caches/modules-2/files-2.1/org.ow2.asm/asm/9.9/c29635c8a7afa03d74b33c1884df8abb2b3f3dcc/asm-9.9.jar, .gradle/caches/modules-2/files-2.1/org.opentest4j/opentest4j/1.3.0/152ea56b3a72f655d4fd677fc0ef2596c3dd5e6e/opentest4j-1.3.0.jar, .gradle/caches/modules-2/files-2.1/org.apiguardian/apiguardian-api/1.1.2/a231e0d844d2721b0fa1b238006d15c6ded6842a/apiguardian-api-1.1.2.jar, .gradle/caches/modules-2/files-2.1/net.jcip/jcip-annotations/1.0/afba4942caaeaf46aab0b976afd57cc7c181467e/jcip-annotations-1.0.jar, /aws-otel-java-instrumentation/instrumentation/aws-sdk/build/classes/java/test] * Try: > Run with --stacktrace option to get the stack trace. > Run with --info or --debug option to get more log output. > Run with --scan to get full insights. > Get more help at https://help.gradle.org. Deprecated Gradle features were used in this build, making it incompatible with Gradle 9.0. You can use '--warning-mode all' to show the individual deprecation warnings and determine if they come from your own scripts or plugins. For more on this, please refer to https://docs.gradle.org/8.14.3/userguide/command_line_interface.html#sec:command_line_warnings in the Gradle documentation. BUILD FAILED in 1s ``` With my changes, it passes with: ``` BUILD SUCCESSFUL in 20s ``` By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license.
1 parent ef07104 commit 840aa44

6 files changed

Lines changed: 230 additions & 245 deletions

File tree

instrumentation/aws-sdk/README.md

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -150,23 +150,14 @@ _Class Functionalities:_
150150
- `BedrockJasonParser`
151151
- Parses and extracts specific attributes from Bedrock LLM responses for GenAI telemetry
152152

153-
### Commands for Running Groovy Tests
153+
### Commands for Running Java Tests
154154

155155
#### aws-sdk v1.11
156156
To run the `BedrockJsonParserTest`:
157157
````
158158
./gradlew :instrumentation:aws-sdk:test --tests "software.amazon.opentelemetry.javaagent.instrumentation.awssdk_v1_11.BedrockJsonParserTest"
159159
````
160160

161-
#### aws-sdk v2.2
162-
To run the `BedrockJsonParserTest`:
163-
````
164-
./gradlew :instrumentation:aws-sdk:test --tests "software.amazon.opentelemetry.javaagent.instrumentation.awssdk_v2_2.BedrockJsonParserTest"
165-
````
166-
167-
### Commands for Running Java Tests
168-
169-
#### aws-sdk v1.11
170161
To run the `AwsSdkExperimentalAttributesInjectionTest`:
171162
````
172163
./gradlew :instrumentation:aws-sdk:test --tests "software.amazon.opentelemetry.javaagent.instrumentation.awssdk_v1_11.AwsSdkExperimentalAttributesInjectionTest"
@@ -178,6 +169,11 @@ To run the `AdotAwsSdkClientAdviceTest`:
178169
````
179170

180171
#### aws-sdk v2.2
172+
To run the `BedrockJsonParserTest`:
173+
````
174+
./gradlew :instrumentation:aws-sdk:test --tests "software.amazon.opentelemetry.javaagent.instrumentation.awssdk_v2_2.BedrockJsonParserTest"
175+
````
176+
181177
To run the `AwsSdkExperimentalAttributesInjectionTest`:
182178
````
183179
./gradlew :instrumentation:aws-sdk:test --tests "software.amazon.opentelemetry.javaagent.instrumentation.awssdk_v2_2.AwsSdkExperimentalAttributesInjectionTest"

instrumentation/aws-sdk/build.gradle.kts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
plugins {
1717
java
1818
id("com.gradleup.shadow")
19-
id("groovy")
2019
}
2120

2221
base.archivesBaseName = "aws-instrumentation-aws-sdk"

instrumentation/aws-sdk/src/test/groovy/software/amazon/opentelemetry/javaagent/instrumentation/awssdk_v1_11/BedrockJsonParserTest.groovy

Lines changed: 0 additions & 117 deletions
This file was deleted.

instrumentation/aws-sdk/src/test/groovy/software/amazon/opentelemetry/javaagent/instrumentation/awssdk_v2_2/BedrockJsonParserTest.groovy

Lines changed: 0 additions & 117 deletions
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
/*
2+
* Copyright Amazon.com, Inc. or its affiliates.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License").
5+
* You may not use this file except in compliance with the License.
6+
* A copy of the License is located at
7+
*
8+
* http://aws.amazon.com/apache2.0
9+
*
10+
* or in the "license" file accompanying this file. This file is distributed
11+
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
12+
* express or implied. See the License for the specific language governing
13+
* permissions and limitations under the License.
14+
*/
15+
16+
package software.amazon.opentelemetry.javaagent.instrumentation.awssdk_v1_11;
17+
18+
import static org.assertj.core.api.Assertions.assertThat;
19+
import static org.assertj.core.api.Assertions.assertThatThrownBy;
20+
21+
import java.util.List;
22+
import java.util.Map;
23+
import org.junit.jupiter.api.Test;
24+
25+
class BedrockJsonParserTest {
26+
27+
@Test
28+
void shouldParseSimpleJsonObject() {
29+
String json = "{\"key\":\"value\"}";
30+
31+
Map<String, Object> actual = BedrockJsonParser.parse(json).getJsonBody();
32+
Map<String, Object> expected = Map.of("key", "value");
33+
34+
assertThat(actual).isEqualTo(expected);
35+
}
36+
37+
@Test
38+
void shouldParseNestedJsonObject() {
39+
String json = "{\"parent\":{\"child\":\"value\"}}";
40+
41+
Map<String, Object> actual = BedrockJsonParser.parse(json).getJsonBody();
42+
Map<String, Object> expected = Map.of("parent", Map.of("child", "value"));
43+
44+
assertThat(actual).isEqualTo(expected);
45+
}
46+
47+
@Test
48+
void shouldParseJsonArray() {
49+
String json = "{\"array\":[1, \"two\", 1.0]}";
50+
51+
Map<String, Object> actual = BedrockJsonParser.parse(json).getJsonBody();
52+
Map<String, Object> expected = Map.of("array", List.of(1, "two", 1.0));
53+
54+
assertThat(actual).isEqualTo(expected);
55+
}
56+
57+
@Test
58+
void shouldParseEscapeSequences() {
59+
String json =
60+
"{\"escaped\":\"Line1\\nLine2\\tTabbed\\\"Quoted\\\"\\bBackspace\\fFormfeed\\rCarriageReturn\\\\Backslash\\/Slash\\u0041\"}";
61+
62+
Map<String, Object> actual = BedrockJsonParser.parse(json).getJsonBody();
63+
Map<String, Object> expected =
64+
Map.of(
65+
"escaped",
66+
"Line1\nLine2\tTabbed\"Quoted\"\bBackspace\fFormfeed\rCarriageReturn\\Backslash/SlashA");
67+
68+
assertThat(actual).isEqualTo(expected);
69+
}
70+
71+
@Test
72+
void shouldThrowExceptionForMalformedJson() {
73+
String malformedJson = "{\"key\":value}";
74+
75+
assertThatThrownBy(() -> BedrockJsonParser.parse(malformedJson))
76+
.isInstanceOf(IllegalArgumentException.class)
77+
.hasMessageContaining("Unexpected character");
78+
}
79+
80+
@Test
81+
void shouldResolvePathInJsonObject() {
82+
String json = "{\"parent\":{\"child\":{\"key\":\"value\"}}}";
83+
84+
BedrockJsonParser.LlmJson parsedJson = BedrockJsonParser.parse(json);
85+
Object resolvedValue =
86+
BedrockJsonParser.JsonPathResolver.resolvePath(parsedJson, "/parent/child/key");
87+
88+
assertThat(resolvedValue).isEqualTo("value");
89+
}
90+
91+
@Test
92+
void shouldResolvePathInJsonArray() {
93+
String json = "{\"array\":[{\"key\":\"value1\"}, {\"key\":\"value2\"}]}";
94+
95+
BedrockJsonParser.LlmJson parsedJson = BedrockJsonParser.parse(json);
96+
Object resolvedValue =
97+
BedrockJsonParser.JsonPathResolver.resolvePath(parsedJson, "/array/1/key");
98+
99+
assertThat(resolvedValue).isEqualTo("value2");
100+
}
101+
102+
@Test
103+
void shouldReturnNullForInvalidPathResolution() {
104+
String json = "{\"parent\":{\"child\":{\"key\":\"value\"}}}";
105+
106+
BedrockJsonParser.LlmJson parsedJson = BedrockJsonParser.parse(json);
107+
Object resolvedValue =
108+
BedrockJsonParser.JsonPathResolver.resolvePath(parsedJson, "/invalid/path");
109+
110+
assertThat(resolvedValue).isNull();
111+
}
112+
}

0 commit comments

Comments
 (0)