BUG-6650: ep-ip/sgt, implement and wire template provider
[groupbasedpolicy.git] / sxp-integration / sxp-ep-provider / src / test / java / org / opendaylight / groupbasedpolicy / sxp / ep / provider / impl / dao / EPPolicyTemplateDaoFacadeImplTest.java
1 /*
2  * Copyright (c) 2016 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
9 package org.opendaylight.groupbasedpolicy.sxp.ep.provider.impl.dao;
10
11 import com.google.common.base.Optional;
12 import com.google.common.util.concurrent.Futures;
13 import com.google.common.util.concurrent.ListenableFuture;
14 import java.util.Collections;
15 import java.util.concurrent.ExecutionException;
16 import org.hamcrest.BaseMatcher;
17 import org.hamcrest.Description;
18 import org.junit.Assert;
19 import org.junit.Before;
20 import org.junit.Rule;
21 import org.junit.Test;
22 import org.junit.rules.ExpectedException;
23 import org.junit.runner.RunWith;
24 import org.mockito.Mock;
25 import org.mockito.Mockito;
26 import org.mockito.runners.MockitoJUnitRunner;
27 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
28 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
29 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
30 import org.opendaylight.groupbasedpolicy.sxp.ep.provider.api.EPPolicyTemplateProvider;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.EndpointGroupId;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.TenantId;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.groupbasedpolicy.sxp.integration.sxp.ep.provider.model.rev160302.TemplateGenerated;
34 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;
35 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;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.database.rev160308.Sgt;
37
38 /**
39  * Test for {@link EPPolicyTemplateDaoFacadeImpl}.
40  */
41 @RunWith(MockitoJUnitRunner.class)
42 public class EPPolicyTemplateDaoFacadeImplTest {
43
44     private static final Sgt SGT = new Sgt(42);
45     private static final TenantId TENANT_ID = new TenantId("tenant-01");
46     private static final EndpointGroupId EPG_ID = new EndpointGroupId("epg-01");
47     private static final TransactionCommitFailedException TX_EXCEPTION = new TransactionCommitFailedException("unit-txSubmit-error");
48
49     @Rule
50     public ExpectedException thrownRule = ExpectedException.none();
51
52     @Mock
53     private EPPolicyTemplateDaoImpl delegateDao;
54     @Mock
55     private DataBroker dataBroker;
56     @Mock
57     private EPPolicyTemplateProvider provider;
58     @Mock
59     private WriteTransaction wTx;
60
61
62     private EndpointPolicyTemplateBySgtBuilder templateBld;
63     private EPPolicyTemplateDaoFacadeImpl facade;
64
65     @Before
66     public void setUp() throws Exception {
67         Mockito.when(wTx.submit()).thenReturn(Futures.immediateCheckedFuture((Void) null));
68         Mockito.when(dataBroker.newWriteOnlyTransaction()).thenReturn(wTx);
69         templateBld = new EndpointPolicyTemplateBySgtBuilder()
70                 .setTenant(TENANT_ID)
71                 .setSgt(SGT)
72                 .setEndpointGroups(Collections.singletonList(EPG_ID));
73
74         facade = new EPPolicyTemplateDaoFacadeImpl(dataBroker, delegateDao);
75     }
76
77     @Test
78     public void testRead_trivial() throws Exception {
79         final EndpointPolicyTemplateBySgt template = templateBld.build();
80         Mockito.when(delegateDao.read(SGT)).thenReturn(Futures.immediateFuture(Optional.of(template)));
81
82         final ListenableFuture<Optional<EndpointPolicyTemplateBySgt>> actual = facade.read(SGT);
83         Assert.assertTrue(actual.isDone());
84         Assert.assertTrue(actual.get().isPresent());
85         Assert.assertEquals(template, actual.get().get());
86     }
87
88     @Test
89     public void testRead_success() throws Exception {
90         final EndpointPolicyTemplateBySgt template = templateBld
91                 .setOrigin(TemplateGenerated.class)
92                 .build();
93
94         Mockito.when(delegateDao.read(SGT)).thenReturn(Futures.immediateFuture(Optional.absent()));
95         Mockito.when(provider.provideTemplate(SGT)).thenReturn(java.util.Optional.of(template));
96         Mockito.when(wTx.submit()).thenReturn(Futures.immediateCheckedFuture(null));
97         facade.setTemplateProvider(provider);
98
99
100         final ListenableFuture<Optional<EndpointPolicyTemplateBySgt>> actual = facade.read(SGT);
101         Assert.assertTrue(actual.isDone());
102         Assert.assertTrue(actual.get().isPresent());
103         Assert.assertEquals(template, actual.get().get());
104     }
105
106     @Test
107     public void testRead_failNoProvider() throws Exception {
108         Mockito.when(delegateDao.read(SGT)).thenReturn(Futures.immediateFuture(Optional.absent()));
109
110         final ListenableFuture<Optional<EndpointPolicyTemplateBySgt>> actual = facade.read(SGT);
111         Assert.assertTrue(actual.isDone());
112         Assert.assertFalse(actual.get().isPresent());
113     }
114
115     @Test
116     public void testRead_failProviderMiss() throws Exception {
117         Mockito.when(delegateDao.read(SGT)).thenReturn(Futures.immediateFuture(Optional.absent()));
118         Mockito.when(provider.provideTemplate(SGT)).thenReturn(java.util.Optional.empty());
119         facade.setTemplateProvider(provider);
120
121
122         final ListenableFuture<Optional<EndpointPolicyTemplateBySgt>> actual = facade.read(SGT);
123         Assert.assertTrue(actual.isDone());
124         Assert.assertFalse(actual.get().isPresent());
125     }
126
127     @Test
128     public void testRead_failProviderStoreError() throws Exception {
129         Mockito.when(delegateDao.read(SGT)).thenReturn(Futures.immediateFuture(Optional.absent()));
130         final EndpointPolicyTemplateBySgt template = templateBld
131                 .setOrigin(TemplateGenerated.class)
132                 .build();
133
134         Mockito.when(delegateDao.read(SGT)).thenReturn(Futures.immediateFuture(Optional.absent()));
135         Mockito.when(provider.provideTemplate(SGT)).thenReturn(java.util.Optional.of(template));
136         Mockito.when(wTx.submit()).thenReturn(Futures.immediateFailedCheckedFuture(TX_EXCEPTION));
137         facade.setTemplateProvider(provider);
138
139         final ListenableFuture<Optional<EndpointPolicyTemplateBySgt>> actual = facade.read(SGT);
140         Assert.assertTrue(actual.isDone());
141
142         // prepare exception rule
143         thrownRule.expect(ExecutionException.class);
144         thrownRule.expectCause(new BaseMatcher<Throwable>() {
145             @Override
146             public boolean matches(final Object item) {
147                 return TX_EXCEPTION == item;
148             }
149
150             @Override
151             public void describeTo(final Description description) {
152                 description.appendText("TransactionCommitFailedException");
153             }
154         });
155         actual.get();
156     }
157 }