2 * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.controller.config.threadpool.fixed;
10 import static org.hamcrest.CoreMatchers.containsString;
11 import static org.junit.Assert.assertEquals;
12 import static org.junit.Assert.assertThat;
13 import static org.junit.Assert.fail;
15 import java.lang.management.ManagementFactory;
16 import java.lang.management.ThreadInfo;
17 import java.lang.management.ThreadMXBean;
18 import java.util.ArrayList;
19 import java.util.List;
20 import javax.management.InstanceAlreadyExistsException;
21 import javax.management.InstanceNotFoundException;
22 import javax.management.ObjectName;
23 import org.junit.Before;
24 import org.junit.Test;
25 import org.opendaylight.controller.config.api.ConflictingVersionException;
26 import org.opendaylight.controller.config.api.ValidationException;
27 import org.opendaylight.controller.config.api.jmx.CommitStatus;
28 import org.opendaylight.controller.config.manager.impl.AbstractConfigTest;
29 import org.opendaylight.controller.config.manager.impl.factoriesresolver.HardcodedModuleFactoriesResolver;
30 import org.opendaylight.controller.config.util.ConfigTransactionJMXClient;
31 import org.opendaylight.controller.config.yang.threadpool.impl.NamingThreadFactoryModuleFactory;
32 import org.opendaylight.controller.config.yang.threadpool.impl.NamingThreadFactoryModuleMXBean;
33 import org.opendaylight.controller.config.yang.threadpool.impl.fixed.FixedThreadPoolModuleFactory;
34 import org.opendaylight.controller.config.yang.threadpool.impl.fixed.FixedThreadPoolModuleMXBean;
35 import org.slf4j.Logger;
36 import org.slf4j.LoggerFactory;
38 public class FixedThreadPoolConfigBeanTest extends AbstractConfigTest {
39 private static final Logger LOG = LoggerFactory.getLogger(FixedThreadPoolConfigBeanTest.class);
41 private FixedThreadPoolModuleFactory factory;
42 private final String nameInstance = "fixedInstance";
43 private ObjectName threadFactoryON;
47 factory = new FixedThreadPoolModuleFactory();
48 super.initConfigTransactionManagerImpl(new HardcodedModuleFactoriesResolver(mockedContext, factory,
49 new NamingThreadFactoryModuleFactory()));
53 public void testCreateBean() throws InstanceAlreadyExistsException, ValidationException,
54 ConflictingVersionException {
55 ConfigTransactionJMXClient transaction = configRegistryClient.createTransaction();
56 createFixed(transaction, nameInstance, 2, nameInstance);
58 transaction.validateConfig();
59 CommitStatus status = transaction.commit();
61 assertBeanCount(1, factory.getImplementationName());
62 assertStatus(status, 2, 0, 0);
66 public void testReusingOldInstance() throws InstanceAlreadyExistsException, ConflictingVersionException,
68 ConfigTransactionJMXClient transaction = configRegistryClient.createTransaction();
69 createFixed(transaction, nameInstance, 4, nameInstance);
71 transaction.validateConfig();
74 assertBeanCount(1, factory.getImplementationName());
76 transaction = configRegistryClient.createTransaction();
77 NamingThreadFactoryModuleMXBean namingThreadFactoryModuleMXBean = transaction.newMXBeanProxy(threadFactoryON, NamingThreadFactoryModuleMXBean.class);
78 namingThreadFactoryModuleMXBean.setNamePrefix("newPrefix");
79 CommitStatus status = transaction.commit();
81 assertBeanCount(1, factory.getImplementationName());
82 assertStatus(status, 0, 2, 0);
86 public void testNegative() throws ConflictingVersionException, ValidationException, InstanceAlreadyExistsException {
87 ConfigTransactionJMXClient transaction = configRegistryClient.createTransaction();
89 createFixed(transaction, nameInstance, 5, nameInstance);
92 transaction = configRegistryClient.createTransaction();
94 createFixed(transaction, nameInstance, 0, nameInstance);
96 } catch (InstanceAlreadyExistsException e) {
99 containsString("There is an instance registered with name ModuleIdentifier{factoryName='threadpool-fixed', instanceName='fixedInstance'}"));
103 private int countThreadsByPrefix(String prefix) {
104 ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
106 List<String> names = new ArrayList<>();
107 for (ThreadInfo threadInfo : threadMXBean.dumpAllThreads(false, false)) {
108 names.add(threadInfo.getThreadName());
109 if (threadInfo.getThreadName().startsWith(prefix)) {
113 LOG.info("Current threads {}", names);
118 public void testDestroy() throws InstanceAlreadyExistsException, ValidationException, ConflictingVersionException,
119 InstanceNotFoundException, InterruptedException {
121 String prefix = org.apache.commons.lang3.RandomStringUtils.randomAlphabetic(10);
123 int numberOfThreads = 100;
124 int threadCount1 = countThreadsByPrefix(prefix);
125 assertEquals(0, threadCount1);
126 ConfigTransactionJMXClient transaction = configRegistryClient.createTransaction();
128 createFixed(transaction, nameInstance, numberOfThreads, prefix);
129 transaction.commit();
130 int threadCount2 = countThreadsByPrefix(prefix);
131 assertEquals(numberOfThreads, threadCount2);
133 transaction = configRegistryClient.createTransaction();
134 transaction.destroyModule(factory.getImplementationName(), nameInstance);
135 CommitStatus status = transaction.commit();
137 assertBeanCount(0, factory.getImplementationName());
138 assertStatus(status, 0, 0, 1);
140 for (int i = 0; i < 60; i++) {
141 if (countThreadsByPrefix(prefix) == 0) {
146 assertEquals(0, countThreadsByPrefix(prefix));
150 public void testValidationException() throws InstanceAlreadyExistsException {
151 ConfigTransactionJMXClient transaction = configRegistryClient.createTransaction();
152 createFixed(transaction, nameInstance, -1, nameInstance);
154 transaction.validateConfig();
156 } catch (ValidationException e) {
157 assertThat(e.getMessage(), containsString("MaxThreadCount must be greater than zero"));
161 private ObjectName createFixed(ConfigTransactionJMXClient transaction, String name, int numberOfThreads, String prefix)
162 throws InstanceAlreadyExistsException {
163 ObjectName nameCreated = transaction.createModule(factory.getImplementationName(), name);
164 FixedThreadPoolModuleMXBean mxBean = transaction.newMXBeanProxy(nameCreated, FixedThreadPoolModuleMXBean.class);
165 mxBean.setMaxThreadCount(numberOfThreads);
167 threadFactoryON = transaction.createModule(NamingThreadFactoryModuleFactory.NAME, "naming");
168 NamingThreadFactoryModuleMXBean namingThreadFactoryModuleMXBean = transaction.newMXBeanProxy(threadFactoryON,
169 NamingThreadFactoryModuleMXBean.class);
170 namingThreadFactoryModuleMXBean.setNamePrefix(prefix);
172 mxBean.setThreadFactory(threadFactoryON);