Merge "BUG-625: migrate InventoryAndReadAdapter"
[controller.git] / opendaylight / config / threadpool-config-impl / src / test / java / org / opendaylight / controller / config / threadpool / fixed / FixedThreadPoolConfigBeanTest.java
index 4fda06bf4c27cebb6a211c96f285124c847759f6..62b295be8d1c53e8b648f7c352ab9b0c5244e875 100644 (file)
-package org.opendaylight.controller.config.threadpool.fixed;\r
-\r
-import static org.junit.Assert.assertThat;\r
-import static org.junit.Assert.fail;\r
-import static org.junit.matchers.JUnitMatchers.containsString;\r
-\r
-import javax.management.InstanceAlreadyExistsException;\r
-import javax.management.InstanceNotFoundException;\r
-import javax.management.ObjectName;\r
-\r
-import org.junit.Before;\r
-import org.junit.Test;\r
-import org.opendaylight.controller.config.api.ConflictingVersionException;\r
-import org.opendaylight.controller.config.api.ValidationException;\r
-import org.opendaylight.controller.config.api.jmx.CommitStatus;\r
-import org.opendaylight.controller.config.manager.impl.AbstractConfigTest;\r
-import org.opendaylight.controller.config.manager.impl.factoriesresolver.HardcodedModuleFactoriesResolver;\r
-import org.opendaylight.controller.config.util.ConfigTransactionJMXClient;\r
-import org.opendaylight.controller.config.yang.threadpool.impl.FixedThreadPoolModuleFactory;\r
-import org.opendaylight.controller.config.yang.threadpool.impl.FixedThreadPoolModuleMXBean;\r
-import org.opendaylight.controller.config.yang.threadpool.impl.NamingThreadFactoryModuleFactory;\r
-import org.opendaylight.controller.config.yang.threadpool.impl.NamingThreadFactoryModuleMXBean;\r
-\r
-public class FixedThreadPoolConfigBeanTest extends AbstractConfigTest {\r
-\r
-    private FixedThreadPoolModuleFactory factory;\r
-    private final String nameInstance = "fixedInstance";\r
-\r
-    @Before\r
-    public void setUp() {\r
-        factory = new FixedThreadPoolModuleFactory();\r
-        super.initConfigTransactionManagerImpl(new HardcodedModuleFactoriesResolver(factory,\r
-                new NamingThreadFactoryModuleFactory()));\r
-    }\r
-\r
-    @Test\r
-    public void testCreateBean() throws InstanceAlreadyExistsException, ValidationException,\r
-            ConflictingVersionException {\r
-        ConfigTransactionJMXClient transaction = configRegistryClient.createTransaction();\r
-        createFixed(transaction, nameInstance, 2);\r
-\r
-        transaction.validateConfig();\r
-        CommitStatus status = transaction.commit();\r
-\r
-        assertBeanCount(1, factory.getImplementationName());\r
-        assertStatus(status, 2, 0, 0);\r
-    }\r
-\r
-    @Test\r
-    public void testReusingOldInstance() throws InstanceAlreadyExistsException, ConflictingVersionException,\r
-            ValidationException {\r
-        ConfigTransactionJMXClient transaction = configRegistryClient.createTransaction();\r
-        createFixed(transaction, nameInstance, 4);\r
-\r
-        transaction.validateConfig();\r
-        transaction.commit();\r
-\r
-        assertBeanCount(1, factory.getImplementationName());\r
-\r
-        transaction = configRegistryClient.createTransaction();\r
-        CommitStatus status = transaction.commit();\r
-\r
-        assertBeanCount(1, factory.getImplementationName());\r
-        assertStatus(status, 0, 0, 2);\r
-    }\r
-\r
-    @Test\r
-    public void testNegative() throws ConflictingVersionException, ValidationException, InstanceAlreadyExistsException {\r
-        ConfigTransactionJMXClient transaction = configRegistryClient.createTransaction();\r
-\r
-        createFixed(transaction, nameInstance, 5);\r
-        transaction.commit();\r
-\r
-        transaction = configRegistryClient.createTransaction();\r
-        try {\r
-            createFixed(transaction, nameInstance, 0);\r
-            fail();\r
-        } catch (InstanceAlreadyExistsException e) {\r
-            assertThat(\r
-                    e.getMessage(),\r
-                    containsString("There is an instance registered with name ModuleIdentifier{factoryName='threadpool-fixed', instanceName='fixedInstance'}"));\r
-        }\r
-    }\r
-\r
-    @Test\r
-    public void testDestroy() throws InstanceAlreadyExistsException, ValidationException, ConflictingVersionException,\r
-            InstanceNotFoundException {\r
-        ConfigTransactionJMXClient transaction = configRegistryClient.createTransaction();\r
-        createFixed(transaction, nameInstance, 1);\r
-\r
-        transaction.commit();\r
-\r
-        transaction = configRegistryClient.createTransaction();\r
-        transaction.destroyConfigBean(factory.getImplementationName(), nameInstance);\r
-        CommitStatus status = transaction.commit();\r
-\r
-        assertBeanCount(0, factory.getImplementationName());\r
-        assertStatus(status, 0, 0, 1);\r
-    }\r
-\r
-    @Test\r
-    public void testValidationException() throws InstanceAlreadyExistsException {\r
-        ConfigTransactionJMXClient transaction = configRegistryClient.createTransaction();\r
-        createFixed(transaction, nameInstance, -1);\r
-        try {\r
-            transaction.validateConfig();\r
-            fail();\r
-        } catch (ValidationException e) {\r
-            assertThat(e.getMessage(), containsString("MaxThreadCount must be greater than zero"));\r
-        }\r
-    }\r
-\r
-    private ObjectName createFixed(ConfigTransactionJMXClient transaction, String name, int numberOfThreads)\r
-            throws InstanceAlreadyExistsException {\r
-        ObjectName nameCreated = transaction.createModule(factory.getImplementationName(), name);\r
-        FixedThreadPoolModuleMXBean mxBean = transaction.newMXBeanProxy(nameCreated, FixedThreadPoolModuleMXBean.class);\r
-        mxBean.setMaxThreadCount(numberOfThreads);\r
-\r
-        ObjectName threadFactoryON = transaction.createModule(NamingThreadFactoryModuleFactory.NAME, "naming");\r
-        NamingThreadFactoryModuleMXBean namingThreadFactoryModuleMXBean = transaction.newMXBeanProxy(threadFactoryON,\r
-                NamingThreadFactoryModuleMXBean.class);\r
-        namingThreadFactoryModuleMXBean.setNamePrefix("prefix");\r
-\r
-        mxBean.setThreadFactory(threadFactoryON);\r
-\r
-        return nameCreated;\r
-    }\r
-\r
-}\r
+/*
+ * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.controller.config.threadpool.fixed;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.fail;
+import static org.junit.matchers.JUnitMatchers.containsString;
+
+import java.lang.management.ManagementFactory;
+import java.lang.management.ThreadInfo;
+import java.lang.management.ThreadMXBean;
+import java.util.ArrayList;
+import java.util.List;
+import javax.management.InstanceAlreadyExistsException;
+import javax.management.InstanceNotFoundException;
+import javax.management.ObjectName;
+import org.junit.Before;
+import org.junit.Test;
+import org.opendaylight.controller.config.api.ConflictingVersionException;
+import org.opendaylight.controller.config.api.ValidationException;
+import org.opendaylight.controller.config.api.jmx.CommitStatus;
+import org.opendaylight.controller.config.manager.impl.AbstractConfigTest;
+import org.opendaylight.controller.config.manager.impl.factoriesresolver.HardcodedModuleFactoriesResolver;
+import org.opendaylight.controller.config.util.ConfigTransactionJMXClient;
+import org.opendaylight.controller.config.yang.threadpool.impl.NamingThreadFactoryModuleFactory;
+import org.opendaylight.controller.config.yang.threadpool.impl.NamingThreadFactoryModuleMXBean;
+import org.opendaylight.controller.config.yang.threadpool.impl.fixed.FixedThreadPoolModuleFactory;
+import org.opendaylight.controller.config.yang.threadpool.impl.fixed.FixedThreadPoolModuleMXBean;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class FixedThreadPoolConfigBeanTest extends AbstractConfigTest {
+    private static final Logger logger = LoggerFactory.getLogger(FixedThreadPoolConfigBeanTest.class);
+
+    private FixedThreadPoolModuleFactory factory;
+    private final String nameInstance = "fixedInstance";
+
+    @Before
+    public void setUp() {
+        factory = new FixedThreadPoolModuleFactory();
+        super.initConfigTransactionManagerImpl(new HardcodedModuleFactoriesResolver(mockedContext, factory,
+                new NamingThreadFactoryModuleFactory()));
+    }
+
+    @Test
+    public void testCreateBean() throws InstanceAlreadyExistsException, ValidationException,
+            ConflictingVersionException {
+        ConfigTransactionJMXClient transaction = configRegistryClient.createTransaction();
+        createFixed(transaction, nameInstance, 2, nameInstance);
+
+        transaction.validateConfig();
+        CommitStatus status = transaction.commit();
+
+        assertBeanCount(1, factory.getImplementationName());
+        assertStatus(status, 2, 0, 0);
+    }
+
+    @Test
+    public void testReusingOldInstance() throws InstanceAlreadyExistsException, ConflictingVersionException,
+            ValidationException {
+        ConfigTransactionJMXClient transaction = configRegistryClient.createTransaction();
+        createFixed(transaction, nameInstance, 4, nameInstance);
+
+        transaction.validateConfig();
+        transaction.commit();
+
+        assertBeanCount(1, factory.getImplementationName());
+
+        transaction = configRegistryClient.createTransaction();
+        CommitStatus status = transaction.commit();
+
+        assertBeanCount(1, factory.getImplementationName());
+        assertStatus(status, 0, 0, 2);
+    }
+
+    @Test
+    public void testNegative() throws ConflictingVersionException, ValidationException, InstanceAlreadyExistsException {
+        ConfigTransactionJMXClient transaction = configRegistryClient.createTransaction();
+
+        createFixed(transaction, nameInstance, 5, nameInstance);
+        transaction.commit();
+
+        transaction = configRegistryClient.createTransaction();
+        try {
+            createFixed(transaction, nameInstance, 0, nameInstance);
+            fail();
+        } catch (InstanceAlreadyExistsException e) {
+            assertThat(
+                    e.getMessage(),
+                    containsString("There is an instance registered with name ModuleIdentifier{factoryName='threadpool-fixed', instanceName='fixedInstance'}"));
+        }
+    }
+
+    private int countThreadsByPrefix(String prefix) {
+        ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
+        int result = 0;
+        List<String> names = new ArrayList<>();
+        for (ThreadInfo threadInfo : threadMXBean.dumpAllThreads(false, false)) {
+            names.add(threadInfo.getThreadName());
+            if (threadInfo.getThreadName().startsWith(prefix)) {
+                result++;
+            }
+        }
+        logger.info("Current threads {}", names);
+        return result;
+    }
+
+    @Test
+    public void testDestroy() throws InstanceAlreadyExistsException, ValidationException, ConflictingVersionException,
+            InstanceNotFoundException, InterruptedException {
+
+        String prefix = org.apache.commons.lang3.RandomStringUtils.randomAlphabetic(10);
+
+        int numberOfThreads = 100;
+        int threadCount1 = countThreadsByPrefix(prefix);
+        assertEquals(0, threadCount1);
+        ConfigTransactionJMXClient transaction = configRegistryClient.createTransaction();
+
+        createFixed(transaction, nameInstance, numberOfThreads, prefix);
+        transaction.commit();
+        int threadCount2 = countThreadsByPrefix(prefix);
+        assertEquals(numberOfThreads, threadCount2);
+
+        transaction = configRegistryClient.createTransaction();
+        transaction.destroyModule(factory.getImplementationName(), nameInstance);
+        CommitStatus status = transaction.commit();
+
+        assertBeanCount(0, factory.getImplementationName());
+        assertStatus(status, 0, 0, 1);
+
+        for (int i = 0; i < 60; i++) {
+            if (countThreadsByPrefix(prefix) == 0) {
+                return;
+            }
+            Thread.sleep(1000);
+        }
+        assertEquals(0, countThreadsByPrefix(prefix));
+    }
+
+    @Test
+    public void testValidationException() throws InstanceAlreadyExistsException {
+        ConfigTransactionJMXClient transaction = configRegistryClient.createTransaction();
+        createFixed(transaction, nameInstance, -1, nameInstance);
+        try {
+            transaction.validateConfig();
+            fail();
+        } catch (ValidationException e) {
+            assertThat(e.getMessage(), containsString("MaxThreadCount must be greater than zero"));
+        }
+    }
+
+    private ObjectName createFixed(ConfigTransactionJMXClient transaction, String name, int numberOfThreads, String prefix)
+            throws InstanceAlreadyExistsException {
+        ObjectName nameCreated = transaction.createModule(factory.getImplementationName(), name);
+        FixedThreadPoolModuleMXBean mxBean = transaction.newMXBeanProxy(nameCreated, FixedThreadPoolModuleMXBean.class);
+        mxBean.setMaxThreadCount(numberOfThreads);
+
+        ObjectName threadFactoryON = transaction.createModule(NamingThreadFactoryModuleFactory.NAME, "naming");
+        NamingThreadFactoryModuleMXBean namingThreadFactoryModuleMXBean = transaction.newMXBeanProxy(threadFactoryON,
+                NamingThreadFactoryModuleMXBean.class);
+        namingThreadFactoryModuleMXBean.setNamePrefix(prefix);
+
+        mxBean.setThreadFactory(threadFactoryON);
+
+        return nameCreated;
+    }
+
+}