X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-rest-connector%2Fsrc%2Ftest%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fsal%2Frestconf%2Fimpl%2Ftest%2FXmlProvidersTest.java;h=b18f526a237c4c841758fcace2c4903bd28a68ae;hp=baf226712ffbb255550948c3c5f36160d4c30262;hb=0ae12c54560ef14cb8c08beef4553f7523d41578;hpb=634ecb9a2701f6bbff419f74fe8616a6b263927a diff --git a/opendaylight/md-sal/sal-rest-connector/src/test/java/org/opendaylight/controller/sal/restconf/impl/test/XmlProvidersTest.java b/opendaylight/md-sal/sal-rest-connector/src/test/java/org/opendaylight/controller/sal/restconf/impl/test/XmlProvidersTest.java index baf226712f..b18f526a23 100644 --- a/opendaylight/md-sal/sal-rest-connector/src/test/java/org/opendaylight/controller/sal/restconf/impl/test/XmlProvidersTest.java +++ b/opendaylight/md-sal/sal-rest-connector/src/test/java/org/opendaylight/controller/sal/restconf/impl/test/XmlProvidersTest.java @@ -1,22 +1,19 @@ package org.opendaylight.controller.sal.restconf.impl.test; -import static org.mockito.Mockito.*; -import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.mockito.Matchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; import java.io.FileNotFoundException; -import java.io.IOException; import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.net.URI; import java.net.URISyntaxException; import java.net.URLEncoder; -import java.util.Collection; -import java.util.List; -import java.util.Set; -import java.util.concurrent.ExecutionException; +import java.util.*; import java.util.concurrent.Future; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; import java.util.logging.Level; import java.util.logging.LogRecord; @@ -24,11 +21,7 @@ import javax.ws.rs.client.Entity; import javax.ws.rs.core.Application; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; -import org.glassfish.jersey.client.ClientConfig; import org.glassfish.jersey.server.ResourceConfig; import org.glassfish.jersey.test.JerseyTest; import org.glassfish.jersey.test.TestProperties; @@ -36,22 +29,15 @@ import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.opendaylight.controller.md.sal.common.api.TransactionStatus; +import org.opendaylight.controller.sal.rest.api.Draft01; import org.opendaylight.controller.sal.rest.api.RestconfService; import org.opendaylight.controller.sal.rest.impl.StructuredDataToXmlProvider; import org.opendaylight.controller.sal.rest.impl.XmlToCompositeNodeProvider; -import org.opendaylight.controller.sal.restconf.impl.BrokerFacade; -import org.opendaylight.controller.sal.restconf.impl.ControllerContext; -import org.opendaylight.controller.sal.restconf.impl.MediaTypes; -import org.opendaylight.controller.sal.restconf.impl.RestconfImpl; -import org.opendaylight.yangtools.yang.common.QName; -import org.opendaylight.yangtools.yang.common.RpcError; +import org.opendaylight.controller.sal.restconf.impl.*; import org.opendaylight.yangtools.yang.common.RpcResult; -import org.opendaylight.yangtools.yang.data.api.CompositeNode; -import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; +import org.opendaylight.yangtools.yang.data.api.*; import org.opendaylight.yangtools.yang.model.api.Module; import org.opendaylight.yangtools.yang.model.api.SchemaContext; -import org.w3c.dom.Document; -import org.xml.sax.SAXException; import com.google.common.base.Charsets; @@ -60,15 +46,13 @@ public class XmlProvidersTest extends JerseyTest { private static ControllerContext controllerContext; private static BrokerFacade brokerFacade; private static RestconfImpl restconfImpl; + private static final MediaType MEDIA_TYPE = new MediaType("application", "vnd.yang.data+xml"); + private static final MediaType MEDIA_TYPE_DRAFT02 = new MediaType("application", "yang.data+xml"); @BeforeClass - public static void init() { - Set allModules = null; - try { - allModules = TestUtils.loadModules(RestconfImplTest.class.getResource("/full-versions/yangs").getPath()); - } catch (FileNotFoundException e) { - e.printStackTrace(); - } + public static void init() throws FileNotFoundException { + Set allModules = TestUtils.loadModulesFrom("/full-versions/yangs"); + assertNotNull(allModules); SchemaContext schemaContext = TestUtils.loadSchemaContext(allModules); controllerContext = ControllerContext.getInstance(); controllerContext.setSchemas(schemaContext); @@ -87,107 +71,145 @@ public class XmlProvidersTest extends JerseyTest { } @Test - public void testStructuredDataToXmlProvider() throws FileNotFoundException { - URI uri = null; - try { - uri = new URI("/datastore/" + URLEncoder.encode("ietf-interfaces:interfaces/interface/eth0", Charsets.US_ASCII.name()).toString()); - } catch (UnsupportedEncodingException | URISyntaxException e) { - e.printStackTrace(); - } - - InputStream xmlStream = RestconfImplTest.class.getResourceAsStream("/parts/ietf-interfaces_interfaces.xml"); - CompositeNode loadedCompositeNode = TestUtils.loadCompositeNode(xmlStream); + public void testStructuredDataToXmlProvider() throws FileNotFoundException, UnsupportedEncodingException { + String uri = createUri("/datastore/", "ietf-interfaces:interfaces/interface/eth0"); + + CompositeNode loadedCompositeNode = prepareCompositeNodeWithIetfInterfacesInterfacesData(); when(brokerFacade.readOperationalData(any(InstanceIdentifier.class))).thenReturn(loadedCompositeNode); - - Response response = target(uri.toASCIIString()).request(MediaTypes.API+RestconfService.XML).get(); + + Response response = target(uri).request(MEDIA_TYPE).get(); assertEquals(200, response.getStatus()); } - @Test - public void testXmlToCompositeNodeProvider() throws ParserConfigurationException, SAXException, IOException { - URI uri = null; + private CompositeNode prepareCompositeNodeWithIetfInterfacesInterfacesData() { + CompositeNode intface; try { - uri = new URI("/config/" + URLEncoder.encode("ietf-interfaces:interfaces/interface/eth0", Charsets.US_ASCII.name()).toString()); - } catch (UnsupportedEncodingException | URISyntaxException e) { - e.printStackTrace(); + intface = new CompositeNodeWrapper(new URI("interface"), "interface"); + List> childs = new ArrayList<>(); + + childs.add(new SimpleNodeWrapper(new URI("name"), "name", "eth0")); + childs.add(new SimpleNodeWrapper(new URI("type"), "type", "ethernetCsmacd")); + childs.add(new SimpleNodeWrapper(new URI("enabled"), "enabled", Boolean.FALSE)); + childs.add(new SimpleNodeWrapper(new URI("description"), "description", "some interface")); + intface.setValue(childs); + return intface; + } catch (URISyntaxException e) { } - InputStream xmlStream = RestconfImplTest.class.getResourceAsStream("/parts/ietf-interfaces_interfaces.xml"); - final CompositeNode loadedCompositeNode = TestUtils.loadCompositeNode(xmlStream); - when(brokerFacade.commitConfigurationDataPut(any(InstanceIdentifier.class), any(CompositeNode.class))).thenReturn(new Future>() { - @Override - public boolean cancel(boolean mayInterruptIfRunning) { - return false; - } - @Override - public boolean isCancelled() { - return false; - } - @Override - public boolean isDone() { - return false; - } - @Override - public RpcResult get() throws InterruptedException, ExecutionException { - return null; - } - @Override - public RpcResult get(long timeout, TimeUnit unit) throws InterruptedException, - ExecutionException, TimeoutException { - return null; - } - }); - - DocumentBuilderFactory dbfac = DocumentBuilderFactory.newInstance(); - DocumentBuilder docBuilder = dbfac.newDocumentBuilder(); - xmlStream = RestconfImplTest.class.getResourceAsStream("/parts/ietf-interfaces_interfaces.xml"); - Document doc = docBuilder.parse(xmlStream); - - Response response = target(uri.toASCIIString()).request(MediaTypes.API+RestconfService.XML).post(Entity.entity(TestUtils.getDocumentInPrintableForm(doc), new MediaType("application","vnd.yang.api+xml"))); - assertEquals(204, response.getStatus()); + + return null; } - + @Test - public void testXmlToCompositeNodeProviderExceptions() { - URI uri = null; - try { - uri = new URI("/operations/" + URLEncoder.encode("ietf-interfaces:interfaces/interface/eth0", Charsets.US_ASCII.name()).toString()); - } catch (UnsupportedEncodingException | URISyntaxException e) { - e.printStackTrace(); - } - - Response response = target(uri.toASCIIString()).request(MediaTypes.API + RestconfService.XML).post( - Entity.entity("", new MediaType("application", "vnd.yang.api+xml"))); + public void testBadFormatXmlToCompositeNodeProvider() throws UnsupportedEncodingException, URISyntaxException { + String uri = createUri("/operations/", "ietf-interfaces:interfaces/interface/eth0"); + + Response response = target(uri).request(Draft01.MediaTypes.DATA + RestconfService.XML).post( + Entity.entity("", MEDIA_TYPE)); assertEquals(400, response.getStatus()); - - response = target(uri.toASCIIString()).request(MediaTypes.API + RestconfService.XML).post( - Entity.entity("", new MediaType("application", "vnd.yang.api+xml"))); + + response = target(uri).request(Draft01.MediaTypes.DATA + RestconfService.XML).post( + Entity.entity("", MEDIA_TYPE)); assertEquals(400, response.getStatus()); } - + @Test - public void testXmlToCompositeNode404NotFound() { - URI uri = null; - try { - uri = new URI("/datastore/" + URLEncoder.encode("ietf-interfaces:interfaces/interface/eth0", Charsets.US_ASCII.name()).toString()); - } catch (UnsupportedEncodingException | URISyntaxException e) { - e.printStackTrace(); - } - + public void testXmlToCompositeNode404NotFound() throws UnsupportedEncodingException, URISyntaxException { + String uri = createUri("/datastore/", "ietf-interfaces:interfaces/interface/eth0"); + when(brokerFacade.readOperationalData(any(InstanceIdentifier.class))).thenReturn(null); - - Response response = target(uri.toASCIIString()).request(MediaTypes.API+RestconfService.XML).get(); + + Response response = target(uri).request(Draft01.MediaTypes.DATA + RestconfService.XML).get(); assertEquals(404, response.getStatus()); } + @Test + public void testXmlToCompositeNode400() throws UnsupportedEncodingException, URISyntaxException { + String uri = createUri("/datastore/", "simple-nodes:user/name"); + + when(brokerFacade.readOperationalData(any(InstanceIdentifier.class))).thenReturn(null); + + Response response = target(uri).request(Draft01.MediaTypes.DATA + RestconfService.XML).get(); + assertEquals(400, response.getStatus()); + } + + @Test + public void testRpcResultCommitedToStatusCodes() throws UnsupportedEncodingException { + InputStream xmlStream = RestconfImplTest.class.getResourceAsStream("/parts/ietf-interfaces_interfaces.xml"); + String xml = TestUtils.getDocumentInPrintableForm(TestUtils.loadDocumentFrom(xmlStream)); + Entity entity = Entity.entity(xml, MEDIA_TYPE_DRAFT02); + RpcResult rpcResult = new DummyRpcResult.Builder().result( + TransactionStatus.COMMITED).build(); + Future> dummyFuture = DummyFuture.builder().rpcResult(rpcResult).build(); + when(brokerFacade.commitOperationalDataPut(any(InstanceIdentifier.class), any(CompositeNode.class))) + .thenReturn(dummyFuture); + when(brokerFacade.commitConfigurationDataPut(any(InstanceIdentifier.class), any(CompositeNode.class))) + .thenReturn(dummyFuture); + + String uri = createUri("/config/", "ietf-interfaces:interfaces/interface/eth0"); + Response response = target(uri).request(MEDIA_TYPE_DRAFT02).put(entity); + assertEquals(200, response.getStatus()); + response = target(uri).request(MEDIA_TYPE_DRAFT02).post(entity); + assertEquals(204, response.getStatus()); + + uri = createUri("/config/", "ietf-interfaces:interfaces/interface/eth0"); + response = target(uri).request(MEDIA_TYPE_DRAFT02).put(entity); + assertEquals(200, response.getStatus()); + response = target(uri).request(MEDIA_TYPE_DRAFT02).post(entity); + assertEquals(204, response.getStatus()); + + uri = createUri("/datastore/", "ietf-interfaces:interfaces/interface/eth0"); + response = target(uri).request(MEDIA_TYPE).put(entity); + assertEquals(200, response.getStatus()); + response = target(uri).request(MEDIA_TYPE).post(entity); + assertEquals(204, response.getStatus()); + } + + @Test + public void testRpcResultOtherToStatusCodes() throws UnsupportedEncodingException { + InputStream xmlStream = RestconfImplTest.class.getResourceAsStream("/parts/ietf-interfaces_interfaces.xml"); + String xml = TestUtils.getDocumentInPrintableForm(TestUtils.loadDocumentFrom(xmlStream)); + Entity entity = Entity.entity(xml, MEDIA_TYPE_DRAFT02); + RpcResult rpcResult = new DummyRpcResult.Builder().result( + TransactionStatus.FAILED).build(); + Future> dummyFuture = DummyFuture.builder().rpcResult(rpcResult).build(); + when(brokerFacade.commitOperationalDataPut(any(InstanceIdentifier.class), any(CompositeNode.class))) + .thenReturn(dummyFuture); + when(brokerFacade.commitConfigurationDataPut(any(InstanceIdentifier.class), any(CompositeNode.class))) + .thenReturn(dummyFuture); + + String uri = createUri("/config/", "ietf-interfaces:interfaces/interface/eth0"); + Response response = target(uri).request(MEDIA_TYPE_DRAFT02).put(entity); + assertEquals(500, response.getStatus()); + response = target(uri).request(MEDIA_TYPE_DRAFT02).post(entity); + assertEquals(500, response.getStatus()); + + uri = createUri("/config/", "ietf-interfaces:interfaces/interface/eth0"); + response = target(uri).request(MEDIA_TYPE_DRAFT02).put(entity); + assertEquals(500, response.getStatus()); + response = target(uri).request(MEDIA_TYPE_DRAFT02).post(entity); + assertEquals(500, response.getStatus()); + + uri = createUri("/datastore/", "ietf-interfaces:interfaces/interface/eth0"); + response = target(uri).request(MEDIA_TYPE).put(entity); + assertEquals(500, response.getStatus()); + response = target(uri).request(MEDIA_TYPE).post(entity); + assertEquals(500, response.getStatus()); + } + + private String createUri(String prefix, String encodedPart) throws UnsupportedEncodingException { + return URI.create(prefix + URLEncoder.encode(encodedPart, Charsets.US_ASCII.name()).toString()).toASCIIString(); + } + @Override protected Application configure() { enable(TestProperties.LOG_TRAFFIC); enable(TestProperties.DUMP_ENTITY); enable(TestProperties.RECORD_LOG_LEVEL); set(TestProperties.RECORD_LOG_LEVEL, Level.ALL.intValue()); - + ResourceConfig resourceConfig = new ResourceConfig(); - resourceConfig = resourceConfig.registerInstances(restconfImpl, StructuredDataToXmlProvider.INSTANCE, XmlToCompositeNodeProvider.INSTANCE); + resourceConfig = resourceConfig.registerInstances(restconfImpl, StructuredDataToXmlProvider.INSTANCE, + XmlToCompositeNodeProvider.INSTANCE); return resourceConfig; }