Skip to content

Commit 159dae5

Browse files
Bernd VerstCopilot
andcommitted
Return immutable snapshots of additional payload account URIs
Keep getter results independent from the stored endpoint list and verify returned snapshots remain immutable after subsequent option updates. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
1 parent 7a3877d commit 159dae5

2 files changed

Lines changed: 10 additions & 4 deletions

File tree

‎azure-blob-payloads/src/main/java/com/microsoft/durabletask/azureblobpayloads/LargePayloadStorageOptions.java‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -216,12 +216,12 @@ public LargePayloadStorageOptions setAllowAllContainersInConfiguredAccount(boole
216216

217217
/**
218218
* Gets the additional account endpoints whose containers may be read.
219-
* The returned list is immutable and empty by default.
219+
* Returns a fresh immutable snapshot, empty by default.
220220
*
221221
* @return the additional account URIs
222222
*/
223223
public List<URI> getAdditionalAccountUris() {
224-
return this.additionalAccountUris;
224+
return Collections.unmodifiableList(new ArrayList<>(this.additionalAccountUris));
225225
}
226226

227227
/**

‎azure-blob-payloads/src/test/java/com/microsoft/durabletask/azureblobpayloads/BlobPayloadAccessScopeTest.java‎

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -320,8 +320,14 @@ void additionalEndpointList_isImmutableAndDefensivelyCopied() {
320320
List<URI> endpoints = new ArrayList<>(Collections.singletonList(URI.create(ADDITIONAL)));
321321
LargePayloadStorageOptions options = new LargePayloadStorageOptions().setAdditionalAccountUris(endpoints);
322322
endpoints.clear();
323-
assertEquals(1, options.getAdditionalAccountUris().size());
324-
assertThrows(UnsupportedOperationException.class, () -> options.getAdditionalAccountUris().clear());
323+
List<URI> snapshot = options.getAdditionalAccountUris();
324+
assertEquals(Collections.singletonList(URI.create(ADDITIONAL)), snapshot);
325+
assertNotSame(snapshot, options.getAdditionalAccountUris());
326+
assertThrows(UnsupportedOperationException.class, snapshot::clear);
327+
assertThrows(UnsupportedOperationException.class, () -> snapshot.set(0, URI.create(PRIMARY)));
328+
options.setAdditionalAccountUris(Collections.singletonList(URI.create("https://replacement.invalid")));
329+
assertEquals(Collections.singletonList(URI.create(ADDITIONAL)), snapshot);
330+
assertEquals(Collections.singletonList(URI.create("https://replacement.invalid")), options.getAdditionalAccountUris());
325331
assertThrows(IllegalArgumentException.class, () -> options.setAdditionalAccountUris(null));
326332
assertThrows(IllegalArgumentException.class, () -> options.setAdditionalAccountUris(Arrays.asList((URI) null)));
327333
}

0 commit comments

Comments
 (0)