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.manager.impl.dependencyresolver;
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;
16 import java.util.Arrays;
17 import java.util.List;
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;
29 public class DependencyResolverManagerTest {
31 final ModuleIdentifier apspName = new ModuleIdentifier("apsp", "apsp"); // depends
33 final ModuleIdentifier threadPoolName = new ModuleIdentifier("threadpool",
34 "threadpool"); // depends on:
35 final ModuleIdentifier threadFactoryName = new ModuleIdentifier(
36 "threadfactory", "threadfactory");
38 private DependencyResolverManager tested;
39 TransactionStatus transactionStatus;
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();
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);
60 // set threadfactory as dependency of threadpool
61 declareDependency(threadPoolDRI, threadFactoryName);
62 // set threadpool as dependency of apsp
63 declareDependency(apspDRI, threadPoolName);
65 // switch to second phase committed
66 reset(transactionStatus);
67 doNothing().when(transactionStatus).checkCommitted();
68 List<ModuleIdentifier> sortedModuleIdentifiers = tested
69 .getSortedModuleIdentifiers();
71 Arrays.asList(threadFactoryName, threadPoolName, apspName),
72 sortedModuleIdentifiers);
77 * Simulate dependentResolver resolving its dependency identified by
80 private void declareDependency(DependencyResolverImpl dependerResolver,
81 ModuleIdentifier dependentName) {
82 JmxAttribute dummyAttribute = new JmxAttribute("dummy");
83 dependerResolver.resolveInstance(Object.class,
84 ObjectNameUtil.createReadOnlyModuleON(dependentName),
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();
96 private static Module mockedModule() {
97 Module mockedModule = mock(Module.class);
98 doReturn(mock(AutoCloseable.class)).when(mockedModule).getInstance();