Skip to content

Commit fdb2d9b

Browse files
authored
Fail test if all attempts failed + output AggregateException + refactor Send_silent_message to Task/Async (#128)
* Fail test if all attempts failed + output AggregateException + refactor Send_silent_message to Task/Async * Increate number of attempts and increase delay every failed attempt
1 parent 2af5573 commit fdb2d9b

4 files changed

Lines changed: 64 additions & 45 deletions

File tree

Assets/Plugins/StreamChat/Tests/LowLevelClient/Integration/BaseIntegrationTests.cs

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using System;
33
using System.Collections;
44
using System.Collections.Generic;
5+
using System.Linq;
56
using System.Text;
67
using System.Threading.Tasks;
78
using NUnit.Framework;
@@ -49,10 +50,10 @@ public async void OneTimeTearDown()
4950

5051
protected static IEnumerator ReconnectClient() => StreamTestClients.Instance.ReconnectLowLevelClientClient();
5152

52-
protected IEnumerator RunTest(Func<Task> task)
53+
protected static IEnumerator ConnectAndExecute(Func<Task> task)
5354
{
5455
yield return LowLevelClient.WaitForClientToConnect();
55-
yield return task().RunAsIEnumerator();
56+
yield return ExecuteAsync(task).RunAsIEnumerator();
5657
}
5758

5859
/// <summary>
@@ -252,6 +253,41 @@ await LowLevelClient.ChannelApi.DeleteChannelsAsync(new DeleteChannelsRequest
252253

253254
_tempChannelsCidsToDelete.Clear();
254255
}
256+
257+
private static async Task ExecuteAsync(Func<Task> test)
258+
{
259+
const int maxAttempts = 7;
260+
var currentAttempt = 0;
261+
var completed = false;
262+
var exceptions = new List<Exception>();
263+
while (maxAttempts > currentAttempt)
264+
{
265+
currentAttempt++;
266+
try
267+
{
268+
await test();
269+
completed = true;
270+
break;
271+
}
272+
catch (StreamApiException e)
273+
{
274+
exceptions.Add(e);
275+
if (e.IsRateLimitExceededError())
276+
{
277+
var seconds = (int)Math.Max(1, Math.Min(60, Math.Pow(2, currentAttempt)));
278+
await Task.Delay(1000 * seconds);
279+
continue;
280+
}
281+
282+
throw;
283+
}
284+
}
285+
286+
if (!completed)
287+
{
288+
throw new AggregateException($"Failed all attempts. Last Exception: {exceptions.Last().Message} ", exceptions);
289+
}
290+
}
255291
}
256292
}
257293
#endif

Assets/Plugins/StreamChat/Tests/LowLevelClient/Integration/ChannelApiIntegrationTests.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -268,7 +268,7 @@ var updateChannelTask
268268
//[UnityTest] StreamTodo: re-enable this test once Watchers issue is resolved
269269
public IEnumerator When_start_watching_a_channel_expect_user_included_in_watchers()
270270
{
271-
yield return RunTest(When_start_watching_a_channel_expect_user_included_in_watchers_Async);
271+
yield return ConnectAndExecute(When_start_watching_a_channel_expect_user_included_in_watchers_Async);
272272
}
273273

274274
private async Task When_start_watching_a_channel_expect_user_included_in_watchers_Async()
@@ -848,8 +848,7 @@ public IEnumerator Mark_many_read_with_specified_message_id()
848848
[UnityTest]
849849
public IEnumerator When_sending_typing_start_stop_events_expect_no_errors()
850850
{
851-
yield return LowLevelClient.WaitForClientToConnect();
852-
yield return When_sending_typing_start_stop_events_expect_no_exceptions_Async().RunAsIEnumerator();
851+
yield return ConnectAndExecute(When_sending_typing_start_stop_events_expect_no_exceptions_Async);
853852
}
854853

855854
private async Task When_sending_typing_start_stop_events_expect_no_exceptions_Async()

Assets/Plugins/StreamChat/Tests/LowLevelClient/Integration/MessagesApiIntegrationTests.cs

Lines changed: 11 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ public IEnumerator Update_message()
9898
//[UnityTest] //StreamTodo: debug, works when triggered manually but fails in GitHub Actions
9999
public IEnumerator Send_message_with_url()
100100
{
101-
yield return RunTest(Send_message_with_url_Async);
101+
yield return ConnectAndExecute(Send_message_with_url_Async);
102102
}
103103

