Skip to content

Commit cf6ef5f

Browse files
Add structured message decoder support to ADLS and File Share services with comprehensive integration tests
Co-authored-by: gunjansingh-msft <[email protected]>
1 parent 1f6a04d commit cf6ef5f

File tree

3 files changed

+191
-0
lines changed

3 files changed

+191
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,147 @@
1+
// Copyright (c) Microsoft Corporation. All rights reserved.
2+
// Licensed under the MIT License.
3+
4+
package com.azure.storage.common.implementation.contentvalidation;
5+
6+
import com.azure.storage.blob.options.BlobDownloadToFileOptions;
7+
import com.azure.storage.blob.options.BlobInputStreamOptions;
8+
import com.azure.storage.blob.options.BlobSeekableByteChannelReadOptions;
9+
import com.azure.storage.file.datalake.options.ReadToFileOptions;
10+
import com.azure.storage.file.share.options.ShareFileDownloadOptions;
11+
import org.junit.jupiter.api.Test;
12+
13+
import static org.junit.jupiter.api.Assertions.*;
14+
15+
/**
16+
* Integration tests for structured message content validation across all storage services.
17+
*/
18+
public class ContentValidationIntegrationTests {
19+
20+
@Test
21+
public void testDownloadContentValidationOptionsAcrossServices() {
22+
// Create validation options
23+
DownloadContentValidationOptions validationOptions = new DownloadContentValidationOptions()
24+
.setStructuredMessageValidationEnabled(true)
25+
.setMd5ValidationEnabled(false);
26+
27+
// Test Blob Storage integration
28+
testBlobStorageIntegration(validationOptions);
29+
30+
// Test Data Lake integration
31+
testDataLakeIntegration(validationOptions);
32+
33+
// Test File Share integration
34+
testFileShareIntegration(validationOptions);
35+
}
36+
37+
private void testBlobStorageIntegration(DownloadContentValidationOptions validationOptions) {
38+
// Test BlobDownloadToFileOptions
39+
BlobDownloadToFileOptions blobDownloadOptions = new BlobDownloadToFileOptions("/tmp/test.txt")
40+
.setContentValidationOptions(validationOptions);
41+
42+
assertNotNull(blobDownloadOptions.getContentValidationOptions());
43+
assertTrue(blobDownloadOptions.getContentValidationOptions().isStructuredMessageValidationEnabled());
44+
assertFalse(blobDownloadOptions.getContentValidationOptions().isMd5ValidationEnabled());
45+
46+
// Test BlobInputStreamOptions
47+
BlobInputStreamOptions inputStreamOptions = new BlobInputStreamOptions()
48+
.setContentValidationOptions(validationOptions);
49+
50+
assertNotNull(inputStreamOptions.getContentValidationOptions());
51+
assertTrue(inputStreamOptions.getContentValidationOptions().isStructuredMessageValidationEnabled());
52+
53+
// Test BlobSeekableByteChannelReadOptions
54+
BlobSeekableByteChannelReadOptions seekableOptions = new BlobSeekableByteChannelReadOptions()
55+
.setContentValidationOptions(validationOptions);
56+
57+
assertNotNull(seekableOptions.getContentValidationOptions());
58+
assertTrue(seekableOptions.getContentValidationOptions().isStructuredMessageValidationEnabled());
59+
}
60+
61+
private void testDataLakeIntegration(DownloadContentValidationOptions validationOptions) {
62+
// Test ReadToFileOptions for Data Lake
63+
ReadToFileOptions dataLakeOptions = new ReadToFileOptions("/tmp/datalake-test.txt")
64+
.setContentValidationOptions(validationOptions);
65+
66+
assertNotNull(dataLakeOptions.getContentValidationOptions());
67+
assertTrue(dataLakeOptions.getContentValidationOptions().isStructuredMessageValidationEnabled());
68+
assertFalse(dataLakeOptions.getContentValidationOptions().isMd5ValidationEnabled());
69+
}
70+
71+
private void testFileShareIntegration(DownloadContentValidationOptions validationOptions) {
72+
// Test ShareFileDownloadOptions
73+
ShareFileDownloadOptions shareOptions = new ShareFileDownloadOptions()
74+
.setContentValidationOptions(validationOptions);
75+
76+
assertNotNull(shareOptions.getContentValidationOptions());
77+
assertTrue(shareOptions.getContentValidationOptions().isStructuredMessageValidationEnabled());
78+
assertFalse(shareOptions.getContentValidationOptions().isMd5ValidationEnabled());
79+
}
80+
81+
@Test
82+
public void testMixedValidationOptions() {
83+
// Test mixed validation options across services
84+
DownloadContentValidationOptions mixedOptions = new DownloadContentValidationOptions()
85+
.setStructuredMessageValidationEnabled(true)
86+
.setMd5ValidationEnabled(true);
87+
88+
// Blob Storage with mixed options
89+
BlobDownloadToFileOptions blobOptions = new BlobDownloadToFileOptions("/tmp/mixed-test.txt")
90+
.setContentValidationOptions(mixedOptions);
91+
92+
assertTrue(blobOptions.getContentValidationOptions().isStructuredMessageValidationEnabled());
93+
assertTrue(blobOptions.getContentValidationOptions().isMd5ValidationEnabled());
94+
95+
// Data Lake with mixed options
96+
ReadToFileOptions dataLakeOptions = new ReadToFileOptions("/tmp/mixed-datalake.txt")
97+
.setContentValidationOptions(mixedOptions);
98+
99+
assertTrue(dataLakeOptions.getContentValidationOptions().isStructuredMessageValidationEnabled());
100+
assertTrue(dataLakeOptions.getContentValidationOptions().isMd5ValidationEnabled());
101+
102+
// File Share with mixed options
103+
ShareFileDownloadOptions shareOptions = new ShareFileDownloadOptions()
104+
.setContentValidationOptions(mixedOptions);
105+
106+
assertTrue(shareOptions.getContentValidationOptions().isStructuredMessageValidationEnabled());
107+
assertTrue(shareOptions.getContentValidationOptions().isMd5ValidationEnabled());
108+
}
109+
110+
@Test
111+
public void testFluentInterfaceConsistency() {
112+
// Test that all options classes follow consistent fluent interface patterns
113+
DownloadContentValidationOptions validationOptions = new DownloadContentValidationOptions()
114+
.setStructuredMessageValidationEnabled(true);
115+
116+
// All setContentValidationOptions methods should return the same instance (fluent interface)
117+
BlobDownloadToFileOptions blobOptions = new BlobDownloadToFileOptions("/tmp/fluent-test.txt");
118+
BlobDownloadToFileOptions returnedBlobOptions = blobOptions.setContentValidationOptions(validationOptions);
119+
assertSame(blobOptions, returnedBlobOptions);
120+
121+
BlobInputStreamOptions inputStreamOptions = new BlobInputStreamOptions();
122+
BlobInputStreamOptions returnedInputStreamOptions = inputStreamOptions.setContentValidationOptions(validationOptions);
123+
assertSame(inputStreamOptions, returnedInputStreamOptions);
124+
125+
BlobSeekableByteChannelReadOptions seekableOptions = new BlobSeekableByteChannelReadOptions();
126+
BlobSeekableByteChannelReadOptions returnedSeekableOptions = seekableOptions.setContentValidationOptions(validationOptions);
127+
assertSame(seekableOptions, returnedSeekableOptions);
128+
129+
ReadToFileOptions dataLakeOptions = new ReadToFileOptions("/tmp/fluent-datalake.txt");
130+
ReadToFileOptions returnedDataLakeOptions = dataLakeOptions.setContentValidationOptions(validationOptions);
131+
assertSame(dataLakeOptions, returnedDataLakeOptions);
132+
133+
ShareFileDownloadOptions shareOptions = new ShareFileDownloadOptions();
134+
ShareFileDownloadOptions returnedShareOptions = shareOptions.setContentValidationOptions(validationOptions);
135+
assertSame(shareOptions, returnedShareOptions);
136+
}
137+
138+
@Test
139+
public void testDefaultValues() {
140+
// Test that default values are consistently null across all option classes
141+
assertNull(new BlobDownloadToFileOptions("/tmp/test.txt").getContentValidationOptions());
142+
assertNull(new BlobInputStreamOptions().getContentValidationOptions());
143+
assertNull(new BlobSeekableByteChannelReadOptions().getContentValidationOptions());
144+
assertNull(new ReadToFileOptions("/tmp/test.txt").getContentValidationOptions());
145+
assertNull(new ShareFileDownloadOptions().getContentValidationOptions());
146+
}
147+
}

