29
29
import static org .elasticsearch .action .bulk .BulkResponse .NO_INGEST_TOOK ;
30
30
import static org .elasticsearch .common .xcontent .XContentHelper .toXContent ;
31
31
import static org .elasticsearch .test .hamcrest .ElasticsearchAssertions .assertToXContentEquivalent ;
32
+ import static org .hamcrest .Matchers .equalTo ;
32
33
33
34
public class BulkResponseTests extends ESTestCase {
34
35
@@ -47,17 +48,7 @@ public void testToAndFromXContent() throws IOException {
47
48
DocWriteRequest .OpType opType = randomFrom (DocWriteRequest .OpType .values ());
48
49
49
50
if (frequently ()) {
50
- Tuple <? extends DocWriteResponse , ? extends DocWriteResponse > randomDocWriteResponses = null ;
51
- if (opType == DocWriteRequest .OpType .INDEX || opType == DocWriteRequest .OpType .CREATE ) {
52
- randomDocWriteResponses = IndexResponseTests .randomIndexResponse ();
53
- } else if (opType == DocWriteRequest .OpType .DELETE ) {
54
- randomDocWriteResponses = DeleteResponseTests .randomDeleteResponse ();
55
- } else if (opType == DocWriteRequest .OpType .UPDATE ) {
56
- randomDocWriteResponses = UpdateResponseTests .randomUpdateResponse (xContentType );
57
- } else {
58
- fail ("Test does not support opType [" + opType + "]" );
59
- }
60
-
51
+ Tuple <? extends DocWriteResponse , ? extends DocWriteResponse > randomDocWriteResponses = success (opType , xContentType );
61
52
bulkItems [i ] = BulkItemResponse .success (i , opType , randomDocWriteResponses .v1 ());
62
53
expectedBulkItems [i ] = BulkItemResponse .success (i , opType , randomDocWriteResponses .v2 ());
63
54
} else {
@@ -97,4 +88,64 @@ public void testToAndFromXContent() throws IOException {
97
88
BytesReference expectedFinalBytes = toXContent (parsedBulkResponse , xContentType , humanReadable );
98
89
assertToXContentEquivalent (expectedFinalBytes , finalBytes , xContentType );
99
90
}
91
+
92
+ public void testToXContentPlacesErrorsFirst () throws IOException {
93
+ XContentType xContentType = randomFrom (XContentType .values ());
94
+ boolean humanReadable = randomBoolean ();
95
+
96
+ boolean errors = false ;
97
+ long took = randomFrom (randomNonNegativeLong (), -1L );
98
+ long ingestTook = randomFrom (randomNonNegativeLong (), NO_INGEST_TOOK );
99
+ int nbBulkItems = randomIntBetween (1 , 10 );
100
+
101
+ BulkItemResponse [] bulkItems = new BulkItemResponse [nbBulkItems ];
102
+
103
+ for (int i = 0 ; i < nbBulkItems ; i ++) {
104
+ DocWriteRequest .OpType opType = randomFrom (DocWriteRequest .OpType .values ());
105
+ if (frequently ()) {
106
+ Tuple <? extends DocWriteResponse , ? extends DocWriteResponse > randomDocWriteResponses = success (opType , xContentType );
107
+
108
+ BulkItemResponse success = BulkItemResponse .success (i , opType , randomDocWriteResponses .v1 ());
109
+ bulkItems [i ] = success ;
110
+ } else {
111
+ errors = true ;
112
+ String index = randomAlphaOfLength (5 );
113
+ String id = randomAlphaOfLength (5 );
114
+
115
+ Tuple <Throwable , ElasticsearchException > failures = randomExceptions ();
116
+
117
+ Exception bulkItemCause = (Exception ) failures .v1 ();
118
+ bulkItems [i ] = BulkItemResponse .failure (i , opType , new BulkItemResponse .Failure (index , id , bulkItemCause ));
119
+ }
120
+ }
121
+
122
+ BulkResponse bulkResponse = new BulkResponse (bulkItems , took , ingestTook );
123
+ BytesReference originalBytes = toXContent (bulkResponse , xContentType , ToXContent .EMPTY_PARAMS , humanReadable );
124
+
125
+ try (XContentParser parser = createParser (xContentType .xContent (), originalBytes )) {
126
+ assertThat (parser .nextToken (), equalTo (XContentParser .Token .START_OBJECT ));
127
+ XContentParser .Token firstField = parser .nextToken ();
128
+ assertThat (firstField , equalTo (XContentParser .Token .FIELD_NAME ));
129
+ assertThat (parser .currentName (), equalTo ("errors" ));
130
+ assertThat (parser .nextToken (), equalTo (XContentParser .Token .VALUE_BOOLEAN ));
131
+ assertThat (parser .booleanValue (), equalTo (errors ));
132
+ }
133
+ }
134
+
135
+ private static Tuple <? extends DocWriteResponse , ? extends DocWriteResponse > success (
136
+ DocWriteRequest .OpType opType ,
137
+ XContentType xContentType
138
+ ) {
139
+ Tuple <? extends DocWriteResponse , ? extends DocWriteResponse > randomDocWriteResponses = null ;
140
+ if (opType == DocWriteRequest .OpType .INDEX || opType == DocWriteRequest .OpType .CREATE ) {
141
+ randomDocWriteResponses = IndexResponseTests .randomIndexResponse ();
142
+ } else if (opType == DocWriteRequest .OpType .DELETE ) {
143
+ randomDocWriteResponses = DeleteResponseTests .randomDeleteResponse ();
144
+ } else if (opType == DocWriteRequest .OpType .UPDATE ) {
145
+ randomDocWriteResponses = UpdateResponseTests .randomUpdateResponse (xContentType );
146
+ } else {
147
+ fail ("Test does not support opType [" + opType + "]" );
148
+ }
149
+ return randomDocWriteResponses ;
150
+ }
100
151
}
0 commit comments