You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@shindig.apache.org by rb...@apache.org on 2011/10/02 21:44:15 UTC

svn commit: r1178236 [3/4] - in /shindig/trunk: config/ content/samplecontainer/examples/commoncontainer/ features/src/main/javascript/features/container.util/ features/src/main/javascript/features/container/ features/src/main/javascript/features/rpc/ ...

Modified: shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/GadgetsHandlerServiceTest.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/GadgetsHandlerServiceTest.java?rev=1178236&r1=1178235&r2=1178236&view=diff
==============================================================================
--- shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/GadgetsHandlerServiceTest.java (original)
+++ shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/GadgetsHandlerServiceTest.java Sun Oct  2 19:44:13 2011
@@ -18,13 +18,17 @@
  */
 package org.apache.shindig.gadgets.servlet;
 
-import static org.easymock.EasyMock.expect;
 import static org.easymock.EasyMock.capture;
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.eq;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.isA;
 
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Multimap;
+import java.nio.charset.Charset;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
 
 import org.apache.commons.codec.binary.Base64;
 import org.apache.shindig.auth.SecurityToken;
@@ -34,10 +38,20 @@ import org.apache.shindig.common.EasyMoc
 import org.apache.shindig.common.servlet.HttpUtil;
 import org.apache.shindig.common.uri.Uri;
 import org.apache.shindig.common.util.FakeTimeSource;
+import org.apache.shindig.gadgets.Gadget;
+import org.apache.shindig.gadgets.GadgetContext;
 import org.apache.shindig.gadgets.GadgetException;
-import org.apache.shindig.gadgets.RenderingContext;
 import org.apache.shindig.gadgets.GadgetException.Code;
+import org.apache.shindig.gadgets.RenderingContext;
+import org.apache.shindig.gadgets.admin.ContainerAdminData;
+import org.apache.shindig.gadgets.admin.FeatureAdminData;
+import org.apache.shindig.gadgets.admin.FeatureAdminData.Type;
+import org.apache.shindig.gadgets.admin.GadgetAdminData;
+import org.apache.shindig.gadgets.admin.GadgetAdminStore;
+import org.apache.shindig.gadgets.features.ApiDirective;
 import org.apache.shindig.gadgets.features.FeatureRegistry;
+import org.apache.shindig.gadgets.features.FeatureRegistry.FeatureBundle;
+import org.apache.shindig.gadgets.features.FeatureRegistryProvider;
 import org.apache.shindig.gadgets.http.HttpResponse;
 import org.apache.shindig.gadgets.http.HttpResponseBuilder;
 import org.apache.shindig.gadgets.js.JsException;
@@ -48,8 +62,8 @@ import org.apache.shindig.gadgets.js.JsS
 import org.apache.shindig.gadgets.process.ProcessingException;
 import org.apache.shindig.gadgets.servlet.GadgetsHandlerApi.Feature;
 import org.apache.shindig.gadgets.uri.JsUriManager;
-import org.apache.shindig.gadgets.uri.ProxyUriManager;
 import org.apache.shindig.gadgets.uri.JsUriManager.JsUri;
+import org.apache.shindig.gadgets.uri.ProxyUriManager;
 import org.apache.shindig.gadgets.uri.ProxyUriManager.ProxyUri;
 import org.apache.shindig.protocol.conversion.BeanDelegator;
 import org.apache.shindig.protocol.conversion.BeanFilter;
@@ -58,9 +72,11 @@ import org.easymock.EasyMock;
 import org.junit.Before;
 import org.junit.Test;
 
-import java.nio.charset.Charset;
-import java.util.List;
-import java.util.Map;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Multimap;
+import com.google.common.collect.Sets;
 
 public class GadgetsHandlerServiceTest extends EasyMockTestCase {
 
@@ -74,9 +90,11 @@ public class GadgetsHandlerServiceTest e
   private static final Long TOKEN_EXPIRY_TIME_MS = CURRENT_TIME_MS + 789L;
   private static final Uri RESOURCE = Uri.parse("http://example.com/data");
   private static final String FALLBACK = "http://example.com/data2";
+  private static final String RPC_SERVICE_1 = "rcp_service_1";
+  private static final String RPC_SERVICE_2 = "rpc_service_2";
 
-  private final BeanDelegator delegator = new BeanDelegator(
-    GadgetsHandlerService.API_CLASSES, GadgetsHandlerService.ENUM_CONVERSION_MAP);
+  private final BeanDelegator delegator = new BeanDelegator(GadgetsHandlerService.API_CLASSES,
+          GadgetsHandlerService.ENUM_CONVERSION_MAP);
 
   private final FakeTimeSource timeSource = new FakeTimeSource(CURRENT_TIME_MS);
   private final FeatureRegistry mockRegistry = mock(FeatureRegistry.class);
@@ -88,16 +106,34 @@ public class GadgetsHandlerServiceTest e
   private final CajaContentRewriter cajaContentRewriter = mock(CajaContentRewriter.class);
   private final JsServingPipeline jsPipeline = mock(JsServingPipeline.class);
   private final JsRequestBuilder jsRequestBuilder = new JsRequestBuilder(jsUriManager, null);
+  private final GadgetAdminStore gadgetAdminStore = mock(GadgetAdminStore.class);
 
   private FakeSecurityTokenCodec tokenCodec;
   private GadgetsHandlerService gadgetHandler;
+  private GadgetsHandlerService gadgetHandlerWithAdmin;
+  private FeatureRegistryProvider featureRegistryProvider;
 
   @Before
   public void setUp() {
     tokenCodec = new FakeSecurityTokenCodec();
-    gadgetHandler = new GadgetsHandlerService(timeSource, processor, urlGenerator,
-        tokenCodec, proxyUriManager, jsUriManager, proxyHandler, jsPipeline,
-        jsRequestBuilder, SPEC_REFRESH_INTERVAL_MS, new BeanFilter(), cajaContentRewriter);
+    GadgetAdminData gadgetAdminData = new GadgetAdminData(
+            new FeatureAdminData(Sets.newHashSet(FakeProcessor.FEATURE2, FakeProcessor.FEATURE3),
+                    Type.WHITELIST));
+    ContainerAdminData containerAdminData = new ContainerAdminData();
+    containerAdminData.addGadgetAdminData(FakeProcessor.SPEC_URL4.toString(), gadgetAdminData);
+    featureRegistryProvider = new FeatureRegistryProvider() {
+      public FeatureRegistry get(String repository) throws GadgetException {
+        return mockRegistry;
+      }
+    };
+    gadgetHandler = new GadgetsHandlerService(timeSource, processor, urlGenerator, tokenCodec,
+            proxyUriManager, jsUriManager, proxyHandler, jsPipeline, jsRequestBuilder,
+            SPEC_REFRESH_INTERVAL_MS, new BeanFilter(), cajaContentRewriter, gadgetAdminStore,
+            featureRegistryProvider);
+    gadgetHandlerWithAdmin = new GadgetsHandlerService(timeSource, processor, urlGenerator,
+            tokenCodec, proxyUriManager, jsUriManager, proxyHandler, jsPipeline, jsRequestBuilder,
+            SPEC_REFRESH_INTERVAL_MS, new BeanFilter(), cajaContentRewriter, gadgetAdminStore,
+            featureRegistryProvider);
   }
 
   // Next test verify that the API data classes are configured correctly.
@@ -109,41 +145,102 @@ public class GadgetsHandlerServiceTest e
     delegator.validate();
   }
 
+  private void setupMockGadgetAdminStore(boolean isAllowed) {
+    EasyMock.expect(gadgetAdminStore.checkFeatureAdminInfo(EasyMock.isA(Gadget.class)))
+    .andReturn(isAllowed).anyTimes();
+  }
+
   @SuppressWarnings("unchecked")
+  private void setupMockRegistry(List<String> features) {
+    EasyMock.expect(mockRegistry.getFeatures(EasyMock.isA(Collection.class)))
+            .andReturn(Lists.newArrayList(features)).anyTimes();
+    FeatureBundle featureBundle = createMockFeatureBundle();
+    FeatureRegistry.LookupResult lr = createMockLookupResult(ImmutableList.of(featureBundle));
+    EasyMock.expect(
+            mockRegistry.getFeatureResources(isA(GadgetContext.class),
+                    eq(Lists.newArrayList(features)), EasyMock.<List<String>> isNull()))
+            .andReturn(lr).anyTimes();
+    replay();
+  }
+
+  private FeatureBundle createMockFeatureBundle() {
+    FeatureBundle result = createMock(FeatureBundle.class);
+    expect(result.getApis(ApiDirective.Type.RPC, false)).andReturn(
+            Lists.newArrayList(RPC_SERVICE_1, RPC_SERVICE_2)).anyTimes();
+    replay(result);
+    return result;
+  }
+
+  private FeatureRegistry.LookupResult createMockLookupResult(List<FeatureBundle> featureBundles) {
+    FeatureRegistry.LookupResult result = createMock(FeatureRegistry.LookupResult.class);
+    EasyMock.expect(result.getBundles()).andReturn(featureBundles).anyTimes();
+    replay(result);
+    return result;
+  }
+
   @Test
   public void testGetMetadata() throws Exception {
-    GadgetsHandlerApi.MetadataRequest request = createMetadataRequest(
-        FakeProcessor.SPEC_URL, CONTAINER, "default",
-        createAuthContext(null, null), ImmutableList.of("*"));
-    EasyMock.expect(mockRegistry.getFeatures(EasyMock.isA(List.class)))
-        .andReturn(Lists.newArrayList("auth-refresh"));
-    replay();
-    GadgetsHandlerApi.MetadataResponse response =
-        gadgetHandler.getMetadata(request);
+    GadgetsHandlerApi.MetadataRequest request = createMetadataRequest(FakeProcessor.SPEC_URL,
+            CONTAINER, "default", createAuthContext(null, null), ImmutableList.of("*"));
+    setupMockGadgetAdminStore(true);
+    setupMockRegistry(ImmutableList.<String> of("auth-refresh"));
+    GadgetsHandlerApi.MetadataResponse response = gadgetHandler.getMetadata(request);
     assertEquals(FakeIframeUriManager.DEFAULT_IFRAME_URI.toString(), response.getIframeUrl());
     assertTrue(response.getNeedsTokenRefresh());
     assertEquals(1, response.getViews().size());
     assertEquals(FakeProcessor.SPEC_TITLE, response.getModulePrefs().getTitle());
     assertEquals(FakeProcessor.LINK_HREF,
-        response.getModulePrefs().getLinks().get(FakeProcessor.LINK_REL).getHref().toString());
+            response.getModulePrefs().getLinks().get(FakeProcessor.LINK_REL).getHref().toString());
     assertEquals(FakeProcessor.LINK_REL,
-        response.getModulePrefs().getLinks().get(FakeProcessor.LINK_REL).getRel());
+            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").getOrderedEnumValues().size());
     assertEquals(CURRENT_TIME_MS, response.getResponseTimeMs());
     assertEquals(METADATA_EXPIRY_TIME_MS, response.getExpireTimeMs());
