/*
* Copyright (C) 2009 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.services.ftp;
import junit.framework.TestCase;
import org.exoplatform.container.StandaloneContainer;
import org.exoplatform.services.jcr.RepositoryService;
import org.exoplatform.services.jcr.core.CredentialsImpl;
import org.exoplatform.services.jcr.impl.core.NodeImpl;
import org.exoplatform.services.jcr.impl.core.RepositoryImpl;
import org.exoplatform.services.jcr.impl.core.SessionImpl;
import org.exoplatform.services.log.ExoLogger;
import org.exoplatform.services.log.Log;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Random;
import javax.jcr.Node;
import javax.jcr.NodeIterator;
import javax.jcr.PathNotFoundException;
import javax.jcr.RepositoryException;
import javax.jcr.ValueFactory;
import javax.jcr.Workspace;
/**
* Created by The eXo Platform SAS .
*
* @author <a href="mailto:geaz@users.sourceforge.net">Gennady Azarenkov </a>
* @version $Id: BaseStandaloneTest.java 12004 2007-01-17 12:03:57Z geaz $
*/
public abstract class BaseStandaloneTest extends TestCase
{
private static final Log log = ExoLogger.getLogger("exo.jcr.component.ftp.BaseStandaloneTest");
protected SessionImpl session;
protected RepositoryImpl repository;
protected CredentialsImpl credentials;
protected Workspace workspace;
protected RepositoryService repositoryService;
protected Node root;
protected ValueFactory valueFactory;
protected StandaloneContainer container;
protected class CompareStreamException extends Exception
{
private static final long serialVersionUID = -5150674060200906643L;
CompareStreamException(String message)
{
super(message);
}
CompareStreamException(String message, Throwable e)
{
super(message, e);
}
}
public void setUp() throws Exception
{
String containerConf = getClass().getResource("/conf/standalone/test-configuration.xml").toString();
String loginConf = Thread.currentThread().getContextClassLoader().getResource("login.conf").toString();
StandaloneContainer.addConfigurationURL(containerConf);
container = StandaloneContainer.getInstance();
if (System.getProperty("java.security.auth.login.config") == null)
System.setProperty("java.security.auth.login.config", loginConf);
credentials = new CredentialsImpl("root", "exo".toCharArray());
repositoryService = (RepositoryService)container.getComponentInstanceOfType(RepositoryService.class);
// container.start();
repository = (RepositoryImpl)repositoryService.getDefaultRepository();
session = (SessionImpl)repository.login(credentials, "ws");
workspace = session.getWorkspace();
root = session.getRootNode();
valueFactory = session.getValueFactory();
}
protected void tearDown() throws Exception
{
if (session != null)
{
try
{
session.refresh(false);
Node rootNode = session.getRootNode();
if (rootNode.hasNodes())
{
// clean test root
for (NodeIterator children = rootNode.getNodes(); children.hasNext();)
{
Node node = children.nextNode();
if (!node.getPath().startsWith("/jcr:system") && !node.getPath().startsWith("/exo:audit")
&& !node.getPath().startsWith("/exo:organization"))
{
// log.info("DELETing ------------- "+node.getPath());
node.remove();
}
}
session.save();
}
}
catch (Exception e)
{
e.printStackTrace();
log.error("===== Exception in tearDown() " + e.toString());
}
finally
{
session.logout();
}
}
super.tearDown();
}
// ====== utils =======
protected void checkItemsExisted(String[] exists, String[] notExists) throws RepositoryException
{
String path = null;
if (exists != null)
{
try
{
for (String nodePath : exists)
{
path = nodePath;
session.getItem(path);
}
}
catch (PathNotFoundException e)
{
fail("Item must exists " + path + ". " + e.getMessage());
}
}
if (notExists != null)
{
try
{
for (String nodePath : notExists)
{
session.getItem(nodePath);
fail("Item must not exists " + nodePath);
}
}
catch (PathNotFoundException e)
{
// ok
}
}
}
protected void checkNodesExistedByUUID(String[] exists, String[] notExists) throws RepositoryException
{
String uuid = null;
if (exists != null)
{
try
{
for (String nodePath : exists)
{
uuid = nodePath;
session.getNodeByUUID(uuid);
}
}
catch (PathNotFoundException e)
{
fail("Node must exists, UUID " + uuid + ". " + e.getMessage());
}
}
if (notExists != null)
{
try
{
for (String nodeUUID : notExists)
{
session.getNodeByUUID(nodeUUID);
fail("Node must not exists, UUID " + nodeUUID);
}
}
catch (PathNotFoundException e)
{
// ok
}
}
}
protected void compareStream(InputStream etalon, InputStream data) throws IOException
{
try
{
compareStream(etalon, data, 0, 0, -1);
}
catch (CompareStreamException e)
{
fail(e.getMessage());
}
}
/**
* Compare etalon stream with data stream begining from the offset in etalon and position in data.
* Length bytes will be readed and compared. if length is lower 0 then compare streams till one of
* them will be read.
*
* @param etalon
* @param data
* @param etalonPos
* @param length
* @param dataPos
* @throws IOException
*/
protected void compareStream(InputStream etalon, InputStream data, long etalonPos, long dataPos, long length)
throws IOException, CompareStreamException
{
int dindex = 0;
skipStream(etalon, etalonPos);
skipStream(data, dataPos);
byte[] ebuff = new byte[1024];
int eread = 0;
while ((eread = etalon.read(ebuff)) > 0)
{
byte[] dbuff = new byte[eread];
int erindex = 0;
while (erindex < eread)
{
int dread = -1;
try
{
dread = data.read(dbuff);
}
catch (IOException e)
{
throw new CompareStreamException("Streams is not equals by length or data stream is unreadable. Cause: "
+ e.getMessage());
}
if (dread == -1)
throw new CompareStreamException(
"Streams is not equals by length. Data end-of-stream reached at position " + dindex);
for (int i = 0; i < dread; i++)
{
byte eb = ebuff[i];
byte db = dbuff[i];
if (eb != db)
throw new CompareStreamException("Streams is not equals. Wrong byte stored at position " + dindex
+ " of data stream. Expected 0x" + Integer.toHexString(eb) + " '" + new String(new byte[]{eb})
+ "' but found 0x" + Integer.toHexString(db) + " '" + new String(new byte[]{db}) + "'");
erindex++;
dindex++;
if (length > 0 && dindex >= length)
return; // tested length reached
}
if (dread < eread)
dbuff = new byte[eread - dread];
}
}
if (data.available() > 0)
throw new CompareStreamException("Streams is not equals by length. Data stream contains more data. Were read "
+ dindex);
}
protected void skipStream(InputStream stream, long pos) throws IOException
{
long curPos = pos;
long sk = 0;
while ((sk = stream.skip(curPos)) > 0)
{
curPos -= sk;
};
if (sk < 0)
fail("Can not read the stream (skip bytes)");
if (curPos != 0)
fail("Can not skip bytes from the stream (" + pos + " bytes)");
}
protected File createBLOBTempFile(int sizeInKb) throws IOException
{
return createBLOBTempFile("exo_jcr_test_temp_file_", sizeInKb);
}
protected File createBLOBTempFile(String prefix, int sizeInKb) throws IOException
{
// create test file
byte[] data = new byte[1024]; // 1Kb
File testFile = File.createTempFile(prefix, ".tmp");
FileOutputStream tempOut = new FileOutputStream(testFile);
Random random = new Random();
for (int i = 0; i < sizeInKb; i++)
{
random.nextBytes(data);
tempOut.write(data);
}
tempOut.close();
testFile.deleteOnExit(); // delete on test exit
return testFile;
}
protected void checkMixins(String[] mixins, NodeImpl node) throws RepositoryException
{
try
{
String[] nodeMixins = node.getMixinTypeNames();
assertEquals("Mixins count is different", mixins.length, nodeMixins.length);
compareMixins(mixins, nodeMixins);
}
catch (RepositoryException e)
{
fail("Mixins isn't accessible on the node " + node.getPath());
}
}
protected void compareMixins(String[] mixins, String[] nodeMixins)
{
nextMixin : for (String mixin : mixins)
{
for (String nodeMixin : nodeMixins)
{
if (mixin.equals(nodeMixin))
continue nextMixin;
}
fail("Mixin '" + mixin + "' isn't accessible");
}
}
protected String memoryInfo()
{
String info = "";
info =
"free: " + mb(Runtime.getRuntime().freeMemory()) + "M of " + mb(Runtime.getRuntime().totalMemory())
+ "M (max: " + mb(Runtime.getRuntime().maxMemory()) + "M)";
return info;
}
// bytes to Mbytes
protected String mb(long mem)
{
return String.valueOf(Math.round(mem * 100d / (1024d * 1024d)) / 100d);
}
protected String execTime(long from)
{
return Math.round(((System.currentTimeMillis() - from) * 100.00d / 60000.00d)) / 100.00d + "min";
}
}