From 6101cbf2bf48a976f6d27b90756bc4cd951f7e5e Mon Sep 17 00:00:00 2001 From: Simon Willnauer Date: Thu, 25 Jul 2013 08:14:20 +0200 Subject: [PATCH] Fix test that assumed a certain order of doc IDs with equal score If the score is equal in Lucene the order of the result depends on the actual global doc ID such that due to background merges or concurrency these test can return different result set orders. --- .../test/hamcrest/ElasticsearchAssertions.java | 12 ++++++++++++ .../integration/search/query/SimpleQueryTests.java | 10 +++------- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/test/java/org/elasticsearch/test/hamcrest/ElasticsearchAssertions.java b/src/test/java/org/elasticsearch/test/hamcrest/ElasticsearchAssertions.java index b0a653eedbfb9..302ff9290e6e7 100644 --- a/src/test/java/org/elasticsearch/test/hamcrest/ElasticsearchAssertions.java +++ b/src/test/java/org/elasticsearch/test/hamcrest/ElasticsearchAssertions.java @@ -31,6 +31,8 @@ import org.hamcrest.Matcher; import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.*; @@ -46,6 +48,16 @@ public class ElasticsearchAssertions { public static void assertHitCount(SearchResponse searchResponse, long expectedHitCount) { assertThat(searchResponse.getHits().totalHits(), is(expectedHitCount)); } + + public static void assertSearchHits(SearchResponse searchResponse, String... ids) { + assertThat("Expected different hit count", searchResponse.getHits().hits().length, equalTo(ids.length)); + + Set idsSet = new HashSet(Arrays.asList(ids)); + for (SearchHit hit : searchResponse.getHits()) { + assertThat("Expected id: " + hit.getId() + " in the result but wasn't", idsSet.remove(hit.getId()), equalTo(true)); + } + assertThat("Expected ids: " + Arrays.toString(idsSet.toArray(new String[0])) + " in the result - result size differs", idsSet.size(), equalTo(0)); + } public static void assertHitCount(CountResponse countResponse, long expectedHitCount) { assertThat(countResponse.getCount(), is(expectedHitCount)); diff --git a/src/test/java/org/elasticsearch/test/integration/search/query/SimpleQueryTests.java b/src/test/java/org/elasticsearch/test/integration/search/query/SimpleQueryTests.java index e4f3eadf104ba..254b7f9ba3f2f 100644 --- a/src/test/java/org/elasticsearch/test/integration/search/query/SimpleQueryTests.java +++ b/src/test/java/org/elasticsearch/test/integration/search/query/SimpleQueryTests.java @@ -39,13 +39,9 @@ import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder; import static org.elasticsearch.index.query.FilterBuilders.*; import static org.elasticsearch.index.query.QueryBuilders.*; -import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertHitCount; -import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertNoFailures; -import static org.hamcrest.MatcherAssert.assertThat; +import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.*; import static org.hamcrest.Matchers.anyOf; import static org.hamcrest.Matchers.equalTo; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; /** * @@ -545,8 +541,8 @@ public void testMultiMatchQuery() throws Exception { .execute().actionGet(); assertThat(searchResponse.getHits().totalHits(), equalTo(2l)); - assertThat("1", equalTo(searchResponse.getHits().getAt(0).id())); - assertThat("2", equalTo(searchResponse.getHits().getAt(1).id())); + // this uses dismax so scores are equal and the order can be arbitrary + assertSearchHits(searchResponse, "1", "2"); builder.useDisMax(false); searchResponse = client().prepareSearch()