/*
* GeoTools - The Open Source Java GIS Toolkit
* http://geotools.org
*
* (C) 2010-2011, Open Source Geospatial Foundation (OSGeo)
*
* This library 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;
* version 2.1 of the License.
*
* This library 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.
*/
package org.geotools.xml.resolver;
import java.io.File;
import java.net.URI;
import org.geotools.data.DataUtilities;
import org.geotools.test.OnlineTestSupport;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
/**
* Online test for {@link SchemaCatalog}.
*
* @author Ben Caradoc-Davies (CSIRO Earth Science and Resource Engineering)
*
*
*
* @source $URL$
*/
public class SchemaCacheOnlineTest extends OnlineTestSupport {
/**
* System property used to set HTTPS protocols.
*/
private static final String HTTPS_PROTOCOLS = "https.protocols";
/**
* Downloaded files are stored in this directory. We intentionally use a non-canonical cache directory to test that resolved locations are
* canonical.
*/
private static final File CACHE_DIRECTORY = new File("target/schema-cache/../schema-cache");
/**
* Schema that is downloaded.
*/
private static final String SCHEMA_LOCATION = "http://schemas.geosciml.org/geosciml/2.0/geosciml.xsd";
/**
* Filename of the schema.
*/
private static final String SCHEMA_FILENAME;
static {
String[] parts = SCHEMA_LOCATION.split("/");
SCHEMA_FILENAME = parts[parts.length - 1];
}
/**
* @see org.geotools.test.OnlineTestSupport#getFixtureId()
*/
@Override
protected String getFixtureId() {
return "schema-resolver";
}
/**
* @see org.geotools.test.OnlineTestSupport#before()
*/
@Before
@Override
public void before() throws Exception {
super.before();
SchemaCache.delete(CACHE_DIRECTORY);
}
/**
* @see org.geotools.test.OnlineTestSupport#after()
*/
@After
@Override
public void after() throws Exception {
super.after();
SchemaCache.delete(CACHE_DIRECTORY);
}
/**
* Test download of schema via http.
*/
@Test
public void downloadHttp() throws Exception {
check(SchemaCache.download(new URI(SCHEMA_LOCATION)));
}
/**
* Test download of schema via http with smaller block size.
*/
@Test
public void downloadHttpWithSmallBlockSize() throws Exception {
check(SchemaCache.download(new URI(SCHEMA_LOCATION), 32));
}
/**
* Test download of schema via http with larger block size.
*/
@Test
public void downloadHttpWithLargeBlockSize() throws Exception {
check(SchemaCache.download(new URI(SCHEMA_LOCATION), 65536));
}
/**
* Test download of schema via https.
*/
@Test
public void downloadHttps() throws Exception {
// save original system property
String httpsProtocols = System.getProperty(HTTPS_PROTOCOLS);
// force connection to use TLSv1.2 because OpenJDK 7 and Oracle JDK 7
// fail when connecting to this test server with TLSv1; perhaps because
// the test server renegotiates to TLSv1.2?
System.setProperty(HTTPS_PROTOCOLS, "TLSv1.2");
// test HTTPS download
check(SchemaCache.download(new URI("https://www.seegrid.csiro.au"
+ "/subversion/GeoSciML/tags/2.0.0/schema/GeoSciML/geosciml.xsd")));
// restore original system property
if (httpsProtocols == null) {
System.clearProperty(HTTPS_PROTOCOLS);
} else {
System.setProperty(HTTPS_PROTOCOLS, httpsProtocols);
}
}
/**
* Basic sanity checks of schema and test store to disk.
*/
private void check(byte[] bytes) {
Assert.assertTrue(bytes.length > 0);
String text = new String(bytes);
Assert.assertTrue(text.contains("GeoSciML"));
Assert.assertTrue(text.contains("<schema"));
Assert.assertTrue(text.contains("</schema>"));
File cachedFile = new File("target/test/test.xsd");
SchemaCache.delete(cachedFile);
Assert.assertFalse(cachedFile.exists());
SchemaCache.store(cachedFile, bytes);
Assert.assertTrue(cachedFile.exists());
Assert.assertEquals(bytes.length, cachedFile.length());
}
@Test
public void cache() throws Exception {
// expect failure when downloading disabled
{
SchemaCache cache = new SchemaCache(CACHE_DIRECTORY, false);
String location = cache.resolveLocation(SCHEMA_LOCATION);
Assert.assertNull(location);
}
// should succeed if able to download
{
SchemaCache cache = new SchemaCache(CACHE_DIRECTORY, true);
String location = cache.resolveLocation(SCHEMA_LOCATION);
Assert.assertNotNull(location);
Assert.assertTrue(location.startsWith("file:"));
Assert.assertTrue(location.endsWith(SCHEMA_FILENAME));
Assert.assertTrue(DataUtilities.urlToFile((new URI(location)).toURL()).exists());
}
// now that schema is is in the cache, should succeed even if downloading is disabled
{
SchemaCache cache = new SchemaCache(CACHE_DIRECTORY, false);
String location = cache.resolveLocation(SCHEMA_LOCATION);
Assert.assertNotNull(location);
Assert.assertTrue(location.startsWith("file:"));
Assert.assertTrue(location.endsWith(SCHEMA_FILENAME));
Assert.assertTrue(DataUtilities.urlToFile((new URI(location)).toURL()).exists());
// test that cache path is not canonical
Assert.assertFalse(CACHE_DIRECTORY.toString()
.equals(CACHE_DIRECTORY.getCanonicalFile().toString()));
// test that resolved location is canonical, despite cache directory not being canonical
Assert.assertEquals(location, DataUtilities.urlToFile((new URI(location)).toURL())
.getCanonicalFile().toURI().toString());
}
}
}