+package org.opendaylight.controller.config.threadpool.flexible;\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.FlexibleThreadPoolModuleFactory;\r
+import org.opendaylight.controller.config.yang.threadpool.impl.FlexibleThreadPoolModuleMXBean;\r
+import org.opendaylight.controller.config.yang.threadpool.impl.NamingThreadFactoryModuleFactory;\r
+import org.opendaylight.controller.config.yang.threadpool.impl.NamingThreadFactoryModuleMXBean;\r
+\r
+public class FlexibleThreadPoolConfigBeanTest extends AbstractConfigTest {\r
+\r
+ private FlexibleThreadPoolModuleFactory flexibleFactory;\r
+ private final String instanceName = "flexible1";\r
+ private final String threadFactoryName = "threadFactoryName";\r
+\r
+ @Before\r
+ public void setUp() {\r
+\r
+ flexibleFactory = new FlexibleThreadPoolModuleFactory();\r
+ super.initConfigTransactionManagerImpl(new HardcodedModuleFactoriesResolver(flexibleFactory,\r
+ new NamingThreadFactoryModuleFactory()));\r
+ }\r
+\r
+ @Test\r
+ public void testCreateBean() throws InstanceAlreadyExistsException, ValidationException,\r
+ ConflictingVersionException {\r
+ ConfigTransactionJMXClient transaction = configRegistryClient.createTransaction();\r
+\r
+ createFlexible(transaction, instanceName, threadFactoryName, 1, 20, 20);\r
+ transaction.validateConfig();\r
+ CommitStatus status = transaction.commit();\r
+\r
+ assertBeanCount(1, flexibleFactory.getImplementationName());\r
+ assertStatus(status, 2, 0, 0);\r
+ }\r
+\r
+ @Test\r
+ public void testReusingOldInstance() throws InstanceAlreadyExistsException, ConflictingVersionException,\r
+ ValidationException {\r
+\r
+ ConfigTransactionJMXClient transaction = configRegistryClient.createTransaction();\r
+ createFlexible(transaction, instanceName, threadFactoryName, 1, 20, 10);\r
+\r
+ transaction.commit();\r
+\r
+ assertBeanCount(1, flexibleFactory.getImplementationName());\r
+\r
+ transaction = configRegistryClient.createTransaction();\r
+ CommitStatus status = transaction.commit();\r
+\r
+ assertBeanCount(1, flexibleFactory.getImplementationName());\r
+ assertStatus(status, 0, 0, 2);\r
+\r
+ }\r
+\r
+ @Test\r
+ public void testInstanceAlreadyExistsException() throws ConflictingVersionException, ValidationException {\r
+ ConfigTransactionJMXClient transaction = configRegistryClient.createTransaction();\r
+\r
+ try {\r
+ createFlexible(transaction, instanceName, threadFactoryName, 1, 1, 2);\r
+ transaction.commit();\r
+ } catch (InstanceAlreadyExistsException e1) {\r
+ fail();\r
+ }\r
+\r
+ transaction = configRegistryClient.createTransaction();\r
+ try {\r
+ createFlexible(transaction, instanceName, "threadFactoryName1", 2, 2, 2);\r
+ fail();\r
+ } catch (InstanceAlreadyExistsException e) {\r
+ assertThat(\r
+ e.getMessage(),\r
+ containsString("There is an instance registered with name ModuleIdentifier{factoryName='threadpool-flexible', instanceName='flexible1'}"));\r
+ }\r
+ }\r
+\r
+ @Test\r
+ public void testValidationException() throws InstanceAlreadyExistsException {\r
+ ConfigTransactionJMXClient transaction = configRegistryClient.createTransaction();\r
+\r
+ createFlexible(transaction, instanceName, threadFactoryName, 0, 10, 10);\r
+\r
+ try {\r
+ transaction.validateConfig();\r
+ fail();\r
+ } catch (ValidationException e) {\r
+ assertThat(e.getMessage(), containsString("MinThreadCount must be greater than zero"));\r
+ }\r
+ }\r
+\r
+ @Test\r
+ public void testValidationException2() throws InstanceAlreadyExistsException {\r
+ ConfigTransactionJMXClient transaction = configRegistryClient.createTransaction();\r
+\r
+ createFlexible(transaction, instanceName, threadFactoryName, 0, 0, 10);\r
+\r
+ try {\r
+ transaction.validateConfig();\r
+ fail();\r
+ } catch (ValidationException e) {\r
+ assertThat(e.getMessage(), containsString("KeepAliveMillis must be greater than zero"));\r
+ }\r
+ }\r
+\r
+ @Test\r
+ public void testValidationException3() throws InstanceAlreadyExistsException {\r
+ ConfigTransactionJMXClient transaction = configRegistryClient.createTransaction();\r
+\r
+ createFlexible(transaction, instanceName, threadFactoryName, 10, 50, 0);\r
+\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 createFlexible(ConfigTransactionJMXClient transaction, String instanceName,\r
+ String threadFactoryName, int minThreadCount, long keepAliveMillis, int maxThreadCount)\r
+ throws InstanceAlreadyExistsException {\r
+\r
+ ObjectName threadFactoryON = transaction.createModule(NamingThreadFactoryModuleFactory.NAME, threadFactoryName);\r
+ NamingThreadFactoryModuleMXBean namingThreadFactoryModuleMXBean = transaction.newMXBeanProxy(threadFactoryON,\r
+ NamingThreadFactoryModuleMXBean.class);\r
+ namingThreadFactoryModuleMXBean.setNamePrefix("prefix");\r
+\r
+ ObjectName flexibleON = transaction.createModule(flexibleFactory.getImplementationName(), instanceName);\r
+ FlexibleThreadPoolModuleMXBean mxBean = transaction.newMBeanProxy(flexibleON,\r
+ FlexibleThreadPoolModuleMXBean.class);\r
+ mxBean.setKeepAliveMillis(keepAliveMillis);\r
+ mxBean.setMaxThreadCount(maxThreadCount);\r
+ mxBean.setMinThreadCount(minThreadCount);\r
+ mxBean.setThreadFactory(threadFactoryON);\r
+ return flexibleON;\r
+ }\r
+\r
+ @Test\r
+ public void testReconfigurationInstance() throws InstanceAlreadyExistsException, ValidationException,\r
+ ConflictingVersionException, InstanceNotFoundException {\r
+ ConfigTransactionJMXClient transaction = configRegistryClient.createTransaction();\r
+ createFlexible(transaction, instanceName, threadFactoryName, 2, 2, 2);\r
+\r
+ transaction.commit();\r
+\r
+ transaction = configRegistryClient.createTransaction();\r
+ ObjectName databaseNew = transaction.lookupConfigBean(flexibleFactory.getImplementationName(), instanceName);\r
+ FlexibleThreadPoolModuleMXBean proxy = transaction.newMXBeanProxy(databaseNew,\r
+ FlexibleThreadPoolModuleMXBean.class);\r
+ proxy.setMaxThreadCount(99);\r
+\r
+ CommitStatus status = transaction.commit();\r
+\r
+ assertBeanCount(1, flexibleFactory.getImplementationName());\r
+ assertStatus(status, 0, 1, 1);\r
+ }\r
+\r
+}\r