This is an automated email from the git hooks/post-receive script. tjaalton pushed a commit to branch master in repository jackson-jaxrs-providers.
commit dc829f08d26e5d7f416c2ab36f604d5b47ef4b10 Author: Tatu Saloranta <[email protected]> Date: Fri Feb 7 21:05:05 2014 -0800 Try to add baseline provider tests for backends other than JSON --- .../jackson/jaxrs/cbor/JacksonCBORProvider.java | 7 +- .../jackson/jaxrs/cbor}/JaxrsTestBase.java | 26 +++++- .../jackson/jaxrs/cbor/TestCBORVersions.java | 28 ++++++ .../jackson/jaxrs/cbor/TestCanDeserialize.java | 25 ++++++ .../jackson/jaxrs/cbor/dw/ResourceTestBase.java | 94 +++++++++++++++++++ .../jaxrs/cbor/dw/SimpleEndpointTestBase.java | 100 +++++++++++++++++++++ .../jaxrs/cbor/jersey/SimpleEndpointTest.java | 11 +++ .../jackson/jaxrs/smile/JacksonSmileProvider.java | 7 +- .../jackson/jaxrs/smile/JaxrsTestBase.java | 24 +++++ .../jackson/jaxrs/smile/dw/ResourceTestBase.java | 94 +++++++++++++++++++ .../jaxrs/smile/dw/SimpleEndpointTestBase.java | 100 +++++++++++++++++++++ .../jaxrs/smile/jersey/SimpleEndpointTest.java | 11 +++ 12 files changed, 524 insertions(+), 3 deletions(-) diff --git a/cbor/src/main/java/com/fasterxml/jackson/jaxrs/cbor/JacksonCBORProvider.java b/cbor/src/main/java/com/fasterxml/jackson/jaxrs/cbor/JacksonCBORProvider.java index df8b421..6078374 100644 --- a/cbor/src/main/java/com/fasterxml/jackson/jaxrs/cbor/JacksonCBORProvider.java +++ b/cbor/src/main/java/com/fasterxml/jackson/jaxrs/cbor/JacksonCBORProvider.java @@ -8,6 +8,7 @@ import javax.ws.rs.ext.*; import com.fasterxml.jackson.core.*; import com.fasterxml.jackson.databind.*; +import com.fasterxml.jackson.dataformat.cbor.CBORFactory; import com.fasterxml.jackson.jaxrs.base.ProviderBase; import com.fasterxml.jackson.jaxrs.cfg.Annotations; @@ -200,7 +201,11 @@ extends ProviderBase<JacksonCBORProvider, resolver = _providers.getContextResolver(ObjectMapper.class, null); } if (resolver != null) { - return resolver.getContext(type); + ObjectMapper mapper = resolver.getContext(type); + // 07-Feb-2014, tatu: just in case, ensure we have correct type + if (mapper.getFactory() instanceof CBORFactory) { + return mapper; + } } } return null; diff --git a/smile/src/test/java/com/fasterxml/jackson/jaxrs/smile/JaxrsTestBase.java b/cbor/src/test/java/com/fasterxml/jackson/jaxrs/cbor/JaxrsTestBase.java similarity index 79% copy from smile/src/test/java/com/fasterxml/jackson/jaxrs/smile/JaxrsTestBase.java copy to cbor/src/test/java/com/fasterxml/jackson/jaxrs/cbor/JaxrsTestBase.java index fc977b6..86fac51 100644 --- a/smile/src/test/java/com/fasterxml/jackson/jaxrs/smile/JaxrsTestBase.java +++ b/cbor/src/test/java/com/fasterxml/jackson/jaxrs/cbor/JaxrsTestBase.java @@ -1,6 +1,8 @@ -package com.fasterxml.jackson.jaxrs.smile; +package com.fasterxml.jackson.jaxrs.cbor; +import java.io.ByteArrayOutputStream; import java.io.IOException; +import java.io.InputStream; import java.util.Arrays; import org.junit.Assert; @@ -88,4 +90,26 @@ public abstract class JaxrsTestBase public String quote(String str) { return '"'+str+'"'; } + + protected String aposToQuotes(String json) { + return json.replace("'", "\""); + } + + protected String readUTF8(InputStream in) throws IOException + { + return new String(readAll(in), "UTF-8"); + } + + protected byte[] readAll(InputStream in) throws IOException + { + ByteArrayOutputStream bytes = new ByteArrayOutputStream(100); + byte[] buffer = new byte[500]; + int count; + + while ((count = in.read(buffer)) > 0) { + bytes.write(buffer, 0, count); + } + in.close(); + return bytes.toByteArray(); + } } diff --git a/cbor/src/test/java/com/fasterxml/jackson/jaxrs/cbor/TestCBORVersions.java b/cbor/src/test/java/com/fasterxml/jackson/jaxrs/cbor/TestCBORVersions.java new file mode 100644 index 0000000..ad2c662 --- /dev/null +++ b/cbor/src/test/java/com/fasterxml/jackson/jaxrs/cbor/TestCBORVersions.java @@ -0,0 +1,28 @@ +package com.fasterxml.jackson.jaxrs.cbor; + +import com.fasterxml.jackson.core.Version; +import com.fasterxml.jackson.core.Versioned; + +public class TestCBORVersions extends JaxrsTestBase +{ + public void testMapperVersions() + { + assertVersion(new JacksonCBORProvider()); + } + + /* + /********************************************************** + /* Helper methods + /********************************************************** + */ + + private void assertVersion(Versioned vers) + { + final Version v = vers.version(); + assertFalse("Should find version information (got "+v+")", v.isUknownVersion()); + Version exp = PackageVersion.VERSION; + assertEquals(exp.toFullString(), v.toFullString()); + assertEquals(exp, v); + } +} + diff --git a/cbor/src/test/java/com/fasterxml/jackson/jaxrs/cbor/TestCanDeserialize.java b/cbor/src/test/java/com/fasterxml/jackson/jaxrs/cbor/TestCanDeserialize.java new file mode 100644 index 0000000..4b950ff --- /dev/null +++ b/cbor/src/test/java/com/fasterxml/jackson/jaxrs/cbor/TestCanDeserialize.java @@ -0,0 +1,25 @@ +package com.fasterxml.jackson.jaxrs.cbor; + +import java.io.*; +import java.lang.annotation.Annotation; + +import javax.ws.rs.core.MediaType; + +/** + * Unit test to check [JACKSON-540] + */ +public class TestCanDeserialize extends JaxrsTestBase +{ + static class Bean { + public int x; + } + + // [Issue#1]: exception for no content + public void testCanSerializeEmpty() throws IOException + { + JacksonCBORProvider prov = new JacksonCBORProvider(); + Bean b = (Bean) prov.readFrom(Object.class, Bean.class, new Annotation[0], + MediaType.APPLICATION_XML_TYPE, null, new ByteArrayInputStream(new byte[0])); + assertNull(b); + } +} diff --git a/cbor/src/test/java/com/fasterxml/jackson/jaxrs/cbor/dw/ResourceTestBase.java b/cbor/src/test/java/com/fasterxml/jackson/jaxrs/cbor/dw/ResourceTestBase.java new file mode 100644 index 0000000..13bded1 --- /dev/null +++ b/cbor/src/test/java/com/fasterxml/jackson/jaxrs/cbor/dw/ResourceTestBase.java @@ -0,0 +1,94 @@ +package com.fasterxml.jackson.jaxrs.cbor.dw; + +import java.io.*; +import java.util.HashSet; +import java.util.Set; + +import javax.servlet.DispatcherType; +import javax.servlet.Filter; +import javax.servlet.Servlet; +import javax.ws.rs.core.Application; + +import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.server.handler.ContextHandlerCollection; +import org.eclipse.jetty.servlet.ServletContextHandler; +import org.eclipse.jetty.servlet.ServletHolder; + +import com.fasterxml.jackson.jaxrs.cbor.JacksonCBORProvider; +import com.fasterxml.jackson.jaxrs.cbor.JaxrsTestBase; + +/** + * Intermediate base for tests that run actual full JAX-RS resource. + */ +public abstract class ResourceTestBase extends JaxrsTestBase +{ + protected static abstract class CBORApplication extends Application + { + protected final Object _provider; + protected final Object _resource; + + protected CBORApplication(Object provider, Object resource) { + _provider = provider; + _resource = resource; + } + + @Override + public Set<Object> getSingletons() { + HashSet<Object> singletons = new HashSet<Object>(); + singletons.add(_provider); + singletons.add(_resource); + return singletons; + } + } + + protected static abstract class CBORApplicationWithJackson extends CBORApplication + { + public CBORApplicationWithJackson(Object resource) { + super(new JacksonCBORProvider(), resource); + } + } + + /* + /********************************************************** + /* Abstract and overridable config methods + /********************************************************** + */ + + protected abstract Class<? extends Servlet> servletContainerClass(); + + /* + /********************************************************** + /* Starting actual JAX-RS container + /********************************************************** + */ + + protected Server startServer(int port, Class<? extends Application> appClass) { + return startServer(port, appClass, null); + } + + protected Server startServer(int port, Class<? extends Application> appClass, + Class<? extends Filter> filterClass) + { + Server server = new Server(port); + final ContextHandlerCollection contexts = new ContextHandlerCollection(); + server.setHandler(contexts); + ServletHolder jaxrs = new ServletHolder(servletContainerClass()); + jaxrs.setInitParameter("javax.ws.rs.Application", appClass.getName()); + final ServletContextHandler mainHandler = new ServletContextHandler(contexts, "/", true, false); + mainHandler.addServlet(jaxrs, "/*"); + + if (filterClass != null) { + mainHandler.addFilter(filterClass, "/*", java.util.EnumSet.allOf(DispatcherType.class)); + } + + server.setHandler(mainHandler); + try { + server.start(); + } catch (RuntimeException e) { + throw e; + } catch (Exception e) { + throw new RuntimeException(e); + } + return server; + } +} diff --git a/cbor/src/test/java/com/fasterxml/jackson/jaxrs/cbor/dw/SimpleEndpointTestBase.java b/cbor/src/test/java/com/fasterxml/jackson/jaxrs/cbor/dw/SimpleEndpointTestBase.java new file mode 100644 index 0000000..87881d4 --- /dev/null +++ b/cbor/src/test/java/com/fasterxml/jackson/jaxrs/cbor/dw/SimpleEndpointTestBase.java @@ -0,0 +1,100 @@ +package com.fasterxml.jackson.jaxrs.cbor.dw; + +import java.io.*; +import java.net.*; + +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; + +import org.eclipse.jetty.server.Server; +import org.junit.Assert; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.dataformat.cbor.CBORFactory; +import com.fasterxml.jackson.jaxrs.cbor.CBORMediaTypes; + +public abstract class SimpleEndpointTestBase extends ResourceTestBase +{ + final static int TEST_PORT = 6011; + + static class Point { + public int x, y; + + protected Point() { } + public Point(int x, int y) { + this.x = x; + this.y = y; + } + } + + @Path("/point") + public static class SimpleResource + { + @GET + @Produces({ CBORMediaTypes.APPLICATION_JACKSON_CBOR }) + public Point getPoint() { + return new Point(1, 2); + } + } + + public static class SimpleResourceApp extends CBORApplicationWithJackson { + public SimpleResourceApp() { super(new SimpleResource()); } + } + + private final static byte[] UNTOUCHABLE_RESPONSE = new byte[] { 1, 2, 3, 4 }; + + @Path("/raw") + public static class RawResource + { + @GET + @Path("bytes") + @Produces({ CBORMediaTypes.APPLICATION_JACKSON_CBOR }) + public byte[] getBytes() throws IOException { + return UNTOUCHABLE_RESPONSE; + } + } + + public static class SimpleRawApp extends CBORApplicationWithJackson { + public SimpleRawApp() { super(new RawResource()); } + } + + /* + /********************************************************** + /* Test methods + /********************************************************** + */ + + public void testStandardSmile() throws Exception + { + final ObjectMapper mapper = new ObjectMapper(new CBORFactory()); + Server server = startServer(TEST_PORT, SimpleResourceApp.class); + Point p; + + try { + InputStream in = new URL("http://localhost:"+TEST_PORT+"/point").openStream(); + p = mapper.readValue(in, Point.class); + in.close(); + } finally { + server.stop(); + } + // ensure we got a valid Point + assertNotNull(p); + assertEquals(1, p.x); + assertEquals(2, p.y); + } + + // [Issue#34] Verify that Untouchables act the way as they should + @SuppressWarnings("resource") + public void testUntouchables() throws Exception + { + Server server = startServer(TEST_PORT, SimpleRawApp.class); + try { + InputStream in = new URL("http://localhost:"+TEST_PORT+"/raw/bytes").openStream(); + Assert.assertArrayEquals(UNTOUCHABLE_RESPONSE, readAll(in)); + } finally { + server.stop(); + } + } +} diff --git a/cbor/src/test/java/com/fasterxml/jackson/jaxrs/cbor/jersey/SimpleEndpointTest.java b/cbor/src/test/java/com/fasterxml/jackson/jaxrs/cbor/jersey/SimpleEndpointTest.java new file mode 100644 index 0000000..92c14ca --- /dev/null +++ b/cbor/src/test/java/com/fasterxml/jackson/jaxrs/cbor/jersey/SimpleEndpointTest.java @@ -0,0 +1,11 @@ +package com.fasterxml.jackson.jaxrs.cbor.jersey; + +import javax.servlet.Servlet; + +import com.fasterxml.jackson.jaxrs.cbor.dw.SimpleEndpointTestBase; +import com.sun.jersey.spi.container.servlet.ServletContainer; + +public class SimpleEndpointTest extends SimpleEndpointTestBase { + @Override + protected Class<? extends Servlet> servletContainerClass() { return ServletContainer.class; } +} diff --git a/smile/src/main/java/com/fasterxml/jackson/jaxrs/smile/JacksonSmileProvider.java b/smile/src/main/java/com/fasterxml/jackson/jaxrs/smile/JacksonSmileProvider.java index 76138b7..1ace7b4 100644 --- a/smile/src/main/java/com/fasterxml/jackson/jaxrs/smile/JacksonSmileProvider.java +++ b/smile/src/main/java/com/fasterxml/jackson/jaxrs/smile/JacksonSmileProvider.java @@ -8,6 +8,7 @@ import javax.ws.rs.ext.*; import com.fasterxml.jackson.core.*; import com.fasterxml.jackson.databind.*; +import com.fasterxml.jackson.dataformat.smile.SmileFactory; import com.fasterxml.jackson.jaxrs.base.ProviderBase; import com.fasterxml.jackson.jaxrs.cfg.Annotations; @@ -200,7 +201,11 @@ extends ProviderBase<JacksonSmileProvider, resolver = _providers.getContextResolver(ObjectMapper.class, null); } if (resolver != null) { - return resolver.getContext(type); + ObjectMapper mapper = resolver.getContext(type); + // 07-Feb-2014, tatu: just in case, ensure we have correct type + if (mapper.getFactory() instanceof SmileFactory) { + return mapper; + } } } return null; diff --git a/smile/src/test/java/com/fasterxml/jackson/jaxrs/smile/JaxrsTestBase.java b/smile/src/test/java/com/fasterxml/jackson/jaxrs/smile/JaxrsTestBase.java index fc977b6..b340976 100644 --- a/smile/src/test/java/com/fasterxml/jackson/jaxrs/smile/JaxrsTestBase.java +++ b/smile/src/test/java/com/fasterxml/jackson/jaxrs/smile/JaxrsTestBase.java @@ -1,6 +1,8 @@ package com.fasterxml.jackson.jaxrs.smile; +import java.io.ByteArrayOutputStream; import java.io.IOException; +import java.io.InputStream; import java.util.Arrays; import org.junit.Assert; @@ -88,4 +90,26 @@ public abstract class JaxrsTestBase public String quote(String str) { return '"'+str+'"'; } + + protected String aposToQuotes(String json) { + return json.replace("'", "\""); + } + + protected String readUTF8(InputStream in) throws IOException + { + return new String(readAll(in), "UTF-8"); + } + + protected byte[] readAll(InputStream in) throws IOException + { + ByteArrayOutputStream bytes = new ByteArrayOutputStream(100); + byte[] buffer = new byte[500]; + int count; + + while ((count = in.read(buffer)) > 0) { + bytes.write(buffer, 0, count); + } + in.close(); + return bytes.toByteArray(); + } } diff --git a/smile/src/test/java/com/fasterxml/jackson/jaxrs/smile/dw/ResourceTestBase.java b/smile/src/test/java/com/fasterxml/jackson/jaxrs/smile/dw/ResourceTestBase.java new file mode 100644 index 0000000..5100483 --- /dev/null +++ b/smile/src/test/java/com/fasterxml/jackson/jaxrs/smile/dw/ResourceTestBase.java @@ -0,0 +1,94 @@ +package com.fasterxml.jackson.jaxrs.smile.dw; + +import java.io.*; +import java.util.HashSet; +import java.util.Set; + +import javax.servlet.DispatcherType; +import javax.servlet.Filter; +import javax.servlet.Servlet; +import javax.ws.rs.core.Application; + +import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.server.handler.ContextHandlerCollection; +import org.eclipse.jetty.servlet.ServletContextHandler; +import org.eclipse.jetty.servlet.ServletHolder; + +import com.fasterxml.jackson.jaxrs.smile.JacksonSmileProvider; +import com.fasterxml.jackson.jaxrs.smile.JaxrsTestBase; + +/** + * Intermediate base for tests that run actual full JAX-RS resource. + */ +public abstract class ResourceTestBase extends JaxrsTestBase +{ + protected static abstract class SmileApplication extends Application + { + protected final Object _smileProvider; + protected final Object _resource; + + protected SmileApplication(Object smileProvider, Object resource) { + _smileProvider = smileProvider; + _resource = resource; + } + + @Override + public Set<Object> getSingletons() { + HashSet<Object> singletons = new HashSet<Object>(); + singletons.add(_smileProvider); + singletons.add(_resource); + return singletons; + } + } + + protected static abstract class SmileApplicationWithJackson extends SmileApplication + { + public SmileApplicationWithJackson(Object resource) { + super(new JacksonSmileProvider(), resource); + } + } + + /* + /********************************************************** + /* Abstract and overridable config methods + /********************************************************** + */ + + protected abstract Class<? extends Servlet> servletContainerClass(); + + /* + /********************************************************** + /* Starting actual JAX-RS container + /********************************************************** + */ + + protected Server startServer(int port, Class<? extends Application> appClass) { + return startServer(port, appClass, null); + } + + protected Server startServer(int port, Class<? extends Application> appClass, + Class<? extends Filter> filterClass) + { + Server server = new Server(port); + final ContextHandlerCollection contexts = new ContextHandlerCollection(); + server.setHandler(contexts); + ServletHolder jaxrs = new ServletHolder(servletContainerClass()); + jaxrs.setInitParameter("javax.ws.rs.Application", appClass.getName()); + final ServletContextHandler mainHandler = new ServletContextHandler(contexts, "/", true, false); + mainHandler.addServlet(jaxrs, "/*"); + + if (filterClass != null) { + mainHandler.addFilter(filterClass, "/*", java.util.EnumSet.allOf(DispatcherType.class)); + } + + server.setHandler(mainHandler); + try { + server.start(); + } catch (RuntimeException e) { + throw e; + } catch (Exception e) { + throw new RuntimeException(e); + } + return server; + } +} diff --git a/smile/src/test/java/com/fasterxml/jackson/jaxrs/smile/dw/SimpleEndpointTestBase.java b/smile/src/test/java/com/fasterxml/jackson/jaxrs/smile/dw/SimpleEndpointTestBase.java new file mode 100644 index 0000000..4df493b --- /dev/null +++ b/smile/src/test/java/com/fasterxml/jackson/jaxrs/smile/dw/SimpleEndpointTestBase.java @@ -0,0 +1,100 @@ +package com.fasterxml.jackson.jaxrs.smile.dw; + +import java.io.*; +import java.net.*; + +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; + +import org.eclipse.jetty.server.Server; +import org.junit.Assert; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.dataformat.smile.SmileFactory; +import com.fasterxml.jackson.jaxrs.smile.SmileMediaTypes; + +public abstract class SimpleEndpointTestBase extends ResourceTestBase +{ + final static int TEST_PORT = 6011; + + static class Point { + public int x, y; + + protected Point() { } + public Point(int x, int y) { + this.x = x; + this.y = y; + } + } + + @Path("/point") + public static class SimpleResource + { + @GET + @Produces({ SmileMediaTypes.APPLICATION_JACKSON_SMILE }) + public Point getPoint() { + return new Point(1, 2); + } + } + + public static class SimpleResourceApp extends SmileApplicationWithJackson { + public SimpleResourceApp() { super(new SimpleResource()); } + } + + private final static byte[] UNTOUCHABLE_RESPONSE = new byte[] { 1, 2, 3, 4 }; + + @Path("/raw") + public static class RawResource + { + @GET + @Path("bytes") + @Produces({ SmileMediaTypes.APPLICATION_JACKSON_SMILE }) + public byte[] getBytes() throws IOException { + return UNTOUCHABLE_RESPONSE; + } + } + + public static class SimpleRawApp extends SmileApplicationWithJackson { + public SimpleRawApp() { super(new RawResource()); } + } + + /* + /********************************************************** + /* Test methods + /********************************************************** + */ + + public void testStandardSmile() throws Exception + { + final ObjectMapper mapper = new ObjectMapper(new SmileFactory()); + Server server = startServer(TEST_PORT, SimpleResourceApp.class); + Point p; + + try { + InputStream in = new URL("http://localhost:"+TEST_PORT+"/point").openStream(); + p = mapper.readValue(in, Point.class); + in.close(); + } finally { + server.stop(); + } + // ensure we got a valid Point + assertNotNull(p); + assertEquals(1, p.x); + assertEquals(2, p.y); + } + + // [Issue#34] Verify that Untouchables act the way as they should + @SuppressWarnings("resource") + public void testUntouchables() throws Exception + { + Server server = startServer(TEST_PORT, SimpleRawApp.class); + try { + InputStream in = new URL("http://localhost:"+TEST_PORT+"/raw/bytes").openStream(); + Assert.assertArrayEquals(UNTOUCHABLE_RESPONSE, readAll(in)); + } finally { + server.stop(); + } + } +} diff --git a/smile/src/test/java/com/fasterxml/jackson/jaxrs/smile/jersey/SimpleEndpointTest.java b/smile/src/test/java/com/fasterxml/jackson/jaxrs/smile/jersey/SimpleEndpointTest.java new file mode 100644 index 0000000..cad898f --- /dev/null +++ b/smile/src/test/java/com/fasterxml/jackson/jaxrs/smile/jersey/SimpleEndpointTest.java @@ -0,0 +1,11 @@ +package com.fasterxml.jackson.jaxrs.smile.jersey; + +import javax.servlet.Servlet; + +import com.fasterxml.jackson.jaxrs.smile.dw.SimpleEndpointTestBase; +import com.sun.jersey.spi.container.servlet.ServletContainer; + +public class SimpleEndpointTest extends SimpleEndpointTestBase { + @Override + protected Class<? extends Servlet> servletContainerClass() { return ServletContainer.class; } +} -- Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-java/jackson-jaxrs-providers.git _______________________________________________ pkg-java-commits mailing list [email protected] http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-java-commits

