/*
* Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*/
package org.opendaylight.groupbasedpolicy.sxp.ep.provider.impl;
import static org.powermock.api.mockito.PowerMockito.verifyNew;
import static org.powermock.api.mockito.PowerMockito.whenNew;
import static org.powermock.api.support.membermodification.MemberMatcher.method;
import static org.powermock.api.support.membermodification.MemberModifier.stub;
import com.google.common.collect.Ordering;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.opendaylight.controller.md.sal.binding.api.DataBroker;
import org.opendaylight.groupbasedpolicy.api.DomainSpecificRegistry;
import org.opendaylight.groupbasedpolicy.api.EndpointAugmentorRegistry;
import org.opendaylight.groupbasedpolicy.sxp.ep.provider.impl.dao.EPForwardingTemplateDaoImpl;
import org.opendaylight.groupbasedpolicy.sxp.ep.provider.impl.dao.EPPolicyTemplateDaoFacadeImpl;
import org.opendaylight.groupbasedpolicy.sxp.ep.provider.impl.dao.EPPolicyTemplateDaoImpl;
import org.opendaylight.groupbasedpolicy.sxp.ep.provider.impl.dao.EpPolicyTemplateValueKeyFactory;
import org.opendaylight.groupbasedpolicy.sxp.ep.provider.impl.dao.MasterDatabaseBindingDaoImpl;
import org.opendaylight.groupbasedpolicy.sxp.ep.provider.impl.dao.SimpleCachedDaoEPForwardingTemplateImpl;
import org.opendaylight.groupbasedpolicy.sxp.ep.provider.impl.dao.SimpleCachedDaoImpl;
import org.opendaylight.groupbasedpolicy.sxp.ep.provider.impl.listen.EPForwardingTemplateListenerImpl;
import org.opendaylight.groupbasedpolicy.sxp.ep.provider.impl.listen.EPPolicyTemplateListenerImpl;
import org.opendaylight.groupbasedpolicy.sxp.ep.provider.impl.listen.MasterDatabaseBindingListenerImpl;
import org.opendaylight.groupbasedpolicy.sxp.ep.provider.impl.util.EPTemplateUtil;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpPrefix;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.BaseEndpointService;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ConditionName;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.EndpointGroupId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.groupbasedpolicy.sxp.integration.sxp.ep.provider.model.rev160302.sxp.ep.mapper.EndpointPolicyTemplateBySgt;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.groupbasedpolicy.sxp.integration.sxp.ep.provider.rev160722.SgtGeneratorConfig;
import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.database.rev160308.Sgt;
import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.database.rev160308.master.database.fields.MasterDatabaseBinding;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
/**
* Test for {@link SxpEpProviderProviderImpl}.
*/
@RunWith(PowerMockRunner.class)
@PrepareForTest({SxpEpProviderProviderImpl.class, EPTemplateUtil.class})
public class SxpEpProviderProviderImplTest {
@Mock
private DataBroker dataBroker;
@Mock
private DomainSpecificRegistry domainSpecificRegistry;
@Mock
private EPPolicyTemplateProviderRegistryImpl templateProviderRegistry;
@Mock
private SxpMapperReactorImpl sxpMapperReactor;
@Mock
private BaseEndpointService endpointService;
@Mock
private SimpleCachedDaoImpl<Sgt, EndpointPolicyTemplateBySgt> epPolicyTemplateCachedDao;
@Mock
private SimpleCachedDaoImpl<IpPrefix, MasterDatabaseBinding> masterDBBindingCachedDao;
@Mock
private SimpleCachedDaoEPForwardingTemplateImpl epFwTemplateCachedDao;
@Mock
private Ordering<EndpointGroupId> groupOrdering;
@Mock
private Ordering<ConditionName> conditionOrdering;
@Mock
private EpPolicyTemplateValueKeyFactory epPolicyTemplateKeyFactory;
@Mock
private EPPolicyTemplateDaoImpl epPolicyTemplateDao;
@Mock
private EPForwardingTemplateDaoImpl epForwardingTemplateDao;
@Mock
private MasterDatabaseBindingDaoImpl masterDBBindingDao;
@Mock
private MasterDatabaseBindingListenerImpl masterDBBindingListener;
@Mock
private EPPolicyTemplateListenerImpl epPolicyTemplateListener;
@Mock
private EPForwardingTemplateListenerImpl epForwardingTemplateListener;
@Mock
private SxpEndpointAugmentorImpl sxpEPAugmentor;
@Mock
private EndpointAugmentorRegistry epAugmentorRegistry;
@Mock
private EPPolicyTemplateDaoFacadeImpl epPolicyTemplateDaoFacade;
@Mock
private SgtGeneratorConfig sgtGeneratorConfig;
@Mock
private SgtGeneratorImpl sgtGenerator;
@Mock
private EPToSgtMapperImpl epToSgtMapper;
private SxpEpProviderProviderImpl provider;
@Before
public void setUp() throws Exception {
whenNew(EPPolicyTemplateProviderRegistryImpl.class).withNoArguments().thenReturn(templateProviderRegistry);
whenNew(SxpMapperReactorImpl.class).withArguments(endpointService, dataBroker).thenReturn(sxpMapperReactor);
whenNew(SimpleCachedDaoImpl.class).withNoArguments().thenReturn(epPolicyTemplateCachedDao, masterDBBindingCachedDao);
whenNew(SimpleCachedDaoEPForwardingTemplateImpl.class).withNoArguments().thenReturn(epFwTemplateCachedDao);
stub(method(EPTemplateUtil.class, "createEndpointGroupIdOrdering")).toReturn(groupOrdering);
stub(method(EPTemplateUtil.class, "createConditionNameOrdering")).toReturn(conditionOrdering);
whenNew(EpPolicyTemplateValueKeyFactory.class).withArguments(groupOrdering, conditionOrdering)
.thenReturn(epPolicyTemplateKeyFactory);
whenNew(EPPolicyTemplateDaoImpl.class).withArguments(dataBroker, epPolicyTemplateCachedDao, epPolicyTemplateKeyFactory)
.thenReturn(epPolicyTemplateDao);
whenNew(SgtGeneratorImpl.class).withArguments(sgtGeneratorConfig).thenReturn(sgtGenerator);
whenNew(EPPolicyTemplateDaoFacadeImpl.class).withArguments(dataBroker, epPolicyTemplateDao, epPolicyTemplateCachedDao, sgtGenerator)
.thenReturn(epPolicyTemplateDaoFacade);
whenNew(EPToSgtMapperImpl.class).withArguments(epPolicyTemplateDaoFacade).thenReturn(epToSgtMapper);
whenNew(EPForwardingTemplateDaoImpl.class).withArguments(dataBroker, epFwTemplateCachedDao)
.thenReturn(epForwardingTemplateDao);
whenNew(MasterDatabaseBindingDaoImpl.class).withArguments(dataBroker, masterDBBindingCachedDao)
.thenReturn(masterDBBindingDao);
whenNew(MasterDatabaseBindingListenerImpl.class).withArguments(dataBroker, sxpMapperReactor, masterDBBindingCachedDao,
epPolicyTemplateDaoFacade, epForwardingTemplateDao).thenReturn(masterDBBindingListener);
whenNew(EPPolicyTemplateListenerImpl.class).withArguments(dataBroker, sxpMapperReactor, epPolicyTemplateCachedDao,
masterDBBindingDao, epForwardingTemplateDao).thenReturn(epPolicyTemplateListener);
whenNew(EPForwardingTemplateListenerImpl.class).withArguments(dataBroker, sxpMapperReactor, epFwTemplateCachedDao,
masterDBBindingDao, epPolicyTemplateDaoFacade).thenReturn(epForwardingTemplateListener);
whenNew(SxpEndpointAugmentorImpl.class).withArguments(epPolicyTemplateDao, epPolicyTemplateKeyFactory)
.thenReturn(sxpEPAugmentor);
provider = new SxpEpProviderProviderImpl(dataBroker, endpointService, domainSpecificRegistry, sgtGeneratorConfig);
Mockito.verify(templateProviderRegistry).addDistributionTarget(epPolicyTemplateDaoFacade);
// check if all expected object got constructed and wired
verifyNew(EPPolicyTemplateProviderRegistryImpl.class).withNoArguments();
verifyNew(SxpMapperReactorImpl.class).withArguments(endpointService, dataBroker);
verifyNew(SimpleCachedDaoImpl.class, Mockito.times(2)).withNoArguments();
verifyNew(SimpleCachedDaoEPForwardingTemplateImpl.class).withNoArguments();
verifyNew(EpPolicyTemplateValueKeyFactory.class).withArguments(groupOrdering, conditionOrdering);
verifyNew(EPPolicyTemplateDaoImpl.class).withArguments(dataBroker, epPolicyTemplateCachedDao, epPolicyTemplateKeyFactory);
verifyNew(SgtGeneratorImpl.class).withArguments(sgtGeneratorConfig);
verifyNew(EPPolicyTemplateDaoFacadeImpl.class).withArguments(dataBroker, epPolicyTemplateDao, epPolicyTemplateCachedDao, sgtGenerator);
verifyNew(EPToSgtMapperImpl.class).withArguments(epPolicyTemplateDaoFacade);
verifyNew(EPForwardingTemplateDaoImpl.class).withArguments(dataBroker, epFwTemplateCachedDao);
verifyNew(MasterDatabaseBindingDaoImpl.class).withArguments(dataBroker, masterDBBindingCachedDao);
verifyNew(MasterDatabaseBindingListenerImpl.class).withArguments(dataBroker, sxpMapperReactor, masterDBBindingCachedDao,
epPolicyTemplateDaoFacade, epForwardingTemplateDao);
verifyNew(EPPolicyTemplateListenerImpl.class).withArguments(dataBroker, sxpMapperReactor, epPolicyTemplateCachedDao,
masterDBBindingDao, epForwardingTemplateDao);
verifyNew(EPForwardingTemplateListenerImpl.class).withArguments(dataBroker, sxpMapperReactor, epFwTemplateCachedDao,
masterDBBindingDao, epPolicyTemplateDaoFacade);
}
@Test
public void testGetEPPolicyTemplateProviderRegistry() throws Exception {
Assert.assertSame(templateProviderRegistry, provider.getEPPolicyTemplateProviderRegistry());
}
@Test
public void testClose() throws Exception {
provider.close();
Mockito.verify(masterDBBindingListener).close();
Mockito.verify(epPolicyTemplateListener).close();
Mockito.verify(epForwardingTemplateListener).close();
Mockito.verify(templateProviderRegistry).close();
}
}