From ebced41152bca2b2c7d86409b9845e2a911712ad Mon Sep 17 00:00:00 2001 From: Paulo Santos Date: Sun, 17 May 2026 12:37:12 -0300 Subject: [PATCH] fix(mail): avoid zip temp collisions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ● Generate unique compressed attachment zip names for concurrent runs. ● Add regression coverage for repeated mail compression operations. --- .../Unit/Mail/EmailAttachmentHandlerTests.cs | 28 ++++++++++++++++++- Toolkit.Modern/Mail/EmailAttachmentHandler.cs | 4 +-- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/Toolkit.Modern.Tests/Unit/Mail/EmailAttachmentHandlerTests.cs b/Toolkit.Modern.Tests/Unit/Mail/EmailAttachmentHandlerTests.cs index 60e33c4..d69ea3b 100644 --- a/Toolkit.Modern.Tests/Unit/Mail/EmailAttachmentHandlerTests.cs +++ b/Toolkit.Modern.Tests/Unit/Mail/EmailAttachmentHandlerTests.cs @@ -334,6 +334,32 @@ public void ProcessAttachments_CompressionWithFileNameMap_ShouldUseCustomNames() email.Dispose(); } + /// + /// Verifies that repeated compression operations create distinct temporary attachment names. + /// + /// + /// Guards against timestamp-only temporary zip names colliding during parallel test or application runs. + /// + [TestMethod] + public void ProcessAttachments_RepeatedCompression_ShouldUseUniqueZipNames() + { + // Arrange + var files = new List { _testFiles[2] }; + var zipNames = new HashSet(StringComparer.OrdinalIgnoreCase); + + // Act + for (var i = 0; i < 3; i++) + { + using var email = CreateTestEmail(); + var result = _handler.ProcessAttachments(email, files, [], true); + + // Assert + result.Success.Should().BeTrue($"compression pass {i} should succeed"); + email.Attachments.Should().ContainSingle("each compression pass should produce one zip"); + zipNames.Add(email.Attachments[0].Name).Should().BeTrue("each compressed attachment should use a unique zip name"); + } + } + #endregion #region ProcessAttachments Method Tests - Large File Compression @@ -620,4 +646,4 @@ public void ProcessAttachments_FileSizeFormatting_ShouldDisplayCorrectly() #endregion } -} \ No newline at end of file +} diff --git a/Toolkit.Modern/Mail/EmailAttachmentHandler.cs b/Toolkit.Modern/Mail/EmailAttachmentHandler.cs index 0b870ec..ea84e0a 100644 --- a/Toolkit.Modern/Mail/EmailAttachmentHandler.cs +++ b/Toolkit.Modern/Mail/EmailAttachmentHandler.cs @@ -82,8 +82,8 @@ public AttachmentProcessResult ProcessAttachments(MailMessage email, List