2 * Copyright (c) 2018 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
9 package org.opendaylight.netconf.mdsal.connector.ops;
11 import static org.junit.Assert.assertEquals;
12 import static org.junit.Assert.fail;
13 import static org.mockito.ArgumentMatchers.any;
14 import static org.mockito.Mockito.doReturn;
15 import static org.mockito.Mockito.verify;
16 import static org.mockito.Mockito.verifyZeroInteractions;
17 import static org.mockito.MockitoAnnotations.initMocks;
18 import static org.opendaylight.netconf.mdsal.connector.ops.AbstractNetconfOperationTest.RPC_REPLY_OK;
19 import static org.opendaylight.netconf.mdsal.connector.ops.AbstractNetconfOperationTest.SESSION_ID_FOR_REPORTING;
20 import static org.opendaylight.netconf.mdsal.connector.ops.AbstractNetconfOperationTest.executeOperation;
21 import static org.opendaylight.netconf.mdsal.connector.ops.AbstractNetconfOperationTest.verifyResponse;
23 import com.google.common.util.concurrent.Futures;
24 import java.util.Collections;
25 import org.custommonkey.xmlunit.XMLUnit;
26 import org.junit.Before;
27 import org.junit.Test;
28 import org.mockito.Mock;
29 import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker;
30 import org.opendaylight.controller.md.sal.dom.api.DOMDataReadWriteTransaction;
31 import org.opendaylight.netconf.api.DocumentedException;
32 import org.opendaylight.netconf.mdsal.connector.DOMDataTransactionValidator;
33 import org.opendaylight.netconf.mdsal.connector.DOMDataTransactionValidator.ValidationFailedException;
34 import org.opendaylight.netconf.mdsal.connector.TransactionProvider;
35 import org.w3c.dom.Document;
37 public class ValidateTest {
39 private DOMDataTransactionValidator noopValidator;
41 private DOMDataTransactionValidator failingValidator;
43 private DOMDataReadWriteTransaction readWriteTx;
45 private DOMDataBroker dataBroker;
48 public void setUp() throws Exception {
50 doReturn(Futures.immediateCheckedFuture(null)).when(noopValidator).validate(any());
51 doReturn(Futures.immediateFailedCheckedFuture(new ValidationFailedException("invalid data")))
52 .when(failingValidator).validate(any());
53 doReturn(readWriteTx).when(dataBroker).newReadWriteTransaction();
54 XMLUnit.setIgnoreWhitespace(true);
58 public void testValidateUnsupported() throws Exception {
59 whenValidatorIsNotDefined();
61 validate("messages/mapping/validate/validate.xml");
62 fail("Should have failed - <validate> not supported");
63 } catch (final DocumentedException e) {
64 assertEquals(DocumentedException.ErrorSeverity.ERROR, e.getErrorSeverity());
65 assertEquals(DocumentedException.ErrorTag.OPERATION_NOT_SUPPORTED, e.getErrorTag());
66 assertEquals(DocumentedException.ErrorType.PROTOCOL, e.getErrorType());
71 public void testSourceMissing() throws Exception {
72 whenUsingValidator(noopValidator);
74 validate("messages/mapping/validate/validate_no_source.xml");
75 fail("Should have failed - <source> element is missing");
76 } catch (final DocumentedException e) {
77 assertEquals(DocumentedException.ErrorSeverity.ERROR, e.getErrorSeverity());
78 assertEquals(DocumentedException.ErrorTag.MISSING_ELEMENT, e.getErrorTag());
79 assertEquals(DocumentedException.ErrorType.PROTOCOL, e.getErrorType());
84 public void testSourceRunning() throws Exception {
85 whenUsingValidator(noopValidator);
87 validate("messages/mapping/validate/validate_running.xml");
88 fail("Should have failed - <running/> is not supported");
89 } catch (final DocumentedException e) {
90 assertEquals(DocumentedException.ErrorSeverity.ERROR, e.getErrorSeverity());
91 assertEquals(DocumentedException.ErrorTag.OPERATION_NOT_SUPPORTED, e.getErrorTag());
92 assertEquals(DocumentedException.ErrorType.PROTOCOL, e.getErrorType());
97 public void testValidateEmptyTx() throws Exception {
98 whenUsingValidator(noopValidator);
99 verifyResponse(validate("messages/mapping/validate/validate.xml"), RPC_REPLY_OK);
100 verifyZeroInteractions(noopValidator);
104 public void testValidate() throws Exception {
105 whenUsingValidator(noopValidator);
106 final TransactionProvider transactionProvider = initCandidateTransaction();
107 verifyResponse(validate("messages/mapping/validate/validate.xml", transactionProvider), RPC_REPLY_OK);
108 verify(noopValidator).validate(readWriteTx);
112 public void testValidateFailed() throws Exception {
113 whenUsingValidator(failingValidator);
114 final TransactionProvider transactionProvider = initCandidateTransaction();
116 validate("messages/mapping/validate/validate.xml", transactionProvider);
117 fail("Should have failed - operation failed");
118 } catch (final DocumentedException e) {
119 assertEquals(DocumentedException.ErrorSeverity.ERROR, e.getErrorSeverity());
120 assertEquals(DocumentedException.ErrorTag.OPERATION_FAILED, e.getErrorTag());
121 assertEquals(DocumentedException.ErrorType.APPLICATION, e.getErrorType());
125 private void whenValidatorIsNotDefined() {
126 doReturn(Collections.emptyMap()).when(dataBroker).getSupportedExtensions();
129 private void whenUsingValidator(final DOMDataTransactionValidator validator) {
130 doReturn(Collections.singletonMap(DOMDataTransactionValidator.class, validator))
131 .when(dataBroker).getSupportedExtensions();
134 private TransactionProvider initCandidateTransaction() {
135 final TransactionProvider transactionProvider = new TransactionProvider(dataBroker, SESSION_ID_FOR_REPORTING);
136 transactionProvider.getOrCreateTransaction();
137 return transactionProvider;
140 private Document validate(final String resource,
141 final TransactionProvider transactionProvider) throws Exception {
142 final Validate validate = new Validate(SESSION_ID_FOR_REPORTING, transactionProvider);
143 return executeOperation(validate, resource);
146 private Document validate(final String resource) throws Exception {
147 return validate(resource, new TransactionProvider(dataBroker, SESSION_ID_FOR_REPORTING));