sdk/storage/azure-storage-file-datalake/src/main/java/com/azure/storage/file/datalake/options/ReadToFileOptions.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
import com.azure.storage.common.ParallelTransferOptions;
77
import com.azure.storage.common.implementation.StorageImplUtils;
8+
import com.azure.storage.common.implementation.contentvalidation.DownloadContentValidationOptions;
89
import com.azure.storage.file.datalake.DataLakeFileClient;
910
import com.azure.storage.file.datalake.models.DataLakeRequestConditions;
1011
import com.azure.storage.file.datalake.models.DownloadRetryOptions;
@@ -26,6 +27,7 @@ public class ReadToFileOptions {
2627
private Boolean rangeGetContentMd5;
2728
private Set<OpenOption> openOptions;
2829
private Boolean userPrincipalName;
30+
private DownloadContentValidationOptions contentValidationOptions;
2931

3032
/**
3133
* Constructs a {@link ReadToFileOptions}.
@@ -191,4 +193,24 @@ public ReadToFileOptions setUserPrincipalName(Boolean userPrincipalName) {
191193
this.userPrincipalName = userPrincipalName;
192194
return this;
193195
}
196+
197+
/**
198+
* Gets the {@link DownloadContentValidationOptions}.
199+
*
200+
* @return {@link DownloadContentValidationOptions}
201+
*/
202+
public DownloadContentValidationOptions getContentValidationOptions() {
203+
return contentValidationOptions;
204+
}
205+
206+
/**
207+
* Sets the {@link DownloadContentValidationOptions}.
208+
*
209+
* @param contentValidationOptions {@link DownloadContentValidationOptions}
210+
* @return The updated options.
211+
*/
212+
public ReadToFileOptions setContentValidationOptions(DownloadContentValidationOptions contentValidationOptions) {
213+
this.contentValidationOptions = contentValidationOptions;
214+
return this;
215+
}
194216
}

