2 * Copyright (c) 2015 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
8 package org.opendaylight.bgpcep.pcep.topology.provider;
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;
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;
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)
64 private static final byte[] SPEAKER_ID = {0x01, 0x02, 0x03, 0x04};
65 private static final InetSocketAddress ADDRESS = new InetSocketAddress(4321);
68 private DataBroker dataBroker;
70 private Registration listenerReg;
72 private FluentFuture<Optional<LspDbVersion>> listenableFutureMock;
74 private ArgumentCaptor<DataTreeChangeListener<?>> captor;
76 private TlvsBuilder tlvsBuilder;
80 tlvsBuilder = new TlvsBuilder().addAugmentation(new Tlvs1Builder()
81 .setStateful(new StatefulBuilder().addAugmentation(new Stateful1Builder().build()).build())
83 doReturn(listenerReg).when(dataBroker).registerTreeChangeListener(any(), captor.capture());
84 doNothing().when(listenerReg).close();
88 public void testSetPeerProposalSuccess() throws Exception {
90 final var listeners = captor.getAllValues();
91 assertEquals(2, listeners.size());
93 // not entirely accurate, but works well enough
94 final var modPath = TOPOLOGY_IID.child(Node.class,
95 new NodeKey(ServerSessionManager.createNodeId(ADDRESS.getAddress())));
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();
103 for (var listener : listeners) {
104 if (listener instanceof LspDbVersionListener) {
105 listener.onDataTreeChanged(List.of(dbverMod));
111 assertEquals(new Tlvs3Builder().setLspDbVersion(LSP_DB_VERSION).build(), tlvsBuilder.augmentation(Tlvs3.class));
115 public void testSetPeerProposalWithEntityIdSuccess() throws Exception {
116 updateBuilder(() -> {
117 final var listeners = captor.getAllValues();
118 assertEquals(2, listeners.size());
120 // not entirely accurate, but works well enough
121 final var modPath = TOPOLOGY_IID.child(Node.class,
122 new NodeKey(ServerSessionManager.createNodeId(ADDRESS.getAddress())));
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();
130 final var speakerRoot = mock(DataObjectModification.class);
131 doReturn(new PcepNodeSyncConfigBuilder().setSpeakerEntityIdValue(SPEAKER_ID).build()).when(speakerRoot)
133 final var speakerMod = mock(DataTreeModification.class);
134 doReturn(DataTreeIdentifier.of(LogicalDatastoreType.CONFIGURATION, modPath)).when(speakerMod)
136 doReturn(speakerRoot).when(speakerMod).getRootNode();
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));
146 final Tlvs3 aug = tlvsBuilder.augmentation(Tlvs3.class);
148 assertEquals(LSP_DB_VERSION, aug.getLspDbVersion());
149 assertEquals(new SpeakerEntityIdBuilder().setSpeakerEntityIdValue(SPEAKER_ID).build(),
150 aug.getSpeakerEntityId());
154 public void testSetPeerProposalAbsent() throws Exception {
156 assertNull(tlvsBuilder.augmentation(Tlvs3.class));
159 private void updateBuilder() {
163 private void updateBuilder(final Runnable customizer) {
164 try (var proposal = new PCEPStatefulPeerProposal(dataBroker, TOPOLOGY_IID)) {
165 if (customizer != null) {
168 proposal.setPeerSpecificProposal(ADDRESS, tlvsBuilder);