Remove most RestconfDocumentedException users
[netconf.git] / protocol / netconf-server / src / test / java / org / opendaylight / netconf / server / osgi / NetconfOperationRouterImplTest.java
1 /*
2  * Copyright (c) 2016 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.netconf.server.osgi;
9
10 import static org.junit.jupiter.api.Assertions.assertEquals;
11 import static org.junit.jupiter.api.Assertions.assertFalse;
12 import static org.junit.jupiter.api.Assertions.assertThrows;
13 import static org.junit.jupiter.api.Assertions.assertTrue;
14 import static org.mockito.ArgumentMatchers.any;
15 import static org.mockito.Mockito.doNothing;
16 import static org.mockito.Mockito.doReturn;
17 import static org.mockito.Mockito.verify;
18
19 import java.io.IOException;
20 import java.util.Set;
21 import org.junit.jupiter.api.BeforeAll;
22 import org.junit.jupiter.api.BeforeEach;
23 import org.junit.jupiter.api.Test;
24 import org.junit.jupiter.api.extension.ExtendWith;
25 import org.mockito.ArgumentCaptor;
26 import org.mockito.Mock;
27 import org.mockito.junit.jupiter.MockitoExtension;
28 import org.opendaylight.netconf.api.DocumentedException;
29 import org.opendaylight.netconf.api.xml.XmlUtil;
30 import org.opendaylight.netconf.server.api.operations.HandlingPriority;
31 import org.opendaylight.netconf.server.api.operations.NetconfOperation;
32 import org.opendaylight.netconf.server.api.operations.NetconfOperationChainedExecution;
33 import org.opendaylight.netconf.server.api.operations.NetconfOperationService;
34 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.SessionIdType;
35 import org.opendaylight.yangtools.yang.common.ErrorTag;
36 import org.opendaylight.yangtools.yang.common.Uint32;
37 import org.w3c.dom.Document;
38 import org.xml.sax.SAXException;
39
40 @ExtendWith(MockitoExtension.class)
41 class NetconfOperationRouterImplTest {
42     private static final String TEST_RPC =
43         "<rpc message-id=\"101\" xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\"><test/></rpc>\n";
44     private static final String MAX_PRIORITY_REPLY = "<high/>";
45     private static final String DEFAULT_PRIORITY_REPLY = "<default/>";
46
47     private static Document TEST_RPC_DOC;
48
49     @Mock
50     private NetconfOperationService operationService;
51     @Mock
52     private NetconfOperationService operationService2;
53     @Mock
54     private NetconfOperation maxPrioMock;
55     @Mock
56     private NetconfOperation defaultPrioMock;
57
58     private NetconfOperationRouterImpl operationRouter;
59     private NetconfOperationRouterImpl emptyOperationRouter;
60
61     @BeforeAll
62     static void suiteSetUp() throws IOException, SAXException {
63         TEST_RPC_DOC = XmlUtil.readXmlToDocument(TEST_RPC);
64     }
65
66     @BeforeEach
67     void setUp() {
68         doReturn(Set.of(maxPrioMock, defaultPrioMock)).when(operationService).getNetconfOperations();
69
70         final var sessionId = new SessionIdType(Uint32.ONE);
71         operationRouter = new NetconfOperationRouterImpl(operationService, null, sessionId);
72         doReturn(Set.of()).when(operationService2).getNetconfOperations();
73         emptyOperationRouter = new NetconfOperationRouterImpl(operationService2, null, sessionId);
74     }
75
76     @Test
77     void testOnNetconfMessage() throws Exception {
78         doReturn(HandlingPriority.HANDLE_WITH_MAX_PRIORITY).when(maxPrioMock).canHandle(any(Document.class));
79         doReturn(XmlUtil.readXmlToDocument(MAX_PRIORITY_REPLY)).when(maxPrioMock).handle(any(Document.class),
80             any(NetconfOperationChainedExecution.class));
81
82         doReturn(HandlingPriority.HANDLE_WITH_DEFAULT_PRIORITY).when(defaultPrioMock).canHandle(any(Document.class));
83         doReturn(XmlUtil.readXmlToDocument(DEFAULT_PRIORITY_REPLY)).when(defaultPrioMock).handle(any(Document.class),
84             any(NetconfOperationChainedExecution.class));
85         final ArgumentCaptor<NetconfOperationChainedExecution> highPriorityChainEx =
86                 ArgumentCaptor.forClass(NetconfOperationChainedExecution.class);
87         final ArgumentCaptor<NetconfOperationChainedExecution> defaultPriorityChainEx =
88                 ArgumentCaptor.forClass(NetconfOperationChainedExecution.class);
89
90         final Document document = operationRouter.onNetconfMessage(TEST_RPC_DOC, null);
91
92         //max priority message is first in chain
93         verify(maxPrioMock).handle(any(Document.class), highPriorityChainEx.capture());
94         final NetconfOperationChainedExecution chainedExecution = highPriorityChainEx.getValue();
95         assertFalse(chainedExecution.isExecutionTermination());
96
97         //execute next in chain
98         final Document execute = chainedExecution.execute(XmlUtil.newDocument());
99         assertEquals(DEFAULT_PRIORITY_REPLY, XmlUtil.toString(execute).trim());
100
101         //default priority message is second and last
102         verify(defaultPrioMock).handle(any(Document.class), defaultPriorityChainEx.capture());
103         assertTrue(defaultPriorityChainEx.getValue().isExecutionTermination());
104
105         assertEquals(MAX_PRIORITY_REPLY, XmlUtil.toString(document).trim());
106     }
107
108     @Test
109     void testOnNetconfMessageFail() {
110         final DocumentedException ex =  assertThrows(DocumentedException.class,
111             () -> emptyOperationRouter.onNetconfMessage(TEST_RPC_DOC, null));
112         assertEquals(ErrorTag.OPERATION_NOT_SUPPORTED, ex.getErrorTag());
113     }
114
115     @Test
116     void testClose() {
117         doNothing().when(operationService).close();
118         operationRouter.close();
119         verify(operationService).close();
120     }
121 }