package alma.acs.monitoring.controller; import java.util.HashMap; import java.util.Map; import java.util.concurrent.ThreadFactory; import java.util.logging.Logger; import org.junit.After; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TestName; import alma.ACS.ComponentStates; import alma.JavaContainerError.wrappers.AcsJContainerServicesEx; import alma.MonitorArchiver.BlobberHelper; import alma.MonitorArchiver.BlobberOperations; import alma.MonitorArchiver.CollectorListStatus; import alma.acs.container.CleaningDaemonThreadFactory; import alma.acs.container.testsupport.DummyContainerServices; import alma.acs.logging.ClientLogManager; /** * Stand-alone test for the Controller component impl class {@link ControllerImpl}. * Dependencies on ContainerServices and other components are satisfied with mocks. */ public class ControllerImplTest { private Logger logger; private TestControllerImpl controllerImpl; private MockContainerServices cs; @Rule public TestName name = new TestName(); @Before public void setUp() throws Exception { String testMethodName = name.getMethodName(); String testFullName = ControllerImplTest.class.getSimpleName() + "#" + testMethodName; // this allows individual log level control System.setProperty("ACS.log.minlevel.namedloggers", "ControllerImpl=2,99" + ":MockBlobber=2,99" + ":alma.acs.logging=5,99" + ":alma.acs.logging.config.LogConfig=5,99"); logger = ClientLogManager.getAcsLogManager().getLoggerForApplication(testFullName, false); logger.info("----------- setUp for '" + name.getMethodName() + "' -----------"); String compName = ControllerImpl.class.getSimpleName(); cs = new MockContainerServices(compName); controllerImpl = new TestControllerImpl(); } @After public void tearDown() throws Exception { logger.info("----------- tearDown for '" + name.getMethodName() + "' -----------"); controllerImpl.cleanUp(); } /** * @throws Exception * */ @Test public void testSimpleRegistration() throws Exception { // configured blobbers String blobberName1 = "blobber1"; String blobberName2 = "blobber2"; cs.setConfiguredBlobberCompNames(new String[] {blobberName1, blobberName2}); // running blobbers controllerImpl.addMockBlobber(new MockBlobber(blobberName1)); controllerImpl.initialize(cs); String collectorName1 = "collector1"; controllerImpl.registerCollector(collectorName1); } /** * Component impl subclass that allows test / mock control, * in conjunction with {@link MockContainerServices}. */ private static class TestControllerImpl extends ControllerImpl { private final Map<String, MockBlobber> mockBlobberInstances = new HashMap<String, MockBlobber>(); @Override protected BlobberOperations getBlobberRefFromContainerServices(String blobberName) { return mockBlobberInstances.get(blobberName); } void addMockBlobber(MockBlobber mockBlobber) { mockBlobberInstances.put(mockBlobber.name(), mockBlobber); } } private static class MockBlobber implements BlobberOperations { private final String name; private final Logger logger; MockBlobber(String name) { this.name = name; this.logger = ClientLogManager.getAcsLogManager().getLoggerForApplication(MockBlobber.class.getSimpleName(), false); } @Override public CollectorListStatus addCollector(String inComponentName) { logger.info("addCollector called with collectorName=" + inComponentName); return CollectorListStatus.ADDED; } @Override public CollectorListStatus containsCollector(String inComponentName) { return null; } @Override public CollectorListStatus removeCollector(String inComponentName) { return null; } @Override public ComponentStates componentState() { return ComponentStates.COMPSTATE_OPERATIONAL; } @Override public String name() { return name; } } /** * */ private static class MockContainerServices extends DummyContainerServices { private String[] blobberCompNames; private final ThreadFactory tf; public MockContainerServices(String name) { super(name, ClientLogManager.getAcsLogManager().getLoggerForApplication(name, false)); tf = new CleaningDaemonThreadFactory(name, logger); } void setConfiguredBlobberCompNames(String[] blobberCompNames) { this.blobberCompNames = blobberCompNames; } @Override public String[] findComponents(String curlWildcard, String typeWildcard) throws AcsJContainerServicesEx { if (curlWildcard == null && typeWildcard.equals(BlobberHelper.id())) { return blobberCompNames; } else { return super.findComponents(curlWildcard, typeWildcard); } } @Override public void releaseComponent(String componentUrl, ComponentReleaseCallback callback) { if (callback == null) { logger.info("CS: Async release of component '" + componentUrl + "'."); } else { super.releaseComponent(componentUrl, callback); } } @Override public ThreadFactory getThreadFactory() { logger.finer("CS: getThreadFactory() called"); return tf; } } }