|
@@ -46,42 +46,41 @@ import static org.mockito.Mockito.doAnswer;
|
|
|
import static org.mockito.Mockito.mock;
|
|
|
import static org.mockito.Mockito.when;
|
|
|
|
|
|
+
|
|
|
public class BatchedDocumentsIteratorTests extends ESTestCase {
|
|
|
|
|
|
private static final String INDEX_NAME = ".ml-anomalies-foo";
|
|
|
private static final String SCROLL_ID = "someScrollId";
|
|
|
|
|
|
private Client client;
|
|
|
- private OriginSettingClient originSettingClient;
|
|
|
private boolean wasScrollCleared;
|
|
|
|
|
|
private TestIterator testIterator;
|
|
|
|
|
|
- private ArgumentCaptor<SearchRequest> searchRequestCaptor = ArgumentCaptor.forClass(SearchRequest.class);
|
|
|
- private ArgumentCaptor<SearchScrollRequest> searchScrollRequestCaptor = ArgumentCaptor.forClass(SearchScrollRequest.class);
|
|
|
-
|
|
|
@Before
|
|
|
public void setUpMocks() {
|
|
|
client = Mockito.mock(Client.class);
|
|
|
- originSettingClient = MockOriginSettingClient.mockOriginSettingClient(client, ClientHelper.ML_ORIGIN);
|
|
|
+ OriginSettingClient originSettingClient = MockOriginSettingClient.mockOriginSettingClient(client, ClientHelper.ML_ORIGIN);
|
|
|
wasScrollCleared = false;
|
|
|
testIterator = new TestIterator(originSettingClient, INDEX_NAME);
|
|
|
givenClearScrollRequest();
|
|
|
}
|
|
|
|
|
|
public void testQueryReturnsNoResults() {
|
|
|
- new ScrollResponsesMocker().finishMock();
|
|
|
+ ResponsesMocker scrollResponsesMocker = new ScrollResponsesMocker(client).finishMock();
|
|
|
|
|
|
assertTrue(testIterator.hasNext());
|
|
|
assertTrue(testIterator.next().isEmpty());
|
|
|
assertFalse(testIterator.hasNext());
|
|
|
assertTrue(wasScrollCleared);
|
|
|
- assertSearchRequest();
|
|
|
- assertSearchScrollRequests(0);
|
|
|
+ scrollResponsesMocker.assertSearchRequest(INDEX_NAME);
|
|
|
+ scrollResponsesMocker.assertSearchScrollRequests(0, SCROLL_ID);
|
|
|
}
|
|
|
|
|
|
public void testCallingNextWhenHasNextIsFalseThrows() {
|
|
|
- new ScrollResponsesMocker().addBatch(createJsonDoc("a"), createJsonDoc("b"), createJsonDoc("c")).finishMock();
|
|
|
+ new ScrollResponsesMocker(client)
|
|
|
+ .addBatch(createJsonDoc("a"), createJsonDoc("b"), createJsonDoc("c"))
|
|
|
+ .finishMock();
|
|
|
testIterator.next();
|
|
|
assertFalse(testIterator.hasNext());
|
|
|
|
|
@@ -89,7 +88,9 @@ public class BatchedDocumentsIteratorTests extends ESTestCase {
|
|
|
}
|
|
|
|
|
|
public void testQueryReturnsSingleBatch() {
|
|
|
- new ScrollResponsesMocker().addBatch(createJsonDoc("a"), createJsonDoc("b"), createJsonDoc("c")).finishMock();
|
|
|
+ ResponsesMocker scrollResponsesMocker = new ScrollResponsesMocker(client)
|
|
|
+ .addBatch(createJsonDoc("a"), createJsonDoc("b"), createJsonDoc("c"))
|
|
|
+ .finishMock();
|
|
|
|
|
|
assertTrue(testIterator.hasNext());
|
|
|
Deque<String> batch = testIterator.next();
|
|
@@ -98,16 +99,16 @@ public class BatchedDocumentsIteratorTests extends ESTestCase {
|
|
|
assertFalse(testIterator.hasNext());
|
|
|
assertTrue(wasScrollCleared);
|
|
|
|
|
|
- assertSearchRequest();
|
|
|
- assertSearchScrollRequests(0);
|
|
|
+ scrollResponsesMocker.assertSearchRequest(INDEX_NAME);
|
|
|
+ scrollResponsesMocker.assertSearchScrollRequests(0, SCROLL_ID);
|
|
|
}
|
|
|
|
|
|
public void testQueryReturnsThreeBatches() {
|
|
|
- new ScrollResponsesMocker()
|
|
|
- .addBatch(createJsonDoc("a"), createJsonDoc("b"), createJsonDoc("c"))
|
|
|
- .addBatch(createJsonDoc("d"), createJsonDoc("e"))
|
|
|
- .addBatch(createJsonDoc("f"))
|
|
|
- .finishMock();
|
|
|
+ ResponsesMocker responsesMocker = new ScrollResponsesMocker(client)
|
|
|
+ .addBatch(createJsonDoc("a"), createJsonDoc("b"), createJsonDoc("c"))
|
|
|
+ .addBatch(createJsonDoc("d"), createJsonDoc("e"))
|
|
|
+ .addBatch(createJsonDoc("f"))
|
|
|
+ .finishMock();
|
|
|
|
|
|
assertTrue(testIterator.hasNext());
|
|
|
|
|
@@ -126,8 +127,8 @@ public class BatchedDocumentsIteratorTests extends ESTestCase {
|
|
|
assertFalse(testIterator.hasNext());
|
|
|
assertTrue(wasScrollCleared);
|
|
|
|
|
|
- assertSearchRequest();
|
|
|
- assertSearchScrollRequests(2);
|
|
|
+ responsesMocker.assertSearchRequest(INDEX_NAME);
|
|
|
+ responsesMocker.assertSearchScrollRequests(2, SCROLL_ID);
|
|
|
}
|
|
|
|
|
|
private String createJsonDoc(String value) {
|
|
@@ -144,55 +145,94 @@ public class BatchedDocumentsIteratorTests extends ESTestCase {
|
|
|
}).when(client).execute(eq(ClearScrollAction.INSTANCE), any(), any());
|
|
|
}
|
|
|
|
|
|
- private void assertSearchRequest() {
|
|
|
- List<SearchRequest> searchRequests = searchRequestCaptor.getAllValues();
|
|
|
- assertThat(searchRequests.size(), equalTo(1));
|
|
|
- SearchRequest searchRequest = searchRequests.get(0);
|
|
|
- assertThat(searchRequest.indices(), equalTo(new String[] {INDEX_NAME}));
|
|
|
- assertThat(searchRequest.scroll().keepAlive(), equalTo(TimeValue.timeValueMinutes(5)));
|
|
|
- assertThat(searchRequest.source().query(), equalTo(QueryBuilders.matchAllQuery()));
|
|
|
- assertThat(searchRequest.source().trackTotalHitsUpTo(), is(SearchContext.TRACK_TOTAL_HITS_ACCURATE));
|
|
|
- }
|
|
|
|
|
|
- private void assertSearchScrollRequests(int expectedCount) {
|
|
|
- List<SearchScrollRequest> searchScrollRequests = searchScrollRequestCaptor.getAllValues();
|
|
|
- assertThat(searchScrollRequests.size(), equalTo(expectedCount));
|
|
|
- for (SearchScrollRequest request : searchScrollRequests) {
|
|
|
- assertThat(request.scrollId(), equalTo(SCROLL_ID));
|
|
|
- assertThat(request.scroll().keepAlive(), equalTo(TimeValue.timeValueMinutes(5)));
|
|
|
- }
|
|
|
- }
|
|
|
+ abstract static class ResponsesMocker {
|
|
|
+ protected Client client;
|
|
|
+ protected List<String[]> batches = new ArrayList<>();
|
|
|
+ protected long totalHits = 0;
|
|
|
+ protected List<SearchResponse> responses = new ArrayList<>();
|
|
|
|
|
|
- private class ScrollResponsesMocker {
|
|
|
- private List<String[]> batches = new ArrayList<>();
|
|
|
- private long totalHits = 0;
|
|
|
- private List<SearchResponse> responses = new ArrayList<>();
|
|
|
+ protected AtomicInteger responseIndex = new AtomicInteger(0);
|
|
|
|
|
|
- private AtomicInteger responseIndex = new AtomicInteger(0);
|
|
|
+ protected ArgumentCaptor<SearchRequest> searchRequestCaptor = ArgumentCaptor.forClass(SearchRequest.class);
|
|
|
+ protected ArgumentCaptor<SearchScrollRequest> searchScrollRequestCaptor = ArgumentCaptor.forClass(SearchScrollRequest.class);
|
|
|
|
|
|
- ScrollResponsesMocker addBatch(String... hits) {
|
|
|
+ ResponsesMocker(Client client) {
|
|
|
+ this.client = client;
|
|
|
+ }
|
|
|
+
|
|
|
+ ResponsesMocker addBatch(String... hits) {
|
|
|
totalHits += hits.length;
|
|
|
batches.add(hits);
|
|
|
return this;
|
|
|
}
|
|
|
|
|
|
- @SuppressWarnings({"unchecked", "rawtypes"})
|
|
|
- void finishMock() {
|
|
|
+ abstract ResponsesMocker finishMock();
|
|
|
+
|
|
|
+
|
|
|
+ protected SearchResponse createSearchResponseWithHits(String... hits) {
|
|
|
+ SearchHits searchHits = createHits(hits);
|
|
|
+ SearchResponse searchResponse = mock(SearchResponse.class);
|
|
|
+ when(searchResponse.getScrollId()).thenReturn(SCROLL_ID);
|
|
|
+ when(searchResponse.getHits()).thenReturn(searchHits);
|
|
|
+ return searchResponse;
|
|
|
+ }
|
|
|
+
|
|
|
+ protected SearchHits createHits(String... values) {
|
|
|
+ List<SearchHit> hits = new ArrayList<>();
|
|
|
+ for (String value : values) {
|
|
|
+ hits.add(new SearchHitBuilder(randomInt()).setSource(value).build());
|
|
|
+ }
|
|
|
+ return new SearchHits(hits.toArray(new SearchHit[hits.size()]), new TotalHits(totalHits, TotalHits.Relation.EQUAL_TO), 1.0f);
|
|
|
+ }
|
|
|
+
|
|
|
+ void assertSearchRequest(String indexName) {
|
|
|
+ List<SearchRequest> searchRequests = searchRequestCaptor.getAllValues();
|
|
|
+ assertThat(searchRequests.size(), equalTo(1));
|
|
|
+ SearchRequest searchRequest = searchRequests.get(0);
|
|
|
+ assertThat(searchRequest.indices(), equalTo(new String[] {indexName}));
|
|
|
+ assertThat(searchRequest.scroll().keepAlive(), equalTo(TimeValue.timeValueMinutes(5)));
|
|
|
+ assertThat(searchRequest.source().query(), equalTo(QueryBuilders.matchAllQuery()));
|
|
|
+ assertThat(searchRequest.source().trackTotalHitsUpTo(), is(SearchContext.TRACK_TOTAL_HITS_ACCURATE));
|
|
|
+ }
|
|
|
+
|
|
|
+ void assertSearchScrollRequests(int expectedCount, String scrollId) {
|
|
|
+ List<SearchScrollRequest> searchScrollRequests = searchScrollRequestCaptor.getAllValues();
|
|
|
+ assertThat(searchScrollRequests.size(), equalTo(expectedCount));
|
|
|
+ for (SearchScrollRequest request : searchScrollRequests) {
|
|
|
+ assertThat(request.scrollId(), equalTo(scrollId));
|
|
|
+ assertThat(request.scroll().keepAlive(), equalTo(TimeValue.timeValueMinutes(5)));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ static class ScrollResponsesMocker extends ResponsesMocker {
|
|
|
+
|
|
|
+ ScrollResponsesMocker(Client client) {
|
|
|
+ super(client);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @SuppressWarnings("unchecked")
|
|
|
+ ResponsesMocker finishMock()
|
|
|
+ {
|
|
|
if (batches.isEmpty()) {
|
|
|
givenInitialResponse();
|
|
|
- return;
|
|
|
+ return this;
|
|
|
}
|
|
|
+
|
|
|
givenInitialResponse(batches.get(0));
|
|
|
for (int i = 1; i < batches.size(); ++i) {
|
|
|
- givenNextResponse(batches.get(i));
|
|
|
- }
|
|
|
- if (responses.size() > 0) {
|
|
|
- doAnswer(invocationOnMock -> {
|
|
|
- ActionListener<SearchResponse> listener = (ActionListener<SearchResponse>) invocationOnMock.getArguments()[2];
|
|
|
- listener.onResponse(responses.get(responseIndex.getAndIncrement()));
|
|
|
- return null;
|
|
|
- }).when(client).execute(eq(SearchScrollAction.INSTANCE), searchScrollRequestCaptor.capture(), any());
|
|
|
+ responses.add(createSearchResponseWithHits(batches.get(i)));
|
|
|
}
|
|
|
+
|
|
|
+ doAnswer(invocationOnMock -> {
|
|
|
+ ActionListener<SearchResponse> listener = (ActionListener<SearchResponse>) invocationOnMock.getArguments()[2];
|
|
|
+ listener.onResponse(responses.get(responseIndex.getAndIncrement()));
|
|
|
+ return null;
|
|
|
+ }).when(client).execute(eq(SearchScrollAction.INSTANCE), searchScrollRequestCaptor.capture(), any());
|
|
|
+
|
|
|
+ return this;
|
|
|
}
|
|
|
|
|
|
@SuppressWarnings("unchecked")
|
|
@@ -205,28 +245,43 @@ public class BatchedDocumentsIteratorTests extends ESTestCase {
|
|
|
return null;
|
|
|
}).when(client).execute(eq(SearchAction.INSTANCE), searchRequestCaptor.capture(), any());
|
|
|
}
|
|
|
+ }
|
|
|
|
|
|
- private void givenNextResponse(String... hits) {
|
|
|
- responses.add(createSearchResponseWithHits(hits));
|
|
|
- }
|
|
|
+ static class SearchResponsesMocker extends ResponsesMocker {
|
|
|
|
|
|
- private SearchResponse createSearchResponseWithHits(String... hits) {
|
|
|
- SearchHits searchHits = createHits(hits);
|
|
|
- SearchResponse searchResponse = mock(SearchResponse.class);
|
|
|
- when(searchResponse.getScrollId()).thenReturn(SCROLL_ID);
|
|
|
- when(searchResponse.getHits()).thenReturn(searchHits);
|
|
|
- return searchResponse;
|
|
|
+ SearchResponsesMocker(Client client) {
|
|
|
+ super(client);
|
|
|
}
|
|
|
|
|
|
- private SearchHits createHits(String... values) {
|
|
|
- List<SearchHit> hits = new ArrayList<>();
|
|
|
- for (String value : values) {
|
|
|
- hits.add(new SearchHitBuilder(randomInt()).setSource(value).build());
|
|
|
+ @Override
|
|
|
+ @SuppressWarnings("unchecked")
|
|
|
+ ResponsesMocker finishMock()
|
|
|
+ {
|
|
|
+ if (batches.isEmpty()) {
|
|
|
+ doAnswer(invocationOnMock -> {
|
|
|
+ ActionListener<SearchResponse> listener = (ActionListener<SearchResponse>) invocationOnMock.getArguments()[2];
|
|
|
+ listener.onResponse(createSearchResponseWithHits());
|
|
|
+ return null;
|
|
|
+ }).when(client).execute(eq(SearchAction.INSTANCE), searchRequestCaptor.capture(), any());
|
|
|
+
|
|
|
+ return this;
|
|
|
}
|
|
|
- return new SearchHits(hits.toArray(new SearchHit[hits.size()]), new TotalHits(totalHits, TotalHits.Relation.EQUAL_TO), 1.0f);
|
|
|
+
|
|
|
+ for (String[] batch : batches) {
|
|
|
+ responses.add(createSearchResponseWithHits(batch));
|
|
|
+ }
|
|
|
+
|
|
|
+ doAnswer(invocationOnMock -> {
|
|
|
+ ActionListener<SearchResponse> listener = (ActionListener<SearchResponse>) invocationOnMock.getArguments()[2];
|
|
|
+ listener.onResponse(responses.get(responseIndex.getAndIncrement()));
|
|
|
+ return null;
|
|
|
+ }).when(client).execute(eq(SearchAction.INSTANCE), searchRequestCaptor.capture(), any());
|
|
|
+
|
|
|
+ return this;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+
|
|
|
private static class TestIterator extends BatchedDocumentsIterator<String> {
|
|
|
TestIterator(OriginSettingClient client, String jobId) {
|
|
|
super(client, jobId);
|