+    assertEquals(Sets.newHashSet(RPC_SERVICE_1, RPC_SERVICE_2), response.getRpcServiceIds());
     verify();
   }
 
   @Test
+  public void testFeatureAdminAllowedGadget() throws Exception {
+    GadgetsHandlerApi.MetadataRequest request = createMetadataRequest(FakeProcessor.SPEC_URL4,
+            CONTAINER, "default", createAuthContext(null, null), ImmutableList.of("*"));
+    setupMockGadgetAdminStore(true);
+    setupMockRegistry(Lists.newArrayList("example-feature", "example-feature2"));
+
+    GadgetsHandlerApi.MetadataResponse response = gadgetHandlerWithAdmin.getMetadata(request);
+    assertEquals(FakeIframeUriManager.DEFAULT_IFRAME_URI.toString(), response.getIframeUrl());
+    assertEquals(1, response.getViews().size());
+    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").getOrderedEnumValues().size());
+    assertEquals(CURRENT_TIME_MS, response.getResponseTimeMs());
+    assertEquals(METADATA_EXPIRY_TIME_MS, response.getExpireTimeMs());
+    assertEquals(Sets.newHashSet(RPC_SERVICE_1, RPC_SERVICE_2), response.getRpcServiceIds());
+    verify();
+  }
+
+  @Test(expected = ProcessingException.class)
+  public void testFeatureAdminDeniedGadget() throws Exception {
+    GadgetsHandlerApi.MetadataRequest request = createMetadataRequest(FakeProcessor.SPEC_URL4,
+            CONTAINER, "default", createAuthContext(null, null), ImmutableList.of("*"));
+    setupMockGadgetAdminStore(false);
+    setupMockRegistry(Lists.newArrayList("example-feature", "example-feature2"));
+    gadgetHandlerWithAdmin.getMetadata(request);
+  }
+
+  @Test
   public void testGetMetadataOnlyView() throws Exception {
-    GadgetsHandlerApi.MetadataRequest request = createMetadataRequest(
-        FakeProcessor.SPEC_URL, CONTAINER, null,
-        createAuthContext(null, null), ImmutableList.of("views.*"));
-    replay();
-    GadgetsHandlerApi.MetadataResponse response =
-        gadgetHandler.getMetadata(request);
+    GadgetsHandlerApi.MetadataRequest request = createMetadataRequest(FakeProcessor.SPEC_URL,
+            CONTAINER, null, createAuthContext(null, null), ImmutableList.of("views.*"));
+    setupMockRegistry(new ArrayList<String>());
+    GadgetsHandlerApi.MetadataResponse response = gadgetHandler.getMetadata(request);
     assertNull(response.getIframeUrl());
     assertNull(response.getUserPrefs());
     assertNull(response.getModulePrefs());
@@ -154,93 +251,83 @@ public class GadgetsHandlerServiceTest e
 
   @Test(expected = ProcessingException.class)
   public void testGetMetadataNoView() throws Exception {
-    GadgetsHandlerApi.MetadataRequest request = createMetadataRequest(
-        FakeProcessor.SPEC_URL3, CONTAINER, "invalid_view",
-        createAuthContext(null, null), ImmutableList.of("*"));
+    GadgetsHandlerApi.MetadataRequest request = createMetadataRequest(FakeProcessor.SPEC_URL3,
+            CONTAINER, "invalid_view", createAuthContext(null, null), ImmutableList.of("*"));
     replay();
     gadgetHandler.getMetadata(request);
   }
 
   @Test(expected = ProcessingException.class)
   public void testGetMetadataNoContainer() throws Exception {
-    GadgetsHandlerApi.MetadataRequest request = createMetadataRequest(
-        FakeProcessor.SPEC_URL, null, null,
-        createAuthContext(null, null), ImmutableList.of("*"));
+    GadgetsHandlerApi.MetadataRequest request = createMetadataRequest(FakeProcessor.SPEC_URL, null,
+            null, createAuthContext(null, null), ImmutableList.of("*"));
     replay();
     gadgetHandler.getMetadata(request);
   }
 
   @Test(expected = ProcessingException.class)
   public void testGetMetadataNoUrl() throws Exception {
-    GadgetsHandlerApi.MetadataRequest request = createMetadataRequest(
-        null, CONTAINER, null,
-        createAuthContext(null, null), ImmutableList.of("*"));
+    GadgetsHandlerApi.MetadataRequest request = createMetadataRequest(null, CONTAINER, null,
+            createAuthContext(null, null), ImmutableList.of("*"));
     replay();
     gadgetHandler.getMetadata(request);
   }
 
   @Test(expected = ProcessingException.class)
   public void testGetMetadataNoFields() throws Exception {
-    GadgetsHandlerApi.MetadataRequest request = createMetadataRequest(
-        FakeProcessor.SPEC_URL, CONTAINER, null,
-        createAuthContext(null, null), null);
+    GadgetsHandlerApi.MetadataRequest request = createMetadataRequest(FakeProcessor.SPEC_URL,
+            CONTAINER, null, createAuthContext(null, null), null);
     replay();
     gadgetHandler.getMetadata(request);
   }
 
   @Test(expected = ProcessingException.class)
   public void testGetMetadataBadGadget() throws Exception {
-    GadgetsHandlerApi.MetadataRequest request = createMetadataRequest(
-        Uri.parse("unknown"), CONTAINER, null,
-        createAuthContext(null, null), null);
+    GadgetsHandlerApi.MetadataRequest request = createMetadataRequest(Uri.parse("unknown"),
+            CONTAINER, null, createAuthContext(null, null), null);
     replay();
     gadgetHandler.getMetadata(request);
   }
 
-  @SuppressWarnings("unchecked")
   @Test
   public void testGetMetadataNoToken() throws Exception {
-    GadgetsHandlerApi.MetadataRequest request = createMetadataRequest(
-        FakeProcessor.SPEC_URL, CONTAINER, "default", null, ImmutableList.of("*"));
-    EasyMock.expect(mockRegistry.getFeatures(EasyMock.isA(List.class)))
-        .andReturn(Lists.newArrayList("auth-refresh"));
-    replay();
+    GadgetsHandlerApi.MetadataRequest request = createMetadataRequest(FakeProcessor.SPEC_URL,
+            CONTAINER, "default", null, ImmutableList.of("*"));
+    setupMockGadgetAdminStore(true);
+    setupMockRegistry(Lists.newArrayList("auth-refresh"));
     GadgetsHandlerApi.MetadataResponse response = gadgetHandler.getMetadata(request);
     assertEquals(FakeIframeUriManager.DEFAULT_IFRAME_URI.toString(), response.getIframeUrl());
     verify();
   }
 
-  @SuppressWarnings("unchecked")
   @Test
   public void testGetMetadataWithParams() throws Exception {
-    GadgetsHandlerApi.MetadataRequest request = createMetadataRequest(
-        FakeProcessor.SPEC_URL4, CONTAINER, "default",
-        createAuthContext(null, null), ImmutableList.of("*"));
-    EasyMock.expect(mockRegistry.getFeatures(EasyMock.isA(List.class)))
-        .andReturn(Lists.newArrayList("auth-refresh"));
-    replay();
-    GadgetsHandlerApi.MetadataResponse response =
-        gadgetHandler.getMetadata(request);
-
-    Map<String, Feature> features=response.getModulePrefs().getFeatures();
-    //make sure that the feature set contains all the features, and no extra features
-    //Note that the core feature is automatically included.
-    assertTrue(features.containsKey(FakeProcessor.FEATURE1) &&
-        features.containsKey(FakeProcessor.FEATURE2) &&
-        features.containsKey(FakeProcessor.FEATURE3) &&
-        features.size()==3);
-    Multimap<String, String> params1=features.get(FakeProcessor.FEATURE2).getParams();
-    assertEquals(ImmutableList.of(FakeProcessor.PARAM_VALUE, FakeProcessor.PARAM_VALUE2), params1.get(FakeProcessor.PARAM_NAME));
-    Multimap<String, String> params2=features.get(FakeProcessor.FEATURE3).getParams();
-    assertEquals(ImmutableList.of(FakeProcessor.PARAM_VALUE3), params2.get(FakeProcessor.PARAM_NAME2));
+    GadgetsHandlerApi.MetadataRequest request = createMetadataRequest(FakeProcessor.SPEC_URL4,
+            CONTAINER, "default", createAuthContext(null, null), ImmutableList.of("*"));
+    setupMockGadgetAdminStore(true);
+    setupMockRegistry(Lists.newArrayList("auth-refresh"));
+    GadgetsHandlerApi.MetadataResponse response = gadgetHandler.getMetadata(request);
+
+    Map<String, Feature> features = response.getModulePrefs().getFeatures();
+    // make sure that the feature set contains all the features, and no extra features
+    // Note that the core feature is automatically included.
+    assertTrue(features.containsKey(FakeProcessor.FEATURE1)
+            && features.containsKey(FakeProcessor.FEATURE2)
+            && features.containsKey(FakeProcessor.FEATURE3) && features.size() == 3);
+    Multimap<String, String> params1 = features.get(FakeProcessor.FEATURE2).getParams();
+    assertEquals(ImmutableList.of(FakeProcessor.PARAM_VALUE, FakeProcessor.PARAM_VALUE2),
+            params1.get(FakeProcessor.PARAM_NAME));
+    Multimap<String, String> params2 = features.get(FakeProcessor.FEATURE3).getParams();
+    assertEquals(ImmutableList.of(FakeProcessor.PARAM_VALUE3),
+            params2.get(FakeProcessor.PARAM_NAME2));
 
     verify();
   }
+
   @Test
   public void testGetToken() throws Exception {
-    GadgetsHandlerApi.TokenRequest request = createTokenRequest(
-        FakeProcessor.SPEC_URL, CONTAINER,
-        createAuthContext(OWNER, VIEWER), ImmutableList.of("*"));
+    GadgetsHandlerApi.TokenRequest request = createTokenRequest(FakeProcessor.SPEC_URL, CONTAINER,
+            createAuthContext(OWNER, VIEWER), ImmutableList.of("*"));
     replay();
     tokenCodec.encodedToken = TOKEN;
     tokenCodec.tokenExpiryTimeMs = TOKEN_EXPIRY_TIME_MS;
@@ -256,36 +343,32 @@ public class GadgetsHandlerServiceTest e
 
   @Test(expected = ProcessingException.class)
   public void testGetTokenNoContainer() throws Exception {
-    GadgetsHandlerApi.TokenRequest request = createTokenRequest(
-        FakeProcessor.SPEC_URL, null,
-        createAuthContext(OWNER, VIEWER), ImmutableList.of("*"));
+    GadgetsHandlerApi.TokenRequest request = createTokenRequest(FakeProcessor.SPEC_URL, null,
+            createAuthContext(OWNER, VIEWER), ImmutableList.of("*"));
     replay();
     gadgetHandler.getToken(request);
   }
 
   @Test(expected = ProcessingException.class)
   public void testGetTokenNoUrl() throws Exception {
-    GadgetsHandlerApi.TokenRequest request = createTokenRequest(
-        null, CONTAINER,
-        createAuthContext(OWNER, VIEWER), ImmutableList.of("*"));
+    GadgetsHandlerApi.TokenRequest request = createTokenRequest(null, CONTAINER,
+            createAuthContext(OWNER, VIEWER), ImmutableList.of("*"));
     replay();
     gadgetHandler.getToken(request);
   }
 
   @Test(expected = ProcessingException.class)
   public void testGetTokenNoFields() throws Exception {
-    GadgetsHandlerApi.TokenRequest request = createTokenRequest(
-        FakeProcessor.SPEC_URL, CONTAINER,
-        createAuthContext(OWNER, VIEWER), null);
+    GadgetsHandlerApi.TokenRequest request = createTokenRequest(FakeProcessor.SPEC_URL, CONTAINER,
+            createAuthContext(OWNER, VIEWER), null);
     replay();
     gadgetHandler.getToken(request);
   }
 
   @Test(expected = SecurityTokenException.class)
   public void testGetTokenException() throws Exception {
-    GadgetsHandlerApi.TokenRequest request = createTokenRequest(
-        FakeProcessor.SPEC_URL, CONTAINER,
-        createAuthContext(OWNER, VIEWER), ImmutableList.of("*"));
+    GadgetsHandlerApi.TokenRequest request = createTokenRequest(FakeProcessor.SPEC_URL, CONTAINER,
+            createAuthContext(OWNER, VIEWER), ImmutableList.of("*"));
     replay();
     tokenCodec.exc = new SecurityTokenException("bad data");
     gadgetHandler.getToken(request);
@@ -293,9 +376,8 @@ public class GadgetsHandlerServiceTest e
 
   @Test
   public void testGetTokenNoToken() throws Exception {
-    GadgetsHandlerApi.TokenRequest request = createTokenRequest(
-        FakeProcessor.SPEC_URL, CONTAINER,
-        null, ImmutableList.of("*"));
+    GadgetsHandlerApi.TokenRequest request = createTokenRequest(FakeProcessor.SPEC_URL, CONTAINER,
+            null, ImmutableList.of("*"));
     replay();
     tokenCodec.encodedToken = TOKEN;
     GadgetsHandlerApi.TokenResponse response = gadgetHandler.getToken(request);
@@ -308,8 +390,8 @@ public class GadgetsHandlerServiceTest e
   public void testCreateJsResponse() throws Exception {
     Uri jsUri = Uri.parse("http://www.shindig.com/js");
     String content = "content";
-    GadgetsHandlerApi.JsResponse jsResponse =
-        gadgetHandler.createJsResponse(null, jsUri, content, ImmutableSet.of("*"), null);
+    GadgetsHandlerApi.JsResponse jsResponse = gadgetHandler.createJsResponse(null, jsUri, content,
+            ImmutableSet.of("*"), null);
     BeanDelegator.validateDelegator(jsResponse);
   }
 
@@ -318,28 +400,27 @@ public class GadgetsHandlerServiceTest e
     List<String> fields = ImmutableList.of("jsurl");
     List<String> features = ImmutableList.of("rpc");
     Uri resUri = Uri.parse("server.com/gadgets/js/rpc");
-    GadgetsHandlerApi.JsRequest request =
-        createJsRequest(null, CONTAINER, fields, features, null);
+    GadgetsHandlerApi.JsRequest request = createJsRequest(null, CONTAINER, fields, features, null);
     Capture<JsUri> uriCapture = new Capture<JsUri>();
     expect(jsUriManager.makeExternJsUri(capture(uriCapture))).andReturn(resUri);
     replay();
 
     GadgetsHandlerApi.JsResponse response = gadgetHandler.getJs(request);
-    JsUri expectedUri = new JsUri(null, false, false, CONTAINER, null,
-        features, null, null, false, false, RenderingContext.GADGET, null, null);
+    JsUri expectedUri = new JsUri(null, false, false, CONTAINER, null, features, null, null, false,
+            false, RenderingContext.GADGET, null, null);
     assertEquals(expectedUri, uriCapture.getValue());
     assertEquals(resUri, response.getJsUrl());
     assertNull(response.getJsContent());
-    assertEquals(timeSource.currentTimeMillis() + HttpUtil.getDefaultTtl() * 1000,
-        response.getExpireTimeMs().longValue());
+    assertEquals(timeSource.currentTimeMillis() + HttpUtil.getDefaultTtl() * 1000, response
+            .getExpireTimeMs().longValue());
     verify();
   }
 
   @Test(expected = ProcessingException.class)
   public void testJsNoContainer() throws Exception {
     List<String> fields = ImmutableList.of("*");
-    GadgetsHandlerApi.JsRequest request =
-        createJsRequest(null, null, fields, ImmutableList.of("rpc"), null);
+    GadgetsHandlerApi.JsRequest request = createJsRequest(null, null, fields,
+            ImmutableList.of("rpc"), null);
     gadgetHandler.getJs(request);
   }
 
@@ -353,23 +434,22 @@ public class GadgetsHandlerServiceTest e
     String onload = "do this";
     String repository = "v01";
     expect(jsUriManager.makeExternJsUri(capture(uriCapture))).andReturn(resUri);
-    expect(jsPipeline.execute(EasyMock.isA(JsRequest.class)))
-        .andReturn(new JsResponseBuilder().appendJs(jsContent, "js")
-            .setProxyCacheable(true).build());
-    GadgetsHandlerApi.JsRequest request =
-        createJsRequest(FakeProcessor.SPEC_URL.toString(), CONTAINER, fields, features, repository);
+    expect(jsPipeline.execute(EasyMock.isA(JsRequest.class))).andReturn(
+            new JsResponseBuilder().appendJs(jsContent, "js").setProxyCacheable(true).build());
+    GadgetsHandlerApi.JsRequest request = createJsRequest(FakeProcessor.SPEC_URL.toString(),
+            CONTAINER, fields, features, repository);
     expect(request.getOnload()).andStubReturn(onload);
     expect(request.getContext()).andStubReturn(GadgetsHandlerApi.RenderingContext.CONTAINER);
     replay();
 
     GadgetsHandlerApi.JsResponse response = gadgetHandler.getJs(request);
     JsUri expectedUri = new JsUri(null, false, false, CONTAINER, FakeProcessor.SPEC_URL.toString(),
-        features, null, onload, false, false, RenderingContext.CONTAINER, null, repository);
+            features, null, onload, false, false, RenderingContext.CONTAINER, null, repository);
     assertEquals(expectedUri, uriCapture.getValue());
     assertNull(response.getJsUrl());
     assertEquals(jsContent, response.getJsContent());
-    assertEquals(timeSource.currentTimeMillis() + HttpUtil.getDefaultTtl() * 1000,
-        response.getExpireTimeMs().longValue());
+    assertEquals(timeSource.currentTimeMillis() + HttpUtil.getDefaultTtl() * 1000, response
+            .getExpireTimeMs().longValue());
     verify();
   }
 
@@ -380,10 +460,10 @@ public class GadgetsHandlerServiceTest e
     Uri resUri = Uri.parse("http://server.com/gadgets/js/foo");
     Capture<JsUri> uriCapture = new Capture<JsUri>();
     expect(jsUriManager.makeExternJsUri(capture(uriCapture))).andReturn(resUri);
-    expect(jsPipeline.execute(EasyMock.isA(JsRequest.class)))
-        .andThrow(new JsException(404, "error"));
-    GadgetsHandlerApi.JsRequest request =
-        createJsRequest(FakeProcessor.SPEC_URL.toString(), CONTAINER, fields, features, null);
+    expect(jsPipeline.execute(EasyMock.isA(JsRequest.class))).andThrow(
+            new JsException(404, "error"));
+    GadgetsHandlerApi.JsRequest request = createJsRequest(FakeProcessor.SPEC_URL.toString(),
+            CONTAINER, fields, features, null);
     expect(request.getOnload()).andStubReturn("do this");
     expect(request.getContext()).andStubReturn(GadgetsHandlerApi.RenderingContext.CONTAINER);
     replay();
@@ -414,7 +494,7 @@ public class GadgetsHandlerServiceTest e
     ProxyUri pUri = gadgetHandler.createProxyUri(request);
 
     ProxyUri expectedUri = new ProxyUri(333, true, true, CONTAINER,
-        FakeProcessor.SPEC_URL.toString(), RESOURCE);
+            FakeProcessor.SPEC_URL.toString(), RESOURCE);
     expectedUri.setRewriteMimeType("image/png").setSanitizeContent(true);
     expectedUri.setResize(210, 120, 77, true).setFallbackUrl(FALLBACK);
     assertEquals(pUri, expectedUri);
