package org.opendaylight.restconf.utils.mapping;
import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.fail;
-import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
-import com.google.common.collect.Sets;
-import java.util.AbstractMap;
+import java.net.URI;
+import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
-import java.util.Collections;
+import java.util.Date;
import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
import java.util.List;
import java.util.Map;
-import java.util.Map.Entry;
import java.util.Set;
import org.junit.Assert;
import org.junit.Before;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.opendaylight.controller.md.sal.rest.common.TestRestconfUtils;
-import org.opendaylight.netconf.sal.restconf.impl.RestconfDocumentedException;
-import org.opendaylight.netconf.sal.restconf.impl.RestconfError.ErrorTag;
-import org.opendaylight.netconf.sal.restconf.impl.RestconfError.ErrorType;
-import org.opendaylight.restconf.Draft18;
import org.opendaylight.restconf.Draft18.IetfYangLibrary;
import org.opendaylight.restconf.Draft18.MonitoringModule;
import org.opendaylight.restconf.Draft18.MonitoringModule.QueryParams;
import org.opendaylight.restconf.Draft18.RestconfModule;
-import org.opendaylight.restconf.utils.schema.context.RestconfSchemaUtil;
+import org.opendaylight.restconf.utils.parser.ParserIdentifier;
import org.opendaylight.yangtools.yang.common.QName;
import org.opendaylight.yangtools.yang.common.SimpleDateFormatUtil;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
import org.opendaylight.yangtools.yang.data.api.schema.MapNode;
import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
-import org.opendaylight.yangtools.yang.data.impl.schema.nodes.AbstractImmutableDataContainerAttrNode;
-import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
-import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode;
import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
import org.opendaylight.yangtools.yang.model.api.Module;
private static Set<Module> modules;
private static SchemaContext schemaContext;
- private static SchemaContext schemaContextCapabilites;
+ private static SchemaContext schemaContextMonitoring;
private static Set<Module> modulesRest;
- private Set<DataSchemaNode> allStreamChildNodes;
-
@BeforeClass
public static void loadTestSchemaContextAndModules() throws Exception {
- RestconfMappingNodeUtilTest.schemaContext = TestRestconfUtils.loadSchemaContext(
+ schemaContext = TestRestconfUtils.loadSchemaContext(
"/modules/restconf-module-testing");
- RestconfMappingNodeUtilTest.schemaContextCapabilites = TestRestconfUtils.loadSchemaContext("/modules");
- RestconfMappingNodeUtilTest.modules = schemaContextCapabilites.getModules();
- RestconfMappingNodeUtilTest.modulesRest =
- TestRestconfUtils.loadSchemaContext("/modules/restconf-module-testing").getModules();
+ schemaContextMonitoring = TestRestconfUtils.loadSchemaContext("/modules");
+ modules = schemaContextMonitoring.getModules();
+ modulesRest = TestRestconfUtils.loadSchemaContext("/modules/restconf-module-testing").getModules();
}
@Before
QName.create("", RestconfMappingNodeConstants.REPLAY_SUPPORT));
when(this.leafReplayLog.getQName()).thenReturn(QName.create(RestconfMappingNodeConstants.REPLAY_LOG));
when(this.leafEvents.getQName()).thenReturn(QName.create("", RestconfMappingNodeConstants.EVENTS));
-
- this.allStreamChildNodes = Sets.newHashSet(
- this.leafName, this.leafDescription, this.leafReplaySupport, this.leafReplayLog, this.leafEvents);
}
/**
@Test
public void restconfStateCapabilitesTest() {
- final Module monitoringModule = schemaContextCapabilites
+ final Module monitoringModule = schemaContextMonitoring
.findModuleByNamespaceAndRevision(MonitoringModule.URI_MODULE, MonitoringModule.DATE);
final NormalizedNode<NodeIdentifier, Collection<DataContainerChild<? extends PathArgument, ?>>> normNode =
RestconfMappingNodeUtil.mapCapabilites(monitoringModule);
Assert.assertTrue(listOfValues.contains(QueryParams.WITH_DEFAULTS));
}
- /**
- * Positive test of writing one stream to {@link MonitoringModule#STREAM_LIST_SCHEMA_NODE} and checking if stream
- * was correctly written.
- */
- @Test
- public void toStreamEntryNodeTest() {
- // test stream name
- final String stream1 = "stream-1";
-
- // get list stream node from Restconf module
- final ListSchemaNode listStream = (ListSchemaNode) RestconfSchemaUtil.getRestconfSchemaNode(
- getTestingRestconfModule("ietf-restconf"), MonitoringModule.STREAM_LIST_SCHEMA_NODE);
-
- // write stream to list stream node
- final MapEntryNode mapEntryNode = RestconfMappingNodeUtil.toStreamEntryNode(stream1, listStream);
-
- // verify
- verifyStream(stream1, mapEntryNode);
- }
-
- /**
- * Try to map streams when {@link MonitoringModule#STREAM_LIST_SCHEMA_NODE} is <code>null</code>.
- * Test is expected to fail catching <code>IllegalStateException</code>.
- */
- @Test
- public void toStreamEntryNodeNullListStreamNegativeTest() {
- this.thrown.expect(IllegalStateException.class);
- RestconfMappingNodeUtil.toStreamEntryNode("stream-1", null);
- }
-
- /**
- * Test trying to map streams to {@link MonitoringModule#STREAM_LIST_SCHEMA_NODE} which is not of type list.
- * Test is expected to fail with <code>IllegalStateException</code>.
- */
@Test
- public void toStreamEntryNodeIllegalListStreamNegativeTest() {
- this.thrown.expect(IllegalStateException.class);
- RestconfMappingNodeUtil.toStreamEntryNode("stream-1", mock(LeafSchemaNode.class));
- }
-
- /**
- * Test case with target {@link MonitoringModule#STREAM_LIST_SCHEMA_NODE} which does not contain any child nodes.
- * Test is catching <code>RestconfDocumentedException</code> and error type, error tag and error status code are
- * compared to expected values.
- */
- @Test
- public void toStreamEntryNodeSchemaNodeWithoutChildsNegativeTest() {
- final ListSchemaNode mockListNode = mock(ListSchemaNode.class);
- when(mockListNode.getChildNodes()).thenReturn(Collections.EMPTY_SET);
-
- try {
- RestconfMappingNodeUtil.toStreamEntryNode("stream-1", mockListNode);
- fail("Test should fail due to no child nodes in"
- + MonitoringModule.STREAM_LIST_SCHEMA_NODE
- + " node");
- } catch (final RestconfDocumentedException e) {
- assertEquals("Error type is not correct",
- ErrorType.PROTOCOL, e.getErrors().get(0).getErrorType());
- assertEquals("Error tag is not correct",
- ErrorTag.DATA_MISSING, e.getErrors().get(0).getErrorTag());
- assertEquals("Error status code is not correct",
- 404, e.getErrors().get(0).getErrorTag().getStatusCode());
- }
- }
+ public void toStreamEntryNodeTest() throws Exception {
+ final YangInstanceIdentifier path =
+ ParserIdentifier.toInstanceIdentifier("nested-module:depth1-cont/depth2-leaf1", schemaContextMonitoring, null).getInstanceIdentifier();
+ final Date start = new Date();
+ final String outputType = "XML";
+ final URI uri = new URI("uri");
+ final Module monitoringModule = schemaContextMonitoring
+ .findModuleByNamespaceAndRevision(MonitoringModule.URI_MODULE, MonitoringModule.DATE);
+ final boolean exist = true;
- /**
- * Test case when target list stream does not contain child with name {@link RestconfMappingNodeConstants#NAME}.
- * Test is catching <code>RestconfDocumentedException</code> and error type, error tag and error status code are
- * compared to expected values.
- */
- @Test
- public void toStreamEntryNodeMissingStreamNameNegativeTest() {
- prepareMockListWithMissingLeaf(this.leafName);
+ final Map<QName, Object> map =
+ prepareMap(path.getLastPathArgument().getNodeType().getLocalName(), uri, start, outputType);
- try {
- RestconfMappingNodeUtil.toStreamEntryNode("stream-1", this.mockStreamList);
- fail("Test should fail due to missing "
- + RestconfMappingNodeConstants.NAME
- + " node in " + MonitoringModule.STREAM_LIST_SCHEMA_NODE);
- } catch (final RestconfDocumentedException e) {
- assertEquals("Error type is not correct",
- ErrorType.PROTOCOL, e.getErrors().get(0).getErrorType());
- assertEquals("Error tag is not correct",
- ErrorTag.DATA_MISSING, e.getErrors().get(0).getErrorTag());
- assertEquals("Error status code is not correct",
- 404, e.getErrors().get(0).getErrorTag().getStatusCode());
- }
+ final NormalizedNode mappedData = RestconfMappingNodeUtil.mapDataChangeNotificationStreamByIetfRestconfMonitoring(path, start, outputType, uri,
+ monitoringModule, exist, schemaContextMonitoring);
+ assertNotNull(mappedData);
+ testData(map, mappedData);
}
- /**
- * Test case when target list stream does not contain child with name
- * {@link RestconfMappingNodeConstants#DESCRIPTION}. Test is catching <code>RestconfDocumentedException</code> and
- * checking error type and error tag.
- */
@Test
- public void toStreamEntryNodeMissingStreamDescriptionNegativeTest() {
- prepareMockListWithMissingLeaf(this.leafDescription);
-
- try {
- RestconfMappingNodeUtil.toStreamEntryNode("stream-1", this.mockStreamList);
- fail("Test should fail due to missing "
- + RestconfMappingNodeConstants.DESCRIPTION
- + " node in " + MonitoringModule.STREAM_LIST_SCHEMA_NODE);
- } catch (final RestconfDocumentedException e) {
- assertEquals("Error type is not correct",
- ErrorType.PROTOCOL, e.getErrors().get(0).getErrorType());
- assertEquals("Error tag is not correct",
- ErrorTag.DATA_MISSING, e.getErrors().get(0).getErrorTag());
- assertEquals("Error status code is not correct",
- 404, e.getErrors().get(0).getErrorTag().getStatusCode());
- }
- }
+ public void toStreamEntryNodeNotifiTest() throws Exception {
+ final Date start = new Date();
+ final String outputType = "JSON";
+ final URI uri = new URI("uri");
+ final Module monitoringModule = schemaContextMonitoring
+ .findModuleByNamespaceAndRevision(MonitoringModule.URI_MODULE, MonitoringModule.DATE);
+ final boolean exist = true;
- /**
- * Test case when target list stream does not contain child with name
- * {@link RestconfMappingNodeConstants#REPLAY_SUPPORT}. Test is catching <code>RestconfDocumentedException</code>
- * and checking error type and error tag.
- */
- @Test
- public void toStreamEntryNodeMissingStreamReplaySupportNegativeTest() {
- prepareMockListWithMissingLeaf(this.leafReplaySupport);
+ final Map<QName, Object> map = prepareMap("notifi", uri, start, outputType);
+ map.put(MonitoringModule.LEAF_DESCR_STREAM_QNAME, "Notifi");
- try {
- RestconfMappingNodeUtil.toStreamEntryNode("stream-1", this.mockStreamList);
- fail("Test should fail due to missing "
- + RestconfMappingNodeConstants.REPLAY_SUPPORT
- + " node in " + MonitoringModule.STREAM_LIST_SCHEMA_NODE);
- } catch (final RestconfDocumentedException e) {
- assertEquals("Error type is not correct",
- ErrorType.PROTOCOL, e.getErrors().get(0).getErrorType());
- assertEquals("Error tag is not correct",
- ErrorTag.DATA_MISSING, e.getErrors().get(0).getErrorTag());
- assertEquals("Error status code is not correct",
- 404, e.getErrors().get(0).getErrorTag().getStatusCode());
- }
+ final QName notifiQName = QName.create("urn:nested:module", "2014-06-3", "notifi");
+ final NormalizedNode mappedData =
+ RestconfMappingNodeUtil.mapYangNotificationStreamByIetfRestconfMonitoring(notifiQName, schemaContextMonitoring.getNotifications(), start,
+ outputType, uri, monitoringModule, exist);
+ assertNotNull(mappedData);
+ testData(map, mappedData);
}
- /**
- * Test case when target list stream does not contain child with name
- * {@link RestconfMappingNodeConstants#REPLAY_LOG}. Test is catching <code>RestconfDocumentedException</code> and
- * checking error type and error tag.
- */
- @Test
- public void toStreamEntryNodeMissingStreamReplayLogNegativeTest() {
- prepareMockListWithMissingLeaf(this.leafReplayLog);
-
- try {
- RestconfMappingNodeUtil.toStreamEntryNode("stream-1", this.mockStreamList);
- fail("Test should fail due to missing "
- + RestconfMappingNodeConstants.REPLAY_LOG
- + " node in " + MonitoringModule.STREAM_LIST_SCHEMA_NODE);
- } catch (final RestconfDocumentedException e) {
- assertEquals("Error type is not correct",
- ErrorType.PROTOCOL, e.getErrors().get(0).getErrorType());
- assertEquals("Error tag is not correct",
- ErrorTag.DATA_MISSING, e.getErrors().get(0).getErrorTag());
- assertEquals("Error status code is not correct",
- 404, e.getErrors().get(0).getErrorTag().getStatusCode());
- }
+ private Map<QName, Object> prepareMap(final String name, final URI uri, final Date start, final String outputType) {
+ final Map<QName, Object> map = new HashMap<>();
+ map.put(MonitoringModule.LEAF_NAME_STREAM_QNAME, name);
+ map.put(MonitoringModule.LEAF_LOCATION_ACCESS_QNAME, uri.toString());
+ map.put(MonitoringModule.LEAF_REPLAY_SUPP_STREAM_QNAME, true);
+ map.put(MonitoringModule.LEAF_START_TIME_STREAM_QNAME,
+ new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'XXX").format(start));
+ map.put(MonitoringModule.LEAF_ENCODING_ACCESS_QNAME, outputType);
+ return map;
}
- /**
- * Test case when target list stream does not contain child with name {@link RestconfMappingNodeConstants#EVENTS}.
- * Test is catching <code>RestconfDocumentedException</code> and checking error type, error tag and error status
- * code.
- */
- @Test
- public void toStreamEntryNodeMissingStreamEventsNegativeTest() {
- prepareMockListWithMissingLeaf(this.leafEvents);
-
- try {
- RestconfMappingNodeUtil.toStreamEntryNode("stream-1", this.mockStreamList);
- fail("Test should fail due to missing "
- + RestconfMappingNodeConstants.EVENTS
- + " node in " + MonitoringModule.STREAM_LIST_SCHEMA_NODE);
- } catch (final RestconfDocumentedException e) {
- assertEquals("Error type is not correct",
- ErrorType.PROTOCOL, e.getErrors().get(0).getErrorType());
- assertEquals("Error tag is not correct",
- ErrorTag.DATA_MISSING, e.getErrors().get(0).getErrorTag());
- assertEquals("Error status code is not correct",
- 404, e.getErrors().get(0).getErrorTag().getStatusCode());
+ private void testData(final Map<QName, Object> map, final NormalizedNode mappedData) {
+ for (final DataContainerChild<? extends PathArgument, ?> child : ((MapEntryNode) mappedData).getValue()) {
+ if (child instanceof LeafNode) {
+ final LeafNode leaf = ((LeafNode) child);
+ Assert.assertTrue(map.containsKey(leaf.getNodeType()));
+ Assert.assertEquals(map.get(leaf.getNodeType()), leaf.getValue());
+ }
}
}
- /**
- * Test case when target list stream contains child with name {@link RestconfMappingNodeConstants#NAME}. Test is
- * expecting <code>IllegalStateException</code>.
- */
- @Test
- public void toStreamEntryNodeStreamNameNegativeTest() {
- prepareMockListWithIllegalLeaf(this.leafName);
-
- this.thrown.expect(IllegalStateException.class);
- RestconfMappingNodeUtil.toStreamEntryNode("stream-1", this.mockStreamList);
- }
-
- /**
- * Test case when target list stream contains child with name {@link RestconfMappingNodeConstants#DESCRIPTION}.
- * Test is expecting <code>IllegalStateException</code>.
- */
- @Test
- public void toStreamEntryNodeStreamDescriptionNegativeTest() {
- prepareMockListWithIllegalLeaf(this.leafDescription);
-
- this.thrown.expect(IllegalStateException.class);
- RestconfMappingNodeUtil.toStreamEntryNode("stream-1", this.mockStreamList);
- }
-
- /**
- * Test case when target list stream contains child with name {@link RestconfMappingNodeConstants#REPLAY_SUPPORT}.
- * Test is expecting <code>IllegalStateException</code>.
- */
- @Test
- public void toStreamEntryNodeStreamReplaySupportNegativeTest() {
- prepareMockListWithIllegalLeaf(this.leafReplaySupport);
-
- this.thrown.expect(IllegalStateException.class);
- RestconfMappingNodeUtil.toStreamEntryNode("stream-1", this.mockStreamList);
- }
-
- /**
- * Test case when target list stream contains child with name {@link RestconfMappingNodeConstants#REPLAY_LOG}.
- * Test is expecting <code>IllegalStateException</code>.
- */
- @Test
- public void toStreamEntryNodeStreamReplayLogNegativeTest() {
- prepareMockListWithIllegalLeaf(this.leafReplayLog);
-
- this.thrown.expect(IllegalStateException.class);
- RestconfMappingNodeUtil.toStreamEntryNode("stream-1", this.mockStreamList);
- }
-
- /**
- * Test case when target list stream contains child with name {@link RestconfMappingNodeConstants#EVENTS}. Test is
- * expecting <code>IllegalStateException</code>.
- */
- @Test
- public void toStreamEntryNodeStreamEventsNegativeTest() {
- prepareMockListWithIllegalLeaf(this.leafEvents);
-
- this.thrown.expect(IllegalStateException.class);
- RestconfMappingNodeUtil.toStreamEntryNode("stream-1", this.mockStreamList);
- }
-
/**
* Verify loaded modules
*
loadedModules.remove(name);
}
}
-
- /**
- * Verify if a stream was correctly written into {@link MonitoringModule#STREAM_LIST_SCHEMA_NODE} node in Restconf
- * module.
- * @param streamName Expected stream name
- * @param streamNode Writetn strem node from Restconf module
- */
- private final void verifyStream(final String streamName, final MapEntryNode streamNode) {
- assertNotNull("Stream node can not be null", streamNode);
- final Iterator entries = ((AbstractImmutableDataContainerAttrNode) streamNode)
- .getChildren().entrySet().iterator();
- boolean notAllowedKey = false;
-
- while (entries.hasNext()) {
- final Entry e = ((AbstractMap.SimpleImmutableEntry) entries.next());
- final String key = ((YangInstanceIdentifier.NodeIdentifier) e.getKey()).getNodeType().getLocalName();
-
- switch (key) {
- case RestconfMappingNodeConstants.NAME :
- assertEquals("Stream name value is not as expected",
- streamName, ((LeafNode) e.getValue()).getValue());
- break;
- case RestconfMappingNodeConstants.DESCRIPTION :
- assertEquals("Stream description value is not as expected",
- RestconfMappingStreamConstants.DESCRIPTION, ((LeafNode) e.getValue()).getValue());
- break;
- case RestconfMappingNodeConstants.REPLAY_SUPPORT :
- assertEquals("Stream replay support value is not as expected",
- RestconfMappingStreamConstants.REPLAY_SUPPORT, ((LeafNode) e.getValue()).getValue());
- break;
- case RestconfMappingNodeConstants.REPLAY_LOG :
- assertEquals("Stream replay log value is not as expected",
- RestconfMappingStreamConstants.REPLAY_LOG, ((LeafNode) e.getValue()).getValue());
- break;
- case RestconfMappingNodeConstants.EVENTS :
- assertEquals("Stream events value is not as expected",
- RestconfMappingStreamConstants.EVENTS, ((LeafNode) e.getValue()).getValue());
- break;
- default:
- notAllowedKey = true;
- break;
- }
- }
-
- assertFalse("Not allowed key in list stream found", notAllowedKey);
- }
-
- /**
- * There are multiple testing Restconf modules for different test cases. It is possible to distinguish them by
- * name or by namespace. This method is looking for Restconf test module by its name.
- * @param s Testing Restconf module name
- * @return Restconf module
- */
- private Module getTestingRestconfModule(final String s) {
- return RestconfMappingNodeUtilTest.schemaContext.findModuleByName(
- s, Draft18.RestconfModule.IETF_RESTCONF_QNAME.getRevision());
- }
-
- /**
- * Updates {@link this#mockStreamList} to NOT contains specified leaf.
- * @param leaf Leaf to be missing
- */
- private void prepareMockListWithMissingLeaf(final LeafSchemaNode leaf) {
- // prepare set of leaf without selected leaf
- final Set childLeafs = new HashSet<>(this.allStreamChildNodes);
- childLeafs.remove(leaf);
-
- // mock list leaf nodes
- when(this.mockStreamList.getChildNodes()).thenReturn(childLeafs);
- }
-
- /**
- * Updates {@link this#mockStreamList} to contains specified leaf which is not of type {@link LeafSchemaNode}.
- * @param leaf Leaf to be changes
- */
- private void prepareMockListWithIllegalLeaf(final LeafSchemaNode leaf) {
- // prepare set of leaf without selected leaf
- final Set childLeafs = new HashSet<>(this.allStreamChildNodes);
- childLeafs.remove(leaf);
-
- // add leaf-list with the same local name as removed leaf
- final String localName = leaf.getQName().getLocalName();
- final LeafListSchemaNode mockLeafList = mock(LeafListSchemaNode.class);
- when(mockLeafList.getQName()).thenReturn(QName.create("", localName));
- childLeafs.add(mockLeafList);
-
- // mock list leaf nodes
- when(this.mockStreamList.getChildNodes()).thenReturn(childLeafs);
- }
}