forked from hyperledger/besu
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
test: Update JsonRpcExecutorHandlerTest for timeout handling and 408 …
…status - Add verification for 408 (Request Timeout) status code on timeout - Add verification for timer cancellation in timeout scenario - Update successful execution test to verify timer cancellation - Mock timerId retrieval from context This change ensures that a 408 status code is returned on timeout and that timer cancellation is properly tested in both timeout and successful execution scenarios, improving the test coverage and error handling for the JsonRpcExecutorHandler. Issue: hyperledger#5589 PR: hyperledger#7469 Signed-off-by: Ade Lucas <ade.lucas@consensys.net>
- Loading branch information
1 parent
5174295
commit fd91efb
Showing
3 changed files
with
110 additions
and
18 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
94 changes: 94 additions & 0 deletions
94
.../src/test/java/org/hyperledger/besu/ethereum/api/handlers/JsonRpcExecutorHandlerTest.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,94 @@ | ||
package org.hyperledger.besu.ethereum.api.handlers; | ||
|
||
import static org.mockito.ArgumentMatchers.any; | ||
import static org.mockito.ArgumentMatchers.anyInt; | ||
import static org.mockito.ArgumentMatchers.anyLong; | ||
import static org.mockito.ArgumentMatchers.contains; | ||
import static org.mockito.ArgumentMatchers.eq; | ||
import static org.mockito.Mockito.mock; | ||
import static org.mockito.Mockito.times; | ||
import static org.mockito.Mockito.verify; | ||
import static org.mockito.Mockito.when; | ||
|
||
import io.netty.handler.codec.http.HttpResponseStatus; | ||
import io.vertx.core.Handler; | ||
import io.vertx.core.Vertx; | ||
import io.vertx.core.http.HttpServerResponse; | ||
import io.vertx.ext.web.RoutingContext; | ||
import org.hyperledger.besu.ethereum.api.jsonrpc.execution.JsonRpcExecutor; | ||
import org.hyperledger.besu.ethereum.api.jsonrpc.JsonRpcConfiguration; | ||
import org.hyperledger.besu.ethereum.api.jsonrpc.context.ContextKey; | ||
import io.opentelemetry.api.trace.Tracer; | ||
import org.junit.jupiter.api.BeforeEach; | ||
import org.junit.jupiter.api.Test; | ||
import org.mockito.ArgumentCaptor; | ||
|
||
import java.io.IOException; | ||
|
||
class JsonRpcExecutorHandlerTest { | ||
|
||
private JsonRpcExecutor mockExecutor; | ||
private Tracer mockTracer; | ||
private JsonRpcConfiguration mockConfig; | ||
private RoutingContext mockContext; | ||
private Vertx mockVertx; | ||
private HttpServerResponse mockResponse; | ||
|
||
@BeforeEach | ||
void setUp() { | ||
mockExecutor = mock(JsonRpcExecutor.class); | ||
mockTracer = mock(Tracer.class); | ||
mockConfig = mock(JsonRpcConfiguration.class); | ||
mockContext = mock(RoutingContext.class); | ||
mockVertx = mock(Vertx.class); | ||
mockResponse = mock(HttpServerResponse.class); | ||
|
||
when(mockContext.vertx()).thenReturn(mockVertx); | ||
when(mockContext.response()).thenReturn(mockResponse); | ||
when(mockResponse.ended()).thenReturn(false); | ||
when(mockResponse.setStatusCode(anyInt())).thenReturn(mockResponse); | ||
} | ||
|
||
@Test | ||
void testTimeoutHandling() { | ||
// Arrange | ||
Handler<RoutingContext> handler = JsonRpcExecutorHandler.handler(mockExecutor, mockTracer, mockConfig); | ||
ArgumentCaptor<Long> delayCaptor = ArgumentCaptor.forClass(Long.class); | ||
@SuppressWarnings("unchecked") | ||
ArgumentCaptor<Handler<Long>> timerHandlerCaptor = ArgumentCaptor.forClass(Handler.class); | ||
|
||
when(mockContext.get(eq(ContextKey.REQUEST_BODY_AS_JSON_OBJECT.name()))).thenReturn("{}"); | ||
when(mockVertx.setTimer(delayCaptor.capture(), timerHandlerCaptor.capture())).thenReturn(1L); | ||
when(mockContext.get("timerId")).thenReturn(1L); | ||
|
||
// Act | ||
handler.handle(mockContext); | ||
|
||
// Assert | ||
verify(mockVertx).setTimer(eq(30000L), any()); | ||
|
||
// Simulate timeout | ||
timerHandlerCaptor.getValue().handle(1L); | ||
|
||
// Verify timeout handling | ||
verify(mockResponse, times(1)).setStatusCode(eq(HttpResponseStatus.REQUEST_TIMEOUT.code())); // Expect 408 Request Timeout | ||
verify(mockResponse, times(1)).end(contains("Timeout expired")); | ||
verify(mockVertx, times(1)).cancelTimer(1L); | ||
} | ||
|
||
@Test | ||
void testCancelTimerOnSuccessfulExecution() throws IOException { | ||
// Arrange | ||
Handler<RoutingContext> handler = JsonRpcExecutorHandler.handler(mockExecutor, mockTracer, mockConfig); | ||
when(mockContext.get(eq(ContextKey.REQUEST_BODY_AS_JSON_OBJECT.name()))).thenReturn("{}"); | ||
when(mockVertx.setTimer(anyLong(), any())).thenReturn(1L); | ||
when(mockContext.get("timerId")).thenReturn(1L); | ||
|
||
// Act | ||
handler.handle(mockContext); | ||
|
||
// Assert | ||
verify(mockVertx).setTimer(anyLong(), any()); | ||
verify(mockVertx).cancelTimer(1L); | ||
} | ||
} |