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;
+    }
+  }
 }
+


Reply via email to