Skip to content

Commit 2581f3c

Browse files
authored
fix: rely on google core for SSLException's (#188)
* fix: rely on google core for SSLException's * update requester pays tests to not rely on Project Owner role * format * make sure requester pays is cleaned up
1 parent 3795825 commit 2581f3c

5 files changed

Lines changed: 80 additions & 23 deletions

File tree

google-cloud-storage/src/main/java/com/google/cloud/storage/StorageException.java

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@
3535
public final class StorageException extends BaseHttpServiceException {
3636
private static final String INTERNAL_ERROR = "internalError";
3737
private static final String CONNECTION_CLOSED_PREMATURELY = "connectionClosedPrematurely";
38-
private static final String CONNECTION_RESET = "connectionReset";
3938

4039
// see: https://cloud.google.com/storage/docs/resumable-uploads-xml#practices
4140
private static final Set<Error> RETRYABLE_ERRORS =
@@ -47,8 +46,7 @@ public final class StorageException extends BaseHttpServiceException {
4746
new Error(429, null),
4847
new Error(408, null),
4948
new Error(null, INTERNAL_ERROR),
50-
new Error(null, CONNECTION_CLOSED_PREMATURELY),
51-
new Error(null, CONNECTION_RESET));
49+
new Error(null, CONNECTION_CLOSED_PREMATURELY));
5250

5351
private static final long serialVersionUID = -4168430271327813063L;
5452

