From df67113de662fe3a08f85a6482fca946b552359c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Polykanine?= Date: Thu, 24 Sep 2026 08:44:35 +0200 Subject: [PATCH] Fix flaky storage progress tests, bump AWSSDK.S3 to 4.0.103.4 SSH.NET invokes the upload callback from multiple threads, FluentFTP's Progress posts to the thread pool, and S3 multipart parts upload in parallel, so ProgressChanged can fire concurrently. Concurrent List.Add occasionally left a null slot, failing SftpStorageTests.ProgressChanged_LargeFile_RaisesEvents. Collect events in a ConcurrentQueue instead. Also bump AWSSDK.S3 from 4.0.103.1 to 4.0.103.4 (supersedes #124). --- src/SharpSync/SharpSync.csproj | 2 +- tests/SharpSync.Tests/Storage/FtpStorageTests.cs | 9 +++++---- tests/SharpSync.Tests/Storage/S3StorageTests.cs | 9 +++++---- tests/SharpSync.Tests/Storage/SftpStorageTests.cs | 5 +++-- 4 files changed, 14 insertions(+), 11 deletions(-) diff --git a/src/SharpSync/SharpSync.csproj b/src/SharpSync/SharpSync.csproj index 6e3df75..60b4e95 100644 --- a/src/SharpSync/SharpSync.csproj +++ b/src/SharpSync/SharpSync.csproj @@ -69,7 +69,7 @@ - + diff --git a/tests/SharpSync.Tests/Storage/FtpStorageTests.cs b/tests/SharpSync.Tests/Storage/FtpStorageTests.cs index 5c9a367..01dcebf 100644 --- a/tests/SharpSync.Tests/Storage/FtpStorageTests.cs +++ b/tests/SharpSync.Tests/Storage/FtpStorageTests.cs @@ -1,3 +1,4 @@ +using System.Collections.Concurrent; using Microsoft.Extensions.Logging.Abstractions; using Oire.SharpSync.Tests.Fixtures; @@ -539,8 +540,8 @@ public async Task WriteFileAsync_LargeFile_SupportsProgressReporting() { var content = new byte[15 * 1024 * 1024]; // 15MB (larger than default chunk size) new Random().NextBytes(content); - var progressEvents = new List(); - _storage.ProgressChanged += (sender, args) => progressEvents.Add(args); + var progressEvents = new ConcurrentQueue(); + _storage.ProgressChanged += (sender, args) => progressEvents.Enqueue(args); // Act using var stream = new MemoryStream(content); @@ -566,8 +567,8 @@ public async Task ReadFileAsync_LargeFile_SupportsProgressReporting() { using var writeStream = new MemoryStream(content); await _storage.WriteFileAsync(filePath, writeStream); - var progressEvents = new List(); - _storage.ProgressChanged += (sender, args) => progressEvents.Add(args); + var progressEvents = new ConcurrentQueue(); + _storage.ProgressChanged += (sender, args) => progressEvents.Enqueue(args); // Act using var readStream = await _storage.ReadFileAsync(filePath); diff --git a/tests/SharpSync.Tests/Storage/S3StorageTests.cs b/tests/SharpSync.Tests/Storage/S3StorageTests.cs index 3bfcc0c..2f0ac7e 100644 --- a/tests/SharpSync.Tests/Storage/S3StorageTests.cs +++ b/tests/SharpSync.Tests/Storage/S3StorageTests.cs @@ -1,3 +1,4 @@ +using System.Collections.Concurrent; using Microsoft.Extensions.Logging.Abstractions; using Oire.SharpSync.Tests.Fixtures; @@ -591,8 +592,8 @@ public async Task ProgressChanged_LargeFileUpload_RaisesEvents() { var content = new byte[12 * 1024 * 1024]; new Random().NextBytes(content); - var progressEvents = new List(); - _storage.ProgressChanged += (sender, args) => progressEvents.Add(args); + var progressEvents = new ConcurrentQueue(); + _storage.ProgressChanged += (sender, args) => progressEvents.Enqueue(args); // Act using var stream = new MemoryStream(content); @@ -624,8 +625,8 @@ public async Task ProgressChanged_LargeFileDownload_RaisesEvents() { using var stream = new MemoryStream(content); await _storage.WriteFileAsync(filePath, stream); - var progressEvents = new List(); - _storage.ProgressChanged += (sender, args) => progressEvents.Add(args); + var progressEvents = new ConcurrentQueue(); + _storage.ProgressChanged += (sender, args) => progressEvents.Enqueue(args); // Act using var readStream = await _storage.ReadFileAsync(filePath); diff --git a/tests/SharpSync.Tests/Storage/SftpStorageTests.cs b/tests/SharpSync.Tests/Storage/SftpStorageTests.cs index 87de47f..1f25352 100644 --- a/tests/SharpSync.Tests/Storage/SftpStorageTests.cs +++ b/tests/SharpSync.Tests/Storage/SftpStorageTests.cs @@ -1,3 +1,4 @@ +using System.Collections.Concurrent; using Microsoft.Extensions.Logging.Abstractions; using Oire.SharpSync.Tests.Fixtures; @@ -717,8 +718,8 @@ public async Task ProgressChanged_LargeFile_RaisesEvents() { var largeContent = new byte[15 * 1024 * 1024]; // 15 MB (larger than chunk size) new Random().NextBytes(largeContent); - var progressEvents = new List(); - _storage.ProgressChanged += (sender, args) => progressEvents.Add(args); + var progressEvents = new ConcurrentQueue(); + _storage.ProgressChanged += (sender, args) => progressEvents.Enqueue(args); // Act using var stream = new MemoryStream(largeContent);