Remove DocumentedException.ErrorType
[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.assertThrows;
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.verifyNoMoreInteractions;
16 import static org.opendaylight.netconf.mdsal.connector.ops.AbstractNetconfOperationTest.RPC_REPLY_OK;
17 import static org.opendaylight.netconf.mdsal.connector.ops.AbstractNetconfOperationTest.SESSION_ID_FOR_REPORTING;
18 import static org.opendaylight.netconf.mdsal.connector.ops.AbstractNetconfOperationTest.executeOperation;
19 import static org.opendaylight.netconf.mdsal.connector.ops.AbstractNetconfOperationTest.verifyResponse;
20
21 import com.google.common.collect.ImmutableClassToInstanceMap;
22 import org.custommonkey.xmlunit.XMLUnit;
23 import org.junit.Before;
24 import org.junit.Test;
25 import org.junit.runner.RunWith;
26 import org.mockito.Mock;
27 import org.mockito.junit.MockitoJUnitRunner;
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.opendaylight.yangtools.util.concurrent.FluentFutures;
35 import org.opendaylight.yangtools.yang.common.ErrorSeverity;
36 import org.opendaylight.yangtools.yang.common.ErrorType;
37 import org.w3c.dom.Document;
38
39 @RunWith(MockitoJUnitRunner.StrictStubs.class)
40 public class ValidateTest {
41     @Mock
42     private DOMDataTransactionValidator noopValidator;
43     @Mock
44     private DOMDataTransactionValidator failingValidator;
45     @Mock
46     private DOMDataTreeReadWriteTransaction readWriteTx;
47     @Mock
48     private DOMDataBroker dataBroker;
49
50     @Before
51     public void setUp() {
52         doReturn(FluentFutures.immediateNullFluentFuture()).when(noopValidator).validate(any());
53         doReturn(FluentFutures.immediateFailedFluentFuture(new ValidationFailedException("invalid data")))
54             .when(failingValidator).validate(any());
55         doReturn(readWriteTx).when(dataBroker).newReadWriteTransaction();
56         XMLUnit.setIgnoreWhitespace(true);
57     }
58
59     @Test
60     public void testValidateUnsupported() throws Exception {
61         whenValidatorIsNotDefined();
62         final DocumentedException e = assertThrows(DocumentedException.class,
63             () -> validate("messages/mapping/validate/validate.xml"));
64         assertEquals(ErrorSeverity.ERROR, e.getErrorSeverity());
65         assertEquals(DocumentedException.ErrorTag.OPERATION_NOT_SUPPORTED, e.getErrorTag());
66         assertEquals(ErrorType.PROTOCOL, e.getErrorType());
67     }
68
69     @Test
70     public void testSourceMissing() throws Exception {
71         whenUsingValidator(noopValidator);
72         final DocumentedException e = assertThrows(DocumentedException.class,
73             () -> validate("messages/mapping/validate/validate_no_source.xml"));
74         assertEquals(ErrorSeverity.ERROR, e.getErrorSeverity());
75         assertEquals(DocumentedException.ErrorTag.MISSING_ELEMENT, e.getErrorTag());
76         assertEquals(ErrorType.PROTOCOL, e.getErrorType());
77     }
78
79     @Test
80     public void testSourceRunning() throws Exception {
81         whenUsingValidator(noopValidator);
82         final DocumentedException e = assertThrows(DocumentedException.class,
83             () -> validate("messages/mapping/validate/validate_running.xml"));
84         assertEquals(ErrorSeverity.ERROR, e.getErrorSeverity());
85         assertEquals(DocumentedException.ErrorTag.OPERATION_NOT_SUPPORTED, e.getErrorTag());
86         assertEquals(ErrorType.PROTOCOL, e.getErrorType());
87     }
88
89     @Test
90     public void testValidateEmptyTx() throws Exception {
91         whenUsingValidator(noopValidator);
92         verifyResponse(validate("messages/mapping/validate/validate.xml"), RPC_REPLY_OK);
93         verifyNoMoreInteractions(noopValidator);
94     }
95
96     @Test
97     public void testValidate() throws Exception {
98         whenUsingValidator(noopValidator);
99         final TransactionProvider transactionProvider = initCandidateTransaction();
100         verifyResponse(validate("messages/mapping/validate/validate.xml", transactionProvider), RPC_REPLY_OK);
101         verify(noopValidator).validate(readWriteTx);
102     }
103
104     @Test
105     public void testValidateFailed() throws Exception {
106         whenUsingValidator(failingValidator);
107         final TransactionProvider transactionProvider = initCandidateTransaction();
108         final DocumentedException e = assertThrows(DocumentedException.class,
109             () -> validate("messages/mapping/validate/validate.xml", transactionProvider));
110         assertEquals(ErrorSeverity.ERROR, e.getErrorSeverity());
111         assertEquals(DocumentedException.ErrorTag.OPERATION_FAILED, e.getErrorTag());
112         assertEquals(ErrorType.APPLICATION, e.getErrorType());
113     }
114
115     private void whenValidatorIsNotDefined() {
116         doReturn(ImmutableClassToInstanceMap.of()).when(dataBroker).getExtensions();
117     }
118
119     private void whenUsingValidator(final DOMDataTransactionValidator validator) {
120         doReturn(ImmutableClassToInstanceMap.of(DOMDataTransactionValidator.class, validator))
121             .when(dataBroker).getExtensions();
122     }
123
124     private TransactionProvider initCandidateTransaction() {
125         final TransactionProvider transactionProvider = new TransactionProvider(dataBroker, SESSION_ID_FOR_REPORTING);
126         transactionProvider.getOrCreateTransaction();
127         return transactionProvider;
128     }
129
130     private static Document validate(final String resource,  final TransactionProvider transactionProvider)
131             throws Exception {
132         final Validate validate = new Validate(SESSION_ID_FOR_REPORTING, transactionProvider);
133         return executeOperation(validate, resource);
134     }
135
136     private Document validate(final String resource) throws Exception {
137         return validate(resource, new TransactionProvider(dataBroker, SESSION_ID_FOR_REPORTING));
138     }
139 }