blob: 8a9063fe6dc2bccc33363d655b13b95150530c11 [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.brooklyn.util.core;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertFalse;
import static org.testng.Assert.assertNotNull;
import static org.testng.Assert.assertTrue;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.net.URL;
import java.util.List;
import java.util.NoSuchElementException;
import java.util.Properties;
import org.apache.brooklyn.test.Asserts;
import org.apache.brooklyn.util.core.ResourceUtils;
import org.apache.brooklyn.util.net.Urls;
import org.apache.brooklyn.util.os.Os;
import org.apache.brooklyn.util.stream.Streams;
import org.apache.brooklyn.util.text.Identifiers;
import org.apache.brooklyn.util.text.StringEscapes;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import com.google.common.base.Charsets;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterables;
import com.google.common.io.Files;
public class ResourceUtilsTest {
private static final Logger log = LoggerFactory.getLogger(ResourceUtilsTest.class);
private String tempFileContents = "abc";
private ResourceUtils utils;
private File tempFile;
@BeforeClass(alwaysRun=true)
public void setUp() throws Exception {
utils = ResourceUtils.create(this, "mycontext");
tempFile = Os.writeToTempFile(new ByteArrayInputStream(tempFileContents.getBytes()), "resourceutils-test", ".txt");
}
@AfterClass(alwaysRun=true)
public void tearDown() throws Exception {
if (tempFile != null) tempFile.delete();
}
@Test
public void testWriteStreamToTempFile() throws Exception {
File tempFileLocal = Os.writeToTempFile(new ByteArrayInputStream("mycontents".getBytes()), "resourceutils-test", ".txt");
try {
List<String> lines = Files.readLines(tempFileLocal, Charsets.UTF_8);
assertEquals(lines, ImmutableList.of("mycontents"));
} finally {
tempFileLocal.delete();
}
}
@Test
public void testPropertiesStreamToTempFile() throws Exception {
Properties props = new Properties();
props.setProperty("mykey", "myval");
File tempFileLocal = Os.writePropertiesToTempFile(props, "resourceutils-test", ".txt");
FileInputStream fis = null;
try {
fis = new FileInputStream(tempFileLocal);
Properties props2 = new Properties();
props2.load(fis);
assertEquals(props2.getProperty("mykey"), "myval");
} finally {
Streams.closeQuietly(fis);
tempFileLocal.delete();
}
}
@Test
public void testGetResourceViaClasspathWithPrefix() throws Exception {
InputStream stream = utils.getResourceFromUrl("classpath://brooklyn/config/sample.properties");
assertNotNull(stream);
}
@Test
public void testGetResourceViaClasspathWithoutPrefix() throws Exception {
InputStream stream = utils.getResourceFromUrl("/brooklyn/config/sample.properties");
assertNotNull(stream);
}
@Test
public void testGetResourceViaFileWithPrefix() throws Exception {
// The correct format for file URLs is file:///<absolute path>.
// On UNIX file:///tmp.
// On Windows both file:/C:/temp and file:///C:/temp are supported by Java,
// while Windows itself supports the latter only.
// Note that file://C:/temp is *wrong*, because C: is interpreted as the host
InputStream stream = utils.getResourceFromUrl(tempFile.toURI().toURL().toString());
assertEquals(Streams.readFullyStringAndClose(stream), tempFileContents);
}
@Test
public void testGetResourceViaFileWithoutPrefix() throws Exception {
InputStream stream = utils.getResourceFromUrl(tempFile.getAbsolutePath());
assertEquals(Streams.readFullyStringAndClose(stream), tempFileContents);
}
@Test
public void testClassLoaderDir() throws Exception {
String d = utils.getClassLoaderDir();
log.info("Found resource "+this+" in: "+d);
assertTrue(new File(d, "brooklyn/util/").exists());
}
@Test
public void testClassLoaderDirFromJar() throws Exception {
String d = utils.getClassLoaderDir("java/lang/Object.class");
log.info("Found Object in: "+d);
assertTrue(d.toLowerCase().endsWith(".jar"));
}
@Test
public void testClassLoaderDirFromJarWithSlash() throws Exception {
String d = utils.getClassLoaderDir("/java/lang/Object.class");
log.info("Found Object in: "+d);
assertTrue(d.toLowerCase().endsWith(".jar"));
}
@Test(expectedExceptions={NoSuchElementException.class})
public void testClassLoaderDirNotFound() throws Exception {
String d = utils.getClassLoaderDir("/somewhere/not/found/ignored.x");
// above should fail
log.warn("Uh oh found imaginary resource in: "+d);
}
@Test(groups="Integration")
public void testGetResourceViaSftp() throws Exception {
InputStream stream = utils.getResourceFromUrl("sftp://localhost:"+tempFile.getAbsolutePath());
assertEquals(Streams.readFullyStringAndClose(stream), tempFileContents);
}
@Test(groups="Integration")
public void testGetResourceViaSftpWithUsername() throws Exception {
String user = System.getProperty("user.name");
InputStream stream = utils.getResourceFromUrl("sftp://"+user+"@localhost:"+tempFile.getAbsolutePath());
assertEquals(Streams.readFullyStringAndClose(stream), tempFileContents);
}
@Test
public void testDataUrl() throws Exception {
assertEquals(utils.getResourceAsString("data:,hello"), "hello");
assertEquals(utils.getResourceAsString("data:,hello%20world"), "hello world");
// above is correct. below are not valid ... but we accept them anyway
assertEquals(utils.getResourceAsString("data:hello"), "hello");
assertEquals(utils.getResourceAsString("data://hello"), "hello");
assertEquals(utils.getResourceAsString("data:hello world"), "hello world");
assertEquals(utils.getResourceAsString(Urls.asDataUrlBase64("hello world")), "hello world");
String longString = Identifiers.makeRandomId(256);
for (int a=32; a<128; a++) longString += (char)a;
assertEquals(utils.getResourceAsString(Urls.asDataUrlBase64(longString)), longString);
}
@Test
public void testGetResources() {
Iterable<URL> manifests = ResourceUtils.create("test").getResources("META-INF/MANIFEST.MF");
assertFalse(Iterables.isEmpty(manifests));
}
@Test
public void testTidySloppyUrls() throws Exception {
Asserts.assertEquals(ResourceUtils.tidyFileUrl("file:/home/My Documents/x.bom"), "file:"+ "/home/My%20Documents/x.bom");
File f = File.createTempFile("brooklyn-test", "with space");
Files.write("hello".getBytes(), f);
Asserts.assertEquals(ResourceUtils.create(this).getResourceAsString( ResourceUtils.tidyFileUrl("file:"+f.getAbsolutePath()) ), "hello");
f.delete();
}
}