package org.tmatesoft.svn.test; import java.io.File; import java.io.IOException; import java.util.HashMap; import java.util.Map; import org.junit.Assert; import org.junit.Test; import org.tmatesoft.svn.core.SVNErrorCode; import org.tmatesoft.svn.core.SVNException; import org.tmatesoft.svn.core.SVNProperties; import org.tmatesoft.svn.core.SVNProperty; import org.tmatesoft.svn.core.SVNURL; import org.tmatesoft.svn.core.internal.wc.DefaultSVNOptions; import org.tmatesoft.svn.core.internal.wc.SVNConfigFile; import org.tmatesoft.svn.core.internal.wc.SVNFileUtil; import org.tmatesoft.svn.core.wc.ISVNOptions; import org.tmatesoft.svn.core.wc.SVNRevision; import org.tmatesoft.svn.core.wc2.ISvnAddParameters; import org.tmatesoft.svn.core.wc2.ISvnObjectReceiver; import org.tmatesoft.svn.core.wc2.SvnGetProperties; import org.tmatesoft.svn.core.wc2.SvnOperationFactory; import org.tmatesoft.svn.core.wc2.SvnScheduleForAddition; import org.tmatesoft.svn.core.wc2.SvnTarget; public class SvnAddParametersTest { @Test public void testInconsistentEolsReportError() throws Exception { final TestOptions options = TestOptions.getInstance(); final SvnOperationFactory svnOperationFactory = new SvnOperationFactory(); final Sandbox sandbox = Sandbox.createWithCleanup(getTestName() + ".testInconsistentEolsReportError", options); try { final File someFile = prepareMixedEolsFileInWorkingCopy(svnOperationFactory, sandbox, SVNProperty.EOL_STYLE, SVNProperty.EOL_STYLE_CR); try { add(svnOperationFactory, someFile, ISvnAddParameters.Action.REPORT_ERROR); Assert.fail("An exception should be thrown"); } catch (SVNException e) { Assert.assertEquals(e.getErrorMessage().getErrorCode(), SVNErrorCode.ILLEGAL_TARGET); //expected } } finally { sandbox.dispose(); svnOperationFactory.dispose(); } } @Test public void testInconsistentEolsAddAsIs() throws Exception { final TestOptions options = TestOptions.getInstance(); final SvnOperationFactory svnOperationFactory = new SvnOperationFactory(); final Sandbox sandbox = Sandbox.createWithCleanup(getTestName() + ".testInconsistentEolsAddAsIs", options); try { final File someFile = prepareMixedEolsFileInWorkingCopy(svnOperationFactory, sandbox, SVNProperty.EOL_STYLE, SVNProperty.EOL_STYLE_CR); add(svnOperationFactory, someFile, ISvnAddParameters.Action.ADD_AS_IS); final SVNProperties properties = getProperties(svnOperationFactory, someFile); Assert.assertEquals(null, properties.getSVNPropertyValue(SVNProperty.EOL_STYLE)); Assert.assertEquals(null, properties.getSVNPropertyValue(SVNProperty.MIME_TYPE)); } finally { sandbox.dispose(); svnOperationFactory.dispose(); } } @Test public void testInconsistentEolsAddAsBinary() throws Exception { final TestOptions options = TestOptions.getInstance(); final SvnOperationFactory svnOperationFactory = new SvnOperationFactory(); final Sandbox sandbox = Sandbox.createWithCleanup(getTestName() + ".testInconsistentEolsAddAsBinary", options); try { final File someFile = prepareMixedEolsFileInWorkingCopy(svnOperationFactory, sandbox, SVNProperty.EOL_STYLE, SVNProperty.EOL_STYLE_CR); add(svnOperationFactory, someFile, ISvnAddParameters.Action.ADD_AS_BINARY); final SVNProperties properties = getProperties(svnOperationFactory, someFile); Assert.assertEquals(null, properties.getSVNPropertyValue(SVNProperty.EOL_STYLE)); Assert.assertEquals(SVNFileUtil.BINARY_MIME_TYPE, properties.getSVNPropertyValue(SVNProperty.MIME_TYPE).getString()); } finally { sandbox.dispose(); svnOperationFactory.dispose(); } } private SVNProperties getProperties(SvnOperationFactory svnOperationFactory, File someFile) throws SVNException { final SVNProperties[] properties = new SVNProperties[1]; final SvnGetProperties getProperties = svnOperationFactory.createGetProperties(); getProperties.setSingleTarget(SvnTarget.fromFile(someFile)); getProperties.setReceiver(new ISvnObjectReceiver<SVNProperties>() { public void receive(SvnTarget target, SVNProperties svnProperties) throws SVNException { properties[0] = svnProperties; } }); getProperties.run(); return properties[0] == null ? new SVNProperties() : properties[0]; } private File prepareMixedEolsFileInWorkingCopy(SvnOperationFactory svnOperationFactory, Sandbox sandbox, String propertyName, String propertyValueString) throws SVNException, IOException { final SVNURL url = sandbox.createSvnRepository(); final WorkingCopy workingCopy = sandbox.checkoutNewWorkingCopy(url, SVNRevision.HEAD.getNumber()); final File workingCopyDirectory = workingCopy.getWorkingCopyDirectory(); final File someFile = new File(workingCopyDirectory, "someFile"); final String mixedEolsContentsString = "line1" + "\n" + "line2" + "\r\n"; TestUtil.writeFileContentsString(someFile, mixedEolsContentsString); final ISVNOptions svnOptions = createOptionsForAutoProperties(sandbox.createDirectory("options"), someFile.getName(), propertyName, propertyValueString); svnOperationFactory.setOptions(svnOptions); return someFile; } private void add(SvnOperationFactory svnOperationFactory, File someFile, ISvnAddParameters.Action action) throws SVNException { final SvnScheduleForAddition scheduleForAddition = svnOperationFactory.createScheduleForAddition(); scheduleForAddition.setSingleTarget(SvnTarget.fromFile(someFile)); scheduleForAddition.setAddParents(false); scheduleForAddition.setApplyAutoProperties(true); scheduleForAddition.setIncludeIgnored(true); scheduleForAddition.setMkDir(false); scheduleForAddition.setAddParameters(createSvnAddParameters(action)); scheduleForAddition.run(); } private ISVNOptions createOptionsForAutoProperties(File optionsDirectory, String filePattern, String propertyName, String propertyValueString) { final Map<String, String> autoProperties = new HashMap<String, String>(); autoProperties.put(filePattern, propertyName + "=" + propertyValueString); return createOptionsForAutoProperties(optionsDirectory, autoProperties); } private ISvnAddParameters createSvnAddParameters(final ISvnAddParameters.Action action) { return new ISvnAddParameters() { public ISvnAddParameters.Action onInconsistentEOLs(File file) { return action; } }; } private ISVNOptions createOptionsForAutoProperties(File optionsDirectory, Map<String, String> autoProperties) { final File configFile = new File(optionsDirectory, "config"); final SVNConfigFile svnConfigFile = new SVNConfigFile(configFile); svnConfigFile.setPropertyValue("miscellany", "enable-auto-props", "true", true); final DefaultSVNOptions svnOptions = new DefaultSVNOptions(optionsDirectory, false); svnOptions.setAutoProperties(autoProperties); return svnOptions; } private String getTestName() { return "SvnAddParametersTest"; } }