Eliminate EntityOwnershipChange
[mdsal.git] / entityownership / mdsal-eos-binding-adapter / src / test / java / org / opendaylight / mdsal / eos / binding / dom / adapter / DefaultEntityOwnershipServiceTest.java
1 /*
2  * Copyright (c) 2015 Brocade Communications 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 package org.opendaylight.mdsal.eos.binding.dom.adapter;
9
10 import static org.junit.jupiter.api.Assertions.assertNotNull;
11 import static org.junit.jupiter.api.Assertions.assertSame;
12 import static org.junit.jupiter.api.Assertions.assertTrue;
13 import static org.mockito.ArgumentMatchers.eq;
14 import static org.mockito.Mockito.doNothing;
15 import static org.mockito.Mockito.doReturn;
16 import static org.mockito.Mockito.doThrow;
17 import static org.mockito.Mockito.mock;
18
19 import java.util.Optional;
20 import org.eclipse.jdt.annotation.NonNull;
21 import org.junit.jupiter.api.BeforeEach;
22 import org.junit.jupiter.api.Test;
23 import org.junit.jupiter.api.extension.ExtendWith;
24 import org.mockito.ArgumentCaptor;
25 import org.mockito.Mock;
26 import org.mockito.junit.jupiter.MockitoExtension;
27 import org.opendaylight.mdsal.binding.dom.adapter.ConstantAdapterContext;
28 import org.opendaylight.mdsal.binding.dom.codec.spi.BindingDOMCodecServices;
29 import org.opendaylight.mdsal.eos.binding.api.Entity;
30 import org.opendaylight.mdsal.eos.binding.api.EntityOwnershipListener;
31 import org.opendaylight.mdsal.eos.common.api.EntityOwnershipState;
32 import org.opendaylight.mdsal.eos.common.api.EntityOwnershipStateChange;
33 import org.opendaylight.mdsal.eos.dom.api.DOMEntity;
34 import org.opendaylight.mdsal.eos.dom.api.DOMEntityOwnershipListener;
35 import org.opendaylight.mdsal.eos.dom.api.DOMEntityOwnershipService;
36 import org.opendaylight.yangtools.concepts.Registration;
37
38 /**
39  * Unit tests for BindingDOMEntityOwnershipServiceAdapter.
40  *
41  * @author Thomas Pantelis
42  */
43 @ExtendWith(MockitoExtension.class)
44 class DefaultEntityOwnershipServiceTest {
45     private static final @NonNull Entity BINDING_ENTITY = new Entity("foo", "bar");
46     private static final @NonNull DOMEntity DOM_ENTITY = new DOMEntity("foo", "bar");
47
48     @Mock
49     private BindingDOMCodecServices mockCodecRegistry;
50     @Mock
51     private DOMEntityOwnershipService mockDOMService;
52
53     private DefaultEntityOwnershipService adapter;
54
55     @BeforeEach
56     void setup() {
57         adapter = new DefaultEntityOwnershipService(mockDOMService, new ConstantAdapterContext(mockCodecRegistry));
58     }
59
60     private void mockToBinding() {
61         doReturn(BINDING_ENTITY.getIdentifier()).when(mockCodecRegistry).fromYangInstanceIdentifier(
62             DOM_ENTITY.getIdentifier());
63     }
64
65     private void mockToDom() {
66         doReturn(DOM_ENTITY.getIdentifier()).when(mockCodecRegistry)
67             .toYangInstanceIdentifier(BINDING_ENTITY.getIdentifier());
68     }
69
70     @Test
71     void testRegisterCandidate() throws Exception {
72         mockToDom();
73         final var mockDOMReg = mock(Registration.class);
74         doReturn(mockDOMReg).when(mockDOMService).registerCandidate(DOM_ENTITY);
75
76         try (var reg = adapter.registerCandidate(BINDING_ENTITY)) {
77             assertNotNull(reg);
78         }
79     }
80
81     @Test
82     void testRegisterListener() {
83         mockToBinding();
84
85         final var mockDOMReg = mock(Registration.class);
86         final var domListenerCaptor = ArgumentCaptor.forClass(DOMEntityOwnershipListener.class);
87         doReturn(mockDOMReg).when(mockDOMService).registerListener(eq(DOM_ENTITY.getType()),
88             domListenerCaptor.capture());
89         final var mockListener = mock(EntityOwnershipListener.class);
90
91         try (var reg = adapter.registerListener(BINDING_ENTITY.getType(), mockListener)) {
92             assertNotNull(reg);
93
94             doNothing().when(mockListener).ownershipChanged(BINDING_ENTITY,
95                 EntityOwnershipStateChange.LOCAL_OWNERSHIP_GRANTED, true);
96             domListenerCaptor.getValue().ownershipChanged(DOM_ENTITY,
97                 EntityOwnershipStateChange.LOCAL_OWNERSHIP_GRANTED, true);
98         }
99     }
100
101     @Test
102     void testGetOwnershipState() {
103         mockToDom();
104
105         final var expectedState = Optional.of(EntityOwnershipState.IS_OWNER);
106         doReturn(expectedState).when(mockDOMService).getOwnershipState(DOM_ENTITY);
107         assertSame(expectedState, adapter.getOwnershipState(BINDING_ENTITY));
108     }
109
110     @Test
111     void testIsCandidateRegistered() {
112         mockToDom();
113
114         doReturn(true).when(mockDOMService).isCandidateRegistered(DOM_ENTITY);
115         assertTrue(adapter.isCandidateRegistered(BINDING_ENTITY));
116     }
117
118     @Test
119     void testOwnershipChangeWithException() {
120         mockToBinding();
121
122         final var listener = mock(EntityOwnershipListener.class);
123         doThrow(IllegalStateException.class).when(listener).ownershipChanged(BINDING_ENTITY,
124             EntityOwnershipStateChange.LOCAL_OWNERSHIP_GRANTED, false);
125
126         final var domAdapter = new DOMEntityOwnershipListenerAdapter(listener,
127             new ConstantAdapterContext(mockCodecRegistry));
128
129         domAdapter.ownershipChanged(DOM_ENTITY, EntityOwnershipStateChange.LOCAL_OWNERSHIP_GRANTED, false);
130     }
131 }