From dd79a831c4af01f52a0c1d3c34dcade0a1b5e28c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20S=C3=A1nchez=20L=C3=B3pez?= <1175054+carlossanlop@users.noreply.github.com> Date: Sun, 16 Jul 2023 22:01:14 -0700 Subject: [PATCH] Add System.IO.Packaging test that checks with reflection that the ZipArchiveEntry general purpose bit flag unicode value is unset. --- .../tests/ReflectionTests.cs | 53 +++++++++++++++++++ .../tests/System.IO.Packaging.Tests.csproj | 3 ++ .../System.IO.Packaging/tests/Tests.cs | 4 +- 3 files changed, 58 insertions(+), 2 deletions(-) create mode 100644 src/libraries/System.IO.Packaging/tests/ReflectionTests.cs diff --git a/src/libraries/System.IO.Packaging/tests/ReflectionTests.cs b/src/libraries/System.IO.Packaging/tests/ReflectionTests.cs new file mode 100644 index 00000000000000..78f080aa6ce782 --- /dev/null +++ b/src/libraries/System.IO.Packaging/tests/ReflectionTests.cs @@ -0,0 +1,53 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.IO.Compression; +using System.Reflection; +using Xunit; + +namespace System.IO.Packaging.Tests; + +public class ReflectionTests +{ + [Fact] + public void Verify_GeneralPurposeBitFlag_NotSetTo_Unicode() + { + using MemoryStream ms = new(); + + using (ZipPackage package = (ZipPackage)Package.Open(ms, FileMode.Create, FileAccess.Write)) + { + Uri uri = PackUriHelper.CreatePartUri(new Uri("document.xml", UriKind.Relative)); + ZipPackagePart part = (ZipPackagePart)package.CreatePart(uri, Tests.Mime_MediaTypeNames_Text_Xml, CompressionOption.NotCompressed); + using (Stream partStream = part.GetStream()) + { + using StreamWriter sw = new(partStream); + sw.Write(Tests.s_DocumentXml); + } + package.CreateRelationship(part.Uri, TargetMode.Internal, "http://packageRelType", "rId1234"); + } + + ms.Position = 0; + using (ZipArchive archive = new ZipArchive(ms, ZipArchiveMode.Read, leaveOpen: false)) + { + foreach (ZipArchiveEntry entry in archive.Entries) + { + FieldInfo fieldInfo = typeof(ZipArchiveEntry).GetField("_generalPurposeBitFlag", BindingFlags.Instance | BindingFlags.NonPublic); + object fieldObject = fieldInfo.GetValue(entry); + ushort shortField = (ushort)fieldObject; + Assert.Equal(0, shortField); // If it was UTF8, we would set the general purpose bit flag to 0x800 (UnicodeFileNameAndComment) + CheckCharacters(entry.Name); + CheckCharacters(entry.Comment); // Unavailable in .NET Framework + } + } + + void CheckCharacters(string value) + { + for (int i = 0; i < value.Length; i++) + { + char c = value[i]; + Assert.True(c >= 32 && c <= 126, $"ZipArchiveEntry name character {c} requires UTF8"); + } + } + } + +} diff --git a/src/libraries/System.IO.Packaging/tests/System.IO.Packaging.Tests.csproj b/src/libraries/System.IO.Packaging/tests/System.IO.Packaging.Tests.csproj index e5e599929b309e..78bc14a789b086 100644 --- a/src/libraries/System.IO.Packaging/tests/System.IO.Packaging.Tests.csproj +++ b/src/libraries/System.IO.Packaging/tests/System.IO.Packaging.Tests.csproj @@ -5,6 +5,9 @@ + + + diff --git a/src/libraries/System.IO.Packaging/tests/Tests.cs b/src/libraries/System.IO.Packaging/tests/Tests.cs index 82e36f4d87d809..4d547db5e1c199 100644 --- a/src/libraries/System.IO.Packaging/tests/Tests.cs +++ b/src/libraries/System.IO.Packaging/tests/Tests.cs @@ -12,9 +12,9 @@ namespace System.IO.Packaging.Tests { public class Tests : FileCleanupTestBase { - private const string Mime_MediaTypeNames_Text_Xml = "text/xml"; + internal const string Mime_MediaTypeNames_Text_Xml = "text/xml"; private const string Mime_MediaTypeNames_Image_Jpeg = "image/jpeg"; // System.Net.Mime.MediaTypeNames.Image.Jpeg - private const string s_DocumentXml = @"Test"; + internal const string s_DocumentXml = @"Test"; private const string s_ResourceXml = @"Test"; private FileInfo GetTempFileInfoFromExistingFile(string existingFileName, [CallerMemberName] string memberName = null, [CallerLineNumber] int lineNumber = 0)