You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@shindig.apache.org by Ian Boston <ie...@tfd.co.uk> on 2008/07/27 23:21:30 UTC

Re: svn commit: r679724 - in /incubator/shindig/trunk/java/server/src/test: java/org/apache/shindig/server/endtoend/ resources/endtoend/

Ooops, yes sorry, absolutely, (And big sorry Adam)

Should I edit the log message or leave as it is ?

Ian

On 25 Jul 2008, at 15:36, Cassie wrote:

> Ian - Thanks for committing this.
> In the future it would be great to add the patch providers name to the
> commit log, like:
>
> "SHINDIG-473.
> Patch by Adam Winer. Adds more end to end tests etc etc"
>
> - Cassie
>
>
> On Fri, Jul 25, 2008 at 2:24 AM, <ie...@apache.org> wrote:
>
>> Author: ieb
>> Date: Fri Jul 25 02:24:22 2008
>> New Revision: 679724
>>
>> URL: http://svn.apache.org/viewvc?rev=679724&view=rev
>> Log:
>> SHINDIG-473
>>
>> Applied patch after moving EndToEndTests to EndToEndTest
>>
>> Added:
>>
>>  incubator/shindig/trunk/java/server/src/test/java/org/apache/ 
>> shindig/server/endtoend/EndToEndServer.java
>>
>>  incubator/shindig/trunk/java/server/src/test/java/org/apache/ 
>> shindig/server/endtoend/EndToEndTest.java
>>
>>  incubator/shindig/trunk/java/server/src/test/resources/endtoend/ 
>> errorTest.xml
>>
>>  incubator/shindig/trunk/java/server/src/test/resources/endtoend/ 
>> fetchPeopleTest.xml
>> Removed:
>>
>>  incubator/shindig/trunk/java/server/src/test/java/org/apache/ 
>> shindig/server/endtoend/EndToEndTests.java
>>
>>  incubator/shindig/trunk/java/server/src/test/java/org/apache/ 
>> shindig/server/endtoend/FetchPersonTest.java
>> Modified:
>>
>>  incubator/shindig/trunk/java/server/src/test/resources/endtoend/ 
>> fetchPersonTest.xml
>>
>>  incubator/shindig/trunk/java/server/src/test/resources/endtoend/ 
>> testframework.js
>>
>> Added:
>> incubator/shindig/trunk/java/server/src/test/java/org/apache/ 
>> shindig/server/endtoend/EndToEndServer.java
>> URL:
>> http://svn.apache.org/viewvc/incubator/shindig/trunk/java/server/ 
>> src/test/java/org/apache/shindig/server/endtoend/ 
>> EndToEndServer.java?rev=679724&view=auto
>>
>> ===================================================================== 
>> =========
>> ---
>> incubator/shindig/trunk/java/server/src/test/java/org/apache/ 
>> shindig/server/endtoend/EndToEndServer.java
>> (added)
>> +++
>> incubator/shindig/trunk/java/server/src/test/java/org/apache/ 
>> shindig/server/endtoend/EndToEndServer.java
>> Fri Jul 25 02:24:22 2008
>> @@ -0,0 +1,156 @@
>> +/*
>> + * 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.server.endtoend;
>> +
>> +import com.google.common.base.Join;
>> +import com.google.common.collect.Maps;
>> +
>> +import  
>> org.apache.shindig.common.servlet.GuiceServletContextListener;
>> +import org.apache.shindig.gadgets.servlet.ConcatProxyServlet;
>> +import org.apache.shindig.gadgets.servlet.GadgetRenderingServlet;
>> +import org.apache.shindig.gadgets.servlet.HttpGuiceModule;
>> +import  
>> org.apache.shindig.social.opensocial.service.DataServiceServlet;
>> +import org.mortbay.jetty.Server;
>> +import org.mortbay.jetty.handler.ResourceHandler;
>> +import org.mortbay.jetty.servlet.Context;
>> +import org.mortbay.jetty.servlet.ServletHolder;
>> +import org.mortbay.resource.Resource;
>> +
>> +import java.io.IOException;
>> +import java.net.URL;
>> +import java.util.Map;
>> +
>> +import javax.servlet.Servlet;
>> +import javax.servlet.ServletConfig;
>> +import javax.servlet.ServletException;
>> +import javax.servlet.ServletRequest;
>> +import javax.servlet.ServletResponse;
>> +import javax.servlet.http.HttpServletResponse;
>> +
>> +/**
>> + * Suite for running the end-to-end tests. The suite is  
>> responsible for
>> starting up and shutting
>> + * down the server.
>> + */
>> +public class EndToEndServer {
>> +  private static final int JETTY_PORT = 9003;
>> +  private static final String GADGET_BASE = "/gadgets/ifr";
>> +  private static final String JSON_BASE = "/social/rest/*";
>> +  private static final String CONCAT_BASE = "/gadgets/concat";
>> +  public static final String SERVER_URL = "http://localhost:" +
>> JETTY_PORT;
>> +  public static final String GADGET_BASEURL = SERVER_URL +  
>> GADGET_BASE;
>> +
>> +  private final Server server;
>> +
>> +  /** Fake error code for data service servlet request */
>> +  private int errorCode;
>> +
>> +  /** Fake error message for data service servlet request */
>> +  private String errorMessage;
>> +
>> +  public EndToEndServer() throws Exception {
>> +    server = createServer(JETTY_PORT);
>> +  }
>> +
>> +  public void start() throws Exception {
>> +    server.start();
>> +  }
>> +
>> +  public void stop() throws Exception {
>> +    server.stop();
>> +  }
>> +
>> +  public void clearDataServiceError() {
>> +    errorCode = 0;
>> +  }
>> +
>> +  public void setDataServiceError(int errorCode, String  
>> errorMessage) {
>> +    this.errorCode = errorCode;
>> +    this.errorMessage = errorMessage;
>> +  }
>> +
>> +  /**
>> +   * Starts the server for end-to-end tests.
>> +   */
>> +  private Server createServer(int port) throws Exception {
>> +    Server newServer = new Server(port);
>> +
>> +    // Attach the test resources in /endtoend as static content  
>> for the
>> test
>> +    ResourceHandler resources = new ResourceHandler();
>> +    URL resource = EndToEndTest.class.getResource("/endtoend");
>> +    resources.setBaseResource(Resource.newResource(resource));
>> +    newServer.addHandler(resources);
>> +
>> +    Context context = new Context(newServer, "/", Context.SESSIONS);
>> +    context.addEventListener(new GuiceServletContextListener());
>> +
>> +    Map<String, String> initParams = Maps.newHashMap();
>> +    String modules = Join
>> +        .join(":", EndToEndModule.class.getName(),
>> HttpGuiceModule.class.getName());
>> +
>> +    initParams.put(GuiceServletContextListener.MODULES_ATTRIBUTE,
>> modules);
>> +    context.setInitParams(initParams);
>> +
>> +    // Attach the gadget rendering servlet
>> +    ServletHolder gadgetServletHolder = new ServletHolder(new
>> GadgetRenderingServlet());
>> +    context.addServlet(gadgetServletHolder, GADGET_BASE);
>> +
>> +    // Attach DataServiceServlet, wrapped in a proxy to fake errors
>> +    ServletHolder jsonServletHolder = new ServletHolder(new
>> ForceErrorServlet(
>> +        new DataServiceServlet()));
>> +    context.addServlet(jsonServletHolder, JSON_BASE);
>> +
>> +    // Attach the ConcatProxyServlet - needed for
>> +    ServletHolder concatHolder = new ServletHolder(new
>> ConcatProxyServlet());
>> +    context.addServlet(concatHolder, CONCAT_BASE);
>> +
>> +    return newServer;
>> +  }
>> +
>> +  private class ForceErrorServlet implements Servlet {
>> +    private final Servlet proxiedServlet;
>> +
>> +    public ForceErrorServlet(Servlet proxiedServlet) {
>> +      this.proxiedServlet = proxiedServlet;
>> +    }
>> +
>> +    public void init(ServletConfig servletConfig) throws  
>> ServletException
>> {
>> +      proxiedServlet.init(servletConfig);
>> +    }
>> +
>> +    public ServletConfig getServletConfig() {
>> +      return proxiedServlet.getServletConfig();
>> +    }
>> +
>> +    public void service(ServletRequest servletRequest,  
>> ServletResponse
>> servletResponse)
>> +        throws ServletException, IOException {
>> +      if (errorCode > 0) {
>> +        ((HttpServletResponse) servletResponse).sendError(errorCode,
>> errorMessage);
>> +      } else {
>> +        proxiedServlet.service(servletRequest, servletResponse);
>> +      }
>> +    }
>> +
>> +    public String getServletInfo() {
>> +      return proxiedServlet.getServletInfo();
>> +    }
>> +
>> +    public void destroy() {
>> +      proxiedServlet.destroy();
>> +    }
>> +  }
>> +}
>>
>> Added:
>> incubator/shindig/trunk/java/server/src/test/java/org/apache/ 
>> shindig/server/endtoend/EndToEndTest.java
>> URL:
>> http://svn.apache.org/viewvc/incubator/shindig/trunk/java/server/ 
>> src/test/java/org/apache/shindig/server/endtoend/EndToEndTest.java? 
>> rev=679724&view=auto
>>
>> ===================================================================== 
>> =========
>> ---
>> incubator/shindig/trunk/java/server/src/test/java/org/apache/ 
>> shindig/server/endtoend/EndToEndTest.java
>> (added)
>> +++
>> incubator/shindig/trunk/java/server/src/test/java/org/apache/ 
>> shindig/server/endtoend/EndToEndTest.java
>> Fri Jul 25 02:24:22 2008
>> @@ -0,0 +1,161 @@
>> +/*
>> + * 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.server.endtoend;
>> +
>> +import com.gargoylesoftware.htmlunit.CollectingAlertHandler;
>> +import  
>> com.gargoylesoftware.htmlunit.NicelyResynchronizingAjaxController;
>> +import com.gargoylesoftware.htmlunit.WebClient;
>> +import com.gargoylesoftware.htmlunit.html.HtmlPage;
>> +
>> +import org.apache.shindig.common.BasicSecurityToken;
>> +import org.apache.shindig.common.BasicSecurityTokenDecoder;
>> +import org.apache.shindig.common.SecurityToken;
>> +import org.apache.shindig.common.crypto.BlobCrypterException;
>> +import org.junit.After;
>> +import org.junit.AfterClass;
>> +import static org.junit.Assert.assertEquals;
>> +import static org.junit.Assert.assertFalse;
>> +import static org.junit.Assert.assertNull;
>> +import org.junit.Before;
>> +import org.junit.BeforeClass;
>> +import org.junit.Test;
>> +
>> +import java.io.IOException;
>> +import java.net.URLEncoder;
>> +
>> +import javax.servlet.http.HttpServletResponse;
>> +
>> +/**
>> + * Base class for end-to-end tests.
>> + */
>> +public class EndToEndTest {
>> +  static private EndToEndServer server = null;
>> +
>> +  private WebClient webClient;
>> +  private CollectingAlertHandler alertHandler;
>> +  private SecurityToken token;
>> +
>> +  @Test
>> +  public void fetchPerson() throws Exception {
>> +    executeAllPageTests("fetchPersonTest");
>> +  }
>> +
>> +  @Test
>> +  public void fetchPeople() throws Exception {
>> +    executeAllPageTests("fetchPeopleTest");
>> +  }
>> +
>> +  @Test
>> +  public void notFoundError() throws Exception {
>> +    server.setDataServiceError(HttpServletResponse.SC_NOT_FOUND,  
>> "Not
>> Found");
>> +    executePageTest("errorTest", "notFoundError");
>> +  }
>> +
>> +  @Test
>> +  public void badRequest() throws Exception {
>> +    server.setDataServiceError 
>> (HttpServletResponse.SC_BAD_REQUEST, "Bad
>> Request");
>> +    executePageTest("errorTest", "badRequestError");
>> +  }
>> +
>> +  @Test
>> +  public void internalError() throws Exception {
>> +
>>  server.setDataServiceError 
>> (HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
>> "Internal Server Error");
>> +    executePageTest("errorTest", "internalError");
>> +  }
>> +
>> +  @BeforeClass
>> +  public static void setUpOnce() throws Exception {
>> +    server = new EndToEndServer();
>> +    server.start();
>> +  }
>> +
>> +  @AfterClass
>> +  public static void tearDownOnce() throws Exception {
>> +    server.stop();
>> +  }
>> +
>> +  @Before
>> +  public void setUp() throws Exception {
>> +    webClient = new WebClient();
>> +    // NicelyResynchronizingAjaxController changes XHR calls from
>> asynchronous
>> +    // to synchronous, saving the test from needing to wait or  
>> sleep for
>> XHR
>> +    // completion.
>> +    webClient.setAjaxController(new
>> NicelyResynchronizingAjaxController());
>> +    alertHandler = new CollectingAlertHandler();
>> +    webClient.setAlertHandler(alertHandler);
>> +    token = createToken("canonical", "john.doe");
>> +  }
>> +
>> +  @After
>> +  public void tearDown() {
>> +    server.clearDataServiceError();
>> +  }
>> +
>> +  /**
>> +   * Verify that the Javascript completed running.  This ensures  
>> that
>> +   * logic errors or exceptions don't get treated as success.
>> +   */
>> +  @After
>> +  public void verifyTestsFinished() {
>> +    // Verify the format of the alerts - test method names  
>> followed by
>> "finished"
>> +    String testMethod = null;
>> +    for (String alert : alertHandler.getCollectedAlerts()) {
>> +      if (testMethod == null) {
>> +        assertFalse("Test method omitted", "FINISHED".equals 
>> (alert));
>> +        testMethod = alert;
>> +      } else {
>> +        assertEquals("test method " + testMethod + " did not  
>> finish",
>> "FINISHED", alert);
>> +        testMethod = null;
>> +      }
>> +    }
>> +
>> +    assertNull("test method " + testMethod + " did not finish",
>> testMethod);
>> +  }
>> +
>> +  /**
>> +   * Executes a page test by loading the HTML page.
>> +   * @param testName name of the test, which must match a gadget  
>> XML file
>> +   *     name in test/resources/endtoend (minus .xml).
>> +   * @param testMethod name of the javascript method to execute
>> +   * @return the parsed HTML page
>> +   */
>> +  private HtmlPage executePageTest(String testName, String  
>> testMethod)
>> +      throws IOException {
>> +    String gadgetUrl = EndToEndServer.SERVER_URL + "/" + testName +
>> ".xml";
>> +    String url = EndToEndServer.GADGET_BASEURL + "?url=" +
>> URLEncoder.encode(gadgetUrl, "UTF-8");
>> +    BasicSecurityTokenDecoder decoder = new  
>> BasicSecurityTokenDecoder();
>> +    url += "&st=" + URLEncoder.encode(decoder.encodeToken(token),
>> "UTF-8");
>> +    url += "&testMethod=" + URLEncoder.encode(testMethod, "UTF-8");
>> +    return (HtmlPage) webClient.getPage(url);
>> +  }
>> +
>> +  /**
>> +   * Executes all page test in a single XML file.
>> +   * @param testName name of the test, which must match a gadget  
>> XML file
>> +   *     name in test/resources/endtoend (minus .xml).
>> +   * @throws IOException
>> +   */
>> +  private void executeAllPageTests(String testName) throws  
>> IOException {
>> +    executePageTest(testName, "all");
>> +  }
>> +
>> +  private BasicSecurityToken createToken(String owner, String  
>> viewer)
>> +      throws BlobCrypterException {
>> +    return new BasicSecurityToken(owner, viewer, "test", "domain",
>> "appUrl", "1");
>> +  }
>> +}
>>
>> Added:
>> incubator/shindig/trunk/java/server/src/test/resources/endtoend/ 
>> errorTest.xml
>> URL:
>> http://svn.apache.org/viewvc/incubator/shindig/trunk/java/server/ 
>> src/test/resources/endtoend/errorTest.xml?rev=679724&view=auto
>>
>> ===================================================================== 
>> =========
>> ---
>> incubator/shindig/trunk/java/server/src/test/resources/endtoend/ 
>> errorTest.xml
>> (added)
>> +++
>> incubator/shindig/trunk/java/server/src/test/resources/endtoend/ 
>> errorTest.xml
>> Fri Jul 25 02:24:22 2008
>> @@ -0,0 +1,71 @@
>> +<?xml version="1.0" encoding="UTF-8"?>
>> +<!--
>> +  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.
>> +-->
>> +<Module>
>> +  <ModulePrefs title="EndToEndTest">
>> +    <Require feature="opensocial-0.8" />
>> +    <Require feature="views" />
>> +  </ModulePrefs>
>> +  <Content type="html">
>> +    <![CDATA[
>> +      <script type="text/javascript" src="testframework.js"></ 
>> script>
>> +      <script type="text/javascript">
>> +
>> +        var tests = {
>> +          /** Test 404 */
>> +          notFoundError: function() {
>> +            errorTestCase(404,  
>> opensocial.ResponseItem.Error.BAD_REQUEST);
>> +          },
>> +
>> +          /** Test 400 */
>> +          badRequestError: function() {
>> +            errorTestCase(400,  
>> opensocial.ResponseItem.Error.BAD_REQUEST);
>> +          },
>> +
>> +          /** Test 500 */
>> +          internalError: function() {
>> +            errorTestCase(500,
>> opensocial.ResponseItem.Error.INTERNAL_ERROR);
>> +          }
>> +        };
>> +
>> +
>> +        /** Test a single error code case */
>> +        function errorTestCase(httpCode, errorCode) {
>> +          var req = opensocial.newDataRequest();
>> +
>> +          // Request the "canonical" viewer
>> +          req.add(req.newFetchPersonRequest("canonical"),  
>> "canonical");
>> +
>> +          function receivedData(response) {
>> +            assertTrue("Expecting error", response.hadError());
>> +            var dataItem = response.get("canonical");
>> +            assertFalse("Expecting data item", dataItem ==  
>> undefined);
>> +            assertTrue("Expecting item error", dataItem.hadError());
>> +            assertEquals("Mismatched error code", errorCode,
>> dataItem.getErrorCode());
>> +
>> +            finished();
>> +          }
>> +
>> +          // Send the request
>> +          req.send(receivedData);
>> +        }
>> +      </script>
>> +    ]]>
>> +  </Content>
>> +</Module>
>>
>> Added:
>> incubator/shindig/trunk/java/server/src/test/resources/endtoend/ 
>> fetchPeopleTest.xml
>> URL:
>> http://svn.apache.org/viewvc/incubator/shindig/trunk/java/server/ 
>> src/test/resources/endtoend/fetchPeopleTest.xml?rev=679724&view=auto
>>
>> ===================================================================== 
>> =========
>> ---
>> incubator/shindig/trunk/java/server/src/test/resources/endtoend/ 
>> fetchPeopleTest.xml
>> (added)
>> +++
>> incubator/shindig/trunk/java/server/src/test/resources/endtoend/ 
>> fetchPeopleTest.xml
>> Fri Jul 25 02:24:22 2008
>> @@ -0,0 +1,78 @@
>> +<?xml version="1.0" encoding="UTF-8"?>
>> +<!--
>> +  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.
>> +-->
>> +<Module>
>> +  <ModulePrefs title="EndToEndTest">
>> +    <Require feature="opensocial-0.8" />
>> +    <Require feature="views" />
>> +  </ModulePrefs>
>> +  <Content type="html">
>> +    <![CDATA[
>> +      <script type="text/javascript" src="testframework.js"></ 
>> script>
>> +      <script type="text/javascript">
>> +
>> +        var tests = {
>> +          /** Test fetching the owner's friends, which should be
>> 'canonical' */
>> +          fetchOwnerFriends: function() {
>> +            var req = opensocial.newDataRequest();
>> +
>> +            var idSpec = opensocial.newIdSpec({userId :
>> opensocial.IdSpec.PersonId.OWNER,
>> +                groupId : 'FRIENDS'})
>> +            req.add(req.newFetchPeopleRequest(idSpec),  
>> 'ownerFriends');
>> +            function receivedData(response) {
>> +              var ownerFriends = getAndCheckError(response,
>> 'ownerFriends');
>> +              assertEquals('Wrong friend count', 4,  
>> ownerFriends.size());
>> +
>> +              var johnDoe = ownerFriends.getById('john.doe');
>> +              assertEquals('Wrong name for john doe', 'John Doe',
>> johnDoe.getDisplayName());
>> +              finished();
>> +            }
>> +
>> +            // Send the request
>> +            req.send(receivedData);
>> +          },
>> +
>> +          /** Test fetching 'maija.m' friends, of which there are  
>> none */
>> +          fetchEmptyFriendsById: function() {
>> +            var req = opensocial.newDataRequest();
>> +
>> +            var idSpec = opensocial.newIdSpec({userId :  
>> 'maija.m', groupId
>> : 'FRIENDS'})
>> +            req.add(req.newFetchPeopleRequest(idSpec), 'idFriends');
>> +            function receivedData(response) {
>> +              var ownerFriends = getAndCheckError(response,  
>> 'idFriends');
>> +              assertEquals('Wrong friend count', 0,  
>> ownerFriends.size());
>> +              finished();
>> +            }
>> +
>> +            // Send the request
>> +            req.send(receivedData);
>> +          }
>> +        };
>> +
>> +
>> +        function getAndCheckError(response, key) {
>> +          assertFalse('Data error', response.hadError());
>> +          var dataItem = response.get(key);
>> +          assertFalse('Data item error for ' + key,  
>> dataItem.hadError());
>> +          return dataItem.getData();
>> +        }
>> +      </script>
>> +    ]]>
>> +  </Content>
>> +</Module>
>>
>> Modified:
>> incubator/shindig/trunk/java/server/src/test/resources/endtoend/ 
>> fetchPersonTest.xml
>> URL:
>> http://svn.apache.org/viewvc/incubator/shindig/trunk/java/server/ 
>> src/test/resources/endtoend/fetchPersonTest.xml? 
>> rev=679724&r1=679723&r2=679724&view=diff
>>
>> ===================================================================== 
>> =========
>> ---
>> incubator/shindig/trunk/java/server/src/test/resources/endtoend/ 
>> fetchPersonTest.xml
>> (original)
>> +++
>> incubator/shindig/trunk/java/server/src/test/resources/endtoend/ 
>> fetchPersonTest.xml
>> Fri Jul 25 02:24:22 2008
>> @@ -26,61 +26,86 @@
>>     <![CDATA[
>>       <script type="text/javascript" src="testframework.js"></script>
>>       <script type="text/javascript">
>> +        var tests = {
>> +          /** Test fetching a specific ID */
>> +          fetchId: function() {
>> +            var req = opensocial.newDataRequest();
>> +
>> +            // Request the "canonical" viewer
>> +            req.add(req.newFetchPersonRequest("canonical"),  
>> "canonical");
>> +
>> +            function receivedData(response) {
>> +              var user = getAndCheckError(response, "canonical");
>> +              assertEquals("Names don't match",
>> +                "Sir Shin H. Digg Social Butterfly",
>> user.getDisplayName());
>> +              finished();
>> +            }
>> +
>> +            // Send the request
>> +            req.send(receivedData);
>> +          },
>> +
>> +          /** Test fetching the owner, which should be  
>> "canonical" */
>> +          fetchOwner: function() {
>> +            var req = opensocial.newDataRequest();
>> +
>> +            // Request the "canonical" viewer
>> +
>>  req.add(req.newFetchPersonRequest(opensocial.IdSpec.PersonId.OWNER),
>> "owner");
>> +
>> +            function receivedData(response) {
>> +              var user = getAndCheckError(response, "owner");
>> +              assertEquals("Names don't match",
>> +                "Sir Shin H. Digg Social Butterfly",
>> user.getDisplayName());
>> +              finished();
>> +            }
>> +
>> +            // Send the request
>> +            req.send(receivedData);
>> +          },
>> +
>> +          /** Test fetching the viewer, which should be  
>> "john.doe" */
>> +          fetchViewer: function() {
>> +            var req = opensocial.newDataRequest();
>> +
>> +            // Request the "canonical" viewer
>> +
>>  req.add(req.newFetchPersonRequest 
>> (opensocial.IdSpec.PersonId.VIEWER),
>> "viewer");
>> +
>> +            function receivedData(response) {
>> +              var user = getAndCheckError(response, "viewer");
>> +              assertEquals("Names don't match",
>> +                "John Doe", user.getDisplayName());
>> +
>> +              finished();
>> +            }
>> +
>> +            // Send the request
>> +            req.send(receivedData);
>> +          },
>> +
>> +          /** Test fetching the owner and viewer as a batch */
>> +          fetchOwnerAndViewer: function() {
>> +            var req = opensocial.newDataRequest();
>> +
>> +            // Request the "canonical" viewer
>> +
>>  req.add(req.newFetchPersonRequest(opensocial.IdSpec.PersonId.OWNER),
>> "owner");
>> +
>>  req.add(req.newFetchPersonRequest 
>> (opensocial.IdSpec.PersonId.VIEWER),
>> "viewer");
>> +
>> +            function receivedData(response) {
>> +              var user = getAndCheckError(response, "owner");
>> +              assertEquals("Names don't match",
>> +                "Sir Shin H. Digg Social Butterfly",
>> user.getDisplayName());
>> +
>> +              user = getAndCheckError(response, "viewer");
>> +              assertEquals("Names don't match",
>> +                "John Doe", user.getDisplayName());
>> +              finished();
>> +            }
>>
>> -        /** Test fetching a specific ID */
>> -        function fetchId() {
>> -          var req = opensocial.newDataRequest();
>> -
>> -          // Request the "canonical" viewer
>> -          req.add(req.newFetchPersonRequest("canonical"),  
>> "canonical");
>> -
>> -          function receivedData(response) {
>> -            var user = getAndCheckError(response, "canonical");
>> -            assertEquals("Names don't match",
>> -              "Sir Shin H. Digg Social Butterfly",  
>> user.getDisplayName());
>> -            testFinished();
>> +            // Send the request
>> +            req.send(receivedData);
>>           }
>> -
>> -          // Send the request
>> -          req.send(receivedData);
>> -        }
>> -
>> -        /** Test fetching the owner, which should be "canonical" */
>> -        function fetchOwner() {
>> -          var req = opensocial.newDataRequest();
>> -
>> -          // Request the "canonical" viewer
>> -
>>  req.add(req.newFetchPersonRequest(opensocial.IdSpec.PersonId.OWNER),
>> "owner");
>> -
>> -          function receivedData(response) {
>> -            var user = getAndCheckError(response, "owner");
>> -            assertEquals("Names don't match",
>> -              "Sir Shin H. Digg Social Butterfly",  
>> user.getDisplayName());
>> -            testFinished();
>> -          }
>> -
>> -          // Send the request
>> -          req.send(receivedData);
>> -        }
>> -
>> -        /** Test fetching the viewer, which should be "john.doe" */
>> -        function fetchViewer() {
>> -          var req = opensocial.newDataRequest();
>> -
>> -          // Request the "canonical" viewer
>> -
>>  req.add(req.newFetchPersonRequest 
>> (opensocial.IdSpec.PersonId.VIEWER),
>> "viewer");
>> -
>> -          function receivedData(response) {
>> -            var user = getAndCheckError(response, "viewer");
>> -            assertEquals("Names don't match",
>> -              "John Doe", user.getDisplayName());
>> -
>> -            testFinished();
>> -          }
>> -
>> -          // Send the request
>> -          req.send(receivedData);
>> -        }
>> +        };
>> +
>>
>>         function getAndCheckError(response, key) {
>>           assertFalse("Data error", response.hadError());
>>
>> Modified:
>> incubator/shindig/trunk/java/server/src/test/resources/endtoend/ 
>> testframework.js
>> URL:
>> http://svn.apache.org/viewvc/incubator/shindig/trunk/java/server/ 
>> src/test/resources/endtoend/testframework.js? 
>> rev=679724&r1=679723&r2=679724&view=diff
>>
>> ===================================================================== 
>> =========
>> ---
>> incubator/shindig/trunk/java/server/src/test/resources/endtoend/ 
>> testframework.js
>> (original)
>> +++
>> incubator/shindig/trunk/java/server/src/test/resources/endtoend/ 
>> testframework.js
>> Fri Jul 25 02:24:22 2008
>> @@ -17,6 +17,8 @@
>>  * under the License.
>>  */
>>
>> +var tests;
>> +
>>  function assertTrue(msg, value) {
>>   if (!value) {
>>     throw "assertTrue() failed: " + msg;
>> @@ -37,11 +39,11 @@
>>  }
>>
>>  /**
>> - * Signals the server code that the test successfully finished.   
>> This
>> - * method must be called to verify that the test completed  
>> successfully,
>> + * Signals the server code that a test successfully finished.  This
>> + * method must be called to verify that a test completed  
>> successfully,
>>  * instead of simply failing to load.
>>  */
>> -function testFinished() {
>> +function finished() {
>>   alert("FINISHED");
>>  }
>>
>> @@ -53,13 +55,28 @@
>>     throw "No testMethod parameter found.";
>>   }
>>
>> -  var testMethodFunction = window[testMethod];
>> -  if (!testMethodFunction) {
>> -    throw "Test method " + testMethod + " not found.";
>> +  // "all": run all the tests
>> +  if ("all" == testMethod) {
>> +    allTests();
>> +  } else {
>> +    // Show an alert for the test method name, identifying what test
>> started.
>> +    alert(testMethod);
>> +
>> +    var testMethodFunction = tests[testMethod];
>> +    if (!testMethodFunction) {
>> +      throw "Test method " + testMethod + " not found.";
>> +    }
>> +
>> +    // Execute the test method
>> +    testMethodFunction();
>>   }
>> +}
>>
>> -  // Execute the test method
>> -  testMethodFunction();
>> +function allTests() {
>> +  for (var testMethod in tests) {
>> +    alert(testMethod);
>> +    tests[testMethod]();
>> +  }
>>  }
>>
>>  gadgets.util.registerOnLoadHandler(executeTest);
>>
>>
>>


Re: svn commit: r679724 - in /incubator/shindig/trunk/java/server/src/test: java/org/apache/shindig/server/endtoend/ resources/endtoend/

Posted by Cassie <do...@apache.org>.
Editing the log message would be great.
Thanks!

- Cassie


On Sun, Jul 27, 2008 at 2:21 PM, Ian Boston <ie...@tfd.co.uk> wrote:

> Ooops, yes sorry, absolutely, (And big sorry Adam)
>
> Should I edit the log message or leave as it is ?
>
> Ian
>
>
> On 25 Jul 2008, at 15:36, Cassie wrote:
>
>  Ian - Thanks for committing this.
>> In the future it would be great to add the patch providers name to the
>> commit log, like:
>>
>> "SHINDIG-473.
>> Patch by Adam Winer. Adds more end to end tests etc etc"
>>
>> - Cassie
>>
>>
>> On Fri, Jul 25, 2008 at 2:24 AM, <ie...@apache.org> wrote:
>>
>>  Author: ieb
>>> Date: Fri Jul 25 02:24:22 2008
>>> New Revision: 679724
>>>
>>> URL: http://svn.apache.org/viewvc?rev=679724&view=rev
>>> Log:
>>> SHINDIG-473
>>>
>>> Applied patch after moving EndToEndTests to EndToEndTest
>>>
>>> Added:
>>>
>>>
>>>  incubator/shindig/trunk/java/server/src/test/java/org/apache/shindig/server/endtoend/EndToEndServer.java
>>>
>>>
>>>  incubator/shindig/trunk/java/server/src/test/java/org/apache/shindig/server/endtoend/EndToEndTest.java
>>>
>>>
>>>  incubator/shindig/trunk/java/server/src/test/resources/endtoend/errorTest.xml
>>>
>>>
>>>  incubator/shindig/trunk/java/server/src/test/resources/endtoend/fetchPeopleTest.xml
>>> Removed:
>>>
>>>
>>>  incubator/shindig/trunk/java/server/src/test/java/org/apache/shindig/server/endtoend/EndToEndTests.java
>>>
>>>
>>>  incubator/shindig/trunk/java/server/src/test/java/org/apache/shindig/server/endtoend/FetchPersonTest.java
>>> Modified:
>>>
>>>
>>>  incubator/shindig/trunk/java/server/src/test/resources/endtoend/fetchPersonTest.xml
>>>
>>>
>>>  incubator/shindig/trunk/java/server/src/test/resources/endtoend/testframework.js
>>>
>>> Added:
>>>
>>> incubator/shindig/trunk/java/server/src/test/java/org/apache/shindig/server/endtoend/EndToEndServer.java
>>> URL:
>>> http://svn.apache.org/viewvc/incubator/shindig/trunk/java/server/
>>> src/test/java/org/apache/shindig/server/endtoend/EndToEndServer.java?rev=679724&view=auto
>>>
>>>
>>> ==============================================================================
>>> ---
>>>
>>> incubator/shindig/trunk/java/server/src/test/java/org/apache/shindig/server/endtoend/EndToEndServer.java
>>> (added)
>>> +++
>>>
>>> incubator/shindig/trunk/java/server/src/test/java/org/apache/shindig/server/endtoend/EndToEndServer.java
>>> Fri Jul 25 02:24:22 2008
>>> @@ -0,0 +1,156 @@
>>> +/*
>>> + * 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.server.endtoend;
>>> +
>>> +import com.google.common.base.Join;
>>> +import com.google.common.collect.Maps;
>>> +
>>> +import org.apache.shindig.common.servlet.GuiceServletContextListener;
>>> +import org.apache.shindig.gadgets.servlet.ConcatProxyServlet;
>>> +import org.apache.shindig.gadgets.servlet.GadgetRenderingServlet;
>>> +import org.apache.shindig.gadgets.servlet.HttpGuiceModule;
>>> +import org.apache.shindig.social.opensocial.service.DataServiceServlet;
>>> +import org.mortbay.jetty.Server;
>>> +import org.mortbay.jetty.handler.ResourceHandler;
>>> +import org.mortbay.jetty.servlet.Context;
>>> +import org.mortbay.jetty.servlet.ServletHolder;
>>> +import org.mortbay.resource.Resource;
>>> +
>>> +import java.io.IOException;
>>> +import java.net.URL;
>>> +import java.util.Map;
>>> +
>>> +import javax.servlet.Servlet;
>>> +import javax.servlet.ServletConfig;
>>> +import javax.servlet.ServletException;
>>> +import javax.servlet.ServletRequest;
>>> +import javax.servlet.ServletResponse;
>>> +import javax.servlet.http.HttpServletResponse;
>>> +
>>> +/**
>>> + * Suite for running the end-to-end tests. The suite is responsible for
>>> starting up and shutting
>>> + * down the server.
>>> + */
>>> +public class EndToEndServer {
>>> +  private static final int JETTY_PORT = 9003;
>>> +  private static final String GADGET_BASE = "/gadgets/ifr";
>>> +  private static final String JSON_BASE = "/social/rest/*";
>>> +  private static final String CONCAT_BASE = "/gadgets/concat";
>>> +  public static final String SERVER_URL = "http://localhost:" +
>>> JETTY_PORT;
>>> +  public static final String GADGET_BASEURL = SERVER_URL + GADGET_BASE;
>>> +
>>> +  private final Server server;
>>> +
>>> +  /** Fake error code for data service servlet request */
>>> +  private int errorCode;
>>> +
>>> +  /** Fake error message for data service servlet request */
>>> +  private String errorMessage;
>>> +
>>> +  public EndToEndServer() throws Exception {
>>> +    server = createServer(JETTY_PORT);
>>> +  }
>>> +
>>> +  public void start() throws Exception {
>>> +    server.start();
>>> +  }
>>> +
>>> +  public void stop() throws Exception {
>>> +    server.stop();
>>> +  }
>>> +
>>> +  public void clearDataServiceError() {
>>> +    errorCode = 0;
>>> +  }
>>> +
>>> +  public void setDataServiceError(int errorCode, String errorMessage) {
>>> +    this.errorCode = errorCode;
>>> +    this.errorMessage = errorMessage;
>>> +  }
>>> +
>>> +  /**
>>> +   * Starts the server for end-to-end tests.
>>> +   */
>>> +  private Server createServer(int port) throws Exception {
>>> +    Server newServer = new Server(port);
>>> +
>>> +    // Attach the test resources in /endtoend as static content for the
>>> test
>>> +    ResourceHandler resources = new ResourceHandler();
>>> +    URL resource = EndToEndTest.class.getResource("/endtoend");
>>> +    resources.setBaseResource(Resource.newResource(resource));
>>> +    newServer.addHandler(resources);
>>> +
>>> +    Context context = new Context(newServer, "/", Context.SESSIONS);
>>> +    context.addEventListener(new GuiceServletContextListener());
>>> +
>>> +    Map<String, String> initParams = Maps.newHashMap();
>>> +    String modules = Join
>>> +        .join(":", EndToEndModule.class.getName(),
>>> HttpGuiceModule.class.getName());
>>> +
>>> +    initParams.put(GuiceServletContextListener.MODULES_ATTRIBUTE,
>>> modules);
>>> +    context.setInitParams(initParams);
>>> +
>>> +    // Attach the gadget rendering servlet
>>> +    ServletHolder gadgetServletHolder = new ServletHolder(new
>>> GadgetRenderingServlet());
>>> +    context.addServlet(gadgetServletHolder, GADGET_BASE);
>>> +
>>> +    // Attach DataServiceServlet, wrapped in a proxy to fake errors
>>> +    ServletHolder jsonServletHolder = new ServletHolder(new
>>> ForceErrorServlet(
>>> +        new DataServiceServlet()));
>>> +    context.addServlet(jsonServletHolder, JSON_BASE);
>>> +
>>> +    // Attach the ConcatProxyServlet - needed for
>>> +    ServletHolder concatHolder = new ServletHolder(new
>>> ConcatProxyServlet());
>>> +    context.addServlet(concatHolder, CONCAT_BASE);
>>> +
>>> +    return newServer;
>>> +  }
>>> +
>>> +  private class ForceErrorServlet implements Servlet {
>>> +    private final Servlet proxiedServlet;
>>> +
>>> +    public ForceErrorServlet(Servlet proxiedServlet) {
>>> +      this.proxiedServlet = proxiedServlet;
>>> +    }
>>> +
>>> +    public void init(ServletConfig servletConfig) throws
>>> ServletException
>>> {
>>> +      proxiedServlet.init(servletConfig);
>>> +    }
>>> +
>>> +    public ServletConfig getServletConfig() {
>>> +      return proxiedServlet.getServletConfig();
>>> +    }
>>> +
>>> +    public void service(ServletRequest servletRequest, ServletResponse
>>> servletResponse)
>>> +        throws ServletException, IOException {
>>> +      if (errorCode > 0) {
>>> +        ((HttpServletResponse) servletResponse).sendError(errorCode,
>>> errorMessage);
>>> +      } else {
>>> +        proxiedServlet.service(servletRequest, servletResponse);
>>> +      }
>>> +    }
>>> +
>>> +    public String getServletInfo() {
>>> +      return proxiedServlet.getServletInfo();
>>> +    }
>>> +
>>> +    public void destroy() {
>>> +      proxiedServlet.destroy();
>>> +    }
>>> +  }
>>> +}
>>>
>>> Added:
>>>
>>> incubator/shindig/trunk/java/server/src/test/java/org/apache/shindig/server/endtoend/EndToEndTest.java
>>> URL:
>>> http://svn.apache.org/viewvc/incubator/shindig/trunk/java/server/
>>> src/test/java/org/apache/shindig/server/endtoend/EndToEndTest.java?rev=679724&view=auto
>>>
>>>
>>> ==============================================================================
>>> ---
>>>
>>> incubator/shindig/trunk/java/server/src/test/java/org/apache/shindig/server/endtoend/EndToEndTest.java
>>> (added)
>>> +++
>>>
>>> incubator/shindig/trunk/java/server/src/test/java/org/apache/shindig/server/endtoend/EndToEndTest.java
>>> Fri Jul 25 02:24:22 2008
>>> @@ -0,0 +1,161 @@
>>> +/*
>>> + * 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.server.endtoend;
>>> +
>>> +import com.gargoylesoftware.htmlunit.CollectingAlertHandler;
>>> +import
>>> com.gargoylesoftware.htmlunit.NicelyResynchronizingAjaxController;
>>> +import com.gargoylesoftware.htmlunit.WebClient;
>>> +import com.gargoylesoftware.htmlunit.html.HtmlPage;
>>> +
>>> +import org.apache.shindig.common.BasicSecurityToken;
>>> +import org.apache.shindig.common.BasicSecurityTokenDecoder;
>>> +import org.apache.shindig.common.SecurityToken;
>>> +import org.apache.shindig.common.crypto.BlobCrypterException;
>>> +import org.junit.After;
>>> +import org.junit.AfterClass;
>>> +import static org.junit.Assert.assertEquals;
>>> +import static org.junit.Assert.assertFalse;
>>> +import static org.junit.Assert.assertNull;
>>> +import org.junit.Before;
>>> +import org.junit.BeforeClass;
>>> +import org.junit.Test;
>>> +
>>> +import java.io.IOException;
>>> +import java.net.URLEncoder;
>>> +
>>> +import javax.servlet.http.HttpServletResponse;
>>> +
>>> +/**
>>> + * Base class for end-to-end tests.
>>> + */
>>> +public class EndToEndTest {
>>> +  static private EndToEndServer server = null;
>>> +
>>> +  private WebClient webClient;
>>> +  private CollectingAlertHandler alertHandler;
>>> +  private SecurityToken token;
>>> +
>>> +  @Test
>>> +  public void fetchPerson() throws Exception {
>>> +    executeAllPageTests("fetchPersonTest");
>>> +  }
>>> +
>>> +  @Test
>>> +  public void fetchPeople() throws Exception {
>>> +    executeAllPageTests("fetchPeopleTest");
>>> +  }
>>> +
>>> +  @Test
>>> +  public void notFoundError() throws Exception {
>>> +    server.setDataServiceError(HttpServletResponse.SC_NOT_FOUND, "Not
>>> Found");
>>> +    executePageTest("errorTest", "notFoundError");
>>> +  }
>>> +
>>> +  @Test
>>> +  public void badRequest() throws Exception {
>>> +    server.setDataServiceError(HttpServletResponse.SC_BAD_REQUEST, "Bad
>>> Request");
>>> +    executePageTest("errorTest", "badRequestError");
>>> +  }
>>> +
>>> +  @Test
>>> +  public void internalError() throws Exception {
>>> +
>>>  server.setDataServiceError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
>>> "Internal Server Error");
>>> +    executePageTest("errorTest", "internalError");
>>> +  }
>>> +
>>> +  @BeforeClass
>>> +  public static void setUpOnce() throws Exception {
>>> +    server = new EndToEndServer();
>>> +    server.start();
>>> +  }
>>> +
>>> +  @AfterClass
>>> +  public static void tearDownOnce() throws Exception {
>>> +    server.stop();
>>> +  }
>>> +
>>> +  @Before
>>> +  public void setUp() throws Exception {
>>> +    webClient = new WebClient();
>>> +    // NicelyResynchronizingAjaxController changes XHR calls from
>>> asynchronous
>>> +    // to synchronous, saving the test from needing to wait or sleep for
>>> XHR
>>> +    // completion.
>>> +    webClient.setAjaxController(new
>>> NicelyResynchronizingAjaxController());
>>> +    alertHandler = new CollectingAlertHandler();
>>> +    webClient.setAlertHandler(alertHandler);
>>> +    token = createToken("canonical", "john.doe");
>>> +  }
>>> +
>>> +  @After
>>> +  public void tearDown() {
>>> +    server.clearDataServiceError();
>>> +  }
>>> +
>>> +  /**
>>> +   * Verify that the Javascript completed running.  This ensures that
>>> +   * logic errors or exceptions don't get treated as success.
>>> +   */
>>> +  @After
>>> +  public void verifyTestsFinished() {
>>> +    // Verify the format of the alerts - test method names followed by
>>> "finished"
>>> +    String testMethod = null;
>>> +    for (String alert : alertHandler.getCollectedAlerts()) {
>>> +      if (testMethod == null) {
>>> +        assertFalse("Test method omitted", "FINISHED".equals(alert));
>>> +        testMethod = alert;
>>> +      } else {
>>> +        assertEquals("test method " + testMethod + " did not finish",
>>> "FINISHED", alert);
>>> +        testMethod = null;
>>> +      }
>>> +    }
>>> +
>>> +    assertNull("test method " + testMethod + " did not finish",
>>> testMethod);
>>> +  }
>>> +
>>> +  /**
>>> +   * Executes a page test by loading the HTML page.
>>> +   * @param testName name of the test, which must match a gadget XML
>>> file
>>> +   *     name in test/resources/endtoend (minus .xml).
>>> +   * @param testMethod name of the javascript method to execute
>>> +   * @return the parsed HTML page
>>> +   */
>>> +  private HtmlPage executePageTest(String testName, String testMethod)
>>> +      throws IOException {
>>> +    String gadgetUrl = EndToEndServer.SERVER_URL + "/" + testName +
>>> ".xml";
>>> +    String url = EndToEndServer.GADGET_BASEURL + "?url=" +
>>> URLEncoder.encode(gadgetUrl, "UTF-8");
>>> +    BasicSecurityTokenDecoder decoder = new BasicSecurityTokenDecoder();
>>> +    url += "&st=" + URLEncoder.encode(decoder.encodeToken(token),
>>> "UTF-8");
>>> +    url += "&testMethod=" + URLEncoder.encode(testMethod, "UTF-8");
>>> +    return (HtmlPage) webClient.getPage(url);
>>> +  }
>>> +
>>> +  /**
>>> +   * Executes all page test in a single XML file.
>>> +   * @param testName name of the test, which must match a gadget XML
>>> file
>>> +   *     name in test/resources/endtoend (minus .xml).
>>> +   * @throws IOException
>>> +   */
>>> +  private void executeAllPageTests(String testName) throws IOException {
>>> +    executePageTest(testName, "all");
>>> +  }
>>> +
>>> +  private BasicSecurityToken createToken(String owner, String viewer)
>>> +      throws BlobCrypterException {
>>> +    return new BasicSecurityToken(owner, viewer, "test", "domain",
>>> "appUrl", "1");
>>> +  }
>>> +}
>>>
>>> Added:
>>>
>>> incubator/shindig/trunk/java/server/src/test/resources/endtoend/errorTest.xml
>>> URL:
>>> http://svn.apache.org/viewvc/incubator/shindig/trunk/java/server/
>>> src/test/resources/endtoend/errorTest.xml?rev=679724&view=auto
>>>
>>>
>>> ==============================================================================
>>> ---
>>>
>>> incubator/shindig/trunk/java/server/src/test/resources/endtoend/errorTest.xml
>>> (added)
>>> +++
>>>
>>> incubator/shindig/trunk/java/server/src/test/resources/endtoend/errorTest.xml
>>> Fri Jul 25 02:24:22 2008
>>> @@ -0,0 +1,71 @@
>>> +<?xml version="1.0" encoding="UTF-8"?>
>>> +<!--
>>> +  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.
>>> +-->
>>> +<Module>
>>> +  <ModulePrefs title="EndToEndTest">
>>> +    <Require feature="opensocial-0.8" />
>>> +    <Require feature="views" />
>>> +  </ModulePrefs>
>>> +  <Content type="html">
>>> +    <![CDATA[
>>> +      <script type="text/javascript" src="testframework.js"></script>
>>> +      <script type="text/javascript">
>>> +
>>> +        var tests = {
>>> +          /** Test 404 */
>>> +          notFoundError: function() {
>>> +            errorTestCase(404,
>>> opensocial.ResponseItem.Error.BAD_REQUEST);
>>> +          },
>>> +
>>> +          /** Test 400 */
>>> +          badRequestError: function() {
>>> +            errorTestCase(400,
>>> opensocial.ResponseItem.Error.BAD_REQUEST);
>>> +          },
>>> +
>>> +          /** Test 500 */
>>> +          internalError: function() {
>>> +            errorTestCase(500,
>>> opensocial.ResponseItem.Error.INTERNAL_ERROR);
>>> +          }
>>> +        };
>>> +
>>> +
>>> +        /** Test a single error code case */
>>> +        function errorTestCase(httpCode, errorCode) {
>>> +          var req = opensocial.newDataRequest();
>>> +
>>> +          // Request the "canonical" viewer
>>> +          req.add(req.newFetchPersonRequest("canonical"), "canonical");
>>> +
>>> +          function receivedData(response) {
>>> +            assertTrue("Expecting error", response.hadError());
>>> +            var dataItem = response.get("canonical");
>>> +            assertFalse("Expecting data item", dataItem == undefined);
>>> +            assertTrue("Expecting item error", dataItem.hadError());
>>> +            assertEquals("Mismatched error code", errorCode,
>>> dataItem.getErrorCode());
>>> +
>>> +            finished();
>>> +          }
>>> +
>>> +          // Send the request
>>> +          req.send(receivedData);
>>> +        }
>>> +      </script>
>>> +    ]]>
>>> +  </Content>
>>> +</Module>
>>>
>>> Added:
>>>
>>> incubator/shindig/trunk/java/server/src/test/resources/endtoend/fetchPeopleTest.xml
>>> URL:
>>> http://svn.apache.org/viewvc/incubator/shindig/trunk/java/server/
>>> src/test/resources/endtoend/fetchPeopleTest.xml?rev=679724&view=auto
>>>
>>>
>>> ==============================================================================
>>> ---
>>>
>>> incubator/shindig/trunk/java/server/src/test/resources/endtoend/fetchPeopleTest.xml
>>> (added)
>>> +++
>>>
>>> incubator/shindig/trunk/java/server/src/test/resources/endtoend/fetchPeopleTest.xml
>>> Fri Jul 25 02:24:22 2008
>>> @@ -0,0 +1,78 @@
>>> +<?xml version="1.0" encoding="UTF-8"?>
>>> +<!--
>>> +  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.
>>> +-->
>>> +<Module>
>>> +  <ModulePrefs title="EndToEndTest">
>>> +    <Require feature="opensocial-0.8" />
>>> +    <Require feature="views" />
>>> +  </ModulePrefs>
>>> +  <Content type="html">
>>> +    <![CDATA[
>>> +      <script type="text/javascript" src="testframework.js"></script>
>>> +      <script type="text/javascript">
>>> +
>>> +        var tests = {
>>> +          /** Test fetching the owner's friends, which should be
>>> 'canonical' */
>>> +          fetchOwnerFriends: function() {
>>> +            var req = opensocial.newDataRequest();
>>> +
>>> +            var idSpec = opensocial.newIdSpec({userId :
>>> opensocial.IdSpec.PersonId.OWNER,
>>> +                groupId : 'FRIENDS'})
>>> +            req.add(req.newFetchPeopleRequest(idSpec), 'ownerFriends');
>>> +            function receivedData(response) {
>>> +              var ownerFriends = getAndCheckError(response,
>>> 'ownerFriends');
>>> +              assertEquals('Wrong friend count', 4,
>>> ownerFriends.size());
>>> +
>>> +              var johnDoe = ownerFriends.getById('john.doe');
>>> +              assertEquals('Wrong name for john doe', 'John Doe',
>>> johnDoe.getDisplayName());
>>> +              finished();
>>> +            }
>>> +
>>> +            // Send the request
>>> +            req.send(receivedData);
>>> +          },
>>> +
>>> +          /** Test fetching 'maija.m' friends, of which there are none
>>> */
>>> +          fetchEmptyFriendsById: function() {
>>> +            var req = opensocial.newDataRequest();
>>> +
>>> +            var idSpec = opensocial.newIdSpec({userId : 'maija.m',
>>> groupId
>>> : 'FRIENDS'})
>>> +            req.add(req.newFetchPeopleRequest(idSpec), 'idFriends');
>>> +            function receivedData(response) {
>>> +              var ownerFriends = getAndCheckError(response,
>>> 'idFriends');
>>> +              assertEquals('Wrong friend count', 0,
>>> ownerFriends.size());
>>> +              finished();
>>> +            }
>>> +
>>> +            // Send the request
>>> +            req.send(receivedData);
>>> +          }
>>> +        };
>>> +
>>> +
>>> +        function getAndCheckError(response, key) {
>>> +          assertFalse('Data error', response.hadError());
>>> +          var dataItem = response.get(key);
>>> +          assertFalse('Data item error for ' + key,
>>> dataItem.hadError());
>>> +          return dataItem.getData();
>>> +        }
>>> +      </script>
>>> +    ]]>
>>> +  </Content>
>>> +</Module>
>>>
>>> Modified:
>>>
>>> incubator/shindig/trunk/java/server/src/test/resources/endtoend/fetchPersonTest.xml
>>> URL:
>>> http://svn.apache.org/viewvc/incubator/shindig/trunk/java/server/
>>> src/test/resources/endtoend/fetchPersonTest.xml?rev=679724&r1=679723&r2=679724&view=diff
>>>
>>>
>>> ==============================================================================
>>> ---
>>>
>>> incubator/shindig/trunk/java/server/src/test/resources/endtoend/fetchPersonTest.xml
>>> (original)
>>> +++
>>>
>>> incubator/shindig/trunk/java/server/src/test/resources/endtoend/fetchPersonTest.xml
>>> Fri Jul 25 02:24:22 2008
>>> @@ -26,61 +26,86 @@
>>>    <![CDATA[
>>>      <script type="text/javascript" src="testframework.js"></script>
>>>      <script type="text/javascript">
>>> +        var tests = {
>>> +          /** Test fetching a specific ID */
>>> +          fetchId: function() {
>>> +            var req = opensocial.newDataRequest();
>>> +
>>> +            // Request the "canonical" viewer
>>> +            req.add(req.newFetchPersonRequest("canonical"),
>>> "canonical");
>>> +
>>> +            function receivedData(response) {
>>> +              var user = getAndCheckError(response, "canonical");
>>> +              assertEquals("Names don't match",
>>> +                "Sir Shin H. Digg Social Butterfly",
>>> user.getDisplayName());
>>> +              finished();
>>> +            }
>>> +
>>> +            // Send the request
>>> +            req.send(receivedData);
>>> +          },
>>> +
>>> +          /** Test fetching the owner, which should be "canonical" */
>>> +          fetchOwner: function() {
>>> +            var req = opensocial.newDataRequest();
>>> +
>>> +            // Request the "canonical" viewer
>>> +
>>>  req.add(req.newFetchPersonRequest(opensocial.IdSpec.PersonId.OWNER),
>>> "owner");
>>> +
>>> +            function receivedData(response) {
>>> +              var user = getAndCheckError(response, "owner");
>>> +              assertEquals("Names don't match",
>>> +                "Sir Shin H. Digg Social Butterfly",
>>> user.getDisplayName());
>>> +              finished();
>>> +            }
>>> +
>>> +            // Send the request
>>> +            req.send(receivedData);
>>> +          },
>>> +
>>> +          /** Test fetching the viewer, which should be "john.doe" */
>>> +          fetchViewer: function() {
>>> +            var req = opensocial.newDataRequest();
>>> +
>>> +            // Request the "canonical" viewer
>>> +
>>>  req.add(req.newFetchPersonRequest(opensocial.IdSpec.PersonId.VIEWER),
>>> "viewer");
>>> +
>>> +            function receivedData(response) {
>>> +              var user = getAndCheckError(response, "viewer");
>>> +              assertEquals("Names don't match",
>>> +                "John Doe", user.getDisplayName());
>>> +
>>> +              finished();
>>> +            }
>>> +
>>> +            // Send the request
>>> +            req.send(receivedData);
>>> +          },
>>> +
>>> +          /** Test fetching the owner and viewer as a batch */
>>> +          fetchOwnerAndViewer: function() {
>>> +            var req = opensocial.newDataRequest();
>>> +
>>> +            // Request the "canonical" viewer
>>> +
>>>  req.add(req.newFetchPersonRequest(opensocial.IdSpec.PersonId.OWNER),
>>> "owner");
>>> +
>>>  req.add(req.newFetchPersonRequest(opensocial.IdSpec.PersonId.VIEWER),
>>> "viewer");
>>> +
>>> +            function receivedData(response) {
>>> +              var user = getAndCheckError(response, "owner");
>>> +              assertEquals("Names don't match",
>>> +                "Sir Shin H. Digg Social Butterfly",
>>> user.getDisplayName());
>>> +
>>> +              user = getAndCheckError(response, "viewer");
>>> +              assertEquals("Names don't match",
>>> +                "John Doe", user.getDisplayName());
>>> +              finished();
>>> +            }
>>>
>>> -        /** Test fetching a specific ID */
>>> -        function fetchId() {
>>> -          var req = opensocial.newDataRequest();
>>> -
>>> -          // Request the "canonical" viewer
>>> -          req.add(req.newFetchPersonRequest("canonical"), "canonical");
>>> -
>>> -          function receivedData(response) {
>>> -            var user = getAndCheckError(response, "canonical");
>>> -            assertEquals("Names don't match",
>>> -              "Sir Shin H. Digg Social Butterfly",
>>> user.getDisplayName());
>>> -            testFinished();
>>> +            // Send the request
>>> +            req.send(receivedData);
>>>          }
>>> -
>>> -          // Send the request
>>> -          req.send(receivedData);
>>> -        }
>>> -
>>> -        /** Test fetching the owner, which should be "canonical" */
>>> -        function fetchOwner() {
>>> -          var req = opensocial.newDataRequest();
>>> -
>>> -          // Request the "canonical" viewer
>>> -
>>>  req.add(req.newFetchPersonRequest(opensocial.IdSpec.PersonId.OWNER),
>>> "owner");
>>> -
>>> -          function receivedData(response) {
>>> -            var user = getAndCheckError(response, "owner");
>>> -            assertEquals("Names don't match",
>>> -              "Sir Shin H. Digg Social Butterfly",
>>> user.getDisplayName());
>>> -            testFinished();
>>> -          }
>>> -
>>> -          // Send the request
>>> -          req.send(receivedData);
>>> -        }
>>> -
>>> -        /** Test fetching the viewer, which should be "john.doe" */
>>> -        function fetchViewer() {
>>> -          var req = opensocial.newDataRequest();
>>> -
>>> -          // Request the "canonical" viewer
>>> -
>>>  req.add(req.newFetchPersonRequest(opensocial.IdSpec.PersonId.VIEWER),
>>> "viewer");
>>> -
>>> -          function receivedData(response) {
>>> -            var user = getAndCheckError(response, "viewer");
>>> -            assertEquals("Names don't match",
>>> -              "John Doe", user.getDisplayName());
>>> -
>>> -            testFinished();
>>> -          }
>>> -
>>> -          // Send the request
>>> -          req.send(receivedData);
>>> -        }
>>> +        };
>>> +
>>>
>>>        function getAndCheckError(response, key) {
>>>          assertFalse("Data error", response.hadError());
>>>
>>> Modified:
>>>
>>> incubator/shindig/trunk/java/server/src/test/resources/endtoend/testframework.js
>>> URL:
>>> http://svn.apache.org/viewvc/incubator/shindig/trunk/java/server/
>>> src/test/resources/endtoend/testframework.js?rev=679724&r1=679723&r2=679724&view=diff
>>>
>>>
>>> ==============================================================================
>>> ---
>>>
>>> incubator/shindig/trunk/java/server/src/test/resources/endtoend/testframework.js
>>> (original)
>>> +++
>>>
>>> incubator/shindig/trunk/java/server/src/test/resources/endtoend/testframework.js
>>> Fri Jul 25 02:24:22 2008
>>> @@ -17,6 +17,8 @@
>>>  * under the License.
>>>  */
>>>
>>> +var tests;
>>> +
>>>  function assertTrue(msg, value) {
>>>  if (!value) {
>>>    throw "assertTrue() failed: " + msg;
>>> @@ -37,11 +39,11 @@
>>>  }
>>>
>>>  /**
>>> - * Signals the server code that the test successfully finished.  This
>>> - * method must be called to verify that the test completed successfully,
>>> + * Signals the server code that a test successfully finished.  This
>>> + * method must be called to verify that a test completed successfully,
>>>  * instead of simply failing to load.
>>>  */
>>> -function testFinished() {
>>> +function finished() {
>>>  alert("FINISHED");
>>>  }
>>>
>>> @@ -53,13 +55,28 @@
>>>    throw "No testMethod parameter found.";
>>>  }
>>>
>>> -  var testMethodFunction = window[testMethod];
>>> -  if (!testMethodFunction) {
>>> -    throw "Test method " + testMethod + " not found.";
>>> +  // "all": run all the tests
>>> +  if ("all" == testMethod) {
>>> +    allTests();
>>> +  } else {
>>> +    // Show an alert for the test method name, identifying what test
>>> started.
>>> +    alert(testMethod);
>>> +
>>> +    var testMethodFunction = tests[testMethod];
>>> +    if (!testMethodFunction) {
>>> +      throw "Test method " + testMethod + " not found.";
>>> +    }
>>> +
>>> +    // Execute the test method
>>> +    testMethodFunction();
>>>  }
>>> +}
>>>
>>> -  // Execute the test method
>>> -  testMethodFunction();
>>> +function allTests() {
>>> +  for (var testMethod in tests) {
>>> +    alert(testMethod);
>>> +    tests[testMethod]();
>>> +  }
>>>  }
>>>
>>>  gadgets.util.registerOnLoadHandler(executeTest);
>>>
>>>
>>>
>>>
>