diff --git a/sdk/storage/azure-storage-common/src/main/java/com/azure/storage/common/implementation/UploadUtils.java b/sdk/storage/azure-storage-common/src/main/java/com/azure/storage/common/implementation/UploadUtils.java index fcb9478238ec..32e10374b249 100644 --- a/sdk/storage/azure-storage-common/src/main/java/com/azure/storage/common/implementation/UploadUtils.java +++ b/sdk/storage/azure-storage-common/src/main/java/com/azure/storage/common/implementation/UploadUtils.java @@ -148,12 +148,12 @@ public static void uploadFileCleanup(AsynchronousFileChannel channel, ClientLogg } } - /* PULLED FROM RELEASE - * Computes the md5 of the data. - * + /** + * It computes the MD5 of the provided buffer * @param data The data. * @param logger Logger to log errors. * @return The md5 of the data. + */ public static byte[] computeMd5(ByteBuffer data, ClientLogger logger) { if (data == null) { return null; @@ -165,7 +165,7 @@ public static byte[] computeMd5(ByteBuffer data, ClientLogger logger) { } catch (NoSuchAlgorithmException e) { throw logger.logExceptionAsError(new RuntimeException(e)); } - } */ + } /** * Computes the md5 of the data and wraps it with the data. diff --git a/sdk/storage/azure-storage-file-share/assets.json b/sdk/storage/azure-storage-file-share/assets.json index 532bacc95059..2096399e6a76 100644 --- a/sdk/storage/azure-storage-file-share/assets.json +++ b/sdk/storage/azure-storage-file-share/assets.json @@ -2,5 +2,5 @@ "AssetsRepo": "Azure/azure-sdk-assets", "AssetsRepoPrefixPath": "java", "TagPrefix": "java/storage/azure-storage-file-share", - "Tag": "java/storage/azure-storage-file-share_62019cc18e" + "Tag": "java/storage/azure-storage-file-share_1e9eb49640" } diff --git a/sdk/storage/azure-storage-file-share/src/main/java/com/azure/storage/file/share/ShareDirectoryAsyncClient.java b/sdk/storage/azure-storage-file-share/src/main/java/com/azure/storage/file/share/ShareDirectoryAsyncClient.java index 0be8a4408623..575d1d9f9b91 100644 --- a/sdk/storage/azure-storage-file-share/src/main/java/com/azure/storage/file/share/ShareDirectoryAsyncClient.java +++ b/sdk/storage/azure-storage-file-share/src/main/java/com/azure/storage/file/share/ShareDirectoryAsyncClient.java @@ -346,7 +346,8 @@ public Mono> createWithResponse(FileSmbProperties s public Mono> createWithResponse(ShareDirectoryCreateOptions options) { try { return withContext(context -> createWithResponse(options.getSmbProperties(), options.getFilePermission(), - options.getFilePermissionFormat(), options.getPosixProperties(), options.getMetadata(), null, context)); + options.getFilePermissionFormat(), options.getPosixProperties(), options.getMetadata(), + options.getFilePropertySemantics(), context)); } catch (RuntimeException ex) { return monoError(LOGGER, ex); } @@ -367,7 +368,7 @@ Mono> createWithResponse(FileSmbProperties smbPrope smbProperties.getFilePermissionKey(), smbProperties.getNtfsFileAttributesString(), smbProperties.getFileCreationTimeString(), smbProperties.getFileLastWriteTimeString(), smbProperties.getFileChangeTimeString(), posixProperties.getOwner(), posixProperties.getGroup(), - posixProperties.getFileMode(), null, context) + posixProperties.getFileMode(), filePropertySemantics, context) .map(ModelHelper::mapShareDirectoryInfo); } @@ -448,14 +449,14 @@ Mono> createIfNotExistsWithResponse(ShareDirectoryC try { options = options == null ? new ShareDirectoryCreateOptions() : options; return createWithResponse(options.getSmbProperties(), options.getFilePermission(), - options.getFilePermissionFormat(), options.getPosixProperties(), options.getMetadata(), null, context) - .onErrorResume( - t -> t instanceof ShareStorageException && ((ShareStorageException) t).getStatusCode() == 409, - t -> { - HttpResponse response = ((ShareStorageException) t).getResponse(); - return Mono.just(new SimpleResponse<>(response.getRequest(), response.getStatusCode(), - response.getHeaders(), null)); - }); + options.getFilePermissionFormat(), options.getPosixProperties(), options.getMetadata(), + options.getFilePropertySemantics(), context).onErrorResume( + t -> t instanceof ShareStorageException && ((ShareStorageException) t).getStatusCode() == 409, + t -> { + HttpResponse response = ((ShareStorageException) t).getResponse(); + return Mono.just(new SimpleResponse<>(response.getRequest(), response.getStatusCode(), + response.getHeaders(), null)); + }); } catch (RuntimeException ex) { return monoError(LOGGER, ex); } diff --git a/sdk/storage/azure-storage-file-share/src/main/java/com/azure/storage/file/share/ShareDirectoryClient.java b/sdk/storage/azure-storage-file-share/src/main/java/com/azure/storage/file/share/ShareDirectoryClient.java index 1a4d1895e82b..32c7ceced009 100644 --- a/sdk/storage/azure-storage-file-share/src/main/java/com/azure/storage/file/share/ShareDirectoryClient.java +++ b/sdk/storage/azure-storage-file-share/src/main/java/com/azure/storage/file/share/ShareDirectoryClient.java @@ -360,7 +360,7 @@ public Response createWithResponse(ShareDirectoryCreateOptio smbProperties.getFilePermissionKey(), smbProperties.getNtfsFileAttributesString(), smbProperties.getFileCreationTimeString(), smbProperties.getFileLastWriteTimeString(), smbProperties.getFileChangeTimeString(), fileposixProperties.getOwner(), fileposixProperties.getGroup(), - fileposixProperties.getFileMode(), null, finalContext); + fileposixProperties.getFileMode(), finalOptions.getFilePropertySemantics(), finalContext); return ModelHelper.mapShareDirectoryInfo(sendRequest(operation, timeout, ShareStorageException.class)); } diff --git a/sdk/storage/azure-storage-file-share/src/main/java/com/azure/storage/file/share/ShareFileAsyncClient.java b/sdk/storage/azure-storage-file-share/src/main/java/com/azure/storage/file/share/ShareFileAsyncClient.java index 42c3f9042874..349dc6989267 100644 --- a/sdk/storage/azure-storage-file-share/src/main/java/com/azure/storage/file/share/ShareFileAsyncClient.java +++ b/sdk/storage/azure-storage-file-share/src/main/java/com/azure/storage/file/share/ShareFileAsyncClient.java @@ -450,8 +450,8 @@ public Mono> createWithResponse(ShareFileCreateOptions o StorageImplUtils.assertNotNull("options", options); return withContext(context -> createWithResponse(options.getSize(), options.getShareFileHttpHeaders(), options.getSmbProperties(), options.getFilePermission(), options.getFilePermissionFormat(), - options.getPosixProperties(), options.getMetadata(), options.getRequestConditions(), null, null, - context)); + options.getPosixProperties(), options.getMetadata(), options.getRequestConditions(), + options.getFilePropertySemantics(), options.getData(), context)); } catch (RuntimeException ex) { return monoError(LOGGER, ex); } @@ -461,15 +461,16 @@ Mono> createWithResponse(long maxSize, ShareFileHttpHead FileSmbProperties smbProperties, String filePermission, FilePermissionFormat filePermissionFormat, FilePosixProperties filePosixProperties, Map metadata, ShareRequestConditions requestConditions, FilePropertySemantics filePropertySemantics, BinaryData binaryData, Context context) { - context = context == null ? Context.NONE : context; - requestConditions = requestConditions == null ? new ShareRequestConditions() : requestConditions; - smbProperties = smbProperties == null ? new FileSmbProperties() : smbProperties; - filePosixProperties = filePosixProperties == null ? new FilePosixProperties() : filePosixProperties; + final Context contextLocal = context == null ? Context.NONE : context; + final ShareRequestConditions requestConditionsLocal + = requestConditions == null ? new ShareRequestConditions() : requestConditions; + final FileSmbProperties smbPropertiesLocal = smbProperties == null ? new FileSmbProperties() : smbProperties; + final FilePosixProperties filePosixPropertiesLocal + = filePosixProperties == null ? new FilePosixProperties() : filePosixProperties; // Checks that file permission and file permission key are valid - ModelHelper.validateFilePermissionAndKey(filePermission, smbProperties.getFilePermissionKey()); + ModelHelper.validateFilePermissionAndKey(filePermission, smbPropertiesLocal.getFilePermissionKey()); - /* PULLED FROM RELEASE Mono contentMD5Mono; Long contentLength; if (binaryData != null) { @@ -478,17 +479,17 @@ Mono> createWithResponse(long maxSize, ShareFileHttpHead } else { contentLength = null; contentMD5Mono = UploadUtils.computeMd5(null, false, LOGGER); - } */ + } - //return contentMD5Mono.flatMap(fluxMD5wrapper -> azureFileStorageClient.getFiles() - return azureFileStorageClient.getFiles() + return contentMD5Mono.flatMap(fluxMD5wrapper -> azureFileStorageClient.getFiles() .createWithResponseAsync(shareName, filePath, maxSize, null, metadata, filePermission, filePermissionFormat, - smbProperties.getFilePermissionKey(), smbProperties.getNtfsFileAttributesString(), - smbProperties.getFileCreationTimeString(), smbProperties.getFileLastWriteTimeString(), - smbProperties.getFileChangeTimeString(), requestConditions.getLeaseId(), filePosixProperties.getOwner(), - filePosixProperties.getGroup(), filePosixProperties.getFileMode(), filePosixProperties.getFileType(), - null, null, null, (Flux) null, httpHeaders, context) - .map(ModelHelper::createFileInfoResponse); + smbPropertiesLocal.getFilePermissionKey(), smbPropertiesLocal.getNtfsFileAttributesString(), + smbPropertiesLocal.getFileCreationTimeString(), smbPropertiesLocal.getFileLastWriteTimeString(), + smbPropertiesLocal.getFileChangeTimeString(), requestConditionsLocal.getLeaseId(), + filePosixPropertiesLocal.getOwner(), filePosixPropertiesLocal.getGroup(), + filePosixPropertiesLocal.getFileMode(), filePosixPropertiesLocal.getFileType(), fluxMD5wrapper.getMd5(), + filePropertySemantics, contentLength, fluxMD5wrapper.getData(), httpHeaders, contextLocal) + .map(ModelHelper::createFileInfoResponse)); } /** diff --git a/sdk/storage/azure-storage-file-share/src/main/java/com/azure/storage/file/share/ShareFileClient.java b/sdk/storage/azure-storage-file-share/src/main/java/com/azure/storage/file/share/ShareFileClient.java index 114d50a24946..10bcbbdaac24 100644 --- a/sdk/storage/azure-storage-file-share/src/main/java/com/azure/storage/file/share/ShareFileClient.java +++ b/sdk/storage/azure-storage-file-share/src/main/java/com/azure/storage/file/share/ShareFileClient.java @@ -31,6 +31,7 @@ import com.azure.storage.common.implementation.SasImplUtils; import com.azure.storage.common.implementation.StorageImplUtils; import com.azure.storage.common.implementation.StorageSeekableByteChannel; +import com.azure.storage.common.implementation.UploadUtils; import com.azure.storage.file.share.implementation.AzureFileStorageImpl; import com.azure.storage.file.share.implementation.models.CopyFileSmbInfo; import com.azure.storage.file.share.implementation.models.DestinationLeaseAccessConditions; @@ -540,7 +541,6 @@ public Response createWithResponse(ShareFileCreateOptions options // Checks that file permission and file permission key are valid ModelHelper.validateFilePermissionAndKey(options.getFilePermission(), smbProperties.getFilePermissionKey()); - /* PULLED FROM RELEASE Long contentLength; byte[] contentMD5; if (options.getData() != null) { @@ -549,7 +549,7 @@ public Response createWithResponse(ShareFileCreateOptions options } else { contentLength = null; contentMD5 = null; - } */ + } Callable> operation = () -> this.azureFileStorageClient.getFiles() .createWithResponse(shareName, filePath, options.getSize(), null, options.getMetadata(), @@ -557,8 +557,9 @@ public Response createWithResponse(ShareFileCreateOptions options smbProperties.getNtfsFileAttributesString(), smbProperties.getFileCreationTimeString(), smbProperties.getFileLastWriteTimeString(), smbProperties.getFileChangeTimeString(), requestConditions.getLeaseId(), fileposixProperties.getOwner(), fileposixProperties.getGroup(), - fileposixProperties.getFileMode(), fileposixProperties.getFileType(), null, null, null, null, - options.getShareFileHttpHeaders(), finalContext); + fileposixProperties.getFileMode(), fileposixProperties.getFileType(), contentMD5, + options.getFilePropertySemantics(), contentLength, options.getData(), options.getShareFileHttpHeaders(), + finalContext); return ModelHelper.createFileInfoResponse(sendRequest(operation, timeout, ShareStorageException.class)); } diff --git a/sdk/storage/azure-storage-file-share/src/main/java/com/azure/storage/file/share/options/ShareDirectoryCreateOptions.java b/sdk/storage/azure-storage-file-share/src/main/java/com/azure/storage/file/share/options/ShareDirectoryCreateOptions.java index 46fed0b28c58..c3c18171d093 100644 --- a/sdk/storage/azure-storage-file-share/src/main/java/com/azure/storage/file/share/options/ShareDirectoryCreateOptions.java +++ b/sdk/storage/azure-storage-file-share/src/main/java/com/azure/storage/file/share/options/ShareDirectoryCreateOptions.java @@ -7,6 +7,7 @@ import com.azure.storage.file.share.FileSmbProperties; import com.azure.storage.file.share.models.FilePermissionFormat; import com.azure.storage.file.share.models.FilePosixProperties; +import com.azure.storage.file.share.models.FilePropertySemantics; import java.util.Map; @@ -20,7 +21,7 @@ public class ShareDirectoryCreateOptions { private FilePermissionFormat filePermissionFormat; private Map metadata; private FilePosixProperties posixProperties; - // private FilePropertySemantics filePropertySemantics; PULLED FROM RELEASE + private FilePropertySemantics filePropertySemantics; /** * Creates a new instance of {@link ShareDirectoryCreateOptions}. @@ -135,7 +136,7 @@ public ShareDirectoryCreateOptions setPosixProperties(FilePosixProperties posixP return this; } - /* PULLED FROM RELEASE + /** * Optional, only applicable to SMB directories. Gets how attributes and permissions should be set on the file. * New: automatically adds the ARCHIVE file attribute flag to the file and uses Windows create file permissions * semantics (ex: inherit from parent). @@ -143,11 +144,11 @@ public ShareDirectoryCreateOptions setPosixProperties(FilePosixProperties posixP * If Restore is specified, the file permission must also be provided, otherwise PropertySemantics will default to New. * * @return {@link FilePropertySemantics} - + */ public FilePropertySemantics getFilePropertySemantics() { return filePropertySemantics; } - + /** * Optional, only applicable to SMB directories. Sets how attributes and permissions should be set on the file. * New: automatically adds the ARCHIVE file attribute flag to the file and uses Windows create file permissions @@ -157,9 +158,9 @@ public FilePropertySemantics getFilePropertySemantics() { * * @param filePropertySemantics {@link FilePropertySemantics} * @return The updated options. - + */ public ShareDirectoryCreateOptions setFilePropertySemantics(FilePropertySemantics filePropertySemantics) { this.filePropertySemantics = filePropertySemantics; return this; - } */ + } } diff --git a/sdk/storage/azure-storage-file-share/src/main/java/com/azure/storage/file/share/options/ShareFileCreateOptions.java b/sdk/storage/azure-storage-file-share/src/main/java/com/azure/storage/file/share/options/ShareFileCreateOptions.java index 8394060c5d43..36a1b55a906a 100644 --- a/sdk/storage/azure-storage-file-share/src/main/java/com/azure/storage/file/share/options/ShareFileCreateOptions.java +++ b/sdk/storage/azure-storage-file-share/src/main/java/com/azure/storage/file/share/options/ShareFileCreateOptions.java @@ -4,9 +4,11 @@ package com.azure.storage.file.share.options; import com.azure.core.annotation.Fluent; +import com.azure.core.util.BinaryData; import com.azure.storage.file.share.FileSmbProperties; import com.azure.storage.file.share.models.FilePermissionFormat; import com.azure.storage.file.share.models.FilePosixProperties; +import com.azure.storage.file.share.models.FilePropertySemantics; import com.azure.storage.file.share.models.ShareFileHttpHeaders; import com.azure.storage.file.share.models.ShareRequestConditions; import java.util.Map; @@ -25,8 +27,8 @@ public class ShareFileCreateOptions { private Map metadata; private ShareRequestConditions requestConditions; private FilePosixProperties posixProperties; - // private FilePropertySemantics filePropertySemantics; PULLED FROM RELEASE - // private BinaryData binaryData; + private FilePropertySemantics filePropertySemantics; + private BinaryData binaryData; /** * Creates a new instance of {@link ShareFileCreateOptions}. @@ -193,7 +195,7 @@ public ShareFileCreateOptions setPosixProperties(FilePosixProperties posixProper return this; } - /* PULLED FROM RELEASE + /** * Optional, only applicable to SMB files. Gets how attributes and permissions should be set on the file. * New: automatically adds the ARCHIVE file attribute flag to the file and uses Windows create file permissions * semantics (ex: inherit from parent). @@ -201,12 +203,12 @@ public ShareFileCreateOptions setPosixProperties(FilePosixProperties posixProper * If Restore is specified, the file permission must also be provided, otherwise PropertySemantics will default to New. * * @return {@link FilePropertySemantics} - + */ public FilePropertySemantics getFilePropertySemantics() { return filePropertySemantics; } - - /* + + /** * Optional, only applicable to SMB files. Sets how attributes and permissions should be set on the file. * New: automatically adds the ARCHIVE file attribute flag to the file and uses Windows create file permissions * semantics (ex: inherit from parent). @@ -215,31 +217,31 @@ public FilePropertySemantics getFilePropertySemantics() { * * @param filePropertySemantics {@link FilePropertySemantics} * @return The updated options. - + */ public ShareFileCreateOptions setFilePropertySemantics(FilePropertySemantics filePropertySemantics) { this.filePropertySemantics = filePropertySemantics; return this; } - - /* + + /** * Optional, valid for version 2026-02-06 and later. * Gets the content to upload to the file when it is created. Must be less than or equal to 4 MiB in size. * * @return The {@link BinaryData}. - + */ public BinaryData getData() { return binaryData; } - - /* + + /** * Optional, valid for version 2026-02-06 and later. * Sets the content to upload to the file when it is created. Must be less than or equal to 4 MiB in size. * * @param binaryData The {@link BinaryData}. * @return The updated options. - + */ public ShareFileCreateOptions setData(BinaryData binaryData) { this.binaryData = binaryData; return this; - } */ + } } diff --git a/sdk/storage/azure-storage-file-share/src/test/java/com/azure/storage/file/share/DirectoryApiTests.java b/sdk/storage/azure-storage-file-share/src/test/java/com/azure/storage/file/share/DirectoryApiTests.java index dbbb3dc03dcd..c7dffe9ac1e8 100644 --- a/sdk/storage/azure-storage-file-share/src/test/java/com/azure/storage/file/share/DirectoryApiTests.java +++ b/sdk/storage/azure-storage-file-share/src/test/java/com/azure/storage/file/share/DirectoryApiTests.java @@ -3,16 +3,19 @@ package com.azure.storage.file.share; +import com.azure.core.http.HttpHeader; import com.azure.core.http.HttpHeaderName; import com.azure.core.http.rest.PagedResponse; import com.azure.core.http.rest.Response; import com.azure.core.util.Context; import com.azure.core.util.HttpClientOptions; +import com.azure.storage.blob.BlobServiceVersion; import com.azure.storage.common.StorageSharedKeyCredential; import com.azure.storage.common.implementation.Constants; import com.azure.storage.common.policy.RequestRetryOptions; import com.azure.storage.common.test.shared.extensions.LiveOnly; import com.azure.storage.common.test.shared.extensions.RequiredServiceVersion; +import com.azure.storage.file.share.models.FilePropertySemantics; import com.azure.storage.file.share.models.NfsFileType; import com.azure.storage.file.share.models.CloseHandlesInfo; import com.azure.storage.file.share.models.FilePermissionFormat; @@ -66,6 +69,7 @@ import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertInstanceOf; import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -1829,20 +1833,19 @@ public void directoryExistsHandlesParentNotFound() { response.getHeaders().getValue(ERROR_CODE_HEADER_NAME)); } - /* PULLED FROM RELEASE - @RequiredServiceVersion(clazz = BlobServiceVersion.class, min = "2026-02-06") + @RequiredServiceVersion(clazz = BlobServiceVersion.class, min = "2026-06-06") @ParameterizedTest @MethodSource("com.azure.storage.file.share.FileShareTestHelper#filePropertySemanticsSupplier") public void createDirectoryFilePropertySemantics(FilePropertySemantics filePropertySemantics) { ShareDirectoryCreateOptions options = new ShareDirectoryCreateOptions().setFilePropertySemantics(filePropertySemantics); - + // For Create File and Directory with FilePropertySemantics == Restore, // the File Permission property must be provided, otherwise FilePropertySemantics will default to new. if (filePropertySemantics == FilePropertySemantics.RESTORE) { options.setFilePermission(FILE_PERMISSION); } - + Response response = primaryDirectoryClient.createWithResponse(options, null, Context.NONE); HttpHeader retrievedHeader = response.getRequest().getHeaders().get(X_MS_FILE_PROPERTY_SEMANTICS); if (filePropertySemantics != null) { @@ -1851,20 +1854,20 @@ public void createDirectoryFilePropertySemantics(FilePropertySemantics filePrope assertNull(retrievedHeader); } } - - @RequiredServiceVersion(clazz = BlobServiceVersion.class, min = "2026-02-06") + + @RequiredServiceVersion(clazz = BlobServiceVersion.class, min = "2026-06-06") @ParameterizedTest @MethodSource("com.azure.storage.file.share.FileShareTestHelper#filePropertySemanticsSupplier") public void createDirectoryIfNotExistsFilePropertySemantics(FilePropertySemantics filePropertySemantics) { ShareDirectoryCreateOptions options = new ShareDirectoryCreateOptions().setFilePropertySemantics(filePropertySemantics); - + // For Create File and Directory with FilePropertySemantics == Restore, // the File Permission property must be provided, otherwise FilePropertySemantics will default to new. if (filePropertySemantics == FilePropertySemantics.RESTORE) { options.setFilePermission(FILE_PERMISSION); } - + Response response = primaryDirectoryClient.createIfNotExistsWithResponse(options, null, Context.NONE); HttpHeader retrievedHeader = response.getRequest().getHeaders().get(X_MS_FILE_PROPERTY_SEMANTICS); @@ -1873,5 +1876,5 @@ public void createDirectoryIfNotExistsFilePropertySemantics(FilePropertySemantic } else { assertNull(retrievedHeader); } - } */ + } } diff --git a/sdk/storage/azure-storage-file-share/src/test/java/com/azure/storage/file/share/DirectoryAsyncApiTests.java b/sdk/storage/azure-storage-file-share/src/test/java/com/azure/storage/file/share/DirectoryAsyncApiTests.java index 664285c2d29b..90ea84967cb8 100644 --- a/sdk/storage/azure-storage-file-share/src/test/java/com/azure/storage/file/share/DirectoryAsyncApiTests.java +++ b/sdk/storage/azure-storage-file-share/src/test/java/com/azure/storage/file/share/DirectoryAsyncApiTests.java @@ -3,11 +3,14 @@ package com.azure.storage.file.share; +import com.azure.core.http.HttpHeader; import com.azure.core.http.rest.Response; +import com.azure.storage.blob.BlobServiceVersion; import com.azure.storage.common.StorageSharedKeyCredential; import com.azure.storage.common.implementation.Constants; import com.azure.storage.common.test.shared.extensions.LiveOnly; import com.azure.storage.common.test.shared.extensions.RequiredServiceVersion; +import com.azure.storage.file.share.models.FilePropertySemantics; import com.azure.storage.file.share.models.NfsFileType; import com.azure.storage.file.share.models.FilePermissionFormat; import com.azure.storage.file.share.models.FilePosixProperties; @@ -55,6 +58,7 @@ import static org.junit.jupiter.api.Assertions.assertInstanceOf; import static org.junit.jupiter.api.Assertions.assertNotEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertTrue; public class DirectoryAsyncApiTests extends FileShareTestBase { @@ -1154,20 +1158,19 @@ public void directoryExistsHandlesParentNotFound() { }).verifyComplete(); } - /* PULLED FROM RELEASE - @RequiredServiceVersion(clazz = BlobServiceVersion.class, min = "2026-02-06") + @RequiredServiceVersion(clazz = BlobServiceVersion.class, min = "2026-06-06") @ParameterizedTest @MethodSource("com.azure.storage.file.share.FileShareTestHelper#filePropertySemanticsSupplier") public void createDirectoryFilePropertySemantics(FilePropertySemantics filePropertySemantics) { ShareDirectoryCreateOptions options = new ShareDirectoryCreateOptions().setFilePropertySemantics(filePropertySemantics); - + // For Create File and Directory with FilePropertySemantics == Restore, // the File Permission property must be provided, otherwise FilePropertySemantics will default to new. if (filePropertySemantics == FilePropertySemantics.RESTORE) { options.setFilePermission(FILE_PERMISSION); } - + StepVerifier.create(primaryDirectoryAsyncClient.createWithResponse(options)).assertNext(r -> { HttpHeader retrievedHeader = r.getRequest().getHeaders().get(X_MS_FILE_PROPERTY_SEMANTICS); if (filePropertySemantics != null) { @@ -1177,20 +1180,20 @@ public void createDirectoryFilePropertySemantics(FilePropertySemantics filePrope } }).verifyComplete(); } - - @RequiredServiceVersion(clazz = BlobServiceVersion.class, min = "2026-02-06") + + @RequiredServiceVersion(clazz = BlobServiceVersion.class, min = "2026-06-06") @ParameterizedTest @MethodSource("com.azure.storage.file.share.FileShareTestHelper#filePropertySemanticsSupplier") public void createDirectoryIfNotExistsFilePropertySemantics(FilePropertySemantics filePropertySemantics) { ShareDirectoryCreateOptions options = new ShareDirectoryCreateOptions().setFilePropertySemantics(filePropertySemantics); - + // For Create File and Directory with FilePropertySemantics == Restore, // the File Permission property must be provided, otherwise FilePropertySemantics will default to new. if (filePropertySemantics == FilePropertySemantics.RESTORE) { options.setFilePermission(FILE_PERMISSION); } - + StepVerifier.create(primaryDirectoryAsyncClient.createIfNotExistsWithResponse(options)).assertNext(r -> { HttpHeader retrievedHeader = r.getRequest().getHeaders().get(X_MS_FILE_PROPERTY_SEMANTICS); if (filePropertySemantics != null) { @@ -1199,5 +1202,5 @@ public void createDirectoryIfNotExistsFilePropertySemantics(FilePropertySemantic assertNull(retrievedHeader); } }).verifyComplete(); - } */ + } } diff --git a/sdk/storage/azure-storage-file-share/src/test/java/com/azure/storage/file/share/FileApiTests.java b/sdk/storage/azure-storage-file-share/src/test/java/com/azure/storage/file/share/FileApiTests.java index 55ea5a58eaae..c8b9045e8b09 100644 --- a/sdk/storage/azure-storage-file-share/src/test/java/com/azure/storage/file/share/FileApiTests.java +++ b/sdk/storage/azure-storage-file-share/src/test/java/com/azure/storage/file/share/FileApiTests.java @@ -4,14 +4,17 @@ package com.azure.storage.file.share; import com.azure.core.exception.UnexpectedLengthException; +import com.azure.core.http.HttpHeader; import com.azure.core.http.HttpHeaderName; import com.azure.core.http.rest.Response; import com.azure.core.test.TestMode; +import com.azure.core.util.BinaryData; import com.azure.core.util.Context; import com.azure.core.util.CoreUtils; import com.azure.core.util.polling.LongRunningOperationStatus; import com.azure.core.util.polling.PollResponse; import com.azure.core.util.polling.SyncPoller; +import com.azure.storage.blob.BlobServiceVersion; import com.azure.storage.common.ParallelTransferOptions; import com.azure.storage.common.StorageSharedKeyCredential; import com.azure.storage.common.Utility; @@ -24,6 +27,7 @@ import com.azure.storage.common.test.shared.policy.MockRetryRangeResponsePolicy; import com.azure.storage.common.test.shared.policy.TransientFailureInjectingHttpPipelinePolicy; import com.azure.storage.file.share.implementation.util.ModelHelper; +import com.azure.storage.file.share.models.FilePropertySemantics; import com.azure.storage.file.share.models.ModeCopyMode; import com.azure.storage.file.share.models.NfsFileType; import com.azure.storage.file.share.models.ClearRange; @@ -96,10 +100,14 @@ import java.nio.file.FileAlreadyExistsException; import java.nio.file.Files; import java.nio.file.NoSuchFileException; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; import java.time.LocalDateTime; import java.time.OffsetDateTime; import java.time.ZoneOffset; import java.util.ArrayList; +import java.util.Arrays; +import java.util.Base64; import java.util.Collections; import java.util.EnumSet; import java.util.List; @@ -3380,20 +3388,19 @@ public void fileExistsHandlesParentNotFound() { response.getHeaders().getValue(ERROR_CODE_HEADER_NAME)); } - /* PULLED FROM RELEASE - @RequiredServiceVersion(clazz = BlobServiceVersion.class, min = "2026-02-06") + @RequiredServiceVersion(clazz = BlobServiceVersion.class, min = "2026-06-06") @ParameterizedTest @MethodSource("com.azure.storage.file.share.FileShareTestHelper#filePropertySemanticsSupplier") public void createFileFilePropertySemantics(FilePropertySemantics filePropertySemantics) { ShareFileCreateOptions options = new ShareFileCreateOptions(Constants.KB).setFilePropertySemantics(filePropertySemantics); - + // For Create File and Directory with FilePropertySemantics == Restore, // the File Permission property must be provided, otherwise FilePropertySemantics will default to new. if (filePropertySemantics == FilePropertySemantics.RESTORE) { options.setFilePermission(FILE_PERMISSION); } - + Response response = primaryFileClient.createWithResponse(options, null, Context.NONE); HttpHeader retrievedHeader = response.getRequest().getHeaders().get(X_MS_FILE_PROPERTY_SEMANTICS); if (filePropertySemantics != null) { @@ -3402,104 +3409,104 @@ public void createFileFilePropertySemantics(FilePropertySemantics filePropertySe assertNull(retrievedHeader); } } - - @RequiredServiceVersion(clazz = BlobServiceVersion.class, min = "2026-02-06") + + @RequiredServiceVersion(clazz = BlobServiceVersion.class, min = "2026-06-06") @Test public void createFileWithBinaryData() { ShareFileCreateOptions options = new ShareFileCreateOptions(DATA.getDefaultDataSize()).setData(DATA.getDefaultBinaryData()); - + primaryFileClient.createWithResponse(options, null, Context.NONE); - + ByteArrayOutputStream stream = new ByteArrayOutputStream(); primaryFileClient.download(stream); - + assertArrayEquals(DATA.getDefaultBytes(), stream.toByteArray()); } - - @RequiredServiceVersion(clazz = BlobServiceVersion.class, min = "2026-02-06") + + @RequiredServiceVersion(clazz = BlobServiceVersion.class, min = "2026-06-06") @Test public void createFileWithBinaryDataFail() { ShareFileCreateOptions options = new ShareFileCreateOptions(2L).setData(DATA.getDefaultBinaryData()); - + assertThrows(ShareStorageException.class, () -> primaryFileClient.createWithResponse(options, null, Context.NONE)); } - - @RequiredServiceVersion(clazz = BlobServiceVersion.class, min = "2026-02-06") + + @RequiredServiceVersion(clazz = BlobServiceVersion.class, min = "2026-06-06") @Test public void createFileWithBinaryDataPartiallyEmpty() { ShareFileCreateOptions options = new ShareFileCreateOptions(Constants.KB).setData(DATA.getDefaultBinaryData()); - + primaryFileClient.createWithResponse(options, null, Context.NONE); - + ByteArrayOutputStream stream = new ByteArrayOutputStream(); primaryFileClient.download(stream); - + // When the max file size is larger than the data size, the rest of the file is zeroed out. // We only check the part we wrote to here, which is why we use copyOfRange. assertArrayEquals(DATA.getDefaultBytes(), Arrays.copyOfRange(stream.toByteArray(), 0, DATA.getDefaultDataSize())); } - - @RequiredServiceVersion(clazz = BlobServiceVersion.class, min = "2026-02-06") + + @RequiredServiceVersion(clazz = BlobServiceVersion.class, min = "2026-06-06") @Test public void createFileWithLargeBinaryData() { byte[] randomByteArray = getRandomByteArray(Constants.MB * 4); BinaryData data = BinaryData.fromBytes(randomByteArray); - + ShareFileCreateOptions options = new ShareFileCreateOptions(Constants.MB * 4).setData(data); - + primaryFileClient.createWithResponse(options, null, Context.NONE); - + ByteArrayOutputStream stream = new ByteArrayOutputStream(); primaryFileClient.download(stream); - + assertArrayEquals(randomByteArray, stream.toByteArray()); } - - @RequiredServiceVersion(clazz = BlobServiceVersion.class, min = "2026-02-06") + + @RequiredServiceVersion(clazz = BlobServiceVersion.class, min = "2026-06-06") @Test public void createFileWithLargeBinaryDataPartiallyEmpty() { byte[] randomByteArray = getRandomByteArray(Constants.MB * 4); BinaryData data = BinaryData.fromBytes(randomByteArray); - + ShareFileCreateOptions options = new ShareFileCreateOptions(Constants.MB * 5).setData(data); - + primaryFileClient.createWithResponse(options, null, Context.NONE); - + ByteArrayOutputStream stream = new ByteArrayOutputStream(); primaryFileClient.download(stream); - + assertArrayEquals(randomByteArray, Arrays.copyOfRange(stream.toByteArray(), 0, Constants.MB * 4)); } - - @RequiredServiceVersion(clazz = BlobServiceVersion.class, min = "2026-02-06") + + @RequiredServiceVersion(clazz = BlobServiceVersion.class, min = "2026-06-06") @Test public void createFileWithBinaryDataMD5() throws NoSuchAlgorithmException { ShareFileCreateOptions options = new ShareFileCreateOptions(Constants.KB).setData(DATA.getDefaultBinaryData()); - + primaryFileClient.createWithResponse(options, null, Context.NONE); - + Response response = primaryFileClient.createWithResponse(options, null, Context.NONE); String contentMD5 = response.getRequest().getHeaders().get(HttpHeaderName.CONTENT_MD5).getValue(); byte[] decodedContentMd5 = Base64.getDecoder().decode(contentMD5); - + assertArrayEquals(MessageDigest.getInstance("MD5").digest(DATA.getDefaultText().getBytes()), decodedContentMd5); } - - @RequiredServiceVersion(clazz = BlobServiceVersion.class, min = "2026-02-06") + + @RequiredServiceVersion(clazz = BlobServiceVersion.class, min = "2026-06-06") @Test public void createFileWithLargeBinaryDataPartiallyEmptyMD5() throws NoSuchAlgorithmException { byte[] randomByteArray = getRandomByteArray(Constants.MB * 4); BinaryData data = BinaryData.fromBytes(randomByteArray); - + ShareFileCreateOptions options = new ShareFileCreateOptions(Constants.MB * 5).setData(data); - + Response response = primaryFileClient.createWithResponse(options, null, Context.NONE); String contentMD5 = response.getRequest().getHeaders().get(HttpHeaderName.CONTENT_MD5).getValue(); byte[] decodedContentMd5 = Base64.getDecoder().decode(contentMD5); - + assertArrayEquals(MessageDigest.getInstance("MD5").digest(randomByteArray), decodedContentMd5); - } */ + } } diff --git a/sdk/storage/azure-storage-file-share/src/test/java/com/azure/storage/file/share/FileAsyncApiTests.java b/sdk/storage/azure-storage-file-share/src/test/java/com/azure/storage/file/share/FileAsyncApiTests.java index cdb7af270ad5..18cc3d4924aa 100644 --- a/sdk/storage/azure-storage-file-share/src/test/java/com/azure/storage/file/share/FileAsyncApiTests.java +++ b/sdk/storage/azure-storage-file-share/src/test/java/com/azure/storage/file/share/FileAsyncApiTests.java @@ -4,18 +4,23 @@ package com.azure.storage.file.share; import com.azure.core.exception.UnexpectedLengthException; +import com.azure.core.http.HttpHeader; +import com.azure.core.http.HttpHeaderName; import com.azure.core.http.rest.Response; import com.azure.core.test.TestMode; +import com.azure.core.util.BinaryData; import com.azure.core.util.CoreUtils; import com.azure.core.util.FluxUtil; import com.azure.core.util.polling.LongRunningOperationStatus; import com.azure.core.util.polling.PollerFlux; +import com.azure.storage.blob.BlobServiceVersion; import com.azure.storage.common.StorageSharedKeyCredential; import com.azure.storage.common.implementation.Constants; import com.azure.storage.common.test.shared.extensions.LiveOnly; import com.azure.storage.common.test.shared.extensions.PlaybackOnly; import com.azure.storage.common.test.shared.extensions.RequiredServiceVersion; import com.azure.storage.file.share.implementation.util.ModelHelper; +import com.azure.storage.file.share.models.FilePropertySemantics; import com.azure.storage.file.share.models.ModeCopyMode; import com.azure.storage.file.share.models.NfsFileType; import com.azure.storage.common.test.shared.policy.MockPartialResponsePolicy; @@ -78,11 +83,15 @@ import java.nio.file.FileAlreadyExistsException; import java.nio.file.Files; import java.nio.file.NoSuchFileException; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; import java.time.Duration; import java.time.LocalDateTime; import java.time.OffsetDateTime; import java.time.ZoneOffset; import java.util.ArrayList; +import java.util.Arrays; +import java.util.Base64; import java.util.Collections; import java.util.EnumSet; import java.util.List; @@ -2217,20 +2226,19 @@ public void fileExistsHandlesParentNotFound() { }).verifyComplete(); } - /* PULLED FROM RELEASE - @RequiredServiceVersion(clazz = BlobServiceVersion.class, min = "2026-02-06") + @RequiredServiceVersion(clazz = BlobServiceVersion.class, min = "2026-06-06") @ParameterizedTest @MethodSource("com.azure.storage.file.share.FileShareTestHelper#filePropertySemanticsSupplier") public void createFileFilePropertySemantics(FilePropertySemantics filePropertySemantics) { ShareFileCreateOptions options = new ShareFileCreateOptions(Constants.KB).setFilePropertySemantics(filePropertySemantics); - + // For Create File and Directory with FilePropertySemantics == Restore, // the File Permission property must be provided, otherwise FilePropertySemantics will default to new. if (filePropertySemantics == FilePropertySemantics.RESTORE) { options.setFilePermission(FILE_PERMISSION); } - + StepVerifier.create(primaryFileAsyncClient.createWithResponse(options)).assertNext(r -> { HttpHeader retrievedHeader = r.getRequest().getHeaders().get(X_MS_FILE_PROPERTY_SEMANTICS); if (filePropertySemantics != null) { @@ -2240,34 +2248,34 @@ public void createFileFilePropertySemantics(FilePropertySemantics filePropertySe } }).verifyComplete(); } - - @RequiredServiceVersion(clazz = BlobServiceVersion.class, min = "2026-02-06") + + @RequiredServiceVersion(clazz = BlobServiceVersion.class, min = "2026-06-06") @Test public void createFileWithBinaryData() { ShareFileCreateOptions options = new ShareFileCreateOptions(DATA.getDefaultDataSize()).setData(DATA.getDefaultBinaryData()); - + StepVerifier .create(primaryFileAsyncClient.createWithResponse(options) .then(FluxUtil.collectBytesInByteBufferStream(primaryFileAsyncClient.download()))) .assertNext(bytes -> assertArrayEquals(DATA.getDefaultBytes(), bytes)) .verifyComplete(); } - - @RequiredServiceVersion(clazz = BlobServiceVersion.class, min = "2026-02-06") + + @RequiredServiceVersion(clazz = BlobServiceVersion.class, min = "2026-06-06") @Test public void createFileWithBinaryDataFail() { ShareFileCreateOptions options = new ShareFileCreateOptions(2L).setData(DATA.getDefaultBinaryData()); - + StepVerifier.create(primaryFileAsyncClient.createWithResponse(options)) .verifyError(ShareStorageException.class); } - - @RequiredServiceVersion(clazz = BlobServiceVersion.class, min = "2026-02-06") + + @RequiredServiceVersion(clazz = BlobServiceVersion.class, min = "2026-06-06") @Test public void createFileWithBinaryDataPartiallyEmpty() { ShareFileCreateOptions options = new ShareFileCreateOptions(Constants.KB).setData(DATA.getDefaultBinaryData()); - + StepVerifier .create(primaryFileAsyncClient.createWithResponse(options) .then(FluxUtil.collectBytesInByteBufferStream(primaryFileAsyncClient.download()))) @@ -2277,84 +2285,84 @@ public void createFileWithBinaryDataPartiallyEmpty() { Arrays.copyOfRange(bytes, 0, DATA.getDefaultDataSize()))) .verifyComplete(); } - - @RequiredServiceVersion(clazz = BlobServiceVersion.class, min = "2026-02-06") + + @RequiredServiceVersion(clazz = BlobServiceVersion.class, min = "2026-06-06") @Test public void createFileWithLargeBinaryData() { byte[] randomByteArray = getRandomByteArray(Constants.MB * 4); BinaryData data = BinaryData.fromBytes(randomByteArray); - + ShareFileCreateOptions options = new ShareFileCreateOptions(Constants.MB * 4).setData(data); - + StepVerifier .create(primaryFileAsyncClient.createWithResponse(options) .then(FluxUtil.collectBytesInByteBufferStream(primaryFileAsyncClient.download()))) .assertNext(bytes -> assertArrayEquals(randomByteArray, bytes)) .verifyComplete(); } - - @RequiredServiceVersion(clazz = BlobServiceVersion.class, min = "2026-02-06") + + @RequiredServiceVersion(clazz = BlobServiceVersion.class, min = "2026-06-06") @Test public void createFileWithLargeBinaryDataBackedByFlux() { ByteBuffer randomByteBuffer = getRandomByteBuffer(Constants.MB * 4); - + Mono response = BinaryData.fromFlux(Flux.just(randomByteBuffer), Constants.MB * 4L, false).flatMap(data -> { ShareFileCreateOptions options = new ShareFileCreateOptions(Constants.MB * 4).setData(data); return primaryFileAsyncClient.createWithResponse(options) .then(FluxUtil.collectBytesInByteBufferStream(primaryFileAsyncClient.download())); }); - + StepVerifier.create(response) .assertNext(bytes -> assertArrayEquals(randomByteBuffer.array(), bytes)) .verifyComplete(); } - - @RequiredServiceVersion(clazz = BlobServiceVersion.class, min = "2026-02-06") + + @RequiredServiceVersion(clazz = BlobServiceVersion.class, min = "2026-06-06") @Test public void createFileWithLargeBinaryDataPartiallyEmpty() { byte[] randomByteArray = getRandomByteArray(Constants.MB * 4); BinaryData data = BinaryData.fromBytes(randomByteArray); - + ShareFileCreateOptions options = new ShareFileCreateOptions(Constants.MB * 5).setData(data); - + StepVerifier .create(primaryFileAsyncClient.createWithResponse(options) .then(FluxUtil.collectBytesInByteBufferStream(primaryFileAsyncClient.download()))) .assertNext(bytes -> assertArrayEquals(randomByteArray, Arrays.copyOfRange(bytes, 0, Constants.MB * 4))) .verifyComplete(); } - - @RequiredServiceVersion(clazz = BlobServiceVersion.class, min = "2026-02-06") + + @RequiredServiceVersion(clazz = BlobServiceVersion.class, min = "2026-06-06") @Test public void createFileWithBinaryDataMD5() throws NoSuchAlgorithmException { ShareFileCreateOptions options = new ShareFileCreateOptions(Constants.KB).setData(DATA.getDefaultBinaryData()); - + MessageDigest md5Digest = MessageDigest.getInstance("MD5"); byte[] expectedMd5 = md5Digest.digest(DATA.getDefaultText().getBytes()); - + StepVerifier.create(primaryFileAsyncClient.createWithResponse(options)).assertNext(response -> { String contentMD5 = response.getRequest().getHeaders().get(HttpHeaderName.CONTENT_MD5).getValue(); byte[] decodedContentMd5 = Base64.getDecoder().decode(contentMD5); assertArrayEquals(expectedMd5, decodedContentMd5); }).verifyComplete(); } - - @RequiredServiceVersion(clazz = BlobServiceVersion.class, min = "2026-02-06") + + @RequiredServiceVersion(clazz = BlobServiceVersion.class, min = "2026-06-06") @Test public void createFileWithLargeBinaryDataPartiallyEmptyMD5() throws NoSuchAlgorithmException { byte[] randomByteArray = getRandomByteArray(Constants.MB * 4); BinaryData data = BinaryData.fromBytes(randomByteArray); - + ShareFileCreateOptions options = new ShareFileCreateOptions(Constants.MB * 5).setData(data); - + MessageDigest md5Digest = MessageDigest.getInstance("MD5"); byte[] expectedMd5 = md5Digest.digest(randomByteArray); - + StepVerifier.create(primaryFileAsyncClient.createWithResponse(options)).assertNext(response -> { String contentMD5 = response.getRequest().getHeaders().get(HttpHeaderName.CONTENT_MD5).getValue(); byte[] decodedContentMd5 = Base64.getDecoder().decode(contentMD5); assertArrayEquals(expectedMd5, decodedContentMd5); }).verifyComplete(); - } */ + } }