NetworkSessionTests.cs 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. using NUnit.Framework;
  2. using System.Threading.Tasks;
  3. using Microsoft.Xna.Framework.Net;
  4. using System.Collections.Generic;
  5. using System;
  6. using System.Reflection;
  7. namespace Microsoft.Xna.Framework.Net.Tests
  8. {
  9. [TestFixture]
  10. public class NetworkSessionTests
  11. {
  12. [Test]
  13. public async Task MessageReceived_EventIsFired()
  14. {
  15. var session = await NetworkSession.CreateAsync(NetworkSessionType.SystemLink, 1, 4, 0, new Dictionary<string, object>());
  16. var tcs = new TaskCompletionSource<MessageReceivedEventArgs>();
  17. session.MessageReceived += (sender, args) =>
  18. {
  19. tcs.TrySetResult(args);
  20. };
  21. // Simulate a message being received (this requires a real or mock transport)
  22. // For demonstration, we'll invoke the event manually:
  23. session.GetType().GetMethod("OnMessageReceived", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance)
  24. .Invoke(session, new object[] { new MessageReceivedEventArgs(null, null) });
  25. var result = await tcs.Task;
  26. Assert.IsNotNull(result);
  27. }
  28. [Test]
  29. public async Task GamerJoined_EventIsFired()
  30. {
  31. var session = await NetworkSession.CreateAsync(NetworkSessionType.SystemLink, 1, 4, 0, new Dictionary<string, object>());
  32. var tcs = new TaskCompletionSource<GamerJoinedEventArgs>();
  33. session.GamerJoined += (sender, args) =>
  34. {
  35. tcs.TrySetResult(args);
  36. };
  37. // Simulate a gamer joining
  38. var ctor = typeof(NetworkGamer).GetConstructor(BindingFlags.Instance | BindingFlags.NonPublic, binder: null,
  39. types: new[] { typeof(NetworkSession), typeof(string), typeof(bool), typeof(bool), typeof(string) }, modifiers: null);
  40. var gamer = (NetworkGamer)ctor.Invoke(new object[] { session, Guid.NewGuid().ToString(), false, false, "TestGamer" });
  41. session.GetType().GetMethod("OnGamerJoined", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance)
  42. .Invoke(session, new object[] { gamer });
  43. var result = await tcs.Task;
  44. Assert.IsNotNull(result);
  45. }
  46. [Test]
  47. public async Task SessionEnded_EventIsFired()
  48. {
  49. var session = await NetworkSession.CreateAsync(NetworkSessionType.SystemLink, 1, 4, 0, new Dictionary<string, object>());
  50. var tcs = new TaskCompletionSource<NetworkSessionEndedEventArgs>();
  51. session.SessionEnded += (sender, args) =>
  52. {
  53. tcs.TrySetResult(args);
  54. };
  55. // Simulate session ending
  56. var endReasonType = typeof(NetworkSessionEndReason);
  57. var reason = Enum.GetValues(endReasonType).GetValue(0);
  58. session.GetType().GetMethod("OnSessionEnded", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance)
  59. .Invoke(session, new object[] { reason });
  60. var result = await tcs.Task;
  61. Assert.IsNotNull(result);
  62. }
  63. [Test]
  64. public async Task CreateAsync_CreatesSessionSuccessfully()
  65. {
  66. var session = await NetworkSession.CreateAsync(NetworkSessionType.SystemLink, 1, 4, 0, new Dictionary<string, object>());
  67. Assert.IsNotNull(session);
  68. Assert.AreEqual(NetworkSessionState.Lobby, session.SessionState);
  69. Assert.AreEqual(4, session.MaxGamers);
  70. }
  71. [Test]
  72. public void Create_Synchronous_CreatesSessionSuccessfully()
  73. {
  74. var session = NetworkSession.Create(NetworkSessionType.SystemLink, 1, 4, 0, new Dictionary<string, object>());
  75. Assert.IsNotNull(session);
  76. Assert.AreEqual(NetworkSessionState.Lobby, session.SessionState);
  77. Assert.AreEqual(4, session.MaxGamers);
  78. }
  79. [Test]
  80. public void Cancel_CancelsSessionWithoutException()
  81. {
  82. var session = NetworkSession.Create(NetworkSessionType.SystemLink, 1, 4, 0, new Dictionary<string, object>());
  83. Assert.DoesNotThrow(() => session.Cancel());
  84. }
  85. [Test]
  86. public async Task DisposeAsync_CleansUpResources()
  87. {
  88. var session = await NetworkSession.CreateAsync(NetworkSessionType.SystemLink, 1, 4, 0, new Dictionary<string, object>());
  89. await session.DisposeAsync();
  90. Assert.Pass(); // If no exception, disposal succeeded
  91. }
  92. [Test]
  93. public async Task CreateFindJoin_SimulatesSessionLifecycle()
  94. {
  95. // Create host session
  96. var hostSession = await NetworkSession.CreateAsync(NetworkSessionType.SystemLink, 1, 4, 0, new Dictionary<string, object>());
  97. Assert.IsNotNull(hostSession);
  98. Assert.AreEqual(NetworkSessionState.Lobby, hostSession.SessionState);
  99. // Simulate finding available sessions (mocked)
  100. var foundSessions = await NetworkSession.FindAsync(NetworkSessionType.SystemLink, 1, new Dictionary<string, object>());
  101. Assert.IsNotNull(foundSessions);
  102. // Simulate joining the session as a client
  103. var availableSession = new AvailableNetworkSession(
  104. sessionName: "TestSession",
  105. hostGamertag: "HostPlayer",
  106. currentGamerCount: 1,
  107. openPublicGamerSlots: 3,
  108. openPrivateGamerSlots: 0,
  109. sessionType: NetworkSessionType.SystemLink,
  110. sessionProperties: new Dictionary<string, object>(),
  111. sessionId: "test-session-id");
  112. var clientSession = await NetworkSession.JoinAsync(availableSession);
  113. Assert.IsNotNull(clientSession);
  114. Assert.AreEqual(NetworkSessionState.Lobby, clientSession.SessionState);
  115. // Clean up
  116. await hostSession.DisposeAsync();
  117. await clientSession.DisposeAsync();
  118. }
  119. [Test]
  120. public async Task HostProcessesJoinRequestAndResponds()
  121. {
  122. // Arrange: Create a host session
  123. var hostSession = await NetworkSession.CreateAsync(NetworkSessionType.SystemLink, 1, 4, 0, new Dictionary<string, object>());
  124. var joinRequest = new JoinRequestMessage
  125. {
  126. GamerId = "Player2",
  127. Gamertag = "PlayerTwo"
  128. };
  129. var writer = new PacketWriter();
  130. joinRequest.Serialize(writer);
  131. // Act: Simulate receiving a join request
  132. var remoteEndpoint = new System.Net.IPEndPoint(System.Net.IPAddress.Loopback, 12345);
  133. hostSession.GetType().GetMethod("OnMessageReceived", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance)
  134. .Invoke(hostSession, new object[] { new MessageReceivedEventArgs(joinRequest, remoteEndpoint) });
  135. // Assert: Verify the new player was added
  136. bool playerFound = false;
  137. foreach (var gamer in hostSession.AllGamers)
  138. {
  139. if (gamer.Gamertag == "PlayerTwo")
  140. {
  141. playerFound = true;
  142. break;
  143. }
  144. }
  145. Assert.IsTrue(playerFound);
  146. }
  147. [Test]
  148. public async Task PlayerMoveMessageUpdatesPositionAndBroadcasts()
  149. {
  150. // Arrange: Create a host session and add a player
  151. var hostSession = await NetworkSession.CreateAsync(NetworkSessionType.SystemLink, 1, 4, 0, new Dictionary<string, object>());
  152. var ctor = typeof(NetworkGamer).GetConstructor(System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic, null,
  153. new[] { typeof(NetworkSession), typeof(string), typeof(bool), typeof(bool), typeof(string) }, null);
  154. var player = (NetworkGamer)ctor.Invoke(new object[] { hostSession, "Player1", false, false, "PlayerOne" });
  155. hostSession.GetType().GetMethod("AddGamer", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance)
  156. .Invoke(hostSession, new object[] { player });
  157. var moveMessage = new PlayerMoveMessage
  158. {
  159. PlayerId = int.Parse(player.Id),
  160. X = 10.0f,
  161. Y = 20.0f,
  162. Z = 30.0f
  163. };
  164. var writer = new PacketWriter();
  165. moveMessage.Serialize(writer);
  166. // Act: Simulate receiving a movement message
  167. hostSession.GetType().GetMethod("OnMessageReceived", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance)
  168. .Invoke(hostSession, new object[] { new MessageReceivedEventArgs(moveMessage, null) });
  169. // Assert: Verify the movement was processed and broadcast
  170. // (Mock implementation: Check debug output or internal state changes)
  171. Assert.Pass();
  172. }
  173. }
  174. }