Migrate netconf to MD-SAL APIs
[netconf.git] / netconf / mdsal-netconf-connector / src / test / java / org / opendaylight / netconf / mdsal / connector / ops / ValidateTest.java
1 /*
2  * Copyright (c) 2018 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.mdsal.connector.ops;
9
10 import static org.junit.Assert.assertEquals;
11 import static org.junit.Assert.fail;
12 import static org.mockito.ArgumentMatchers.any;
13 import static org.mockito.Mockito.doReturn;
14 import static org.mockito.Mockito.verify;
15 import static org.mockito.Mockito.verifyZeroInteractions;
16 import static org.mockito.MockitoAnnotations.initMocks;
17 import static org.opendaylight.netconf.mdsal.connector.ops.AbstractNetconfOperationTest.RPC_REPLY_OK;
18 import static org.opendaylight.netconf.mdsal.connector.ops.AbstractNetconfOperationTest.SESSION_ID_FOR_REPORTING;
19 import static org.opendaylight.netconf.mdsal.connector.ops.AbstractNetconfOperationTest.executeOperation;
20 import static org.opendaylight.netconf.mdsal.connector.ops.AbstractNetconfOperationTest.verifyResponse;
21
22 import com.google.common.collect.ImmutableClassToInstanceMap;
23 import com.google.common.util.concurrent.Futures;
24 import org.custommonkey.xmlunit.XMLUnit;
25 import org.junit.Before;
26 import org.junit.Test;
27 import org.mockito.Mock;
28 import org.opendaylight.mdsal.dom.api.DOMDataBroker;
29 import org.opendaylight.mdsal.dom.api.DOMDataTreeReadWriteTransaction;
30 import org.opendaylight.netconf.api.DocumentedException;
31 import org.opendaylight.netconf.mdsal.connector.DOMDataTransactionValidator;
32 import org.opendaylight.netconf.mdsal.connector.DOMDataTransactionValidator.ValidationFailedException;
33 import org.opendaylight.netconf.mdsal.connector.TransactionProvider;
34 import org.w3c.dom.Document;
35
36 public class ValidateTest {
37     @Mock
38     private DOMDataTransactionValidator noopValidator;
39     @Mock
40     private DOMDataTransactionValidator failingValidator;
41     @Mock
42     private DOMDataTreeReadWriteTransaction readWriteTx;
43     @Mock
44     private DOMDataBroker dataBroker;
45
46     @Before
47     public void setUp() throws Exception {
48         initMocks(this);
49         doReturn(Futures.immediateCheckedFuture(null)).when(noopValidator).validate(any());
50         doReturn(Futures.immediateFailedCheckedFuture(new ValidationFailedException("invalid data")))
51             .when(failingValidator).validate(any());
52         doReturn(readWriteTx).when(dataBroker).newReadWriteTransaction();
53         XMLUnit.setIgnoreWhitespace(true);
54     }
55
56     @Test
57     public void testValidateUnsupported() throws Exception {
58         whenValidatorIsNotDefined();
59         try {
60             validate("messages/mapping/validate/validate.xml");
61             fail("Should have failed - <validate> not supported");
62         } catch (final DocumentedException e) {
63             assertEquals(DocumentedException.ErrorSeverity.ERROR, e.getErrorSeverity());
64             assertEquals(DocumentedException.ErrorTag.OPERATION_NOT_SUPPORTED, e.getErrorTag());
65             assertEquals(DocumentedException.ErrorType.PROTOCOL, e.getErrorType());
66         }
67     }
68
69     @Test
70     public void testSourceMissing() throws Exception {
71         whenUsingValidator(noopValidator);
72         try {
73             validate("messages/mapping/validate/validate_no_source.xml");
74             fail("Should have failed - <source> element is missing");
75         } catch (final DocumentedException e) {
76             assertEquals(DocumentedException.ErrorSeverity.ERROR, e.getErrorSeverity());
77             assertEquals(DocumentedException.ErrorTag.MISSING_ELEMENT, e.getErrorTag());
78             assertEquals(DocumentedException.ErrorType.PROTOCOL, e.getErrorType());
79         }
80     }
81
82     @Test
83     public void testSourceRunning() throws Exception {
84         whenUsingValidator(noopValidator);
85         try {
86             validate("messages/mapping/validate/validate_running.xml");
87             fail("Should have failed - <running/> is not supported");
88         } catch (final DocumentedException e) {
89             assertEquals(DocumentedException.ErrorSeverity.ERROR, e.getErrorSeverity());
90             assertEquals(DocumentedException.ErrorTag.OPERATION_NOT_SUPPORTED, e.getErrorTag());
91             assertEquals(DocumentedException.ErrorType.PROTOCOL, e.getErrorType());
92         }
93     }
94
95     @Test
96     public void testValidateEmptyTx() throws Exception {
97         whenUsingValidator(noopValidator);
98         verifyResponse(validate("messages/mapping/validate/validate.xml"), RPC_REPLY_OK);
99         verifyZeroInteractions(noopValidator);
100     }
101
102     @Test
103     public void testValidate() throws Exception {
104         whenUsingValidator(noopValidator);
105         final TransactionProvider transactionProvider = initCandidateTransaction();
106         verifyResponse(validate("messages/mapping/validate/validate.xml", transactionProvider), RPC_REPLY_OK);
107         verify(noopValidator).validate(readWriteTx);
108     }
109
110     @Test
111     public void testValidateFailed() throws Exception {
112         whenUsingValidator(failingValidator);
113         final TransactionProvider transactionProvider = initCandidateTransaction();
114         try {
115             validate("messages/mapping/validate/validate.xml", transactionProvider);
116             fail("Should have failed - operation failed");
117         } catch (final DocumentedException e) {
118             assertEquals(DocumentedException.ErrorSeverity.ERROR, e.getErrorSeverity());
119             assertEquals(DocumentedException.ErrorTag.OPERATION_FAILED, e.getErrorTag());
120             assertEquals(DocumentedException.ErrorType.APPLICATION, e.getErrorType());
121         }
122     }
123
124     private void whenValidatorIsNotDefined() {
125         doReturn(ImmutableClassToInstanceMap.of()).when(dataBroker).getExtensions();
126     }
127
128     private void whenUsingValidator(final DOMDataTransactionValidator validator) {
129         doReturn(ImmutableClassToInstanceMap.of(DOMDataTransactionValidator.class, validator))
130             .when(dataBroker).getExtensions();
131     }
132
133     private TransactionProvider initCandidateTransaction() {
134         final TransactionProvider transactionProvider = new TransactionProvider(dataBroker, SESSION_ID_FOR_REPORTING);
135         transactionProvider.getOrCreateTransaction();
136         return transactionProvider;
137     }
138
139     private Document validate(final String resource,  final TransactionProvider transactionProvider) throws Exception {
140         final Validate validate = new Validate(SESSION_ID_FOR_REPORTING, transactionProvider);
141         return executeOperation(validate, resource);
142     }
143
144     private Document validate(final String resource) throws Exception {
145         return validate(resource, new TransactionProvider(dataBroker, SESSION_ID_FOR_REPORTING));
146     }
147 }