package org.opennaas.core.protocols.sessionmanager.tests; import java.util.HashMap; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.opennaas.core.protocols.sessionmanager.ProtocolManager; import org.opennaas.core.protocols.sessionmanager.ProtocolSessionManager; import org.opennaas.core.resources.mock.MockEventManager; import org.opennaas.core.resources.mock.MockProtocolSessionFactory; import org.opennaas.core.resources.protocol.IProtocolSession; import org.opennaas.core.resources.protocol.IProtocolSessionManager; import org.opennaas.core.resources.protocol.ProtocolException; import org.opennaas.core.resources.protocol.ProtocolSessionContext; public class ProtocolManagerTest { String resourceId = "RandomDevice"; ProtocolManager protocolManager; ProtocolSessionManager protocolSessionManager; ProtocolSessionContext netconfContext; ProtocolSessionContext mockContext; @SuppressWarnings("serial") @Before public void prepare() throws ProtocolException { protocolManager = new ProtocolManager(); protocolSessionManager = (ProtocolSessionManager) protocolManager.getProtocolSessionManager(resourceId); // trick to avoid registration as alarm listener errors protocolSessionManager.setEventManager(new MockEventManager()); netconfContext = new ProtocolSessionContext(); netconfContext.addParameter(ProtocolSessionContext.PROTOCOL, "netconf"); netconfContext.addParameter(ProtocolSessionContext.PROTOCOL_URI, "mock://user:pass@server"); mockContext = new ProtocolSessionContext(); mockContext.addParameter(ProtocolSessionContext.PROTOCOL, "mock"); mockContext.addParameter(ProtocolSessionContext.PROTOCOL_URI, "freeFormString"); protocolManager.sessionFactoryAdded(new MockProtocolSessionFactory(), new HashMap<String, String>() { { put(ProtocolSessionContext.PROTOCOL, "netconf"); } }); protocolManager.sessionFactoryAdded(new MockProtocolSessionFactory(), new HashMap<String, String>() { { put(ProtocolSessionContext.PROTOCOL, "mock"); } }); protocolSessionManager.registerContext(netconfContext); protocolSessionManager.registerContext(mockContext); } @After public void clean() throws ProtocolException { protocolSessionManager.unregisterContext((String) netconfContext.getSessionParameters().get(ProtocolSessionContext.PROTOCOL)); protocolSessionManager.unregisterContext((String) mockContext.getSessionParameters().get(ProtocolSessionContext.PROTOCOL)); protocolManager.destroyProtocolSessionManager(resourceId); } @Test public void registerAContextWithoutFactory() { ProtocolSessionContext adhocContext = new ProtocolSessionContext(); adhocContext.addParameter(ProtocolSessionContext.PROTOCOL, "nonExistingProtocol"); adhocContext.addParameter(ProtocolSessionContext.PROTOCOL_URI, "adhocContext"); try { protocolSessionManager.registerContext(adhocContext); } catch (ProtocolException e) { return; // all is nice } Assert.fail("Registering a context for a non-existing protocol worked. Should have failed."); } @Test public void obtainSessionByProtocolWithLock() throws ProtocolException { IProtocolSession session = protocolSessionManager.obtainSessionByProtocol("netconf", true); Assert.assertNotNull("The returned session is null", session); protocolSessionManager.releaseSession(session); } @Test public void obtainSessionByProtocolWithoutLock() throws ProtocolException { IProtocolSession session = protocolSessionManager.obtainSessionByProtocol("netconf", false); Assert.assertNotNull("The returned session is null", session); } @Test public void obtainSessionWithNewContext() throws ProtocolException { ProtocolSessionContext adhocContext = new ProtocolSessionContext(); adhocContext.addParameter(ProtocolSessionContext.PROTOCOL, "netconf"); adhocContext.addParameter(ProtocolSessionContext.PROTOCOL_URI, "mock://user:pass@mockserver"); IProtocolSession session = protocolSessionManager.obtainSession(adhocContext, true); Assert.assertNotNull("The returned session is null", session); Assert.assertEquals(session.getSessionContext().getSessionParameters().get(ProtocolSessionContext.PROTOCOL), adhocContext.getSessionParameters().get(ProtocolSessionContext.PROTOCOL)); protocolSessionManager.releaseSession(session); } @Test public void obtainSessionWithProtocol() throws ProtocolException { IProtocolSession session1 = protocolSessionManager.obtainSessionByProtocol("netconf", true); IProtocolSession session2 = protocolSessionManager.obtainSessionByProtocol("mock", true); protocolSessionManager.releaseSession(session1); protocolSessionManager.releaseSession(session2.getSessionId()); } @Test public void obtainAndDestroySessionWithProtocol() throws ProtocolException { IProtocolSession session1 = protocolSessionManager.obtainSessionByProtocol("netconf", true); IProtocolSession session2 = protocolSessionManager.obtainSessionByProtocol("mock", true); protocolSessionManager.releaseSession(session1); protocolSessionManager.releaseSession(session2.getSessionId()); protocolSessionManager.destroyProtocolSession((session1.getSessionId())); protocolSessionManager.destroyProtocolSession((session2.getSessionId())); } @Test public void obtainAndPurgeSessionWithProtocol() throws ProtocolException { IProtocolSession session1 = protocolSessionManager.obtainSessionByProtocol("netconf", true); IProtocolSession session2 = protocolSessionManager.obtainSessionByProtocol("mock", true); protocolSessionManager.releaseSession(session1); protocolSessionManager.releaseSession(session2.getSessionId()); try { Thread.sleep(150); } catch (InterruptedException e) { Assert.fail(); } protocolSessionManager.purgeOldSessions(100); session1 = protocolSessionManager.obtainSessionByProtocol("netconf", true); session2 = protocolSessionManager.obtainSessionByProtocol("mock", true); protocolSessionManager.releaseSession(session1); try { Thread.sleep(200); } catch (InterruptedException e) { Assert.fail(); } protocolSessionManager.releaseSession(session2.getSessionId()); try { Thread.sleep(200); } catch (InterruptedException e) { Assert.fail(); } protocolSessionManager.purgeOldSessions(300); protocolSessionManager.purgeOldSessions(0); } @Test public void getProtocolSessionManagerWithContext() throws ProtocolException { String resourceIdTwo = "randomDevice2"; netconfContext = new ProtocolSessionContext(); netconfContext.addParameter(ProtocolSessionContext.PROTOCOL, "netconf"); netconfContext.addParameter(ProtocolSessionContext.PROTOCOL_URI, "mock://user:pass@serve"); IProtocolSessionManager protocolSessionManager = protocolManager.getProtocolSessionManagerWithContext(resourceIdTwo, netconfContext); // trick to avoid registration as alarm listener errors ((ProtocolSessionManager) protocolSessionManager).setEventManager(new MockEventManager()); IProtocolSession protocolSession = protocolSessionManager.obtainSessionByProtocol("netconf", false); String protocol = (String) protocolSession.getSessionContext().getSessionParameters().get(ProtocolSessionContext.PROTOCOL); String protocol_uri = (String) protocolSession.getSessionContext().getSessionParameters().get(ProtocolSessionContext.PROTOCOL_URI); Assert.assertSame("netconf", protocol); Assert.assertSame("mock://user:pass@serve", protocol_uri); } @Test public void obtainSessionsByProtocol() throws ProtocolException { IProtocolSession session1 = protocolSessionManager.obtainSessionByProtocol("netconf", true); Assert.assertEquals(1, protocolSessionManager.getAllProtocolSessionIds().size()); // adding another session with the same protocol (and context) reuses the session IProtocolSession session2 = protocolSessionManager.obtainSessionByProtocol("netconf", true); Assert.assertEquals(1, protocolSessionManager.getAllProtocolSessionIds().size()); } @Test public void getProtocolSessionsWithSameContext() throws ProtocolException { String resourceIdTwo = "randomDevice2"; netconfContext = new ProtocolSessionContext(); netconfContext.addParameter(ProtocolSessionContext.AUTH_TYPE, "password"); netconfContext.addParameter(ProtocolSessionContext.PROTOCOL, "netconf"); netconfContext.addParameter(ProtocolSessionContext.PROTOCOL_URI, "mock://user:pass@serve"); IProtocolSessionManager protocolSessionManager = protocolManager.getProtocolSessionManagerWithContext(resourceIdTwo, netconfContext); // trick to avoid registration as alarm listener errors ((ProtocolSessionManager) protocolSessionManager).setEventManager(new MockEventManager()); IProtocolSession protocolSession1 = protocolSessionManager.obtainSessionByProtocol("netconf", false); IProtocolSession protocolSession2 = protocolSessionManager.obtainSessionByProtocol("netconf", false); IProtocolSession protocolSession3 = protocolSessionManager.obtainSession(netconfContext, false); IProtocolSession protocolSession4 = protocolSessionManager.obtainSession(netconfContext, false); // only 1 session per context is created. Assert.assertEquals(1, protocolSessionManager.getAllProtocolSessionIds().size()); // The session is reused Assert.assertEquals(protocolSession1, protocolSession2); Assert.assertEquals(protocolSession1, protocolSession3); } @Test public void getProtocolSessionsWithDifferentContexts() throws ProtocolException { String resourceIdThree = "randomDevice3"; // With two different contexts with the same protocol: netconfContext1 and netconfContext2 // only the second one should be registered ProtocolSessionContext netconfContext1 = new ProtocolSessionContext(); netconfContext1.addParameter(ProtocolSessionContext.AUTH_TYPE, "password"); netconfContext1.addParameter(ProtocolSessionContext.PROTOCOL, "netconf"); netconfContext1.addParameter(ProtocolSessionContext.PROTOCOL_URI, "mock://user:pass@serve"); ProtocolSessionContext netconfContext2 = new ProtocolSessionContext(); netconfContext2.addParameter(ProtocolSessionContext.AUTH_TYPE, "password"); netconfContext2.addParameter(ProtocolSessionContext.PROTOCOL, "netconf"); netconfContext2.addParameter(ProtocolSessionContext.PROTOCOL_URI, "mock://user:pass@serve"); netconfContext2.addParameter(ProtocolSessionContext.KEY_USERNAME, "pocahontas"); // netconfContext1 IProtocolSessionManager protocolSessionManager = protocolManager.getProtocolSessionManagerWithContext(resourceIdThree, netconfContext1); // trick to avoid registration as alarm listener errors ((ProtocolSessionManager) protocolSessionManager).setEventManager(new MockEventManager()); IProtocolSession protocolSession1 = protocolSessionManager.obtainSession(netconfContext1, false); Assert.assertEquals(1, protocolSessionManager.getAllProtocolSessionIds().size()); // netconfContext2: register with a new context using the same protocol. Only the second context should be registered protocolSessionManager.registerContext(netconfContext2); Assert.assertEquals("Only 1 context with the same protocol allowed ", 1, protocolSessionManager.getRegisteredContexts().size()); Assert.assertTrue("Only 2nd context is registered ", protocolSessionManager.getRegisteredContexts().contains(netconfContext2)); // and only one session should be created IProtocolSession protocolSession2 = protocolSessionManager.obtainSession(netconfContext, false); Assert.assertEquals(1, protocolSessionManager.getAllProtocolSessionIds().size()); // Registering with New context with different protocol should be allowed mockContext = new ProtocolSessionContext(); mockContext.addParameter(ProtocolSessionContext.PROTOCOL, "mock"); mockContext.addParameter(ProtocolSessionContext.PROTOCOL_URI, "freeFormString"); // Both contexts should be registered protocolSessionManager.registerContext(mockContext); Assert.assertEquals("2 contexts with different protocols allowed", 2, protocolSessionManager.getRegisteredContexts().size()); Assert.assertTrue(protocolSessionManager.getRegisteredContexts().contains(mockContext)); Assert.assertTrue(protocolSessionManager.getRegisteredContexts().contains(netconfContext2)); // and two sessions should be created IProtocolSession protocolSession3 = protocolSessionManager.obtainSession(mockContext, false); Assert.assertEquals(2, protocolSessionManager.getAllProtocolSessionIds().size()); } }