NetworkSessionTests.cs 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. using NUnit.Framework;
  2. using System.Threading.Tasks;
  3. using Microsoft.Xna.Framework.Net;
  4. using System.Collections.Generic;
  5. using System;
  6. namespace Microsoft.Xna.Framework.Net.Tests
  7. {
  8. [TestFixture]
  9. public class NetworkSessionTests
  10. {
  11. [Test]
  12. public async Task MessageReceived_EventIsFired()
  13. {
  14. var session = await NetworkSession.CreateAsync(NetworkSessionType.SystemLink, 1, 4, 0, new Dictionary<string, object>());
  15. var tcs = new TaskCompletionSource<MessageReceivedEventArgs>();
  16. session.MessageReceived += (sender, args) =>
  17. {
  18. tcs.TrySetResult(args);
  19. };
  20. // Simulate a message being received (this requires a real or mock transport)
  21. // For demonstration, we'll invoke the event manually:
  22. session.GetType().GetMethod("OnMessageReceived", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance)
  23. .Invoke(session, new object[] { new MessageReceivedEventArgs(null, null) });
  24. var result = await tcs.Task;
  25. Assert.IsNotNull(result);
  26. }
  27. [Test]
  28. public async Task GamerJoined_EventIsFired()
  29. {
  30. var session = await NetworkSession.CreateAsync(NetworkSessionType.SystemLink, 1, 4, 0, new Dictionary<string, object>());
  31. var tcs = new TaskCompletionSource<GamerJoinedEventArgs>();
  32. session.GamerJoined += (sender, args) =>
  33. {
  34. tcs.TrySetResult(args);
  35. };
  36. // Simulate a gamer joining
  37. var gamerType = typeof(NetworkGamer);
  38. var gamer = (NetworkGamer)System.Runtime.Serialization.FormatterServices.GetUninitializedObject(gamerType);
  39. session.GetType().GetMethod("OnGamerJoined", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance)
  40. .Invoke(session, new object[] { gamer });
  41. var result = await tcs.Task;
  42. Assert.IsNotNull(result);
  43. }
  44. [Test]
  45. public async Task SessionEnded_EventIsFired()
  46. {
  47. var session = await NetworkSession.CreateAsync(NetworkSessionType.SystemLink, 1, 4, 0, new Dictionary<string, object>());
  48. var tcs = new TaskCompletionSource<NetworkSessionEndedEventArgs>();
  49. session.SessionEnded += (sender, args) =>
  50. {
  51. tcs.TrySetResult(args);
  52. };
  53. // Simulate session ending
  54. var endReasonType = typeof(NetworkSessionEndReason);
  55. var reason = Enum.GetValues(endReasonType).GetValue(0);
  56. session.GetType().GetMethod("OnSessionEnded", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance)
  57. .Invoke(session, new object[] { reason });
  58. var result = await tcs.Task;
  59. Assert.IsNotNull(result);
  60. }
  61. [Test]
  62. public async Task CreateAsync_CreatesSessionSuccessfully()
  63. {
  64. var session = await NetworkSession.CreateAsync(NetworkSessionType.SystemLink, 1, 4, 0, new Dictionary<string, object>());
  65. Assert.IsNotNull(session);
  66. Assert.AreEqual(NetworkSessionState.Lobby, session.SessionState);
  67. Assert.AreEqual(4, session.MaxGamers);
  68. }
  69. [Test]
  70. public void Create_Synchronous_CreatesSessionSuccessfully()
  71. {
  72. var session = NetworkSession.Create(NetworkSessionType.SystemLink, 1, 4, 0, new Dictionary<string, object>());
  73. Assert.IsNotNull(session);
  74. Assert.AreEqual(NetworkSessionState.Lobby, session.SessionState);
  75. Assert.AreEqual(4, session.MaxGamers);
  76. }
  77. [Test]
  78. public void Cancel_CancelsSessionWithoutException()
  79. {
  80. var session = NetworkSession.Create(NetworkSessionType.SystemLink, 1, 4, 0, new Dictionary<string, object>());
  81. Assert.DoesNotThrow(() => session.Cancel());
  82. }
  83. [Test]
  84. public async Task DisposeAsync_CleansUpResources()
  85. {
  86. var session = await NetworkSession.CreateAsync(NetworkSessionType.SystemLink, 1, 4, 0, new Dictionary<string, object>());
  87. await session.DisposeAsync();
  88. Assert.Pass(); // If no exception, disposal succeeded
  89. }
  90. [Test]
  91. public async Task CreateFindJoin_SimulatesSessionLifecycle()
  92. {
  93. // Create host session
  94. var hostSession = await NetworkSession.CreateAsync(NetworkSessionType.SystemLink, 1, 4, 0, new Dictionary<string, object>());
  95. Assert.IsNotNull(hostSession);
  96. Assert.AreEqual(NetworkSessionState.Lobby, hostSession.SessionState);
  97. // Simulate finding available sessions (mocked)
  98. var foundSessions = await NetworkSession.FindAsync(NetworkSessionType.SystemLink, 1, new Dictionary<string, object>());
  99. Assert.IsNotNull(foundSessions);
  100. // Simulate joining the session as a client
  101. var availableSession = new AvailableNetworkSession(
  102. sessionName: "TestSession",
  103. hostGamertag: "HostPlayer",
  104. currentGamerCount: 1,
  105. openPublicGamerSlots: 3,
  106. openPrivateGamerSlots: 0,
  107. sessionType: NetworkSessionType.SystemLink,
  108. sessionProperties: new Dictionary<string, object>(),
  109. sessionId: "test-session-id");
  110. var clientSession = await NetworkSession.JoinAsync(availableSession);
  111. Assert.IsNotNull(clientSession);
  112. Assert.AreEqual(NetworkSessionState.Lobby, clientSession.SessionState);
  113. // Clean up
  114. await hostSession.DisposeAsync();
  115. await clientSession.DisposeAsync();
  116. }
  117. }
  118. }