You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@shindig.apache.org by lr...@apache.org on 2009/02/02 19:39:16 UTC

svn commit: r740067 [2/2] - in /incubator/shindig/trunk/java: server/src/test/java/org/apache/shindig/server/endtoend/ social-api/src/main/java/org/apache/shindig/social/core/config/ social-api/src/main/java/org/apache/shindig/social/opensocial/service...

Modified: incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/SocialApiTestsGuiceModule.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/SocialApiTestsGuiceModule.java?rev=740067&r1=740066&r2=740067&view=diff
==============================================================================
--- incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/SocialApiTestsGuiceModule.java (original)
+++ incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/SocialApiTestsGuiceModule.java Mon Feb  2 18:39:12 2009
@@ -19,14 +19,22 @@
 package org.apache.shindig.social;
 
 import org.apache.shindig.common.servlet.ParameterFetcher;
+import org.apache.shindig.config.ContainerConfig;
+import org.apache.shindig.config.JsonContainerConfig;
 import org.apache.shindig.social.core.util.BeanJsonConverter;
 import org.apache.shindig.social.core.util.BeanXStreamConverter;
+import org.apache.shindig.social.opensocial.service.ActivityHandler;
+import org.apache.shindig.social.opensocial.service.AppDataHandler;
 import org.apache.shindig.social.opensocial.service.BeanConverter;
 import org.apache.shindig.social.opensocial.service.DataServiceServletFetcher;
+import org.apache.shindig.social.opensocial.service.PersonHandler;
 
+import com.google.common.collect.Lists;
 import com.google.inject.AbstractModule;
 import com.google.inject.name.Names;
 
+import java.util.List;
+
 /**
  * Provides social api component injection for all large tests
  */
@@ -44,7 +52,14 @@
         BeanXStreamConverter.class);
     bind(BeanConverter.class).annotatedWith(Names.named("shindig.bean.converter.json")).to(
         BeanJsonConverter.class);
-    
 
+    bind(List.class).annotatedWith(Names.named("org.apache.shindig.handlers"))
+        .toInstance(Lists.immutableList(ActivityHandler.class, AppDataHandler.class,
+            PersonHandler.class));
+
+    bind(String.class).annotatedWith(
+        Names.named("shindig.containers.default"))
+        .toInstance("res://containers/default/container.js");
+    bind(ContainerConfig.class).to(JsonContainerConfig.class);
   }
 }

Modified: incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/integration/AbstractLargeRestfulTests.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/integration/AbstractLargeRestfulTests.java?rev=740067&r1=740066&r2=740067&view=diff
==============================================================================
--- incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/integration/AbstractLargeRestfulTests.java (original)
+++ incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/dataservice/integration/AbstractLargeRestfulTests.java Mon Feb  2 18:39:12 2009
@@ -17,44 +17,37 @@
  */
 package org.apache.shindig.social.dataservice.integration;
 
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-import com.google.inject.Guice;
-import com.google.inject.Injector;
-
-import junit.framework.TestCase;
-
-import org.apache.shindig.common.testing.FakeGadgetToken;
+import org.apache.shindig.auth.AuthInfo;
 import org.apache.shindig.common.EasyMockTestCase;
+import org.apache.shindig.common.testing.FakeGadgetToken;
+import org.apache.shindig.common.testing.FakeHttpServletRequest;
 import org.apache.shindig.social.SocialApiTestsGuiceModule;
 import org.apache.shindig.social.core.util.BeanJsonConverter;
 import org.apache.shindig.social.core.util.BeanXStreamAtomConverter;
 import org.apache.shindig.social.core.util.BeanXStreamConverter;
 import org.apache.shindig.social.core.util.xstream.XStream081Configuration;
 import org.apache.shindig.social.opensocial.service.DataServiceServlet;
-import org.apache.shindig.social.opensocial.service.HandlerDispatcher;
+import org.apache.shindig.social.opensocial.service.HandlerRegistry;
 
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.google.inject.Guice;
+import com.google.inject.Injector;
 import org.easymock.EasyMock;
 import org.json.JSONObject;
 import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
 
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.PrintWriter;
-import java.util.List;
-import java.util.Map;
-import java.util.Vector;
-
-import javax.servlet.ServletInputStream;
-import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import javax.xml.stream.XMLInputFactory;
 import javax.xml.stream.XMLStreamConstants;
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamReader;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.PrintWriter;
+import java.util.List;
+import java.util.Map;
 
 public abstract class AbstractLargeRestfulTests extends EasyMockTestCase {
   protected static final String XMLSCHEMA = " xmlns=\"http://ns.opensocial.org/2008/opensocial\" \n"
@@ -62,8 +55,6 @@
     + " xsi:schemaLocation=\"http://ns.opensocial.org/2008/opensocial classpath:opensocial.xsd\" ";
   protected static final String XSDRESOURCE = "opensocial.xsd";
 
-  private HttpServletRequest req;
-
   private HttpServletResponse res;
 
   private DataServiceServlet servlet;
@@ -71,13 +62,6 @@
   private static final FakeGadgetToken FAKE_GADGET_TOKEN = new FakeGadgetToken()
       .setOwnerId("john.doe").setViewerId("john.doe");
 
-  protected HttpServletRequest getRequest() {
-    return req;
-  }
-  protected void setRequest(HttpServletRequest req) {
-    this.req = req;
-  }
-
   protected HttpServletResponse getResponse() {
     return res;
   }
@@ -100,12 +84,11 @@
 
     servlet = new DataServiceServlet();
 
-    servlet.setHandlerDispatcher(injector.getInstance(HandlerDispatcher.class));
+    servlet.setHandlerRegistry(injector.getInstance(HandlerRegistry.class));
     servlet.setBeanConverters(new BeanJsonConverter(injector),
         new BeanXStreamConverter(new XStream081Configuration(injector)),
         new BeanXStreamAtomConverter(new XStream081Configuration(injector)));
 
-    req = EasyMock.createMock(HttpServletRequest.class);
     res = EasyMock.createMock(HttpServletResponse.class);
   }
 
