/**
* Copyright (C) 2012 eXo Platform SAS.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.exoplatform.portal.gadget.server;
import java.io.IOException;
import java.net.URLEncoder;
import org.apache.shindig.auth.BasicSecurityToken;
import org.apache.shindig.auth.BasicSecurityTokenCodec;
import org.apache.shindig.auth.SecurityToken;
import org.apache.shindig.common.crypto.BlobCrypterException;
import org.exoplatform.portal.AbstractPortalTest;
import com.gargoylesoftware.htmlunit.CollectingAlertHandler;
import com.gargoylesoftware.htmlunit.NicelyResynchronizingAjaxController;
import com.gargoylesoftware.htmlunit.Page;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HTMLParserListener;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
/**
* Base class for end-to-end tests.
*
* @author <a href="kienna@exoplatform.com">Kien Nguyen</a>
* @version $Revision$
*/
public class EndToEndTest extends AbstractPortalTest {
private static final String[] EXPECTED_RESOURCES = { "hello.xml", "coreFeatures.xml", "testframework.js" };
static private EndToEndServer server = null;
private WebClient webClient;
private CollectingAlertHandler alertHandler;
private SecurityToken token;
private String language;
public void testCheckResources() throws Exception {
for (String resource : EXPECTED_RESOURCES) {
String url = EndToEndServer.SERVER_URL + '/' + resource;
Page p = webClient.getPage(url);
assertEquals("Failed to load test resource " + url, 200, p.getWebResponse().getStatusCode());
}
}
public void testHelloWorld() throws Exception {
HtmlPage page = executeAllPageTests("hello");
final String pageAsText = page.asText();
assertTrue(pageAsText.contains("Hello, world!"));
}
public void testCoreFeature() throws Exception {
HtmlPage page = executeAllPageTests("coreFeatures");
final String pageAsText = page.asText();
assertTrue(pageAsText.contains("Core Features Test Cases!"));
}
@Override
public void tearDown() throws Exception {
server.stop();
}
@Override
public void setUp() throws Exception {
server = new EndToEndServer();
server.start();
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());
webClient.waitForBackgroundJavaScript(2000);
webClient.setHTMLParserListener(HTMLParserListener.LOG_REPORTER);
webClient.setTimeout(3000);
alertHandler = new CollectingAlertHandler();
webClient.setAlertHandler(alertHandler);
token = createToken("canonical", "john.doe");
language = null;
server.clearDataServiceError();
}
/**
* 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, boolean caja) throws IOException {
if (!testName.endsWith(".xml")) {
testName = testName + ".xml";
}
String gadgetUrl = EndToEndServer.SERVER_URL + '/' + testName;
String url = EndToEndServer.GADGET_BASEURL + "?url=" + URLEncoder.encode(gadgetUrl, "UTF-8");
BasicSecurityTokenCodec codec = new BasicSecurityTokenCodec();
url += "&st=" + URLEncoder.encode(codec.encodeToken(token), "UTF-8");
if (testMethod != null) {
url += "&testMethod=" + URLEncoder.encode(testMethod, "UTF-8");
}
if (caja) {
url += "&caja=1&libs=caja";
}
url += "&nocache=1";
if (language != null) {
url += "&lang=" + language;
}
Page page = webClient.getPage(url);
if (!(page instanceof HtmlPage)) {
fail("Got wrong page type. Was: " + page.getWebResponse().getContentType());
}
webClient.waitForBackgroundJavaScript(3000);
return (HtmlPage) page;
}
/**
* 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 HtmlPage executeAllPageTests(String testName) throws IOException {
return executePageTest(testName, "all", false);
}
private BasicSecurityToken createToken(String owner, String viewer) throws BlobCrypterException {
return new BasicSecurityToken(owner, viewer, "test", "domain", "appUrl", "1", "default", null, null);
}
}