Persist service references as separate MBeans.
[controller.git] / opendaylight / config / config-manager / src / test / java / org / opendaylight / controller / config / manager / impl / dependencyresolver / DependencyResolverManagerTest.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.manager.impl.dependencyresolver;
9
10 import static org.junit.Assert.assertEquals;
11 import static org.mockito.Mockito.doNothing;
12 import static org.mockito.Mockito.doReturn;
13 import static org.mockito.Mockito.mock;
14 import static org.mockito.Mockito.reset;
15
16 import java.util.Arrays;
17 import java.util.List;
18
19 import org.junit.Before;
20 import org.junit.Test;
21 import org.opendaylight.controller.config.api.JmxAttribute;
22 import org.opendaylight.controller.config.api.ModuleIdentifier;
23 import org.opendaylight.controller.config.api.ServiceReferenceReadableRegistry;
24 import org.opendaylight.controller.config.api.jmx.ObjectNameUtil;
25 import org.opendaylight.controller.config.manager.impl.ModuleInternalTransactionalInfo;
26 import org.opendaylight.controller.config.manager.impl.TransactionStatus;
27 import org.opendaylight.controller.config.spi.Module;
28
29 public class DependencyResolverManagerTest {
30
31     final ModuleIdentifier apspName = new ModuleIdentifier("apsp", "apsp"); // depends
32                                                                             // on:
33     final ModuleIdentifier threadPoolName = new ModuleIdentifier("threadpool",
34             "threadpool"); // depends on:
35     final ModuleIdentifier threadFactoryName = new ModuleIdentifier(
36             "threadfactory", "threadfactory");
37
38     private DependencyResolverManager tested;
39     TransactionStatus transactionStatus;
40
41     @Before
42     public void setUp() {
43         transactionStatus = mock(TransactionStatus.class);
44         ServiceReferenceReadableRegistry mockedRegistry = mock(ServiceReferenceReadableRegistry.class);
45         tested = new DependencyResolverManager("txName", transactionStatus, mockedRegistry);
46         doNothing().when(transactionStatus).checkCommitStarted();
47         doNothing().when(transactionStatus).checkNotCommitted();
48     }
49
50     @Test
51     public void testOrdering() {
52         DependencyResolverImpl apspDRI = tested.getOrCreate(apspName);
53         mockGetInstance(tested, apspName);
54         DependencyResolverImpl threadPoolDRI = tested
55                 .getOrCreate(threadPoolName);
56         mockGetInstance(tested, threadPoolName);
57         tested.getOrCreate(threadFactoryName);
58         mockGetInstance(tested, threadFactoryName);
59
60         // set threadfactory as dependency of threadpool
61         declareDependency(threadPoolDRI, threadFactoryName);
62         // set threadpool as dependency of apsp
63         declareDependency(apspDRI, threadPoolName);
64
65         // switch to second phase committed
66         reset(transactionStatus);
67         doNothing().when(transactionStatus).checkCommitted();
68         List<ModuleIdentifier> sortedModuleIdentifiers = tested
69                 .getSortedModuleIdentifiers();
70         assertEquals(
71                 Arrays.asList(threadFactoryName, threadPoolName, apspName),
72                 sortedModuleIdentifiers);
73
74     }
75
76     /**
77      * Simulate dependentResolver resolving its dependency identified by
78      * dependentName.
79      */
80     private void declareDependency(DependencyResolverImpl dependerResolver,
81             ModuleIdentifier dependentName) {
82         JmxAttribute dummyAttribute = new JmxAttribute("dummy");
83         dependerResolver.resolveInstance(Object.class,
84                 ObjectNameUtil.createReadOnlyModuleON(dependentName),
85                 dummyAttribute);
86     }
87
88     private static void mockGetInstance(DependencyResolverManager tested,
89             ModuleIdentifier moduleIdentifier) {
90         ModuleInternalTransactionalInfo mock = mock(ModuleInternalTransactionalInfo.class);
91         doReturn(moduleIdentifier).when(mock).getIdentifier();
92         doReturn(mockedModule()).when(mock).getModule();
93         tested.put(mock);
94     }
95
96     private static Module mockedModule() {
97         Module mockedModule = mock(Module.class);
98         doReturn(mock(AutoCloseable.class)).when(mockedModule).getInstance();
99         return mockedModule;
100     }
101
102 }