/* * 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.dao; import com.google.common.base.Optional; import com.google.common.collect.Iterables; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; import java.util.Collection; import java.util.Collections; import java.util.concurrent.ExecutionException; import org.hamcrest.BaseMatcher; import org.hamcrest.Description; import org.junit.Assert; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.runners.MockitoJUnitRunner; import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.controller.md.sal.binding.api.WriteTransaction; import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException; import org.opendaylight.groupbasedpolicy.sxp.ep.provider.api.EPPolicyTemplateProvider; import org.opendaylight.groupbasedpolicy.sxp.ep.provider.impl.SgtGeneratorImpl; import org.opendaylight.groupbasedpolicy.sxp.ep.provider.impl.SimpleCachedDao; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.EndpointGroupId; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.TenantId; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.groupbasedpolicy.sxp.integration.sxp.ep.provider.model.rev160302.TemplateGenerated; 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.model.rev160302.sxp.ep.mapper.EndpointPolicyTemplateBySgtBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.database.rev160308.Sgt; /** * Test for {@link EPPolicyTemplateDaoFacadeImpl}. */ @RunWith(MockitoJUnitRunner.class) public class EPPolicyTemplateDaoFacadeImplTest { private static final Sgt SGT = new Sgt(42); private static final TenantId TENANT_ID = new TenantId("tenant-01"); private static final EndpointGroupId EPG_ID = new EndpointGroupId("epg-01"); private static final TransactionCommitFailedException TX_EXCEPTION = new TransactionCommitFailedException("unit-txSubmit-error"); @Rule public ExpectedException thrownRule = ExpectedException.none(); @Mock private EPPolicyTemplateDaoImpl delegateDao; @Mock private SimpleCachedDao<Sgt, EndpointPolicyTemplateBySgt> delegateCachedDao; @Mock private DataBroker dataBroker; @Mock private EPPolicyTemplateProvider provider; @Mock private SgtGeneratorImpl sgtGeneratorImpl; @Mock private WriteTransaction wTx; private EndpointPolicyTemplateBySgtBuilder templateBld; private EPPolicyTemplateDaoFacadeImpl facade; private EndpointPolicyTemplateBySgt first; @Before public void setUp() throws Exception { Mockito.when(wTx.submit()).thenReturn(Futures.immediateCheckedFuture((Void) null)); Mockito.when(dataBroker.newWriteOnlyTransaction()).thenReturn(wTx); templateBld = new EndpointPolicyTemplateBySgtBuilder() .setTenant(TENANT_ID) .setSgt(SGT) .setEndpointGroups(Collections.singletonList(EPG_ID)); facade = new EPPolicyTemplateDaoFacadeImpl(dataBroker, delegateDao, delegateCachedDao, sgtGeneratorImpl); } @Test public void testRead_trivial() throws Exception { final EndpointPolicyTemplateBySgt template = templateBld.build(); Mockito.when(delegateDao.read(SGT)).thenReturn(Futures.immediateFuture(Optional.of(template))); final ListenableFuture<Optional<EndpointPolicyTemplateBySgt>> actual = facade.read(SGT); Assert.assertTrue(actual.isDone()); Assert.assertTrue(actual.get().isPresent()); Assert.assertEquals(template, actual.get().get()); } @Test public void testRead_success() throws Exception { final EndpointPolicyTemplateBySgt template = templateBld .setOrigin(TemplateGenerated.class) .build(); Mockito.when(delegateDao.read(SGT)).thenReturn(Futures.immediateFuture(Optional.absent())); Mockito.when(provider.provideTemplate(SGT)).thenReturn(Futures.immediateFuture(java.util.Optional.of(template))); Mockito.when(wTx.submit()).thenReturn(Futures.immediateCheckedFuture(null)); facade.setTemplateProvider(provider); final ListenableFuture<Optional<EndpointPolicyTemplateBySgt>> actual = facade.read(SGT); Assert.assertTrue(actual.isDone()); Assert.assertTrue(actual.get().isPresent()); Assert.assertEquals(template, actual.get().get()); } @Test public void testRead_failNoProvider() throws Exception { Mockito.when(delegateDao.read(SGT)).thenReturn(Futures.immediateFuture(Optional.absent())); final ListenableFuture<Optional<EndpointPolicyTemplateBySgt>> actual = facade.read(SGT); Assert.assertTrue(actual.isDone()); Assert.assertFalse(actual.get().isPresent()); } @Test public void testRead_failProviderMiss() throws Exception { Mockito.when(delegateDao.read(SGT)).thenReturn(Futures.immediateFuture(Optional.absent())); Mockito.when(provider.provideTemplate(SGT)).thenReturn(Futures.immediateFuture(java.util.Optional.empty())); facade.setTemplateProvider(provider); final ListenableFuture<Optional<EndpointPolicyTemplateBySgt>> actual = facade.read(SGT); Assert.assertTrue(actual.isDone()); Assert.assertFalse(actual.get().isPresent()); } @Test public void testRead_failProviderStoreError() throws Exception { Mockito.when(delegateDao.read(SGT)).thenReturn(Futures.immediateFuture(Optional.absent())); final EndpointPolicyTemplateBySgt template = templateBld .setOrigin(TemplateGenerated.class) .build(); Mockito.when(delegateDao.read(SGT)).thenReturn(Futures.immediateFuture(Optional.absent())); Mockito.when(provider.provideTemplate(SGT)).thenReturn(Futures.immediateFailedCheckedFuture(TX_EXCEPTION)); facade.setTemplateProvider(provider); final ListenableFuture<Optional<EndpointPolicyTemplateBySgt>> actual = facade.read(SGT); Assert.assertTrue(actual.isDone()); // prepare exception rule thrownRule.expect(ExecutionException.class); thrownRule.expectCause(new BaseMatcher<Throwable>() { @Override public boolean matches(final Object item) { return TX_EXCEPTION == item; } @Override public void describeTo(final Description description) { description.appendText("TransactionCommitFailedException"); } }); actual.get(); } @Test public void testReadBy() throws Exception { Mockito.when(sgtGeneratorImpl.generateNextSgt(delegateCachedDao)) .thenReturn(java.util.Optional.empty()) .thenReturn(java.util.Optional.of(new Sgt(42))); final EpPolicyTemplateValueKey lookupKey = new EpPolicyTemplateValueKey(TENANT_ID, Collections.singletonList(EPG_ID), Collections.emptyList()); final ListenableFuture<Collection<EndpointPolicyTemplateBySgt>> templateFail = facade.readBy(lookupKey); Assert.assertTrue(templateFail.isDone()); Assert.assertTrue(templateFail.get().isEmpty()); final ListenableFuture<Collection<EndpointPolicyTemplateBySgt>> templateSuccess = facade.readBy(lookupKey); Assert.assertTrue(templateSuccess.isDone()); final Collection<EndpointPolicyTemplateBySgt> templateBag = templateSuccess.get(); Assert.assertFalse(templateBag.isEmpty()); first = Iterables.getFirst(templateBag, null); Assert.assertNotNull(templateBag); Assert.assertEquals(TemplateGenerated.class, first.getOrigin()); Assert.assertEquals(Collections.singletonList(EPG_ID), Iterables.getFirst(templateBag, null).getEndpointGroups()); Assert.assertTrue(Iterables.getFirst(templateBag, null).getConditions().isEmpty()); Assert.assertEquals(42, Iterables.getFirst(templateBag, null).getSgt().getValue().intValue()); } }