Skip to content

Commit 5980a18

Browse files
committed
fix & tests
1 parent 4e6bff1 commit 5980a18

2 files changed

Lines changed: 109 additions & 11 deletions

File tree

src/ByteSync.ServerCommon/Services/SynchronizationService.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,8 @@ public async Task OnDownloadIsFinishedAsync(SharedFileDefinition sharedFileDefin
145145
synchronization.Progress.FinishedActionsCount += 1;
146146
synchronization.Progress.ProcessedVolume += trackingAction.Size ?? 0;
147147
}
148-
synchronization.Progress.ExchangedVolume = sharedFileDefinition.UploadedFileLength;
148+
149+
synchronization.Progress.ExchangedVolume += sharedFileDefinition.UploadedFileLength;
149150

150151
needSendSynchronizationUpdated = CheckSynchronizationIsFinished(synchronization);
151152

@@ -234,7 +235,7 @@ public async Task OnLocalCopyIsDoneAsync(string sessionId, List<string> actionsG
234235

235236
if (!wasTrackingActionFinished && trackingAction.IsFinished)
236237
{
237-
synchronization.Progress.FinishedActionsCount = +1;
238+
synchronization.Progress.FinishedActionsCount += 1;
238239
}
239240

240241
synchronization.Progress.ProcessedVolume += trackingAction.Size ?? 0;
@@ -314,7 +315,7 @@ public async Task OnMemberHasFinished(string sessionId, Client client)
314315
{
315316
if (synchronizationEntity.Progress.Members.Contains(client.ClientInstanceId))
316317
{
317-
synchronizationEntity.Progress.CompletedMembers.Add(client.ClientInstanceId);;
318+
synchronizationEntity.Progress.CompletedMembers.Add(client.ClientInstanceId);
318319

319320
needSendSynchronizationUpdated = CheckSynchronizationIsFinished(synchronizationEntity);
320321

tests/ByteSync.Client.Tests/Services/Sessions/SynchronizationServiceTests.cs

Lines changed: 105 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,14 @@
22
using ByteSync.Business.Sessions;
33
using ByteSync.Common.Business.Sessions;
44
using ByteSync.Common.Business.Sessions.Cloud;
5+
using ByteSync.Common.Business.Synchronizations;
56
using ByteSync.Interfaces.Controls.Communications.Http;
7+
using ByteSync.Interfaces.Controls.Synchronizations;
68
using ByteSync.Interfaces.Controls.TimeTracking;
79
using ByteSync.Interfaces.Factories;
810
using ByteSync.Interfaces.Services.Sessions;
911
using ByteSync.Services.Synchronizations;
12+
using FluentAssertions;
1013
using Microsoft.Extensions.Logging;
1114
using Moq;
1215
using NUnit.Framework;
@@ -22,8 +25,6 @@ public class SynchronizationServiceTests
2225
private Mock<ISynchronizationLooperFactory> _synchronizationLooperFactoryMock;
2326
private Mock<ITimeTrackingCache> _timeTrackingCacheMock;
2427
private Mock<ILogger<SynchronizationService>> _loggerMock;
25-
26-
// private SynchronizationService _synchronizationService;
2728

2829
[SetUp]
2930
public void Setup()
@@ -50,19 +51,115 @@ public async Task AbortSynchronization_CloudSession_AbortsSynchronization()
5051
_sessionServiceMock
5152
.SetupGet(x => x.SessionStatusObservable)
5253
.Returns(sessionStatusObservable);
53-
// _connectionManagerMock
54-
// .Setup(x => x.HubWrapper.RequestAbortSynchronization(cloudSession.SessionId))
55-
// .ReturnsAsync(new SynchronizationAbortRequest());
56-
// _connectionManagerMock.SetupPushHandler();
5754

5855
var synchronizationService = new SynchronizationService(_sessionServiceMock.Object, _sessionMemberServiceMock.Object, _synchronizationApiClientMock.Object,
5956
_synchronizationLooperFactoryMock.Object, _timeTrackingCacheMock.Object, _loggerMock.Object);
6057

6158
// Act
6259
await synchronizationService.AbortSynchronization();
60+
}
61+
62+
[Test]
63+
public void SynchronizationStart_WhenDataTransmitted_ShouldStartSynchronizationLoop()
64+
{
65+
// Arrange
66+
var cloudSession = new CloudSession();
67+
var sessionObservable = new BehaviorSubject<AbstractSession?>(cloudSession);
68+
_sessionServiceMock
69+
.SetupGet(x => x.SessionObservable)
70+
.Returns(sessionObservable);
71+
72+
var sessionStatusObservable = new BehaviorSubject<SessionStatus>(SessionStatus.Preparation);
73+
_sessionServiceMock
74+
.SetupGet(x => x.SessionStatusObservable)
75+
.Returns(sessionStatusObservable);
76+
77+
var mockSynchronizationLooper = new Mock<ISynchronizationLooper>();
78+
_synchronizationLooperFactoryMock
79+
.Setup(x => x.CreateSynchronizationLooper())
80+
.Returns(mockSynchronizationLooper.Object);
81+
82+
var synchronizationService = new SynchronizationService(
83+
_sessionServiceMock.Object,
84+
_sessionMemberServiceMock.Object,
85+
_synchronizationApiClientMock.Object,
86+
_synchronizationLooperFactoryMock.Object,
87+
_timeTrackingCacheMock.Object,
88+
_loggerMock.Object
89+
);
90+
91+
var synchronization = new Synchronization { SessionId = "test-session" };
92+
93+
// Act
94+
synchronizationService.SynchronizationProcessData.SynchronizationStart.OnNext(synchronization);
95+
synchronizationService.SynchronizationProcessData.SynchronizationDataTransmitted.OnNext(true);
96+
97+
// Wait until the asynchronous task can start
98+
Thread.Sleep(100);
99+
100+
// Assert
101+
_synchronizationLooperFactoryMock.Verify(x => x.CreateSynchronizationLooper(), Times.Once);
102+
mockSynchronizationLooper.Verify(x => x.CloudSessionSynchronizationLoop(), Times.Once);
103+
}
104+
105+
[Test]
106+
public async Task SynchronizationStart_WhenDataTransmitted_ShouldRunInSeparateTask()
107+
{
108+
// Arrange
109+
var cloudSession = new CloudSession();
110+
var sessionObservable = new BehaviorSubject<AbstractSession?>(cloudSession);
111+
_sessionServiceMock
112+
.SetupGet(x => x.SessionObservable)
113+
.Returns(sessionObservable);
114+
115+
var sessionStatusObservable = new BehaviorSubject<SessionStatus>(SessionStatus.Preparation);
116+
_sessionServiceMock
117+
.SetupGet(x => x.SessionStatusObservable)
118+
.Returns(sessionStatusObservable);
119+
120+
// Setup un ManualResetEvent pour capturer l'exécution de la méthode
121+
var executionCaptured = new ManualResetEventSlim(false);
122+
var executionThreadId = 0;
123+
124+
var mockSynchronizationLooper = new Mock<ISynchronizationLooper>();
125+
mockSynchronizationLooper
126+
.Setup(x => x.CloudSessionSynchronizationLoop())
127+
.Callback(() => {
128+
executionThreadId = Environment.CurrentManagedThreadId;
129+
executionCaptured.Set();
130+
});
131+
132+
_synchronizationLooperFactoryMock
133+
.Setup(x => x.CreateSynchronizationLooper())
134+
.Returns(mockSynchronizationLooper.Object);
135+
136+
var synchronizationService = new SynchronizationService(
137+
_sessionServiceMock.Object,
138+
_sessionMemberServiceMock.Object,
139+
_synchronizationApiClientMock.Object,
140+
_synchronizationLooperFactoryMock.Object,
141+
_timeTrackingCacheMock.Object,
142+
_loggerMock.Object
143+
);
144+
145+
var synchronization = new Synchronization { SessionId = "test-session" };
146+
var currentThreadId = Environment.CurrentManagedThreadId;
147+
148+
// Act
149+
synchronizationService.SynchronizationProcessData.SynchronizationStart.OnNext(synchronization);
150+
synchronizationService.SynchronizationProcessData.SynchronizationDataTransmitted.OnNext(true);
151+
152+
// Attendre l'exécution avec timeout
153+
var executed = executionCaptured.Wait(TimeSpan.FromSeconds(1));
63154

64155
// Assert
65-
// _connectionManagerMock.Verify(x => x.HubWrapper.RequestAbortSynchronization(cloudSession.SessionId), Times.Once);
66-
// _connectionManagerMock.Verify();
156+
executed.Should().BeTrue();
157+
currentThreadId.Should().NotBe(executionThreadId);
158+
// Assert.IsTrue(executed, "La méthode CloudSessionSynchronizationLoop n'a pas été exécutée");
159+
// Assert.AreNotEqual(currentThreadId, executionThreadId,
160+
// "La méthode CloudSessionSynchronizationLoop a été exécutée sur le même thread, elle devrait être dans un Task séparé");
161+
162+
_synchronizationLooperFactoryMock.Verify(x => x.CreateSynchronizationLooper(), Times.Once);
163+
mockSynchronizationLooper.Verify(x => x.CloudSessionSynchronizationLoop(), Times.Once);
67164
}
68165
}

0 commit comments

Comments
 (0)