Bump upstreams
[bgpcep.git] / pcep / topology / topology-provider / src / test / java / org / opendaylight / bgpcep / pcep / topology / provider / PCEPStatefulPeerProposalTest.java
1 /*
2  * Copyright (c) 2015 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.bgpcep.pcep.topology.provider;
9
10 import static org.junit.Assert.assertEquals;
11 import static org.junit.Assert.assertNotNull;
12 import static org.junit.Assert.assertNull;
13 import static org.mockito.ArgumentMatchers.any;
14 import static org.mockito.Mockito.doNothing;
15 import static org.mockito.Mockito.doReturn;
16 import static org.mockito.Mockito.mock;
17
18 import com.google.common.util.concurrent.FluentFuture;
19 import java.net.InetSocketAddress;
20 import java.util.List;
21 import java.util.Optional;
22 import org.junit.Before;
23 import org.junit.Test;
24 import org.junit.runner.RunWith;
25 import org.mockito.ArgumentCaptor;
26 import org.mockito.Captor;
27 import org.mockito.Mock;
28 import org.mockito.junit.MockitoJUnitRunner;
29 import org.opendaylight.bgpcep.pcep.topology.provider.PCEPStatefulPeerProposal.LspDbVersionListener;
30 import org.opendaylight.bgpcep.pcep.topology.provider.PCEPStatefulPeerProposal.SpeakerIdListener;
31 import org.opendaylight.mdsal.binding.api.DataBroker;
32 import org.opendaylight.mdsal.binding.api.DataObjectModification;
33 import org.opendaylight.mdsal.binding.api.DataTreeChangeListener;
34 import org.opendaylight.mdsal.binding.api.DataTreeIdentifier;
35 import org.opendaylight.mdsal.binding.api.DataTreeModification;
36 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep.sync.optimizations.rev200720.Stateful1Builder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep.sync.optimizations.rev200720.Tlvs3;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep.sync.optimizations.rev200720.Tlvs3Builder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep.sync.optimizations.rev200720.lsp.db.version.tlv.LspDbVersion;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep.sync.optimizations.rev200720.lsp.db.version.tlv.LspDbVersionBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep.sync.optimizations.rev200720.speaker.entity.id.tlv.SpeakerEntityIdBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.Tlvs1Builder;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.stateful.capability.tlv.StatefulBuilder;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.open.object.open.TlvsBuilder;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.topology.pcep.sync.optimizations.config.rev181109.PcepNodeSyncConfigBuilder;
47 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
48 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId;
49 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
50 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey;
51 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
52 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeKey;
53 import org.opendaylight.yangtools.concepts.Registration;
54 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
55 import org.opendaylight.yangtools.yang.common.Uint64;
56
57 @RunWith(MockitoJUnitRunner.StrictStubs.class)
58 public class PCEPStatefulPeerProposalTest {
59     private static final InstanceIdentifier<Topology> TOPOLOGY_IID = InstanceIdentifier.create(NetworkTopology.class)
60             .child(Topology.class, new TopologyKey(new TopologyId("topology")));
61     private static final LspDbVersion LSP_DB_VERSION = new LspDbVersionBuilder()
62         .setLspDbVersionValue(Uint64.ONE)
63         .build();
64     private static final byte[] SPEAKER_ID = {0x01, 0x02, 0x03, 0x04};
65     private static final InetSocketAddress ADDRESS = new InetSocketAddress(4321);
66
67     @Mock
68     private DataBroker dataBroker;
69     @Mock
70     private Registration listenerReg;
71     @Mock
72     private FluentFuture<Optional<LspDbVersion>> listenableFutureMock;
73     @Captor
74     private ArgumentCaptor<DataTreeChangeListener<?>> captor;
75
76     private TlvsBuilder tlvsBuilder;
77
78     @Before
79     public void setUp() {
80         tlvsBuilder = new TlvsBuilder().addAugmentation(new Tlvs1Builder()
81             .setStateful(new StatefulBuilder().addAugmentation(new Stateful1Builder().build()).build())
82             .build());
83         doReturn(listenerReg).when(dataBroker).registerTreeChangeListener(any(), captor.capture());
84         doNothing().when(listenerReg).close();
85     }
86
87     @Test
88     public void testSetPeerProposalSuccess() throws Exception {
89         updateBuilder(() -> {
90             final var listeners = captor.getAllValues();
91             assertEquals(2, listeners.size());
92
93             // not entirely accurate, but works well enough
94             final var modPath = TOPOLOGY_IID.child(Node.class,
95                 new NodeKey(ServerSessionManager.createNodeId(ADDRESS.getAddress())));
96
97             final var dbverRoot = mock(DataObjectModification.class);
98             doReturn(LSP_DB_VERSION).when(dbverRoot).dataAfter();
99             final var dbverMod = mock(DataTreeModification.class);
100             doReturn(DataTreeIdentifier.of(LogicalDatastoreType.OPERATIONAL, modPath)).when(dbverMod).getRootPath();
101             doReturn(dbverRoot).when(dbverMod).getRootNode();
102
103             for (var listener : listeners) {
104                 if (listener instanceof LspDbVersionListener) {
105                     listener.onDataTreeChanged(List.of(dbverMod));
106                 }
107             }
108
109             // Mock lspdb
110         });
111         assertEquals(new Tlvs3Builder().setLspDbVersion(LSP_DB_VERSION).build(), tlvsBuilder.augmentation(Tlvs3.class));
112     }
113
114     @Test
115     public void testSetPeerProposalWithEntityIdSuccess() throws Exception {
116         updateBuilder(() -> {
117             final var listeners = captor.getAllValues();
118             assertEquals(2, listeners.size());
119
120             // not entirely accurate, but works well enough
121             final var modPath = TOPOLOGY_IID.child(Node.class,
122                 new NodeKey(ServerSessionManager.createNodeId(ADDRESS.getAddress())));
123
124             final var dbverRoot = mock(DataObjectModification.class);
125             doReturn(LSP_DB_VERSION).when(dbverRoot).dataAfter();
126             final var dbverMod = mock(DataTreeModification.class);
127             doReturn(DataTreeIdentifier.of(LogicalDatastoreType.OPERATIONAL, modPath)).when(dbverMod).getRootPath();
128             doReturn(dbverRoot).when(dbverMod).getRootNode();
129
130             final var speakerRoot = mock(DataObjectModification.class);
131             doReturn(new PcepNodeSyncConfigBuilder().setSpeakerEntityIdValue(SPEAKER_ID).build()).when(speakerRoot)
132                 .dataAfter();
133             final var speakerMod = mock(DataTreeModification.class);
134             doReturn(DataTreeIdentifier.of(LogicalDatastoreType.CONFIGURATION, modPath)).when(speakerMod)
135                 .getRootPath();
136             doReturn(speakerRoot).when(speakerMod).getRootNode();
137
138             for (var listener : listeners) {
139                 if (listener instanceof SpeakerIdListener) {
140                     listener.onDataTreeChanged(List.of(speakerMod));
141                 } else if (listener instanceof LspDbVersionListener) {
142                     listener.onDataTreeChanged(List.of(dbverMod));
143                 }
144             }
145         });
146         final Tlvs3 aug = tlvsBuilder.augmentation(Tlvs3.class);
147         assertNotNull(aug);
148         assertEquals(LSP_DB_VERSION, aug.getLspDbVersion());
149         assertEquals(new SpeakerEntityIdBuilder().setSpeakerEntityIdValue(SPEAKER_ID).build(),
150             aug.getSpeakerEntityId());
151     }
152
153     @Test
154     public void testSetPeerProposalAbsent() throws Exception {
155         updateBuilder();
156         assertNull(tlvsBuilder.augmentation(Tlvs3.class));
157     }
158
159     private void updateBuilder() {
160         updateBuilder(null);
161     }
162
163     private void updateBuilder(final Runnable customizer) {
164         try (var proposal = new PCEPStatefulPeerProposal(dataBroker, TOPOLOGY_IID)) {
165             if (customizer != null) {
166                 customizer.run();
167             }
168             proposal.setPeerSpecificProposal(ADDRESS, tlvsBuilder);
169         }
170     }
171 }