@@ -423,8 +503,8 @@ public class GadgetsHandlerServiceTest e
 
   @Test
   public void testValidateProxyResponse() throws Exception {
-    GadgetsHandlerApi.ProxyResponse response =
-        gadgetHandler.createProxyResponse(RESOURCE, null, ImmutableSet.<String>of("*"), 1000001L);
+    GadgetsHandlerApi.ProxyResponse response = gadgetHandler.createProxyResponse(RESOURCE, null,
+            ImmutableSet.<String> of("*"), 1000001L);
 
     BeanDelegator.validateDelegator(response);
     assertEquals(RESOURCE, response.getProxyUrl());
@@ -439,11 +519,11 @@ public class GadgetsHandlerServiceTest e
     httpResponse.setEncoding(Charset.forName("UTF8"));
     httpResponse.setHttpStatusCode(404);
 
-    GadgetsHandlerApi.ProxyResponse response = gadgetHandler.createProxyResponse(
-        RESOURCE, httpResponse.create(), ImmutableSet.<String>of("*"), 1000001L);
+    GadgetsHandlerApi.ProxyResponse response = gadgetHandler.createProxyResponse(RESOURCE,
+            httpResponse.create(), ImmutableSet.<String> of("*"), 1000001L);
     BeanDelegator.validateDelegator(response);
     assertEquals("Content",
-        new String(Base64.decodeBase64(response.getProxyContent().getContentBase64())));
+            new String(Base64.decodeBase64(response.getProxyContent().getContentBase64())));
     assertEquals(404, response.getProxyContent().getCode());
     assertEquals(2, response.getProxyContent().getHeaders().size());
     assertEquals("Date", response.getProxyContent().getHeaders().get(0).getName());
