blob: 5edf6015850e61cb7a952073eae633eb3ec6d365 [file] [log] [blame]
/*
* 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.jena.fuseki.main;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import java.io.IOException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.jena.atlas.lib.StrUtils;
import org.apache.jena.atlas.web.WebLib;
import org.apache.jena.graph.Graph;
import org.apache.jena.query.Dataset;
import org.apache.jena.query.DatasetFactory;
import org.apache.jena.rdf.model.Model;
import org.apache.jena.rdf.model.ModelFactory;
import org.apache.jena.riot.Lang;
import org.apache.jena.riot.web.HttpNames;
import org.apache.jena.riot.web.HttpOp;
import org.apache.jena.sparql.core.DatasetGraph;
import org.apache.jena.sparql.core.DatasetGraphFactory;
import org.apache.jena.sparql.sse.SSE;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
/** Test HTTP level details */
public class TestHTTP {
private static FusekiServer server = null;
private static int port;
private static Model data;
private static Dataset dataset;
private static String URL;
@BeforeClass
public static void beforeClass() {
port = WebLib.choosePort();
URL = "http://localhost:" + port + "/ds";
Graph graph = SSE.parseGraph(StrUtils.strjoinNL
("(graph"
," (:s :p 1)"
,")"));
data = ModelFactory.createModelForGraph(graph);
DatasetGraph dsgData = DatasetGraphFactory.create();
dsgData.add(SSE.parseQuad("(:g :s :p 2 )"));
dataset = DatasetFactory.wrap(dsgData);
DatasetGraph dsg = DatasetGraphFactory.createTxnMem();
FusekiServer server = FusekiServer.create()
.add("/ds", dsg)
.port(port)
.addServlet("/ds/myServlet", new MyServlet())
.staticFileBase("testing/Files")
.build();
server.start();
}
// Test : responds to GET
private static class MyServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
resp.setContentType("text/plain");
resp.getOutputStream().print("SERVLET");
resp.setStatus(200);
}
}
@AfterClass
public static void afterClass() {
if ( server != null )
server.stop();
}
// GET
@Test public void gspGet_dataset_1() {
// Base URL, default content type => N-Quads (dump format)
HttpOp.execHttpGet(URL, null, (base, response)->{
String h = response.getFirstHeader(HttpNames.hContentType).getValue();
assertNotNull(h);
assertEquals(Lang.NQUADS.getHeaderString(), h);
});
}
@Test public void gspGet_dataset_2() {
String ct = Lang.TRIG.getHeaderString();
HttpOp.execHttpGet(URL, ct, (base, response)->{
String h = response.getFirstHeader(HttpNames.hContentType).getValue();
assertNotNull(h);
assertEquals(ct, h);
});
}
@Test public void gspGet_graph_1() {
String target = URL+"?default";
HttpOp.execHttpGet(target, null, (base, response)->{
String h = response.getFirstHeader(HttpNames.hContentType).getValue();
assertNotNull(h);
// "Traditional default".
assertEquals(Lang.RDFXML.getHeaderString(), h);
});
}
@Test public void gspGet_graph_2() {
String target = URL+"?default";
String ct = Lang.TTL.getHeaderString();
HttpOp.execHttpGet(target, ct, (base, response)->{
String h = response.getFirstHeader(HttpNames.hContentType).getValue();
assertNotNull(h);
assertEquals(ct, h);
});
}
// HEAD
@Test public void gspHead_dataset_1() {
// Base URL, default content type => N-Quads (dump format)
HttpOp.execHttpHead(URL, null, (base, response)->{
String h = response.getFirstHeader(HttpNames.hContentType).getValue();
assertNotNull(h);
assertEquals(Lang.NQUADS.getHeaderString(), h);
});
}
@Test public void gspHead_dataset_2() {
String ct = Lang.TRIG.getHeaderString();
HttpOp.execHttpHead(URL, ct, (base, response)->{
String h = response.getFirstHeader(HttpNames.hContentType).getValue();
assertNotNull(h);
assertEquals(ct, h);
});
}
@Test public void gspHead_graph_1() {
String target = URL+"?default";
HttpOp.execHttpHead(target, null, (base, response)->{
String h = response.getFirstHeader(HttpNames.hContentType).getValue();
assertNotNull(h);
// "Traditional default".
assertEquals(Lang.RDFXML.getHeaderString(), h);
});
}
@Test public void gspHead_graph_2() {
String target = URL+"?default";
String ct = Lang.TTL.getHeaderString();
HttpOp.execHttpHead(target, ct, (base, response)->{
String h = response.getFirstHeader(HttpNames.hContentType).getValue();
assertNotNull(h);
assertEquals(ct, h);
});
}
// Servlet - mounted at /ds/myServlet, but not a service that Fuseki dispatches.
@Test public void plainServlet() {
String x = HttpOp.execHttpGetString(URL+"/myServlet");
assertEquals(x, "SERVLET");
}
// Files - a static file /ds/file.txt is visible.
@Test public void plainFile() {
String x = HttpOp.execHttpGetString(URL+"/file.txt");
assertTrue(x.contains("CONTENT"));
}
}