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.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;
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.ErrorTag;
37 import org.opendaylight.yangtools.yang.common.ErrorType;
38 import org.w3c.dom.Document;
40 @RunWith(MockitoJUnitRunner.StrictStubs.class)
41 public class ValidateTest {
43 private DOMDataTransactionValidator noopValidator;
45 private DOMDataTransactionValidator failingValidator;
47 private DOMDataTreeReadWriteTransaction readWriteTx;
49 private DOMDataBroker dataBroker;
53 doReturn(FluentFutures.immediateNullFluentFuture()).when(noopValidator).validate(any());
54 doReturn(FluentFutures.immediateFailedFluentFuture(new ValidationFailedException("invalid data")))
55 .when(failingValidator).validate(any());
56 doReturn(readWriteTx).when(dataBroker).newReadWriteTransaction();
57 XMLUnit.setIgnoreWhitespace(true);
61 public void testValidateUnsupported() throws Exception {
62 whenValidatorIsNotDefined();
63 final DocumentedException e = assertThrows(DocumentedException.class,
64 () -> validate("messages/mapping/validate/validate.xml"));
65 assertEquals(ErrorSeverity.ERROR, e.getErrorSeverity());
66 assertEquals(ErrorTag.OPERATION_NOT_SUPPORTED, e.getErrorTag());
67 assertEquals(ErrorType.PROTOCOL, e.getErrorType());
71 public void testSourceMissing() throws Exception {
72 whenUsingValidator(noopValidator);
73 final DocumentedException e = assertThrows(DocumentedException.class,
74 () -> validate("messages/mapping/validate/validate_no_source.xml"));
75 assertEquals(ErrorSeverity.ERROR, e.getErrorSeverity());
76 assertEquals(ErrorTag.MISSING_ELEMENT, e.getErrorTag());
77 assertEquals(ErrorType.PROTOCOL, e.getErrorType());
81 public void testSourceRunning() throws Exception {
82 whenUsingValidator(noopValidator);
83 final DocumentedException e = assertThrows(DocumentedException.class,
84 () -> validate("messages/mapping/validate/validate_running.xml"));
85 assertEquals(ErrorSeverity.ERROR, e.getErrorSeverity());
86 assertEquals(ErrorTag.OPERATION_NOT_SUPPORTED, e.getErrorTag());
87 assertEquals(ErrorType.PROTOCOL, e.getErrorType());
91 public void testValidateEmptyTx() throws Exception {
92 whenUsingValidator(noopValidator);
93 verifyResponse(validate("messages/mapping/validate/validate.xml"), RPC_REPLY_OK);
94 verifyNoMoreInteractions(noopValidator);
98 public void testValidate() throws Exception {
99 whenUsingValidator(noopValidator);
100 final TransactionProvider transactionProvider = initCandidateTransaction();
101 verifyResponse(validate("messages/mapping/validate/validate.xml", transactionProvider), RPC_REPLY_OK);
102 verify(noopValidator).validate(readWriteTx);
106 public void testValidateFailed() throws Exception {
107 whenUsingValidator(failingValidator);
108 final TransactionProvider transactionProvider = initCandidateTransaction();
109 final DocumentedException e = assertThrows(DocumentedException.class,
110 () -> validate("messages/mapping/validate/validate.xml", transactionProvider));
111 assertEquals(ErrorSeverity.ERROR, e.getErrorSeverity());
112 assertEquals(ErrorTag.OPERATION_FAILED, e.getErrorTag());
113 assertEquals(ErrorType.APPLICATION, e.getErrorType());
116 private void whenValidatorIsNotDefined() {
117 doReturn(ImmutableClassToInstanceMap.of()).when(dataBroker).getExtensions();
120 private void whenUsingValidator(final DOMDataTransactionValidator validator) {
121 doReturn(ImmutableClassToInstanceMap.of(DOMDataTransactionValidator.class, validator))
122 .when(dataBroker).getExtensions();
125 private TransactionProvider initCandidateTransaction() {
126 final TransactionProvider transactionProvider = new TransactionProvider(dataBroker, SESSION_ID_FOR_REPORTING);
127 transactionProvider.getOrCreateTransaction();
128 return transactionProvider;
131 private static Document validate(final String resource, final TransactionProvider transactionProvider)
133 final Validate validate = new Validate(SESSION_ID_FOR_REPORTING, transactionProvider);
134 return executeOperation(validate, resource);
137 private Document validate(final String resource) throws Exception {
138 return validate(resource, new TransactionProvider(dataBroker, SESSION_ID_FOR_REPORTING));