2 * Copyright (c) 2016 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
9 package org.opendaylight.groupbasedpolicy.sxp.ep.provider.impl.dao;
11 import com.google.common.base.Optional;
12 import com.google.common.collect.Iterables;
13 import com.google.common.util.concurrent.Futures;
14 import com.google.common.util.concurrent.ListenableFuture;
15 import java.util.Collection;
16 import java.util.Collections;
17 import java.util.concurrent.ExecutionException;
18 import org.hamcrest.BaseMatcher;
19 import org.hamcrest.Description;
20 import org.junit.Assert;
21 import org.junit.Before;
22 import org.junit.Rule;
23 import org.junit.Test;
24 import org.junit.rules.ExpectedException;
25 import org.junit.runner.RunWith;
26 import org.mockito.Mock;
27 import org.mockito.Mockito;
28 import org.mockito.runners.MockitoJUnitRunner;
29 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
30 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
31 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
32 import org.opendaylight.groupbasedpolicy.sxp.ep.provider.api.EPPolicyTemplateProvider;
33 import org.opendaylight.groupbasedpolicy.sxp.ep.provider.impl.SgtGeneratorImpl;
34 import org.opendaylight.groupbasedpolicy.sxp.ep.provider.impl.SimpleCachedDao;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.EndpointGroupId;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.TenantId;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.groupbasedpolicy.sxp.integration.sxp.ep.provider.model.rev160302.TemplateGenerated;
38 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;
39 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;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.database.rev160308.Sgt;
43 * Test for {@link EPPolicyTemplateDaoFacadeImpl}.
45 @RunWith(MockitoJUnitRunner.class)
46 public class EPPolicyTemplateDaoFacadeImplTest {
48 private static final Sgt SGT = new Sgt(42);
49 private static final TenantId TENANT_ID = new TenantId("tenant-01");
50 private static final EndpointGroupId EPG_ID = new EndpointGroupId("epg-01");
51 private static final TransactionCommitFailedException TX_EXCEPTION = new TransactionCommitFailedException("unit-txSubmit-error");
54 public ExpectedException thrownRule = ExpectedException.none();
57 private EPPolicyTemplateDaoImpl delegateDao;
59 private SimpleCachedDao<Sgt, EndpointPolicyTemplateBySgt> delegateCachedDao;
61 private DataBroker dataBroker;
63 private EPPolicyTemplateProvider provider;
65 private SgtGeneratorImpl sgtGeneratorImpl;
67 private WriteTransaction wTx;
70 private EndpointPolicyTemplateBySgtBuilder templateBld;
71 private EPPolicyTemplateDaoFacadeImpl facade;
72 private EndpointPolicyTemplateBySgt first;
75 public void setUp() throws Exception {
76 Mockito.when(wTx.submit()).thenReturn(Futures.immediateCheckedFuture((Void) null));
77 Mockito.when(dataBroker.newWriteOnlyTransaction()).thenReturn(wTx);
78 templateBld = new EndpointPolicyTemplateBySgtBuilder()
81 .setEndpointGroups(Collections.singletonList(EPG_ID));
83 facade = new EPPolicyTemplateDaoFacadeImpl(dataBroker, delegateDao, delegateCachedDao, sgtGeneratorImpl);
87 public void testRead_trivial() throws Exception {
88 final EndpointPolicyTemplateBySgt template = templateBld.build();
89 Mockito.when(delegateDao.read(SGT)).thenReturn(Futures.immediateFuture(Optional.of(template)));
91 final ListenableFuture<Optional<EndpointPolicyTemplateBySgt>> actual = facade.read(SGT);
92 Assert.assertTrue(actual.isDone());
93 Assert.assertTrue(actual.get().isPresent());
94 Assert.assertEquals(template, actual.get().get());
98 public void testRead_success() throws Exception {
99 final EndpointPolicyTemplateBySgt template = templateBld
100 .setOrigin(TemplateGenerated.class)
103 Mockito.when(delegateDao.read(SGT)).thenReturn(Futures.immediateFuture(Optional.absent()));
104 Mockito.when(provider.provideTemplate(SGT)).thenReturn(java.util.Optional.of(template));
105 Mockito.when(wTx.submit()).thenReturn(Futures.immediateCheckedFuture(null));
106 facade.setTemplateProvider(provider);
109 final ListenableFuture<Optional<EndpointPolicyTemplateBySgt>> actual = facade.read(SGT);
110 Assert.assertTrue(actual.isDone());
111 Assert.assertTrue(actual.get().isPresent());
112 Assert.assertEquals(template, actual.get().get());
116 public void testRead_failNoProvider() throws Exception {
117 Mockito.when(delegateDao.read(SGT)).thenReturn(Futures.immediateFuture(Optional.absent()));
119 final ListenableFuture<Optional<EndpointPolicyTemplateBySgt>> actual = facade.read(SGT);
120 Assert.assertTrue(actual.isDone());
121 Assert.assertFalse(actual.get().isPresent());
125 public void testRead_failProviderMiss() throws Exception {
126 Mockito.when(delegateDao.read(SGT)).thenReturn(Futures.immediateFuture(Optional.absent()));
127 Mockito.when(provider.provideTemplate(SGT)).thenReturn(java.util.Optional.empty());
128 facade.setTemplateProvider(provider);
131 final ListenableFuture<Optional<EndpointPolicyTemplateBySgt>> actual = facade.read(SGT);
132 Assert.assertTrue(actual.isDone());
133 Assert.assertFalse(actual.get().isPresent());
137 public void testRead_failProviderStoreError() throws Exception {
138 Mockito.when(delegateDao.read(SGT)).thenReturn(Futures.immediateFuture(Optional.absent()));
139 final EndpointPolicyTemplateBySgt template = templateBld
140 .setOrigin(TemplateGenerated.class)
143 Mockito.when(delegateDao.read(SGT)).thenReturn(Futures.immediateFuture(Optional.absent()));
144 Mockito.when(provider.provideTemplate(SGT)).thenReturn(java.util.Optional.of(template));
145 Mockito.when(wTx.submit()).thenReturn(Futures.immediateFailedCheckedFuture(TX_EXCEPTION));
146 facade.setTemplateProvider(provider);
148 final ListenableFuture<Optional<EndpointPolicyTemplateBySgt>> actual = facade.read(SGT);
149 Assert.assertTrue(actual.isDone());
151 // prepare exception rule
152 thrownRule.expect(ExecutionException.class);
153 thrownRule.expectCause(new BaseMatcher<Throwable>() {
155 public boolean matches(final Object item) {
156 return TX_EXCEPTION == item;
160 public void describeTo(final Description description) {
161 description.appendText("TransactionCommitFailedException");
168 public void testReadBy() throws Exception {
169 Mockito.when(sgtGeneratorImpl.generateNextSgt(delegateCachedDao))
170 .thenReturn(java.util.Optional.empty())
171 .thenReturn(java.util.Optional.of(new Sgt(42)));
173 final EpPolicyTemplateValueKey lookupKey = new EpPolicyTemplateValueKey(TENANT_ID,
174 Collections.singletonList(EPG_ID), Collections.emptyList());
176 final ListenableFuture<Collection<EndpointPolicyTemplateBySgt>> templateFail = facade.readBy(lookupKey);
177 Assert.assertTrue(templateFail.isDone());
178 Assert.assertTrue(templateFail.get().isEmpty());
180 final ListenableFuture<Collection<EndpointPolicyTemplateBySgt>> templateSuccess = facade.readBy(lookupKey);
181 Assert.assertTrue(templateSuccess.isDone());
182 final Collection<EndpointPolicyTemplateBySgt> templateBag = templateSuccess.get();
183 Assert.assertFalse(templateBag.isEmpty());
184 first = Iterables.getFirst(templateBag, null);
185 Assert.assertNotNull(templateBag);
186 Assert.assertEquals(TemplateGenerated.class, first.getOrigin());
187 Assert.assertEquals(Collections.singletonList(EPG_ID), Iterables.getFirst(templateBag, null).getEndpointGroups());
188 Assert.assertTrue(Iterables.getFirst(templateBag, null).getConditions().isEmpty());
189 Assert.assertEquals(42, Iterables.getFirst(templateBag, null).getSgt().getValue().intValue());