Skip to content

Commit b2c732c

Browse files
committed
increase test coverage for 2.x branch
Signed-off-by: Lantao Jin <ltjin@amazon.com>
1 parent 0678fe0 commit b2c732c

6 files changed

Lines changed: 329 additions & 0 deletions

File tree

core/src/test/java/org/opensearch/sql/storage/TableScanOperatorTest.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,4 +56,10 @@ public Boolean visitTableScan(TableScanOperator node, Object context) {
5656
public void getChild() {
5757
assertTrue(tableScan.getChild().isEmpty());
5858
}
59+
60+
@Test
61+
public void forceClose_delegates_to_close() {
62+
// Default forceClose() delegates to close(), which should not throw
63+
tableScan.forceClose();
64+
}
5965
}

opensearch/src/test/java/org/opensearch/sql/opensearch/client/OpenSearchNodeClientTest.java

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -422,6 +422,86 @@ void cleanup_pit_request_throw_exception() {
422422
assertThrows(RuntimeException.class, () -> client.deletePit(deletePitRequest));
423423
}
424424

425+
@Test
426+
void forceCleanup_scroll_request_throws() {
427+
OpenSearchScrollRequest request =
428+
new OpenSearchScrollRequest(
429+
new OpenSearchRequest.IndexName("test"),
430+
TimeValue.timeValueMinutes(1),
431+
new SearchSourceBuilder(),
432+
factory,
433+
List.of());
434+
assertThrows(UnsupportedOperationException.class, () -> client.forceCleanup(request));
435+
}
436+
437+
@Test
438+
@SneakyThrows
439+
void forceCleanup_scroll_request_with_mock() {
440+
ClearScrollRequestBuilder requestBuilder = mock(ClearScrollRequestBuilder.class);
441+
when(nodeClient.prepareClearScroll()).thenReturn(requestBuilder);
442+
when(requestBuilder.addScrollId(any())).thenReturn(requestBuilder);
443+
when(requestBuilder.get()).thenReturn(null);
444+
445+
OpenSearchScrollRequest request = mock(OpenSearchScrollRequest.class);
446+
// Make forceClean invoke the lambda to cover the scroll cleanup path
447+
org.mockito.Mockito.doAnswer(
448+
invocation -> {
449+
java.util.function.Consumer<String> action = invocation.getArgument(0);
450+
action.accept("scroll123");
451+
return null;
452+
})
453+
.when(request)
454+
.forceClean(any());
455+
client.forceCleanup(request);
456+
verify(nodeClient).prepareClearScroll();
457+
}
458+
459+
@Test
460+
@SneakyThrows
461+
void forceCleanup_scroll_request_with_exception() {
462+
when(nodeClient.prepareClearScroll()).thenThrow(new RuntimeException());
463+
OpenSearchScrollRequest request = mock(OpenSearchScrollRequest.class);
464+
org.mockito.Mockito.doAnswer(
465+
invocation -> {
466+
java.util.function.Consumer<String> action = invocation.getArgument(0);
467+
action.accept("scroll123");
468+
return null;
469+
})
470+
.when(request)
471+
.forceClean(any());
472+
assertThrows(IllegalStateException.class, () -> client.forceCleanup(request));
473+
}
474+
475+
@Test
476+
@SneakyThrows
477+
void forceCleanup_pit_request() {
478+
OpenSearchQueryRequest request =
479+
new OpenSearchQueryRequest(
480+
new OpenSearchRequest.IndexName("test"),
481+
new SearchSourceBuilder(),
482+
factory,
483+
List.of(),
484+
TimeValue.timeValueMinutes(1L),
485+
"samplePitId");
486+
client.forceCleanup(request);
487+
verify(nodeClient).execute(any(), any());
488+
}
489+
490+
@Test
491+
@SneakyThrows
492+
void forceCleanup_pit_request_without_pitId() {
493+
OpenSearchQueryRequest request =
494+
new OpenSearchQueryRequest(
495+
new OpenSearchRequest.IndexName("test"),
496+
new SearchSourceBuilder(),
497+
factory,
498+
List.of(),
499+
TimeValue.timeValueMinutes(1L),
500+
null);
501+
client.forceCleanup(request);
502+
verify(nodeClient, never()).execute(any(), any());
503+
}
504+
425505
@Test
426506
@SneakyThrows
427507
void create_pit() {

opensearch/src/test/java/org/opensearch/sql/opensearch/client/OpenSearchRestClientTest.java

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -448,6 +448,81 @@ void cleanup_pit_request_throw_exception() {
448448
assertThrows(RuntimeException.class, () -> client.cleanup(request));
449449
}
450450

451+
@Test
452+
void forceCleanup_scroll_request_throws() {
453+
OpenSearchScrollRequest request =
454+
new OpenSearchScrollRequest(
455+
new OpenSearchRequest.IndexName("test"),
456+
TimeValue.timeValueMinutes(1),
457+
new SearchSourceBuilder(),
458+
factory,
459+
List.of());
460+
assertThrows(UnsupportedOperationException.class, () -> client.forceCleanup(request));
461+
}
462+
463+
@Test
464+
@SneakyThrows
465+
void forceCleanup_scroll_request_with_mock() {
466+
OpenSearchScrollRequest request = mock(OpenSearchScrollRequest.class);
467+
// Make forceClean invoke the lambda to cover the scroll cleanup path
468+
org.mockito.Mockito.doAnswer(
469+
invocation -> {
470+
java.util.function.Consumer<String> action = invocation.getArgument(0);
471+
action.accept("scroll123");
472+
return null;
473+
})
474+
.when(request)
475+
.forceClean(any());
476+
client.forceCleanup(request);
477+
verify(restClient).clearScroll(any(), any());
478+
}
479+
480+
@Test
481+
@SneakyThrows
482+
void forceCleanup_scroll_request_with_IOException() {
483+
when(restClient.clearScroll(any(), any())).thenThrow(new IOException());
484+
OpenSearchScrollRequest request = mock(OpenSearchScrollRequest.class);
485+
org.mockito.Mockito.doAnswer(
486+
invocation -> {
487+
java.util.function.Consumer<String> action = invocation.getArgument(0);
488+
action.accept("scroll123");
489+
return null;
490+
})
491+
.when(request)
492+
.forceClean(any());
493+
assertThrows(IllegalStateException.class, () -> client.forceCleanup(request));
494+
}
495+
496+
@Test
497+
@SneakyThrows
498+
void forceCleanup_pit_request() {
499+
OpenSearchQueryRequest request =
500+
new OpenSearchQueryRequest(
501+
new OpenSearchRequest.IndexName("test"),
502+
new SearchSourceBuilder(),
503+
factory,
504+
List.of(),
505+
TimeValue.timeValueMinutes(1L),
506+
"samplePitId");
507+
client.forceCleanup(request);
508+
verify(restClient).deletePit(any(), any());
509+
}
510+
511+
@Test
512+
@SneakyThrows
513+
void forceCleanup_pit_request_without_pitId() {
514+
OpenSearchQueryRequest request =
515+
new OpenSearchQueryRequest(
516+
new OpenSearchRequest.IndexName("test"),
517+
new SearchSourceBuilder(),
518+
factory,
519+
List.of(),
520+
TimeValue.timeValueMinutes(1L),
521+
null);
522+
client.forceCleanup(request);
523+
verify(restClient, never()).deletePit(any(), any());
524+
}
525+
451526
@Test
452527
@SneakyThrows
453528
void create_pit() {

opensearch/src/test/java/org/opensearch/sql/opensearch/data/utils/OpenSearchJsonContentTest.java

Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,13 @@
1212

1313
import com.fasterxml.jackson.core.JsonParser;
1414
import com.fasterxml.jackson.databind.JsonNode;
15+
import com.fasterxml.jackson.databind.node.JsonNodeType;
1516
import java.io.IOException;
17+
import org.apache.logging.log4j.Level;
18+
import org.apache.logging.log4j.LogManager;
19+
import org.apache.logging.log4j.core.LoggerContext;
20+
import org.apache.logging.log4j.core.config.Configuration;
21+
import org.apache.logging.log4j.core.config.LoggerConfig;
1622
import org.junit.jupiter.api.Test;
1723
import org.opensearch.OpenSearchParseException;
1824

@@ -28,4 +34,127 @@ public void testGetValueWithIOException() throws IOException {
2834
assertThrows(OpenSearchParseException.class, content::geoValue);
2935
assertTrue(exception.getMessage().contains("error parsing geo point"));
3036
}
37+
38+
@Test
39+
public void testGeoValueWithIOExceptionAndDebugEnabled() throws IOException {
40+
LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
41+
Configuration config = ctx.getConfiguration();
42+
LoggerConfig loggerConfig = config.getLoggerConfig(OpenSearchJsonContent.class.getName());
43+
Level previousLevel = loggerConfig.getLevel();
44+
loggerConfig.setLevel(Level.DEBUG);
45+
ctx.updateLoggers();
46+
try {
47+
JsonNode jsonNode = mock(JsonNode.class);
48+
JsonParser jsonParser = mock(JsonParser.class);
49+
when(jsonNode.traverse()).thenReturn(jsonParser);
50+
when(jsonParser.nextToken()).thenThrow(new IOException());
51+
OpenSearchJsonContent content = new OpenSearchJsonContent(jsonNode);
52+
assertThrows(OpenSearchParseException.class, content::geoValue);
53+
} finally {
54+
loggerConfig.setLevel(previousLevel);
55+
ctx.updateLoggers();
56+
}
57+
}
58+
59+
@Test
60+
public void testLongValueWithInvalidNodeAndDebugEnabled() {
61+
LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
62+
Configuration config = ctx.getConfiguration();
63+
LoggerConfig loggerConfig = config.getLoggerConfig(OpenSearchJsonContent.class.getName());
64+
Level previousLevel = loggerConfig.getLevel();
65+
loggerConfig.setLevel(Level.DEBUG);
66+
ctx.updateLoggers();
67+
try {
68+
JsonNode jsonNode = mock(JsonNode.class);
69+
when(jsonNode.isNumber()).thenReturn(false);
70+
when(jsonNode.isTextual()).thenReturn(false);
71+
when(jsonNode.getNodeType()).thenReturn(JsonNodeType.ARRAY);
72+
OpenSearchJsonContent content = new OpenSearchJsonContent(jsonNode);
73+
assertThrows(OpenSearchParseException.class, content::longValue);
74+
} finally {
75+
loggerConfig.setLevel(previousLevel);
76+
ctx.updateLoggers();
77+
}
78+
}
79+
80+
@Test
81+
public void testDoubleValueWithInvalidNodeAndDebugEnabled() {
82+
LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
83+
Configuration config = ctx.getConfiguration();
84+
LoggerConfig loggerConfig = config.getLoggerConfig(OpenSearchJsonContent.class.getName());
85+
Level previousLevel = loggerConfig.getLevel();
86+
loggerConfig.setLevel(Level.DEBUG);
87+
ctx.updateLoggers();
88+
try {
89+
JsonNode jsonNode = mock(JsonNode.class);
90+
when(jsonNode.isNumber()).thenReturn(false);
91+
when(jsonNode.isTextual()).thenReturn(false);
92+
when(jsonNode.getNodeType()).thenReturn(JsonNodeType.OBJECT);
93+
OpenSearchJsonContent content = new OpenSearchJsonContent(jsonNode);
94+
assertThrows(OpenSearchParseException.class, content::doubleValue);
95+
} finally {
96+
loggerConfig.setLevel(previousLevel);
97+
ctx.updateLoggers();
98+
}
99+
}
100+
101+
@Test
102+
public void testBooleanValueWithInvalidNodeAndDebugEnabled() {
103+
LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
104+
Configuration config = ctx.getConfiguration();
105+
LoggerConfig loggerConfig = config.getLoggerConfig(OpenSearchJsonContent.class.getName());
106+
Level previousLevel = loggerConfig.getLevel();
107+
loggerConfig.setLevel(Level.DEBUG);
108+
ctx.updateLoggers();
109+
try {
110+
JsonNode jsonNode = mock(JsonNode.class);
111+
when(jsonNode.isBoolean()).thenReturn(false);
112+
when(jsonNode.isTextual()).thenReturn(false);
113+
when(jsonNode.getNodeType()).thenReturn(JsonNodeType.ARRAY);
114+
OpenSearchJsonContent content = new OpenSearchJsonContent(jsonNode);
115+
assertThrows(OpenSearchParseException.class, content::booleanValue);
116+
} finally {
117+
loggerConfig.setLevel(previousLevel);
118+
ctx.updateLoggers();
119+
}
120+
}
121+
122+
@Test
123+
public void testLongValueWithInvalidNode() {
124+
JsonNode jsonNode = mock(JsonNode.class);
125+
when(jsonNode.isNumber()).thenReturn(false);
126+
when(jsonNode.isTextual()).thenReturn(false);
127+
when(jsonNode.getNodeType()).thenReturn(JsonNodeType.ARRAY);
128+
OpenSearchJsonContent content = new OpenSearchJsonContent(jsonNode);
129+
OpenSearchParseException exception =
130+
assertThrows(OpenSearchParseException.class, content::longValue);
131+
assertTrue(exception.getMessage().contains("node must be a number"));
132+
assertTrue(exception.getMessage().contains("ARRAY"));
133+
}
134+
135+
@Test
136+
public void testDoubleValueWithInvalidNode() {
137+
JsonNode jsonNode = mock(JsonNode.class);
138+
when(jsonNode.isNumber()).thenReturn(false);
139+
when(jsonNode.isTextual()).thenReturn(false);
140+
when(jsonNode.getNodeType()).thenReturn(JsonNodeType.OBJECT);
141+
OpenSearchJsonContent content = new OpenSearchJsonContent(jsonNode);
142+
OpenSearchParseException exception =
143+
assertThrows(OpenSearchParseException.class, content::doubleValue);
144+
assertTrue(exception.getMessage().contains("node must be a number"));
145+
assertTrue(exception.getMessage().contains("OBJECT"));
146+
}
147+
148+
@Test
149+
public void testBooleanValueWithInvalidNode() {
150+
JsonNode jsonNode = mock(JsonNode.class);
151+
when(jsonNode.isBoolean()).thenReturn(false);
152+
when(jsonNode.isTextual()).thenReturn(false);
153+
when(jsonNode.getNodeType()).thenReturn(JsonNodeType.ARRAY);
154+
OpenSearchJsonContent content = new OpenSearchJsonContent(jsonNode);
155+
OpenSearchParseException exception =
156+
assertThrows(OpenSearchParseException.class, content::booleanValue);
157+
assertTrue(exception.getMessage().contains("node must be a boolean"));
158+
assertTrue(exception.getMessage().contains("ARRAY"));
159+
}
31160
}

opensearch/src/test/java/org/opensearch/sql/opensearch/request/OpenSearchQueryRequestTest.java

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -411,6 +411,40 @@ void testCleanConditionFalse_pidNull() {
411411
assertNull(request.getPitId());
412412
}
413413

414+
@Test
415+
void forceClean_with_pitId() {
416+
OpenSearchQueryRequest request =
417+
new OpenSearchQueryRequest(
418+
new OpenSearchRequest.IndexName("test"),
419+
sourceBuilder,
420+
factory,
421+
List.of(),
422+
new TimeValue(1000),
423+
"samplePid");
424+
425+
request.forceClean(cleanAction);
426+
verify(cleanAction, times(1)).accept("samplePid");
427+
assertTrue(request.isSearchDone());
428+
assertNull(request.getPitId());
429+
}
430+
431+
@Test
432+
void forceClean_without_pitId() {
433+
OpenSearchQueryRequest request =
434+
new OpenSearchQueryRequest(
435+
new OpenSearchRequest.IndexName("test"),
436+
sourceBuilder,
437+
factory,
438+
List.of(),
439+
new TimeValue(1000),
440+
null);
441+
442+
request.forceClean(cleanAction);
443+
verify(cleanAction, never()).accept(anyString());
444+
assertFalse(request.isSearchDone());
445+
assertNull(request.getPitId());
446+
}
447+
414448
@Test
415449
void searchRequest() {
416450
request.getSourceBuilder().query(QueryBuilders.termQuery("name", "John"));

opensearch/src/test/java/org/opensearch/sql/opensearch/request/OpenSearchScrollRequestTest.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -306,6 +306,11 @@ void serialize_deserialize_needClean() {
306306
assertEquals("", newRequest.getScrollId());
307307
}
308308

309+
@Test
310+
void forceClean_throws_unsupported() {
311+
assertThrows(UnsupportedOperationException.class, () -> request.forceClean(scrollId -> {}));
312+
}
313+
309314
@Test
310315
void setScrollId() {
311316
request.setScrollId("test");

0 commit comments

Comments
 (0)