@@ -130,43 +113,23 @@
   protected String getResponse(String path, String method,
       Map<String, String> extraParams, String postData, String format,
       String contentType) throws Exception {
-    EasyMock.expect(req.getCharacterEncoding()).andStubReturn("UTF-8");
-    EasyMock.expect(req.getPathInfo()).andStubReturn(path);
-    EasyMock.expect(req.getMethod()).andStubReturn(method);
-    EasyMock.expect(req.getParameter("format")).andStubReturn(format);
-    EasyMock.expect(req.getParameter("X-HTTP-Method-Override")).andStubReturn(
-        method);
-
-    EasyMock.expect(req.getAttribute(EasyMock.isA(String.class))).andReturn(
-        FAKE_GADGET_TOKEN);
-
-    Vector<String> vector = new Vector<String>(extraParams.keySet());
-    EasyMock.expect(req.getParameterNames()).andStubReturn(vector.elements());
-
-    for (Map.Entry<String, String> entry : extraParams.entrySet()) {
-      if (entry.getValue() != null) {
-        EasyMock.expect(req.getParameterValues(entry.getKey())).andStubReturn(
-            new String[] { entry.getValue() });
-      } else {
-        EasyMock.expect(req.getParameterValues(entry.getKey())).andStubReturn(
-            new String[] {});
-      }
-    }
-
-    if (postData == null) {
-      postData = "";
+    FakeHttpServletRequest req = new FakeHttpServletRequest();
+    req.setCharacterEncoding("UTF-8");
+    req.setPathInfo(path);
+    req.setParameter("format",format);
+    req.setParameter("X-HTTP-Method-Override", method);
+    req.setAttribute(AuthInfo.Attribute.SECURITY_TOKEN.getId(), FAKE_GADGET_TOKEN);
+    for (Map.Entry<String,String> entry : extraParams.entrySet()) {
+      req.setParameter(entry.getKey(), entry.getValue());
     }
 
     if (!("GET").equals(method) && !("HEAD").equals(method)) {
-      final InputStream stream = new ByteArrayInputStream(postData.getBytes());
-      ServletInputStream servletStream = new ServletInputStream() {
-        @Override
-        public int read() throws IOException {
-          return stream.read();
-        }
-      };
-      EasyMock.expect(req.getInputStream()).andReturn(servletStream);
+      if (postData == null) {
+        postData = "";
+      }
+      req.setPostData(postData.getBytes());
     }
+    req.setMethod(method);
 
     ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
     PrintWriter writer = new PrintWriter(outputStream);
@@ -174,10 +137,10 @@
     res.setCharacterEncoding("UTF-8");
     res.setContentType(contentType);
 
-    EasyMock.replay(req, res);
+    EasyMock.replay(res);
     servlet.service(req, res);
-    EasyMock.verify(req, res);
-    EasyMock.reset(req, res);
+    EasyMock.verify(res);
+    EasyMock.reset(res);
 
     writer.flush();
     return outputStream.toString();

Modified: incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/opensocial/service/ActivityHandlerTest.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/opensocial/service/ActivityHandlerTest.java?rev=740067&r1=740066&r2=740067&view=diff
==============================================================================
--- incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/opensocial/service/ActivityHandlerTest.java (original)
+++ incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/opensocial/service/ActivityHandlerTest.java Mon Feb  2 18:39:12 2009
@@ -17,12 +17,10 @@
  */
 package org.apache.shindig.social.opensocial.service;
 
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Sets;
-
+import org.apache.shindig.common.EasyMockTestCase;
 import org.apache.shindig.common.testing.FakeGadgetToken;
 import org.apache.shindig.common.util.ImmediateFuture;
-import org.apache.shindig.common.EasyMockTestCase;
+import org.apache.shindig.config.ContainerConfig;
 import org.apache.shindig.social.core.model.ActivityImpl;
 import org.apache.shindig.social.core.util.BeanJsonConverter;
 import org.apache.shindig.social.opensocial.model.Activity;
@@ -32,10 +30,19 @@
 import org.apache.shindig.social.opensocial.spi.RestfulCollection;
 import org.apache.shindig.social.opensocial.spi.SocialSpiException;
 import org.apache.shindig.social.opensocial.spi.UserId;
-import org.easymock.classextension.EasyMock;
 
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.google.common.collect.Sets;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.classextension.EasyMock.eq;
+import static org.easymock.classextension.EasyMock.isNull;
+
+import java.io.StringReader;
 import java.util.List;
 import java.util.Set;
+import java.util.concurrent.Future;
 
 public class ActivityHandlerTest extends EasyMockTestCase {
 
@@ -47,53 +54,41 @@
 
   private FakeGadgetToken token;
 
-  private RestfulRequestItem request;
-
   private static final Set<UserId> JOHN_DOE = Sets
       .newHashSet(new UserId(UserId.Type.userId, "john.doe"));
 
+  protected HandlerRegistry registry;
+  protected ContainerConfig containerConfig;
+
   @Override
   protected void setUp() throws Exception {
     super.setUp();
     token = new FakeGadgetToken();
     token.setAppId("appId");
-    converter = EasyMock.createMock(BeanJsonConverter.class);
-    activityService = EasyMock.createMock(ActivityService.class);
-    handler = new ActivityHandler(activityService);
-  }
 
-  @Override
-  protected void replay() {
-    EasyMock.replay(converter);
-    EasyMock.replay(activityService);
-  }
-
-  @Override
-  protected void verify() {
-    EasyMock.verify(converter);
-    EasyMock.verify(activityService);
-  }
-
-  private void setPath(String path) {
-    this.setPathAndPostData(path, null);
-  }
-
-  private void setPathAndPostData(String path, String postData) {
-    request = new RestfulRequestItem(path, "GET", postData, token, converter);
+    converter = mock(BeanJsonConverter.class);
+    activityService = mock(ActivityService.class);
+    containerConfig = mock(ContainerConfig.class);
+    handler = new ActivityHandler(activityService, containerConfig);
+    registry = new DefaultHandlerRegistry(null, Lists.newArrayList(handler));
   }
 
   private void assertHandleGetForGroup(GroupId.Type group) throws Exception {
-    setPath("/activities/john.doe/@" + group.toString());
+    String path = "/activities/john.doe/@" + group.toString();
+    RestHandler operation = registry.getRestHandler(path, "GET");
 
     List<Activity> activityList = ImmutableList.of();
     RestfulCollection<Activity> data = new RestfulCollection<Activity>(activityList);
-    org.easymock.EasyMock.expect(activityService.getActivities(JOHN_DOE,
-       new GroupId(group, null), null, Sets.<String>newHashSet(), new CollectionOptions(request), token)).andReturn(
-        ImmediateFuture.newInstance(data));
+    org.easymock.EasyMock.expect(activityService.getActivities(eq(JOHN_DOE),
+       eq(new GroupId(group, null)), (String)isNull(), eq(Sets.<String>newHashSet()),
+        org.easymock.EasyMock.isA(CollectionOptions.class), eq(token))).
+        andReturn(ImmediateFuture.newInstance(data));
 
     replay();
-    assertEquals(data, handler.handleGet(request).get());
+    assertEquals(data, operation.execute(path, Maps.<String, String[]>newHashMap(),
+        null, token, converter).get());
     verify();
+    reset();
   }
 
   public void testHandleGetAll() throws Exception {
@@ -109,70 +104,102 @@
   }
 
   public void testHandleGetPlural() throws Exception {
-    setPath("/activities/john.doe,jane.doe/@self/@app");
+    String path = "/activities/john.doe,jane.doe/@self/@app";
+    RestHandler operation = registry.getRestHandler(path, "GET");
 
     List<Activity> activities = ImmutableList.of();
     RestfulCollection<Activity> data = new RestfulCollection<Activity>(activities);
     Set<UserId> userIdSet = Sets.newLinkedHashSet(JOHN_DOE);
     userIdSet.add(new UserId(UserId.Type.userId, "jane.doe"));
-    org.easymock.EasyMock.expect(activityService.getActivities(userIdSet,
-        new GroupId(GroupId.Type.self, null), "appId", Sets.<String>newHashSet(), new CollectionOptions(request), token)).andReturn(
+    org.easymock.EasyMock.expect(activityService.getActivities(eq(userIdSet),
+        eq(new GroupId(GroupId.Type.self, null)), eq("appId"),eq(Sets.<String>newHashSet()),
+        org.easymock.EasyMock.isA((CollectionOptions.class)), eq(token))).andReturn(
           ImmediateFuture.newInstance(data));
 
     replay();
-    assertEquals(data, handler.handleGet(request).get());
+    assertEquals(data, operation.execute(path, Maps.<String, String[]>newHashMap(),
+        null, token, converter).get());
     verify();
+    reset();
   }
 
   public void testHandleGetActivityById() throws Exception {
-    setPath("/people/john.doe/@friends/@app/1");
+    String path = "/activities/john.doe/@friends/@app/1";
+    RestHandler operation = registry.getRestHandler(path, "GET");
 
     Activity activity = new ActivityImpl();
-    org.easymock.EasyMock.expect(activityService.getActivity(JOHN_DOE.iterator().next(),
-        new GroupId(GroupId.Type.friends, null),
-        "appId", Sets.<String>newHashSet(), "1", token)).andReturn(
+    org.easymock.EasyMock.expect(activityService.getActivity(eq(JOHN_DOE.iterator().next()),
+        eq(new GroupId(GroupId.Type.friends, null)),
+        eq("appId"), eq(Sets.<String>newHashSet()), eq("1"), eq(token))).andReturn(
         ImmediateFuture.newInstance(activity));
 
     replay();
-    assertEquals(activity, handler.handleGet(request).get());
+    assertEquals(activity, operation.execute(path, Maps.<String, String[]>newHashMap(),
+        null, token, converter).get());
     verify();
+    reset();
   }
 
-  private void setupPostData() throws SocialSpiException {
+  private Future setupBodyRequest(String method) throws SocialSpiException {
     String jsonActivity = "{title: hi mom!, etc etc}";
 
-    setPathAndPostData("/people/john.doe/@self/@app", jsonActivity);
+    String path = "/activities/john.doe/@self/@app";
+    RestHandler operation = registry.getRestHandler(path, method);
 
     Activity activity = new ActivityImpl();
-    org.easymock.EasyMock.expect(converter.convertToObject(jsonActivity, Activity.class)).andReturn(activity);
+    org.easymock.EasyMock.expect(converter.convertToObject(eq(jsonActivity), eq(Activity.class)))
+        .andReturn(activity);
 
-    org.easymock.EasyMock.expect(activityService.createActivity(JOHN_DOE.iterator().next(),
-        new GroupId(GroupId.Type.self, null), "appId", Sets.<String>newHashSet(),
-        activity, token)).andReturn(ImmediateFuture.newInstance((Void) null));
+    org.easymock.EasyMock.expect(activityService.createActivity(eq(JOHN_DOE.iterator().next()),
+        eq(new GroupId(GroupId.Type.self, null)), eq("appId"), eq(Sets.<String>newHashSet()),
+        eq(activity), eq(token))).andReturn(ImmediateFuture.newInstance((Void) null));
     replay();
+
+    return operation.execute(path, Maps.<String, String[]>newHashMap(),
+        new StringReader(jsonActivity), token, converter);
   }
 
   public void testHandlePost() throws Exception {
-    setupPostData();
-    assertNull(handler.handlePost(request).get());
+    Future future = setupBodyRequest("POST");
+    assertNull(future.get());
     verify();
+    reset();
   }
 
   public void testHandlePut() throws Exception {
-    setupPostData();
-    assertNull(handler.handlePut(request).get());
+    Future future = setupBodyRequest("PUT");
+    assertNull(future.get());
     verify();
+    reset();
   }
 
   public void testHandleDelete() throws Exception {
-    setPath("/people/john.doe/@self/@app/1");
+    String path = "/activities/john.doe/@self/@app/1";
+    RestHandler operation = registry.getRestHandler(path, "DELETE");
+
+
+    org.easymock.EasyMock.expect(activityService.deleteActivities(eq(JOHN_DOE.iterator().next()),
+        eq(new GroupId(GroupId.Type.self, null)), eq("appId"), eq(Sets.newHashSet("1")),
+        eq(token))).andReturn(ImmediateFuture.newInstance((Void) null));
+
+    replay();
+    assertNull(operation.execute(path, Maps.<String, String[]>newHashMap(), null,
+        token, converter).get());
+    verify();
+    reset();
+  }
+
+  public void testHandleGetSuportedFields() throws Exception {
+    String path = "/activities/@supportedFields";
+    RestHandler operation = registry.getRestHandler(path, "GET");
 
-    org.easymock.EasyMock.expect(activityService.deleteActivities(JOHN_DOE.iterator().next(),
-        new GroupId(GroupId.Type.self, null), "appId", Sets.newHashSet("1"), token)).andReturn(
-        ImmediateFuture.newInstance((Void) null));
+    List<Object> list = ImmutableList.<Object>of("id", "title");
+    expect(containerConfig.getList(eq("default"),
+        eq("${gadgets\\.features.opensocial-0\\.8.supportedFields.activity}"))).andReturn(list);
 
     replay();
-    assertNull(handler.handleDelete(request).get());
+    assertEquals(list, operation.execute(path, Maps.<String, String[]>newHashMap(), null,
+        token, converter).get());
     verify();
   }
 }

Modified: incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/opensocial/service/AppDataHandlerTest.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/opensocial/service/AppDataHandlerTest.java?rev=740067&r1=740066&r2=740067&view=diff
==============================================================================
--- incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/opensocial/service/AppDataHandlerTest.java (original)
+++ incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/opensocial/service/AppDataHandlerTest.java Mon Feb  2 18:39:12 2009
@@ -17,24 +17,30 @@
  */
 package org.apache.shindig.social.opensocial.service;
 
-import com.google.common.collect.Maps;
-import com.google.common.collect.Sets;
-
+import org.apache.shindig.common.EasyMockTestCase;
 import org.apache.shindig.common.testing.FakeGadgetToken;
 import org.apache.shindig.common.util.ImmediateFuture;
-import org.apache.shindig.common.EasyMockTestCase;
+import org.apache.shindig.social.ResponseError;
 import org.apache.shindig.social.core.util.BeanJsonConverter;
 import org.apache.shindig.social.opensocial.spi.AppDataService;
 import org.apache.shindig.social.opensocial.spi.DataCollection;
 import org.apache.shindig.social.opensocial.spi.GroupId;
 import org.apache.shindig.social.opensocial.spi.SocialSpiException;
 import org.apache.shindig.social.opensocial.spi.UserId;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.google.common.collect.Sets;
 import org.easymock.classextension.EasyMock;
+import static org.easymock.classextension.EasyMock.eq;
 
+import java.io.StringReader;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Set;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
 
 public class AppDataHandlerTest extends EasyMockTestCase {
 
@@ -42,11 +48,9 @@
 
   private AppDataService appDataService;
 
-  private AppDataHandler handler;
-
   private FakeGadgetToken token;
 
-  private RestfulRequestItem request;
+  protected HandlerRegistry registry;
 
 
   private static final Set<UserId> JOHN_DOE = Collections.unmodifiableSet(Sets
@@ -57,50 +61,25 @@
   protected void setUp() throws Exception {
     super.setUp();
     token = new FakeGadgetToken();
-    converter = EasyMock.createMock(BeanJsonConverter.class);
-    appDataService = EasyMock.createMock(AppDataService.class);
-    handler = new AppDataHandler(appDataService);
-  }
-
-  @Override
-  protected void replay() {
-    EasyMock.replay(converter);
-    EasyMock.replay(appDataService);
-  }
-
-  @Override
-  protected void verify() {
-    EasyMock.verify(converter);
-    EasyMock.verify(appDataService);
-  }
-
-  private void setPath(String path) {
-    Map<String, String> params = Maps.newHashMap();
-    params.put("fields", null);
-    this.setPathAndParams(path, params);
-  }
-
-  private void setPathAndParams(String path, Map<String, String> params) {
-    setPathAndParams(path, params, null);
-  }
-
-  private void setPathAndParams(String path, Map<String, String> params, String postData) {
-    request = new RestfulRequestItem(path, "GET", postData, token, converter);
-    for (Map.Entry<String, String> entry : params.entrySet()) {
-      request.setParameter(entry.getKey(), entry.getValue());
-    }
+    converter = mock(BeanJsonConverter.class);
+    appDataService = mock(AppDataService.class);
+    AppDataHandler handler = new AppDataHandler(appDataService);
+    registry = new DefaultHandlerRegistry(null, Lists.newArrayList(handler));
   }
 
   private void assertHandleGetForGroup(GroupId.Type group) throws Exception {
-    setPath("/activities/john.doe/@" + group.toString() + "/appId");
+    String path = "/appdata/john.doe/@" + group.toString() + "/appId";
+    RestHandler operation = registry.getRestHandler(path, "GET");
 
     DataCollection data = new DataCollection(null);
-    org.easymock.EasyMock.expect(appDataService.getPersonData(JOHN_DOE,
-        new GroupId(group, null),
-        "appId", Sets.<String>newHashSet(), token)).andReturn(ImmediateFuture.newInstance(data));
+    org.easymock.EasyMock.expect(appDataService.getPersonData(eq(JOHN_DOE),
+        eq(new GroupId(group, null)),
+        eq("appId"), eq(Sets.<String>newHashSet()), eq(token)))
+        .andReturn(ImmediateFuture.newInstance(data));
 
     replay();
-    assertEquals(data, handler.handleGet(request).get());
+    assertEquals(data, operation.execute(path, Maps.<String, String[]>newHashMap(),
+        null, token, converter).get());
     verify();
   }
 
@@ -117,61 +96,69 @@
   }
 
   public void testHandleGetPlural() throws Exception {
-    setPath("/activities/john.doe,jane.doe/@self/appId");
+    String path = "/appdata/john.doe,jane.doe/@self/appId";
+    RestHandler operation = registry.getRestHandler(path, "GET");
 
     DataCollection data = new DataCollection(null);
     Set<UserId> userIdSet = Sets.newLinkedHashSet(JOHN_DOE);
     userIdSet.add(new UserId(UserId.Type.userId, "jane.doe"));
-    org.easymock.EasyMock.expect(appDataService.getPersonData(userIdSet,
-        new GroupId(GroupId.Type.self, null),
-        "appId", Sets.<String>newHashSet(), token)).andReturn(ImmediateFuture.newInstance(data));
+    org.easymock.EasyMock.expect(appDataService.getPersonData(eq(userIdSet),
+        eq(new GroupId(GroupId.Type.self, null)),
+        eq("appId"), eq(Sets.<String>newHashSet()), eq(token)))
+        .andReturn(ImmediateFuture.newInstance(data));
 
     replay();
-    assertEquals(data, handler.handleGet(request).get());
+    assertEquals(data, operation.execute(path, Maps.<String, String[]>newHashMap(),
+        null, token, converter).get());
     verify();
   }
 
   public void testHandleGetWithoutFields() throws Exception {
-    Map<String, String> params = Maps.newHashMap();
-    params.put("fields", "pandas");
-    setPathAndParams("/appData/john.doe/@friends/appId", params);
+    String path = "/appdata/john.doe/@friends/appId";
+    RestHandler operation = registry.getRestHandler(path, "GET");
+
+    Map<String, String[]> params = Maps.newHashMap();
+    params.put("fields", new String[]{"pandas"});
 
     DataCollection data = new DataCollection(null);
-    org.easymock.EasyMock.expect(appDataService.getPersonData(JOHN_DOE,
-        new GroupId(GroupId.Type.friends, null),
-        "appId", Sets.newHashSet("pandas"), token)).andReturn(ImmediateFuture.newInstance(data));
+    org.easymock.EasyMock.expect(appDataService.getPersonData(eq(JOHN_DOE),
+        eq(new GroupId(GroupId.Type.friends, null)),
+        eq("appId"), eq(Sets.newHashSet("pandas")), eq(token)))
+        .andReturn(ImmediateFuture.newInstance(data));
 
     replay();
-    assertEquals(data, handler.handleGet(request).get());
+    assertEquals(data, operation.execute(path, params, null, token, converter).get());
     verify();
   }
 
-  private void setupPostData() throws SocialSpiException {
+  private Future setupPostData(String method) throws SocialSpiException {
+    String path = "/appdata/john.doe/@self/appId";
+    RestHandler operation = registry.getRestHandler(path, method);
+
     String jsonAppData = "{pandas: 'are fuzzy'}";
 
-    Map<String, String> params = Maps.newHashMap();
-    params.put("fields", "pandas");
-    setPathAndParams("/appData/john.doe/@self/appId", params, jsonAppData);
+    Map<String, String[]> params = Maps.newHashMap();
+    params.put("fields", new String[]{"pandas"});
 
     HashMap<String, String> values = Maps.newHashMap();
-    org.easymock.EasyMock.expect(converter.convertToObject(jsonAppData, HashMap.class)).andReturn(values);
+    org.easymock.EasyMock.expect(converter.convertToObject(eq(jsonAppData), eq(HashMap.class)))
+        .andReturn(values);
 
-    org.easymock.EasyMock.expect(appDataService.updatePersonData(JOHN_DOE.iterator().next(),
-        new GroupId(GroupId.Type.self, null),
-        "appId", Sets.newHashSet("pandas"), values, token))
+    org.easymock.EasyMock.expect(appDataService.updatePersonData(eq(JOHN_DOE.iterator().next()),
+        eq(new GroupId(GroupId.Type.self, null)),
+        eq("appId"), eq(Sets.newHashSet("pandas")), eq(values), eq(token)))
         .andReturn(ImmediateFuture.newInstance((Void) null));
     replay();
+    return operation.execute(path, params, new StringReader(jsonAppData), token, converter);
   }
 
   public void testHandlePost() throws Exception {
-    setupPostData();
-    assertNull(handler.handlePost(request).get());
+    assertNull(setupPostData("POST").get());
     verify();
   }
 
   public void testHandlePut() throws Exception {
-    setupPostData();
-    assertNull(handler.handlePut(request).get());
+    assertNull(setupPostData("PUT").get());
     verify();
   }
 
@@ -180,23 +167,26 @@
    * @throws Exception if the test fails
    */
   public void testHandleNullPostDataKeys() throws Exception {
+    String path = "/appdata/john.doe/@self/appId";
+    RestHandler operation = registry.getRestHandler(path, "POST");
     String jsonAppData = "{pandas: 'are fuzzy'}";
 
-    Map<String, String> params = Maps.newHashMap();
-    params.put("fields", "pandas");
-    setPathAndParams("/appData/john.doe/@self/appId", params, jsonAppData);
+    Map<String, String[]> params = Maps.newHashMap();
+    params.put("fields", new String[]{"pandas"});
 
     HashMap<String, String> values = Maps.newHashMap();
     // create an invalid set of app data and inject
     values.put("Aokkey", "an ok key");
     values.put("", "an empty value");
-    org.easymock.EasyMock.expect(converter.convertToObject(jsonAppData, HashMap.class)).andReturn(values);
+    org.easymock.EasyMock.expect(converter.convertToObject(eq(jsonAppData), eq(HashMap.class)))
+        .andReturn(values);
 
     replay();
     try {
-      handler.handlePost(request).get();
+      operation.execute(path, params, new StringReader(jsonAppData), token, converter).get();
       fail();
-    } catch (SocialSpiException spi) {
+    } catch (ExecutionException ee) {
+      assertEquals(((SocialSpiException)ee.getCause()).getError(), ResponseError.BAD_REQUEST);
       // was expecting an Exception
     }
     verify();
@@ -206,41 +196,44 @@
    * @throws Exception if the test fails
    */
   public void testHandleInvalidPostDataKeys() throws Exception {
+    String path = "/appdata/john.doe/@self/appId";
+    RestHandler operation = registry.getRestHandler(path, "POST");
     String jsonAppData = "{pandas: 'are fuzzy'}";
 
-    Map<String, String> params = Maps.newHashMap();
-    params.put("fields", "pandas");
-    setPathAndParams("/appData/john.doe/@self/appId", params, jsonAppData);
+    Map<String, String[]> params = Maps.newHashMap();
+    params.put("fields", new String[]{"pandas"});
 
     HashMap<String, String> values = Maps.newHashMap();
     // create an invalid set of app data and inject
     values.put("Aokkey", "an ok key");
     values.put("a bad key", "a good value");
-    org.easymock.EasyMock.expect(converter.convertToObject(jsonAppData, HashMap.class)).andReturn(values);
+    org.easymock.EasyMock.expect(converter.convertToObject(eq(jsonAppData), eq(HashMap.class)))
+        .andReturn(values);
 
     replay();
     try {
-      handler.handlePost(request).get();
+      operation.execute(path, params, new StringReader(jsonAppData), token, converter).get();
       fail();
-    } catch (SocialSpiException spi) {
-      // was expecting an Exception
+    } catch (ExecutionException ee) {
+      assertEquals(((SocialSpiException)ee.getCause()).getError(), ResponseError.BAD_REQUEST);
     }
     verify();
   }
 
 
   public void testHandleDelete() throws Exception {
-    Map<String, String> params = Maps.newHashMap();
-    params.put("fields", "pandas");
-    setPathAndParams("/appData/john.doe/@self/appId", params);
-
-    EasyMock.expect(appDataService.deletePersonData(JOHN_DOE.iterator().next(),
-        new GroupId(GroupId.Type.self, null),
-        "appId", Sets.newHashSet("pandas"), token))
+    Map<String, String[]> params = Maps.newHashMap();
+    params.put("fields", new String[]{"pandas"});
+    String path = "/appdata/john.doe/@self/appId";
+    RestHandler operation = registry.getRestHandler(path, "DELETE");
+
+    EasyMock.expect(appDataService.deletePersonData(eq(JOHN_DOE.iterator().next()),
+        eq(new GroupId(GroupId.Type.self, null)),
+        eq("appId"), eq(Sets.newHashSet("pandas")), eq(token)))
         .andReturn(ImmediateFuture.newInstance((Void) null));
 
     replay();
-    assertNull(handler.handleDelete(request).get());
+    assertNull(operation.execute(path, params, null, token, converter).get());
     verify();
   }
 }

Added: incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/opensocial/service/BaseRequestItemTest.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/opensocial/service/BaseRequestItemTest.java?rev=740067&view=auto
==============================================================================
--- incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/opensocial/service/BaseRequestItemTest.java (added)
+++ incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/opensocial/service/BaseRequestItemTest.java Mon Feb  2 18:39:12 2009
@@ -0,0 +1,139 @@
+/*
+ * 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.shindig.social.opensocial.service;
+
+import org.apache.shindig.common.testing.FakeGadgetToken;
+import org.apache.shindig.social.core.util.BeanJsonConverter;
+import org.apache.shindig.social.opensocial.spi.GroupId;
+import org.apache.shindig.social.opensocial.spi.PersonService;
+import org.apache.shindig.social.opensocial.spi.UserId;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.google.common.collect.Sets;
+import com.google.inject.Guice;
+import junit.framework.TestCase;
+import org.json.JSONObject;
+
+/**
+ * Test BaseRequestItem
+ */
+public class BaseRequestItemTest extends TestCase {
+
+  private static final FakeGadgetToken FAKE_TOKEN = new FakeGadgetToken();
+
+  private static final String DEFAULT_PATH = "/people/john.doe/@self";
+  protected BaseRequestItem request;
+  protected BeanJsonConverter converter;
+
+  @Override protected void setUp() throws Exception {
+    FAKE_TOKEN.setAppId("12345");
+    FAKE_TOKEN.setOwnerId("someowner");
+    FAKE_TOKEN.setViewerId("someowner");
+    converter = new BeanJsonConverter(Guice.createInjector());
+    request = new BaseRequestItem(
+        Maps.<String,String[]>newHashMap(),
+        FAKE_TOKEN, converter);
+  }
+
+
+  public void testParseCommaSeparatedList() throws Exception {
+    request.setParameter("fields", "huey,dewey,louie");
+    assertEquals(Lists.newArrayList("huey", "dewey", "louie"), request.getListParameter("fields"));
+  }
+
+  public void testGetAppId() throws Exception {
+    request.setParameter("appId", "100");
+    assertEquals("100", request.getAppId());
+
+    request.setParameter("appId", "@app");
+    assertEquals(FAKE_TOKEN.getAppId(), request.getAppId());
+  }
+
+  public void testGetUser() throws Exception {
+    request.setParameter("userId", "@owner");
+    assertEquals(UserId.Type.owner, request.getUsers().iterator().next().getType());
+  }
+
+  public void testGetGroup() throws Exception {
+    request.setParameter("groupId", "@self");
+    assertEquals(GroupId.Type.self, request.getGroup().getType());
+  }
+
+  public void testStartIndex() throws Exception {
+    request.setParameter("startIndex", null);
+    assertEquals(RequestItem.DEFAULT_START_INDEX, request.getStartIndex());
+
+    request.setParameter("startIndex", "5");
+    assertEquals(5, request.getStartIndex());
+  }
+
+  public void testCount() throws Exception {
+    request.setParameter("count", null);
+    assertEquals(RequestItem.DEFAULT_COUNT, request.getCount());
+
+    request.setParameter("count", "5");
+    assertEquals(5, request.getCount());
+  }
+
+  public void testSortOrder() throws Exception {
+    request.setParameter("sortOrder", null);
+    assertEquals(PersonService.SortOrder.ascending, request.getSortOrder());
+
+    request.setParameter("sortOrder", "descending");
+    assertEquals(PersonService.SortOrder.descending, request.getSortOrder());
+  }
+
+  public void testFields() throws Exception {
+    request.setParameter("fields", "");
+    assertEquals(Sets.<String>newHashSet(), request.getFields());
+
+    request.setParameter("fields", "happy,sad,grumpy");
+    assertEquals(Sets.newHashSet("happy", "sad", "grumpy"), request.getFields());
+  }
+
+  public void testGetTypedParameter() throws Exception {
+    request.setParameter("anykey", "{name: 'Bob', id: '1234'}");
+    InputData input = request.getTypedParameter("anykey", InputData.class);
+    assertEquals("Bob", input.name);
+    assertEquals(1234, input.id);
+  }
+
+  public void testJSONConstructor() throws Exception {
+    request = new BaseRequestItem(new JSONObject("{" +
+            "userId:john.doe," +
+            "groupId:@self," +
+            "fields:[huey,dewey,louie]" +
+            "}"), FAKE_TOKEN, converter);
+    assertEquals(Lists.newArrayList("huey", "dewey", "louie"), request.getListParameter("fields"));
+  }
+
+  public static class InputData {
+    String name;
+    int id;
+
+    public void setName(String name) {
+      this.name = name;
+    }
+
+    public void setId(int id) {
+      this.id = id;
+    }
+  }
+}
+

Modified: incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/opensocial/service/DataServiceServletTest.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/opensocial/service/DataServiceServletTest.java?rev=740067&r1=740066&r2=740067&view=diff
==============================================================================
--- incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/opensocial/service/DataServiceServletTest.java (original)
+++ incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/opensocial/service/DataServiceServletTest.java Mon Feb  2 18:39:12 2009
@@ -17,34 +17,32 @@
  */
 package org.apache.shindig.social.opensocial.service;
 
+import org.apache.commons.lang.StringUtils;
+import org.apache.shindig.auth.AuthInfo;
 import org.apache.shindig.common.testing.FakeGadgetToken;
 import org.apache.shindig.common.testing.FakeHttpServletRequest;
-import org.apache.shindig.common.util.ImmediateFuture;
-import org.apache.shindig.common.EasyMockTestCase;
 import org.apache.shindig.social.ResponseError;
 import org.apache.shindig.social.SocialApiTestsGuiceModule;
 import org.apache.shindig.social.core.util.BeanJsonConverter;
 import org.apache.shindig.social.core.util.BeanXStreamAtomConverter;
 import org.apache.shindig.social.core.util.BeanXStreamConverter;
 import org.apache.shindig.social.core.util.xstream.XStream081Configuration;
-import org.apache.shindig.social.opensocial.spi.SocialSpiException;
 
 import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Lists;
 import com.google.inject.Guice;
 import com.google.inject.Injector;
-import com.google.inject.Provider;
-
+import junit.framework.TestCase;
+import org.easymock.IMocksControl;
 import org.easymock.classextension.EasyMock;
 
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.util.StringTokenizer;
-import java.util.concurrent.ExecutionException;
 import javax.servlet.ServletInputStream;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.PrintWriter;
 
-public class DataServiceServletTest extends EasyMockTestCase {
+public class DataServiceServletTest extends TestCase {
 
   private static final FakeGadgetToken FAKE_GADGET_TOKEN = new FakeGadgetToken()
       .setOwnerId("john.doe").setViewerId("john.doe");
@@ -52,11 +50,10 @@
   private HttpServletRequest req;
   private HttpServletResponse res;
   private DataServiceServlet servlet;
-  private PersonHandler peopleHandler;
-  private ActivityHandler activityHandler;
-  private AppDataHandler appDataHandler;
   private BeanJsonConverter jsonConverter;
 
+  private IMocksControl mockControl = EasyMock.createNiceControl();
+
   private final ServletInputStream dummyPostData = new ServletInputStream() {
     @Override public int read()  {
       return -1;
@@ -64,142 +61,100 @@
   };
 
   @Override protected void setUp() throws Exception {
-    super.setUp();
     servlet = new DataServiceServlet();
-    req = EasyMock.createMock(HttpServletRequest.class);
-    res = EasyMock.createMock(HttpServletResponse.class);
-    jsonConverter = EasyMock.createMock(BeanJsonConverter.class);
-    BeanXStreamConverter xmlConverter = EasyMock.createMock(BeanXStreamConverter.class);
-    BeanXStreamAtomConverter atomConverter = EasyMock.createMock(BeanXStreamAtomConverter.class);
-    peopleHandler = EasyMock.createMock(PersonHandler.class);
-    activityHandler = EasyMock.createMock(ActivityHandler.class);
-    appDataHandler = EasyMock.createMock(AppDataHandler.class);
-
-    EasyMock.expect(jsonConverter.getContentType()).andReturn("application/json");
-    EasyMock.expect(xmlConverter.getContentType()).andReturn("application/xml");
-    EasyMock.expect(atomConverter.getContentType()).andReturn("application/atom+xml");
-
-    HandlerDispatcher dispatcher = new StandardHandlerDispatcher(constant(peopleHandler),
-        constant(activityHandler), constant(appDataHandler));
-    servlet.setHandlerDispatcher(dispatcher);
+    req = mockControl.createMock(HttpServletRequest.class);
+    res = mockControl.createMock(HttpServletResponse.class);
+    jsonConverter = mockControl.createMock(BeanJsonConverter.class);
+    BeanXStreamConverter xmlConverter = mockControl.createMock(BeanXStreamConverter.class);
+    BeanXStreamAtomConverter atomConverter = mockControl.createMock(BeanXStreamAtomConverter.class);
+
+    EasyMock.expect(jsonConverter.getContentType()).andReturn("application/json").anyTimes();
+    EasyMock.expect(xmlConverter.getContentType()).andReturn("application/xml").anyTimes();
+    EasyMock.expect(atomConverter.getContentType()).andReturn("application/atom+xml").anyTimes();
+
+    HandlerRegistry registry = new DefaultHandlerRegistry(null,
+        Lists.newArrayList(new TestHandler()));
+
+    servlet.setHandlerRegistry(registry);
 
     servlet.setBeanConverters(jsonConverter, xmlConverter, atomConverter);
   }
 
-  // TODO: replace with Providers.of() when Guice version is upgraded
-  private static <T> Provider<T> constant(final T value) {
-    return new Provider<T>() {
-      public T get() {
-        return value;
-      }
-    };
-  }
-
-  public void testPeopleUriRecognition() throws Exception {
-    verifyHandlerWasFoundForPathInfo('/'
-        + DataServiceServlet.PEOPLE_ROUTE + "/5/@self", peopleHandler);
-  }
-
-  public void testActivitiesUriRecognition() throws Exception {
-    verifyHandlerWasFoundForPathInfo('/'
-        + DataServiceServlet.ACTIVITY_ROUTE + "/5/@self", activityHandler);
-  }
-
-  public void testAppDataUriRecognition() throws Exception {
-    verifyHandlerWasFoundForPathInfo('/'
-        + DataServiceServlet.APPDATA_ROUTE + "/5/@self", appDataHandler);
-  }
-
-  public void testMethodOverride() throws Exception {
-    String route = '/' + DataServiceServlet.APPDATA_ROUTE;
-    verifyHandlerWasFoundForPathInfo(route, appDataHandler, "POST", "GET", "GET");
-    verifyHandlerWasFoundForPathInfo(route, appDataHandler, "POST", "", "POST");
-    verifyHandlerWasFoundForPathInfo(route, appDataHandler, "POST", null, "POST");
-    verifyHandlerWasFoundForPathInfo(route, appDataHandler, "POST", "POST", "POST");
-    verifyHandlerWasFoundForPathInfo(route, appDataHandler, "GET", null, "GET");
-    verifyHandlerWasFoundForPathInfo(route, appDataHandler, "DELETE", null, "DELETE");
-    verifyHandlerWasFoundForPathInfo(route, appDataHandler, "PUT", null, "PUT");
+  public void testUriRecognition() throws Exception {
+    verifyHandlerWasFoundForPathInfo("/test/5/@self");
   }
 
-  /**
-   * Tests a data handler that returns a failed Future
-   */
-  public void testFailedRequest() throws Exception {
-    String route = '/' + DataServiceServlet.APPDATA_ROUTE;
-    setupRequest(route, "GET", null);
+  private void verifyHandlerWasFoundForPathInfo(String peoplePathInfo)
+      throws Exception {
+    String post = "POST";
+    verifyHandlerWasFoundForPathInfo(peoplePathInfo, post, post);
+  }
+
+  private void verifyHandlerWasFoundForPathInfo(String pathInfo,
+    String actualMethod, String overrideMethod) throws Exception {
+    setupRequest(pathInfo, actualMethod, overrideMethod);
+
+    String method = StringUtils.isEmpty(overrideMethod) ? actualMethod : overrideMethod;
 
-    EasyMock.expect(appDataHandler.handleItem(EasyMock.isA(RestfulRequestItem.class)));
-    EasyMock.expectLastCall().andReturn(
-        ImmediateFuture.errorInstance(new RuntimeException("FAILED")));
+    EasyMock.expect(jsonConverter.convertToString(
+        ImmutableMap.of("entry", TestHandler.REST_RESULTS.get(method))))
+        .andReturn("{ 'entry' : " + TestHandler.REST_RESULTS.get(method) + " }");
 
-    res.sendError(500, "FAILED");
+    PrintWriter writerMock = EasyMock.createMock(PrintWriter.class);
+    EasyMock.expect(res.getWriter()).andReturn(writerMock);
+    writerMock.write(TestHandler.GET_RESPONSE);
+    EasyMock.expectLastCall();
     res.setCharacterEncoding("UTF-8");
     res.setContentType("application/json");
 
-    EasyMock.replay(req, res, appDataHandler, jsonConverter);
+    mockControl.replay();
     servlet.service(req, res);
-    EasyMock.verify(req, res, appDataHandler, jsonConverter);
-    EasyMock.reset(req, res, appDataHandler, jsonConverter);
+    mockControl.verify();
+    mockControl.reset();
   }
 
-  private void verifyHandlerWasFoundForPathInfo(String peoplePathInfo, DataRequestHandler handler)
-      throws Exception {
-    String post = "POST";
-    verifyHandlerWasFoundForPathInfo(peoplePathInfo, handler, post, post, post);
+  public void testOverridePostWithGet() throws Exception {
+    String route = "/test";
+    verifyHandlerWasFoundForPathInfo(route, "POST", "GET");
   }
 
-  private void verifyHandlerWasFoundForPathInfo(String pathInfo, DataRequestHandler handler,
-      String actualMethod, String overrideMethod, String expectedMethod) throws Exception {
-    setupRequest(pathInfo, actualMethod, overrideMethod);
-
-    String jsonObject = "my lovely json";
-
-    EasyMock.expect(handler.handleItem(EasyMock.isA(RequestItem.class)));
-    EasyMock.expectLastCall().andReturn(ImmediateFuture.newInstance(jsonObject));
+  public void testOverrideGetWithPost() throws Exception {
+    String route = "/test";
+    verifyHandlerWasFoundForPathInfo(route, "GET", "POST");
+  }
 
-    EasyMock.expect(jsonConverter.convertToString(ImmutableMap.of("entry", jsonObject)))
-        .andReturn("{ 'entry' : " + jsonObject + " }");
+  /**
+   * Tests a data handler that returns a failed Future
+   */
+  public void testFailedRequest() throws Exception {
+    String route = "/test";
+    setupRequest(route, "DELETE", null);
 
-    PrintWriter writerMock = EasyMock.createMock(PrintWriter.class);
-    EasyMock.expect(res.getWriter()).andReturn(writerMock);
-    writerMock.write(jsonObject);
+    // Shouldnt these be expectations
+    res.sendError(ResponseError.BAD_REQUEST.getHttpErrorCode(), TestHandler.FAILURE_MESSAGE);
     res.setCharacterEncoding("UTF-8");
     res.setContentType("application/json");
 
-    EasyMock.replay(req, res, handler, jsonConverter);
+    mockControl.replay();
     servlet.service(req, res);
-    EasyMock.verify(req, res, handler, jsonConverter);
-    EasyMock.reset(req, res, handler, jsonConverter);
-    // ick, this resets for the next call...
-    EasyMock.expect(jsonConverter.getContentType()).andReturn("application/json");
+    mockControl.verify();
+    mockControl.reset();
   }
 
+
+
   private void setupRequest(String pathInfo, String actualMethod, String overrideMethod)
       throws IOException {
-    EasyMock.expect(req.getCharacterEncoding()).andStubReturn("UTF-8");
-    if (!("GET").equals(overrideMethod) && !("HEAD").equals(overrideMethod)) {
-      EasyMock.expect(req.getInputStream()).andStubReturn(dummyPostData);
-    }
-    EasyMock.expect(req.getPathInfo()).andStubReturn(pathInfo);
-    EasyMock.expect(req.getMethod()).andStubReturn(actualMethod);
-    EasyMock.expect(req.getParameterNames()).andStubReturn(new StringTokenizer(""));
-    EasyMock.expect(req.getParameter(RestfulRequestItem.X_HTTP_METHOD_OVERRIDE)).andReturn(
-        overrideMethod).times(2);
-    EasyMock.expect(req.getParameter(DataServiceServlet.FORMAT_PARAM)).andReturn(null);
-
-    EasyMock.expect(req.getAttribute(EasyMock.isA(String.class))).andReturn(FAKE_GADGET_TOKEN);
-  }
-
-  public void testInvalidRoute() throws Exception {
-    RestfulRequestItem requestItem = new RestfulRequestItem("/ahhh!", "GET", null,
-        FAKE_GADGET_TOKEN, jsonConverter);
-    try {
-      servlet.handleRequestItem(requestItem, new FakeHttpServletRequest()).get();
-      fail();
-    } catch (ExecutionException ee) {
-      assertTrue(ee.getCause() instanceof SocialSpiException);
-      assertEquals(ResponseError.NOT_IMPLEMENTED, ((SocialSpiException) ee.getCause()).getError());
+    FakeHttpServletRequest fakeReq = new FakeHttpServletRequest("/social/rest", pathInfo, "");
+    fakeReq.setPathInfo(pathInfo);
+    fakeReq.setParameter(DataServiceServlet.X_HTTP_METHOD_OVERRIDE, overrideMethod);
+    fakeReq.setCharacterEncoding("UTF-8");
+    if (!("GET").equals(actualMethod) && !("HEAD").equals(actualMethod)) {
+      fakeReq.setPostData("", "UTF-8");
     }
+    fakeReq.setMethod(actualMethod);
+    fakeReq.setAttribute(AuthInfo.Attribute.SECURITY_TOKEN.getId(), FAKE_GADGET_TOKEN);
+    req = fakeReq;
   }
 
   public void testGetConverterForRequest() throws Exception {

Added: incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/opensocial/service/DefaultHandlerRegistryTest.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/opensocial/service/DefaultHandlerRegistryTest.java?rev=740067&view=auto
==============================================================================
--- incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/opensocial/service/DefaultHandlerRegistryTest.java (added)
+++ incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/opensocial/service/DefaultHandlerRegistryTest.java Mon Feb  2 18:39:12 2009
@@ -0,0 +1,158 @@
+/*
+ * 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.shindig.social.opensocial.service;
+
+import org.apache.shindig.social.ResponseError;
+import org.apache.shindig.social.opensocial.spi.SocialSpiException;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.google.common.collect.Sets;
+import junit.framework.TestCase;
+import org.json.JSONObject;
+
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
+
+/**
+ * Tests BasicHandleRregistry
+ */
+public class DefaultHandlerRegistryTest extends TestCase {
+
+  private DefaultHandlerRegistry registry;
+
+  @Override
+  @SuppressWarnings("unchecked")
+  protected void setUp() throws Exception {
+    super.setUp();
+    registry = new DefaultHandlerRegistry(null,
+        Lists.newArrayList(new TestHandler()));
+  }
+
+  public void testGetHandlerRPC() throws Exception {
+    assertNotNull(registry.getRpcHandler(new JSONObject("{method : test.get}")));
+  }
+
+  public void testGetHandlerRest() throws Exception {
+    assertNotNull(registry.getRestHandler("/test/", "GET"));
+  }
+
+  public void testOverrideHandlerRPC() throws Exception {
+    assertNotNull(registry.getRpcHandler(new JSONObject("{method : test.overidden}")));
+  }
+
+  public void testOverrideHandlerRest() throws Exception {
+    assertNotNull(registry.getRestHandler("/test/overidden/method/", "GET"));
+  }
+
+  public void testGetForAliasHandler() {
+    assertNotNull(registry.getRestHandler("/test", "GET"));
+  }
+
+  public void testRpcHandler_serviceDoesntExist() throws Exception {
+    JSONObject rpc = new JSONObject("{method : makebelieve.get}");
+    RpcHandler rpcHandler = registry.getRpcHandler(rpc);
+    try {
+      Future future = rpcHandler.execute(rpc, null, null);
+      future.get();
+      fail("Expect exception for missing method");
+    } catch (ExecutionException t) {
+      assertEquals(t.getCause().getClass(), SocialSpiException.class);
+      assertEquals(((SocialSpiException) t.getCause()).getError(), ResponseError.NOT_IMPLEMENTED);
+    } catch (Throwable t) {
+      fail("Unexpected exception " + t.toString());
+    }
+  }
+
+  public void testRestHandler_serviceDoesntExist() {
+    RestHandler restHandler = registry.getRestHandler("/makebelieve", "GET");
+    try {
+      Future future = restHandler.execute("/makebelieve", Maps.<String, String[]>newHashMap(),
+          null, null, null);
+      future.get();
+      fail("Expect exception for missing method");
+    } catch (ExecutionException t) {
+      assertEquals(t.getCause().getClass(), SocialSpiException.class);
+      assertEquals(((SocialSpiException) t.getCause()).getError(), ResponseError.NOT_IMPLEMENTED);
+    } catch (Throwable t) {
+      fail("Unexpected exception " + t.toString());
+    }
+  }
+
+  public void testNonFutureDispatch() throws Exception {
+    // Test calling a handler method which does not return a future
+    RestHandler handler = registry.getRestHandler("/test", "GET");
+    Future future = handler.execute("/test", Maps.<String, String[]>newHashMap(), null, null, null);
+    assertEquals(future.get(), TestHandler.GET_RESPONSE);
+  }
+
+  public void testFutureDispatch() throws Exception {
+    // Test calling a handler method which does not return a future
+    RestHandler handler = registry.getRestHandler("/test", "POST");
+    Future future = handler.execute("/test", Maps.<String, String[]>newHashMap(), null, null, null);
+    assertEquals(future.get(), TestHandler.CREATE_RESPONSE);
+  }
+
+  public void testNonFutureException() throws Exception {
+    // Test calling a handler method which does not return a future
+    JSONObject rpc = new JSONObject("{ method : test.exception }");
+    RpcHandler handler = registry.getRpcHandler(rpc);
+    Future future = handler.execute(rpc, null, null);
+    try {
+      future.get();
+      fail("Service method did not produce NullPointerException from Future");
+    } catch (ExecutionException ee) {
+      assertEquals(ee.getCause().getClass(), NullPointerException.class);
+    }
+  }
+
+  public void testFutureException() throws Exception {
+    // Test calling a handler method which does not return a future
+    JSONObject rpc = new JSONObject("{ method : test.futureException }");
+    RpcHandler handler = registry.getRpcHandler(rpc);
+    Future future = handler.execute(rpc, null, null);
+    try {
+      future.get();
+      fail("Service method did not produce ExecutionException from Future");
+    } catch (ExecutionException ee) {
+      assertEquals(ee.getCause().getClass(), SocialSpiException.class);
+    }
+  }
+
+  public void testSupportedRpcServices() throws Exception {
+    assertEquals(registry.getSupportedRpcServices(),
+        Sets.newHashSet("test.create", "test.get", "test.overridden", "test.exception",
+            "test.futureException"));
+  }
+
+  public void testSupportedRestServices() throws Exception {
+    assertEquals(registry.getSupportedRestServices(),
+        Sets.newHashSet("GET /test", "PUT /test", "DELETE /test", "POST /test",
+            "GET /test/overridden/method"));
+  }
+
+  public void testAddNonService() {
+    try {
+      registry.addHandlers(new Object());
+      fail("Adding an invalid service object succeded");
+    } catch (IllegalStateException ise) {
+
+    }
+  }
+}

Modified: incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/opensocial/service/JsonRpcServletTest.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/opensocial/service/JsonRpcServletTest.java?rev=740067&r1=740066&r2=740067&view=diff
==============================================================================
--- incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/opensocial/service/JsonRpcServletTest.java (original)
+++ incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/opensocial/service/JsonRpcServletTest.java Mon Feb  2 18:39:12 2009
@@ -18,33 +18,30 @@
 package org.apache.shindig.social.opensocial.service;
 
 import org.apache.shindig.common.testing.FakeGadgetToken;
-import org.apache.shindig.common.util.ImmediateFuture;
-import org.apache.shindig.common.EasyMockTestCase;
 import org.apache.shindig.social.core.util.BeanJsonConverter;
 import org.apache.shindig.social.core.util.BeanXStreamAtomConverter;
 import org.apache.shindig.social.core.util.BeanXStreamConverter;
 
 import com.google.common.collect.ImmutableMap;
-
-import com.google.inject.Provider;
-
+import com.google.common.collect.Lists;
+import junit.framework.TestCase;
+import org.easymock.IMocksControl;
 import org.easymock.classextension.EasyMock;
 import org.json.JSONArray;
 import org.json.JSONObject;
 
+import javax.servlet.ServletInputStream;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.PrintWriter;
-import java.util.concurrent.Future;
-import javax.servlet.ServletInputStream;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
 
 /**
  *
  */
-public class JsonRpcServletTest extends EasyMockTestCase {
+public class JsonRpcServletTest extends TestCase {
 
   private static final FakeGadgetToken FAKE_GADGET_TOKEN = new FakeGadgetToken()
       .setOwnerId("john.doe").setViewerId("john.doe");
@@ -53,55 +50,44 @@
   private HttpServletResponse res;
   private JsonRpcServlet servlet;
 
-  private PersonHandler peopleHandler;
-  private ActivityHandler activityHandler;
-  private AppDataHandler appDataHandler;
-
   private BeanJsonConverter jsonConverter;
   private BeanXStreamConverter xmlConverter;
 
+  private IMocksControl mockControl = EasyMock.createNiceControl();
+
   @Override protected void setUp() throws Exception {
-    super.setUp();
     servlet = new JsonRpcServlet();
-    req = EasyMock.createMock(HttpServletRequest.class);
-    res = EasyMock.createMock(HttpServletResponse.class);
-    jsonConverter = EasyMock.createMock(BeanJsonConverter.class);
-    xmlConverter = EasyMock.createMock(BeanXStreamConverter.class);
-    BeanXStreamAtomConverter atomConverter = EasyMock.createMock(BeanXStreamAtomConverter.class);
-
-    peopleHandler = EasyMock.createMock(PersonHandler.class);
-    activityHandler = EasyMock.createMock(ActivityHandler.class);
-    appDataHandler = EasyMock.createMock(AppDataHandler.class);
-
-    HandlerDispatcher dispatcher = new StandardHandlerDispatcher(constant(peopleHandler),
-        constant(activityHandler), constant(appDataHandler));
-    servlet.setHandlerDispatcher(dispatcher);
+    req = mockControl.createMock(HttpServletRequest.class);
+    res = mockControl.createMock(HttpServletResponse.class);
+    jsonConverter = mockControl.createMock(BeanJsonConverter.class);
+    xmlConverter = mockControl.createMock(BeanXStreamConverter.class);
+    BeanXStreamAtomConverter atomConverter = mockControl.createMock(BeanXStreamAtomConverter.class);
 
+    HandlerRegistry registry = new DefaultHandlerRegistry(null,
+        Lists.newArrayList(new TestHandler()));
+
+    servlet.setHandlerRegistry(registry);
     servlet.setBeanConverters(jsonConverter, xmlConverter, atomConverter);
   }
 
-  // TODO: replace with Providers.of() when Guice version is upgraded
-  private static <T> Provider<T> constant(final T value) {
-    return new Provider<T>() {
-      public T get() {
-        return value;
-      }
-    };
-  }
+  public void testMethodRecognition() throws Exception {
+    setupRequest("{method:test.get,id:id,params:{userId:5,groupId:@self}}");
 
-  public void testPeopleMethodRecognition() throws Exception {
-    verifyHandlerWasFoundForMethod("{method:people.get,id:id,params:{userId:5,groupId:@self}}",
-        peopleHandler);
-  }
+    EasyMock.expect(jsonConverter.convertToJson(TestHandler.GET_RESPONSE))
+        .andReturn(new JSONObject(ImmutableMap.of("foo", "bar")));
 
-  public void testActivitiesMethodRecognition() throws Exception {
-    verifyHandlerWasFoundForMethod("{method:activities.get,id:id,params:{userId:5,groupId:@self}}",
-        activityHandler);
-  }
+    JSONObject result = new JSONObject();
+    result.put("id", "id");
+    result.put("data", ImmutableMap.of("foo", "bar"));
+    PrintWriter writerMock = mockControl.createMock(PrintWriter.class);
+    EasyMock.expect(res.getWriter()).andReturn(writerMock);
+    writerMock.write(EasyMock.eq(result.toString()));
+    EasyMock.expectLastCall();
 
-  public void testAppDataMethodRecognition() throws Exception {
-    verifyHandlerWasFoundForMethod("{method:appdata.get,id:id,params:{userId:5,groupId:@self}}",
-        appDataHandler);
+    mockControl.replay();
+    servlet.service(req, res);
+    mockControl.verify();
+    mockControl.reset();
   }
 
   public void testInvalidService() throws Exception {
@@ -109,17 +95,17 @@
     setupRequest(json);
 
     JSONObject err = new JSONObject(
-        "{id:id,error:{message:'notImplemented: The service junk is not implemented',code:501}}");
+        "{id:id,error:{message:'notImplemented: The method junk.get is not implemented',code:501}}");
 
-    PrintWriter writerMock = EasyMock.createMock(PrintWriter.class);
-    org.easymock.EasyMock.expect(res.getWriter()).andReturn(writerMock);
-    writerMock.write(org.easymock.EasyMock.eq(err.toString()));
-    org.easymock.EasyMock.expectLastCall();
+    PrintWriter writerMock = mockControl.createMock(PrintWriter.class);
+    EasyMock.expect(res.getWriter()).andReturn(writerMock);
+    writerMock.write(EasyMock.eq(err.toString()));
+    EasyMock.expectLastCall();
 
-    EasyMock.replay(req, res, jsonConverter, writerMock);
+    mockControl.replay();
     servlet.service(req, res);
-    EasyMock.verify(req, res, jsonConverter, writerMock);
-    EasyMock.reset(req, res, jsonConverter);
+    mockControl.verify();
+    mockControl.reset();
   }
 
 
@@ -128,105 +114,63 @@
    * @throws Exception on failure
    */
   public void testFailedRequest() throws Exception {
-    setupRequest("{id:id,method:appdata.get}");
-    org.easymock.EasyMock.expect(appDataHandler.handleItem(org.easymock.EasyMock.isA(RpcRequestItem.class)));
-    org.easymock.EasyMock.expectLastCall().andReturn(
-        ImmediateFuture.errorInstance(new RuntimeException("FAILED")));
+    setupRequest("{id:id,method:test.futureException}");
 
     JSONObject err = new JSONObject(
-        "{id:id,error:{message:'internalError: FAILED',code:500}}");
-
-    PrintWriter writerMock = EasyMock.createMock(PrintWriter.class);
-    org.easymock.EasyMock.expect(res.getWriter()).andReturn(writerMock);
-    writerMock.write(org.easymock.EasyMock.eq(err.toString()));
-    org.easymock.EasyMock.expectLastCall();
-
-    EasyMock.replay(req, res, appDataHandler, jsonConverter, writerMock);
-    servlet.service(req, res);
-    EasyMock.verify(req, res, appDataHandler, jsonConverter, writerMock);
-    EasyMock.reset(req, res, appDataHandler, jsonConverter);
-  }
-
-  private void verifyHandlerWasFoundForMethod(String json, DataRequestHandler handler)
-      throws Exception {
-    setupRequest(json);
-
-    String resultObject = "my lovely json";
+        "{id:id,error:{message:'badRequest: FAILURE_MESSAGE',code:400}}");
 
-    org.easymock.EasyMock.expect(handler.handleItem(org.easymock.EasyMock.isA(RequestItem.class)));
-    org.easymock.EasyMock.expectLastCall().andReturn(ImmediateFuture.newInstance(resultObject));
+    PrintWriter writerMock = mockControl.createMock(PrintWriter.class);
+    EasyMock.expect(res.getWriter()).andReturn(writerMock);
+    writerMock.write(EasyMock.eq(err.toString()));
+    EasyMock.expectLastCall();
 
-    org.easymock.EasyMock.expect(jsonConverter.convertToJson(resultObject))
-        .andReturn(new JSONObject(ImmutableMap.of("foo", "bar")));
-
-    JSONObject result = new JSONObject();
-    result.put("id", "id");
-    result.put("data", ImmutableMap.of("foo", "bar"));
-    PrintWriter writerMock = EasyMock.createMock(PrintWriter.class);
-    org.easymock.EasyMock.expect(res.getWriter()).andReturn(writerMock);
-    writerMock.write(org.easymock.EasyMock.eq(result.toString()));
-    org.easymock.EasyMock.expectLastCall();
-
-    EasyMock.replay(req, res, handler, jsonConverter, writerMock);
+    mockControl.replay();
     servlet.service(req, res);
-    EasyMock.verify(req, res, handler, jsonConverter, writerMock);
-    EasyMock.reset(req, res, handler, jsonConverter);
+    mockControl.verify();
+    mockControl.reset();
   }
 
   public void testBasicBatch() throws Exception {
     String batchJson =
-        "[{method:people.get,id:'1'},{method:activities.get,id:'2'}]";
+        "[{method:test.get,id:'1'},{method:test.get,id:'2'}]";
     setupRequest(batchJson);
 
-    String resultObject = "my lovely json";
-    Future<?> responseItemFuture = ImmediateFuture.newInstance(resultObject);
-    org.easymock.EasyMock.expect(peopleHandler.handleItem(org.easymock.EasyMock.isA(RequestItem.class)));
-    org.easymock.EasyMock.expectLastCall().andReturn(responseItemFuture);
-    org.easymock.EasyMock.expect(activityHandler.handleItem(org.easymock.EasyMock.isA(RequestItem.class)));
-    org.easymock.EasyMock.expectLastCall().andReturn(responseItemFuture);
-
-    org.easymock.EasyMock.expect(jsonConverter.convertToJson(resultObject))
+    EasyMock.expect(jsonConverter.convertToJson(TestHandler.GET_RESPONSE))
         .andStubReturn(new JSONObject(ImmutableMap.of("foo", "bar")));
 
     JSONArray result = new JSONArray("[{id:'1',data:{foo:'bar'}}," + "{id:'2',data:{foo:'bar'}}]");
-    PrintWriter writerMock = EasyMock.createMock(PrintWriter.class);
-    org.easymock.EasyMock.expect(res.getWriter()).andReturn(writerMock);
-    writerMock.write(org.easymock.EasyMock.eq(result.toString()));
-    org.easymock.EasyMock.expectLastCall();
+    PrintWriter writerMock = mockControl.createMock(PrintWriter.class);
+    EasyMock.expect(res.getWriter()).andReturn(writerMock);
+    writerMock.write(EasyMock.eq(result.toString()));
+    EasyMock.expectLastCall();
 
-    EasyMock.replay(req, res, peopleHandler, activityHandler, jsonConverter, writerMock);
+    mockControl.replay();
     servlet.service(req, res);
-    EasyMock.verify(req, res, peopleHandler, activityHandler, jsonConverter, writerMock);
-    EasyMock.reset(req, res, peopleHandler, activityHandler, jsonConverter);
+    mockControl.verify();
+    mockControl.reset();
   }
 
   public void testGetExecution() throws Exception {
-    org.easymock.EasyMock.expect(req.getParameterMap()).andStubReturn(
-        ImmutableMap.of("method", new String[]{"people.get"}, "id", new String[]{"1"}));
-    org.easymock.EasyMock.expect(req.getMethod()).andStubReturn("GET");
-    org.easymock.EasyMock.expect(req.getAttribute(org.easymock.EasyMock.isA(String.class))).andReturn(FAKE_GADGET_TOKEN);
-    org.easymock.EasyMock.expect(req.getCharacterEncoding()).andStubReturn("UTF-8");
+    EasyMock.expect(req.getParameterMap()).andStubReturn(
+        ImmutableMap.of("method", new String[]{"test.get"}, "id", new String[]{"1"}));
+    EasyMock.expect(req.getMethod()).andStubReturn("GET");
+    EasyMock.expect(req.getAttribute(EasyMock.isA(String.class))).andReturn(FAKE_GADGET_TOKEN);
+    EasyMock.expect(req.getCharacterEncoding()).andStubReturn("UTF-8");
     res.setCharacterEncoding("UTF-8");
 
-    String resultObject = "my lovely json";
-
-    Future<?> responseItemFuture = ImmediateFuture.newInstance(resultObject);
-    org.easymock.EasyMock.expect(peopleHandler.handleItem(org.easymock.EasyMock.isA(RequestItem.class)));
-    org.easymock.EasyMock.expectLastCall().andReturn(responseItemFuture);
-
-    org.easymock.EasyMock.expect(jsonConverter.convertToJson(resultObject))
+    EasyMock.expect(jsonConverter.convertToJson(TestHandler.GET_RESPONSE))
         .andReturn(new JSONObject(ImmutableMap.of("foo", "bar")));
 
     JSONObject result = new JSONObject("{id:'1',data:{foo:'bar'}}");
-    PrintWriter writerMock = EasyMock.createMock(PrintWriter.class);
-    org.easymock.EasyMock.expect(res.getWriter()).andReturn(writerMock);
-    writerMock.write(org.easymock.EasyMock.eq(result.toString()));
-    org.easymock.EasyMock.expectLastCall();
+    PrintWriter writerMock = mockControl.createMock(PrintWriter.class);
+    EasyMock.expect(res.getWriter()).andReturn(writerMock);
+    writerMock.write(EasyMock.eq(result.toString()));
+    EasyMock.expectLastCall();
 
-    EasyMock.replay(req, res, peopleHandler, activityHandler, jsonConverter, writerMock);
+    mockControl.replay();
     servlet.service(req, res);
-    EasyMock.verify(req, res, peopleHandler, activityHandler, jsonConverter, writerMock);
-    EasyMock.reset(req, res, peopleHandler, activityHandler, jsonConverter);
+    mockControl.verify();
+    mockControl.reset();
   }
 
   private void setupRequest(String json) throws IOException {
@@ -238,10 +182,10 @@
       }
     };
 
-    org.easymock.EasyMock.expect(req.getInputStream()).andStubReturn(stream);
-    org.easymock.EasyMock.expect(req.getMethod()).andStubReturn("POST");
-    org.easymock.EasyMock.expect(req.getAttribute(org.easymock.EasyMock.isA(String.class))).andReturn(FAKE_GADGET_TOKEN);
-    org.easymock.EasyMock.expect(req.getCharacterEncoding()).andStubReturn("UTF-8");
+    EasyMock.expect(req.getInputStream()).andStubReturn(stream);
+    EasyMock.expect(req.getMethod()).andStubReturn("POST");
+    EasyMock.expect(req.getAttribute(EasyMock.isA(String.class))).andReturn(FAKE_GADGET_TOKEN);
+    EasyMock.expect(req.getCharacterEncoding()).andStubReturn("UTF-8");
     res.setCharacterEncoding("UTF-8");
     res.setContentType("application/json");
   }

Modified: incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/opensocial/service/PersonHandlerTest.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/opensocial/service/PersonHandlerTest.java?rev=740067&r1=740066&r2=740067&view=diff
==============================================================================
--- incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/opensocial/service/PersonHandlerTest.java (original)
+++ incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/opensocial/service/PersonHandlerTest.java Mon Feb  2 18:39:12 2009
@@ -17,25 +17,27 @@
  */
 package org.apache.shindig.social.opensocial.service;
 
+import org.apache.shindig.common.EasyMockTestCase;
 import org.apache.shindig.common.testing.FakeGadgetToken;
 import org.apache.shindig.common.util.ImmediateFuture;
-import org.apache.shindig.common.EasyMockTestCase;
-import org.apache.shindig.social.ResponseError;
+import org.apache.shindig.config.ContainerConfig;
 import org.apache.shindig.social.core.model.PersonImpl;
+import org.apache.shindig.social.core.util.BeanJsonConverter;
 import org.apache.shindig.social.opensocial.model.Person;
 import org.apache.shindig.social.opensocial.spi.CollectionOptions;
 import org.apache.shindig.social.opensocial.spi.GroupId;
 import org.apache.shindig.social.opensocial.spi.PersonService;
 import org.apache.shindig.social.opensocial.spi.RestfulCollection;
 import org.apache.shindig.social.opensocial.spi.UserId;
-import org.apache.shindig.social.opensocial.spi.SocialSpiException;
 
 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSortedSet;
+import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
-
-import org.easymock.classextension.EasyMock;
+import static org.easymock.classextension.EasyMock.eq;
+import static org.easymock.classextension.EasyMock.expect;
 
 import java.util.List;
 import java.util.Map;
@@ -45,7 +47,8 @@
   private PersonService personService;
   private PersonHandler handler;
   private FakeGadgetToken token;
-  private RestfulRequestItem request;
+  protected HandlerRegistry registry;
+  private BeanJsonConverter converter;
 
   private static final Set<String> DEFAULT_FIELDS = Sets.newHashSet(Person.Field.ID.toString(),
       Person.Field.NAME.toString(),
@@ -55,6 +58,7 @@
       .newHashSet(new UserId(UserId.Type.userId, "john.doe"));
 
   private static CollectionOptions DEFAULT_OPTIONS = new CollectionOptions();
+  protected ContainerConfig containerConfig;
 
   static {
     DEFAULT_OPTIONS.setSortBy(PersonService.TOP_FRIENDS_SORT);
@@ -68,78 +72,59 @@
 
   @Override
   protected void setUp() throws Exception {
-    super.setUp();
     token = new FakeGadgetToken();
-    personService = EasyMock.createMock(PersonService.class);
-    handler = new PersonHandler(personService);
-  }
-
-  @Override
-  protected void replay() {
-    EasyMock.replay(personService);
-  }
-
-  @Override
-  protected void verify() {
-    EasyMock.verify(personService);
-  }
-
-  private void setPath(String path) {
-    Map<String, String> params = Maps.newHashMap();
-    params.put("sortBy", null);
-    params.put("sortOrder", null);
-    params.put("filterBy", null);
-    params.put("startIndex", null);
-    params.put("count", null);
-    params.put("fields", null);
-    this.setPathAndParams(path, params);
-  }
-
-  private void setPathAndParams(String path, Map<String, String> params) {
-    request = new RestfulRequestItem(path, "GET", null, token, null);
-    for (Map.Entry<String, String> entry : params.entrySet()) {
-      request.setParameter(entry.getKey(), entry.getValue());
-    }
+    converter = mock(BeanJsonConverter.class);
+    personService = mock(PersonService.class);
+    containerConfig = mock(ContainerConfig.class);
+    handler = new PersonHandler(personService, containerConfig);
+    registry = new DefaultHandlerRegistry(null, Lists.newArrayList(handler));
   }
 
   public void testHandleGetAllNoParams() throws Exception {
-    setPath("/people/john.doe/@all");
+    String path = "/people/john.doe/@all";
+    RestHandler operation = registry.getRestHandler(path, "GET");
 
     List<Person> personList = ImmutableList.of();
     RestfulCollection<Person> data = new RestfulCollection<Person>(personList);
 
-    EasyMock.expect(personService.getPeople(
-        JOHN_DOE,
-        new GroupId(GroupId.Type.all, null),
-        DEFAULT_OPTIONS,
-        DEFAULT_FIELDS,
-        token))
+    expect(personService.getPeople(
+        eq(JOHN_DOE),
+        eq(new GroupId(GroupId.Type.all, null)),
+        eq(DEFAULT_OPTIONS),
+        eq(DEFAULT_FIELDS),
+        eq(token)))
         .andReturn(ImmediateFuture.newInstance(data));
 
     replay();
-    assertEquals(data, handler.handleGet(request).get());
+    assertEquals(data, operation.execute(path, Maps.<String, String[]>newHashMap(), null,
+        token, converter).get());
     verify();
   }
 
   public void testHandleGetFriendsNoParams() throws Exception {
-    setPath("/people/john.doe/@friends");
+    String path = "/people/john.doe/@friends";
+    RestHandler operation = registry.getRestHandler(path, "GET");
 
     List<Person> personList = ImmutableList.of();
     RestfulCollection<Person> data = new RestfulCollection<Person>(personList);
-    EasyMock.expect(personService.getPeople(
-        JOHN_DOE,
-        new GroupId(GroupId.Type.friends, null),
-        DEFAULT_OPTIONS,
-        DEFAULT_FIELDS,
-        token))
+    expect(personService.getPeople(
+        eq(JOHN_DOE),
+        eq(new GroupId(GroupId.Type.friends, null)),
+        eq(DEFAULT_OPTIONS),
+        eq(DEFAULT_FIELDS),
+        eq(token)))
         .andReturn(ImmediateFuture.newInstance(data));
 
     replay();
-    assertEquals(data, handler.handleGet(request).get());
+    assertEquals(data, operation.execute(path, Maps.<String, String[]>newHashMap(),
+        null, token, converter).get());
     verify();
   }
 
   public void testHandleGetFriendsWithParams() throws Exception {
+    String path = "/people/john.doe/@friends";
+    RestHandler operation = registry.getRestHandler(path, "GET");
+
     CollectionOptions options = new CollectionOptions();
     options.setSortBy(Person.Field.NAME.toString());
     options.setSortOrder(PersonService.SortOrder.descending);
@@ -149,109 +134,90 @@
     options.setFirst(5);
     options.setMax(10);
 
-    Map<String, String> params = Maps.newHashMap();
-    params.put("sortBy", options.getSortBy());
-    params.put("sortOrder", options.getSortOrder().toString());
-    params.put("filterBy", options.getFilter());
-    params.put("filterOp", options.getFilterOperation().toString());
-    params.put("filterValue", options.getFilterValue());
-    params.put("startIndex", "5");
-    params.put("count", "10");
-    params.put("fields", "money,fame,fortune");
+    Map<String, String[]> params = Maps.newHashMap();
+    params.put("sortBy", new String[]{options.getSortBy()});
+    params.put("sortOrder", new String[]{options.getSortOrder().toString()});
+    params.put("filterBy", new String[]{options.getFilter()});
+    params.put("filterOp", new String[]{options.getFilterOperation().toString()});
+    params.put("filterValue", new String[]{options.getFilterValue()});
+    params.put("startIndex", new String[]{"5"});
+    params.put("count", new String[]{"10"});
+    params.put("fields", new String[]{"money,fame,fortune"});
 
-    setPathAndParams("/people/john.doe/@friends", params);
 
     List<Person> people = ImmutableList.of();
     RestfulCollection<Person> data = new RestfulCollection<Person>(people);
-    EasyMock.expect(personService.getPeople(
-        JOHN_DOE,
-        new GroupId(GroupId.Type.friends, null), options,
-        ImmutableSortedSet.of("money", "fame", "fortune"), token))
+    expect(personService.getPeople(
+        eq(JOHN_DOE),
+        eq(new GroupId(GroupId.Type.friends, null)), eq(options),
+        eq(ImmutableSortedSet.of("money", "fame", "fortune")), eq(token)))
         .andReturn(ImmediateFuture.newInstance(data));
 
     replay();
-    assertEquals(data, handler.handleGet(request).get());
+    assertEquals(data, operation.execute(path, params, null, token, converter).get());
     verify();
   }
 
   public void testHandleGetFriendById() throws Exception {
-    setPath("/people/john.doe/@friends/jane.doe");
+    String path = "/people/john.doe/@friends/jane.doe";
+    RestHandler operation = registry.getRestHandler(path, "GET");
 
     Person data = new PersonImpl();
     // TODO: We aren't passing john.doe to the service yet.
-    EasyMock.expect(personService.getPerson(new UserId(UserId.Type.userId, "jane.doe"),
-        DEFAULT_FIELDS, token)).andReturn(ImmediateFuture.newInstance(data));
+    expect(personService.getPerson(eq(new UserId(UserId.Type.userId, "jane.doe")),
+        eq(DEFAULT_FIELDS), eq(token))).andReturn(ImmediateFuture.newInstance(data));
 
     replay();
-    assertEquals(data, handler.handleGet(request).get());
+    assertEquals(data, operation.execute(path, Maps.<String, String[]>newHashMap(),
+        null, token, converter).get());
     verify();
   }
 
   public void testHandleGetSelf() throws Exception {
-    setPath("/people/john.doe/@self");
+    String path = "/people/john.doe/@self";
+    RestHandler operation = registry.getRestHandler(path, "GET");
 
     Person data = new PersonImpl();
-    EasyMock.expect(personService.getPerson(JOHN_DOE.iterator().next(),
-        DEFAULT_FIELDS, token)).andReturn(ImmediateFuture.newInstance(data));
+    expect(personService.getPerson(eq(JOHN_DOE.iterator().next()),
+        eq(DEFAULT_FIELDS), eq(token))).andReturn(ImmediateFuture.newInstance(data));
 
     replay();
-    assertEquals(data, handler.handleGet(request).get());
+    assertEquals(data, operation.execute(path, Maps.<String, String[]>newHashMap(),
+        null, token, converter).get());
     verify();
   }
 
   public void testHandleGetPlural() throws Exception {
-    setPath("/people/john.doe,jane.doe/@self");
+    String path = "/people/john.doe,jane.doe/@self";
+    RestHandler operation = registry.getRestHandler(path, "GET");
 
     List<Person> people = ImmutableList.of();
     RestfulCollection<Person> data = new RestfulCollection<Person>(people);
     Set<UserId> userIdSet = Sets.newLinkedHashSet(JOHN_DOE);
     userIdSet.add(new UserId(UserId.Type.userId, "jane.doe"));
-    EasyMock.expect(personService.getPeople(userIdSet,
-        new GroupId(GroupId.Type.self, null),
-        DEFAULT_OPTIONS,
-        DEFAULT_FIELDS,
-        token)).andReturn(ImmediateFuture.newInstance(data));
+    expect(personService.getPeople(eq(userIdSet),
+        eq(new GroupId(GroupId.Type.self, null)),
+        eq(DEFAULT_OPTIONS),
+        eq(DEFAULT_FIELDS),
+        eq(token))).andReturn(ImmediateFuture.newInstance(data));
 
     replay();
-    assertEquals(data, handler.handleGet(request).get());
+    assertEquals(data, operation.execute(path, Maps.<String, String[]>newHashMap(),
+        null, token, converter).get());
     verify();
   }
 
-  public void testHandleDelete() throws Exception {
-    replay();
-    try {
-      handler.handleDelete(request);
-      fail();
-    } catch (SocialSpiException spe) {
-      assertEquals(ResponseError.BAD_REQUEST, spe.getError());
-    }
+  public void testHandleGetSuportedFields() throws Exception {
+    String path = "/people/@supportedFields";
+    RestHandler operation = registry.getRestHandler(path, "GET");
 
-    verify();
-  }
+    List<Object> list = ImmutableList.<Object>of("id", ImmutableMap.of("name", "familyName"));
+    expect(containerConfig.getList(eq("default"),
+        eq("${gadgets\\.features.opensocial-0\\.8.supportedFields.person}"))).andReturn(list);
 
-  public void testHandlePut() throws Exception {
     replay();
-
-    try {
-      handler.handlePut(request).get();
-      fail();
-    } catch (SocialSpiException spe) {
-      assertEquals(ResponseError.NOT_IMPLEMENTED, spe.getError());
-    }
-
-    verify();
-  }
-
-  public void testHandlePost() throws Exception {
-    replay();
-
-    try {
-      handler.handlePost(request).get();
-      fail();
-    } catch (SocialSpiException spe) {
-      assertEquals(ResponseError.NOT_IMPLEMENTED, spe.getError());
-    }
-
+    assertEquals(list, operation.execute(path, Maps.<String, String[]>newHashMap(),
+        null, token, converter).get());
     verify();
   }
 }

Added: incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/opensocial/service/TestHandler.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/opensocial/service/TestHandler.java?rev=740067&view=auto
==============================================================================
--- incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/opensocial/service/TestHandler.java (added)
+++ incubator/shindig/trunk/java/social-api/src/test/java/org/apache/shindig/social/opensocial/service/TestHandler.java Mon Feb  2 18:39:12 2009
@@ -0,0 +1,96 @@
+/*
+ * 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.shindig.social.opensocial.service;
+
+import org.apache.shindig.common.util.ImmediateFuture;
+import org.apache.shindig.social.ResponseError;
+import org.apache.shindig.social.opensocial.spi.SocialSpiException;
+
+import com.google.common.collect.ImmutableMap;
+import org.junit.Ignore;
+
+import java.util.Map;
+import java.util.concurrent.Future;
+
+/**
+ * Simple test handler implementation. Can be used standalone or to wrap a mock
+ * delegate.
+ */
+@Ignore
+@Service(name = "test", path = "/{someParam}/{someOtherParam}" )
+public class TestHandler {
+
+  public static final String GET_RESPONSE = "GET_RESPONSE";
+  public static final String CREATE_RESPONSE = "CREATE_RESPONSE";
+  public static final String FAILURE_MESSAGE = "FAILURE_MESSAGE";
+
+  public static Map<String,String> REST_RESULTS = ImmutableMap.of(
+      "POST", CREATE_RESPONSE, "GET", GET_RESPONSE, "DELETE", FAILURE_MESSAGE);
+
+  private TestHandler mock;
+
+  public TestHandler() {
+  }
+
+  public void setMock(TestHandler mock) {
+    this.mock = mock;
+  }
+
+  @Operation(httpMethods = "GET")
+  public String get(RequestItem req) {
+    if (mock != null) {
+      return mock.get(req);
+    }
+    return GET_RESPONSE;
+  }
+
+  @Operation(httpMethods = "GET", path = "/overridden/method")
+  public String overridden(RequestItem req) {
+    if (mock != null) {
+      return mock.get(req);
+    }
+    return GET_RESPONSE;
+  }
+
+  @Operation(httpMethods = {"POST", "PUT"})
+  public Future<?> create(RequestItem req) {
+    if (mock != null) {
+      return mock.create(req);
+    }
+    return ImmediateFuture.newInstance(CREATE_RESPONSE);
+  }
+
+  @Operation(httpMethods = "DELETE")
+  public Future<?> futureException(RequestItem req) {
+    if (mock != null) {
+      return mock.futureException(req);
+    }
+    return ImmediateFuture.errorInstance(new SocialSpiException(ResponseError.BAD_REQUEST,
+        FAILURE_MESSAGE, new Throwable()));
+  }
+
+  @Operation(httpMethods = {})
+  public void exception(RequestItem req) {
+    if (mock != null) {
+      mock.exception(req);
+    } else {
+      throw new NullPointerException(FAILURE_MESSAGE);
+    }
+  }
+}