/* * Copyright 2008-2011 the original author or authors. * * Licensed 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 com.nominanuda.hyperapi; import static com.nominanuda.zen.oio.OioUtils.IO; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import javax.ws.rs.PUT; import javax.ws.rs.Path; import org.apache.http.HttpHost; import org.apache.http.HttpRequest; import org.apache.http.HttpResponse; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.HttpClient; import org.apache.http.client.ResponseHandler; import org.apache.http.client.methods.HttpUriRequest; import org.apache.http.conn.ClientConnectionManager; import org.apache.http.params.HttpParams; import org.apache.http.protocol.HttpContext; import org.junit.Test; import com.nominanuda.web.mvc.WebService; import com.nominanuda.zen.obj.Obj; @SuppressWarnings("deprecation") public class PayloadCodecTest { private static final String HTTP_LOCALHOST_12000 = "http://localhost:12000"; @Test public void testTestHyperApi() { HyperApiWsSkelton skelton = makeSkelton(TestHyperApi2.class, new TestHyperApi2() { public Obj putFoo(String bar, String baz, Obj foo) { return foo; }}); TestHyperApi2 api = makeStub(skelton, TestHyperApi2.class); Obj o = api.putFoo("BAR", "BAZ", Obj.make("x", "y")); assertEquals("y", o.get("x")); } @Test public void testApi1() throws IOException { HyperApiWsSkelton skelton = makeSkelton(Api1.class, new Api1() { public InputStream put(byte[] foo) { return new ByteArrayInputStream(foo); }}); Api1 api = makeStub(skelton, Api1.class); byte[] o = IO.readAndClose(api.put("BAR".getBytes())); assertArrayEquals("BAR".getBytes(), o); } @HyperApi interface Api1 { @PUT @Path("/") InputStream put(byte[] foo); } @Test public void testApi2() { HyperApiWsSkelton skelton = makeSkelton(Api2.class, new Api2() { public byte[] put(InputStream foo) { try { return IO.readAndClose(foo); } catch (IOException e) { throw new RuntimeException(e); } }}); Api2 api = makeStub(skelton, Api2.class); byte[] o = api.put(new ByteArrayInputStream("BAR".getBytes())); assertArrayEquals("BAR".getBytes(), o); } @HyperApi interface Api2 { @PUT @Path("/") byte[] put(InputStream foo); } @Test public void testAnyJsonApi() { HyperApiWsSkelton skelton = makeSkelton(Api3.class, new Api3() { public String x(String x) { return x; } public Boolean y(Boolean y) { return y; } public Double w(Double w) { return w; } public Long k(Long k) { return k; } }); Api3 api = makeStub(skelton, Api3.class); assertEquals("B", api.x("B")); assertEquals("", api.x("")); assertEquals(null, api.x(null)); assertEquals(null, api.y(null)); assertEquals(null, api.w(null)); assertEquals(null, api.k(null)); assertEquals(new Long(1), api.k(1l)); assertEquals(new Boolean(false), api.y(false)); assertEquals(new Double(1.1), api.w(1.1)); } @HyperApi interface Api3 { @PUT @Path("/x")String x(String x); @PUT @Path("/y")Boolean y(Boolean y); @PUT @Path("/w")Double w(Double w); @PUT @Path("/k")Long k(Long k); } private <T> HyperApiWsSkelton makeSkelton(Class<T> api, T impl) { HyperApiWsSkelton skelton = new HyperApiWsSkelton(); skelton.setApi(api); skelton.setService(impl); skelton.setRequestUriPrefix(HTTP_LOCALHOST_12000); return skelton; } private <T> T makeStub(HyperApiWsSkelton skelton, Class<T> api) { HttpClient client = new InMemoryClient(skelton); HttpClientHyperApiFactory f = new HttpClientHyperApiFactory(); f.setHttpClient(client); f.setUriPrefix(HTTP_LOCALHOST_12000); T apii = f.getInstance("", api); return apii; } private class InMemoryClient implements HttpClient { private final WebService ws; public InMemoryClient(WebService ws) { this.ws = ws; } public HttpResponse execute(HttpUriRequest request) throws IOException, ClientProtocolException { try { return ws.handle(request); } catch (Exception e) { throw new IOException(e); } } public HttpParams getParams() { return null; } public ClientConnectionManager getConnectionManager() { return null; } public HttpResponse execute(HttpUriRequest request, HttpContext context) throws IOException, ClientProtocolException { return null; } public HttpResponse execute(HttpHost target, HttpRequest request) throws IOException, ClientProtocolException { return null; } public HttpResponse execute(HttpHost target, HttpRequest request, HttpContext context) throws IOException, ClientProtocolException { return null; } public <T> T execute(HttpUriRequest request, ResponseHandler<? extends T> responseHandler) throws IOException, ClientProtocolException { return null; } public <T> T execute(HttpUriRequest request, ResponseHandler<? extends T> responseHandler, HttpContext context) throws IOException, ClientProtocolException { return null; } public <T> T execute(HttpHost target, HttpRequest request, ResponseHandler<? extends T> responseHandler) throws IOException, ClientProtocolException { return null; } public <T> T execute(HttpHost target, HttpRequest request, ResponseHandler<? extends T> responseHandler, HttpContext context) throws IOException, ClientProtocolException { return null; } } }