package org.tmatesoft.svn.test; import org.tmatesoft.sqljet.core.SqlJetException; import org.tmatesoft.sqljet.core.SqlJetTransactionMode; import org.tmatesoft.sqljet.core.table.ISqlJetCursor; import org.tmatesoft.sqljet.core.table.ISqlJetTable; import org.tmatesoft.sqljet.core.table.SqlJetDb; import org.tmatesoft.svn.core.SVNDepth; import org.tmatesoft.svn.core.SVNErrorCode; import org.tmatesoft.svn.core.SVNErrorMessage; import org.tmatesoft.svn.core.SVNException; import org.tmatesoft.svn.core.internal.wc.SVNErrorManager; import org.tmatesoft.svn.core.internal.wc.SVNFileUtil; import org.tmatesoft.svn.core.internal.wc.admin.SVNChecksumInputStream; import org.tmatesoft.svn.core.internal.wc2.SvnWcGeneration; import org.tmatesoft.svn.core.wc2.*; import org.tmatesoft.svn.util.SVNLogType; import java.io.*; import java.net.ServerSocket; import java.util.HashMap; import java.util.Map; public class TestUtil { public static File createDirectory(File parentPath, String suggestedName) { File path = new File(parentPath, suggestedName); if (!path.exists()) { path.mkdirs(); return path; } for (int attempt = 0; attempt < 100; attempt++) { final String name = suggestedName + "." + attempt; path = new File(parentPath, name); if (!path.exists()) { path.mkdirs(); return path; } } throw new RuntimeException("Unable to create directory in " + parentPath); } public static void log(String message) { System.out.println(message); } public static void writeFileContentsString(File file, String contentsString) throws SVNException { final OutputStream fileOutputStream = SVNFileUtil.openFileForWriting(file); try { fileOutputStream.write(contentsString.getBytes()); } catch (IOException e) { throw new SVNException(SVNErrorMessage.create(SVNErrorCode.IO_ERROR, e)); } finally { SVNFileUtil.closeFile(fileOutputStream); } } public static String readFileContentsString(File file) throws IOException { FileInputStream fileInputStream = null; BufferedInputStream bufferedInputStream = null; ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; try { fileInputStream = new FileInputStream(file); bufferedInputStream = new BufferedInputStream(fileInputStream); while (true) { final int bytesRead = bufferedInputStream.read(buffer); if (bytesRead < 0) { break; } byteArrayOutputStream.write(buffer, 0, bytesRead); } return new String(byteArrayOutputStream.toByteArray()); } finally { SVNFileUtil.closeFile(bufferedInputStream); SVNFileUtil.closeFile(fileInputStream); } } public static SvnWcGeneration getDefaultWcGeneration() { return new SvnOperationFactory().getPrimaryWcGeneration(); } static boolean isNewWorkingCopyTest() { return getDefaultWcGeneration() == SvnWcGeneration.V17; } static boolean isNewWorkingCopyOnly() { return getDefaultWcGeneration() == SvnWcGeneration.V17 && new SvnOperationFactory().isPrimaryWcGenerationOnly(); } public static Map<File, SvnStatus> getStatuses(SvnOperationFactory svnOperationFactory, File workingCopyDirectory) throws SVNException { final Map<File, SvnStatus> pathToStatus = new HashMap<File, SvnStatus>(); final SvnGetStatus status = svnOperationFactory.createGetStatus(); status.setDepth(SVNDepth.INFINITY); status.setRemote(false); status.setReportAll(true); status.setReportIgnored(true); status.setReportExternals(false); status.setApplicalbeChangelists(null); status.setReceiver(new ISvnObjectReceiver<SvnStatus>() { public void receive(SvnTarget target, SvnStatus status) throws SVNException { pathToStatus.put(status.getPath(), status); } }); status.addTarget(SvnTarget.fromFile(workingCopyDirectory)); status.run(); return pathToStatus; } public static String md5(byte[] contents) { final byte[] tmp = new byte[1024]; final SVNChecksumInputStream checksumStream = new SVNChecksumInputStream(new ByteArrayInputStream(contents), "md5"); try { while (checksumStream.read(tmp) > 0) { // } return checksumStream.getDigest(); } catch (IOException e) { //never happens e.printStackTrace(); return null; } finally { SVNFileUtil.closeFile(checksumStream); } } public static int findFreePort() { ServerSocket socket = null; try { socket = new ServerSocket(); socket.bind(null); return socket.getLocalPort(); } catch (IOException e) { return -1; } finally { if (socket != null) { try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } } } public static String convertSlashesToDirect(String path) { return path.replace(File.separatorChar, '/'); } public static String convertSlashesToSystem(String path) { return path.replace('/', File.separatorChar); } public static boolean areAllApacheOptionsSpecified(TestOptions testOptions) { return testOptions.getApacheRoot() != null && testOptions.getApacheCtlCommand() != null; } public static boolean areAllSvnserveOptionsSpecified(TestOptions testOptions) { return testOptions.getSvnserveCommand() != null; } public static SvnChecksum calculateSha1(byte[] contents) throws SVNException { final SVNChecksumInputStream inputStream = new SVNChecksumInputStream(new ByteArrayInputStream(contents), SvnChecksum.Kind.sha1.name()); final byte[] buffer = new byte[1024]; try { while (true) { final int read = inputStream.read(buffer); if (read < 0) { break; } } final String digest = inputStream.getDigest(); return new SvnChecksum(SvnChecksum.Kind.sha1, digest); } catch (IOException e) { SVNErrorMessage errorMessage = SVNErrorMessage.create(SVNErrorCode.UNKNOWN); SVNErrorManager.error(errorMessage, e, SVNLogType.CLIENT); return null; } finally { SVNFileUtil.closeFile(inputStream); } } public static File getHookFile(File repositoryRoot, String hookName) { final File hooksDirectory = new File(repositoryRoot, "hooks"); final String ext = SVNFileUtil.isWindows ? ".bat" : ""; return new File(hooksDirectory, hookName + ext); } public static String getFailingHookContents() { return getTrivialHookContentsForExitCode(1); } public static String getSucceedingHookContents() { return getTrivialHookContentsForExitCode(0); } private static String getTrivialHookContentsForExitCode(int exitCode) { final String exitCodeString = String.valueOf(exitCode); if (SVNFileUtil.isWindows) { return "@echo off" + "\r\n" + "exit " + exitCodeString + "\r\n"; } else { return "#!/bin/sh" + "\n" + "exit " + exitCodeString + "\n"; } } public static int getTableSize(WorkingCopy workingCopy, String tableName) throws SqlJetException { final SqlJetDb db = SqlJetDb.open(workingCopy.getWCDbFile(), false); try { final ISqlJetTable table = db.getTable(tableName); db.beginTransaction(SqlJetTransactionMode.READ_ONLY); final ISqlJetCursor cursor = table.open(); int count = 0; for (; !cursor.eof(); cursor.next()) { count++; } cursor.close(); db.commit(); return count; } finally { db.close(); } } }