Skip to content

Commit affab20

Browse files
committed
Fix issues
1 parent 38d3dce commit affab20

File tree

2 files changed

+42
-1
lines changed

2 files changed

+42
-1
lines changed

src/main/java/org/sonarsource/sonarqube/mcp/transport/StdioServerTransportProvider.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,8 +91,12 @@ public StdioServerTransportProvider(ObjectMapper objectMapper) {
9191
* Returns false when running tests to avoid terminating the test runner.
9292
*/
9393
private static boolean shouldExitOnStdinEof() {
94+
return shouldExitOnStdinEof(Thread.currentThread().getStackTrace());
95+
}
96+
97+
static boolean shouldExitOnStdinEof(StackTraceElement[] stackTrace) {
9498
// Check if we're running in test mode
95-
var stackTrace = Thread.currentThread().getStackTrace();
99+
// Common indicators: JUnit, Gradle test runner, Maven Surefire
96100
for (var element : stackTrace) {
97101
if (element.getClassName().startsWith("org.junit.")) {
98102
return false;

src/test/java/org/sonarsource/sonarqube/mcp/transport/StdioServerTransportProviderTest.java

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import org.mockito.Mockito;
2424
import reactor.core.publisher.Mono;
2525

26+
import static org.assertj.core.api.Assertions.assertThat;
2627
import static org.assertj.core.api.Assertions.assertThatCode;
2728
import static org.mockito.Mockito.mock;
2829
import static org.mockito.Mockito.never;
@@ -123,5 +124,41 @@ void closeGracefully_should_complete_immediately_if_session_closes_in_5_seconds(
123124
verify(mockSession, never()).close();
124125
}
125126

127+
@Test
128+
void shouldExitOnStdinEof_should_return_true_for_production_stack_trace() {
129+
// Simulate a production stack trace with no test frameworks
130+
var stackTrace = new StackTraceElement[] {
131+
new StackTraceElement("com.example.MyApp", "main", "MyApp.java", 10),
132+
new StackTraceElement("com.example.MyService", "start", "MyService.java", 20),
133+
new StackTraceElement("java.lang.Thread", "run", "Thread.java", 100)
134+
};
135+
136+
boolean result = StdioServerTransportProvider.shouldExitOnStdinEof(stackTrace);
137+
138+
assertThat(result).isTrue();
139+
}
140+
141+
@Test
142+
void shouldExitOnStdinEof_should_return_false_when_junit_in_stack_trace() {
143+
// Simulate a test stack trace with JUnit
144+
var stackTrace = new StackTraceElement[] {
145+
new StackTraceElement("org.junit.jupiter.engine.execution.ExecutableInvoker", "invoke", "ExecutableInvoker.java", 20)
146+
};
147+
148+
boolean result = StdioServerTransportProvider.shouldExitOnStdinEof(stackTrace);
149+
150+
assertThat(result).isFalse();
151+
}
152+
153+
@Test
154+
void shouldExitOnStdinEof_should_return_true_for_empty_stack_trace() {
155+
// Edge case: empty stack trace
156+
var stackTrace = new StackTraceElement[] {};
157+
158+
boolean result = StdioServerTransportProvider.shouldExitOnStdinEof(stackTrace);
159+
160+
assertThat(result).isTrue();
161+
}
162+
126163
}
127164

0 commit comments

Comments
 (0)