@@ -455,8 +535,8 @@ public class GadgetsHandlerServiceTest e
   @Test
   public void testFilterProxyResponse() throws Exception {
     HttpResponse httpResponse = new HttpResponse("data");
-    GadgetsHandlerApi.ProxyResponse response = gadgetHandler.createProxyResponse(
-        RESOURCE, httpResponse, ImmutableSet.<String>of("proxyurl"), 1000001L);
+    GadgetsHandlerApi.ProxyResponse response = gadgetHandler.createProxyResponse(RESOURCE,
+            httpResponse, ImmutableSet.<String> of("proxyurl"), 1000001L);
     assertNull(response.getProxyContent());
     assertEquals(RESOURCE, response.getProxyUrl());
   }
@@ -467,8 +547,8 @@ public class GadgetsHandlerServiceTest e
     Uri resUri = Uri.parse("server.com/gadgets/proxy?url=" + RESOURCE);
     GadgetsHandlerApi.ProxyRequest request = createProxyRequest(RESOURCE, CONTAINER, fields);
     Capture<List<ProxyUri>> uriCapture = new Capture<List<ProxyUri>>();
-    expect(proxyUriManager.make(capture(uriCapture), EasyMock.anyInt()))
-        .andReturn(ImmutableList.of(resUri));
+    expect(proxyUriManager.make(capture(uriCapture), EasyMock.anyInt())).andReturn(
+            ImmutableList.of(resUri));
     replay();
     GadgetsHandlerApi.ProxyResponse response = gadgetHandler.getProxy(request);
     assertEquals(1, uriCapture.getValue().size());
@@ -476,8 +556,8 @@ public class GadgetsHandlerServiceTest e
     assertEquals(CONTAINER, pUri.getContainer());
     assertEquals(resUri, response.getProxyUrl());
     assertNull(response.getProxyContent());
-    assertEquals(timeSource.currentTimeMillis() + HttpUtil.getDefaultTtl() * 1000,
-        response.getExpireTimeMs().longValue());
+    assertEquals(timeSource.currentTimeMillis() + HttpUtil.getDefaultTtl() * 1000, response
+            .getExpireTimeMs().longValue());
     verify();
   }
 
@@ -507,8 +587,8 @@ public class GadgetsHandlerServiceTest e
     Uri resUri = Uri.parse("server.com/gadgets/proxy?url=" + RESOURCE);
     GadgetsHandlerApi.ProxyRequest request = createProxyRequest(RESOURCE, CONTAINER, fields);
     Capture<List<ProxyUri>> uriCapture = new Capture<List<ProxyUri>>();
-    expect(proxyUriManager.make(capture(uriCapture), EasyMock.anyInt()))
-        .andReturn(ImmutableList.of(resUri));
+    expect(proxyUriManager.make(capture(uriCapture), EasyMock.anyInt())).andReturn(
+            ImmutableList.of(resUri));
     HttpResponseBuilder builder = new HttpResponseBuilder();
     builder.setExpirationTime(20000).setContent("response");
     HttpResponse httpResponse = builder.create();
@@ -520,7 +600,7 @@ public class GadgetsHandlerServiceTest e
     assertEquals(CONTAINER, pUri.getContainer());
     assertNull(response.getProxyUrl());
     assertEquals("response",
-        new String(Base64.decodeBase64(response.getProxyContent().getContentBase64())));
+            new String(Base64.decodeBase64(response.getProxyContent().getContentBase64())));
     assertEquals(20000L, response.getExpireTimeMs().longValue());
     verify();
   }
@@ -531,8 +611,8 @@ public class GadgetsHandlerServiceTest e
     Uri resUri = Uri.parse("server.com/gadgets/proxy?url=" + RESOURCE);
     GadgetsHandlerApi.ProxyRequest request = createProxyRequest(RESOURCE, CONTAINER, fields);
     Capture<List<ProxyUri>> uriCapture = new Capture<List<ProxyUri>>();
-    expect(proxyUriManager.make(capture(uriCapture), EasyMock.anyInt()))
-        .andReturn(ImmutableList.of(resUri));
+    expect(proxyUriManager.make(capture(uriCapture), EasyMock.anyInt())).andReturn(
+            ImmutableList.of(resUri));
     HttpResponse httpResponse = new HttpResponseBuilder().setHttpStatusCode(504).create();
     expect(proxyHandler.fetch(EasyMock.isA(ProxyUri.class))).andReturn(httpResponse);
     replay();
@@ -552,18 +632,18 @@ public class GadgetsHandlerServiceTest e
     Uri resUri = Uri.parse("server.com/gadgets/proxy?url=" + RESOURCE);
     GadgetsHandlerApi.ProxyRequest request = createProxyRequest(RESOURCE, CONTAINER, fields);
     Capture<List<ProxyUri>> uriCapture = new Capture<List<ProxyUri>>();
-    expect(proxyUriManager.make(capture(uriCapture), EasyMock.anyInt()))
-        .andReturn(ImmutableList.of(resUri));
+    expect(proxyUriManager.make(capture(uriCapture), EasyMock.anyInt())).andReturn(
+            ImmutableList.of(resUri));
     new HttpResponse("response");