104104
private async Task Send_message_with_url_Async()
@@ -137,38 +137,18 @@ private async Task Send_message_with_url_Async()
137137
}
138138

139139
[UnityTest]
140-
public IEnumerator Send_silent_message()
140+
public IEnumerator When_sending_silent_message_expect_message_received_in_channel()
141+
{
142+
yield return ConnectAndExecute(When_sending_silent_message_expect_message_received_in_channel_Async);
143+
}
144+
145+
private async Task When_sending_silent_message_expect_message_received_in_channel_Async()
141146
{
142-
yield return LowLevelClient.WaitForClientToConnect();
143-
144147
const string channelType = "messaging";
145148

146-
ChannelState channelState = null;
147-
yield return CreateTempUniqueChannel(channelType, new ChannelGetOrCreateRequest(),
148-
state => channelState = state);
149+
var channelState = await CreateTempUniqueChannelAsync(channelType, new ChannelGetOrCreateRequest());
149150
var channelId = channelState.Channel.Id;
150151

151-
var sendMessageRequest = new SendMessageRequest
152-
{
153-
Message = new MessageRequest
154-
{
155-
Text = "Regular message"
156-
}
157-
};
158-
159-
var messageResponseTask = LowLevelClient.MessageApi.SendNewMessageAsync(channelType, channelId, sendMessageRequest);
160-
161-
yield return messageResponseTask.RunAsIEnumerator();
162-
163-
var createChannelTask2 = LowLevelClient.ChannelApi.GetOrCreateChannelAsync(channelType, channelId,
164-
new ChannelGetOrCreateRequest
165-
{
166-
Watch = true,
167-
State = true,
168-
});
169-
170-
yield return createChannelTask2.RunAsIEnumerator();
171-
172152
var sendSilentMessageRequest = new SendMessageRequest
173153
{
174154
Message = new MessageRequest
@@ -178,21 +158,15 @@ public IEnumerator Send_silent_message()
178158
}
179159
};
180160

181-
var silentMessageResponseTask =
182-
LowLevelClient.MessageApi.SendNewMessageAsync(channelType, channelId, sendSilentMessageRequest);
161+
await LowLevelClient.MessageApi.SendNewMessageAsync(channelType, channelId, sendSilentMessageRequest);
183162

184-
yield return silentMessageResponseTask.RunAsIEnumerator();
185-
186-
var createChannelTask3 = LowLevelClient.ChannelApi.GetOrCreateChannelAsync(channelType, channelId,
163+
var channelState2 = await LowLevelClient.ChannelApi.GetOrCreateChannelAsync(channelType, channelId,
187164
new ChannelGetOrCreateRequest
188165
{
189166
State = true,
190167
});
191168

192-
yield return createChannelTask3.RunAsIEnumerator(response =>
193-
{
194-
Assert.AreEqual(response.Messages.Last().Silent, true);
195-
});
169+
Assert.AreEqual(channelState2.Messages.Last().Silent, true);
196170
}
197171

198172
[UnityTest]

Assets/Plugins/StreamChat/Tests/StatefulClient/BaseStateIntegrationTests.cs

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -159,27 +159,37 @@ protected static async Task<T> TryAsync<T>(Func<Task<T>> task, Predicate<T> succ
159159
private static async Task ConnectAndExecuteAsync(Func<Task> test)
160160
{
161161
await StreamTestClients.Instance.ConnectStateClientAsync();
162-
const int maxAttempts = 3;
163-
int currentAttempt = 0;
162+
const int maxAttempts = 7;
163+
var currentAttempt = 0;
164+
var completed = false;
165+
var exceptions = new List<Exception>();
164166
while (maxAttempts > currentAttempt)
165167
{
166168
currentAttempt++;
167169
try
168170
{
169171
await test();
172+
completed = true;
170173
break;
171174
}
172175
catch (StreamApiException e)
173176
{
177+
exceptions.Add(e);
174178
if (e.IsRateLimitExceededError())
175179
{
176-
await Task.Delay(1000);
180+
var seconds = (int)Math.Max(1, Math.Min(60, Math.Pow(2, currentAttempt)));
181+
await Task.Delay(1000 * seconds);
177182
continue;
178183
}
179184

180185
throw;
181186
}
182187
}
188+
189+
if (!completed)
190+
{
191+
throw new AggregateException($"Failed all attempts. Last Exception: {exceptions.Last().Message} ", exceptions);
192+
}
183193
}
184194

185195
private async Task DeleteTempChannelsAsync()

0 commit comments

Comments
 (0)