Skip to content

Commit e714615

Browse files
authored
HDDS-14232. Reduce duplication in object endpoint tests (#9592)
1 parent 75aabae commit e714615

8 files changed

Lines changed: 131 additions & 164 deletions

File tree

hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/EndpointTestUtils.java

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,15 @@
3434
/** Utilities for unit-testing S3 endpoints. */
3535
public final class EndpointTestUtils {
3636

37+
/** Get key content. */
38+
public static Response get(
39+
ObjectEndpoint subject,
40+
String bucket,
41+
String key
42+
) throws IOException, OS3Exception {
43+
return subject.get(bucket, key, 0, null, 0, null, null);
44+
}
45+
3746
/** Get key tags. */
3847
public static Response getTagging(
3948
ObjectEndpoint subject,
@@ -43,6 +52,18 @@ public static Response getTagging(
4352
return subject.get(bucket, key, 0, null, 0, null, "");
4453
}
4554

55+
/** List parts of MPU. */
56+
public static Response listParts(
57+
ObjectEndpoint subject,
58+
String bucket,
59+
String key,
60+
String uploadID,
61+
int maxParts,
62+
int nextPart
63+
) throws IOException, OS3Exception {
64+
return subject.get(bucket, key, 0, uploadID, maxParts, String.valueOf(nextPart), null);
65+
}
66+
4667
/** Put without content. */
4768
public static Response putDir(
4869
ObjectEndpoint subject,
@@ -98,6 +119,15 @@ public static Response put(
98119
}
99120
}
100121

122+
/** Delete key. */
123+
public static Response delete(
124+
ObjectEndpoint subject,
125+
String bucket,
126+
String key
127+
) throws IOException, OS3Exception {
128+
return subject.delete(bucket, key, null, null);
129+
}
130+
101131
/** Delete key tags. */
102132
public static Response deleteTagging(
103133
ObjectEndpoint subject,
@@ -168,10 +198,25 @@ public static void completeMultipartUpload(
168198
}
169199
}
170200

201+
/** Abort multipart upload. */
202+
public static Response abortMultipartUpload(
203+
ObjectEndpoint subject,
204+
String bucket,
205+
String key,
206+
String uploadID
207+
) throws IOException, OS3Exception {
208+
return subject.delete(bucket, key, uploadID, null);
209+
}
210+
171211
/** Verify response is success for {@code request}. */
172212
public static <E extends Exception> void assertSucceeds(CheckedSupplier<Response, E> request) throws E {
213+
assertStatus(HttpStatus.SC_OK, request);
214+
}
215+
216+
/** Verify response status for {@code request}. */
217+
public static <E extends Exception> void assertStatus(int status, CheckedSupplier<Response, E> request) throws E {
173218
try (Response response = request.get()) {
174-
assertEquals(HttpStatus.SC_OK, response.getStatus());
219+
assertEquals(status, response.getStatus());
175220
}
176221
}
177222

hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/TestAbortMultipartUpload.java

Lines changed: 6 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -17,19 +17,20 @@
1717

1818
package org.apache.hadoop.ozone.s3.endpoint;
1919

20+
import static org.apache.hadoop.ozone.s3.endpoint.EndpointTestUtils.abortMultipartUpload;
21+
import static org.apache.hadoop.ozone.s3.endpoint.EndpointTestUtils.assertErrorResponse;
22+
import static org.apache.hadoop.ozone.s3.endpoint.EndpointTestUtils.assertStatus;
2023
import static org.apache.hadoop.ozone.s3.endpoint.EndpointTestUtils.initiateMultipartUpload;
2124
import static org.apache.hadoop.ozone.s3.util.S3Consts.STORAGE_CLASS_HEADER;
22-
import static org.junit.jupiter.api.Assertions.assertEquals;
2325
import static org.mockito.Mockito.mock;
2426
import static org.mockito.Mockito.when;
2527

2628
import javax.ws.rs.core.HttpHeaders;
27-
import javax.ws.rs.core.Response;
2829
import org.apache.hadoop.ozone.OzoneConsts;
2930
import org.apache.hadoop.ozone.client.OzoneClient;
3031
import org.apache.hadoop.ozone.client.OzoneClientStub;
31-
import org.apache.hadoop.ozone.s3.exception.OS3Exception;
3232
import org.apache.hadoop.ozone.s3.exception.S3ErrorTable;
33+
import org.apache.http.HttpStatus;
3334
import org.junit.jupiter.api.Test;
3435

3536
/**
@@ -54,22 +55,12 @@ public void testAbortMultipartUpload() throws Exception {
5455
.setClient(client)
5556
.build();
5657

57-
5858
String uploadID = initiateMultipartUpload(rest, bucket, key);
5959

6060
// Abort multipart upload
61-
Response response = rest.delete(bucket, key, uploadID, null);
62-
63-
assertEquals(204, response.getStatus());
61+
assertStatus(HttpStatus.SC_NO_CONTENT, () -> abortMultipartUpload(rest, bucket, key, uploadID));
6462

6563
// test with unknown upload Id.
66-
try {
67-
rest.delete(bucket, key, "random", null);
68-
} catch (OS3Exception ex) {
69-
assertEquals(S3ErrorTable.NO_SUCH_UPLOAD.getCode(), ex.getCode());
70-
assertEquals(S3ErrorTable.NO_SUCH_UPLOAD.getErrorMessage(),
71-
ex.getErrorMessage());
72-
}
73-
64+
assertErrorResponse(S3ErrorTable.NO_SUCH_UPLOAD, () -> abortMultipartUpload(rest, bucket, key, "random"));
7465
}
7566
}

hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/TestListParts.java

Lines changed: 14 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
package org.apache.hadoop.ozone.s3.endpoint;
1919

20+
import static org.apache.hadoop.ozone.s3.endpoint.EndpointTestUtils.assertErrorResponse;
2021
import static org.apache.hadoop.ozone.s3.endpoint.EndpointTestUtils.initiateMultipartUpload;
2122
import static org.apache.hadoop.ozone.s3.endpoint.EndpointTestUtils.uploadPart;
2223
import static org.apache.hadoop.ozone.s3.util.S3Consts.STORAGE_CLASS_HEADER;
@@ -27,6 +28,7 @@
2728
import static org.mockito.Mockito.mock;
2829
import static org.mockito.Mockito.when;
2930

31+
import java.io.IOException;
3032
import javax.ws.rs.core.HttpHeaders;
3133
import javax.ws.rs.core.Response;
3234
import org.apache.hadoop.ozone.OzoneConsts;
@@ -71,45 +73,36 @@ public void setUp() throws Exception {
7173

7274
@Test
7375
public void testListParts() throws Exception {
74-
Response response = rest.get(OzoneConsts.S3_BUCKET, OzoneConsts.KEY, 0,
75-
uploadID, 3, "0", null);
76-
77-
ListPartsResponse listPartsResponse =
78-
(ListPartsResponse) response.getEntity();
76+
ListPartsResponse listPartsResponse = listParts(3, 0);
7977

8078
assertFalse(listPartsResponse.getTruncated());
8179
assertEquals(3, listPartsResponse.getPartList().size());
82-
8380
}
8481

8582
@Test
8683
public void testListPartsContinuation() throws Exception {
87-
Response response = rest.get(OzoneConsts.S3_BUCKET, OzoneConsts.KEY, 0,
88-
uploadID, 2, "0", null);
89-
ListPartsResponse listPartsResponse =
90-
(ListPartsResponse) response.getEntity();
84+
ListPartsResponse listPartsResponse = listParts(2, 0);
9185

9286
assertTrue(listPartsResponse.getTruncated());
9387
assertEquals(2, listPartsResponse.getPartList().size());
9488

9589
// Continue
96-
response = rest.get(OzoneConsts.S3_BUCKET, OzoneConsts.KEY, 0, uploadID, 2,
97-
Integer.toString(listPartsResponse.getNextPartNumberMarker()), null);
98-
listPartsResponse = (ListPartsResponse) response.getEntity();
90+
listPartsResponse = listParts(2, listPartsResponse.getNextPartNumberMarker());
9991

10092
assertFalse(listPartsResponse.getTruncated());
10193
assertEquals(1, listPartsResponse.getPartList().size());
102-
10394
}
10495

10596
@Test
106-
public void testListPartsWithUnknownUploadID() throws Exception {
107-
try {
108-
rest.get(OzoneConsts.S3_BUCKET, OzoneConsts.KEY, 0,
109-
uploadID, 2, "0", null);
110-
} catch (OS3Exception ex) {
111-
assertEquals(S3ErrorTable.NO_SUCH_UPLOAD.getErrorMessage(),
112-
ex.getErrorMessage());
97+
public void testListPartsWithUnknownUploadID() {
98+
assertErrorResponse(S3ErrorTable.NO_SUCH_UPLOAD,
99+
() -> EndpointTestUtils.listParts(rest, OzoneConsts.S3_BUCKET, "no-such-key", "no-such-upload", 2, 0));
100+
}
101+
102+
private ListPartsResponse listParts(int maxParts, int nextPart) throws IOException, OS3Exception {
103+
try (Response response = EndpointTestUtils.listParts(rest, OzoneConsts.S3_BUCKET, OzoneConsts.KEY,
104+
uploadID, maxParts, nextPart)) {
105+
return (ListPartsResponse) response.getEntity();
113106
}
114107
}
115108
}

hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/TestObjectDelete.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,16 @@
1717

1818
package org.apache.hadoop.ozone.s3.endpoint;
1919

20+
import static org.apache.hadoop.ozone.s3.endpoint.EndpointTestUtils.assertStatus;
21+
import static org.apache.hadoop.ozone.s3.endpoint.EndpointTestUtils.delete;
2022
import static org.junit.jupiter.api.Assertions.assertFalse;
2123

2224
import java.io.IOException;
2325
import org.apache.hadoop.ozone.client.OzoneBucket;
2426
import org.apache.hadoop.ozone.client.OzoneClient;
2527
import org.apache.hadoop.ozone.client.OzoneClientStub;
2628
import org.apache.hadoop.ozone.s3.exception.OS3Exception;
29+
import org.apache.http.HttpStatus;
2730
import org.junit.jupiter.api.Test;
2831

2932
/**
@@ -32,7 +35,7 @@
3235
public class TestObjectDelete {
3336

3437
@Test
35-
public void delete() throws IOException, OS3Exception {
38+
void testDelete() throws IOException, OS3Exception {
3639
//GIVEN
3740
OzoneClient client = new OzoneClientStub();
3841
client.getObjectStore().createS3Bucket("b1");
@@ -47,7 +50,7 @@ public void delete() throws IOException, OS3Exception {
4750
.build();
4851

4952
//WHEN
50-
rest.delete("b1", "key1", null, null);
53+
assertStatus(HttpStatus.SC_NO_CONTENT, () -> delete(rest, "b1", "key1"));
5154

5255
//THEN
5356
assertFalse(bucket.listKeys("").hasNext(),

hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/TestObjectGet.java

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@
1818
package org.apache.hadoop.ozone.s3.endpoint;
1919

2020
import static org.apache.hadoop.ozone.s3.S3GatewayConfigKeys.OZONE_S3G_FSO_DIRECTORY_CREATION_ENABLED;
21+
import static org.apache.hadoop.ozone.s3.endpoint.EndpointTestUtils.assertErrorResponse;
2122
import static org.apache.hadoop.ozone.s3.endpoint.EndpointTestUtils.assertSucceeds;
23+
import static org.apache.hadoop.ozone.s3.endpoint.EndpointTestUtils.get;
2224
import static org.apache.hadoop.ozone.s3.endpoint.EndpointTestUtils.put;
2325
import static org.apache.hadoop.ozone.s3.exception.S3ErrorTable.NO_SUCH_KEY;
2426
import static org.apache.hadoop.ozone.s3.util.S3Consts.RANGE_HEADER;
@@ -27,7 +29,6 @@
2729
import static org.apache.hadoop.ozone.s3.util.S3Consts.X_AMZ_CONTENT_SHA256;
2830
import static org.junit.jupiter.api.Assertions.assertEquals;
2931
import static org.junit.jupiter.api.Assertions.assertNull;
30-
import static org.junit.jupiter.api.Assertions.assertThrows;
3132
import static org.mockito.Mockito.doReturn;
3233
import static org.mockito.Mockito.mock;
3334
import static org.mockito.Mockito.when;
@@ -96,9 +97,9 @@ public void init() throws OS3Exception, IOException {
9697
}
9798

9899
@Test
99-
public void get() throws IOException, OS3Exception {
100+
public void testGet() throws IOException, OS3Exception {
100101
//WHEN
101-
Response response = rest.get(BUCKET_NAME, KEY_NAME, 0, null, 0, null, null);
102+
Response response = get(rest, BUCKET_NAME, KEY_NAME);
102103

103104
//THEN
104105
OzoneClientTestUtils.assertKeyContent(bucket, KEY_NAME, CONTENT);
@@ -114,7 +115,7 @@ public void get() throws IOException, OS3Exception {
114115
@Test
115116
public void getKeyWithTag() throws IOException, OS3Exception {
116117
//WHEN
117-
Response response = rest.get(BUCKET_NAME, KEY_WITH_TAG, 0, null, 0, null, null);
118+
Response response = get(rest, BUCKET_NAME, KEY_WITH_TAG);
118119

119120
//THEN
120121
OzoneClientTestUtils.assertKeyContent(bucket, KEY_WITH_TAG, CONTENT);
@@ -130,7 +131,7 @@ public void getKeyWithTag() throws IOException, OS3Exception {
130131
public void inheritRequestHeader() throws IOException, OS3Exception {
131132
setDefaultHeader();
132133

133-
Response response = rest.get(BUCKET_NAME, KEY_NAME, 0, null, 0, null, null);
134+
Response response = get(rest, BUCKET_NAME, KEY_NAME);
134135

135136
assertEquals(CONTENT_TYPE1,
136137
response.getHeaderString("Content-Type"));
@@ -160,7 +161,7 @@ public void overrideResponseHeader() throws IOException, OS3Exception {
160161
CONTENT_DISPOSITION2);
161162
queryParameter.putSingle("response-content-encoding", CONTENT_ENCODING2);
162163

163-
Response response = rest.get(BUCKET_NAME, KEY_NAME, 0, null, 0, null, null);
164+
Response response = get(rest, BUCKET_NAME, KEY_NAME);
164165

165166
assertEquals(CONTENT_TYPE2,
166167
response.getHeaderString("Content-Type"));
@@ -181,13 +182,13 @@ public void getRangeHeader() throws IOException, OS3Exception {
181182
Response response;
182183
when(headers.getHeaderString(RANGE_HEADER)).thenReturn("bytes=0-0");
183184

184-
response = rest.get(BUCKET_NAME, KEY_NAME, 0, null, 0, null, null);
185+
response = get(rest, BUCKET_NAME, KEY_NAME);
185186
assertEquals("1", response.getHeaderString("Content-Length"));
186187
assertEquals(String.format("bytes 0-0/%s", CONTENT.length()),
187188
response.getHeaderString("Content-Range"));
188189

189190
when(headers.getHeaderString(RANGE_HEADER)).thenReturn("bytes=0-");
190-
response = rest.get(BUCKET_NAME, KEY_NAME, 0, null, 0, null, null);
191+
response = get(rest, BUCKET_NAME, KEY_NAME);
191192
assertEquals(String.valueOf(CONTENT.length()),
192193
response.getHeaderString("Content-Length"));
193194
assertEquals(
@@ -200,15 +201,15 @@ public void getRangeHeader() throws IOException, OS3Exception {
200201
@Test
201202
public void getStatusCode() throws IOException, OS3Exception {
202203
Response response;
203-
response = rest.get(BUCKET_NAME, KEY_NAME, 0, null, 0, null, null);
204+
response = get(rest, BUCKET_NAME, KEY_NAME);
204205
assertEquals(response.getStatus(),
205206
Response.Status.OK.getStatusCode());
206207

207208
// https://www.rfc-editor.org/rfc/rfc7233#section-4.1
208209
// The 206 (Partial Content) status code indicates that the server is
209210
// successfully fulfilling a range request for the target resource
210211
when(headers.getHeaderString(RANGE_HEADER)).thenReturn("bytes=0-1");
211-
response = rest.get(BUCKET_NAME, KEY_NAME, 0, null, 0, null, null);
212+
response = get(rest, BUCKET_NAME, KEY_NAME);
212213
assertEquals(response.getStatus(),
213214
Response.Status.PARTIAL_CONTENT.getStatusCode());
214215
assertNull(response.getHeaderString(TAG_COUNT_HEADER));
@@ -232,19 +233,12 @@ private void setDefaultHeader() {
232233
@Test
233234
public void testGetWhenKeyIsDirectoryAndDoesNotEndWithASlash()
234235
throws IOException {
235-
// GIVEN
236236
final String keyPath = "keyDir";
237237
OzoneConfiguration config = new OzoneConfiguration();
238238
config.set(OZONE_S3G_FSO_DIRECTORY_CREATION_ENABLED, "true");
239239
rest.setOzoneConfiguration(config);
240240
bucket.createDirectory(keyPath);
241241

242-
// WHEN
243-
final OS3Exception ex = assertThrows(OS3Exception.class,
244-
() -> rest.get(BUCKET_NAME, keyPath, 0, null, 0, null, null));
245-
246-
// THEN
247-
assertEquals(NO_SUCH_KEY.getCode(), ex.getCode());
248-
bucket.deleteKey(keyPath);
242+
assertErrorResponse(NO_SUCH_KEY, () -> get(rest, BUCKET_NAME, keyPath));
249243
}
250244
}

0 commit comments

Comments
 (0)