-    expect(proxyHandler.fetch(EasyMock.isA(ProxyUri.class)))
-        .andThrow(new GadgetException(Code.FAILED_TO_RETRIEVE_CONTENT));
+    expect(proxyHandler.fetch(EasyMock.isA(ProxyUri.class))).andThrow(
+            new GadgetException(Code.FAILED_TO_RETRIEVE_CONTENT));
     replay();
     gadgetHandler.getProxy(request);
   }
 
   @Test
   public void testCreateCajaResponse() throws Exception {
-    String goldenEntries[][] = {{"name1", "LINT", "msg1"}, {"name2", "LINT", "msg2"}};
+    String goldenEntries[][] = { { "name1", "LINT", "msg1" }, { "name2", "LINT", "msg2" } };
     List<GadgetsHandlerApi.Message> goldenMessages = Lists.newArrayList();
 
     for (String[] goldenEntry : goldenEntries) {
@@ -576,16 +656,15 @@ public class GadgetsHandlerServiceTest e
     replay();
 
     Uri jsUri = Uri.parse("http://www.shindig.com/js");
-    GadgetsHandlerApi.CajaResponse jsResponse =
-        gadgetHandler.createCajaResponse(jsUri, "html", "js",
-            goldenMessages, ImmutableSet.of("*"), null);
+    GadgetsHandlerApi.CajaResponse jsResponse = gadgetHandler.createCajaResponse(jsUri, "html",
+            "js", goldenMessages, ImmutableSet.of("*"), null);
     BeanDelegator.validateDelegator(jsResponse);
 
     assertEquals("html", jsResponse.getHtml());
     assertEquals("js", jsResponse.getJs());
     List<GadgetsHandlerApi.Message> response = jsResponse.getMessages();
     assertEquals(goldenMessages.size(), response.size());
-    for (int i=0; i < response.size(); i++) {
+    for (int i = 0; i < response.size(); i++) {
       assertEquals(goldenEntries[i][0], response.get(i).getName());
       assertEquals(goldenEntries[i][1], response.get(i).getLevel().name());
       assertEquals(goldenEntries[i][2], response.get(i).getMessage());
@@ -604,18 +683,19 @@ public class GadgetsHandlerServiceTest e
   }
 
   private GadgetsHandlerApi.MetadataRequest createMetadataRequest(Uri url, String container,
-      String view, GadgetsHandlerApi.AuthContext authContext, List<String> fields) {
+          String view, GadgetsHandlerApi.AuthContext authContext, 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.getAuthContext()).andReturn(authContext).once();
+
     return request;
   }
 
   private GadgetsHandlerApi.TokenRequest createTokenRequest(Uri url, String container,
-      GadgetsHandlerApi.AuthContext authContext, List<String> fields) {
+          GadgetsHandlerApi.AuthContext authContext, List<String> fields) {
     GadgetsHandlerApi.TokenRequest request = mock(GadgetsHandlerApi.TokenRequest.class);
     EasyMock.expect(request.getFields()).andReturn(fields).anyTimes();
     EasyMock.expect(request.getUrl()).andReturn(url).anyTimes();
@@ -625,7 +705,7 @@ public class GadgetsHandlerServiceTest e
   }
 
   private GadgetsHandlerApi.JsRequest createJsRequest(String gadget, String container,
-      List<String> fields, List<String> features, String repository) {
+          List<String> fields, List<String> features, String repository) {
     GadgetsHandlerApi.JsRequest request = mock(GadgetsHandlerApi.JsRequest.class);
     EasyMock.expect(request.getFields()).andStubReturn(fields);
     EasyMock.expect(request.getContainer()).andStubReturn(container);
@@ -636,7 +716,7 @@ public class GadgetsHandlerServiceTest e
   }
 
   private GadgetsHandlerApi.ProxyRequest createProxyRequest(Uri url, String container,
-      List<String> fields) {
+          List<String> fields) {
     GadgetsHandlerApi.ProxyRequest request = mock(GadgetsHandlerApi.ProxyRequest.class);
     EasyMock.expect(request.getFields()).andStubReturn(fields);
     EasyMock.expect(request.getContainer()).andStubReturn(container);
@@ -659,7 +739,7 @@ public class GadgetsHandlerServiceTest e
     }
 
     public SecurityToken createToken(Map<String, String> tokenParameters)
-        throws SecurityTokenException {
+            throws SecurityTokenException {
       if (exc != null) {
         throw exc;
       }
@@ -675,4 +755,3 @@ public class GadgetsHandlerServiceTest e
     }
   }
 }
-

Modified: shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/GadgetsHandlerTest.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/GadgetsHandlerTest.java?rev=1178236&r1=1178235&r2=1178236&view=diff
==============================================================================
--- shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/GadgetsHandlerTest.java (original)
+++ shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/GadgetsHandlerTest.java Sun Oct  2 19:44:13 2011
@@ -17,6 +17,11 @@
 
 package org.apache.shindig.gadgets.servlet;
 
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.eq;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.isA;
+
 import java.io.StringReader;
 import java.util.Collections;
 import java.util.List;
@@ -34,7 +39,15 @@ import org.apache.shindig.common.testing
 import org.apache.shindig.common.testing.ImmediateExecutorService;
 import org.apache.shindig.common.uri.Uri;
 import org.apache.shindig.common.util.FakeTimeSource;
+import org.apache.shindig.gadgets.Gadget;
+import org.apache.shindig.gadgets.GadgetContext;
+import org.apache.shindig.gadgets.GadgetException;
 import org.apache.shindig.gadgets.RenderingContext;
+import org.apache.shindig.gadgets.admin.GadgetAdminStore;
+import org.apache.shindig.gadgets.features.ApiDirective;
+import org.apache.shindig.gadgets.features.FeatureRegistry;
+import org.apache.shindig.gadgets.features.FeatureRegistry.FeatureBundle;
+import org.apache.shindig.gadgets.features.FeatureRegistryProvider;
 import org.apache.shindig.gadgets.http.HttpResponse;
 import org.apache.shindig.gadgets.js.JsException;
 import org.apache.shindig.gadgets.js.JsRequest;
@@ -45,8 +58,8 @@ import org.apache.shindig.gadgets.proces
 import org.apache.shindig.gadgets.servlet.CajaContentRewriter.CajoledResult;
 import org.apache.shindig.gadgets.spec.GadgetSpec;
 import org.apache.shindig.gadgets.uri.JsUriManager;
-import org.apache.shindig.gadgets.uri.ProxyUriManager;
 import org.apache.shindig.gadgets.uri.JsUriManager.JsUri;
+import org.apache.shindig.gadgets.uri.ProxyUriManager;
 import org.apache.shindig.gadgets.uri.ProxyUriManager.ProxyUri;
 import org.apache.shindig.protocol.DefaultHandlerRegistry;
 import org.apache.shindig.protocol.HandlerExecutionListener;
@@ -70,21 +83,25 @@ import com.google.caja.reporting.Message
 import com.google.caja.reporting.SimpleMessageQueue;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Lists;
 import com.google.inject.Guice;
 import com.google.inject.Injector;
 
 public class GadgetsHandlerTest extends EasyMockTestCase {
   private static final String GADGET1_URL = FakeProcessor.SPEC_URL.toString();
-  private static final String GADGET2_URL = FakeProcessor.SPEC_URL2 .toString();
+  private static final String GADGET2_URL = FakeProcessor.SPEC_URL2.toString();
   private static final Uri HTML_URL = Uri.parse("http://www.example.com/a.html");
   private static final Uri JS_URL = Uri.parse("http://www.example.com/a.js");
   private static final String CONTAINER = "container";
   private static final String TOKEN = "_nekot_";
   private static final Long SPEC_REFRESH_INTERVAL = 123L;
   private static final Long EXPIRY_TIME_MS = 456L;
+  private static final String RPC_SERVICE_1 = "rcp_service_1";
+  private static final String RPC_SERVICE_2 = "rpc_service_2";
 
   private final FakeTimeSource timeSource = new FakeTimeSource();
-  private final FakeProcessor processor = new FakeProcessor();
+  private final FeatureRegistry mockRegistry = mock(FeatureRegistry.class);
+  private final FakeProcessor processor = new FakeProcessor(mockRegistry);
   private final FakeIframeUriManager urlGenerator = new FakeIframeUriManager();
   private final Map<String, FormDataItem> emptyFormItems = Collections.emptyMap();
   private final ProxyUriManager proxyUriManager = mock(ProxyUriManager.class);
@@ -93,61 +110,110 @@ public class GadgetsHandlerTest extends 
   private final CajaContentRewriter cajaContentRewriter = mock(CajaContentRewriter.class);
   private final JsServingPipeline jsPipeline = mock(JsServingPipeline.class);
   private final JsRequestBuilder jsRequestBuilder = new JsRequestBuilder(jsUriManager, null);
+  private final GadgetAdminStore gadgetAdminStore = mock(GadgetAdminStore.class);
 
   private Injector injector;
   private BeanJsonConverter converter;
   private HandlerRegistry registry;
   private FakeGadgetToken authContext;
+  private FeatureRegistryProvider featureRegistryProvider;
 
   @Before
   public void setUp() throws Exception {
     injector = Guice.createInjector();
     converter = new BeanJsonConverter(injector);
     authContext = new FakeGadgetToken();
+    featureRegistryProvider = new FeatureRegistryProvider() {
+      public FeatureRegistry get(String repository) throws GadgetException {
+        return mockRegistry;
+      }
+    };
     authContext.setAppUrl("http://www.example.com/gadget.xml");
   }
 
   private void registerGadgetsHandler(SecurityTokenCodec codec) {
     BeanFilter beanFilter = new BeanFilter();
-    GadgetsHandlerService service = new GadgetsHandlerService(timeSource, processor,
-        urlGenerator, codec, proxyUriManager, jsUriManager, proxyHandler, jsPipeline,
-        jsRequestBuilder, SPEC_REFRESH_INTERVAL, beanFilter, cajaContentRewriter);
-    GadgetsHandler handler =
-        new GadgetsHandler(new ImmediateExecutorService(), service, beanFilter);
-    registry = new DefaultHandlerRegistry(
-        injector, converter, new HandlerExecutionListener.NoOpHandler());
+
+    GadgetsHandlerService service = new GadgetsHandlerService(timeSource, processor, urlGenerator,
+            codec, proxyUriManager, jsUriManager, proxyHandler, jsPipeline, jsRequestBuilder,
+            SPEC_REFRESH_INTERVAL, beanFilter, cajaContentRewriter, gadgetAdminStore,
+            featureRegistryProvider);
+    GadgetsHandler handler = new GadgetsHandler(new ImmediateExecutorService(), service, beanFilter);
+    registry = new DefaultHandlerRegistry(injector, converter,
+            new HandlerExecutionListener.NoOpHandler());
     registry.addHandlers(ImmutableSet.<Object> of(handler));
   }
 
-  private JSONObject makeMetadataRequest(String lang, String country, String... uris)
-      throws JSONException {
-    JSONObject req =
-        new JSONObject().put("method", "gadgets.metadata").put("id", "req1").put("params",
-            new JSONObject().put("ids", ImmutableList.copyOf(uris)).put("container", CONTAINER));
-    if (lang != null) req.put("language", lang);
-    if (country != null) req.put("country", country);
+  private JSONObject makeMetadataRequest(String lang, String country, String[] fields,
+          String... uris) throws JSONException {
+    JSONObject req = new JSONObject()
+            .put("method", "gadgets.metadata")
+            .put("id", "req1")
+            .put("params",
+                    new JSONObject().put("ids", ImmutableList.copyOf(uris)).put("container",
+                            CONTAINER));
+    if (lang != null)
+      req.put("language", lang);
+    if (country != null)
+      req.put("country", country);
+    if (fields != null)
+      req.getJSONObject("params").put("fields", new JSONArray(fields));
     return req;
   }
 
-  private JSONObject makeMetadataNoContainerRequest(String... uris)
-      throws JSONException {
-    JSONObject req =
-      new JSONObject().put("method", "gadgets.metadata").put("id", "req1").put("params",
-          new JSONObject().put("ids", ImmutableList.copyOf(uris)));
+  private JSONObject makeMetadataNoContainerRequest(String... uris) throws JSONException {
+    JSONObject req = new JSONObject().put("method", "gadgets.metadata").put("id", "req1")
+            .put("params", new JSONObject().put("ids", ImmutableList.copyOf(uris)));
     return req;
   }
 
   private JSONObject makeTokenRequest(String... uris) throws JSONException {
-    JSONObject req =
-        new JSONObject().put("method", "gadgets.token").put("id", "req1").put("params",
-            new JSONObject().put("ids", ImmutableList.copyOf(uris)).put("container", CONTAINER));
+    JSONObject req = new JSONObject()
+            .put("method", "gadgets.token")
+            .put("id", "req1")
+            .put("params",
+                    new JSONObject().put("ids", ImmutableList.copyOf(uris)).put("container",
+                            CONTAINER));
     return req;
   }
 
+  @SuppressWarnings("unchecked")
+  private void setupMockRegistry(List<String> features) {
+    EasyMock.expect(mockRegistry.getFeatures(EasyMock.isA(List.class)))
+            .andReturn(Lists.newArrayList(features)).anyTimes();
+    FeatureBundle featureBundle = createMockFeatureBundle();
+    FeatureRegistry.LookupResult lr = createMockLookupResult(ImmutableList.of(featureBundle));
+    EasyMock.expect(
+            mockRegistry.getFeatureResources(isA(GadgetContext.class),
+                    eq(Lists.newArrayList(features)), EasyMock.<List<String>> isNull()))
+            .andReturn(lr).anyTimes();
+    replay();
+  }
+
+  private void setupGadgetAdminStore() {
+    EasyMock.expect(gadgetAdminStore.checkFeatureAdminInfo(isA(Gadget.class)))
+    .andReturn(true).anyTimes();
+  }
+
+  private FeatureBundle createMockFeatureBundle() {
+    FeatureBundle result = createMock(FeatureBundle.class);
+    expect(result.getApis(ApiDirective.Type.RPC, false)).andReturn(
+            Lists.newArrayList(RPC_SERVICE_1, RPC_SERVICE_2)).anyTimes();
+    replay(result);
+    return result;
+  }
+
+  private FeatureRegistry.LookupResult createMockLookupResult(List<FeatureBundle> featureBundles) {
+    FeatureRegistry.LookupResult result = createMock(FeatureRegistry.LookupResult.class);
+    EasyMock.expect(result.getBundles()).andReturn(featureBundles).anyTimes();
+    replay(result);
+    return result;
+  }
+
   @Test
   public void testMetadataEmptyRequest() throws Exception {
     registerGadgetsHandler(null);
-    JSONObject request = makeMetadataRequest(null, null);
+    JSONObject request = makeMetadataRequest(null, null, null);
     RpcHandler operation = registry.getRpcHandler(request);
     Object empty = operation.execute(emptyFormItems, authContext, converter).get();
     JsonAssert.assertJsonEquals("{}", converter.convertToString(empty));
@@ -166,20 +232,15 @@ public class GadgetsHandlerTest extends 
     }
   }
 
-  private JSONObject makeCajaRequest(String mime, String... uris)
-      throws JSONException {
-    JSONObject params = new JSONObject()
-      .put("container", CONTAINER)
-      .put("ids", ImmutableList.copyOf(uris));
+  private JSONObject makeCajaRequest(String mime, String... uris) throws JSONException {
+    JSONObject params = new JSONObject().put("container", CONTAINER).put("ids",
+            ImmutableList.copyOf(uris));
 
     if (null != mime) {
       params.put("mime_type", mime);
     }
 
-    return new JSONObject()
-      .put("id", "req1")
-      .put("method", "gadgets.cajole")
-      .put("params", params);
+    return new JSONObject().put("id", "req1").put("method", "gadgets.cajole").put("params", params);
   }
 
   @Test
@@ -210,14 +271,10 @@ public class GadgetsHandlerTest extends 
 
     CajoledResult golden = cajole(JS_URL, goldenMime, "alert('hi');");
 
-    EasyMock.expect(cajaContentRewriter.rewrite(
-        EasyMock.capture(uriCapture),
-        EasyMock.capture(containerCapture),
-        EasyMock.capture(mimeCapture),
-        EasyMock.eq(true),
-        EasyMock.anyBoolean()))
-        .andReturn(golden)
-        .anyTimes();
+    EasyMock.expect(
+            cajaContentRewriter.rewrite(EasyMock.capture(uriCapture),
+                    EasyMock.capture(containerCapture), EasyMock.capture(mimeCapture),
+                    EasyMock.eq(true), EasyMock.anyBoolean())).andReturn(golden).anyTimes();
     replay();
 
     JSONObject request = makeCajaRequest(goldenMime, JS_URL.toString());
@@ -250,16 +307,12 @@ public class GadgetsHandlerTest extends 
     String goldenMime = "text/html";
 
     CajoledResult golden = cajole(HTML_URL, goldenMime,
-        "<b>hello</b>world<script>evilFunc1()</script><div onclick='evilFunc2'></div>");
+            "<b>hello</b>world<script>evilFunc1()</script><div onclick='evilFunc2'></div>");
 
-    EasyMock.expect(cajaContentRewriter.rewrite(
-        EasyMock.capture(uriCapture),
-        EasyMock.capture(containerCapture),
-        EasyMock.capture(mimeCapture),
-        EasyMock.eq(true),
-        EasyMock.anyBoolean()))
-        .andReturn(golden)
-        .anyTimes();
+    EasyMock.expect(
+            cajaContentRewriter.rewrite(EasyMock.capture(uriCapture),
+                    EasyMock.capture(containerCapture), EasyMock.capture(mimeCapture),
+                    EasyMock.eq(true), EasyMock.anyBoolean())).andReturn(golden).anyTimes();
     replay();
 
     JSONObject request = makeCajaRequest(goldenMime, HTML_URL.toString());
@@ -298,9 +351,9 @@ public class GadgetsHandlerTest extends 
   public void testGetRenderingType() throws Exception {
     assertEquals(GadgetsHandlerApi.RenderingType.DEFAULT, GadgetsHandler.getRenderingType(null));
     assertEquals(GadgetsHandlerApi.RenderingType.SANITIZED,
-        GadgetsHandler.getRenderingType("sanitized"));
+            GadgetsHandler.getRenderingType("sanitized"));
     assertEquals(GadgetsHandlerApi.RenderingType.INLINE_CAJOLED,
-        GadgetsHandler.getRenderingType("inline_cajoled"));
+            GadgetsHandler.getRenderingType("inline_cajoled"));
     try {
       GadgetsHandler.getRenderingType("unknown");
       fail("Should have failed");
@@ -322,7 +375,7 @@ public class GadgetsHandlerTest extends 
   public void testMetadataInvalidUrl() throws Exception {
     registerGadgetsHandler(null);
     String badUrl = "[moo]";
-    JSONObject request = makeMetadataRequest(null, null, badUrl);
+    JSONObject request = makeMetadataRequest(null, null, null, badUrl);
     RpcHandler operation = registry.getRpcHandler(request);
     Object responseObj = operation.execute(emptyFormItems, authContext, converter).get();
     JSONObject response = new JSONObject(converter.convertToString(responseObj));
@@ -347,7 +400,9 @@ public class GadgetsHandlerTest extends 
   @Test
   public void testMetadataOneGadget() throws Exception {
     registerGadgetsHandler(null);
-    JSONObject request = makeMetadataRequest(null, null, GADGET1_URL);
+    setupGadgetAdminStore();
+    setupMockRegistry(Lists.newArrayList("core"));
+    JSONObject request = makeMetadataRequest(null, null, null, GADGET1_URL);
     RpcHandler operation = registry.getRpcHandler(request);
     Object responseObj = operation.execute(emptyFormItems, authContext, converter).get();
     JSONObject response = new JSONObject(converter.convertToString(responseObj));
@@ -361,7 +416,7 @@ public class GadgetsHandlerTest extends 
     assertEquals(FakeProcessor.PREFERRED_HEIGHT, view.getInt("preferredHeight"));
     assertEquals(FakeProcessor.PREFERRED_WIDTH, view.getInt("preferredWidth"));
     assertEquals(FakeProcessor.LINK_HREF, gadget.getJSONObject("modulePrefs")
-        .getJSONObject("links").getJSONObject(FakeProcessor.LINK_REL).getString("href"));
+            .getJSONObject("links").getJSONObject(FakeProcessor.LINK_REL).getString("href"));
 
     JSONObject userPrefs = gadget.getJSONObject("userPrefs");
     assertNotNull(userPrefs);
@@ -380,15 +435,38 @@ public class GadgetsHandlerTest extends 
     assertEquals("z_xabc", orderedEnums.getJSONObject(2).getString("value"));
     assertEquals("disp4", orderedEnums.getJSONObject(3).getString("displayValue"));
     assertEquals("foo", orderedEnums.getJSONObject(3).getString("value"));
+
+    verify();
+  }
+
+  @Test
+  public void testAllowedRpcSecurityIds() throws Exception {
+    registerGadgetsHandler(null);
+    setupMockRegistry(Lists.newArrayList("core"));
+    JSONObject request = makeMetadataRequest(null, null, new String[] { "rpcServiceIds" },
+            GADGET1_URL);
+    RpcHandler operation = registry.getRpcHandler(request);
+    Object responseObj = operation.execute(emptyFormItems, authContext, converter).get();
+    JSONObject response = new JSONObject(converter.convertToString(responseObj));
+
+    JSONObject gadget = response.getJSONObject(GADGET1_URL);
+
+    JSONArray rpcServiceIds = gadget.getJSONArray("rpcServiceIds");
+    assertEquals(2, rpcServiceIds.length());
+    assertEquals(RPC_SERVICE_2, rpcServiceIds.get(0));
+    assertEquals(RPC_SERVICE_1, rpcServiceIds.get(1));
+
+    verify();
   }
 
   @Test
   public void testTokenOneGadget() throws Exception {
     SecurityTokenCodec codec = EasyMock.createMock(SecurityTokenCodec.class);
     Capture<SecurityToken> authContextCapture = new Capture<SecurityToken>();
-    EasyMock.expect(codec.encodeToken(EasyMock.capture(authContextCapture))).andReturn(TOKEN).anyTimes();
+    EasyMock.expect(codec.encodeToken(EasyMock.capture(authContextCapture))).andReturn(TOKEN)
+            .anyTimes();
     EasyMock.expect(codec.getTokenExpiration(EasyMock.capture(authContextCapture)))
-        .andReturn(EXPIRY_TIME_MS).anyTimes();
+            .andReturn(EXPIRY_TIME_MS).anyTimes();
     replay(codec);
 
     registerGadgetsHandler(codec);
@@ -411,24 +489,26 @@ public class GadgetsHandlerTest extends 
 
   @Test
   public void testMetadataOneGadgetFailure() throws Exception {
+    setupGadgetAdminStore();
+    replay();
     registerGadgetsHandler(null);
-    JSONObject request = makeMetadataRequest(null, null, GADGET1_URL);
+    JSONObject request = makeMetadataRequest(null, null, null, GADGET1_URL);
     urlGenerator.throwRandomFault = true;
     RpcHandler operation = registry.getRpcHandler(request);
     Object responseObj = operation.execute(emptyFormItems, authContext, converter).get();
     JSONObject response = new JSONObject(converter.convertToString(responseObj));
 
     JSONObject gadget = response.getJSONObject(GADGET1_URL);
-    assertEquals(GadgetsHandler.FAILURE_METADATA,
-        gadget.getJSONObject("error").getString("message"));
+    assertEquals(GadgetsHandler.FAILURE_METADATA, gadget.getJSONObject("error")
+            .getString("message"));
     assertEquals(500, gadget.getJSONObject("error").getInt("code"));
   }
 
   @Test
   public void testTokenOneGadgetFailure() throws Exception {
     SecurityTokenCodec codec = EasyMock.createMock(SecurityTokenCodec.class);
-    EasyMock.expect(codec.encodeToken(EasyMock.isA(SecurityToken.class)))
-        .andThrow(new SecurityTokenException("blah"));
+    EasyMock.expect(codec.encodeToken(EasyMock.isA(SecurityToken.class))).andThrow(
+            new SecurityTokenException("blah"));
     replay(codec);
 
     registerGadgetsHandler(codec);
@@ -439,15 +519,16 @@ public class GadgetsHandlerTest extends 
 
     JSONObject gadget = response.getJSONObject(GADGET1_URL);
     assertFalse(gadget.has("token"));
-    assertEquals(GadgetsHandler.FAILURE_TOKEN,
-        gadget.getJSONObject("error").getString("message"));
+    assertEquals(GadgetsHandler.FAILURE_TOKEN, gadget.getJSONObject("error").getString("message"));
     assertEquals(500, gadget.getJSONObject("error").getInt("code"));
   }
 
   @Test
   public void testMetadataMultipleGadgets() throws Exception {
     registerGadgetsHandler(null);
-    JSONObject request = makeMetadataRequest("en", "US", GADGET1_URL, GADGET2_URL);
+    setupGadgetAdminStore();
+    setupMockRegistry(Lists.newArrayList("core"));
+    JSONObject request = makeMetadataRequest("en", "US", null, GADGET1_URL, GADGET2_URL);
     RpcHandler operation = registry.getRpcHandler(request);
     Object responseObj = operation.execute(emptyFormItems, authContext, converter).get();
     JSONObject response = new JSONObject(converter.convertToString(responseObj));
@@ -457,17 +538,17 @@ public class GadgetsHandlerTest extends 
 
     JSONObject modulePrefs2 = response.getJSONObject(GADGET2_URL).getJSONObject("modulePrefs");
     assertEquals(FakeProcessor.SPEC_TITLE2, modulePrefs2.getString("title"));
+    verify();
   }
 
   @Test
   public void testTokenMultipleGadgetsWithSuccessAndFailure() throws Exception {
     SecurityTokenCodec codec = EasyMock.createMock(SecurityTokenCodec.class);
-    EasyMock.expect(codec.encodeToken(EasyMock.isA(SecurityToken.class)))
-        .andReturn(TOKEN);
-    EasyMock.expect(codec.encodeToken(EasyMock.isA(SecurityToken.class)))
-        .andThrow(new SecurityTokenException("blah"));
+    EasyMock.expect(codec.encodeToken(EasyMock.isA(SecurityToken.class))).andReturn(TOKEN);
+    EasyMock.expect(codec.encodeToken(EasyMock.isA(SecurityToken.class))).andThrow(
+            new SecurityTokenException("blah"));
     EasyMock.expect(codec.getTokenExpiration(EasyMock.isA(SecurityToken.class)))
-        .andReturn(EXPIRY_TIME_MS).anyTimes();
+            .andReturn(EXPIRY_TIME_MS).anyTimes();
     replay(codec);
 
     registerGadgetsHandler(codec);
@@ -483,17 +564,18 @@ public class GadgetsHandlerTest extends 
 
     JSONObject gadget2 = response.getJSONObject(GADGET2_URL);
     assertFalse(gadget2.has("token"));
-    assertEquals(GadgetsHandler.FAILURE_TOKEN,
-        gadget2.getJSONObject("error").getString("message"));
+    assertEquals(GadgetsHandler.FAILURE_TOKEN, gadget2.getJSONObject("error").getString("message"));
     assertEquals(500, gadget2.getJSONObject("error").getInt("code"));
   }
 
   @Test
   public void testMetadataMultipleGadgetsWithFailure() throws Exception {
     registerGadgetsHandler(null);
-    JSONObject request = makeMetadataRequest("en", "US", GADGET1_URL, GADGET2_URL);
+    setupGadgetAdminStore();
+    setupMockRegistry(Lists.newArrayList("core"));
+    JSONObject request = makeMetadataRequest("en", "US", null, GADGET1_URL, GADGET2_URL);
     processor.exceptions.put(FakeProcessor.SPEC_URL2, new ProcessingException("broken",
-        HttpServletResponse.SC_BAD_REQUEST));
+            HttpServletResponse.SC_BAD_REQUEST));
     RpcHandler operation = registry.getRpcHandler(request);
     Object responseObj = operation.execute(emptyFormItems, authContext, converter).get();
     JSONObject response = new JSONObject(converter.convertToString(responseObj));
@@ -504,19 +586,19 @@ public class GadgetsHandlerTest extends 
     JSONObject gadget2 = response.getJSONObject(GADGET2_URL);
     assertNotNull("got gadget2", gadget2);
     assertEquals("broken", // Processing exception message is used
-        gadget2.getJSONObject("error").getString("message"));
-    assertEquals(HttpServletResponse.SC_BAD_REQUEST,
-        gadget2.getJSONObject("error").getInt("code"));
+            gadget2.getJSONObject("error").getString("message"));
+    assertEquals(HttpServletResponse.SC_BAD_REQUEST, gadget2.getJSONObject("error").getInt("code"));
+    verify();
   }
 
   private JSONObject makeSimpleProxyRequest(String fields, String... uris) throws JSONException {
-    JSONObject params = new JSONObject().put("ids", ImmutableList.copyOf(uris))
-        .put("container", CONTAINER);
+    JSONObject params = new JSONObject().put("ids", ImmutableList.copyOf(uris)).put("container",
+            CONTAINER);
     if (fields != null) {
       params.put("fields", fields);
     }
-    JSONObject req =
-        new JSONObject().put("method", "gadgets.proxy").put("id", "req1").put("params", params);
+    JSONObject req = new JSONObject().put("method", "gadgets.proxy").put("id", "req1")
+            .put("params", params);
     return req;
   }
 
@@ -527,8 +609,9 @@ public class GadgetsHandlerTest extends 
     String proxyUri = "http://shindig.com/gadgets/proxy?url=" + resUri;
     JSONObject request = makeSimpleProxyRequest(null, resUri);
     Capture<List<ProxyUri>> captureProxyUri = new Capture<List<ProxyUri>>();
-    EasyMock.expect(proxyUriManager.make(EasyMock.capture(captureProxyUri),
-        EasyMock.isNull(Integer.class))).andReturn(ImmutableList.<Uri>of(Uri.parse(proxyUri)));
+    EasyMock.expect(
+            proxyUriManager.make(EasyMock.capture(captureProxyUri), EasyMock.isNull(Integer.class)))
+            .andReturn(ImmutableList.<Uri> of(Uri.parse(proxyUri)));
     replay();
     RpcHandler operation = registry.getRpcHandler(request);
     Object responseObj = operation.execute(emptyFormItems, authContext, converter).get();
@@ -543,35 +626,33 @@ public class GadgetsHandlerTest extends 
     verify();
   }
 
