public async Task ServerStartTest() { var server = new TcpSocketServer(); // 초기 상태 테스트. Assert.AreEqual(server.state, ServerState.None); // 초기화 없이 서버를 시작 할 때 테스트 await Assert.ThrowsExceptionAsync <InvalidOperationException>(async() => { await server.StartAsync(); }); // 실패 했을 경우 상태가 변경되면 안됨. Assert.AreEqual(server.state, ServerState.None); // NULL 처리 테스트 Assert.ThrowsException <ArgumentNullException>(() => { server.SetLoggerFactory(null); }); // NULL 처리 테스트 Assert.ThrowsException <ArgumentNullException>(() => { server.SetMsgFilterFactory(null); }); // NULL 처리 테스트 Assert.ThrowsException <ArgumentNullException>(() => { server.SetSessionConfigrator(null); }); //정상 상황 테스트. var freeLocalPort = TestExtensions.GetFreePort("127.0.0.1"); var startTask = server .AddListener(new Server.Listeners.ListenerConfig("127.0.0.1", freeLocalPort, 1000)) .SetLoggerFactory(new ConsoleLoggerFactory()) .SetMsgFilterFactory(new DefaultMsgFilterFactory <StringMsgFilter>()) .SetSessionConfigrator((ssn) => { //ssn.SetSessionBehavior }) .StartAsync().ConfigureAwait(false); // 시작중인 상태 체크 -> Async 지만 바로 시작할 수도 있으니 Running 까지 Pass 로 처리한다. Assert.IsTrue(server.state == ServerState.Starting || server.state == ServerState.Running); await startTask; // 서버 진행 중.. Assert.AreEqual(server.state, ServerState.Running); var stopTask = server.StopAsync(); // 종료중인 상태 체크 -> Async 지만 바로 종료될 수 있으니 Stopped 까지 Pass 로 처리한다. Assert.IsTrue(server.state == ServerState.Stopping || server.state == ServerState.Stopped); await stopTask; // 종료 상태 체크. Assert.AreEqual(server.state, ServerState.Stopped); // 서버는 재시작되면 안됨.. await Assert.ThrowsExceptionAsync <InvalidOperationException>(async() => { await server.StartAsync(); }); }