sdk/storage/azure-storage-file-share/src/main/java/com/azure/storage/file/share/options/ShareFileDownloadOptions.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import com.azure.storage.file.share.models.DownloadRetryOptions;
88
import com.azure.storage.file.share.models.ShareFileRange;
99
import com.azure.storage.file.share.models.ShareRequestConditions;
10+
import com.azure.storage.common.implementation.contentvalidation.DownloadContentValidationOptions;
1011

1112
/**
1213
* Extended options that may be passed when downloading a File.
@@ -17,6 +18,7 @@ public final class ShareFileDownloadOptions {
1718
private Boolean rangeContentMd5Requested;
1819
private ShareRequestConditions requestConditions;
1920
private DownloadRetryOptions retryOptions;
21+
private DownloadContentValidationOptions contentValidationOptions;
2022

2123
/**
2224
* Creates a new instance of {@link ShareFileDownloadOptions}.
@@ -103,4 +105,24 @@ public ShareFileDownloadOptions setRetryOptions(DownloadRetryOptions retryOption
103105
this.retryOptions = retryOptions;
104106
return this;
105107
}
108+
109+
/**
110+
* Gets the {@link DownloadContentValidationOptions}.
111+
*
112+
* @return {@link DownloadContentValidationOptions}
113+
*/
114+
public DownloadContentValidationOptions getContentValidationOptions() {
115+
return contentValidationOptions;
116+
}
117+
118+
/**
119+
* Sets the {@link DownloadContentValidationOptions}.
120+
*
121+
* @param contentValidationOptions {@link DownloadContentValidationOptions}
122+
* @return The updated options.
123+
*/
124+
public ShareFileDownloadOptions setContentValidationOptions(DownloadContentValidationOptions contentValidationOptions) {
125+
this.contentValidationOptions = contentValidationOptions;
126+
return this;
127+
}
106128
}

0 commit comments

Comments
 (0)