Added: incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/preload/PreloaderTestFixture.java URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/preload/PreloaderTestFixture.java?rev=727123&view=auto ============================================================================== --- incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/preload/PreloaderTestFixture.java (added) +++ incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/preload/PreloaderTestFixture.java Tue Dec 16 11:16:44 2008 @@ -0,0 +1,71 @@ +/* + * 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.gadgets.preload; + +import com.google.common.collect.Maps; +import org.apache.shindig.auth.SecurityToken; +import org.apache.shindig.common.testing.FakeGadgetToken; +import org.apache.shindig.common.uri.Uri; +import org.apache.shindig.gadgets.GadgetContext; + +import java.net.URI; +import java.util.Map; + +/** + * Base code for the preloader tests. + */ +public class PreloaderTestFixture { + protected static final Uri GADGET_URL = Uri.parse("http://example.org/gadget.xml"); + protected static final String CONTAINER = "some-container"; + protected static final String HOST = "example.org"; + protected String view = "default"; + public Map<String, String> contextParams = Maps.newHashMap(); + + public final GadgetContext context = new GadgetContext() { + @Override + public SecurityToken getToken() { + return new FakeGadgetToken(); + } + + @Override + public String getView() { + return view; + } + + @Override + public String getContainer() { + return CONTAINER; + } + + @Override + public URI getUrl() { + return GADGET_URL.toJavaUri(); + } + + @Override + public String getHost() { + return HOST; + } + + @Override + public String getParameter(String name) { + return contextParams.get(name); + } + }; +}
Modified: incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/HtmlRendererTest.java URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/HtmlRendererTest.java?rev=727123&r1=727122&r2=727123&view=diff ============================================================================== --- incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/HtmlRendererTest.java (original) +++ incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/HtmlRendererTest.java Tue Dec 16 11:16:44 2008 @@ -18,6 +18,8 @@ */ package org.apache.shindig.gadgets.render; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Lists; import com.google.common.collect.Maps; import org.apache.shindig.auth.AnonymousSecurityToken; import org.apache.shindig.auth.SecurityToken; @@ -30,18 +32,20 @@ import org.apache.shindig.gadgets.http.ContentFetcherFactory; import org.apache.shindig.gadgets.http.HttpRequest; import org.apache.shindig.gadgets.http.HttpResponse; +import org.apache.shindig.gadgets.preload.PreloadException; +import org.apache.shindig.gadgets.preload.PreloadedData; import org.apache.shindig.gadgets.preload.PreloaderService; import org.apache.shindig.gadgets.preload.Preloads; import org.apache.shindig.gadgets.rewrite.ContentRewriterRegistry; import org.apache.shindig.gadgets.spec.GadgetSpec; import org.apache.shindig.gadgets.spec.View; +import org.json.JSONArray; +import org.json.JSONObject; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import org.junit.Test; -import java.util.Arrays; -import java.util.Locale; -import java.util.Map; +import java.util.*; /** * Tests for HtmlRenderer @@ -135,6 +139,55 @@ } @Test + public void renderProxiedWithPreload() throws Exception { + JSONObject prefetchedJson = new JSONObject("{id: 'foo', data: 'bar'}"); + + preloaderService.preloads = new FakePreloads( + ImmutableMap.of("key", (Object) prefetchedJson)); + + fetcher.plainResponses.put(EXPECTED_PROXIED_HTML_HREF, new HttpResponse(PROXIED_HTML_CONTENT)); + String content = renderer.render(makeHrefGadget("none")); + assertEquals(PROXIED_HTML_CONTENT, content); + + HttpRequest lastHttpRequest = fetcher.getLastHttpRequest(); + assertEquals("POST", lastHttpRequest.getMethod()); + assertEquals("GET", lastHttpRequest.getHeader("X-Method-Override")); + String postBody = lastHttpRequest.getPostBodyAsString(); + JSONArray actualJson = new JSONArray(postBody); + + assertEquals(1, actualJson.length()); + assertEquals(prefetchedJson.toString(), actualJson.getJSONObject(0).toString()); + } + + @Test + public void renderProxiedWithFailedPreload() throws Exception { + JSONObject prefetchedJson = new JSONObject("{id: 'foo', data: 'bar'}"); + + preloaderService.preloads = new Preloads() { + public Collection<PreloadedData> getData() { + PreloadedData preloadedData = new PreloadedData() { + public Map<String, Object> toJson() throws PreloadException { + throw new PreloadException("test"); + } + }; + return Lists.newArrayList(preloadedData); + } + }; + + fetcher.plainResponses.put(EXPECTED_PROXIED_HTML_HREF, new HttpResponse(PROXIED_HTML_CONTENT)); + String content = renderer.render(makeHrefGadget("none")); + assertEquals(PROXIED_HTML_CONTENT, content); + + HttpRequest lastHttpRequest = fetcher.getLastHttpRequest(); + assertEquals("POST", lastHttpRequest.getMethod()); + assertEquals("GET", lastHttpRequest.getHeader("X-Method-Override")); + String postBody = lastHttpRequest.getPostBodyAsString(); + JSONArray actualJson = new JSONArray(postBody); + + assertEquals(0, actualJson.length()); + } + + @Test public void doPreloading() throws Exception { renderer.render(makeGadget(BASIC_HTML_CONTENT)); assertTrue("Preloading not performed.", preloaderService.wasPreloaded); @@ -150,6 +203,7 @@ private final Map<Uri, HttpResponse> plainResponses = Maps.newHashMap(); private final Map<Uri, HttpResponse> signedResponses = Maps.newHashMap(); private final Map<Uri, HttpResponse> oauthResponses = Maps.newHashMap(); + private HttpRequest lastHttpRequest; public FakeContentFetcherFactory() { super(null, null); @@ -157,6 +211,8 @@ @Override public HttpResponse fetch(HttpRequest request) throws GadgetException { + lastHttpRequest = request; + if (request.getGadget() == null) { throw new GadgetException(GadgetException.Code.FAILED_TO_RETRIEVE_CONTENT, "No gadget associated with rendering request."); @@ -198,16 +254,38 @@ } return response; } + + public HttpRequest getLastHttpRequest() { + return lastHttpRequest; + } } private static class FakePreloaderService implements PreloaderService { private boolean wasPreloaded; - public Preloads preload(GadgetContext context, GadgetSpec gadget) { + Preloads preloads; + + public Preloads preload(GadgetContext context, GadgetSpec gadget, PreloadPhase phase) { wasPreloaded = true; - return null; + return preloads; } } + private static class FakePreloads implements Preloads { + private final PreloadedData preloadedData; + + public Collection<PreloadedData> getData() { + return Collections.singletonList(preloadedData); + } + + public FakePreloads(final Map<String, Object> preloadData) { + this.preloadedData = new PreloadedData() { + public Map<String, Object> toJson() throws PreloadException { + return preloadData; + } + }; + } + } + private static class FakeContentRewriterRegistry implements ContentRewriterRegistry { private boolean wasRewritten = false; Modified: incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/RenderingContentRewriterTest.java URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/RenderingContentRewriterTest.java?rev=727123&r1=727122&r2=727123&view=diff ============================================================================== --- incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/RenderingContentRewriterTest.java (original) +++ incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/RenderingContentRewriterTest.java Tue Dec 16 11:16:44 2008 @@ -600,17 +600,14 @@ // implementing equals. Preloads preloads = new Preloads() { - - public PreloadedData getData(final String key) { - return new PreloadedData() { - public Object toJson() { - return preloadData.get(key); + public Collection<PreloadedData> getData() { + PreloadedData preloadedData = new PreloadedData() { + public Map<String, Object> toJson() throws PreloadException { + return preloadData; } }; - } - public Set<String> getKeys() { - return preloadData.keySet(); + return Lists.newArrayList(preloadedData); } }; @@ -628,11 +625,14 @@ @Test public void failedPreloadHandledGracefully() throws Exception { Preloads preloads = new Preloads() { - public PreloadedData getData(final String key) throws PreloadException { - throw new PreloadException("broken"); - } - public Set<String> getKeys() { - return ImmutableSortedSet.of("foo"); + public Collection<PreloadedData> getData() { + PreloadedData preloadedData = new PreloadedData() { + public Map<String, Object> toJson() throws PreloadException { + throw new PreloadException("test"); + } + }; + + return Lists.newArrayList(preloadedData); } }; Added: incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/spec/PipelinedDataTest.java URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/spec/PipelinedDataTest.java?rev=727123&view=auto ============================================================================== --- incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/spec/PipelinedDataTest.java (added) +++ incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/spec/PipelinedDataTest.java Tue Dec 16 11:16:44 2008 @@ -0,0 +1,160 @@ +/* + * 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.gadgets.spec; + +import org.apache.shindig.common.xml.XmlUtil; +import org.json.JSONObject; +import static org.junit.Assert.*; +import org.junit.Test; + +public class PipelinedDataTest { + //TODO: test os:MakeRequest + + @Test + public void testPeopleRequest() throws Exception { + String xml = "<Content><PeopleRequest xmlns=\"" + PipelinedData.OPENSOCIAL_NAMESPACE + "\" " + + " key=\"key\"" + + " groupId=\"group\"" + + " userId=\"first,second\"" + + " startIndex=\"20\"" + + " count=\"10\"" + + " fields=\"name,id\"" + + "/></Content>"; + + PipelinedData socialData = new PipelinedData(XmlUtil.parse(xml), null); + assertFalse(socialData.needsOwner()); + assertFalse(socialData.needsViewer()); + + JSONObject expected = new JSONObject("{method: 'people.get', id: 'key', params:" + + "{groupId: 'group'," + + "userId: ['first','second']," + + "startIndex: 20," + + "count: 10," + + "fields: ['name','id']" + + "}}"); + + assertEquals(1, socialData.getSocialPreloads().size()); + assertEquals(expected.toString(), socialData.getSocialPreloads().get("key").toString()); + } + + @Test + public void testViewerRequest() throws Exception { + String xml = "<Content><ViewerRequest xmlns=\"" + PipelinedData.OPENSOCIAL_NAMESPACE + "\" " + + " key=\"key\"" + + " fields=\"name,id\"" + + "/></Content>"; + + PipelinedData socialData = new PipelinedData(XmlUtil.parse(xml), null); + assertFalse(socialData.needsOwner()); + assertTrue(socialData.needsViewer()); + + JSONObject expected = new JSONObject("{method: 'people.get', id: 'key', params:" + + "{userId: ['@viewer']," + + "fields: ['name','id']" + + "}}"); + + assertEquals(1, socialData.getSocialPreloads().size()); + assertEquals(expected.toString(), socialData.getSocialPreloads().get("key").toString()); + } + + @Test + public void testOwnerRequest() throws Exception { + String xml = "<Content><OwnerRequest xmlns=\"" + PipelinedData.OPENSOCIAL_NAMESPACE + "\" " + + " key=\"key\"" + + " fields=\"name,id\"" + + "/></Content>"; + + PipelinedData socialData = new PipelinedData(XmlUtil.parse(xml), null); + assertTrue(socialData.needsOwner()); + assertFalse(socialData.needsViewer()); + + JSONObject expected = new JSONObject("{method: 'people.get', id: 'key', params:" + + "{userId: ['@owner']," + + "fields: ['name','id']" + + "}}"); + + assertEquals(1, socialData.getSocialPreloads().size()); + assertEquals(expected.toString(), socialData.getSocialPreloads().get("key").toString()); + } + + @Test + public void testPersonAppData() throws Exception { + String xml = "<Content><PersonAppDataRequest xmlns=\"" + PipelinedData.OPENSOCIAL_NAMESPACE + "\" " + + " key=\"key\"" + + " userId=\"@viewer\"" + + " fields=\"foo,bar\"" + + "/></Content>"; + + PipelinedData socialData = new PipelinedData(XmlUtil.parse(xml), null); + assertFalse(socialData.needsOwner()); + assertTrue(socialData.needsViewer()); + + JSONObject expected = new JSONObject("{method: 'appdata.get', id: 'key', params:" + + "{userId: ['@viewer']," + + "fields: ['foo','bar']" + + "}}"); + + assertEquals(1, socialData.getSocialPreloads().size()); + assertEquals(expected.toString(), socialData.getSocialPreloads().get("key").toString()); + } + + @Test + public void testActivitiesRequest() throws Exception { + String xml = "<Content><ActivitiesRequest xmlns=\"" + PipelinedData.OPENSOCIAL_NAMESPACE + "\" " + + " key=\"key\"" + + " userId=\"@owner,@viewer\"" + + " fields=\"foo,bar\"" + + "/></Content>"; + + PipelinedData socialData = new PipelinedData(XmlUtil.parse(xml), null); + assertTrue(socialData.needsOwner()); + assertTrue(socialData.needsViewer()); + + JSONObject expected = new JSONObject("{method: 'activities.get', id: 'key', params:" + + "{userId: ['@owner','@viewer']," + + "fields: ['foo','bar']" + + "}}"); + + assertEquals(1, socialData.getSocialPreloads().size()); + assertEquals(expected.toString(), socialData.getSocialPreloads().get("key").toString()); + } + + @Test + public void testIgnoreNoNamespace() throws Exception { + String xml = "<Content><PersonRequest" + + " key=\"key\"" + + " userId=\"@owner\"" + + " fields=\"name,id\"" + + "/></Content>"; + + PipelinedData socialData = new PipelinedData(XmlUtil.parse(xml), null); + assertFalse(socialData.needsOwner()); + + assertTrue(socialData.getSocialPreloads().isEmpty()); + } + + @Test(expected = SpecParserException.class) + public void testErrorOnUnknownOpensocialElement() throws Exception { + String xml = "<Content><NotARealElement xmlns=\"" + PipelinedData.OPENSOCIAL_NAMESPACE + "\" " + + "/></Content>"; + + new PipelinedData(XmlUtil.parse(xml), null); + } +} Modified: incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/spec/ViewTest.java URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/spec/ViewTest.java?rev=727123&r1=727122&r2=727123&view=diff ============================================================================== --- incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/spec/ViewTest.java (original) +++ incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/spec/ViewTest.java Tue Dec 16 11:16:44 2008 @@ -195,4 +195,53 @@ assertFalse("sign_owner parsed incorrectly.", view.isSignOwner()); assertFalse("sign_viewer parsed incorrectly.", view.isSignViewer()); } + + @Test + public void testSocialPreload() throws Exception { + String xml = "<Content href=\"http://example.org/proxied.php\" " + + "authz=\"SIGNED\">" + + "<OwnerRequest xmlns=\"" + PipelinedData.OPENSOCIAL_NAMESPACE + "\" " + + " key=\"key\"" + + " fields=\"name,id\"" + + "/></Content>"; + View view = new View("test", Arrays.asList(XmlUtil.parse(xml)), SPEC_URL); + assertEquals(1, view.getPipelinedData().getSocialPreloads().size()); + assertTrue(view.getPipelinedData().getSocialPreloads().containsKey("key")); + } + + @Test(expected = SpecParserException.class) + public void testSocialPreloadWithoutAuth() throws Exception { + // Not signed, so a parse exception will result + String xml = "<Content href=\"http://example.org/proxied.php\" " + + "sign_owner=\"true\">" + + "<OwnerRequest xmlns=\"" + PipelinedData.OPENSOCIAL_NAMESPACE + "\" " + + " key=\"key\"" + + " fields=\"name,id\"" + + "/></Content>"; + new View("test", Arrays.asList(XmlUtil.parse(xml)), SPEC_URL); + } + + @Test(expected = SpecParserException.class) + public void testSocialPreloadWithoutSignOwner() throws Exception { + // Signed, but not by owner when owner data is fetched + String xml = "<Content href=\"http://example.org/proxied.php\" " + + "authz=\"SIGNED\" sign_owner=\"false\">" + + "<OwnerRequest xmlns=\"" + PipelinedData.OPENSOCIAL_NAMESPACE + "\" " + + " key=\"key\"" + + " fields=\"name,id\"" + + "/></Content>"; + new View("test", Arrays.asList(XmlUtil.parse(xml)), SPEC_URL); + } + + @Test(expected = SpecParserException.class) + public void testSocialPreloadWithoutSignViewer() throws Exception { + // Signed, but not by viewer when viewer data is fetched + String xml = "<Content href=\"http://example.org/proxied.php\" " + + "authz=\"SIGNED\" sign_viewer=\"false\">" + + "<ViewerRequest xmlns=\"" + PipelinedData.OPENSOCIAL_NAMESPACE + "\" " + + " key=\"key\"" + + " fields=\"name,id\"" + + "/></Content>"; + new View("test", Arrays.asList(XmlUtil.parse(xml)), SPEC_URL); + } }
