[Asterisk-java-cvs] CVS: asterisk-java/src/test/net/sf/asterisk/manager ManagerWriterMock.java,1.1,1
Brought to you by:
srt
From: Stefan R. <sr...@us...> - 2005-03-05 00:14:41
|
Update of /cvsroot/asterisk-java/asterisk-java/src/test/net/sf/asterisk/manager In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv4089/src/test/net/sf/asterisk/manager Modified Files: ManagerWriterMock.java DefaultManagerConnectionTest.java Log Message: Added more unit tests for DefaultManagerConnection Index: ManagerWriterMock.java =================================================================== RCS file: /cvsroot/asterisk-java/asterisk-java/src/test/net/sf/asterisk/manager/ManagerWriterMock.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -p -r1.1 -r1.2 --- ManagerWriterMock.java 4 Mar 2005 22:21:04 -0000 1.1 +++ ManagerWriterMock.java 5 Mar 2005 00:14:32 -0000 1.2 @@ -20,10 +20,12 @@ import java.io.IOException; import net.sf.asterisk.manager.action.ChallengeAction; import net.sf.asterisk.manager.action.LoginAction; +import net.sf.asterisk.manager.action.LogoffAction; import net.sf.asterisk.manager.action.ManagerAction; import net.sf.asterisk.manager.event.ConnectEvent; import net.sf.asterisk.manager.io.SocketConnectionFacade; import net.sf.asterisk.manager.response.ChallengeResponse; +import net.sf.asterisk.manager.response.ManagerError; import net.sf.asterisk.manager.response.ManagerResponse; public class ManagerWriterMock implements ManagerWriter @@ -36,9 +38,12 @@ public class ManagerWriterMock implement private String expectedKey; private String expectedUsername; + private boolean sendResponse = true; + private boolean sendConnectEvent = true; public int challengeActionsSent = 0; public int loginActionsSent = 0; + public int logoffActionsSent = 0; public int otherActionsSent = 0; public ManagerWriterMock() @@ -59,27 +64,39 @@ public class ManagerWriterMock implement { this.expectedKey = key; } - + public void setExpectedUsername(String username) { this.expectedUsername = username; } + public void setSendResponse(boolean sendResponse) + { + this.sendResponse = sendResponse; + } + + public void setSendConnectEvent(boolean sendConnectEvent) + { + this.sendConnectEvent = sendConnectEvent; + } + public void setSocket(SocketConnectionFacade socket) { this.socket = socket; - ConnectEvent connectEvent; - connectEvent = new ConnectEvent(asteriskServer); - connectEvent.setProtocolIdentifier("Asterisk Call Manager/1.0"); - dispatcher.dispatchEvent(connectEvent); + if (sendConnectEvent) + { + ConnectEvent connectEvent; + connectEvent = new ConnectEvent(asteriskServer); + connectEvent.setProtocolIdentifier("Asterisk Call Manager/1.0"); + dispatcher.dispatchEvent(connectEvent); + } } public void sendAction(ManagerAction action) throws IOException { if (action instanceof ChallengeAction) { - ChallengeResponse challengeResponse; ChallengeAction challengeAction = (ChallengeAction) action; String authType = challengeAction.getAuthType(); @@ -88,51 +105,83 @@ public class ManagerWriterMock implement throw new RuntimeException("Expected authType 'MD5' got '" + authType + "'"); } - challengeResponse = new ChallengeResponse(); - challengeResponse.setActionId(action.getActionId()); - challengeResponse.setChallenge(CHALLENGE); - dispatcher.dispatchResponse(challengeResponse); - challengeActionsSent++; + + if (sendResponse) + { + ChallengeResponse challengeResponse; + + challengeResponse = new ChallengeResponse(); + challengeResponse.setActionId(action.getActionId()); + challengeResponse.setChallenge(CHALLENGE); + dispatcher.dispatchResponse(challengeResponse); + } } else if (action instanceof LoginAction) { - ManagerResponse loginResponse; + LoginAction loginAction = (LoginAction) action; String username = loginAction.getUsername(); String key = loginAction.getKey(); String authType = loginAction.getAuthType(); - if (!authType.equals("MD5")) + if (!"MD5".equals(authType)) { throw new RuntimeException("Expected authType 'MD5' got '" + authType + "'"); } - if (!username.equals(expectedUsername)) + if (!expectedUsername.equals(username)) { throw new RuntimeException("Expected username '" + expectedUsername + "' got '" + username + "'"); } - if (!key.equals(expectedKey)) + + loginActionsSent++; + + if (sendResponse) { - throw new RuntimeException("Expected key '" + expectedKey + "' got '" + key + "'"); + ManagerResponse loginResponse; + + if (key.equals(expectedKey)) + { + loginResponse = new ManagerResponse(); + loginResponse.setResponse("Success"); + } + else + { + loginResponse = new ManagerError(); + loginResponse.setResponse("Error"); + loginResponse.setMessage("Authentication failed"); + } + loginResponse.setActionId(action.getActionId()); + dispatcher.dispatchResponse(loginResponse); } + } + else if (action instanceof LogoffAction) + { + logoffActionsSent++; - loginResponse = new ManagerResponse(); - loginResponse.setActionId(action.getActionId()); - loginResponse.setResponse("Success"); - dispatcher.dispatchResponse(loginResponse); + if (sendResponse) + { + ManagerResponse response; - loginActionsSent++; + response = new ManagerResponse(); + response.setActionId(action.getActionId()); + response.setResponse("Success"); + dispatcher.dispatchResponse(response); + } } else { - ManagerResponse response; - - response = new ManagerResponse(); - response.setActionId(action.getActionId()); - response.setResponse("Success"); - dispatcher.dispatchResponse(response); - otherActionsSent++; + + if (sendResponse) + { + ManagerResponse response; + + response = new ManagerResponse(); + response.setActionId(action.getActionId()); + response.setResponse("Success"); + dispatcher.dispatchResponse(response); + } } } } Index: DefaultManagerConnectionTest.java =================================================================== RCS file: /cvsroot/asterisk-java/asterisk-java/src/test/net/sf/asterisk/manager/DefaultManagerConnectionTest.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -p -r1.1 -r1.2 --- DefaultManagerConnectionTest.java 4 Mar 2005 22:21:04 -0000 1.1 +++ DefaultManagerConnectionTest.java 5 Mar 2005 00:14:32 -0000 1.2 @@ -16,9 +16,12 @@ */ package net.sf.asterisk.manager; +import java.io.IOException; + import junit.framework.TestCase; import net.sf.asterisk.manager.action.StatusAction; import net.sf.asterisk.manager.event.ConnectEvent; +import net.sf.asterisk.manager.event.DisconnectEvent; import net.sf.asterisk.manager.io.SocketConnectionFacade; import net.sf.asterisk.manager.response.ManagerResponse; @@ -38,22 +41,40 @@ public class DefaultManagerConnectionTes asteriskServer = new AsteriskServer("localhost", 5038); mockWriter = new ManagerWriterMock(); + mockWriter.setExpectedUsername("username"); + // md5 sum of 12345password + mockWriter.setExpectedKey("40b1b887502902a8ce61a16e44630f7c"); + mockReader = new ManagerReaderMock(); socketMC = MockControl.createControl(SocketConnectionFacade.class); mockSocket = (SocketConnectionFacade) socketMC.getMock(); dmc = new MockedDefaultManagerConnection(mockReader, mockWriter, mockSocket); + + // make tests faster that expect a TimeoutException + dmc.setDefaultTimeout(10); + mockWriter.setDispatcher(dmc); mockWriter.setAsteriskServer(asteriskServer); } - public void testConstructor() + public void testDefaultConstructor() { assertEquals("Invalid default hostname", "localhost", dmc.getAsteriskServer().getHostname()); assertEquals("Invalid default port", 5038, dmc.getAsteriskServer().getPort()); } + public void testFullConstructor() + { + dmc = new MockedDefaultManagerConnection("host", 1234, "u", "p"); + + assertEquals("Invalid hostname", "host", dmc.getAsteriskServer().getHostname()); + assertEquals("Invalid port", 1234, dmc.getAsteriskServer().getPort()); + assertEquals("Invalid username", "u", dmc.getUsername()); + assertEquals("Invalid password", "p", dmc.getPassword()); + } + public void testLogin() throws Exception { MockControl managerEventHandlerMC; @@ -70,14 +91,51 @@ public class DefaultManagerConnectionTes socketMC.replay(); + dmc.setUsername("username"); + dmc.setPassword("password"); + dmc.addEventHandler(managerEventHandler); + dmc.login(); + + assertEquals("createSocket not called 1 time", 1, dmc.createSocketCalls); + assertEquals("createWriter not called 1 time", 1, dmc.createWriterCalls); + assertEquals("createReader not called 1 time", 1, dmc.createReaderCalls); + + assertEquals("challenge action not sent 1 time", 1, mockWriter.challengeActionsSent); + assertEquals("login action not sent 1 time", 1, mockWriter.loginActionsSent); + assertEquals("unexpected other actions sent", 0, mockWriter.otherActionsSent); + + assertEquals("setSocket() not called 1 time", 1, mockReader.setSocketCalls); + // assertEquals("run() not called 1 time", 1, mockReader.runCalls); + assertEquals("unexpected call to die()", 0, mockReader.dieCalls); + + assertTrue("keepAlive not set", dmc.getKeepAlive()); + + socketMC.verify(); + managerEventHandlerMC.verify(); + } + + public void testLoginIncorrectKey() throws Exception + { + ConnectEvent connectEvent; + + mockSocket.close(); + socketMC.replay(); + mockWriter.setExpectedUsername("username"); // md5 sum of 12345password mockWriter.setExpectedKey("40b1b887502902a8ce61a16e44630f7c"); dmc.setUsername("username"); - dmc.setPassword("password"); - dmc.addEventHandler(managerEventHandler); - dmc.login(); + dmc.setPassword("wrong password"); + + try + { + dmc.login(); + fail("No AuthenticationFailedException thrown"); + } + catch (AuthenticationFailedException e) + { + } assertEquals("createSocket not called 1 time", 1, dmc.createSocketCalls); assertEquals("createWriter not called 1 time", 1, dmc.createWriterCalls); @@ -88,11 +146,143 @@ public class DefaultManagerConnectionTes assertEquals("unexpected other actions sent", 0, mockWriter.otherActionsSent); assertEquals("setSocket() not called 1 time", 1, mockReader.setSocketCalls); + // TODO why is run() not called? + // assertEquals("run() not called 1 time", 1, mockReader.runCalls); + assertEquals("unexpected call to die()", 0, mockReader.dieCalls); + + socketMC.verify(); + } + + public void testLoginIOExceptionOnConnect() throws Exception + { + socketMC.replay(); + + dmc.setThrowIOExceptionOnFirstSocketCreate(true); + try + { + dmc.login(); + fail("No IOException thrown"); + } + catch (IOException e) + { + } + + assertEquals("createSocket not called 1 time", 1, dmc.createSocketCalls); + assertEquals("createWriter not called 1 time", 1, dmc.createWriterCalls); + assertEquals("createReader not called 1 time", 1, dmc.createReaderCalls); + + assertEquals("unexpected challenge action sent", 0, mockWriter.challengeActionsSent); + assertEquals("unexpected login action sent", 0, mockWriter.loginActionsSent); + assertEquals("unexpected other actions sent", 0, mockWriter.otherActionsSent); + + assertEquals("unexpected call to setSocket()", 0, mockReader.setSocketCalls); + assertEquals("unexpected call to run()", 0, mockReader.runCalls); + assertEquals("unexpected call to die()", 0, mockReader.dieCalls); + + socketMC.verify(); + } + + public void testLoginTimeoutOnConnect() throws Exception + { + mockSocket.close(); + socketMC.replay(); + + // provoke timeout + mockWriter.setSendConnectEvent(false); + + try + { + dmc.login(); + fail("No TimeoutException on login()"); + } + catch (TimeoutException e) + { + assertEquals("Timeout waiting for protocol identifier", e.getMessage()); + } + + assertEquals("createSocket not called 1 time", 1, dmc.createSocketCalls); + assertEquals("createWriter not called 1 time", 1, dmc.createWriterCalls); + assertEquals("createReader not called 1 time", 1, dmc.createReaderCalls); + + assertEquals("unexpected challenge action sent", 0, mockWriter.challengeActionsSent); + assertEquals("unexpected login action sent", 0, mockWriter.loginActionsSent); + assertEquals("unexpected other actions sent", 0, mockWriter.otherActionsSent); + + assertEquals("setSocket() not called 1 time", 1, mockReader.setSocketCalls); + assertEquals("run() not called 1 time", 1, mockReader.runCalls); + assertEquals("unexpected call to die()", 0, mockReader.dieCalls); + + socketMC.verify(); + } + + public void testLoginTimeoutOnChallengeAction() throws Exception + { + socketMC.replay(); + + // provoke timeout + mockWriter.setSendResponse(false); + + try + { + dmc.login(); + fail("No TimeoutException on login()"); + } + catch (TimeoutException e) + { + assertEquals("Timeout waiting for response to Challenge", e.getMessage()); + } + + assertEquals("createSocket not called 1 time", 1, dmc.createSocketCalls); + assertEquals("createWriter not called 1 time", 1, dmc.createWriterCalls); + assertEquals("createReader not called 1 time", 1, dmc.createReaderCalls); + + assertEquals("challenge action not sent 1 time", 1, mockWriter.challengeActionsSent); + assertEquals("unexpected login action sent", 0, mockWriter.loginActionsSent); + assertEquals("unexpected other actions sent", 0, mockWriter.otherActionsSent); + + assertEquals("setSocket() not called 1 time", 1, mockReader.setSocketCalls); assertEquals("run() not called 1 time", 1, mockReader.runCalls); assertEquals("unexpected call to die()", 0, mockReader.dieCalls); socketMC.verify(); - managerEventHandlerMC.verify(); + } + + public void testLogoffWhenConnected() throws Exception + { + mockSocket.close(); + socketMC.replay(); + + // fake connect + dmc.connect(); + + dmc.logoff(); + + assertEquals("logoff action not sent 1 time", 1, mockWriter.logoffActionsSent); + socketMC.verify(); + } + + public void testLogoffWhenNotConnected() throws Exception + { + socketMC.replay(); + + dmc.logoff(); + + assertEquals("unexpected logoff action sent", 0, mockWriter.logoffActionsSent); + socketMC.verify(); + } + + public void testSendActionWithNullAction() throws Exception + { + // fake connect + dmc.connect(); + try + { + dmc.sendAction(null); + fail("No IllgealArgumentException thrown"); + } + catch (IllegalArgumentException e) + { + } } public void testSendActionWhenNotConnected() throws Exception @@ -129,12 +319,166 @@ public class DefaultManagerConnectionTes assertEquals("other actions not sent 1 time", 1, mockWriter.otherActionsSent); } + public void testSendActionTimeout() throws Exception + { + StatusAction statusAction; + + statusAction = new StatusAction(); + statusAction.setActionId("123"); + + // fake connect + dmc.connect(); + // provoke timeout + mockWriter.setSendResponse(false); + try + { + dmc.sendAction(statusAction); + fail("No TimeoutException thrown"); + } + catch (TimeoutException e) + { + } + + assertEquals("other actions not sent 1 time", 1, mockWriter.otherActionsSent); + } + + public void testDispatchResponseUnexpectedResponse() + { + ManagerResponse response; + + response = new ManagerResponse(); + // internalActionId: 123_0 + response.setActionId("123_0-abc"); + response.setResponse("Success"); + + // expected result is ignoring the response and logging + dmc.dispatchResponse(response); + } + + public void testDispatchResponseMissingInternalActionId() + { + ManagerResponse response; + + response = new ManagerResponse(); + response.setActionId("abc"); + response.setResponse("Success"); + + // expected result is ignoring the response and logging + dmc.dispatchResponse(response); + } + + public void testDispatchResponseNullActionId() + { + ManagerResponse response; + + response = new ManagerResponse(); + response.setActionId(null); + response.setResponse("Success"); + + // expected result is ignoring the response and logging + dmc.dispatchResponse(response); + } + + public void testDispatchResponseNullResponse() + { + // expected result is ignoring and logging + dmc.dispatchResponse(null); + } + + public void testReconnect() throws Exception + { + DisconnectEvent disconnectEvent; + + socketMC.replay(); + disconnectEvent = new DisconnectEvent(asteriskServer); + + // fake successful login + dmc.setKeepAlive(true); + + dmc.setUsername("username"); + dmc.setPassword("password"); + + dmc.dispatchEvent(disconnectEvent); + + assertEquals("createSocket not called 1 time", 1, dmc.createSocketCalls); + assertEquals("createWriter not called 1 time", 1, dmc.createWriterCalls); + assertEquals("createReader not called 1 time", 1, dmc.createReaderCalls); + + assertEquals("challenge action not sent 1 time", 1, mockWriter.challengeActionsSent); + assertEquals("login action not sent 1 time", 1, mockWriter.loginActionsSent); + assertEquals("unexpected other actions sent", 0, mockWriter.otherActionsSent); + + assertTrue("keepAlive not enabled", dmc.getKeepAlive()); + + socketMC.verify(); + } + + public void testReconnectWithIOException() throws Exception + { + DisconnectEvent disconnectEvent; + + socketMC.replay(); + disconnectEvent = new DisconnectEvent(asteriskServer); + + // fake successful login + dmc.setKeepAlive(true); + + dmc.setThrowIOExceptionOnFirstSocketCreate(true); + + dmc.setUsername("username"); + dmc.setPassword("password"); + + dmc.dispatchEvent(disconnectEvent); + + assertEquals("createSocket not called 1 time", 2, dmc.createSocketCalls); + assertEquals("createWriter not called 1 time", 1, dmc.createWriterCalls); + assertEquals("createReader not called 1 time", 1, dmc.createReaderCalls); + + assertEquals("challenge action not sent 1 time", 1, mockWriter.challengeActionsSent); + assertEquals("login action not sent 1 time", 1, mockWriter.loginActionsSent); + assertEquals("unexpected other actions sent", 0, mockWriter.otherActionsSent); + + assertTrue("keepAlive not enabled", dmc.getKeepAlive()); + + socketMC.verify(); + } + + public void testReconnectWithAuthenticationFailure() throws Exception + { + DisconnectEvent disconnectEvent; + + mockSocket.close(); + socketMC.replay(); + disconnectEvent = new DisconnectEvent(asteriskServer); + + // fake successful login + dmc.setKeepAlive(true); + + dmc.setUsername("username"); + + dmc.dispatchEvent(disconnectEvent); + + assertEquals("createSocket not called 1 time", 1, dmc.createSocketCalls); + assertEquals("createWriter not called 1 time", 1, dmc.createWriterCalls); + assertEquals("createReader not called 1 time", 1, dmc.createReaderCalls); + + assertEquals("challenge action not sent 1 time", 1, mockWriter.challengeActionsSent); + assertEquals("login action not sent 1 time", 1, mockWriter.loginActionsSent); + assertEquals("unexpected other actions sent", 0, mockWriter.otherActionsSent); + + assertFalse("keepAlive not disabled", dmc.getKeepAlive()); + + socketMC.verify(); + } + private class MockedDefaultManagerConnection extends DefaultManagerConnection { ManagerReader mockReader; ManagerWriter mockWriter; SocketConnectionFacade mockSocket; + private boolean throwIOExceptionOnFirstSocketCreate = false; + public int createReaderCalls = 0; public int createWriterCalls = 0; public int createSocketCalls = 0; @@ -148,6 +492,36 @@ public class DefaultManagerConnectionTes this.mockSocket = mockSocket; } + public MockedDefaultManagerConnection(String hostname, int port, String username, String password) + { + super(hostname, port, username, password); + } + + public void setThrowIOExceptionOnFirstSocketCreate(boolean throwIOExceptionOnSocketCreate) + { + this.throwIOExceptionOnFirstSocketCreate = throwIOExceptionOnSocketCreate; + } + + public String getUsername() + { + return username; + } + + public String getPassword() + { + return password; + } + + public void setKeepAlive(boolean keepAlive) + { + this.keepAlive = keepAlive; + } + + public boolean getKeepAlive() + { + return keepAlive; + } + protected ManagerReader createReader(Dispatcher d, AsteriskServer s) { createReaderCalls++; @@ -160,9 +534,14 @@ public class DefaultManagerConnectionTes return mockWriter; } - protected SocketConnectionFacade createSocket() + protected SocketConnectionFacade createSocket() throws IOException { createSocketCalls++; + + if (throwIOExceptionOnFirstSocketCreate && createSocketCalls == 1) + { + throw new IOException(); + } return mockSocket; } } |