2 * Copyright (c) 2024 PANTHEON.tech, s.r.o. 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.restconf.subscription;
10 import static org.junit.jupiter.api.Assertions.assertEquals;
11 import static org.mockito.ArgumentMatchers.eq;
12 import static org.mockito.Mockito.doReturn;
13 import static org.mockito.Mockito.verify;
16 import org.junit.jupiter.api.BeforeEach;
17 import org.junit.jupiter.api.Test;
18 import org.junit.jupiter.api.extension.ExtendWith;
19 import org.mockito.ArgumentCaptor;
20 import org.mockito.Captor;
21 import org.mockito.Mock;
22 import org.mockito.junit.jupiter.MockitoExtension;
23 import org.opendaylight.mdsal.common.api.CommitInfo;
24 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
25 import org.opendaylight.mdsal.dom.api.DOMDataBroker;
26 import org.opendaylight.mdsal.dom.api.DOMDataTreeWriteTransaction;
27 import org.opendaylight.restconf.notifications.mdsal.MdsalNotificationService;
28 import org.opendaylight.restconf.notifications.mdsal.SubscriptionStateService;
29 import org.opendaylight.restconf.server.api.DatabindPath;
30 import org.opendaylight.restconf.server.api.ServerException;
31 import org.opendaylight.restconf.server.api.testlib.CompletingServerRequest;
32 import org.opendaylight.restconf.server.spi.OperationInput;
33 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.subscribed.notifications.rev190909.KillSubscriptionInput;
34 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.subscribed.notifications.rev190909.KillSubscriptionOutput;
35 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.subscribed.notifications.rev190909.subscriptions.Subscription;
36 import org.opendaylight.yangtools.yang.common.Uint32;
37 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
38 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
39 import org.opendaylight.yangtools.yang.data.spi.node.ImmutableNodes;
41 @ExtendWith(MockitoExtension.class)
42 class KillSubscriptionRpcTest {
43 private static final URI RESTCONF_URI = URI.create("/restconf/");
44 private static final Uint32 ID = Uint32.valueOf(2147483648L);
45 private static final YangInstanceIdentifier.NodeIdentifierWithPredicates IDENTIFIER =
46 YangInstanceIdentifier.NodeIdentifierWithPredicates.of(Subscription.QNAME, SubscriptionUtil.QNAME_ID, ID);
47 private static final ContainerNode INPUT = ImmutableNodes.newContainerBuilder()
48 .withNodeIdentifier(YangInstanceIdentifier.NodeIdentifier.create(KillSubscriptionInput.QNAME))
49 .withChild(ImmutableNodes.leafNode(SubscriptionUtil.QNAME_ID, ID))
53 private DOMDataBroker dataBroker;
55 private SubscriptionStateService subscriptionStateService;
57 private DatabindPath.Rpc operationPath;
59 private SubscriptionStateMachine stateMachine;
61 private DOMDataTreeWriteTransaction writeTx;
63 private CompletingServerRequest<ContainerNode> request;
65 private ArgumentCaptor<ServerException> response;
67 private MdsalNotificationService mdsalService;
68 private KillSubscriptionRpc rpc;
72 mdsalService = new MdsalNotificationService(dataBroker);
73 rpc = new KillSubscriptionRpc(mdsalService, subscriptionStateService, stateMachine);
77 void killSubscriptionTest() {
78 final var responseBuilder = ImmutableNodes.newContainerBuilder()
79 .withNodeIdentifier(YangInstanceIdentifier.NodeIdentifier.create(KillSubscriptionOutput.QNAME))
82 doReturn(writeTx).when(dataBroker).newWriteOnlyTransaction();
83 doReturn(CommitInfo.emptyFluentFuture()).when(writeTx).commit();
84 doReturn(SubscriptionState.ACTIVE).when(stateMachine).getSubscriptionState(ID);
86 rpc.invoke(request, RESTCONF_URI, new OperationInput(operationPath, INPUT));
87 verify(writeTx).delete(eq(LogicalDatastoreType.OPERATIONAL),
88 eq(SubscriptionUtil.SUBSCRIPTIONS.node(IDENTIFIER)));
89 verify(request).completeWith(eq(responseBuilder));
93 void killSubscriptionWrongIDTest() {
94 doReturn(null).when(stateMachine).getSubscriptionState(ID);
96 rpc.invoke(request, RESTCONF_URI, new OperationInput(operationPath, INPUT));
97 verify(request).completeWith(response.capture());
98 assertEquals("No subscription with given ID.", response.getValue().getMessage());
102 void killSubscriptionAlreadyEndedTest() {
103 doReturn(SubscriptionState.END).when(stateMachine).getSubscriptionState(ID);
105 rpc.invoke(request, RESTCONF_URI, new OperationInput(operationPath, INPUT));
106 verify(request).completeWith(response.capture());
107 assertEquals("There is no active or suspended subscription with given ID.",
108 response.getValue().getMessage());