using Xunit;
namespace XFEExtension.NetCore.AutoConfig.Tests;
public sealed class MessagePackPersistenceTests
{
[Fact]
public async Task LargeObjectRoundTripsThroughBinaryFile()
{
var directory = CreateTestDirectory();
try
{
LargeObjectProfile.Current = new LargeObjectProfile();
LargeObjectProfile.ProfilePath = Path.Combine(directory, nameof(LargeObjectProfile));
var source = CreateLargeDocument(12_000);
LargeObjectProfile.Current.InstanceData = source;
await LargeObjectProfile.SaveProfileAsync();
var profilePath = LargeObjectProfile.ProfilePath + ".mpk";
Assert.True(File.Exists(profilePath));
var persisted = await File.ReadAllBytesAsync(profilePath);
Assert.Equal(LargeObjectProfile.ExportProfileBytes(), persisted);
LargeObjectProfile.Current.InstanceData = new LargeSettingsDocument { Name = "changed" };
LargeObjectProfile.LoadProfile();
Assert.Equal(source.Name, LargeObjectProfile.Data.Name);
Assert.Equal(source.Metadata, LargeObjectProfile.Data.Metadata);
Assert.Equal(source.Items.Count, LargeObjectProfile.Data.Items.Count);
Assert.Equal(source.Items[7_777].Samples, LargeObjectProfile.Data.Items[7_777].Samples);
Assert.Equal(1, LargeObjectProfile.Current.LoadedProfileVersion);
}
finally
{
LargeObjectProfile.DeleteProfile();
DeleteDirectory(directory);
}
}
[Fact]
public void ByteAndBase64ImportExportRoundTripWithoutStreams()
{
var source = CreateLargeDocument(256);
LargeObjectProfile.Current = new LargeObjectProfile { InstanceData = source };
var bytes = LargeObjectProfile.ExportProfileBytes();
LargeObjectProfile.Current.InstanceData = new LargeSettingsDocument();
LargeObjectProfile.ImportProfileBytes(bytes);
Assert.Equal(source.Items.Count, LargeObjectProfile.Data.Items.Count);
var base64 = LargeObjectProfile.ExportProfile();
Assert.Equal(bytes, Convert.FromBase64String(base64));
LargeObjectProfile.Current.InstanceData = new LargeSettingsDocument();
LargeObjectProfile.ImportProfile(base64);
Assert.Equal(source.Items[128].Name, LargeObjectProfile.Data.Items[128].Name);
}
[Fact]
public void MessagePackMigrationRenamesLargeObjectProperty()
{
var source = CreateLargeDocument(64);
UnversionedLargeObjectProfile.Current = new UnversionedLargeObjectProfile { InstanceData = source };
var versionZero = UnversionedLargeObjectProfile.ExportProfileBytes();
MigratingLargeObjectProfile.Current = new MigratingLargeObjectProfile();
MigratingLargeObjectProfile.ImportProfileBytes(versionZero);
Assert.Equal(0, MigratingLargeObjectProfile.Current.LoadedProfileVersion);
Assert.Equal(source.Name, MigratingLargeObjectProfile.CurrentData.Name);
Assert.Equal(source.Items[42].Samples, MigratingLargeObjectProfile.CurrentData.Items[42].Samples);
}
private static LargeSettingsDocument CreateLargeDocument(int count)
{
var document = new LargeSettingsDocument
{
Name = "large-settings",
Metadata = Enumerable.Range(0, 64).ToDictionary(index => $"key-{index}", index => $"value-{index}"),
Items = new List<LargeSettingsItem>(count)
};
for (var index = 0; index < count; index++)
{
document.Items.Add(new LargeSettingsItem
{
Id = index,
Name = $"item-{index}",
Samples = [index * 0.25, index * 0.5, index * 0.75, index]
});
}
return document;
}
private static string CreateTestDirectory()
{
var directory = Path.Combine(Path.GetTempPath(), "XFEAutoConfigTests", Guid.NewGuid().ToString("N"));
Directory.CreateDirectory(directory);
return directory;
}
private static void DeleteDirectory(string directory)
{
if (Directory.Exists(directory))
Directory.Delete(directory, true);
}
}
using Xunit;
namespace XFEExtension.NetCore.AutoConfig.Tests;
public sealed class MessagePackPersistenceTests
{
[Fact]
public async Task LargeObjectRoundTripsThroughBinaryFile()
{
var directory = CreateTestDirectory();
try
{
LargeObjectProfile.Current = new LargeObjectProfile();
LargeObjectProfile.ProfilePath = Path.Combine(directory, nameof(LargeObjectProfile));
var source = CreateLargeDocument(12_000);
LargeObjectProfile.Current.InstanceData = source;
await LargeObjectProfile.SaveProfileAsync();
var profilePath = LargeObjectProfile.ProfilePath + ".mpk";
Assert.True(File.Exists(profilePath));
var persisted = await File.ReadAllBytesAsync(profilePath);
Assert.Equal(LargeObjectProfile.ExportProfileBytes(), persisted);
LargeObjectProfile.Current.InstanceData = new LargeSettingsDocument { Name = "changed" };
LargeObjectProfile.LoadProfile();
Assert.Equal(source.Name, LargeObjectProfile.Data.Name);
Assert.Equal(source.Metadata, LargeObjectProfile.Data.Metadata);
Assert.Equal(source.Items.Count, LargeObjectProfile.Data.Items.Count);
Assert.Equal(source.Items[7_777].Samples, LargeObjectProfile.Data.Items[7_777].Samples);
Assert.Equal(1, LargeObjectProfile.Current.LoadedProfileVersion);
}
finally
{
LargeObjectProfile.DeleteProfile();
DeleteDirectory(directory);
}
}
[Fact]
public void ByteAndBase64ImportExportRoundTripWithoutStreams()
{
var source = CreateLargeDocument(256);
LargeObjectProfile.Current = new LargeObjectProfile { InstanceData = source };
var bytes = LargeObjectProfile.ExportProfileBytes();
LargeObjectProfile.Current.InstanceData = new LargeSettingsDocument();
LargeObjectProfile.ImportProfileBytes(bytes);
Assert.Equal(source.Items.Count, LargeObjectProfile.Data.Items.Count);
var base64 = LargeObjectProfile.ExportProfile();
Assert.Equal(bytes, Convert.FromBase64String(base64));
LargeObjectProfile.Current.InstanceData = new LargeSettingsDocument();
LargeObjectProfile.ImportProfile(base64);
Assert.Equal(source.Items[128].Name, LargeObjectProfile.Data.Items[128].Name);
}
[Fact]
public void MessagePackMigrationRenamesLargeObjectProperty()
{
var source = CreateLargeDocument(64);
UnversionedLargeObjectProfile.Current = new UnversionedLargeObjectProfile { InstanceData = source };
var versionZero = UnversionedLargeObjectProfile.ExportProfileBytes();
MigratingLargeObjectProfile.Current = new MigratingLargeObjectProfile();
MigratingLargeObjectProfile.ImportProfileBytes(versionZero);
Assert.Equal(0, MigratingLargeObjectProfile.Current.LoadedProfileVersion);
Assert.Equal(source.Name, MigratingLargeObjectProfile.CurrentData.Name);
Assert.Equal(source.Items[42].Samples, MigratingLargeObjectProfile.CurrentData.Items[42].Samples);
}
private static LargeSettingsDocument CreateLargeDocument(int count)
{
var document = new LargeSettingsDocument
{
Name = "large-settings",
Metadata = Enumerable.Range(0, 64).ToDictionary(index => $"key-{index}", index => $"value-{index}"),
Items = new List<LargeSettingsItem>(count)
};
for (var index = 0; index < count; index++)
{
document.Items.Add(new LargeSettingsItem
{
Id = index,
Name = $"item-{index}",
Samples = [index * 0.25, index * 0.5, index * 0.75, index]
});
}
return document;
}
private static string CreateTestDirectory()
{
var directory = Path.Combine(Path.GetTempPath(), "XFEAutoConfigTests", Guid.NewGuid().ToString("N"));
Directory.CreateDirectory(directory);
return directory;
}
private static void DeleteDirectory(string directory)
{
if (Directory.Exists(directory))
Directory.Delete(directory, true);
}
}