BUG-7611: Add a simple DOMEntityOwnershipService
[mdsal.git] / entityownership / mdsal-eos-dom-simple / src / test / java / org / opendaylight / mdsal / eos / dom / simple / SimpleDOMEntityOwnershipServiceTest.java
1 /*
2  * Copyright (c) 2017 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 package org.opendaylight.mdsal.eos.dom.simple;
9
10 import static org.junit.Assert.assertEquals;
11 import static org.junit.Assert.assertFalse;
12 import static org.junit.Assert.assertNotNull;
13 import static org.junit.Assert.assertTrue;
14 import static org.mockito.Matchers.any;
15 import static org.mockito.Mockito.doNothing;
16 import static org.mockito.Mockito.mock;
17 import static org.mockito.Mockito.reset;
18 import static org.mockito.Mockito.verify;
19 import static org.mockito.Mockito.verifyZeroInteractions;
20
21 import com.google.common.base.Optional;
22 import java.util.UUID;
23 import org.junit.Before;
24 import org.junit.Test;
25 import org.mockito.ArgumentCaptor;
26 import org.opendaylight.mdsal.eos.common.api.CandidateAlreadyRegisteredException;
27 import org.opendaylight.mdsal.eos.common.api.EntityOwnershipChangeState;
28 import org.opendaylight.mdsal.eos.common.api.EntityOwnershipState;
29 import org.opendaylight.mdsal.eos.dom.api.DOMEntity;
30 import org.opendaylight.mdsal.eos.dom.api.DOMEntityOwnershipCandidateRegistration;
31 import org.opendaylight.mdsal.eos.dom.api.DOMEntityOwnershipChange;
32 import org.opendaylight.mdsal.eos.dom.api.DOMEntityOwnershipListener;
33 import org.opendaylight.mdsal.eos.dom.api.DOMEntityOwnershipListenerRegistration;
34 import org.opendaylight.mdsal.eos.dom.api.DOMEntityOwnershipService;
35
36 public class SimpleDOMEntityOwnershipServiceTest {
37     private static final String FOO_TYPE = "foo";
38     private static final String BAR_TYPE = "bar";
39
40     private static final DOMEntity FOO_FOO_ENTITY = new DOMEntity(FOO_TYPE, "foo");
41     private static final DOMEntity FOO_BAR_ENTITY = new DOMEntity(FOO_TYPE, "bar");
42
43     private DOMEntityOwnershipService service;
44
45     @Before
46     public void setUp() {
47         service = new SimpleDOMEntityOwnershipService();
48     }
49
50     @Test
51     public void testNonExistingEntity() {
52         assertFalse(service.isCandidateRegistered(FOO_FOO_ENTITY));
53         final Optional<EntityOwnershipState> state = service.getOwnershipState(FOO_FOO_ENTITY);
54         assertNotNull(state);
55         assertFalse(state.isPresent());
56     }
57
58     @Test
59     public void testExistingEntity() throws CandidateAlreadyRegisteredException {
60         final DOMEntityOwnershipCandidateRegistration reg = service.registerCandidate(FOO_FOO_ENTITY);
61         assertNotNull(reg);
62
63         assertTrue(service.isCandidateRegistered(FOO_FOO_ENTITY));
64         assertFalse(service.isCandidateRegistered(FOO_BAR_ENTITY));
65
66         final Optional<EntityOwnershipState> state = service.getOwnershipState(FOO_FOO_ENTITY);
67         assertNotNull(state);
68         assertTrue(state.isPresent());
69         assertEquals(EntityOwnershipState.IS_OWNER, state.get());
70
71         reg.close();
72         assertFalse(service.isCandidateRegistered(FOO_FOO_ENTITY));
73     }
74
75     @Test(expected = CandidateAlreadyRegisteredException.class)
76     public void testDuplicateRegistration() throws CandidateAlreadyRegisteredException {
77         final DOMEntityOwnershipCandidateRegistration reg = service.registerCandidate(FOO_FOO_ENTITY);
78         assertNotNull(reg);
79
80         // Should throw
81         service.registerCandidate(FOO_FOO_ENTITY);
82     }
83
84     @Test
85     public void testListener() throws CandidateAlreadyRegisteredException {
86         final DOMEntityOwnershipCandidateRegistration entityReg = service.registerCandidate(FOO_FOO_ENTITY);
87         assertNotNull(entityReg);
88
89         // Mismatched type, not triggered
90         final DOMEntityOwnershipListener barListener = mock(DOMEntityOwnershipListener.class);
91         doNothing().when(barListener).ownershipChanged(any(DOMEntityOwnershipChange.class));
92         final DOMEntityOwnershipListenerRegistration barReg = service.registerListener(BAR_TYPE, barListener);
93         verifyZeroInteractions(barListener);
94
95         // Matching type should be triggered
96         final DOMEntityOwnershipListener fooListener = mock(DOMEntityOwnershipListener.class);
97         doNothing().when(fooListener).ownershipChanged(any(DOMEntityOwnershipChange.class));
98         final DOMEntityOwnershipListenerRegistration fooReg = service.registerListener(FOO_TYPE, fooListener);
99         final ArgumentCaptor<DOMEntityOwnershipChange> fooCaptor = ArgumentCaptor.forClass(
100             DOMEntityOwnershipChange.class);
101         verify(fooListener).ownershipChanged(fooCaptor.capture());
102
103         DOMEntityOwnershipChange fooChange = fooCaptor.getValue();
104         assertEquals(FOO_FOO_ENTITY, fooChange.getEntity());
105         assertEquals(EntityOwnershipChangeState.LOCAL_OWNERSHIP_GRANTED, fooChange.getState());
106
107         reset(fooListener);
108         doNothing().when(fooListener).ownershipChanged(any(DOMEntityOwnershipChange.class));
109         entityReg.close();
110         verifyZeroInteractions(barListener);
111         verify(fooListener).ownershipChanged(fooCaptor.capture());
112         fooChange = fooCaptor.getValue();
113         assertEquals(FOO_FOO_ENTITY, fooChange.getEntity());
114         assertEquals(EntityOwnershipChangeState.LOCAL_OWNERSHIP_LOST_NO_OWNER, fooChange.getState());
115
116         fooReg.close();
117         barReg.close();
118     }
119
120     @Test
121     public void testToString() throws CandidateAlreadyRegisteredException {
122         final UUID uuid = UUID.randomUUID();
123         final String expected = String.format("SimpleDOMEntityOwnershipService{uuid=%s, entities={}, listeners={}}",
124             uuid);
125         assertEquals(expected, new SimpleDOMEntityOwnershipService(uuid).toString());
126     }
127 }