/** ========================================================================
* handytrowel: src/test/java/network/TestHTMLFetcher.java
* End-to-end tests for HTMLFetcher.
* ========================================================================
* Copyright (c) 2014, Asim Ihsan, All rights reserved.
* <http://www.asimihsan.com>
* https://github.com/asimihsan/handytrowel/blob/master/LICENSE
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
* ========================================================================
*/
package com.asimihsan.handytrowel.network;
import static org.junit.Assert.*;
import com.asimihsan.handytrowel.network.HTMLFetcher.HTMLFetcherBuilder;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URI;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;
import java.util.concurrent.TimeoutException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.ServerConnector;
import org.eclipse.jetty.server.handler.AbstractHandler;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
class ResourceReader {
private ResourceReader() { }
public static String getResourceAsString(String path) throws IOException {
try (
InputStream is = ResourceReader.class.getResourceAsStream("/network/empty_page.txt");
InputStreamReader isr = new InputStreamReader(is, StandardCharsets.US_ASCII);
Scanner scanner = new Scanner(isr);
) {
scanner.useDelimiter("\\A");
return scanner.next();
}
}
}
class HelloHandler extends AbstractHandler {
@Override
public void handle(String target, Request baseRequest,
HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
response.setContentType("text/html;charset=utf-8");
response.setStatus(HttpServletResponse.SC_OK);
baseRequest.setHandled(true);
response.getWriter().println(
ResourceReader.getResourceAsString("/network/empty_page.txt"));
}
}
public class TestHTMLFetcher {
private static Server server;
private static URI serverUri;
@BeforeClass
public static void startServer() throws Exception {
server = new Server();
ServerConnector connector = new ServerConnector(server);
connector.setPort(0); // let connector pick an unused port #
server.addConnector(connector);
server.setHandler(new HelloHandler());
// Start Server
server.start();
String host = connector.getHost();
if (host == null) {
host = "localhost";
}
int port = connector.getLocalPort();
serverUri = new URI(String.format("http://%s:%d/",host,port));
}
@AfterClass
public static void stopServer() {
try {
server.stop();
} catch (Exception e) {
e.printStackTrace(System.err);
}
}
@Test
public void testEmptyPage() {
HTMLFetcher htmlFetcher = new HTMLFetcherBuilder()
.timeoutMillis(30 * 10000)
.build();
String pageSource = null;
try {
pageSource = htmlFetcher.getPageSource(serverUri.toString());
} catch (TimeoutException e) {
fail("Did not expect a timeout exception!");
}
try {
assertEquals(ResourceReader.getResourceAsString("/network/empty_page.txt"),
pageSource.replaceAll("\n", ""));
} catch (IOException e) {
fail("Getting test source unexpectedly threw an exception");
}
}
}