public void First_client_throws_exception_when_second_connected() { byte[] message = new byte[] { 1, 2, 3 }; var server = new PercistentTCPServer(14000); server.ClientConnected += ClientConnected; var exceptionHandled = false; Exception exception = null; Exception secondClientException = null; var serverThread = new Thread(() => server.StartThread()); var clientThread = new Thread(() => { try { var client = new TcpClient(); client.Connect("127.0.0.1", 14000); Thread.Sleep(30); //ждем, пока другой клиент подсоединится. client.Client.Send(message); //где-то тут сервер должен разорвать соединение. client.Client.Receive(message); } catch (Exception e) { exceptionHandled = true; exception = e; } }); clientThread.IsBackground = true; serverThread.IsBackground = true; serverThread.Start(); Thread.Sleep(10); clientThread.Start(); Thread.Sleep(10); if (exceptionHandled) throw exception; //на этот момент не должно быть эксепшна, первый должен к этому моменту успешно подключиться и ждать в слипе. clientThread = new Thread(() => { try { new TcpClient().Connect("127.0.0.1", 14000); } catch (Exception e) { secondClientException = e; } }); clientThread.IsBackground = true; clientThread.Start(); Thread.Sleep(50); if (secondClientException != null) throw secondClientException; //второй не должен кидать эксепшн, а должен успешно подключиться. if (!exceptionHandled) // первый должен кинуть эксепшн после подключения второго Assert.Fail(); }
//Этот метод нужно вызвать ровно один раз навсегда! для этого завести флаг. public static void Start() { Debugger.DisableByDefault = true; Debugger.EnabledTypes.Add(DebuggerMessageType.Unity); Debugger.EnabledTypes.Add(DebuggerMessageType.UnityTest); Debugger.EnabledTypes.Add(RMDebugMessage.WorldCreation); Debugger.EnabledTypes.Add(RMDebugMessage.Logic); Debugger.EnabledTypes.Add(RMDebugMessage.Workflow); Debugger.EnabledTypes.Add(DebuggerMessageType.Workflow); // Debugger.EnabledTypes.Add(DebuggerMessageType.Initialization); Debugger.Logger = s => Debug.Log(s); //создание и заполнение loader-а сюда loader = new Loader(); loader.AddLevel("Demo", "Test", () => new DemoCompetitions.Level1()); loader.AddLevel("RoboMovies", "Test", () => new RMCompetitions.Level1()); RenewWaitingNetworkServer(); //создает PercistentServer и подписываемся на его событие server = new PercistentTCPServer(14000); server.ClientConnected += ClientConnected; server.Printer = str => Debugger.Log(DebuggerMessageType.Unity,"FROM SERVER: " + str); //new Thread(server.StartThread) { IsBackground = true }.Start(); RunThread(server.StartThread, "Server"); }
public void Second_can_connect_when_first_correct_close() { byte[] message = new byte[] { 1, 2, 3 }; var exceptionHandled = false; Exception exception = null; var server = new PercistentTCPServer(14000); server.ClientConnected += ClientConnected; var serverThread = new Thread(() => server.StartThread()); serverThread.IsBackground = true; serverThread.Start(); var clientThread = new Thread(() => { try { var client = new TcpClient(); client.Connect("127.0.0.1", 14000); client.Client.Close(); } catch (Exception e) { exceptionHandled = true; exception = e; } }); clientThread.Start(); clientThread.Join(); if (exceptionHandled) throw exception; clientThread = new Thread(() => { try { var client = new TcpClient(); client.Connect("127.0.0.1", 14000); //client.Client.Send(message); //с этими строчками работает по отдельности, но не работает когда жмешь Ран Олл //client.Client.Receive(message); } catch (Exception e) { exceptionHandled = true; exception = e; } }); clientThread.Start(); clientThread.Join(); if (exceptionHandled) throw exception; }