import static org.junit.Assert.fail;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.inOrder;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import org.junit.Test;
import org.mockito.InOrder;
import org.mockito.Mock;
+import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope;
import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
import org.opendaylight.controller.md.sal.dom.api.DOMRpcException;
import org.opendaylight.controller.md.sal.dom.api.DOMRpcResult;
import org.opendaylight.controller.md.sal.dom.api.DOMRpcService;
+import org.opendaylight.controller.md.sal.dom.api.DOMTransactionChain;
import org.opendaylight.controller.sal.core.api.Broker.ConsumerSession;
import org.opendaylight.netconf.sal.restconf.impl.BrokerFacade;
import org.opendaylight.netconf.sal.restconf.impl.ControllerContext;
import org.opendaylight.netconf.sal.streams.listeners.ListenerAdapter;
import org.opendaylight.netconf.sal.streams.listeners.NotificationListenerAdapter;
import org.opendaylight.netconf.sal.streams.listeners.Notificator;
+import org.opendaylight.restconf.handlers.SchemaContextHandler;
+import org.opendaylight.restconf.handlers.TransactionChainHandler;
+import org.opendaylight.yang.gen.v1.urn.sal.restconf.event.subscription.rev140708.NotificationOutputTypeGrouping.NotificationOutputType;
import org.opendaylight.yangtools.concepts.ListenerRegistration;
import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.common.RpcError;
+import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
private final BrokerFacade brokerFacade = BrokerFacade.getInstance();
private final NormalizedNode<?, ?> dummyNode = createDummyNode("test:module", "2014-01-09", "interfaces");
private final CheckedFuture<Optional<NormalizedNode<?, ?>>, ReadFailedException> dummyNodeInFuture =
- wrapDummyNode(dummyNode);
+ wrapDummyNode(this.dummyNode);
private final QName qname = TestUtils.buildQName("interfaces","test:module", "2014-01-09");
- private final SchemaPath type = SchemaPath.create(true, qname);
- private final YangInstanceIdentifier instanceID = YangInstanceIdentifier.builder().node(qname).build();
+ private final SchemaPath type = SchemaPath.create(true, this.qname);
+ private final YangInstanceIdentifier instanceID = YangInstanceIdentifier.builder().node(this.qname).build();
@Before
public void setUp() throws Exception {
ControllerContext.getInstance().setSchemas(TestUtils.loadSchemaContext("/full-versions/test-module"));
}
- private CheckedFuture<Optional<NormalizedNode<?, ?>>, ReadFailedException> wrapDummyNode(
+ private static CheckedFuture<Optional<NormalizedNode<?, ?>>, ReadFailedException> wrapDummyNode(
final NormalizedNode<?, ?> dummyNode) {
return Futures.immediateCheckedFuture(Optional.<NormalizedNode<?, ?>> of(dummyNode));
}
- private CheckedFuture<Boolean, ReadFailedException> wrapExistence(final Boolean exists) {
+ private static CheckedFuture<Boolean, ReadFailedException> wrapExistence(final Boolean exists) {
return Futures.immediateCheckedFuture(exists);
}
/**
* Value of this node shouldn't be important for testing purposes
*/
- private NormalizedNode<?, ?> createDummyNode(final String namespace, final String date, final String localName) {
+ private static NormalizedNode<?, ?> createDummyNode(final String namespace, final String date,
+ final String localName) {
return Builders.containerBuilder()
.withNodeIdentifier(new NodeIdentifier(QName.create(namespace, date, localName))).build();
}
this.brokerFacade.readOperationalData(this.instanceID);
}
+ @Test
+ public void test503() throws Exception {
+ final RpcError error = RpcResultBuilder.newError(
+ RpcError.ErrorType.TRANSPORT,
+ ErrorTag.RESOURCE_DENIED.getTagValue(),
+ "Master is down. Please try again.");
+ final ReadFailedException exception503 = new ReadFailedException("Read from transaction failed", error);
+ doReturn(Futures.immediateFailedCheckedFuture(exception503))
+ .when(rTransaction).read(any(LogicalDatastoreType.class), any(YangInstanceIdentifier.class));
+ try {
+ brokerFacade.readConfigurationData(this.instanceID, "explicit");
+ fail("This test should fail.");
+ } catch (final RestconfDocumentedException e) {
+ assertEquals("getErrorTag", ErrorTag.RESOURCE_DENIED_TRANSPORT, e.getErrors().get(0).getErrorTag());
+ assertEquals("getErrorType", ErrorType.TRANSPORT, e.getErrors().get(0).getErrorType());
+ assertEquals("getErrorMessage", "Master is down. Please try again.", e.getErrors().get(0).getErrorMessage());
+ }
+ }
+
@Test
public void testInvokeRpc() throws Exception {
final DOMRpcResult expResult = mock(DOMRpcResult.class);
when(this.rwTransaction.read(LogicalDatastoreType.CONFIGURATION, this.instanceID)).thenReturn(readFuture);
final PutResult result = this.brokerFacade.commitConfigurationDataPut(mock(SchemaContext.class),
- this.instanceID, this.dummyNode);
+ this.instanceID, this.dummyNode, null, null);
final Future<Void> actualFuture = result.getFutureOfPutData();
when(this.rwTransaction.submit()).thenReturn(expFuture);
final CheckedFuture<Void, TransactionCommitFailedException> actualFuture = this.brokerFacade
- .commitConfigurationDataPost(mock(SchemaContext.class), this.instanceID, this.dummyNode);
+ .commitConfigurationDataPost(mock(SchemaContext.class), this.instanceID, this.dummyNode, null, null);
assertSame("commitConfigurationDataPost", expFuture, actualFuture);
.thenReturn(successFuture);
try {
// Schema context is only necessary for ensuring parent structure
- this.brokerFacade.commitConfigurationDataPost((SchemaContext) null, this.instanceID, this.dummyNode);
+ this.brokerFacade.commitConfigurationDataPost((SchemaContext) null, this.instanceID, this.dummyNode, null,
+ null);
} catch (final RestconfDocumentedException e) {
assertEquals("getErrorTag", RestconfError.ErrorTag.DATA_EXISTS, e.getErrors().get(0).getErrorTag());
throw e;
@Test
public void testRegisterToListenDataChanges() {
- final ListenerAdapter listener = Notificator.createListener(this.instanceID, "stream");
+ final ListenerAdapter listener = Notificator.createListener(this.instanceID, "stream",
+ NotificationOutputType.XML);
@SuppressWarnings("unchecked")
final ListenerRegistration<DOMDataChangeListener> mockRegistration = mock(ListenerRegistration.class);
* Create, register, close and remove notification listener.
*/
@Test
- public void testRegisterToListenNotificationChanges() {
+ public void testRegisterToListenNotificationChanges() throws Exception {
// create test notification listener
final String identifier = "create-notification-stream/toaster:toastDone";
final SchemaPath path = SchemaPath.create(true,
// registrations should be invoked only once
verify(this.domNotification, times(1)).registerNotificationListener(listener, listener.getSchemaPath());
+ final DOMTransactionChain transactionChain = mock(DOMTransactionChain.class);
+ final DOMDataWriteTransaction wTx = mock(DOMDataWriteTransaction.class);
+ final CheckedFuture checked = Futures.immediateCheckedFuture("");
+ when(wTx.submit()).thenReturn(checked);
+ when(transactionChain.newWriteOnlyTransaction()).thenReturn(wTx);
+ final TransactionChainHandler transactionChainHandler = new TransactionChainHandler(transactionChain);
+ final SchemaContextHandler schemaHandler = Mockito.mock(SchemaContextHandler.class);
+ final SchemaContext schCtx = TestUtils.loadSchemaContext("/modules");
+ when(schemaHandler.get()).thenReturn(schCtx);
+ listener.setCloseVars(transactionChainHandler, schemaHandler);
// close and remove test notification listener
listener.close();
- Notificator.removeNotificationListenerIfNoSubscriberExists(listener);
+ Notificator.removeListenerIfNoSubscriberExists(listener);
}
/**