[Test] Add unit test for XContentParserUtilsTests.parseStoredFieldsValue (#25288)

This commit is contained in:
Tanguy Leroux 2017-06-23 10:54:26 +02:00 committed by GitHub
parent fdb3a97152
commit 6a792d6d82
1 changed files with 75 additions and 0 deletions

View File

@ -20,19 +20,24 @@
package org.elasticsearch.common.xcontent; package org.elasticsearch.common.xcontent;
import org.apache.lucene.util.SetOnce; import org.apache.lucene.util.SetOnce;
import org.elasticsearch.common.CheckedBiConsumer;
import org.elasticsearch.common.ParseField; import org.elasticsearch.common.ParseField;
import org.elasticsearch.common.ParsingException; import org.elasticsearch.common.ParsingException;
import org.elasticsearch.common.bytes.BytesArray;
import org.elasticsearch.common.bytes.BytesReference; import org.elasticsearch.common.bytes.BytesReference;
import org.elasticsearch.common.xcontent.json.JsonXContent; import org.elasticsearch.common.xcontent.json.JsonXContent;
import org.elasticsearch.test.ESTestCase; import org.elasticsearch.test.ESTestCase;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Base64;
import java.util.List; import java.util.List;
import static org.elasticsearch.common.xcontent.XContentHelper.toXContent; import static org.elasticsearch.common.xcontent.XContentHelper.toXContent;
import static org.elasticsearch.common.xcontent.XContentParserUtils.ensureExpectedToken; import static org.elasticsearch.common.xcontent.XContentParserUtils.ensureExpectedToken;
import static org.elasticsearch.common.xcontent.XContentParserUtils.ensureFieldName;
import static org.elasticsearch.common.xcontent.XContentParserUtils.parseTypedKeysObject; import static org.elasticsearch.common.xcontent.XContentParserUtils.parseTypedKeysObject;
import static org.hamcrest.Matchers.containsString;
public class XContentParserUtilsTests extends ESTestCase { public class XContentParserUtilsTests extends ESTestCase {
@ -49,6 +54,76 @@ public class XContentParserUtilsTests extends ESTestCase {
} }
} }
public void testParseStoredFieldsValueString() throws IOException {
final String value = randomAlphaOfLengthBetween(0, 10);
assertParseStoredFieldsValue(value, (xcontentType, result) -> assertEquals(value, result));
}
public void testParseStoredFieldsValueInt() throws IOException {
final Integer value = randomInt();
assertParseStoredFieldsValue(value, (xcontentType, result) -> assertEquals(value, result));
}
public void testParseStoredFieldsValueLong() throws IOException {
final Long value = randomLong();
assertParseStoredFieldsValue(value, (xcontentType, result) -> assertEquals(value, result));
}
public void testParseStoredFieldsValueDouble() throws IOException {
final Double value = randomDouble();
assertParseStoredFieldsValue(value, (xcontentType, result) -> assertEquals(value, ((Number) result).doubleValue(), 0.0d));
}
public void testParseStoredFieldsValueFloat() throws IOException {
final Float value = randomFloat();
assertParseStoredFieldsValue(value, (xcontentType, result) -> assertEquals(value, ((Number) result).floatValue(), 0.0f));
}
public void testParseStoredFieldsValueBoolean() throws IOException {
final Boolean value = randomBoolean();
assertParseStoredFieldsValue(value, (xcontentType, result) -> assertEquals(value, result));
}
public void testParseStoredFieldsValueBinary() throws IOException {
final byte[] value = randomUnicodeOfLength(scaledRandomIntBetween(10, 1000)).getBytes("UTF-8");
assertParseStoredFieldsValue(value, (xcontentType, result) -> {
if (xcontentType == XContentType.JSON || xcontentType == XContentType.YAML) {
//binary values will be parsed back and returned as base64 strings when reading from json and yaml
assertArrayEquals(value, Base64.getDecoder().decode((String) result));
} else {
//binary values will be parsed back and returned as BytesArray when reading from cbor and smile
assertArrayEquals(value, ((BytesArray) result).array());
}
});
}
public void testParseStoredFieldsValueUnknown() throws IOException {
ParsingException e = expectThrows(ParsingException.class, () ->
assertParseStoredFieldsValue(null, (x, r) -> fail("Should have thrown a parsing exception")));
assertThat(e.getMessage(), containsString("unexpected token"));
}
private void assertParseStoredFieldsValue(final Object value, final CheckedBiConsumer<XContentType, Object, IOException> consumer)
throws IOException {
final XContentType xContentType = randomFrom(XContentType.values());
try (XContentBuilder builder = XContentBuilder.builder(xContentType.xContent())) {
final String fieldName = randomAlphaOfLengthBetween(0, 10);
builder.startObject();
builder.field(fieldName, value);
builder.endObject();
try (XContentParser parser = createParser(builder)) {
ensureExpectedToken(XContentParser.Token.START_OBJECT, parser.nextToken(), parser::getTokenLocation);
ensureFieldName(parser, parser.nextToken(), fieldName);
assertNotNull(parser.nextToken());
consumer.accept(xContentType, XContentParserUtils.parseStoredFieldsValue(parser));
ensureExpectedToken(XContentParser.Token.END_OBJECT, parser.nextToken(), parser::getTokenLocation);
assertNull(parser.nextToken());
}
}
}
public void testParseTypedKeysObject() throws IOException { public void testParseTypedKeysObject() throws IOException {
final String delimiter = randomFrom("#", ":", "/", "-", "_", "|", "_delim_"); final String delimiter = randomFrom("#", ":", "/", "-", "_", "|", "_delim_");
final XContentType xContentType = randomFrom(XContentType.values()); final XContentType xContentType = randomFrom(XContentType.values());