@@ -86,16 +84,14 @@ public static StorageException translateAndThrow(RetryHelperException ex) {
8684
/**
8785
* Translate IOException to a StorageException representing the cause of the error. This method
8886
* defaults to idempotent always being {@code true}. Additionally, this method translates
89-
* transient issues Connection Closed Prematurely and Connection Reset as retryable errors.
87+
* transient issues Connection Closed Prematurely as a retryable error.
9088
*
9189
* @returns {@code StorageException}
9290
*/
9391
public static StorageException translate(IOException exception) {
9492
if (exception.getMessage().contains("Connection closed prematurely")) {
9593
return new StorageException(
9694
0, exception.getMessage(), CONNECTION_CLOSED_PREMATURELY, exception);
97-
} else if (exception.getMessage().contains("Connection reset")) {
98-
return new StorageException(0, exception.getMessage(), CONNECTION_RESET, exception);
9995
} else {
10096
// default
10197
return new StorageException(exception);

google-cloud-storage/src/main/java/com/google/cloud/storage/testing/RemoteStorageHelper.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,9 @@ public static void cleanBuckets(final Storage storage, final long olderThan, lon
7575
@Override
7676
public void run() {
7777
Page<Bucket> buckets =
78-
storage.list(Storage.BucketListOption.prefix(BUCKET_NAME_PREFIX));
78+
storage.list(
79+
Storage.BucketListOption.prefix(BUCKET_NAME_PREFIX),
80+
Storage.BucketListOption.userProject(storage.getOptions().getProjectId()));
7981
for (Bucket bucket : buckets.iterateAll()) {
8082
if (bucket.getCreateTime() < olderThan) {
8183
try {
@@ -88,10 +90,9 @@ public void run() {
8890
.iterateAll()) {
8991
if (blob.getEventBasedHold() == true || blob.getTemporaryHold() == true) {
9092
storage.update(
91-
blob.toBuilder()
92-
.setTemporaryHold(false)
93-
.setEventBasedHold(false)
94-
.build());
93+
blob.toBuilder().setTemporaryHold(false).setEventBasedHold(false).build(),
94+
Storage.BlobTargetOption.userProject(
95+
storage.getOptions().getProjectId()));
9596
}
9697
}
9798
forceDelete(storage, bucket.getName());

google-cloud-storage/src/test/java/com/google/cloud/storage/StorageExceptionTest.java

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -141,11 +141,23 @@ public void testStorageException() {
141141
public void testTranslateConnectionReset() {
142142
StorageException exception =
143143
StorageException.translate(
144-
new IOException(
144+
new SSLException(
145145
"Connection has been shutdown: "
146146
+ new SSLException(new SocketException("Connection reset"))));
147147
assertEquals(0, exception.getCode());
148-
assertEquals("connectionReset", exception.getReason());
148+
assertTrue(exception.isRetryable());
149+
}
150+
151+
@Test
152+
public void testTranslateConnectionShutdown() {
153+
StorageException exception =
154+
StorageException.translate(
155+
new SSLException(
156+
"Connection has been shutdown: "
157+
+ new SSLException(new SocketException("Socket closed"))));
158+
String test = exception.getMessage();
159+
160+
assertEquals(0, exception.getCode());
149161
assertTrue(exception.isRetryable());
150162
}
151163

google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITStorageTest.java

Lines changed: 57 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@
126126
import org.apache.http.impl.client.HttpClients;
127127
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
128128
import org.junit.AfterClass;
129+
import org.junit.Before;
129130
import org.junit.BeforeClass;
130131
import org.junit.Test;
131132

@@ -192,6 +193,23 @@ public static void beforeClass() throws IOException {
192193
prepareKmsKeys();
193194
}
194195

196+
@Before
197+
public void beforeEach() {
198+
Bucket remoteBucket =
199+
storage.get(
200+
BUCKET,
201+
Storage.BucketGetOption.fields(BucketField.ID, BucketField.BILLING),
202+
Storage.BucketGetOption.userProject(storage.getOptions().getProjectId()));
203+
// Disable requester pays in case a test fails to clean up.
204+
if (remoteBucket.requesterPays() != null && remoteBucket.requesterPays() == true) {
205+
remoteBucket
206+
.toBuilder()
207+
.setRequesterPays(false)
208+
.build()
209+
.update(Storage.BucketTargetOption.userProject(storage.getOptions().getProjectId()));
210+
}
211+
}
212+
195213
@AfterClass
196214
public static void afterClass() throws ExecutionException, InterruptedException {
197215
if (storage != null) {
@@ -867,8 +885,9 @@ public void testListBlobRequesterPays() throws InterruptedException {
867885
assertNotNull(storage.create(blob1));
868886

869887
// Test listing a Requester Pays bucket.
870-
Bucket remoteBucket = storage.get(BUCKET, Storage.BucketGetOption.fields(BucketField.ID));
871-
assertNull(remoteBucket.requesterPays());
888+
Bucket remoteBucket =
889+
storage.get(BUCKET, Storage.BucketGetOption.fields(BucketField.ID, BucketField.BILLING));
890+
assertFalse(remoteBucket.requesterPays());
872891
remoteBucket = remoteBucket.toBuilder().setRequesterPays(true).build();
873892
Bucket updatedBucket = storage.update(remoteBucket);
874893
assertTrue(updatedBucket.requesterPays());
@@ -2138,7 +2157,8 @@ public void testBucketAcl() {
21382157

21392158
private void testBucketAclRequesterPays(boolean requesterPays) {
21402159
if (requesterPays) {
2141-
Bucket remoteBucket = storage.get(BUCKET, Storage.BucketGetOption.fields(BucketField.ID));
2160+
Bucket remoteBucket =
2161+
storage.get(BUCKET, Storage.BucketGetOption.fields(BucketField.ID, BucketField.BILLING));
21422162
assertNull(remoteBucket.requesterPays());
21432163
remoteBucket = remoteBucket.toBuilder().setRequesterPays(true).build();
21442164
Bucket updatedBucket = storage.update(remoteBucket);
@@ -2164,6 +2184,18 @@ private void testBucketAclRequesterPays(boolean requesterPays) {
21642184
assertTrue(acls.contains(updatedAcl));
21652185
assertTrue(storage.deleteAcl(BUCKET, User.ofAllAuthenticatedUsers(), bucketOptions));
21662186
assertNull(storage.getAcl(BUCKET, User.ofAllAuthenticatedUsers(), bucketOptions));
2187+
if (requesterPays) {
2188+
Bucket remoteBucket =
2189+
storage.get(
2190+
BUCKET,
2191+
Storage.BucketGetOption.fields(BucketField.ID, BucketField.BILLING),
2192+
Storage.BucketGetOption.userProject(projectId));
2193+
assertTrue(remoteBucket.requesterPays());
2194+
remoteBucket = remoteBucket.toBuilder().setRequesterPays(false).build();
2195+
Bucket updatedBucket =
2196+
storage.update(remoteBucket, Storage.BucketTargetOption.userProject(projectId));
2197+
assertFalse(updatedBucket.requesterPays());
2198+
}
21672199
}
21682200

21692201
@Test
@@ -2347,8 +2379,9 @@ public void testReadCompressedBlob() throws IOException {
23472379

23482380
@Test
23492381
public void testBucketPolicyV1RequesterPays() {
2350-
Bucket remoteBucket = storage.get(BUCKET, Storage.BucketGetOption.fields(BucketField.ID));
2351-
assertNull(remoteBucket.requesterPays());
2382+
Bucket remoteBucket =
2383+
storage.get(BUCKET, Storage.BucketGetOption.fields(BucketField.ID, BucketField.BILLING));
2384+
assertFalse(remoteBucket.requesterPays());
23522385
remoteBucket = remoteBucket.toBuilder().setRequesterPays(true).build();
23532386
Bucket updatedBucket = storage.update(remoteBucket);
23542387
assertTrue(updatedBucket.requesterPays());
@@ -2407,6 +2440,9 @@ public void testBucketPolicyV1RequesterPays() {
24072440
BUCKET,
24082441
ImmutableList.of("storage.buckets.getIamPolicy", "storage.buckets.setIamPolicy"),
24092442
bucketOptions));
2443+
remoteBucket = remoteBucket.toBuilder().setRequesterPays(false).build();
2444+
updatedBucket = storage.update(remoteBucket, Storage.BucketTargetOption.userProject(projectId));
2445+
assertFalse(updatedBucket.requesterPays());
24102446
}
24112447

24122448
@Test
@@ -2624,7 +2660,8 @@ public void testBucketPolicyV3() {
26242660

26252661
@Test
26262662
public void testUpdateBucketLabel() {
2627-
Bucket remoteBucket = storage.get(BUCKET, Storage.BucketGetOption.fields(BucketField.ID));
2663+
Bucket remoteBucket =
2664+
storage.get(BUCKET, Storage.BucketGetOption.fields(BucketField.ID, BucketField.BILLING));
26282665
assertNull(remoteBucket.getLabels());
26292666
remoteBucket = remoteBucket.toBuilder().setLabels(BUCKET_LABELS).build();
26302667
Bucket updatedBucket = storage.update(remoteBucket);
@@ -2635,8 +2672,9 @@ public void testUpdateBucketLabel() {
26352672

26362673
@Test
26372674
public void testUpdateBucketRequesterPays() {
2638-
Bucket remoteBucket = storage.get(BUCKET, Storage.BucketGetOption.fields(BucketField.ID));
2639-
assertNull(remoteBucket.requesterPays());
2675+
Bucket remoteBucket =
2676+
storage.get(BUCKET, Storage.BucketGetOption.fields(BucketField.ID, BucketField.BILLING));
2677+
assertFalse(remoteBucket.requesterPays());
26402678
remoteBucket = remoteBucket.toBuilder().setRequesterPays(true).build();
26412679
Bucket updatedBucket = storage.update(remoteBucket);
26422680
assertTrue(updatedBucket.requesterPays());
@@ -2646,8 +2684,12 @@ public void testUpdateBucketRequesterPays() {
26462684
String blobName = "test-create-empty-blob-requester-pays";
26472685
Blob remoteBlob = updatedBucket.create(blobName, BLOB_BYTE_CONTENT, option);
26482686
assertNotNull(remoteBlob);
2649-
byte[] readBytes = storage.readAllBytes(BUCKET, blobName);
2687+
byte[] readBytes =
2688+
storage.readAllBytes(BUCKET, blobName, Storage.BlobSourceOption.userProject(projectId));
26502689
assertArrayEquals(BLOB_BYTE_CONTENT, readBytes);
2690+
remoteBucket = remoteBucket.toBuilder().setRequesterPays(false).build();
2691+
updatedBucket = storage.update(remoteBucket, Storage.BucketTargetOption.userProject(projectId));
2692+
assertFalse(updatedBucket.requesterPays());
26512693
}
26522694

26532695
@Test
@@ -2786,6 +2828,12 @@ private void retentionPolicyLockRequesterPays(boolean requesterPays)
27862828
assertTrue(remoteBucket.retentionPolicyIsLocked());
27872829
assertNotNull(remoteBucket.getRetentionEffectiveTime());
27882830
} finally {
2831+
if (requesterPays) {
2832+
bucketInfo = bucketInfo.toBuilder().setRequesterPays(false).build();
2833+
Bucket updateBucket =
2834+
storage.update(bucketInfo, Storage.BucketTargetOption.userProject(projectId));
2835+
assertFalse(updateBucket.requesterPays());
2836+
}
27892837
RemoteStorageHelper.forceDelete(storage, bucketName, 5, TimeUnit.SECONDS);
27902838
}
27912839
}

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@
6363
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
6464
<github.global.server>github</github.global.server>
6565
<site.installationModule>google-cloud-storage-parent</site.installationModule>
66-
<google.core.version>1.93.2</google.core.version>
66+
<google.core.version>1.93.3</google.core.version>
6767
<google.api-common.version>1.8.1</google.api-common.version>
6868
<junit.version>4.13</junit.version>
6969
<threeten.version>1.4.1</threeten.version>

0 commit comments

Comments
 (0)