99368239737b3995e931b895a73eaa109f8b3f7d
[controller.git] / opendaylight / config / netty-timer-config / src / test / java / org / opendaylight / controller / config / yang / netty / timer / HashedWheelTimerModuleTest.java
1 /*
2  * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.
3  *
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
7  */
8 package org.opendaylight.controller.config.yang.netty.timer;
9
10 import static org.junit.Assert.assertTrue;
11 import static org.junit.Assert.fail;
12 import static org.mockito.Matchers.any;
13 import static org.mockito.Matchers.anyString;
14 import static org.mockito.Mockito.doNothing;
15 import static org.mockito.Mockito.doReturn;
16 import static org.mockito.Mockito.mock;
17 import io.netty.util.Timer;
18 import javax.management.InstanceAlreadyExistsException;
19 import javax.management.InstanceNotFoundException;
20 import javax.management.ObjectName;
21 import org.junit.Before;
22 import org.junit.Test;
23 import org.opendaylight.controller.config.api.ConflictingVersionException;
24 import org.opendaylight.controller.config.api.ValidationException;
25 import org.opendaylight.controller.config.api.jmx.CommitStatus;
26 import org.opendaylight.controller.config.manager.impl.AbstractConfigTest;
27 import org.opendaylight.controller.config.manager.impl.factoriesresolver.HardcodedModuleFactoriesResolver;
28 import org.opendaylight.controller.config.util.ConfigTransactionJMXClient;
29 import org.opendaylight.controller.config.yang.threadpool.impl.NamingThreadFactoryModuleFactory;
30 import org.opendaylight.controller.config.yang.threadpool.impl.NamingThreadFactoryModuleMXBean;
31 import org.osgi.framework.Filter;
32 import org.osgi.framework.ServiceListener;
33 import org.osgi.framework.ServiceReference;
34
35 public class HashedWheelTimerModuleTest extends AbstractConfigTest {
36
37     private HashedWheelTimerModuleFactory factory;
38     private NamingThreadFactoryModuleFactory threadFactory;
39     private final String instanceName = "hashed-wheel-timer1";
40
41     @SuppressWarnings({ "rawtypes", "unchecked" })
42     @Before
43     public void setUp() throws Exception {
44         factory = new HashedWheelTimerModuleFactory();
45         threadFactory = new NamingThreadFactoryModuleFactory();
46         super.initConfigTransactionManagerImpl(new HardcodedModuleFactoriesResolver(mockedContext, factory, threadFactory));
47
48         Filter mockFilter = mock(Filter.class);
49         doReturn("mock").when(mockFilter).toString();
50         doReturn(mockFilter).when(mockedContext).createFilter(anyString());
51         doNothing().when(mockedContext).addServiceListener(any(ServiceListener.class), anyString());
52         ServiceReference mockServiceRef = mock(ServiceReference.class);
53         doReturn(new ServiceReference[]{mockServiceRef}).when(mockedContext).
54                 getServiceReferences(anyString(), anyString());
55         doReturn(mock(Timer.class)).when(mockedContext).getService(mockServiceRef);
56     }
57
58     public void testValidationExceptionTickDuration() throws InstanceAlreadyExistsException {
59         ConfigTransactionJMXClient transaction = configRegistryClient.createTransaction();
60         try {
61             createInstance(transaction, instanceName, 0L, 10, true);
62             transaction.validateConfig();
63             fail();
64         } catch (ValidationException e) {
65             assertTrue(e.getMessage().contains("TickDuration value must be greater than 0"));
66         }
67     }
68
69     public void testValidationExceptionTicksPerWheel() throws InstanceAlreadyExistsException {
70         ConfigTransactionJMXClient transaction = configRegistryClient.createTransaction();
71         try {
72             createInstance(transaction, instanceName, 500L, 0, true);
73             transaction.validateConfig();
74             fail();
75         } catch (ValidationException e) {
76             assertTrue(e.getMessage().contains("TicksPerWheel value must be greater than 0"));
77         }
78     }
79
80     @Test
81     public void testCreateBean() throws InstanceAlreadyExistsException, ValidationException,
82             ConflictingVersionException {
83         ConfigTransactionJMXClient transaction = configRegistryClient.createTransaction();
84
85         createInstance(transaction, instanceName, 500L, 10, true);
86         createInstance(transaction, instanceName + 1, null, null, false);
87         createInstance(transaction, instanceName + 2, 500L, 10, false);
88         createInstance(transaction, instanceName + 3, 500L, null, false);
89         transaction.validateConfig();
90         CommitStatus status = transaction.commit();
91
92         assertBeanCount(4, factory.getImplementationName());
93         assertStatus(status, 5, 0, 0);
94     }
95
96     @Test
97     public void testReusingOldInstance() throws InstanceAlreadyExistsException, ConflictingVersionException,
98             ValidationException {
99
100         ConfigTransactionJMXClient transaction = configRegistryClient.createTransaction();
101         createInstance(transaction, instanceName, 500L, 10, true);
102
103         transaction.commit();
104
105         transaction = configRegistryClient.createTransaction();
106         assertBeanCount(1, factory.getImplementationName());
107         CommitStatus status = transaction.commit();
108
109         assertBeanCount(1, factory.getImplementationName());
110         assertStatus(status, 0, 0, 2);
111     }
112
113     @Test
114     public void testReconfigure() throws InstanceAlreadyExistsException, ConflictingVersionException,
115             ValidationException, InstanceNotFoundException {
116
117         ConfigTransactionJMXClient transaction = configRegistryClient.createTransaction();
118         createInstance(transaction, instanceName, 500L, 10, true);
119         transaction.commit();
120
121         transaction = configRegistryClient.createTransaction();
122         assertBeanCount(1, factory.getImplementationName());
123         HashedWheelTimerModuleMXBean mxBean = transaction.newMBeanProxy(
124                 transaction.lookupConfigBean(factory.getImplementationName(), instanceName),
125                 HashedWheelTimerModuleMXBean.class);
126         mxBean.setTicksPerWheel(20);
127         CommitStatus status = transaction.commit();
128
129         assertBeanCount(1, factory.getImplementationName());
130         assertStatus(status, 0, 1, 1);
131     }
132
133     private ObjectName createInstance(final ConfigTransactionJMXClient transaction, final String instanceName,
134             final Long tickDuration, final Integer ticksPerWheel, final boolean hasThreadfactory)
135             throws InstanceAlreadyExistsException {
136         ObjectName nameCreated = transaction.createModule(factory.getImplementationName(), instanceName);
137         HashedWheelTimerModuleMXBean mxBean = transaction
138                 .newMBeanProxy(nameCreated, HashedWheelTimerModuleMXBean.class);
139         mxBean.setTickDuration(tickDuration);
140         mxBean.setTicksPerWheel(ticksPerWheel);
141         if (hasThreadfactory) {
142             mxBean.setThreadFactory(createThreadfactoryInstance(transaction, "thread-factory1", "th"));
143         }
144         return nameCreated;
145     }
146
147     private ObjectName createThreadfactoryInstance(final ConfigTransactionJMXClient transaction, final String instanceName,
148             final String namePrefix) throws InstanceAlreadyExistsException {
149         ObjectName nameCreated = transaction.createModule(threadFactory.getImplementationName(), instanceName);
150         NamingThreadFactoryModuleMXBean mxBean = transaction.newMBeanProxy(nameCreated,
151                 NamingThreadFactoryModuleMXBean.class);
152         mxBean.setNamePrefix(namePrefix);
153         return nameCreated;
154     }
155
156 }