|
18 | 18 |
|
19 | 19 | import static com.google.common.truth.Truth.assertThat; |
20 | 20 | import static io.grpc.netty.shaded.io.netty.handler.codec.http.HttpHeaderNames.CONTENT_TYPE; |
| 21 | +import static io.grpc.netty.shaded.io.netty.handler.codec.http.HttpResponseStatus.NO_CONTENT; |
21 | 22 | import static io.grpc.netty.shaded.io.netty.handler.codec.http.HttpResponseStatus.OK; |
22 | 23 | import static org.junit.Assert.assertThrows; |
23 | 24 |
|
@@ -745,6 +746,44 @@ public void sendListPartsRequest_errorResponse() throws Exception { |
745 | 746 | } |
746 | 747 | } |
747 | 748 |
|
| 749 | + @Test |
| 750 | + public void sendListPartsRequest_withUserProject() throws Exception { |
| 751 | + HttpRequestHandler handler = |
| 752 | + req -> { |
| 753 | + assertThat(req.headers().get("x-goog-user-project")).isEqualTo("test-project"); |
| 754 | + ListPartsResponse listPartsResponse = |
| 755 | + ListPartsResponse.builder() |
| 756 | + .bucket("test-bucket") |
| 757 | + .key("test-key") |
| 758 | + .uploadId("test-upload-id") |
| 759 | + .maxParts(1) |
| 760 | + .partNumberMarker(0) |
| 761 | + .parts(ImmutableList.of()) |
| 762 | + .build(); |
| 763 | + ByteBuf buf = Unpooled.wrappedBuffer(xmlMapper.writeValueAsBytes(listPartsResponse)); |
| 764 | + DefaultFullHttpResponse resp = new DefaultFullHttpResponse(req.protocolVersion(), OK, buf); |
| 765 | + resp.headers().set(CONTENT_TYPE, "application/xml; charset=utf-8"); |
| 766 | + return resp; |
| 767 | + }; |
| 768 | + |
| 769 | + try (FakeHttpServer fakeHttpServer = FakeHttpServer.of(handler)) { |
| 770 | + MultipartUploadHttpRequestManager multipartUploadHttpRequestManager = |
| 771 | + MultipartUploadHttpRequestManager.createFrom(fakeHttpServer.getHttpStorageOptions()); |
| 772 | + ListPartsRequest request = |
| 773 | + ListPartsRequest.builder() |
| 774 | + .bucket("test-bucket") |
| 775 | + .key("test-key") |
| 776 | + .uploadId("test-upload-id") |
| 777 | + .userProject("test-project") |
| 778 | + .build(); |
| 779 | + |
| 780 | + ListPartsResponse response = multipartUploadHttpRequestManager.sendListPartsRequest(request); |
| 781 | + |
| 782 | + assertThat(response).isNotNull(); |
| 783 | + assertThat(response.bucket()).isEqualTo("test-bucket"); |
| 784 | + } |
| 785 | + } |
| 786 | + |
748 | 787 | @Test |
749 | 788 | public void sendAbortMultipartUploadRequest_success() throws Exception { |
750 | 789 | HttpRequestHandler handler = |
@@ -802,6 +841,36 @@ public void sendAbortMultipartUploadRequest_error() throws Exception { |
802 | 841 | } |
803 | 842 | } |
804 | 843 |
|
| 844 | + @Test |
| 845 | + public void sendAbortMultipartUploadRequest_withUserProject() throws Exception { |
| 846 | + HttpRequestHandler handler = |
| 847 | + req -> { |
| 848 | + assertThat(req.headers().get("x-goog-user-project")).isEqualTo("test-project"); |
| 849 | + AbortMultipartUploadResponse response = new AbortMultipartUploadResponse(); |
| 850 | + ByteBuf buf = Unpooled.wrappedBuffer(xmlMapper.writeValueAsBytes(response)); |
| 851 | + DefaultFullHttpResponse resp = new DefaultFullHttpResponse(req.protocolVersion(), OK, buf); |
| 852 | + resp.headers().set(CONTENT_TYPE, "application/xml; charset=utf-8"); |
| 853 | + return resp; |
| 854 | + }; |
| 855 | + |
| 856 | + try (FakeHttpServer fakeHttpServer = FakeHttpServer.of(handler)) { |
| 857 | + MultipartUploadHttpRequestManager multipartUploadHttpRequestManager = |
| 858 | + MultipartUploadHttpRequestManager.createFrom(fakeHttpServer.getHttpStorageOptions()); |
| 859 | + AbortMultipartUploadRequest request = |
| 860 | + AbortMultipartUploadRequest.builder() |
| 861 | + .bucket("test-bucket") |
| 862 | + .key("test-key") |
| 863 | + .uploadId("test-upload-id") |
| 864 | + .userProject("test-project") |
| 865 | + .build(); |
| 866 | + |
| 867 | + AbortMultipartUploadResponse response = |
| 868 | + multipartUploadHttpRequestManager.sendAbortMultipartUploadRequest(request); |
| 869 | + |
| 870 | + assertThat(response).isNotNull(); |
| 871 | + } |
| 872 | + } |
| 873 | + |
805 | 874 | @Test |
806 | 875 | public void sendCompleteMultipartUploadRequest_success() throws Exception { |
807 | 876 | HttpRequestHandler handler = |
@@ -1094,6 +1163,40 @@ public void sendUploadPartRequest_withCustomChecksum() throws Exception { |
1094 | 1163 | } |
1095 | 1164 | } |
1096 | 1165 |
|
| 1166 | + @Test |
| 1167 | + public void sendUploadPartRequest_withUserProject() throws Exception { |
| 1168 | + String etag = "\"af1ed31420542285653c803a34aa839a\""; |
| 1169 | + byte[] contentBytes = "hello world".getBytes(StandardCharsets.UTF_8); |
| 1170 | + |
| 1171 | + HttpRequestHandler handler = |
| 1172 | + req -> { |
| 1173 | + assertThat(req.headers().get("x-goog-user-project")).isEqualTo("test-project"); |
| 1174 | + DefaultFullHttpResponse resp = new DefaultFullHttpResponse(req.protocolVersion(), OK); |
| 1175 | + resp.headers().set("ETag", etag); |
| 1176 | + return resp; |
| 1177 | + }; |
| 1178 | + |
| 1179 | + try (FakeHttpServer fakeHttpServer = FakeHttpServer.of(handler)) { |
| 1180 | + MultipartUploadHttpRequestManager multipartUploadHttpRequestManager = |
| 1181 | + MultipartUploadHttpRequestManager.createFrom(fakeHttpServer.getHttpStorageOptions()); |
| 1182 | + UploadPartRequest request = |
| 1183 | + UploadPartRequest.builder() |
| 1184 | + .bucket("test-bucket") |
| 1185 | + .key("test-key") |
| 1186 | + .uploadId("test-upload-id") |
| 1187 | + .partNumber(1) |
| 1188 | + .userProject("test-project") |
| 1189 | + .build(); |
| 1190 | + |
| 1191 | + UploadPartResponse response = |
| 1192 | + multipartUploadHttpRequestManager.sendUploadPartRequest( |
| 1193 | + request, RewindableContent.of(ByteBuffer.wrap(contentBytes))); |
| 1194 | + |
| 1195 | + assertThat(response).isNotNull(); |
| 1196 | + assertThat(response.eTag()).isEqualTo(etag); |
| 1197 | + } |
| 1198 | + } |
| 1199 | + |
1097 | 1200 | @Test |
1098 | 1201 | public void sendUploadPartRequest_error() throws Exception { |
1099 | 1202 | HttpRequestHandler handler = |
@@ -1210,6 +1313,56 @@ public void sendListMultipartUploadsRequest_error() throws Exception { |
1210 | 1313 | } |
1211 | 1314 | } |
1212 | 1315 |
|
| 1316 | + @Test |
| 1317 | + public void sendListMultipartUploadsRequest_withUserProject() throws Exception { |
| 1318 | + HttpRequestHandler handler = |
| 1319 | + req -> { |
| 1320 | + assertThat(req.headers().get("x-goog-user-project")).isEqualTo("test-project"); |
| 1321 | + ListMultipartUploadsResponse listMultipartUploadsResponse = |
| 1322 | + ListMultipartUploadsResponse.builder() |
| 1323 | + .bucket("test-bucket") |
| 1324 | + .keyMarker("key-marker") |
| 1325 | + .uploadIdMarker("upload-id-marker") |
| 1326 | + .nextKeyMarker("next-key-marker") |
| 1327 | + .nextUploadIdMarker("next-upload-id-marker") |
| 1328 | + .maxUploads(1) |
| 1329 | + .truncated(false) |
| 1330 | + .uploads(ImmutableList.of()) |
| 1331 | + .build(); |
| 1332 | + // Jackson fails to serialize ImmutableList without GuavaModule. |
| 1333 | + // We use reflection to replace it with ArrayList for the test. |
| 1334 | + forceSetUploads(listMultipartUploadsResponse, listMultipartUploadsResponse.uploads()); |
| 1335 | + |
| 1336 | + ByteBuf buf = |
| 1337 | + Unpooled.wrappedBuffer(xmlMapper.writeValueAsBytes(listMultipartUploadsResponse)); |
| 1338 | + |
| 1339 | + DefaultFullHttpResponse resp = |
| 1340 | + new DefaultFullHttpResponse(req.protocolVersion(), OK, buf); |
| 1341 | + |
| 1342 | + resp.headers().set("Content-Type", "application/xml; charset=utf-8"); |
| 1343 | + resp.headers().set("Content-Length", resp.content().readableBytes()); |
| 1344 | + return resp; |
| 1345 | + }; |
| 1346 | + |
| 1347 | + try (FakeHttpServer fakeHttpServer = FakeHttpServer.of(handler)) { |
| 1348 | + MultipartUploadHttpRequestManager multipartUploadHttpRequestManager = |
| 1349 | + MultipartUploadHttpRequestManager.createFrom(fakeHttpServer.getHttpStorageOptions()); |
| 1350 | + |
| 1351 | + ListMultipartUploadsRequest request = |
| 1352 | + ListMultipartUploadsRequest.builder() |
| 1353 | + .bucket("test-bucket") |
| 1354 | + .maxUploads(1) |
| 1355 | + .userProject("test-project") |
| 1356 | + .build(); |
| 1357 | + |
| 1358 | + ListMultipartUploadsResponse response = |
| 1359 | + multipartUploadHttpRequestManager.sendListMultipartUploadsRequest(request); |
| 1360 | + |
| 1361 | + assertThat(response).isNotNull(); |
| 1362 | + assertThat(response.bucket()).isEqualTo("test-bucket"); |
| 1363 | + } |
| 1364 | + } |
| 1365 | + |
1213 | 1366 | private void forceSetUploads( |
1214 | 1367 | ListMultipartUploadsResponse response, java.util.List<MultipartUpload> uploads) { |
1215 | 1368 | try { |
|
0 commit comments