package org.jooby.internal;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.expectLastCall;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import org.jooby.MediaType;
import org.jooby.test.MockUnit;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import com.google.common.io.ByteStreams;
@RunWith(PowerMockRunner.class)
@PrepareForTest({URLAsset.class, URL.class })
public class URLAssetTest {
@Test
public void name() throws Exception {
assertEquals("pom.xml",
new URLAsset(file("pom.xml").toURI().toURL(), "pom.xml", MediaType.js)
.name());
}
@Test
public void toStr() throws Exception {
assertEquals("URLAssetTest.js(application/javascript)",
new URLAsset(file("src/test/resources/org/jooby/internal/URLAssetTest.js").toURI().toURL(),
"URLAssetTest.js", MediaType.js)
.toString());
}
@Test
public void path() throws Exception {
assertEquals("/path/URLAssetTest.js", new URLAsset(getClass().getResource("URLAssetTest.js"),
"/path/URLAssetTest.js", MediaType.js).path());
}
@Test
public void lastModified() throws Exception {
assertTrue(new URLAsset(file("src/test/resources/org/jooby/internal/URLAssetTest.js").toURI()
.toURL(), "URLAssetTest.js", MediaType.js)
.lastModified() > 0);
}
@Test
public void lastModifiedFileNotFound() throws Exception {
assertTrue(new URLAsset(file("src/test/resources/org/jooby/internal/URLAssetTest.missing")
.toURI().toURL(), "URLAssetTest.missing", MediaType.js)
.lastModified() == -1);
}
@Test(expected = Exception.class)
public void headerFailNoConnection() throws Exception {
new MockUnit(URL.class)
.expect(unit -> {
URL url = unit.get(URL.class);
expect(url.openConnection()).andThrow(new Exception("intentional err"));
})
.run(unit -> {
new URLAsset(unit.get(URL.class), "path.js", MediaType.js);
});
}
@Test(expected = IllegalStateException.class)
public void headerFailWithConnection() throws Exception {
new MockUnit(URL.class)
.expect(unit -> {
InputStream stream = unit.mock(InputStream.class);
stream.close();
URLConnection conn = unit.mock(URLConnection.class);
conn.setUseCaches(false);
expect(conn.getContentLengthLong()).andThrow(
new IllegalStateException("intentional err"));
expect(conn.getInputStream()).andReturn(stream);
URL url = unit.get(URL.class);
expect(url.getProtocol()).andReturn("http");
expect(url.openConnection()).andReturn(conn);
})
.run(unit -> {
new URLAsset(unit.get(URL.class), "pa.ks", MediaType.js);
});
}
@Test
public void noLastModifiednoLen() throws Exception {
new MockUnit(URL.class)
.expect(unit -> {
InputStream stream = unit.mock(InputStream.class);
stream.close();
URLConnection conn = unit.mock(URLConnection.class);
conn.setUseCaches(false);
expect(conn.getContentLengthLong()).andReturn(0L);
expect(conn.getLastModified()).andReturn(0L);
expect(conn.getInputStream()).andReturn(stream);
URL url = unit.get(URL.class);
expect(url.getProtocol()).andReturn("http");
expect(url.openConnection()).andReturn(conn);
})
.run(unit -> {
URLAsset asset = new URLAsset(unit.get(URL.class), "pa.ks", MediaType.js);
assertEquals(0, asset.length());
assertEquals(-1, asset.lastModified());
});
}
@Test(expected = IllegalStateException.class)
public void headersStreamCloseFails() throws Exception {
new MockUnit(URL.class)
.expect(unit -> {
InputStream stream = unit.mock(InputStream.class);
stream.close();
expectLastCall().andThrow(new IOException("ignored"));
URLConnection conn = unit.mock(URLConnection.class);
conn.setUseCaches(false);
expect(conn.getContentLengthLong()).andThrow(
new IllegalStateException("intentional err"));
expect(conn.getInputStream()).andReturn(stream);
URL url = unit.get(URL.class);
expect(url.getProtocol()).andReturn("http");
expect(url.openConnection()).andReturn(conn);
})
.run(unit -> {
new URLAsset(unit.get(URL.class), "ala.la", MediaType.js);
});
}
@Test
public void length() throws Exception {
assertEquals(15, new URLAsset(file("src/test/resources/org/jooby/internal/URLAssetTest.js")
.toURI().toURL(), "URLAssetTest.js",
MediaType.js).length());
}
@Test
public void type() throws Exception {
assertEquals(MediaType.js,
new URLAsset(file("src/test/resources/org/jooby/internal/URLAssetTest.js").toURI().toURL(),
"URLAssetTest.js", MediaType.js)
.type());
}
@Test
public void stream() throws Exception {
InputStream stream = new URLAsset(
file("src/test/resources/org/jooby/internal/URLAssetTest.js").toURI().toURL(),
"URLAssetTest.js", MediaType.js)
.stream();
assertEquals("function () {}\n", new String(ByteStreams.toByteArray(stream)));
stream.close();
}
@Test(expected = NullPointerException.class)
public void nullFile() throws Exception {
new URLAsset((URL) null, "", MediaType.js);
}
@Test(expected = NullPointerException.class)
public void nullType() throws Exception {
new URLAsset(file("src/test/resources/org/jooby/internal/URLAssetTest.js").toURI().toURL(),
"", null);
}
/**
* Attempt to load a file from multiple location. required by unit and integration tests.
*
* @param location
* @return
*/
private File file(final String location) {
for (String candidate : new String[]{location, "jooby/" + location, "../jooby/" + location }) {
File file = new File(candidate);
if (file.exists()) {
return file;
}
}
return new File(location);
}
}