public void ReadAndWriteMultipleGlobalExtendedAttributesEntries(TarEntryFormat format) { Dictionary <string, string> attrs = new Dictionary <string, string>() { { "hello", "world" }, { "dotnet", "runtime" } }; using MemoryStream archiveStream = new MemoryStream(); using (TarWriter writer = new TarWriter(archiveStream, leaveOpen: true)) { PaxGlobalExtendedAttributesTarEntry gea1 = new PaxGlobalExtendedAttributesTarEntry(attrs); writer.WriteEntry(gea1); TarEntry entry1 = InvokeTarEntryCreationConstructor(format, TarEntryType.Directory, "dir1"); writer.WriteEntry(entry1); PaxGlobalExtendedAttributesTarEntry gea2 = new PaxGlobalExtendedAttributesTarEntry(attrs); writer.WriteEntry(gea2); TarEntry entry2 = InvokeTarEntryCreationConstructor(format, TarEntryType.Directory, "dir2"); writer.WriteEntry(entry2); } archiveStream.Position = 0; using (TarReader reader = new TarReader(archiveStream, leaveOpen: false)) { VerifyGlobalExtendedAttributesEntry(reader.GetNextEntry(), attrs); VerifyDirectory(reader.GetNextEntry(), format, "dir1"); VerifyGlobalExtendedAttributesEntry(reader.GetNextEntry(), attrs); VerifyDirectory(reader.GetNextEntry(), format, "dir2"); Assert.Null(reader.GetNextEntry()); } }
public async Task Add_Empty_GlobalExtendedAttributes_Async() { using MemoryStream archive = new MemoryStream(); TarWriter writer = new TarWriter(archive, leaveOpen: true); await using (writer) { PaxGlobalExtendedAttributesTarEntry gea = new PaxGlobalExtendedAttributesTarEntry(new Dictionary <string, string>()); await writer.WriteEntryAsync(gea); } archive.Seek(0, SeekOrigin.Begin); TarReader reader = new TarReader(archive); await using (reader) { PaxGlobalExtendedAttributesTarEntry gea = await reader.GetNextEntryAsync() as PaxGlobalExtendedAttributesTarEntry; Assert.NotNull(gea); Assert.Equal(TarEntryFormat.Pax, gea.Format); Assert.Equal(TarEntryType.GlobalExtendedAttributes, gea.EntryType); Assert.Equal(0, gea.GlobalExtendedAttributes.Count); Assert.Null(await reader.GetNextEntryAsync()); } }
protected void VerifyGlobalExtendedAttributesEntry(TarEntry entry, Dictionary <string, string> attrs) { PaxGlobalExtendedAttributesTarEntry gea = entry as PaxGlobalExtendedAttributesTarEntry; Assert.NotNull(gea); Assert.Equal(attrs.Count, gea.GlobalExtendedAttributes.Count); foreach ((string key, string value) in attrs) { Assert.Contains(key, gea.GlobalExtendedAttributes); Assert.Equal(value, gea.GlobalExtendedAttributes[key]); } }
private void VerifyGlobalExtendedAttributes(TarEntry entry) { Assert.NotNull(entry); Assert.Equal(TarEntryType.GlobalExtendedAttributes, entry.EntryType); Assert.Equal(TarEntryFormat.Pax, entry.Format); VerifyType(entry, TarEntryFormat.Pax, isGea: true); PaxGlobalExtendedAttributesTarEntry gea = entry as PaxGlobalExtendedAttributesTarEntry; // Format: %d/GlobalHead.%p.%n, where: // - %d is the tmp path (platform dependent, and if too long, gets truncated to just '/tmp') // - %p is current process ID // - %n is the sequence number, which is always 1 for the first entry of the asset archive files Assert.Matches(@".+\/GlobalHead\.\d+\.1", gea.Name); Assert.True(gea.GlobalExtendedAttributes.Any()); Assert.Contains(AssetPaxGeaKey, gea.GlobalExtendedAttributes); Assert.Equal(AssetPaxGeaValue, gea.GlobalExtendedAttributes[AssetPaxGeaKey]); }
public void ExtractGlobalExtendedAttributesEntry_Throws() { using TempDirectory root = new TempDirectory(); using MemoryStream archiveStream = new MemoryStream(); using (TarWriter writer = new TarWriter(archiveStream, leaveOpen: true)) { PaxGlobalExtendedAttributesTarEntry gea = new PaxGlobalExtendedAttributesTarEntry(new Dictionary <string, string>()); writer.WriteEntry(gea); } archiveStream.Position = 0; using (TarReader reader = new TarReader(archiveStream, leaveOpen: false)) { TarEntry entry = reader.GetNextEntry(); Assert.Throws <InvalidOperationException>(() => entry.ExtractToFile(Path.Join(root.Path, "file"), overwrite: true)); } }