/** * 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.http; import static org.apache.jena.fuseki.ServerCtl.serviceQuery ; import static org.apache.jena.fuseki.ServerCtl.serviceGSP ; import static org.apache.jena.fuseki.ServerCtl.serviceUpdate ; import static org.apache.jena.fuseki.ServerCtl.urlRoot ; import java.io.IOException ; import org.apache.jena.atlas.io.IO ; import org.apache.jena.atlas.junit.BaseTest ; import org.apache.jena.atlas.lib.IRILib ; import org.apache.jena.atlas.web.HttpException ; import org.apache.jena.atlas.web.TypedInputStream ; import org.apache.jena.fuseki.ServerCtl ; import org.apache.jena.riot.WebContent ; import org.apache.jena.riot.web.HttpOp ; import org.apache.jena.sparql.engine.http.Params ; import org.apache.jena.util.FileUtils ; import org.apache.jena.web.HttpSC ; import org.junit.* ; // This a mixture of testing HttpOp and testing basic operation of the SPARQL server // especially error cases and unusual usage that the higher level APIs don't use. public class TestHttpOp extends BaseTest { @BeforeClass public static void ctlBeforeClass() { ServerCtl.ctlBeforeClass(); } @AfterClass public static void ctlAfterClass() { ServerCtl.ctlAfterClass(); } @Before public void ctlBeforeTest() { ServerCtl.ctlBeforeTest(); } @After public void ctlAfterTest() { ServerCtl.ctlAfterTest(); } static String pingURL = urlRoot() + "ping.txt" ; static String graphURL = serviceGSP() + "?default" ; static String queryURL = serviceQuery() ; static String updateURL = serviceUpdate() ; static String simpleQuery = queryURL+"?query="+IRILib.encodeUriComponent("ASK{}") ; // Basic operations @Test public void httpGet_01() { TypedInputStream in = HttpOp.execHttpGet(pingURL) ; IO.close(in) ; } @Test(expected=HttpException.class) public void httpGet_02() { try { TypedInputStream in = HttpOp.execHttpGet(urlRoot()+"does-not-exist") ; IO.close(in) ; } catch(HttpException ex) { assertEquals(HttpSC.NOT_FOUND_404, ex.getResponseCode()) ; throw ex ; } } @Test public void httpGet_03() throws IOException { String x = HttpOp.execHttpGetString(pingURL) ; String y = FileUtils.readWholeFileAsUTF8("pages/ping.txt") ; assertEquals(y,x) ; } @Test public void httpGet_04() { String x = HttpOp.execHttpGetString(urlRoot()+"does-not-exist") ; assertNull(x) ; } @Test public void httpGet_05() { TypedInputStream in = HttpOp.execHttpGet(simpleQuery) ; IO.close(in) ; } // SPARQL Query @Test public void queryGet_01() { TypedInputStream in = HttpOp.execHttpGet(simpleQuery) ; IO.close(in) ; } @Test(expected=HttpException.class) public void queryGet_02() { try { // No query. TypedInputStream in = HttpOp.execHttpGet(queryURL+"?query=") ; IO.close(in) ; } catch (HttpException ex) { assertEquals(ex.getResponseCode(), HttpSC.BAD_REQUEST_400) ; throw ex ; } } // @Test(expected=HttpException.class) // public void queryGet_03() { // try { // // Service description. // TypedInputStream in = HttpOp.execHttpGet(queryURL) ; // IO.close(in) ; // } catch (HttpException ex) { // assertEquals(ex.getResponseCode(), HttpSC.NOT_FOUND_404) ; // throw ex ; // } // } @Test(expected=HttpException.class) public void httpPost_01() { try { HttpOp.execHttpPost(queryURL, "ASK{}", "text/plain") ; } catch (HttpException ex) { assertEquals(ex.getResponseCode(), HttpSC.UNSUPPORTED_MEDIA_TYPE_415) ; throw ex ; } } @Test(expected=HttpException.class) public void httpPost_02() { try { HttpOp.execHttpPost(queryURL, "ASK{}", WebContent.contentTypeSPARQLQuery) ; } catch (HttpException ex) { assertEquals(ex.getResponseCode(), HttpSC.UNSUPPORTED_MEDIA_TYPE_415) ; throw ex ; } } @Test(expected=HttpException.class) public void httpPost_03() { try { HttpOp.execHttpPost(queryURL, "ASK{}", WebContent.contentTypeOctets) ; } catch (HttpException ex) { assertEquals(ex.getResponseCode(), HttpSC.UNSUPPORTED_MEDIA_TYPE_415) ; throw ex ; } } @Test public void httpPost_04() { Params params = new Params() ; params.addParam("query", "ASK{}") ; TypedInputStream in = HttpOp.execHttpPostFormStream(queryURL, params, WebContent.contentTypeResultsJSON) ; IO.close(in) ; } @Test(expected=HttpException.class) public void httpPost_05() { Params params = new Params() ; params.addParam("query", "ASK{}") ; TypedInputStream in = null ; try { // Query to Update in = HttpOp.execHttpPostFormStream(updateURL, params, WebContent.contentTypeResultsJSON) ; } catch (HttpException ex) { assertEquals(ex.getResponseCode(), HttpSC.BAD_REQUEST_400) ; throw ex ; } finally { IO.close(in) ; } } @Test public void httpPost_06() { Params params = new Params() ; params.addParam("request", "CLEAR ALL") ; HttpOp.execHttpPostForm(updateURL, params) ; } // GSP @Test public void gsp_01() { String x = HttpOp.execHttpGetString(graphURL, "application/rdf+xml") ; assertTrue(x.contains("</")) ; assertTrue(x.contains(":RDF")) ; } @Test public void gsp_02() { String x = HttpOp.execHttpGetString(graphURL, "application/n-triples") ; assertTrue(x.isEmpty()) ; } static String graphString = "@prefix : <http://example/> . :s :p :o ." ; @Test public void gsp_03() { HttpOp.execHttpPut(graphURL, WebContent.contentTypeTurtle, graphString) ; } @Test public void gsp_04() { HttpOp.execHttpPut(graphURL, WebContent.contentTypeTurtle, graphString) ; String s1 = HttpOp.execHttpGetString(graphURL, WebContent.contentTypeNTriples) ; assertFalse(s1.isEmpty()) ; HttpOp.execHttpDelete(graphURL) ; String s2 = HttpOp.execHttpGetString(graphURL, WebContent.contentTypeNTriples) ; assertTrue(s2.isEmpty()) ; } @Test public void gsp_05() { HttpOp.execHttpDelete(graphURL) ; HttpOp.execHttpPost(graphURL, WebContent.contentTypeTurtle, graphString) ; String s1 = HttpOp.execHttpGetString(graphURL, WebContent.contentTypeNTriples) ; assertFalse(s1.isEmpty()) ; HttpOp.execHttpDelete(graphURL) ; String s2 = HttpOp.execHttpGetString(graphURL, WebContent.contentTypeNTriples) ; assertTrue(s2.isEmpty()) ; } }