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(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); } }