From 9a987554e778d5e5864925c78f346cb4e4ebc4a2 Mon Sep 17 00:00:00 2001 From: Danno Ferrin Date: Mon, 25 Sep 2023 16:27:56 -0500 Subject: [PATCH] Fix t8n encoding issue When sending a stack in json fields strip out the newlines and tabs. Signed-off-by: Danno Ferrin --- ethereum/evmtool/build.gradle | 1 + .../besu/evmtool/T8nServerSubCommand.java | 2 +- .../besu/evmtool/T8nServerSubCommandTest.java | 46 +++++++++++++++++++ 3 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 ethereum/evmtool/src/test/java/org/hyperledger/besu/evmtool/T8nServerSubCommandTest.java diff --git a/ethereum/evmtool/build.gradle b/ethereum/evmtool/build.gradle index c5604d7a52c..f92f6d3f937 100644 --- a/ethereum/evmtool/build.gradle +++ b/ethereum/evmtool/build.gradle @@ -62,6 +62,7 @@ dependencies { testImplementation 'org.assertj:assertj-core' testImplementation 'org.junit.jupiter:junit-jupiter' testImplementation 'org.mockito:mockito-core' + testImplementation 'org.mockito:mockito-junit-jupiter' testRuntimeOnly 'org.junit.vintage:junit-vintage-engine' diff --git a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/T8nServerSubCommand.java b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/T8nServerSubCommand.java index eec78ee50d1..8b636b9a8c0 100644 --- a/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/T8nServerSubCommand.java +++ b/ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/T8nServerSubCommand.java @@ -178,7 +178,7 @@ public void disposeTracer(final OperationTracer tracer) { t.printStackTrace(ps); ObjectNode json = objectMapper.createObjectNode(); json.put("error", t.getMessage()); - json.put("stacktrace", baos.toString(StandardCharsets.UTF_8)); + json.put("stacktrace", baos.toString(StandardCharsets.UTF_8).replaceAll("\\s", " ")); t.printStackTrace(System.out); diff --git a/ethereum/evmtool/src/test/java/org/hyperledger/besu/evmtool/T8nServerSubCommandTest.java b/ethereum/evmtool/src/test/java/org/hyperledger/besu/evmtool/T8nServerSubCommandTest.java new file mode 100644 index 00000000000..d167e57470a --- /dev/null +++ b/ethereum/evmtool/src/test/java/org/hyperledger/besu/evmtool/T8nServerSubCommandTest.java @@ -0,0 +1,46 @@ +package org.hyperledger.besu.evmtool; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import com.fasterxml.jackson.databind.ObjectMapper; +import io.vertx.core.http.HttpServerRequest; +import io.vertx.core.http.HttpServerResponse; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Answers; +import org.mockito.ArgumentCaptor; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +@ExtendWith(MockitoExtension.class) +class T8nServerSubCommandTest { + + @Mock HttpServerRequest httpServerRequest; + + @Mock(answer = Answers.RETURNS_SELF) + HttpServerResponse httpServerResponse; + + @Test + void exceptionEncodedProperlyInJSON() { + T8nServerSubCommand subject = new T8nServerSubCommand(); + ObjectMapper objectMapper = new ObjectMapper(); + + when(httpServerRequest.response()).thenReturn(httpServerResponse); + + // Should trigger a NPE within the try block. + subject.handleT8nRequest(httpServerRequest, objectMapper, null, null); + + ArgumentCaptor responseCodeCaptor = ArgumentCaptor.forClass(Integer.class); + ArgumentCaptor responseStringCaptor = ArgumentCaptor.forClass(String.class); + + verify(httpServerResponse).setStatusCode(responseCodeCaptor.capture()); + verify(httpServerResponse).end(responseStringCaptor.capture()); + + System.out.println(responseCodeCaptor.getValue()); + System.out.println(responseStringCaptor.getValue()); + assertThat(responseCodeCaptor.getValue()).isEqualTo(500); + assertThat(responseStringCaptor.getValue()).doesNotContain("\\t"); + } +}