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
8 package org.opendaylight.netconf.mdsal.connector.ops;
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;
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;
36 public class ValidateTest {
38 private DOMDataTransactionValidator noopValidator;
40 private DOMDataTransactionValidator failingValidator;
42 private DOMDataTreeReadWriteTransaction readWriteTx;
44 private DOMDataBroker dataBroker;
47 public void setUp() throws Exception {
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);
57 public void testValidateUnsupported() throws Exception {
58 whenValidatorIsNotDefined();
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());
70 public void testSourceMissing() throws Exception {
71 whenUsingValidator(noopValidator);
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());
83 public void testSourceRunning() throws Exception {
84 whenUsingValidator(noopValidator);
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());
96 public void testValidateEmptyTx() throws Exception {
97 whenUsingValidator(noopValidator);
98 verifyResponse(validate("messages/mapping/validate/validate.xml"), RPC_REPLY_OK);
99 verifyZeroInteractions(noopValidator);
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);
111 public void testValidateFailed() throws Exception {
112 whenUsingValidator(failingValidator);
113 final TransactionProvider transactionProvider = initCandidateTransaction();
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());
124 private void whenValidatorIsNotDefined() {
125 doReturn(ImmutableClassToInstanceMap.of()).when(dataBroker).getExtensions();
128 private void whenUsingValidator(final DOMDataTransactionValidator validator) {
129 doReturn(ImmutableClassToInstanceMap.of(DOMDataTransactionValidator.class, validator))
130 .when(dataBroker).getExtensions();
133 private TransactionProvider initCandidateTransaction() {
134 final TransactionProvider transactionProvider = new TransactionProvider(dataBroker, SESSION_ID_FOR_REPORTING);
135 transactionProvider.getOrCreateTransaction();
136 return transactionProvider;
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);
144 private Document validate(final String resource) throws Exception {
145 return validate(resource, new TransactionProvider(dataBroker, SESSION_ID_FOR_REPORTING));