Skip to content

Commit 1b81fe2

Browse files
authored
initial commit (Azure#50554)
1 parent 393b092 commit 1b81fe2

File tree

3 files changed

+49
-6
lines changed

3 files changed

+49
-6
lines changed

sdk/storage/Azure.Storage.DataMovement.Blobs/src/BlobDestinationCheckpointDetails.cs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -304,7 +304,8 @@ internal static BlobDestinationCheckpointDetails Deserialize(Stream stream)
304304

305305
// Version
306306
int version = reader.ReadInt32();
307-
if (version != DataMovementBlobConstants.DestinationCheckpointDetails.SchemaVersion)
307+
if (version < DataMovementBlobConstants.DestinationCheckpointDetails.MinValidSchemaVersion
308+
|| version > DataMovementBlobConstants.DestinationCheckpointDetails.MaxValidSchemaVersion)
308309
{
309310
throw Errors.UnsupportedJobSchemaVersionHeader(version);
310311
}
@@ -340,9 +341,17 @@ internal static BlobDestinationCheckpointDetails Deserialize(Stream stream)
340341
int cacheControlLength = reader.ReadInt32();
341342

342343
// AccessTier
343-
bool isAccessTierSet = reader.ReadBoolean();
344+
bool isAccessTierSet = default;
345+
if (version >= DataMovementBlobConstants.DestinationCheckpointDetails.SchemaVersion_4)
346+
{
347+
isAccessTierSet = reader.ReadBoolean();
348+
}
344349
AccessTier? accessTier = default;
345350
JobPlanAccessTier jobPlanAccessTier = (JobPlanAccessTier)reader.ReadByte();
351+
if (version < DataMovementBlobConstants.DestinationCheckpointDetails.SchemaVersion_4)
352+
{
353+
isAccessTierSet = !jobPlanAccessTier.Equals(JobPlanAccessTier.None);
354+
}
346355
if (isAccessTierSet)
347356
{
348357
accessTier = new AccessTier(jobPlanAccessTier.ToString());

sdk/storage/Azure.Storage.DataMovement.Blobs/src/DataMovementBlobConstants.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ internal class DestinationCheckpointDetails
2828
internal const int SchemaVersion_3 = 3;
2929
internal const int SchemaVersion_4 = 4;
3030
internal const int SchemaVersion = SchemaVersion_4;
31+
internal const int MinValidSchemaVersion = SchemaVersion_3;
32+
internal const int MaxValidSchemaVersion = SchemaVersion;
3133

3234
internal const int VersionIndex = 0;
3335
internal const int PreserveBlobTypeIndex = VersionIndex + IntSizeInBytes;

sdk/storage/Azure.Storage.DataMovement.Blobs/tests/BlobDestinationCheckpointDetailsTests.cs

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,6 @@ public void Deserialize()
233233
}
234234
}
235235

236-
[Ignore("Renable after implementing backwards compatibility for older versions")]
237236
[Test]
238237
public void Deserialize_File_Version_3()
239238
{
@@ -260,7 +259,7 @@ public void Deserialize_File_Version_4()
260259

261260
private void VerifySampleValues_Version3(BlobDestinationCheckpointDetails data)
262261
{
263-
Assert.AreEqual(3, data.Version);
262+
Assert.AreEqual(4, data.Version);
264263
Assert.IsTrue(data.IsBlobTypeSet);
265264
Assert.AreEqual(DefaultBlobType, data.BlobType);
266265
Assert.AreEqual(true, data.IsContentTypeSet);
@@ -305,9 +304,11 @@ private void VerifySampleValues_Version4(BlobDestinationCheckpointDetails data)
305304
}
306305

307306
[Test]
308-
public void Deserialize_IncorrectSchemaVersion()
307+
[TestCase(1)]
308+
[TestCase(2)]
309+
[TestCase(5)]
310+
public void Deserialize_IncorrectSchemaVersion(int incorrectSchemaVersion)
309311
{
310-
int incorrectSchemaVersion = 1;
311312
BlobDestinationCheckpointDetails data = CreatePreserveValues();
312313
data.Version = incorrectSchemaVersion;
313314

@@ -318,5 +319,36 @@ public void Deserialize_IncorrectSchemaVersion()
318319
() => BlobDestinationCheckpointDetails.Deserialize(dataStream),
319320
new ArgumentException($"The checkpoint file schema version {incorrectSchemaVersion} is not supported by this version of the SDK."));
320321
}
322+
323+
[Test]
324+
public void RoundTrip_Version_4()
325+
{
326+
BlobDestinationCheckpointDetails original = CreateSetSampleValues();
327+
using MemoryStream serialized = new();
328+
original.Serialize(serialized);
329+
serialized.Position = 0;
330+
BlobDestinationCheckpointDetails deserialized = BlobDestinationCheckpointDetails.Deserialize(serialized);
331+
332+
Assert.AreEqual(DataMovementBlobConstants.DestinationCheckpointDetails.SchemaVersion, deserialized.Version);
333+
Assert.AreEqual(original.Version, deserialized.Version);
334+
Assert.AreEqual(original.IsBlobTypeSet, deserialized.IsBlobTypeSet);
335+
Assert.AreEqual(original.BlobType, deserialized.BlobType);
336+
Assert.AreEqual(original.IsContentTypeSet, deserialized.IsContentTypeSet);
337+
Assert.AreEqual(original.ContentTypeBytes, deserialized.ContentTypeBytes);
338+
Assert.AreEqual(original.IsContentEncodingSet, deserialized.IsContentEncodingSet);
339+
Assert.AreEqual(original.ContentEncodingBytes, deserialized.ContentEncodingBytes);
340+
Assert.AreEqual(original.IsContentLanguageSet, deserialized.IsContentLanguageSet);
341+
Assert.AreEqual(original.ContentLanguageBytes, deserialized.ContentLanguageBytes);
342+
Assert.AreEqual(original.IsContentDispositionSet, deserialized.IsContentDispositionSet);
343+
Assert.AreEqual(original.ContentDispositionBytes, deserialized.ContentDispositionBytes);
344+
Assert.AreEqual(original.IsCacheControlSet, deserialized.IsCacheControlSet);
345+
Assert.AreEqual(original.CacheControlBytes, deserialized.CacheControlBytes);
346+
Assert.AreEqual(original.IsAccessTierSet, deserialized.IsAccessTierSet);
347+
Assert.AreEqual(original.AccessTierValue, deserialized.AccessTierValue);
348+
Assert.AreEqual(original.IsMetadataSet, deserialized.IsMetadataSet);
349+
Assert.AreEqual(original.Metadata, deserialized.Metadata);
350+
Assert.AreEqual(original.PreserveTags, deserialized.PreserveTags);
351+
Assert.AreEqual(original.Tags, deserialized.Tags);
352+
}
321353
}
322354
}

0 commit comments

Comments
 (0)