package org.richfaces.cdk.xmlconfig;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.replay;
import static org.easymock.EasyMock.verify;
import static org.junit.Assert.assertNotNull;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLStreamHandler;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.richfaces.cdk.CdkClassLoader;
import org.richfaces.cdk.CdkTestBase;
import org.richfaces.cdk.CdkTestRunner;
import org.richfaces.cdk.FileManager;
import org.richfaces.cdk.Mock;
import org.richfaces.cdk.Source;
import org.richfaces.cdk.Sources;
import org.richfaces.cdk.annotations.JsfComponent;
import org.xml.sax.InputSource;
import com.google.common.collect.ImmutableList;
import com.google.inject.Binder;
import com.google.inject.Inject;
@RunWith(CdkTestRunner.class)
public class CdkResolverTest extends CdkTestBase {
private class MyURLConnection extends URLConnection {
private InputStream inputStream;
MyURLConnection(URL u, InputStream inputStream) {
super(u);
this.inputStream = inputStream;
}
@Override
public void connect() throws IOException {
}
@Override
public InputStream getInputStream() throws IOException {
return this.inputStream;
}
}
private class MyURLStreamHandler extends URLStreamHandler {
private InputStream inputStream;
MyURLStreamHandler(InputStream inputStream) {
this.inputStream = inputStream;
}
@Override
protected URLConnection openConnection(URL u) throws IOException {
return new MyURLConnection(u, inputStream);
}
}
private static final String TEST_HTML = "org/richfaces/cdk/apt/test.html";
@Inject
private CdkEntityResolver entityResolver;
@Mock
@Source(Sources.FACES_CONFIGS)
private FileManager facesConfigSource;
@Mock
@Source(Sources.RENDERER_TEMPLATES)
private FileManager templatesSource;
@Override
public void configure(Binder binder) {
super.configure(binder);
try {
CdkClassLoader classLoader = new CdkClassLoader(ImmutableList.of(getLibraryFile("test.source.properties"),
getLibraryFile(JsfComponent.class)), null) {
@Override
public URL getResource(String name) {
if ("foo/bar.xml".equals(name)) {
try {
MyURLStreamHandler myURLStreamHandler = new MyURLStreamHandler(getBarXmlStream());
return new URL("file", "localhost", 80, "/foo/bar.xml", myURLStreamHandler);
} catch (MalformedURLException e) {
e.printStackTrace();
return null;
}
} else {
return super.getResource(name);
}
}
@Override
public InputStream getResourceAsStream(String name) {
if ("foo/bar.xml".equals(name)) {
return getBarXmlStream();
} else {
return super.getResourceAsStream(name);
}
}
};
binder.bind(CdkClassLoader.class).toInstance(classLoader);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
@Test
public void testGetProjectInputSource() throws Exception {
expect(facesConfigSource.getFile(TEST_HTML)).andReturn(getJavaFile(TEST_HTML));
replay(facesConfigSource, templatesSource);
InputSource input = entityResolver.getProjectInputSource(facesConfigSource, TEST_HTML);
verify(facesConfigSource, templatesSource);
assertNotNull(input);
}
@Test
public void testResolveSystemIdAttributes() throws Exception {
replay(facesConfigSource, templatesSource);
InputSource input = entityResolver.resolveSystemId("urn:attributes:test-props.xml");
verify(facesConfigSource, templatesSource);
assertNotNull(input);
}
@Test
public void testResolveSystemIdResource() throws Exception {
replay(facesConfigSource, templatesSource);
InputSource input = entityResolver.resolveSystemId("urn:resource:foo/bar.xml");
verify(facesConfigSource, templatesSource);
assertNotNull(input);
}
@Test
public void testResolveSystemIdSystem() throws Exception {
replay(facesConfigSource, templatesSource);
InputSource input = entityResolver.resolveSystemId("http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd");
verify(facesConfigSource, templatesSource);
assertNotNull(input);
}
private ByteArrayInputStream getBarXmlStream() {
return new ByteArrayInputStream("baz".getBytes());
}
}