Author: zhoresh
Date: Wed Aug 25 22:01:18 2010
New Revision: 989386
URL: http://svn.apache.org/viewvc?rev=989386&view=rev
Log:
http://codereview.appspot.com/2026042/
Add GadgetHandlerService tests and fix handling error input
Modified:
shindig/trunk/java/common/src/main/java/org/apache/shindig/protocol/conversion/BeanDelegator.java
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/GadgetsHandlerService.java
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/GadgetHandlerServiceTest.java
Modified:
shindig/trunk/java/common/src/main/java/org/apache/shindig/protocol/conversion/BeanDelegator.java
URL:
http://svn.apache.org/viewvc/shindig/trunk/java/common/src/main/java/org/apache/shindig/protocol/conversion/BeanDelegator.java?rev=989386&r1=989385&r2=989386&view=diff
==============================================================================
---
shindig/trunk/java/common/src/main/java/org/apache/shindig/protocol/conversion/BeanDelegator.java
(original)
+++
shindig/trunk/java/common/src/main/java/org/apache/shindig/protocol/conversion/BeanDelegator.java
Wed Aug 25 22:01:18 2010
@@ -51,6 +51,11 @@ public class BeanDelegator {
/** Indicate NULL value for a field (To overcome shortcome of immutable map)
*/
public static final String NULL = "<NULL sentinel>";
+ /** Gate a value to use NULL constant instead of null pointer */
+ public static Object nullable(Object o) {
+ return (o != null ? o : NULL);
+ }
+
private static final Map<String, Object> EMPTY_FIELDS = ImmutableMap.of();
/** List of Classes that are considered primitives and are not proxied **/
Modified:
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/GadgetsHandlerService.java
URL:
http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/GadgetsHandlerService.java?rev=989386&r1=989385&r2=989386&view=diff
==============================================================================
---
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/GadgetsHandlerService.java
(original)
+++
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/GadgetsHandlerService.java
Wed Aug 25 22:01:18 2010
@@ -29,6 +29,7 @@ import org.apache.shindig.common.uri.Uri
import org.apache.shindig.gadgets.Gadget;
import org.apache.shindig.gadgets.GadgetContext;
import org.apache.shindig.gadgets.RenderingContext;
+import org.apache.shindig.gadgets.http.HttpResponse;
import org.apache.shindig.gadgets.process.ProcessingException;
import org.apache.shindig.gadgets.process.Processor;
import org.apache.shindig.gadgets.spec.Feature;
@@ -104,12 +105,22 @@ public class GadgetsHandlerService {
*/
public GadgetsHandlerApi.MetadataResponse
getMetadata(GadgetsHandlerApi.MetadataRequest request)
throws ProcessingException {
+ if (request.getUrl() == null) {
+ throw new ProcessingException("Missing url paramater",
HttpResponse.SC_BAD_REQUEST);
+ }
+ if (request.getContainer() == null) {
+ throw new ProcessingException("Missing container paramater",
HttpResponse.SC_BAD_REQUEST);
+ }
+ if (request.getFields() == null) {
+ throw new ProcessingException("Missing fields paramater",
HttpResponse.SC_BAD_REQUEST);
+ }
Set<String> fields = beanFilter.processBeanFields(request.getFields());
+
GadgetContext context = new MetadataGadgetContext(request);
Gadget gadget = processor.process(context);
String iframeUrl =
- fields.contains("iframeurl") ?
iframeUriManager.makeRenderingUri(gadget).toString()
- : null;
+ (fields.contains("iframeurl") ||
fields.contains(BeanFilter.ALL_FIELDS)) ?
+ iframeUriManager.makeRenderingUri(gadget).toString() : null;
return createMetadataResponse(context.getUrl(), gadget.getSpec(),
iframeUrl, fields);
}
@@ -120,7 +131,16 @@ public class GadgetsHandlerService {
* @throws SecurityTokenException
*/
public GadgetsHandlerApi.TokenResponse
getToken(GadgetsHandlerApi.TokenRequest request)
- throws SecurityTokenException {
+ throws SecurityTokenException, ProcessingException {
+ if (request.getUrl() == null) {
+ throw new ProcessingException("Missing url paramater",
HttpResponse.SC_BAD_REQUEST);
+ }
+ if (request.getContainer() == null) {
+ throw new ProcessingException("Missing container paramater",
HttpResponse.SC_BAD_REQUEST);
+ }
+ if (request.getFields() == null) {
+ throw new ProcessingException("Missing fields paramater",
HttpResponse.SC_BAD_REQUEST);
+ }
Set<String> fields = beanFilter.processBeanFields(request.getFields());
SecurityToken tokenData = convertToken(request.getToken(),
request.getContainer(),
@@ -191,6 +211,9 @@ public class GadgetsHandlerService {
private SecurityToken convertToken(GadgetsHandlerApi.TokenData token,
String container, String url) {
+ if (token == null) {
+ return null;
+ }
return beanDelegator.createDelegator(token, SecurityToken.class,
ImmutableMap.<String, Object>of("container", container,
"appid", url, "appurl", url));
@@ -205,16 +228,18 @@ public class GadgetsHandlerService {
Uri url, GadgetSpec spec, String iframeUrl, Set<String> fields) {
return (GadgetsHandlerApi.MetadataResponse) beanFilter.createFilteredBean(
beanDelegator.createDelegator(spec,
GadgetsHandlerApi.MetadataResponse.class,
- ImmutableMap.<String, Object>of("url", url, "error",
BeanDelegator.NULL,
- "iframeurl", iframeUrl)),
+ ImmutableMap.<String, Object>of(
+ "url", url, "error", BeanDelegator.NULL,
+ "iframeurl", BeanDelegator.nullable(iframeUrl))),
fields);
}
private GadgetsHandlerApi.TokenResponse createTokenResponse(
Uri url, String token, Set<String> fields) {
return (GadgetsHandlerApi.TokenResponse) beanFilter.createFilteredBean(
- beanDelegator.createDelegator(token,
GadgetsHandlerApi.TokenResponse.class,
- ImmutableMap.<String, Object>of("url", url, "error",
BeanDelegator.NULL, "token", token)),
+ beanDelegator.createDelegator("empty",
GadgetsHandlerApi.TokenResponse.class,
+ ImmutableMap.<String, Object>of("url", url, "error",
BeanDelegator.NULL,
+ "token", BeanDelegator.nullable(token))),
fields);
}
}
Modified:
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/GadgetHandlerServiceTest.java
URL:
http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/GadgetHandlerServiceTest.java?rev=989386&r1=989385&r2=989386&view=diff
==============================================================================
---
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/GadgetHandlerServiceTest.java
(original)
+++
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/GadgetHandlerServiceTest.java
Wed Aug 25 22:01:18 2010
@@ -18,20 +18,258 @@
*/
package org.apache.shindig.gadgets.servlet;
+import com.google.common.collect.ImmutableList;
+
+import org.apache.shindig.auth.SecurityToken;
+import org.apache.shindig.auth.SecurityTokenCodec;
+import org.apache.shindig.auth.SecurityTokenException;
import org.apache.shindig.common.EasyMockTestCase;
+import org.apache.shindig.common.uri.Uri;
+import org.apache.shindig.gadgets.process.ProcessingException;
import org.apache.shindig.protocol.conversion.BeanDelegator;
+import org.apache.shindig.protocol.conversion.BeanFilter;
+import org.easymock.EasyMock;
+import org.junit.Before;
import org.junit.Test;
+import java.util.List;
+import java.util.Map;
+
public class GadgetHandlerServiceTest extends EasyMockTestCase {
+ private static final String TOKEN = "<token data>";
+ private static final String OWNER = "<owner>";
+ private static final String VIEWER = "<viewer>";
+ private static final String CONTAINER = "container";
+
+ private final BeanDelegator delegator = new BeanDelegator(
+ GadgetsHandlerService.apiClasses, GadgetsHandlerService.enumConversionMap);
+
+ private final FakeProcessor processor = new FakeProcessor();
+ private final FakeIframeUriManager urlGenerator = new FakeIframeUriManager();
+
+ private FakeSecurityTokenCodec tokenCodec;
+ private GadgetsHandlerService gadgetHandler;
+
+ @Before
+ public void setUp() {
+ tokenCodec = new FakeSecurityTokenCodec();
+ gadgetHandler = new GadgetsHandlerService(processor, urlGenerator,
+ tokenCodec, new BeanFilter());
+ }
+
// Next test verify that the API data classes are configured correctly.
// The mapping is done using reflection in runtime, so this test verify
mapping is complete
// this test will prevent from not intended change to the API.
// DO NOT REMOVE TEST
@Test
public void testHandlerDataDelegation() throws Exception {
- BeanDelegator delegator = new BeanDelegator(
- GadgetsHandlerService.apiClasses,
GadgetsHandlerService.enumConversionMap);
delegator.validate();
}
+
+
+ @Test
+ public void testGetMetadata() throws Exception {
+ GadgetsHandlerApi.MetadataRequest request = createMetadataRequest(
+ FakeProcessor.SPEC_URL, CONTAINER, "view",
+ createTokenData(null, null), ImmutableList.of("*"));
+ replay();
+ GadgetsHandlerApi.MetadataResponse response =
gadgetHandler.getMetadata(request);
+ assertEquals(FakeIframeUriManager.DEFAULT_IFRAME_URI.toString(),
response.getIframeUrl());
+ assertEquals(1, response.getViews().size());
+
assertTrue(response.getViews().get("default").getContent().contains("Hello,
world" ));
+ assertEquals(FakeProcessor.SPEC_TITLE,
response.getModulePrefs().getTitle());
+ assertEquals(FakeProcessor.LINK_HREF,
+
response.getModulePrefs().getLinks().get(FakeProcessor.LINK_REL).getHref().toString());
+ assertEquals(FakeProcessor.LINK_REL,
+
response.getModulePrefs().getLinks().get(FakeProcessor.LINK_REL).getRel());
+ assertEquals(1, response.getUserPrefs().size());
+ assertEquals("up_one",
response.getUserPrefs().get("up_one").getDisplayName());
+ assertEquals(4,
response.getUserPrefs().get("up_one").getEnumValues().size());
+ verify();
+ }
+
+ @Test
+ public void testGetMetadataOnlyView() throws Exception {
+ GadgetsHandlerApi.MetadataRequest request = createMetadataRequest(
+ FakeProcessor.SPEC_URL, CONTAINER, null,
+ createTokenData(null, null), ImmutableList.of("views.*"));
+ replay();
+ GadgetsHandlerApi.MetadataResponse response =
gadgetHandler.getMetadata(request);
+ assertNull(response.getIframeUrl());
+ assertNull(response.getUserPrefs());
+ assertNull(response.getModulePrefs());
+ assertEquals(FakeProcessor.SPEC_URL, response.getUrl());
+ assertEquals(1, response.getViews().size());
+
assertTrue(response.getViews().get("default").getContent().contains("Hello,
world" ));
+ verify();
+ }
+
+
+ @Test(expected = ProcessingException.class)
+ public void testGetMetadataNoContainer() throws Exception {
+ GadgetsHandlerApi.MetadataRequest request = createMetadataRequest(
+ FakeProcessor.SPEC_URL, null, null,
+ createTokenData(null, null), ImmutableList.of("*"));
+ replay();
+ GadgetsHandlerApi.MetadataResponse response =
gadgetHandler.getMetadata(request);
+ }
+
+
+ @Test(expected = ProcessingException.class)
+ public void testGetMetadataNoUrl() throws Exception {
+ GadgetsHandlerApi.MetadataRequest request = createMetadataRequest(
+ null, CONTAINER, null,
+ createTokenData(null, null), ImmutableList.of("*"));
+ replay();
+ GadgetsHandlerApi.MetadataResponse response =
gadgetHandler.getMetadata(request);
+ }
+
+ @Test(expected = ProcessingException.class)
+ public void testGetMetadataNoFields() throws Exception {
+ GadgetsHandlerApi.MetadataRequest request = createMetadataRequest(
+ FakeProcessor.SPEC_URL, CONTAINER, null,
+ createTokenData(null, null), null);
+ replay();
+ GadgetsHandlerApi.MetadataResponse response =
gadgetHandler.getMetadata(request);
+ }
+
+ @Test(expected = ProcessingException.class)
+ public void testGetMetadataBadGadget() throws Exception {
+ GadgetsHandlerApi.MetadataRequest request = createMetadataRequest(
+ Uri.parse("unknown"), CONTAINER, null,
+ createTokenData(null, null), null);
+ replay();
+ GadgetsHandlerApi.MetadataResponse response =
gadgetHandler.getMetadata(request);
+ }
+
+ @Test
+ public void testGetMetadataNoToken() throws Exception {
+ GadgetsHandlerApi.MetadataRequest request = createMetadataRequest(
+ FakeProcessor.SPEC_URL, CONTAINER, "view", null,
ImmutableList.of("*"));
+ replay();
+ GadgetsHandlerApi.MetadataResponse response =
gadgetHandler.getMetadata(request);
+ assertEquals(FakeIframeUriManager.DEFAULT_IFRAME_URI.toString(),
response.getIframeUrl());
+ verify();
+ }
+
+ @Test
+ public void testGetToken() throws Exception {
+ GadgetsHandlerApi.TokenRequest request = createTokenRequest(
+ FakeProcessor.SPEC_URL, CONTAINER,
+ createTokenData(OWNER, VIEWER), ImmutableList.of("*"));
+ replay();
+ tokenCodec.encodedToken = TOKEN;
+ GadgetsHandlerApi.TokenResponse response = gadgetHandler.getToken(request);
+ assertEquals(TOKEN, response.getToken());
+ assertEquals(OWNER, tokenCodec.tokenData.getOwnerId());
+ assertEquals(VIEWER, tokenCodec.tokenData.getViewerId());
+ assertEquals(CONTAINER, tokenCodec.tokenData.getContainer());
+ verify();
+ }
+
+ @Test(expected = ProcessingException.class)
+ public void testGetTokenNoContainer() throws Exception {
+ GadgetsHandlerApi.TokenRequest request = createTokenRequest(
+ FakeProcessor.SPEC_URL, null,
+ createTokenData(OWNER, VIEWER), ImmutableList.of("*"));
+ replay();
+ GadgetsHandlerApi.TokenResponse response = gadgetHandler.getToken(request);
+ }
+
+ @Test(expected = ProcessingException.class)
+ public void testGetTokenNoUrl() throws Exception {
+ GadgetsHandlerApi.TokenRequest request = createTokenRequest(
+ null, CONTAINER,
+ createTokenData(OWNER, VIEWER), ImmutableList.of("*"));
+ replay();
+ GadgetsHandlerApi.TokenResponse response = gadgetHandler.getToken(request);
+ }
+
+ @Test(expected = ProcessingException.class)
+ public void testGetTokenNoFields() throws Exception {
+ GadgetsHandlerApi.TokenRequest request = createTokenRequest(
+ FakeProcessor.SPEC_URL, CONTAINER,
+ createTokenData(OWNER, VIEWER), null);
+ replay();
+ GadgetsHandlerApi.TokenResponse response = gadgetHandler.getToken(request);
+ }
+
+ @Test(expected = SecurityTokenException.class)
+ public void testGetTokenException() throws Exception {
+ GadgetsHandlerApi.TokenRequest request = createTokenRequest(
+ FakeProcessor.SPEC_URL, CONTAINER,
+ createTokenData(OWNER, VIEWER), ImmutableList.of("*"));
+ replay();
+ tokenCodec.exc = new SecurityTokenException("bad data");
+ GadgetsHandlerApi.TokenResponse response = gadgetHandler.getToken(request);
+ }
+
+ @Test
+ public void testGetTokenNoToken() throws Exception {
+ GadgetsHandlerApi.TokenRequest request = createTokenRequest(
+ FakeProcessor.SPEC_URL, CONTAINER,
+ null, ImmutableList.of("*"));
+ replay();
+ tokenCodec.encodedToken = TOKEN;
+ GadgetsHandlerApi.TokenResponse response = gadgetHandler.getToken(request);
+ assertEquals(TOKEN, response.getToken());
+ assertNull(CONTAINER, tokenCodec.tokenData);
+ verify();
+ }
+
+ private GadgetsHandlerApi.TokenData createTokenData(String ownerId, String
viewerId) {
+ GadgetsHandlerApi.TokenData token =
mock(GadgetsHandlerApi.TokenData.class);
+ if (ownerId != null) {
+ EasyMock.expect(token.getOwnerId()).andReturn(ownerId).once();
+ }
+ if (viewerId != null) {
+ EasyMock.expect(token.getViewerId()).andReturn(viewerId).once();
+ }
+ return token;
+ }
+
+ private GadgetsHandlerApi.MetadataRequest createMetadataRequest(Uri url,
String container,
+ String view, GadgetsHandlerApi.TokenData token, List<String> fields) {
+ GadgetsHandlerApi.MetadataRequest request =
mock(GadgetsHandlerApi.MetadataRequest.class);
+ EasyMock.expect(request.getFields()).andReturn(fields).anyTimes();
+ EasyMock.expect(request.getView()).andReturn(view).once();
+ EasyMock.expect(request.getUrl()).andReturn(url).anyTimes();
+ EasyMock.expect(request.getContainer()).andReturn(container).anyTimes();
+ EasyMock.expect(request.getToken()).andReturn(token).once();
+ return request;
+ }
+
+ private GadgetsHandlerApi.TokenRequest createTokenRequest(Uri url, String
container,
+ GadgetsHandlerApi.TokenData token, List<String> fields) {
+ GadgetsHandlerApi.TokenRequest request =
mock(GadgetsHandlerApi.TokenRequest.class);
+ EasyMock.expect(request.getFields()).andReturn(fields).anyTimes();
+ EasyMock.expect(request.getUrl()).andReturn(url).anyTimes();
+ EasyMock.expect(request.getContainer()).andReturn(container).anyTimes();
+ EasyMock.expect(request.getToken()).andReturn(token).once();
+ return request;
+ }
+
+ private class FakeSecurityTokenCodec implements SecurityTokenCodec {
+ public SecurityTokenException exc = null;
+ public SecurityToken tokenData = null;
+ public String encodedToken = null;
+
+ public String encodeToken(SecurityToken token) throws
SecurityTokenException {
+ tokenData = token;
+ if (exc != null) {
+ throw exc;
+ }
+ return encodedToken;
+ }
+
+ public SecurityToken createToken(Map<String, String> tokenParameters)
+ throws SecurityTokenException {
+ if (exc != null) {
+ throw exc;
+ }
+ return tokenData;
+ }
+ }
}
+