Sub-scope 04 (fileserver) platform/local - IO primitive / gateway / store+publisher revision=a24ece9cf797f7ea647e33bf846b115208ed1ba5 generatedAt=2026-08-30T01:22:06+00:00 === OWNED FILES === 3c03d0e4158da54e8105d03c2233662139b0bd2e platform/local/LocalStorageLayout.java 29 ade8a995be43b400974148f20e103cd347ec3bef platform/local/PhysicalPathResolver.java 26 ef697d8d353ad83cd8cdf2bf0af833d98a06065b platform/local/DefaultPhysicalPathResolver.java 134 de4a170b7c7d44bc69302b958c161145ce8ad6aa platform/local/SecureDirectoryWalk.java 172 eb5594e2bdce47fc01e720c811faae93ab222530 platform/local/SafeFileChannelFactory.java 288 35b5e29b631cdd50ff4618983f669bcde1f16447 platform/local/BoundedFileChannel.java 52 d60c3a5db41a27b3612bb8514146e4edc4416ab3 platform/local/StreamingDigest.java 62 675e5f0e0b22e3280e5037ba6a65be35de84b599 platform/local/TransferBufferPool.java 59 05639c1c99be3986dcb1978e480052b1b589a178 platform/local/LocalAppendEngine.java 260 c03b3c4a65a834b55969a74c73c84100ac315fb2 platform/local/LocalUploadContentGateway.java 118 16b82d1689bdd819dd655e20f699d363cbe8b4af platform/local/LocalUploadStorageGateway.java 62 61e4a361fd57accc87355befde54e4d8a8f8c8c8 platform/local/LocalDownloadContentGateway.java 26 d61ca3342028694c233131a16510ca597ec0eb75 platform/local/LocalZeroCopyDownloadGateway.java 42 d5c5b8d0e1f3890e92416f4adb13b9c691e58e06 platform/local/LocalCopyContentGateway.java 102 64a3456555dae206bd5fdac3d5adf22aa17db6e7 platform/local/LocalCleanupContentGateway.java 33 7d4466f3071626cf4e19cf3167b701055943a89b platform/local/LocalUploadHandle.java 75 28ea844dd9209f303ac2782070c700e1a0c45eec platform/local/LocalBlockingContentStore.java 400 38924d53eec31163de73d6b98a8da8351c94f538 platform/local/ContentPublisher.java 17 e878aab9a89c2dc268cad36ae4b0f440ce2ebb79 platform/local/AtomicMoveContentPublisher.java 124 b5e407f37420a3d861cc7d612a7375e95102ed3d platform/local/MetadataPointerContentPublisher.java 115 d9c8790ab5f0beb9c206e01610aebc3f219b44f9 platform/local/ContentPublishVerification.java 133 7a4b14c2820ac250818c2e43544cd71253fa3e06 platform/local/PublishResult.java 21 b01552ee5658797faef668bc322b9776681e1587 test/ContentPublisherTest.java 208 8a9a8ad2799700f69ef9e428d0dafd928b0f89cf test/LocalAppendEngineTest.java 245 72c3b9920e105683e58df82a0e7f717eceb548f9 test/LocalAppendMemoryTest.java 92 42fd4735920e8b8ce26f48dc3d5a7eb634dcf12f test/LocalCreateUploadTest.java 157 db9c350bf983107f17fd62234222445fb78b60be test/LocalCreateUploadConcurrencyTest.java 72 7e1fbf711532bbe13dc69c9f3707a329b5ef2ab4 test/LocalStorageGatewayContractTest.java 269 2696bca685bf8a49c4bb37839dded0c19c0c877f test/PhysicalPathResolverTest.java 112 00fcdd6fd3c8e7464b19dfcf119f762be22b8cb9 test/LocalContentStoreFixture.java 82 === 8.1 reachability: which platform/local types are public? === $ grep -l 'public final class\|public interface\|public record' adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/*.java adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/AmbiguousFilesystemOperationDetector.java adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalBlockingContentStore.java adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalCleanupContentGateway.java adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalCopyContentGateway.java adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalDownloadContentGateway.java adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalOrphanScanAdapter.java adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalReconciliationContentProbe.java adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageCapabilityProbe.java adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageHealthAdapter.java adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageProbeResult.java adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageProperties.java adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageUsageProbe.java adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalUploadContentGateway.java adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalUploadStorageGateway.java adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalZeroCopyDownloadGateway.java exit=0 $ git grep -rln 'platform.local' -- . | grep -v "^adapter/outbound/fileserver/" app-bootstrap/src/main/java/dev/caskeleton/bootstrap/autoconfigure/fileserver/FileserverServiceConfiguration.java app-bootstrap/src/main/java/dev/caskeleton/bootstrap/autoconfigure/fileserver/FileserverStartupCheck.java app-bootstrap/src/main/java/dev/caskeleton/bootstrap/autoconfigure/fileserver/FileserverStartupConfiguration.java app-bootstrap/src/main/java/dev/caskeleton/bootstrap/autoconfigure/fileserver/FileserverStartupValidator.java app-bootstrap/src/main/java/dev/caskeleton/bootstrap/autoconfigure/fileserver/FileserverStorageConfiguration.java app-bootstrap/src/test/java/dev/caskeleton/bootstrap/autoconfigure/fileserver/FileserverStartupValidatorTest.java exit=0 === 8.2 the module's own rule: descriptor-relative access, and where pathnames survive === --- descriptor-relative usage per file $ grep -c 'SecureDirectoryWalk\|channels\.' adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalBlockingContentStore.java adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalAppendEngine.java adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/SafeFileChannelFactory.java adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalBlockingContentStore.java:20 adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalAppendEngine.java:5 adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/SafeFileChannelFactory.java:5 exit=0 --- every remaining java.nio.file.Files.* call in platform/local $ grep -n 'Files\.' adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/*.java adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/AtomicMoveContentPublisher.java:53: Files.move(staging, target, StandardCopyOption.ATOMIC_MOVE); adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/AtomicMoveContentPublisher.java:113: boolean stagingGone = !Files.exists(staging, LinkOption.NOFOLLOW_LINKS); adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/AtomicMoveContentPublisher.java:114: boolean targetPresent = Files.exists(target, LinkOption.NOFOLLOW_LINKS); adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/ContentPublishVerification.java:53: return Files.size(target); adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/ContentPublishVerification.java:114: if (!Files.isDirectory(directory, LinkOption.NOFOLLOW_LINKS)) { adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalAppendEngine.java:124: *

{@code Files.size} would re-resolve the whole pathname, which is precisely the lookup a adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalOrphanScanAdapter.java:73: if (!Files.isDirectory(contentRoot, LinkOption.NOFOLLOW_LINKS)) { adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalOrphanScanAdapter.java:81: try (Stream tree = Files.walk(contentRoot, MAXIMUM_WALK_DEPTH)) { adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalOrphanScanAdapter.java:111: if (!Files.isRegularFile(object, LinkOption.NOFOLLOW_LINKS)) { adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalOrphanScanAdapter.java:121: size = Files.size(object); adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalOrphanScanAdapter.java:122: modifiedAt = Files.getLastModifiedTime(object, LinkOption.NOFOLLOW_LINKS).toInstant(); adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalOrphanScanAdapter.java:135: Files.createDirectories(quarantined.getParent()); adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalOrphanScanAdapter.java:136: Files.move(object, quarantined, StandardCopyOption.ATOMIC_MOVE); adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalOrphanScanAdapter.java:146: Files.move(quarantined, object, StandardCopyOption.ATOMIC_MOVE); adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalOrphanScanAdapter.java:163: if (!Files.isRegularFile(quarantined, LinkOption.NOFOLLOW_LINKS)) { adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalOrphanScanAdapter.java:167: return Files.deleteIfExists(quarantined); adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalOrphanScanAdapter.java:174: if (!Files.isRegularFile(candidate, LinkOption.NOFOLLOW_LINKS)) { adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalOrphanScanAdapter.java:184: size = Files.size(candidate); adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalOrphanScanAdapter.java:185: modifiedAt = Files.getLastModifiedTime(candidate, LinkOption.NOFOLLOW_LINKS).toInstant(); adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageCapabilityProbe.java:56: Files.createDirectories(probeDirectory); adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageCapabilityProbe.java:119: Files.delete(candidate); adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageCapabilityProbe.java:166: Files.createDirectories(resolver.stagingRoot()); adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageCapabilityProbe.java:167: Files.createDirectories(resolver.contentRoot()); adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageCapabilityProbe.java:168: Files.createDirectories(resolver.quarantineRoot()); adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageCapabilityProbe.java:169: Object staging = Files.getFileStore(resolver.stagingRoot()); adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageCapabilityProbe.java:170: Object content = Files.getFileStore(resolver.contentRoot()); adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageCapabilityProbe.java:171: Object quarantine = Files.getFileStore(resolver.quarantineRoot()); adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageCapabilityProbe.java:187: Files.write(source, new byte[] {1, 2, 3}); adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageCapabilityProbe.java:188: Files.move(source, target, StandardCopyOption.ATOMIC_MOVE); adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageCapabilityProbe.java:189: return Files.exists(target, LinkOption.NOFOLLOW_LINKS); adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageCapabilityProbe.java:206: Files.write(source, new byte[] {1}); adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageCapabilityProbe.java:207: Files.write(target, new byte[] {2}); adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageCapabilityProbe.java:208: Files.move(source, target, StandardCopyOption.REPLACE_EXISTING); adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageCapabilityProbe.java:224: Files.write(target, new byte[] {7}); adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageCapabilityProbe.java:225: Files.createSymbolicLink(link, target); adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageCapabilityProbe.java:248: Files.write(candidate, new byte[] {9}); adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageCapabilityProbe.java:250: Files.delete(candidate); adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageCapabilityProbe.java:263: return Files.getFileStore(properties.root()).getUsableSpace() >= 0; adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageCapabilityProbe.java:273: String type = Files.getFileStore(properties.root()).type(); adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageCapabilityProbe.java:284: Files.deleteIfExists(path); adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageCapabilityProbe.java:292: if (!Files.isDirectory(directory, LinkOption.NOFOLLOW_LINKS)) { adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageCapabilityProbe.java:295: try (Stream entries = Files.walk(directory)) { adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageHealthAdapter.java:46: FileStore fileStore = Files.getFileStore(root); adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageHealthAdapter.java:56: Files.isWritable(root), adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageUsageProbe.java:35: FileStore store = Files.getFileStore(root); adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/MetadataPointerContentPublisher.java:107: Files.deleteIfExists(staging); adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/MetadataPointerContentPublisher.java:110: if (Files.exists(staging, LinkOption.NOFOLLOW_LINKS)) { adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/SafeFileChannelFactory.java:143: if (parent == null || Files.isDirectory(parent, LinkOption.NOFOLLOW_LINKS)) { adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/SafeFileChannelFactory.java:147: Files.createDirectories(parent); adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/SafeFileChannelFactory.java:167: if (Files.isSymbolicLink(current)) { adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/SafeFileChannelFactory.java:172: if (Files.isSymbolicLink(current)) { adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/SafeFileChannelFactory.java:224: Files.setPosixFilePermissions(current, OWNER_ONLY_DIRECTORY); adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/SecureDirectoryWalk.java:129: if (!Files.isDirectory(root, LinkOption.NOFOLLOW_LINKS)) { adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/SecureDirectoryWalk.java:134: DirectoryStream stream = Files.newDirectoryStream(root); adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/SecureDirectoryWalk.java:146: try (DirectoryStream stream = Files.newDirectoryStream(directory)) { exit=0 === 8.2b the publish rename: pathname move guarded by the precheck the module calls insufficient === $ grep -n 'requireNoSymlinkBetween' -B 3 -A 3 adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/AtomicMoveContentPublisher.java 47- ContentKey contentKey = resolver.newContentKey(); 48- Path target = resolver.contentPath(contentKey); 49- channels.createParentDirectories(root, target); 50: channels.requireNoSymlinkBetween(root, target.getParent()); 51- 52- try { 53- Files.move(staging, target, StandardCopyOption.ATOMIC_MOVE); exit=0 $ grep -n 'Retained for the capability probe' -A 6 adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/SafeFileChannelFactory.java 155: * Retained for the capability probe, which still reasons about pathnames. 156- * 157- *

Production access no longer relies on it: descending descriptor by descriptor with {@code 158- * NOFOLLOW_LINKS} refuses a symlinked component by construction, which a precheck could only ever 159- * approximate. 160- */ 161- void requireNoSymlinkBetween(Path root, Path leaf) { exit=0 $ grep -n 'could only ever approximate\|More checks only narrow the window' adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/SafeFileChannelFactory.java adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/SecureDirectoryWalk.java adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/SecureDirectoryWalk.java:20: * directories. More checks only narrow the window; they never close it. exit=0 === 8.2c the same question answered two ways: file length === $ grep -n 'Files.size' -B 4 adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/ContentPublishVerification.java 49- } 50- 51- long sizeOf(Path target) { 52- try { 53: return Files.size(target); exit=0 $ grep -n 'private long currentLength' -B 8 -A 4 adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalAppendEngine.java 121- /** 122- * Length read through the staging file's parent descriptor. 123- * 124- *

{@code Files.size} would re-resolve the whole pathname, which is precisely the lookup a 125- * replaced shard directory redirects: an attacker who swaps the parent for a symlink gets this 126- * check to report the size of their own file, and the offset comparison that follows is then 127- * being made about a different object than the one the append will open. 128- */ 129: private long currentLength(Path root, Path staging) { 130- return channels.readAttributes(root, staging).size(); 131- } 132- 133- /** exit=0 === 8.3 duplicate mechanism: two publishers, one selection point === $ grep -n 'selectPublisher' -A 18 adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalBlockingContentStore.java | head -24 63: this.publisher = selectPublisher(properties, probeResult, verification); 64- this.capabilities = probeResult.toCapabilities(true); 65- } 66- 67- /** 68- * Chooses the publish strategy from the probe result. 69- * 70- *

{@code ATOMIC_MOVE_REQUIRED} fails closed when the probe could not demonstrate an atomic 71- * move; {@code ATOMIC_MOVE_PREFERRED} degrades to a metadata pointer publish instead. 72- */ 73: private ContentPublisher selectPublisher( 74- LocalStorageProperties properties, 75- LocalStorageProbeResult probeResult, 76- ContentPublishVerification verification) { 77- Path root = properties.root(); 78- boolean atomicProven = probeResult.atomicMove(); 79- return switch (properties.publishMode()) { 80- case ATOMIC_MOVE_REQUIRED -> { 81- if (!atomicProven) { 82- throw new AtomicPublishUnsupportedException( 83- "publish mode requires an atomic move that the storage probe could not prove", 84- FileserverFailureContext.of(FileserverErrorCode.ATOMIC_PUBLISH_UNSUPPORTED, false)); 85- } 86- yield new AtomicMoveContentPublisher(root, resolver, channels, verification); exit=0 $ grep -n 'usesAtomicMove' adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/*.java adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/AtomicMoveContentPublisher.java:101: public boolean usesAtomicMove() { adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/ContentPublisher.java:16: boolean usesAtomicMove(); adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalBlockingContentStore.java:379: return publisher.usesAtomicMove(); adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalBlockingContentStore.java:384: if (publisher.usesAtomicMove()) { adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/MetadataPointerContentPublisher.java:69: public boolean usesAtomicMove() { exit=0 === 8.4 doc/behaviour: bounded memory claim and its regression test === $ grep -n 'maxBorrowedBytes' adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/TransferBufferPool.java adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalAppendMemoryTest.java adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/TransferBufferPool.java:20: private final AtomicLong maxBorrowedBytes = new AtomicLong(); adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/TransferBufferPool.java:38: maxBorrowedBytes.accumulateAndGet(outstanding, Math::max); adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/TransferBufferPool.java:56: long maxBorrowedBytes() { adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/TransferBufferPool.java:57: return maxBorrowedBytes.get(); adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalAppendMemoryTest.java:54: assertThat(bufferPool.maxBorrowedBytes()).isLessThanOrEqualTo(BUFFER_BYTES); exit=0 $ grep -nE '@Test| void ' adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalAppendMemoryTest.java adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/PhysicalPathResolverTest.java adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/ContentPublisherTest.java | head -30 adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalAppendMemoryTest.java:31: @Test adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalAppendMemoryTest.java:32: void maxObservedBufferDoesNotGrowWithPayload() throws IOException { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/PhysicalPathResolverTest.java:20: @Test adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/PhysicalPathResolverTest.java:21: void generatedContentPathAlwaysStaysBelowContentRoot() { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/PhysicalPathResolverTest.java:30: @Test adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/PhysicalPathResolverTest.java:31: void stagingPathIsShardedFromTheUploadIdentityOnly() { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/PhysicalPathResolverTest.java:43: @Test adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/PhysicalPathResolverTest.java:44: void quarantinePathMirrorsTheContentLayoutInASeparateArea() { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/PhysicalPathResolverTest.java:67: void rejectsEveryKeyThatIsNotTheServerGeneratedShardedShape(String candidate) { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/PhysicalPathResolverTest.java:75: @Test adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/PhysicalPathResolverTest.java:76: void newContentKeyIsShardedUniqueAndResolvable() { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/PhysicalPathResolverTest.java:87: @Test adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/PhysicalPathResolverTest.java:88: void aRelativeStorageRootIsRejectedOutright() { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/PhysicalPathResolverTest.java:93: @Test adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/PhysicalPathResolverTest.java:94: void everyAreaRootStaysBelowTheConfiguredRoot() { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/PhysicalPathResolverTest.java:103: @Test adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/PhysicalPathResolverTest.java:104: void resolutionNeverDependsOnAClientFilename() { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/ContentPublisherTest.java:32: @Test adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/ContentPublisherTest.java:33: void atomicPublisherMovesStagingToCreateOnlyTarget() throws IOException { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/ContentPublisherTest.java:48: @Test adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/ContentPublisherTest.java:49: void pointerPublisherKeepsImmutableObjectAndReturnsNewContentKey() throws IOException { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/ContentPublisherTest.java:64: @Test adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/ContentPublisherTest.java:65: void bothStrategiesRecordTheProvenSizeAndDigest() { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/ContentPublisherTest.java:80: @Test adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/ContentPublisherTest.java:81: void aDigestMismatchNeverPublishesAnything() { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/ContentPublisherTest.java:94: @Test adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/ContentPublisherTest.java:95: void aLengthMismatchNeverPublishesAnything() { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/ContentPublisherTest.java:107: @Test adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/ContentPublisherTest.java:108: void requiredAtomicModeFailsClosedWhenTheProbeCouldNotProveIt() { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/ContentPublisherTest.java:119: @Test exit=0 $ grep -nE '@Test| void ' adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalCreateUploadConcurrencyTest.java adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java | head -30 adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalCreateUploadConcurrencyTest.java:28: void exactlyOneConcurrentCreateWinsForSameUploadId() throws Exception { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:47: void setUp() { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:56: @Test adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:57: void anUploadIsStagedAppendedAndReadBackThroughTheGateways() { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:67: @Test adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:68: void aStagingLengthOfAMissingObjectReadsAsZeroRatherThanFailing() { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:76: @Test adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:77: void aStagedDigestIsRefusedWhenTheOffsetDisagreesWithTheBytesOnDisk() { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:86: @Test adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:87: void aPublishedObjectIsReadableThroughTheDownloadGateway() throws IOException { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:96: @Test adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:97: void aRangedReadIsBoundedToTheRequestedRegion() throws IOException { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:106: @Test adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:107: void aCopyProducesAnIndependentObjectWithTheSameBytes() throws IOException { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:121: @Test adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:122: void deletingTheCopyLeavesTheSourceIntact() { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:133: @Test adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:134: void aDeleteWhoseSizePreconditionDisagreesIsRefused() { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:143: @Test adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:144: void deletingAnAbsentObjectIsIdempotentRatherThanAFailure() { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:152: @Test adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:153: void aDirectTransferWritesExactlyTheRequestedRegion() { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:165: @Test adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:166: void aDirectTransferDeclinesForAnObjectThatIsNotThereRatherThanThrowing() { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:188: @Test adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:189: void aSinkThatStopsPartWayReportsAPartialTransferRatherThanADecline() { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:230: @Test adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:231: void aStagingCleanupRemovesTheBytesTheUploadOwned() { exit=0 === 8.4b maxBorrowedBytes: the javadoc names a regression test; who reads it? === $ grep -n 'the bounded-memory regression asserts on this' -A 3 adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/TransferBufferPool.java 55: /** Peak simultaneously-borrowed bytes; the bounded-memory regression asserts on this. */ 56- long maxBorrowedBytes() { 57- return maxBorrowedBytes.get(); 58- } exit=0 $ git grep -rn 'maxBorrowedBytes' -- 'adapter/outbound/fileserver/src' | grep -v 'TransferBufferPool.java' adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalAppendMemoryTest.java:54: assertThat(bufferPool.maxBorrowedBytes()).isLessThanOrEqualTo(BUFFER_BYTES); exit=0 $ grep -nE '@Test| void |assertThat' adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalAppendMemoryTest.java | head -20 3:import static org.assertj.core.api.Assertions.assertThat; 31: @Test 32: void maxObservedBufferDoesNotGrowWithPayload() throws IOException { 53: assertThat(result.committedOffset()).isEqualTo(PAYLOAD_BYTES); 54: assertThat(bufferPool.maxBorrowedBytes()).isLessThanOrEqualTo(BUFFER_BYTES); 55: assertThat(Files.size(staging)).isEqualTo(PAYLOAD_BYTES); exit=0 $ git grep -rn 'LargeFileBoundedMemory' -- 'adapter/outbound/fileserver/src' | head -4 adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/testkit/LargeFileBoundedMemoryTest.java:34:class LargeFileBoundedMemoryTest { exit=0 $ grep -nE '@Test| void |assertThat.*[Mm]emory|Runtime.getRuntime' adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/testkit/LargeFileBoundedMemoryTest.java | head -20 43: @Test 44: void uploadingALargeObjectNeverRequestsMoreThanOneBufferAtATime() { 71: @Test 72: void readingALargeObjectIsAlsoBounded() throws Exception { exit=0 === 8.4c what LocalCreateUploadConcurrencyTest and the gateway contract cover === $ grep -nE '@Test| void ' adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalCreateUploadConcurrencyTest.java adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/PhysicalPathResolverTest.java adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/ContentPublisherTest.java adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalCreateUploadConcurrencyTest.java:28: void exactlyOneConcurrentCreateWinsForSameUploadId() throws Exception { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:47: void setUp() { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:56: @Test adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:57: void anUploadIsStagedAppendedAndReadBackThroughTheGateways() { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:67: @Test adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:68: void aStagingLengthOfAMissingObjectReadsAsZeroRatherThanFailing() { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:76: @Test adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:77: void aStagedDigestIsRefusedWhenTheOffsetDisagreesWithTheBytesOnDisk() { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:86: @Test adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:87: void aPublishedObjectIsReadableThroughTheDownloadGateway() throws IOException { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:96: @Test adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:97: void aRangedReadIsBoundedToTheRequestedRegion() throws IOException { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:106: @Test adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:107: void aCopyProducesAnIndependentObjectWithTheSameBytes() throws IOException { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:121: @Test adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:122: void deletingTheCopyLeavesTheSourceIntact() { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:133: @Test adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:134: void aDeleteWhoseSizePreconditionDisagreesIsRefused() { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:143: @Test adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:144: void deletingAnAbsentObjectIsIdempotentRatherThanAFailure() { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:152: @Test adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:153: void aDirectTransferWritesExactlyTheRequestedRegion() { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:165: @Test adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:166: void aDirectTransferDeclinesForAnObjectThatIsNotThereRatherThanThrowing() { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:188: @Test adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:189: void aSinkThatStopsPartWayReportsAPartialTransferRatherThanADecline() { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:230: @Test adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:231: void aStagingCleanupRemovesTheBytesTheUploadOwned() { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/PhysicalPathResolverTest.java:20: @Test adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/PhysicalPathResolverTest.java:21: void generatedContentPathAlwaysStaysBelowContentRoot() { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/PhysicalPathResolverTest.java:30: @Test adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/PhysicalPathResolverTest.java:31: void stagingPathIsShardedFromTheUploadIdentityOnly() { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/PhysicalPathResolverTest.java:43: @Test adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/PhysicalPathResolverTest.java:44: void quarantinePathMirrorsTheContentLayoutInASeparateArea() { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/PhysicalPathResolverTest.java:67: void rejectsEveryKeyThatIsNotTheServerGeneratedShardedShape(String candidate) { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/PhysicalPathResolverTest.java:75: @Test adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/PhysicalPathResolverTest.java:76: void newContentKeyIsShardedUniqueAndResolvable() { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/PhysicalPathResolverTest.java:87: @Test adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/PhysicalPathResolverTest.java:88: void aRelativeStorageRootIsRejectedOutright() { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/PhysicalPathResolverTest.java:93: @Test adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/PhysicalPathResolverTest.java:94: void everyAreaRootStaysBelowTheConfiguredRoot() { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/PhysicalPathResolverTest.java:103: @Test adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/PhysicalPathResolverTest.java:104: void resolutionNeverDependsOnAClientFilename() { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/ContentPublisherTest.java:32: @Test adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/ContentPublisherTest.java:33: void atomicPublisherMovesStagingToCreateOnlyTarget() throws IOException { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/ContentPublisherTest.java:48: @Test adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/ContentPublisherTest.java:49: void pointerPublisherKeepsImmutableObjectAndReturnsNewContentKey() throws IOException { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/ContentPublisherTest.java:64: @Test adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/ContentPublisherTest.java:65: void bothStrategiesRecordTheProvenSizeAndDigest() { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/ContentPublisherTest.java:80: @Test adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/ContentPublisherTest.java:81: void aDigestMismatchNeverPublishesAnything() { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/ContentPublisherTest.java:94: @Test adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/ContentPublisherTest.java:95: void aLengthMismatchNeverPublishesAnything() { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/ContentPublisherTest.java:107: @Test adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/ContentPublisherTest.java:108: void requiredAtomicModeFailsClosedWhenTheProbeCouldNotProveIt() { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/ContentPublisherTest.java:119: @Test adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/ContentPublisherTest.java:120: void preferredModeDegradesToPointerPublishWhenAtomicMoveIsUnproven() { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/ContentPublisherTest.java:133: @Test adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/ContentPublisherTest.java:134: void statReadsTheProvenPhysicalSizeWithoutFollowingALink() { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/ContentPublisherTest.java:146: @Test adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/ContentPublisherTest.java:147: void rangedReadStopsExactlyAtTheRequestedEnd() throws IOException { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/ContentPublisherTest.java:158: @Test adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/ContentPublisherTest.java:159: void deleteIsPreconditionCheckedAndIdempotent() { adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/ContentPublisherTest.java:179: @Test adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/ContentPublisherTest.java:180: void publishedContentIsNeverNamedAfterAClientFilename() { exit=0