Repository: tajo Updated Branches: refs/heads/master 82d44af32 -> a9ae3cab6
http://git-wip-us.apache.org/repos/asf/tajo/blob/a9ae3cab/tajo-rpc/tajo-ws-rs/src/test/java/org/apache/tajo/ws/rs/netty/NettyRestHandlerContainerProviderTest.java ---------------------------------------------------------------------- diff --git a/tajo-rpc/tajo-ws-rs/src/test/java/org/apache/tajo/ws/rs/netty/NettyRestHandlerContainerProviderTest.java b/tajo-rpc/tajo-ws-rs/src/test/java/org/apache/tajo/ws/rs/netty/NettyRestHandlerContainerProviderTest.java new file mode 100644 index 0000000..1511068 --- /dev/null +++ b/tajo-rpc/tajo-ws-rs/src/test/java/org/apache/tajo/ws/rs/netty/NettyRestHandlerContainerProviderTest.java @@ -0,0 +1,66 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.tajo.ws.rs.netty; + +import io.netty.channel.ChannelHandler; +import io.netty.channel.ChannelInboundHandler; +import org.apache.tajo.ws.rs.netty.testapp1.TestApplication1; +import org.glassfish.jersey.server.ApplicationHandler; +import org.junit.Before; +import org.junit.Test; + +import static org.junit.Assert.*; + +public class NettyRestHandlerContainerProviderTest { + + private NettyRestHandlerContainerProvider provider; + private ApplicationHandler applicationHandler; + + @Before + public void setUp() throws Exception { + provider = new NettyRestHandlerContainerProvider(); + applicationHandler = new ApplicationHandler(new TestApplication1()); + } + + @Test + public void testCreation() throws Exception { + ChannelHandler handler = provider.createContainer(ChannelHandler.class, applicationHandler); + + assertNotNull(handler); + + ChannelInboundHandler inboundHandler = provider.createContainer(ChannelInboundHandler.class, applicationHandler); + + assertNotNull(inboundHandler); + + NettyRestHandlerContainer container = provider.createContainer(NettyRestHandlerContainer.class, applicationHandler); + + assertNotNull(container); + } + + @Test + public void testNullCreation() throws Exception { + String stringValue = provider.createContainer(String.class, applicationHandler); + + assertNull(stringValue); + + Object objectValue = provider.createContainer(Object.class, applicationHandler); + + assertNull(objectValue); + } +} http://git-wip-us.apache.org/repos/asf/tajo/blob/a9ae3cab/tajo-rpc/tajo-ws-rs/src/test/java/org/apache/tajo/ws/rs/netty/NettyRestServerTest.java ---------------------------------------------------------------------- diff --git a/tajo-rpc/tajo-ws-rs/src/test/java/org/apache/tajo/ws/rs/netty/NettyRestServerTest.java b/tajo-rpc/tajo-ws-rs/src/test/java/org/apache/tajo/ws/rs/netty/NettyRestServerTest.java new file mode 100644 index 0000000..d8a57bf --- /dev/null +++ b/tajo-rpc/tajo-ws-rs/src/test/java/org/apache/tajo/ws/rs/netty/NettyRestServerTest.java @@ -0,0 +1,137 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.tajo.ws.rs.netty; + +import org.apache.tajo.ws.rs.netty.gson.GsonFeature; +import org.apache.tajo.ws.rs.netty.testapp1.TestApplication1; +import org.apache.tajo.ws.rs.netty.testapp1.TestResource1; +import org.apache.tajo.ws.rs.netty.testapp2.Directory; +import org.apache.tajo.ws.rs.netty.testapp2.FileManagementApplication; +import org.glassfish.jersey.server.ResourceConfig; +import org.junit.Test; + +import javax.ws.rs.client.Client; +import javax.ws.rs.client.ClientBuilder; +import javax.ws.rs.client.Entity; +import javax.ws.rs.client.WebTarget; +import javax.ws.rs.core.GenericType; +import javax.ws.rs.core.MediaType; +import java.net.InetSocketAddress; +import java.net.ServerSocket; +import java.net.URI; +import java.util.Collection; + +import static org.junit.Assert.*; + +public class NettyRestServerTest { + + @Test + public void testNettyRestServerCreation() throws Exception { + ResourceConfig resourceConfig = ResourceConfig.forApplicationClass(TestApplication1.class); + ServerSocket serverSocket = new ServerSocket(0); + int availPort = serverSocket.getLocalPort(); + serverSocket.close(); + URI baseUri = new URI("http://localhost:"+availPort+"/rest"); + + NettyRestServer restServer = NettyRestServerFactory.createNettyRestServer(baseUri, resourceConfig, 3); + + assertNotNull(restServer); + assertNotNull(restServer.getHandler()); + assertNotNull(restServer.getChannel()); + assertNotNull(restServer.getListenAddress()); + + InetSocketAddress listeningAddress = restServer.getListenAddress(); + + assertEquals(availPort, listeningAddress.getPort()); + } + + @Test + public void testTextPlainApplication() throws Exception { + ResourceConfig resourceConfig = ResourceConfig.forApplicationClass(TestApplication1.class); + ServerSocket serverSocket = new ServerSocket(0); + int availPort = serverSocket.getLocalPort(); + serverSocket.close(); + URI baseUri = new URI("http://localhost:"+availPort+"/rest"); + + NettyRestServer restServer = NettyRestServerFactory.createNettyRestServer(baseUri, resourceConfig, 3); + + try { + WebTarget webTarget = ClientBuilder.newClient().target(baseUri + "/testapp1"); + + assertEquals(TestResource1.outputMessage, webTarget.request(MediaType.TEXT_PLAIN).get(String.class)); + } finally { + restServer.shutdown(); + } + } + + protected Directory createDirectory1() { + Directory newDirectory = new Directory(); + + newDirectory.setName("newdir1"); + newDirectory.setOwner("owner1"); + newDirectory.setGroup("group1"); + + return newDirectory; + } + + @Test + public void testFileMgmtApplication() throws Exception { + ResourceConfig resourceConfig = ResourceConfig.forApplicationClass(FileManagementApplication.class) + .register(GsonFeature.class); + ServerSocket serverSocket = new ServerSocket(0); + int availPort = serverSocket.getLocalPort(); + serverSocket.close(); + URI baseUri = new URI("http://localhost:"+availPort+"/rest"); + URI directoriesUri = new URI(baseUri + "/directories"); + Client restClient = ClientBuilder.newBuilder() + .register(GsonFeature.class).build(); + + NettyRestServer restServer = NettyRestServerFactory.createNettyRestServer(baseUri, resourceConfig, 3); + + try { + Directory directory1 = createDirectory1(); + Directory savedDirectory = restClient.target(directoriesUri) + .request().post(Entity.entity(directory1, MediaType.APPLICATION_JSON_TYPE), Directory.class); + + assertNotNull(savedDirectory); + assertNotNull(savedDirectory.getName()); + + Directory fetchedDirectory = restClient.target(directoriesUri).path("{name}") + .resolveTemplate("name", directory1.getName()).request().get(Directory.class); + + assertEquals(directory1.getName(), fetchedDirectory.getName()); + assertEquals(directory1.getOwner(), fetchedDirectory.getOwner()); + assertEquals(directory1.getGroup(), fetchedDirectory.getGroup()); + + GenericType<Collection<Directory>> directoryType = new GenericType<Collection<Directory>>(Collection.class); + Collection<Directory> directories = restClient.target(directoriesUri).request().get(directoryType); + + assertEquals(1, directories.size()); + + restClient.target(directoriesUri).path("{name}").resolveTemplate("name", directory1.getName()) + .request().delete(); + + directories = restClient.target(directoriesUri).request().get(directoryType); + + assertTrue(directories.isEmpty()); + } finally { + restServer.shutdown(); + } + } +} http://git-wip-us.apache.org/repos/asf/tajo/blob/a9ae3cab/tajo-rpc/tajo-ws-rs/src/test/java/org/apache/tajo/ws/rs/netty/testapp1/TestApplication1.java ---------------------------------------------------------------------- diff --git a/tajo-rpc/tajo-ws-rs/src/test/java/org/apache/tajo/ws/rs/netty/testapp1/TestApplication1.java b/tajo-rpc/tajo-ws-rs/src/test/java/org/apache/tajo/ws/rs/netty/testapp1/TestApplication1.java new file mode 100644 index 0000000..3531b3a --- /dev/null +++ b/tajo-rpc/tajo-ws-rs/src/test/java/org/apache/tajo/ws/rs/netty/testapp1/TestApplication1.java @@ -0,0 +1,38 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.tajo.ws.rs.netty.testapp1; + +import javax.ws.rs.core.Application; +import java.util.HashSet; +import java.util.Set; + +public class TestApplication1 extends Application { + + private final Set<Class<?>> classes; + + public TestApplication1() { + classes = new HashSet<Class<?>>(); + classes.add(TestResource1.class); + } + + @Override + public Set<Class<?>> getClasses() { + return classes; + } +} http://git-wip-us.apache.org/repos/asf/tajo/blob/a9ae3cab/tajo-rpc/tajo-ws-rs/src/test/java/org/apache/tajo/ws/rs/netty/testapp1/TestResource1.java ---------------------------------------------------------------------- diff --git a/tajo-rpc/tajo-ws-rs/src/test/java/org/apache/tajo/ws/rs/netty/testapp1/TestResource1.java b/tajo-rpc/tajo-ws-rs/src/test/java/org/apache/tajo/ws/rs/netty/testapp1/TestResource1.java new file mode 100644 index 0000000..302e217 --- /dev/null +++ b/tajo-rpc/tajo-ws-rs/src/test/java/org/apache/tajo/ws/rs/netty/testapp1/TestResource1.java @@ -0,0 +1,36 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.tajo.ws.rs.netty.testapp1; + +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; + +@Path("testapp1") +public class TestResource1 { + + public static String outputMessage = "TestApplication1"; + + @GET + @Produces(MediaType.TEXT_PLAIN) + public String getApplicationName() { + return outputMessage; + } +} http://git-wip-us.apache.org/repos/asf/tajo/blob/a9ae3cab/tajo-rpc/tajo-ws-rs/src/test/java/org/apache/tajo/ws/rs/netty/testapp2/DirectoriesDao.java ---------------------------------------------------------------------- diff --git a/tajo-rpc/tajo-ws-rs/src/test/java/org/apache/tajo/ws/rs/netty/testapp2/DirectoriesDao.java b/tajo-rpc/tajo-ws-rs/src/test/java/org/apache/tajo/ws/rs/netty/testapp2/DirectoriesDao.java new file mode 100644 index 0000000..0e82e00 --- /dev/null +++ b/tajo-rpc/tajo-ws-rs/src/test/java/org/apache/tajo/ws/rs/netty/testapp2/DirectoriesDao.java @@ -0,0 +1,39 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.tajo.ws.rs.netty.testapp2; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +public class DirectoriesDao { + private static DirectoriesDao instance = new DirectoriesDao(); + + private final Map<String, Directory> directoryMap = new ConcurrentHashMap<String, Directory>(); + + private DirectoriesDao() { + } + + public static DirectoriesDao getInstance() { + return instance; + } + + public Map<String, Directory> getDirectoryMap() { + return directoryMap; + } +} http://git-wip-us.apache.org/repos/asf/tajo/blob/a9ae3cab/tajo-rpc/tajo-ws-rs/src/test/java/org/apache/tajo/ws/rs/netty/testapp2/DirectoriesResource.java ---------------------------------------------------------------------- diff --git a/tajo-rpc/tajo-ws-rs/src/test/java/org/apache/tajo/ws/rs/netty/testapp2/DirectoriesResource.java b/tajo-rpc/tajo-ws-rs/src/test/java/org/apache/tajo/ws/rs/netty/testapp2/DirectoriesResource.java new file mode 100644 index 0000000..40f1ced --- /dev/null +++ b/tajo-rpc/tajo-ws-rs/src/test/java/org/apache/tajo/ws/rs/netty/testapp2/DirectoriesResource.java @@ -0,0 +1,85 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.tajo.ws.rs.netty.testapp2; + +import javax.ws.rs.*; +import javax.ws.rs.core.*; +import java.net.URI; +import java.util.Collection; + +@Path("/directories") +public class DirectoriesResource { + + @Context + UriInfo uriInfo; + + @GET + @Produces(MediaType.APPLICATION_JSON) + public Response getAllDirectories() { + Collection<Directory> directories = DirectoriesDao.getInstance().getDirectoryMap().values(); + GenericEntity<Collection<Directory>> dirEntities = + new GenericEntity<Collection<Directory>>(directories, Collection.class); + return Response.ok(dirEntities).build(); + } + + @POST + @Consumes(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON) + public Response createDirectory(Directory directory) { + String directoryName = directory.getName(); + + if (directoryName == null || directoryName.isEmpty()) { + return Response.status(Response.Status.BAD_REQUEST).build(); + } + + DirectoriesDao.getInstance().getDirectoryMap().put(directoryName, directory); + + UriBuilder uriBuilder = uriInfo.getBaseUriBuilder(); + URI directoryUri = uriBuilder.path(DirectoriesResource.class) + .path(DirectoriesResource.class, "getDirectoryByName") + .build(directoryName); + + return Response.created(directoryUri).entity(directory).build(); + } + + @GET + @Path("{name}") + @Produces(MediaType.APPLICATION_JSON) + public Response getDirectoryByName(@PathParam("name") String directoryName) { + Directory directory = DirectoriesDao.getInstance().getDirectoryMap().get(directoryName); + + if (directory == null) { + return Response.status(Response.Status.NOT_FOUND).build(); + } + + return Response.ok(directory).build(); + } + + @DELETE + @Path("{name}") + public Response deleteDirectory(@PathParam("name") String directoryName) { + if (!DirectoriesDao.getInstance().getDirectoryMap().containsKey(directoryName)) { + return Response.status(Response.Status.NOT_FOUND).build(); + } + + DirectoriesDao.getInstance().getDirectoryMap().remove(directoryName); + + return Response.ok().build(); + } +} http://git-wip-us.apache.org/repos/asf/tajo/blob/a9ae3cab/tajo-rpc/tajo-ws-rs/src/test/java/org/apache/tajo/ws/rs/netty/testapp2/Directory.java ---------------------------------------------------------------------- diff --git a/tajo-rpc/tajo-ws-rs/src/test/java/org/apache/tajo/ws/rs/netty/testapp2/Directory.java b/tajo-rpc/tajo-ws-rs/src/test/java/org/apache/tajo/ws/rs/netty/testapp2/Directory.java new file mode 100644 index 0000000..3851020 --- /dev/null +++ b/tajo-rpc/tajo-ws-rs/src/test/java/org/apache/tajo/ws/rs/netty/testapp2/Directory.java @@ -0,0 +1,52 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.tajo.ws.rs.netty.testapp2; + +import java.io.Serializable; + +public class Directory implements Serializable { + + private String name; + private String owner; + private String group; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getOwner() { + return owner; + } + + public void setOwner(String owner) { + this.owner = owner; + } + + public String getGroup() { + return group; + } + + public void setGroup(String group) { + this.group = group; + } +} http://git-wip-us.apache.org/repos/asf/tajo/blob/a9ae3cab/tajo-rpc/tajo-ws-rs/src/test/java/org/apache/tajo/ws/rs/netty/testapp2/FileManagementApplication.java ---------------------------------------------------------------------- diff --git a/tajo-rpc/tajo-ws-rs/src/test/java/org/apache/tajo/ws/rs/netty/testapp2/FileManagementApplication.java b/tajo-rpc/tajo-ws-rs/src/test/java/org/apache/tajo/ws/rs/netty/testapp2/FileManagementApplication.java new file mode 100644 index 0000000..49026a0 --- /dev/null +++ b/tajo-rpc/tajo-ws-rs/src/test/java/org/apache/tajo/ws/rs/netty/testapp2/FileManagementApplication.java @@ -0,0 +1,35 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.tajo.ws.rs.netty.testapp2; + +import javax.ws.rs.core.Application; +import java.util.HashSet; +import java.util.Set; + +public class FileManagementApplication extends Application { + + @Override + public Set<Class<?>> getClasses() { + Set<Class<?>> classes = new HashSet<Class<?>>(); + + classes.add(DirectoriesResource.class); + + return classes; + } +}