-  private JSONObject makeSimpleJsRequest(String fields, List<String> features)
-      throws JSONException {
-    JSONObject params = new JSONObject().put("gadget", GADGET1_URL)
-        .put("container", CONTAINER).put("features", features);
+  private JSONObject makeSimpleJsRequest(String fields, List<String> features) throws JSONException {
+    JSONObject params = new JSONObject().put("gadget", GADGET1_URL).put("container", CONTAINER)
+            .put("features", features);
     if (fields != null) {
       params.put("fields", fields);
     }
-    JSONObject req =
-        new JSONObject().put("method", "gadgets.js").put("id", "req1").put("params", params);
+    JSONObject req = new JSONObject().put("method", "gadgets.js").put("id", "req1")
+            .put("params", params);
     return req;
   }
 
   @Test
   public void testJsSimple() throws Exception {
     registerGadgetsHandler(null);
-    List<String> features = ImmutableList.of("rpc","io");
+    List<String> features = ImmutableList.of("rpc", "io");
     Uri jsUri = Uri.parse("http://shindig.com/gadgets/js/rpc:io");
     JSONObject request = makeSimpleJsRequest(null, features);
     Capture<JsUri> captureUri = new Capture<JsUri>();
-    EasyMock.expect(jsUriManager.makeExternJsUri(EasyMock.capture(captureUri)))
-        .andReturn(jsUri);
+    EasyMock.expect(jsUriManager.makeExternJsUri(EasyMock.capture(captureUri))).andReturn(jsUri);
     replay();
 
     RpcHandler operation = registry.getRpcHandler(request);
     Object responseObj = operation.execute(emptyFormItems, authContext, converter).get();
     JSONObject results = new JSONObject(converter.convertToString(responseObj));
     assertEquals(jsUri.toString(), results.getString("jsUrl"));
-    JsUri expectedUri = new JsUri(null, false, false, CONTAINER, GADGET1_URL,
-        features, null, null, false, false, RenderingContext.GADGET, null, null);
+    JsUri expectedUri = new JsUri(null, false, false, CONTAINER, GADGET1_URL, features, null, null,
+            false, false, RenderingContext.GADGET, null, null);
     assertEquals(expectedUri, captureUri.getValue());
     assertFalse(results.has("error"));
     assertFalse(results.has("jsContent"));
@@ -579,23 +660,23 @@ public class GadgetsHandlerTest extends 
   }
 
   private JSONObject makeComplexJsRequest(List<String> features, List<String> loadedFeatures,
-      String onload, String repository) throws JSONException {
-    JSONObject params = new JSONObject().put("gadget", GADGET1_URL)
-        .put("container", CONTAINER).put("features", features)
-        .put("loadedFeatures", loadedFeatures).put("fields", "*").put("refresh", "123")
-        .put("debug", "1").put("nocache", "1").put("onload", onload).put("c", "1");
+          String onload, String repository) throws JSONException {
+    JSONObject params = new JSONObject().put("gadget", GADGET1_URL).put("container", CONTAINER)
+            .put("features", features).put("loadedFeatures", loadedFeatures).put("fields", "*")
+            .put("refresh", "123").put("debug", "1").put("nocache", "1").put("onload", onload)
+            .put("c", "1");
     if (repository != null) {
-        params.put("r", repository);
+      params.put("r", repository);
     }
-    JSONObject request =
-        new JSONObject().put("method", "gadgets.js").put("id", "req1").put("params", params);
+    JSONObject request = new JSONObject().put("method", "gadgets.js").put("id", "req1")
+            .put("params", params);
     return request;
   }
 
   @Test
   public void testJsData() throws Exception {
     registerGadgetsHandler(null);
-    List<String> features = ImmutableList.of("rpc","io");
+    List<String> features = ImmutableList.of("rpc", "io");
     List<String> loadedFeatures = ImmutableList.of("rpc");
     Uri jsUri = Uri.parse("http://shindig.com/gadgets/js/rpc:io");
     String onload = "do \"this\";";
@@ -604,20 +685,18 @@ public class GadgetsHandlerTest extends 
     JSONObject request = makeComplexJsRequest(features, loadedFeatures, onload, repository);
 
     Capture<JsUri> captureUri = new Capture<JsUri>();
-    EasyMock.expect(jsUriManager.makeExternJsUri(EasyMock.capture(captureUri)))
-        .andReturn(jsUri);
+    EasyMock.expect(jsUriManager.makeExternJsUri(EasyMock.capture(captureUri))).andReturn(jsUri);
     String jsContent = "var b=\"123\";";
-    EasyMock.expect(jsPipeline.execute(EasyMock.isA(JsRequest.class)))
-        .andReturn(new JsResponseBuilder().appendJs(jsContent, "js").build());
+    EasyMock.expect(jsPipeline.execute(EasyMock.isA(JsRequest.class))).andReturn(
+            new JsResponseBuilder().appendJs(jsContent, "js").build());
     replay();
 
     RpcHandler operation = registry.getRpcHandler(request);
     Object responseObj = operation.execute(emptyFormItems, authContext, converter).get();
     JSONObject results = new JSONObject(converter.convertToString(responseObj));
     assertEquals(jsUri.toString(), results.getString("jsUrl"));
-    JsUri expectedUri = new JsUri(123, true, true, CONTAINER, GADGET1_URL,
-        features, loadedFeatures, onload, false, false, RenderingContext.CONTAINER, null,
-        repository);
+    JsUri expectedUri = new JsUri(123, true, true, CONTAINER, GADGET1_URL, features,
+            loadedFeatures, onload, false, false, RenderingContext.CONTAINER, null, repository);
     assertEquals(expectedUri, captureUri.getValue());
     assertFalse(results.has("error"));
     assertEquals(jsContent, results.getString("jsContent"));
@@ -635,10 +714,9 @@ public class GadgetsHandlerTest extends 
     JSONObject request = makeComplexJsRequest(features, loadedFeatures, onload, null);
 
     Capture<JsUri> captureUri = new Capture<JsUri>();
-    EasyMock.expect(jsUriManager.makeExternJsUri(EasyMock.capture(captureUri)))
-        .andReturn(jsUri);
-    EasyMock.expect(jsPipeline.execute(EasyMock.isA(JsRequest.class)))
-        .andThrow(new JsException(404, "not found"));
+    EasyMock.expect(jsUriManager.makeExternJsUri(EasyMock.capture(captureUri))).andReturn(jsUri);
+    EasyMock.expect(jsPipeline.execute(EasyMock.isA(JsRequest.class))).andThrow(
+            new JsException(404, "not found"));
     replay();
 
     RpcHandler operation = registry.getRpcHandler(request);
@@ -657,8 +735,9 @@ public class GadgetsHandlerTest extends 
     String proxyUri = "http://shindig.com/gadgets/proxy?url=" + resUri;
     JSONObject request = makeSimpleProxyRequest("*", resUri);
     Capture<List<ProxyUri>> captureProxyUri = new Capture<List<ProxyUri>>();
-    EasyMock.expect(proxyUriManager.make(EasyMock.capture(captureProxyUri),
-        EasyMock.isNull(Integer.class))).andReturn(ImmutableList.<Uri>of(Uri.parse(proxyUri)));
+    EasyMock.expect(
+            proxyUriManager.make(EasyMock.capture(captureProxyUri), EasyMock.isNull(Integer.class)))
+            .andReturn(ImmutableList.<Uri> of(Uri.parse(proxyUri)));
     String responseData = "response data";
     HttpResponse httpResponse = new HttpResponse(responseData);
     EasyMock.expect(proxyHandler.fetch(EasyMock.isA(ProxyUri.class))).andReturn(httpResponse);
@@ -673,22 +752,25 @@ public class GadgetsHandlerTest extends 
     ProxyUri pUri = captureProxyUri.getValue().get(0);
     ProxyUri expectedUri = new ProxyUri(null, false, false, CONTAINER, null, Uri.parse(resUri));
     assertTrue(expectedUri.equals(pUri));
-    assertEquals(responseData, new String(Base64.decodeBase64(((JSONObject)
-        gadget1.get("proxyContent")).getString("contentBase64").getBytes())));
+    assertEquals(
+            responseData,
+            new String(Base64.decodeBase64(((JSONObject) gadget1.get("proxyContent")).getString(
+                    "contentBase64").getBytes())));
     assertFalse(gadget1.has("error"));
     verify();
   }
 
   private JSONObject makeComplexProxyRequest(String... uris) throws JSONException {
-    JSONObject req =
-        new JSONObject().put("method", "gadgets.proxy").put("id", "req1").put("params",
-            new JSONObject().put("ids", ImmutableList.copyOf(uris)).put("container", CONTAINER)
-                .put("nocache", "1").put("debug", "1").put("sanitize", "true")
-                .put("gadget", GADGET1_URL).put("refresh", "333")
-                .put("rewriteMime", "text/xml").put("fallback_url", uris[0])
-                .put("no_expand", "true").put("resize_h", "444").put("resize_w", "555")
-                .put("resize_q", "88")
-                );
+    JSONObject req = new JSONObject()
+            .put("method", "gadgets.proxy")
+            .put("id", "req1")
+            .put("params",
+                    new JSONObject().put("ids", ImmutableList.copyOf(uris))
+                            .put("container", CONTAINER).put("nocache", "1").put("debug", "1")
+                            .put("sanitize", "true").put("gadget", GADGET1_URL)
+                            .put("refresh", "333").put("rewriteMime", "text/xml")
+                            .put("fallback_url", uris[0]).put("no_expand", "true")
+                            .put("resize_h", "444").put("resize_w", "555").put("resize_q", "88"));
     return req;
   }
 
@@ -699,8 +781,9 @@ public class GadgetsHandlerTest extends 
     String proxyUri = "http://shindig.com/gadgets/proxy?url=" + resUri;
     JSONObject request = makeComplexProxyRequest(resUri);
     Capture<List<ProxyUri>> captureProxyUri = new Capture<List<ProxyUri>>();
-    EasyMock.expect(proxyUriManager.make(EasyMock.capture(captureProxyUri),
-        EasyMock.isNull(Integer.class))).andReturn(ImmutableList.<Uri>of(Uri.parse(proxyUri)));
+    EasyMock.expect(
+            proxyUriManager.make(EasyMock.capture(captureProxyUri), EasyMock.isNull(Integer.class)))
+            .andReturn(ImmutableList.<Uri> of(Uri.parse(proxyUri)));
     replay();
     RpcHandler operation = registry.getRpcHandler(request);
     Object responseObj = operation.execute(emptyFormItems, authContext, converter).get();

Modified: shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/MakeRequestHandlerTest.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/MakeRequestHandlerTest.java?rev=1178236&r1=1178235&r2=1178236&view=diff
==============================================================================
--- shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/MakeRequestHandlerTest.java (original)
+++ shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/MakeRequestHandlerTest.java Sun Oct  2 19:44:13 2011
@@ -23,7 +23,14 @@ import static org.easymock.EasyMock.capt
 import static org.easymock.EasyMock.expect;
 import static org.easymock.EasyMock.isA;
 
-import com.google.common.collect.Lists;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
+
+import javax.servlet.http.HttpServletRequest;
 
 import org.apache.shindig.auth.AuthInfoUtil;
 import org.apache.shindig.auth.SecurityToken;
@@ -32,8 +39,8 @@ import org.apache.shindig.common.testing
 import org.apache.shindig.common.uri.Uri;
 import org.apache.shindig.config.ContainerConfig;
 import org.apache.shindig.gadgets.AuthType;
-import org.apache.shindig.gadgets.GadgetBlacklist;
 import org.apache.shindig.gadgets.GadgetException;
+import org.apache.shindig.gadgets.admin.GadgetAdminStore;
 import org.apache.shindig.gadgets.http.HttpRequest;
 import org.apache.shindig.gadgets.http.HttpResponse;
 import org.apache.shindig.gadgets.http.HttpResponseBuilder;
@@ -46,14 +53,7 @@ import org.json.JSONObject;
 import org.junit.Before;
 import org.junit.Test;
 
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Enumeration;
-import java.util.List;
-import java.util.Map;
-import java.util.TreeMap;
-
-import javax.servlet.http.HttpServletRequest;
+import com.google.common.collect.Lists;
 
 /**
  * Tests for MakeRequestHandler.
@@ -64,9 +64,10 @@ public class MakeRequestHandlerTest exte
   private static final String RESPONSE_BODY = "makeRequest response body";
   private static final SecurityToken DUMMY_TOKEN = new FakeGadgetToken();
 
-  private final GadgetBlacklist gadgetBlacklist = mock(GadgetBlacklist.class);
+  private final GadgetAdminStore gadgetAdminStore = mock(GadgetAdminStore.class);
   private final MakeRequestHandler handler
-      = new MakeRequestHandler(pipeline, rewriterRegistry, feedProcessorProvider, gadgetBlacklist);
+      = new MakeRequestHandler(pipeline, rewriterRegistry, feedProcessorProvider,
+              gadgetAdminStore);
 
   private void expectGetAndReturnBody(String response) throws Exception {
     expectGetAndReturnBody(AuthType.NONE, response);
@@ -175,9 +176,9 @@ public class MakeRequestHandlerTest exte
   }
 
   @Test
-  public void GetRequestWithBlacklistedGadget() throws Exception {
+  public void GetRequestWithNonWhitelistedGadget() throws Exception {
     expect(request.getParameter(Param.GADGET.getKey())).andReturn("http://some/gadget.xml").anyTimes();
-    expect(gadgetBlacklist.isBlacklisted(isA(Uri.class))).andReturn(true);
+    expect(gadgetAdminStore.isWhitelisted(isA(String.class), isA(String.class))).andReturn(false);
     replay();
     boolean exceptionThrown = false;
     try {
@@ -185,13 +186,29 @@ public class MakeRequestHandlerTest exte
     } catch (GadgetException e) {
       exceptionThrown = true;
       assertEquals(403, e.getHttpStatusCode());
-      assertEquals(GadgetException.Code.BLACKLISTED_GADGET, e.getCode());
+      assertEquals(GadgetException.Code.NON_WHITELISTED_GADGET, e.getCode());
     }
     assertTrue(exceptionThrown);
     verify();
   }
 
   @Test
+  public void GetRequestWithWhitelistedGadget() throws Exception {
+    expect(request.getParameter(Param.GADGET.getKey())).andReturn("http://some/gadget.xml").anyTimes();
+    expect(gadgetAdminStore.isWhitelisted(isA(String.class), isA(String.class)))
+    .andReturn(true);
+    expectGetAndReturnBody(RESPONSE_BODY);
+    replay();
+
+    handler.fetch(request, recorder);
+
+    JSONObject results = extractJsonFromResponse();
+    assertEquals(HttpResponse.SC_OK, results.getInt("rc"));
+    assertEquals(RESPONSE_BODY, results.get("body"));
+    assertTrue(rewriter.responseWasRewritten());
+  }
+
+  @Test
   public void testExplicitHeaders() throws Exception {
     String headerString = "X-Foo=bar&X-Bar=baz%20foo";
 

Modified: shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/MakeRequestServletTest.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/MakeRequestServletTest.java?rev=1178236&r1=1178235&r2=1178236&view=diff
==============================================================================
--- shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/MakeRequestServletTest.java (original)
+++ shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/MakeRequestServletTest.java Sun Oct  2 19:44:13 2011
@@ -22,23 +22,22 @@ import static junitx.framework.StringAss
 import static junitx.framework.StringAssert.assertStartsWith;
 import static org.easymock.EasyMock.expect;
 
+import java.util.Collections;
+import java.util.Enumeration;
+
+import javax.servlet.http.HttpServletResponse;
+
 import org.apache.shindig.common.uri.Uri;
-import org.apache.shindig.gadgets.GadgetBlacklist;
 import org.apache.shindig.gadgets.GadgetException;
+import org.apache.shindig.gadgets.admin.GadgetAdminStore;
 import org.apache.shindig.gadgets.http.HttpRequest;
 import org.apache.shindig.gadgets.http.HttpResponse;
 import org.apache.shindig.gadgets.uri.UriCommon.Param;
-
 import org.json.JSONException;
 import org.json.JSONObject;
 import org.junit.Before;
 import org.junit.Test;
 
-import java.util.Collections;
-import java.util.Enumeration;
-
-import javax.servlet.http.HttpServletResponse;
-
 /**
  * Tests for MakeRequestServlet.
  *
@@ -51,10 +50,10 @@ public class MakeRequestServletTest exte
   private static final Enumeration<String> EMPTY_ENUM
       = Collections.enumeration(Collections.<String>emptyList());
 
-  private final GadgetBlacklist gadgetBlacklist = mock(GadgetBlacklist.class);
+  private final GadgetAdminStore gadgetAdminStore = mock(GadgetAdminStore.class);
   private final MakeRequestServlet servlet = new MakeRequestServlet();
   private final MakeRequestHandler handler =
-      new MakeRequestHandler(pipeline, null, feedProcessorProvider, gadgetBlacklist);
+      new MakeRequestHandler(pipeline, null, feedProcessorProvider, gadgetAdminStore);
 
   private final HttpRequest internalRequest = new HttpRequest(REQUEST_URL);
   private final HttpResponse internalResponse = new HttpResponse(RESPONSE_BODY);