/*
* Copyright (C) 2013 eXo Platform SAS.
*
* This 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; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software 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.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.exoplatform.container.ar;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import org.junit.Test;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
/**
* @author <a href="mailto:nfilotto@exoplatform.com">Nicolas Filotto</a>
* @version $Id$
*
*/
public class TestArchive
{
@Test
public void testGetConfigurationURL() throws Exception
{
try
{
Archive.getConfigurationURL(null, null, null);
fail("An IllegalArgumentException was expected");
}
catch (IllegalArgumentException e)
{
// expected
}
String configuration = "foo/config.xml";
URL urlArchives = getClass().getResource(".");
String path = new File(urlArchives.toURI()).getAbsolutePath();
Archive zip = new Archive("zip", true, true, Collections.singleton(new Archive("zip", true, true, null)));
assertTrue(Archive.getConfigurationURL(null, null, configuration).isEmpty());
assertTrue(Archive.getConfigurationURL(null, Collections.<Archive> emptySet(), configuration).isEmpty());
assertTrue(Archive.getConfigurationURL(null, Collections.singleton(zip), configuration).isEmpty());
assertTrue(Archive.getConfigurationURL(Collections.<String> emptyList(), null, configuration).isEmpty());
assertTrue(Archive.getConfigurationURL(Collections.<String> emptyList(), Collections.<Archive> emptySet(),
configuration).isEmpty());
assertTrue(Archive.getConfigurationURL(Collections.<String> emptyList(), Collections.singleton(zip),
configuration).isEmpty());
assertTrue(Archive.getConfigurationURL(null, null, configuration).isEmpty());
assertTrue(Archive.getConfigurationURL(null, Collections.<Archive> emptySet(), configuration).isEmpty());
assertTrue(Archive.getConfigurationURL(Collections.singletonList(path), null, configuration).isEmpty());
assertTrue(Archive.getConfigurationURL(Collections.singletonList(path), Collections.<Archive> emptySet(),
configuration).isEmpty());
Collection<URL> result =
Archive.getConfigurationURL(Collections.singletonList(path), Collections.singleton(zip), configuration);
String[] aResult1 =
{"ar-with-dir-and-ar-with-config-dir.zip!/ar-without-dir.zip!/foo/config.xml",
"ar-with-dir-and-ar-with-config-dir.zip!/dir-with-ext.zip/foo/config.xml",
"ar-with-dir-and-ar-with-config-file.zip!/foo/config.xml",
"ar-with-dir-and-ar.zip!/ar-without-dir.zip!/foo/config.xml",
"ar-with-dir-and-ar.zip!/dir-with-ext.zip/foo/config.xml", "ar-without-dir.zip!/foo/config.xml",
"dir-with-dir-and-ar-with-config-dir.zip/ar-without-dir.zip!/foo/config.xml",
"dir-with-dir-and-ar-with-config-dir.zip/dir-with-ext.zip/foo/config.xml",
"dir-with-dir-and-ar-with-config-file.zip/foo/config.xml",
"dir-with-dir-and-ar.zip/ar-without-dir.zip!/foo/config.xml",
"dir-with-dir-and-ar.zip/dir-with-ext.zip/foo/config.xml", "dir-with-ext.zip/foo/config.xml",
"dir-without-ext/foo/config.xml", "dir-without-ext-with-ar/foo/config.xml"};
assertEquals(aResult1.length, result.size());
Iterator<URL> it = result.iterator();
for (int i = 0; it.hasNext(); i++)
{
String p = it.next().toString();
assertTrue(p + " doesn't end with " + aResult1[i], p.endsWith(aResult1[i]));
}
zip = new Archive("zip", false, true, Collections.singleton(new Archive("zip", false, true, null)));
result = Archive.getConfigurationURL(Collections.singletonList(path), Collections.singleton(zip), configuration);
String[] aResult2 =
{"ar-with-dir-and-ar-with-config-dir.zip!/ar-without-dir.zip!/foo/config.xml",
"ar-with-dir-and-ar-with-config-dir.zip!/dir-with-ext.zip/foo/config.xml",
"ar-with-dir-and-ar-with-config-file.zip!/foo/config.xml",
"ar-with-dir-and-ar.zip!/ar-without-dir.zip!/foo/config.xml",
"ar-with-dir-and-ar.zip!/dir-with-ext.zip/foo/config.xml", "ar-without-dir.zip!/foo/config.xml",
"dir-with-dir-and-ar-with-config-dir.zip/ar-without-dir.zip!/foo/config.xml",
"dir-with-dir-and-ar-with-config-dir.zip/dir-with-ext.zip/foo/config.xml",
"dir-with-dir-and-ar-with-config-file.zip/foo/config.xml",
"dir-with-dir-and-ar.zip/ar-without-dir.zip!/foo/config.xml",
"dir-with-dir-and-ar.zip/dir-with-ext.zip/foo/config.xml", "dir-with-ext.zip/foo/config.xml",
"dir-without-ext-with-ar.zip!/foo/config.xml"};
assertEquals(aResult2.length, result.size());
it = result.iterator();
for (int i = 0; it.hasNext(); i++)
{
String p = it.next().toString();
assertTrue(p + " doesn't end with " + aResult2[i], p.endsWith(aResult2[i]));
}
zip = new Archive("zip", false, false, Collections.singleton(new Archive("zip", false, false, null)));
result = Archive.getConfigurationURL(Collections.singletonList(path), Collections.singleton(zip), configuration);
String[] aResult3 =
{"ar-with-dir-and-ar-with-config-dir.zip!/ar-without-dir.zip!/foo/config.xml",
"ar-with-dir-and-ar-with-config-file.zip!/foo/config.xml",
"ar-with-dir-and-ar.zip!/ar-without-dir.zip!/foo/config.xml", "ar-without-dir.zip!/foo/config.xml",
"dir-without-ext-with-ar.zip!/foo/config.xml"};
assertEquals(aResult3.length, result.size());
it = result.iterator();
for (int i = 0; it.hasNext(); i++)
{
String p = it.next().toString();
assertTrue(p + " doesn't end with " + aResult3[i], p.endsWith(aResult3[i]));
}
zip = new Archive("zip", false, false, null);
result = Archive.getConfigurationURL(Collections.singletonList(path), Collections.singleton(zip), configuration);
String[] aResult4 =
{"ar-with-dir-and-ar-with-config-file.zip!/foo/config.xml", "ar-without-dir.zip!/foo/config.xml",
"dir-without-ext-with-ar.zip!/foo/config.xml"};
assertEquals(aResult4.length, result.size());
it = result.iterator();
for (int i = 0; it.hasNext(); i++)
{
String p = it.next().toString();
assertTrue(p + " doesn't end with " + aResult4[i], p.endsWith(aResult4[i]));
}
zip = new Archive("zip", true, false, Collections.singleton(new Archive("zip", true, false, null)));
result = Archive.getConfigurationURL(Collections.singletonList(path), Collections.singleton(zip), configuration);
String[] aResult5 =
{"ar-with-dir-and-ar-with-config-dir.zip!/ar-without-dir.zip!/foo/config.xml",
"ar-with-dir-and-ar-with-config-file.zip!/foo/config.xml",
"ar-with-dir-and-ar.zip!/ar-without-dir.zip!/foo/config.xml", "ar-without-dir.zip!/foo/config.xml",
"dir-without-ext/foo/config.xml", "dir-without-ext-with-ar/foo/config.xml"};
assertEquals(aResult5.length, result.size());
it = result.iterator();
for (int i = 0; it.hasNext(); i++)
{
String p = it.next().toString();
assertTrue(p + " doesn't end with " + aResult5[i], p.endsWith(aResult5[i]));
}
zip = new Archive("zip", true, false, null);
result = Archive.getConfigurationURL(Collections.singletonList(path), Collections.singleton(zip), configuration);
String[] aResult6 =
{"ar-with-dir-and-ar-with-config-file.zip!/foo/config.xml", "ar-without-dir.zip!/foo/config.xml",
"dir-without-ext/foo/config.xml", "dir-without-ext-with-ar/foo/config.xml"};
assertEquals(aResult6.length, result.size());
it = result.iterator();
for (int i = 0; it.hasNext(); i++)
{
String p = it.next().toString();
assertTrue(p + " doesn't end with " + aResult6[i], p.endsWith(aResult6[i]));
}
}
@Test
public void testURL() throws Exception
{
URL url = new URL("file", null, "/");
ArchiveURLStreamHandler handler = new ArchiveURLStreamHandler();
try
{
handler.openConnection(url);
fail("A MalformedURLException was expected");
}
catch (MalformedURLException e)
{
// expected
}
url = new URL(Archive.PROTOCOL, "localhost", -1, "/", handler);
try
{
url.openConnection();
fail("A MalformedURLException was expected");
}
catch (MalformedURLException e)
{
// expected
}
url = new URL(Archive.PROTOCOL, "", -1, "/", handler);
try
{
url.openConnection();
fail("A MalformedURLException was expected");
}
catch (MalformedURLException e)
{
// expected
}
url = Archive.parse("//");
try
{
url.openConnection();
fail("A MalformedURLException was expected");
}
catch (MalformedURLException e)
{
// expected
}
url = Archive.parse("/foo!/foo2!/foo3!/foo4");
try
{
url.openConnection();
fail("A MalformedURLException was expected");
}
catch (MalformedURLException e)
{
// expected
}
url = Archive.parse("/foo!/");
try
{
url.openConnection();
fail("A MalformedURLException was expected");
}
catch (MalformedURLException e)
{
// expected
}
url = Archive.parse("/foo/");
try
{
url.openConnection();
fail("A MalformedURLException was expected");
}
catch (MalformedURLException e)
{
// expected
}
url = new URL(Archive.PROTOCOL, null, -1, "foo", handler);
try
{
url.openConnection();
fail("A MalformedURLException was expected");
}
catch (MalformedURLException e)
{
// expected
}
url = Archive.parse("foo");
url.openConnection();
url = new URL(Archive.PROTOCOL, null, -1, "/foo", handler);
url.openConnection();
url = Archive.parse("/foo");
url.openConnection();
}
@Test
public void testConnect() throws Exception
{
URL url = Archive.parse("/foo");
URLConnection connection = url.openConnection();
try
{
connection.connect();
fail("A FileNotFoundException was expected");
}
catch (FileNotFoundException e)
{
// expected
}
URL urlArchives = getClass().getResource(".");
String root = new File(urlArchives.toURI()).getAbsolutePath();
url = Archive.parse(root);
connection = url.openConnection();
try
{
connection.connect();
fail("A IOException was expected");
}
catch (IOException e)
{
// expected
}
String path = root + "/ar-with-dir-and-ar-with-config-file.zip";
url = Archive.parse(path);
connection = url.openConnection();
connection.connect();
path = root + "/foo.zip!/foo/config.xml";
url = Archive.parse(path);
connection = url.openConnection();
try
{
connection.connect();
fail("A FileNotFoundException was expected");
}
catch (FileNotFoundException e)
{
// expected
}
path = root + "/dir-with-dir-and-ar-with-config-file.zip!/foo/config.xml";
url = Archive.parse(path);
connection = url.openConnection();
try
{
connection.connect();
fail("A IOException was expected");
}
catch (IOException e)
{
// expected
}
path = root + "/ar-with-dir-and-ar-with-config-file.zip!/foo/foo.xml";
url = Archive.parse(path);
connection = url.openConnection();
try
{
connection.connect();
fail("A FileNotFoundException was expected");
}
catch (FileNotFoundException e)
{
// expected
}
path = root + "/ar-with-dir-and-ar-with-config-file.zip!/foo";
url = Archive.parse(path);
connection = url.openConnection();
try
{
connection.connect();
fail("A IOException was expected");
}
catch (IOException e)
{
// expected
}
path = root + "/ar-with-dir-and-ar-with-config-dir.zip!/foo.zip!/foo/config.xml";
url = Archive.parse(path);
connection = url.openConnection();
try
{
connection.connect();
fail("A FileNotFoundException was expected");
}
catch (FileNotFoundException e)
{
// expected
}
path = root + "/ar-with-dir-and-ar-with-config-dir.zip!/dir-with-ext.zip!/foo/config.xml";
url = Archive.parse(path);
connection = url.openConnection();
try
{
connection.connect();
fail("A IOException was expected");
}
catch (IOException e)
{
// expected
}
}
@Test
public void testGetStream() throws Exception
{
URL urlArchives = getClass().getResource(".");
String root = new File(urlArchives.toURI()).getAbsolutePath();
String path = root + "/ar-with-dir-and-ar-with-config-dir.zip!/ar-without-dir.zip!/foo/foo.xml";
URL url = Archive.parse(path);
try
{
getContent(url);
fail("A FileNotFoundException was expected");
}
catch (FileNotFoundException e)
{
// expected
}
path = root + "/ar-with-dir-and-ar-with-config-dir.zip!/ar-without-dir.zip!/foo";
url = Archive.parse(path);
try
{
getContent(url);
fail("A IOException was expected");
}
catch (IOException e)
{
// expected
}
path = root + "/dir-without-ext/foo/config.xml";
url = Archive.parse(path);
String contentRef = getContent(url);
assertNotNull(contentRef);
assertFalse(contentRef.isEmpty());
path = root + "/ar-without-dir.zip!/foo/config.xml";
url = Archive.parse(path);
String content = getContent(url);
assertNotNull(content);
assertFalse(content.isEmpty());
assertEquals(contentRef, content);
path = root + "/ar-with-dir-and-ar-with-config-dir.zip!/ar-without-dir.zip!/foo/config.xml";
url = Archive.parse(path);
content = getContent(url);
assertNotNull(content);
assertFalse(content.isEmpty());
assertEquals(contentRef, content);
}
private static String getContent(URL url) throws Exception
{
ByteArrayOutputStream baos = new ByteArrayOutputStream();
InputStream is = null;
try
{
is = url.openStream();
byte[] buffer = new byte[2048];
int n;
while ((n = is.read(buffer, 0, 2048)) > -1)
{
baos.write(buffer, 0, n);
}
}
finally
{
if (is != null)
is.close();
}
return new String(baos.toByteArray(), "ISO-8859-1");
}
}