diff --git a/Assets/Plugins/StreamChat/Core/StreamChatClient.cs b/Assets/Plugins/StreamChat/Core/StreamChatClient.cs index 866817c8..6196204e 100644 --- a/Assets/Plugins/StreamChat/Core/StreamChatClient.cs +++ b/Assets/Plugins/StreamChat/Core/StreamChatClient.cs @@ -562,7 +562,7 @@ void IStreamChatClientEventsListener.Destroy() } Dispose(); - }); + }, TaskScheduler.FromCurrentSynchronizationContext()); } void IStreamChatClientEventsListener.Update() => InternalLowLevelClient.Update(_timeService.DeltaTime); @@ -886,7 +886,7 @@ private void OnAddedToChannelNotification(NotificationAddedToChannelEventInterna } AddedToChannelAsMember?.Invoke(channel, member); - }); + }, TaskScheduler.FromCurrentSynchronizationContext()); } private void OnRemovedFromChannelNotification( @@ -914,7 +914,7 @@ private void OnRemovedFromChannelNotification( } RemovedFromChannelAsMember?.Invoke(channel, member); - }); + }, TaskScheduler.FromCurrentSynchronizationContext()); } private void OnInvitedNotification(NotificationInvitedEventInternalDTO eventDto) @@ -940,7 +940,7 @@ private void OnInvitedNotification(NotificationInvitedEventInternalDTO eventDto) } ChannelInviteReceived?.Invoke(channel, user); - }); + }, TaskScheduler.FromCurrentSynchronizationContext()); } private void OnInviteAcceptedNotification(NotificationInviteAcceptedEventInternalDTO eventDto) @@ -966,7 +966,7 @@ private void OnInviteAcceptedNotification(NotificationInviteAcceptedEventInterna } ChannelInviteAccepted?.Invoke(channel, user); - }); + }, TaskScheduler.FromCurrentSynchronizationContext()); } private void OnInviteRejectedNotification(NotificationInviteRejectedEventInternalDTO eventDto) @@ -992,7 +992,7 @@ private void OnInviteRejectedNotification(NotificationInviteRejectedEventInterna } ChannelInviteRejected?.Invoke(channel, user); - }); + }, TaskScheduler.FromCurrentSynchronizationContext()); } private void OnReactionReceived(ReactionNewEventInternalDTO eventDto) diff --git a/Assets/Plugins/StreamChat/Tests/LowLevelClient/DTOTests.cs b/Assets/Plugins/StreamChat/Tests/LowLevelClient/DTOTests.cs index 4fe67556..ac702de5 100644 --- a/Assets/Plugins/StreamChat/Tests/LowLevelClient/DTOTests.cs +++ b/Assets/Plugins/StreamChat/Tests/LowLevelClient/DTOTests.cs @@ -27,7 +27,7 @@ public void DTOs_do_not_use_interfaces() foreach (var type in streamChatCoreAssembly.GetTypes()) { - if (type.Namespace.IndexOf(DTOKeyword, StringComparison.InvariantCulture) != -1 && + if (type.Namespace != null && type.Namespace.IndexOf(DTOKeyword, StringComparison.InvariantCulture) != -1 && type.Namespace.IndexOf(IgnoredNamespace, StringComparison.InvariantCultureIgnoreCase) == 0) { dtoTypes.Add(type); diff --git a/Assets/Plugins/StreamChat/Tests/StatefulClient/BaseStateIntegrationTests.cs b/Assets/Plugins/StreamChat/Tests/StatefulClient/BaseStateIntegrationTests.cs index c39c9e1d..585f59c7 100644 --- a/Assets/Plugins/StreamChat/Tests/StatefulClient/BaseStateIntegrationTests.cs +++ b/Assets/Plugins/StreamChat/Tests/StatefulClient/BaseStateIntegrationTests.cs @@ -4,6 +4,7 @@ using System.Collections.Generic; using System.Diagnostics; using System.Linq; +using System.Threading; using System.Threading.Tasks; using NUnit.Framework; using StreamChat.Core; @@ -36,6 +37,8 @@ public async void OneTimeTearDown() protected static StreamChatClient Client => StreamTestClients.Instance.StateClient; + protected int MainThreadId { get; } = Thread.CurrentThread.ManagedThreadId; + // StreamTodo: replace with admin ids fetched from loaded data set protected const string TestUserId = TestUtils.TestUserId; protected const string TestAdminId = TestUtils.TestAdminId; @@ -46,6 +49,8 @@ public async void OneTimeTearDown() protected static IEnumerable OtherAdminUsersCredentials => StreamTestClients.Instance.OtherUserCredentials; + protected int GetCurrentThreadId() => Thread.CurrentThread.ManagedThreadId; + /// /// Create temp channel with random id that will be removed in [TearDown] /// diff --git a/Assets/Plugins/StreamChat/Tests/StatefulClient/ChannelMembersTests.cs b/Assets/Plugins/StreamChat/Tests/StatefulClient/ChannelMembersTests.cs index cbcb3e2e..a3cac1d2 100644 --- a/Assets/Plugins/StreamChat/Tests/StatefulClient/ChannelMembersTests.cs +++ b/Assets/Plugins/StreamChat/Tests/StatefulClient/ChannelMembersTests.cs @@ -2,6 +2,7 @@ using System.Collections; using System.Collections.Generic; using System.Linq; +using System.Threading; using System.Threading.Tasks; using NUnit.Framework; using StreamChat.Core; @@ -336,6 +337,39 @@ private async Task When_user_added_to_not_watched_channel_expect_user_receive_ad Assert.AreEqual(Client.LocalUserData.User, eventMember.User); } + [UnityTest] + public IEnumerator When_user_added_to_not_watched_channel_expect_user_receive_added_to_channel_event_from_main_thread() + => ConnectAndExecute( + When_user_added_to_not_watched_channel_expect_user_receive_added_to_channel_event_from_main_thread_Async); + + private async Task When_user_added_to_not_watched_channel_expect_user_receive_added_to_channel_event_from_main_thread_Async() + { + var channel = await CreateUniqueTempChannelAsync(watch: false); + + var receivedEvent = false; + IStreamChannelMember eventMember = null; + IStreamChannel eventChannel = null; + var receivedEventThreadId = 0; + Client.AddedToChannelAsMember += (channel2, member) => + { + receivedEvent = true; + eventMember = member; + eventChannel = channel2; + receivedEventThreadId = GetCurrentThreadId(); + }; + + await channel.AddMembersAsync(hideHistory: default, optionalMessage: default, Client.LocalUserData.User); + await WaitWhileFalseAsync(() => receivedEvent); + + Assert.IsTrue(receivedEvent); + Assert.IsNotNull(eventChannel); + Assert.IsNotNull(eventMember); + Assert.AreEqual(channel, eventChannel); + Assert.AreEqual(Client.LocalUserData.User, eventMember.User); + + Assert.AreEqual(receivedEventThreadId, MainThreadId); + } + [UnityTest] public IEnumerator When_user_added_to_not_watched_channel_expect_received_channel_being_watched() => ConnectAndExecute( @@ -349,11 +383,13 @@ private async Task When_user_added_to_not_watched_channel_expect_received_channe var receivedEvent = false; IStreamChannelMember eventMember = null; IStreamChannel eventChannel = null; + var eventThreadId = -1; Client.AddedToChannelAsMember += (channel2, member) => { receivedEvent = true; eventMember = member; eventChannel = channel2; + eventThreadId = GetCurrentThreadId(); }; await otherClientChannel.AddMembersAsync(hideHistory: default, optionalMessage: default, Client.LocalUserData.User); @@ -364,15 +400,19 @@ private async Task When_user_added_to_not_watched_channel_expect_received_channe Assert.IsNotNull(eventMember); Assert.AreEqual(otherClientChannel.Cid, eventChannel.Cid); Assert.AreEqual(Client.LocalUserData.User, eventMember.User); + + Assert.AreEqual(MainThreadId, eventThreadId); var receivedMessageEvent = false; var receivedMessage = string.Empty; IStreamChannel receivedMessageChannel = null; + var messageEventThreadId = -1; otherClientChannel.MessageReceived += (messageChannel, message) => { receivedMessageEvent = true; receivedMessage = message.Text; receivedMessageChannel = messageChannel; + messageEventThreadId = GetCurrentThreadId(); }; await otherClientChannel.SendNewMessageAsync("Hello"); @@ -381,6 +421,8 @@ private async Task When_user_added_to_not_watched_channel_expect_received_channe Assert.IsTrue(receivedMessageEvent); Assert.AreEqual(otherClientChannel.Cid, receivedMessageChannel.Cid); Assert.AreEqual(receivedMessage, "Hello"); + + Assert.AreEqual(MainThreadId, messageEventThreadId); } [UnityTest]