[[[
    JavaHL: Add unit tests for the Ra API

    [ in subversion/bindings/javahl/test/org/tigris/subversion/javahl/ ]

    * RaReadonlyTests.java: New readonly tests for the RA API

    * RaTests.java: New read/write tests for the RA API

    * RunTests.java
      (suite): Add the RaReadonlyTests and RaTests to the test suit
]]]
Index: 
subversion/bindings/javahl/tests/org/apache/subversion/javahl/RaReadonlyTests.java
===================================================================
--- 
subversion/bindings/javahl/tests/org/apache/subversion/javahl/RaReadonlyTests.java
  (revision 0)
+++ 
subversion/bindings/javahl/tests/org/apache/subversion/javahl/RaReadonlyTests.java
  (working copy)
@@ -0,0 +1,316 @@
+package org.apache.subversion.javahl;
+
+import java.util.Collections;
+import java.util.Map;
+
+import junit.framework.TestCase;
+
+import org.apache.subversion.javahl.ra.ISVNDirectory;
+import org.apache.subversion.javahl.ra.ISVNEditor;
+import org.apache.subversion.javahl.ra.ISVNFile;
+import org.apache.subversion.javahl.ra.ISVNRa;
+import org.apache.subversion.javahl.ra.SVNCommitEditorBuilder;
+
+/*
+ * This class contains SVN test and only does initial setup ones
+ * to avoid creating repository every time when it is not necessary
+ * as the test in this class do not alter repository state
+ */
+public class RaReadonlyTests extends TestCase
+{
+       /**
+        * Base name of all our tests.
+        */
+       public final static String TEST_NAME = "ra_readonly_test";
+
+       private SVNTests svnTests;
+
+       public RaReadonlyTests()
+       {
+       }
+
+       private SVNTests getSVNTest()
+       {
+               /*
+                * Create svnTests instance on demand, to make sure 
+                * it is done after other tests have run 
+                */
+               if(svnTests != null)
+               {
+                       return svnTests;
+               }
+
+               svnTests = new SVNTests();
+               svnTests.setTestBaseName(TEST_NAME);
+
+               try
+               {
+                       svnTests.setUp();
+               }
+               catch (Exception e)
+               {
+                       throw new RuntimeException(e);
+               }
+               
+               return svnTests;
+       }
+       
+       private ISVNRa getSession(String url)
+       {
+               return RaTests.getSession(url, 
getSVNTest().getConf().getAbsolutePath());
+       }
+
+       public void testEditorAbort() throws Exception
+       {
+               String url = getSVNTest().getGreeksRepoUrl();
+               ISVNRa session = getSession(url);
+               assertNotNull(session);
+
+               Map<String, String> emptyMap = Collections.emptyMap();
+               ISVNEditor editor = session.getCommitEditor(emptyMap, null, 
null, true);
+               assertNotNull(editor);
+
+               /*
+                * Test commit abort
+                */
+               editor.abortEdit();
+       }
+
+       public void testEditorBadRevProps() throws Exception
+       {
+               /*
+                * Bad client behavior test Bad parameters Editor use after 
close/abort
+                * Directory use after close Directory use after parent close 
Directory
+                * use before open children are closed File stream use after 
editor
+                * close Null revProperties
+                */
+
+               String url = getSVNTest().getGreeksRepoUrl();
+               ISVNRa session = getSession(url);
+               assertNotNull(session);
+
+               try
+               {
+                       session.getCommitEditor(null, null, null, true);
+                       fail("RA session should have thrown exception");
+               }
+               catch (JNIError e)
+               {
+               }
+       }
+
+       /*
+        * Test that opening directories and file and closing Ra session does 
not
+        * nuke the JVM
+        */
+       public void testRaObjectsAutoDisposal() throws Exception
+       {
+               String url = getSVNTest().getGreeksRepoUrl();
+               ISVNRa session = getSession(url);
+               assertNotNull(session);
+
+               ISVNEditor editor = new 
SVNCommitEditorBuilder().create(session);
+
+               long baseRevision = 1;
+               ISVNDirectory dirRoot = editor.openRoot(baseRevision);
+               ISVNDirectory dirZ = dirRoot.addDirectory("Z");
+               dirZ.addDirectory("V");
+               ISVNFile fileX = dirZ.addFile("X");
+               session.dispose();
+               
+               try
+               {
+                       dirRoot.addDirectory("Y");
+                       fail("RA session should have thrown exception when 
calling methods on disposed directory");
+               }
+               catch (JNIError e)
+               {
+               }               
+
+               try
+               {
+                       fileX.changeProperty("A", "B".getBytes());
+                       fail("RA session should have thrown exception when 
calling methods on disposed file");
+               }
+               catch (JNIError e)
+               {
+               }               
+               
+       }
+
+       public void testRaDirectoryBadCalls() throws Exception
+       {
+               String url = getSVNTest().getGreeksRepoUrl();
+               ISVNRa session = getSession(url);
+               assertNotNull(session);
+
+               Map<String, String> emptyMap = Collections.emptyMap();
+               ISVNEditor editor = session.getCommitEditor(emptyMap, null, 
null, true);
+
+               long baseRevision = 1;
+               ISVNDirectory dirRoot = editor.openRoot(baseRevision);
+               
+               assertNotNull(dirRoot);
+               
+               try
+               {
+                       dirRoot.addDirectory(null);
+                       fail("RA session should have thrown exception when 
calling addDirectory with null parameter");
+               } catch (NullPointerException e) {}             
+
+               try
+               {
+                       dirRoot.addFile(null);
+                       fail("RA session should have thrown exception when 
calling addFile with null parameter");
+               } catch (NullPointerException e) {}             
+
+               try
+               {
+                       dirRoot.changeProperty(null, null);
+                       fail("RA session should have thrown exception when 
calling changeProperty with null parameter");
+               } catch (NullPointerException e) {}             
+
+               try
+               {
+                       dirRoot.deleteEntry(null, -10);
+                       fail("RA session should have thrown exception when 
calling DeleteEntry with null parameter");
+               } catch (NullPointerException e) {}             
+               
+               try
+               {
+                       dirRoot.openDirectory(null, -10);
+                       fail("RA session should have thrown exception when 
calling openDirectory with null parameter");
+               } catch (NullPointerException e) {}             
+               
+               try
+               {
+                       dirRoot.openFile(null, -10);
+                       fail("RA session should have thrown exception when 
calling openFile with null parameter");
+               } catch (NullPointerException e) {}             
+               
+               editor.abortEdit();
+       }
+
+       public void testRaFileBadCalls() throws Exception
+       {
+               String url = getSVNTest().getGreeksRepoUrl();
+               ISVNRa session = getSession(url);
+               assertNotNull(session);
+
+               Map<String, String> emptyMap = Collections.emptyMap();
+               ISVNEditor editor = session.getCommitEditor(emptyMap, null, 
null, true);
+
+               long baseRevision = 1;
+               ISVNDirectory dirRoot = editor.openRoot(baseRevision);
+               ISVNFile fileX = dirRoot.addFile("X");
+               assertNotNull(fileX);
+
+               ISVNFile fileY = dirRoot.addFile("Y");
+               assertNotNull(fileY);
+
+               ISVNFile fileZ = dirRoot.addFile("Z");
+               assertNotNull(fileZ);
+               
+               try
+               {
+                       fileX.sendDeltaStream(null, null, null);
+                       fail("RA session should have thrown exception when 
calling sendDeltaStream with null parameter");
+               } catch (NullPointerException e) {}             
+
+               try
+               {
+                       fileY.sendStream(null, null);
+                       fail("RA session should have thrown exception when 
calling addFile with null parameter");
+               } catch (NullPointerException e) {}             
+
+               try
+               {
+                       fileZ.changeProperty(null, null);
+                       fail("RA session should have thrown exception when 
calling changeProperty with null parameter");
+               } catch (NullPointerException e) {}             
+
+               editor.abortEdit();
+       }
+
+       public void testGetRoot() throws Exception
+       {
+               String url = getSVNTest().getGreeksRepoUrl();
+               ISVNRa session = getSession(url);
+
+               assertEquals(url, session.getRoot());
+       }
+
+       public void testGetLatestRevision() throws Exception
+       {
+               String url = getSVNTest().getGreeksRepoUrl();
+               ISVNRa session = getSession(url);
+
+               assertEquals(1, session.getLatestRevision());
+       }
+
+       public void testGetUrl() throws Exception
+       {
+               String url = getSVNTest().getGreeksRepoUrl();
+               ISVNRa session = getSession(url);
+
+               assertEquals(url, session.getUrl());
+       }
+
+       public void testGetUUID() throws Exception
+       {
+               String url = getSVNTest().getGreeksRepoUrl();
+               ISVNRa session = getSession(url);
+               /*
+                * Test UUID
+                */
+               assertNotNull(session.getUUID());
+       }
+
+       public void testReparent() throws Exception
+       {
+               String url = getSVNTest().getGreeksRepoUrl();
+               ISVNRa session = getSession(url);
+
+               /*
+                * Test null reparent
+                */
+               try
+               {
+                       session.reparent(null);
+                       fail("RA session should have thrown exception");
+               }
+               catch (JNIError e)
+               {
+               }
+
+               /*
+                * Test bad reparent
+                */
+
+               /*
+                * FIXME: Running this results in assertion java:
+                * subversion/libsvn_subr/dirent_uri.c:1483: uri_skip_ancestor:
+                * Assertion `svn_uri_is_canonical(child_uri, ((void *)0))' 
failed.
+                * Should be fixed as we never know what the caller might pass 
and take
+                * down JVM
+                */
+               // session.reparent("BAD");
+
+               try
+               {
+                       session.reparent("file:///dev/null");
+               }
+               catch (Exception e)
+               {
+               }
+
+               /*
+                * Test reparent
+                */
+               session.reparent(url + "/A");
+               assertEquals(url + "/A", session.getUrl());
+               session.reparent(url);
+               assertEquals(url, session.getUrl());
+
+       }
+}
Index: 
subversion/bindings/javahl/tests/org/apache/subversion/javahl/RaTests.java
===================================================================
--- subversion/bindings/javahl/tests/org/apache/subversion/javahl/RaTests.java  
(revision 0)
+++ subversion/bindings/javahl/tests/org/apache/subversion/javahl/RaTests.java  
(working copy)
@@ -0,0 +1,605 @@
+package org.apache.subversion.javahl;
+
+import java.io.ByteArrayInputStream;
+import java.io.UnsupportedEncodingException;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicReference;
+
+import org.apache.subversion.javahl.callback.CommitCallback;
+import org.apache.subversion.javahl.callback.InfoCallback;
+import org.apache.subversion.javahl.callback.LogMessageCallback;
+import org.apache.subversion.javahl.callback.ProgressCallback;
+import org.apache.subversion.javahl.ra.ISVNDirectory;
+import org.apache.subversion.javahl.ra.ISVNEditor;
+import org.apache.subversion.javahl.ra.ISVNFile;
+import org.apache.subversion.javahl.ra.ISVNRa;
+import org.apache.subversion.javahl.ra.SVNCommitEditorBuilder;
+import org.apache.subversion.javahl.ra.SVNRaConfigDefault;
+import org.apache.subversion.javahl.ra.SVNRaFactory;
+import org.apache.subversion.javahl.types.ChangePath;
+import org.apache.subversion.javahl.types.Depth;
+import org.apache.subversion.javahl.types.Info;
+import org.apache.subversion.javahl.types.NodeKind;
+import org.apache.subversion.javahl.types.Property;
+import org.apache.subversion.javahl.types.Revision;
+import org.apache.subversion.javahl.types.RevisionRange;
+import org.apache.subversion.javahl.types.Tristate;
+
+public class RaTests extends SVNTests
+{
+       /**
+        * Base name of all our tests.
+        */
+       public final static String TEST_NAME = "ra_test";
+       private final static String DIR_PROPERTY_NAME = "dirTest";
+       private final static String FILE_PROPERTY_NAME = "fileTest";
+
+       private final static String DIR_WITH_PROPERTY_CHANGE = "/A/B/E/I";
+       private final static String FILE_WITH_PROPERTY_CHANGE = 
"/A/B/E/epsilon";
+       
+       private final static byte[] PROPERTY_VALUE;
+       
+       static
+       {
+               try
+               {
+                       PROPERTY_VALUE = "success".getBytes("UTF-8");
+               }
+               catch (UnsupportedEncodingException e)
+               {
+                       throw new RuntimeException(e);
+                       
+               }
+       }
+       
+       public RaTests()
+       {
+               super();
+
+               if (!TEST_NAME.equals(testBaseName))
+               {
+                       testCounter = 0;
+                       testBaseName = TEST_NAME;
+               }
+       }
+
+       public static ISVNRa getSession(String url, String configDirectory)
+       {
+               SVNRaConfigDefault config = new SVNRaConfigDefault();
+               config.setUsername(USERNAME);
+               config.setPassword(PASSWORD);
+               config.setPrompt(new DefaultPromptUserPassword());
+               config.setConfigDirectory(configDirectory);
+               
+               ISVNRa raSession = SVNRaFactory.createRaSession(url, null, 
config);
+
+               assertNotNull("Null session was returned by factory", 
raSession);
+
+               return raSession;
+       }
+       
+       private ISVNRa getSession(String url)
+       {
+               return getSession(url, super.conf.getAbsolutePath());
+       }
+
+       public void testEditorClose() throws Exception
+       {
+               OneTest thisTest = new OneTest(false);
+
+               String url = thisTest.getUrl().toString();
+               //url = "svn://localhost";
+
+               ISVNRa session = getSession(url);
+               
+               assertNotNull(session);
+
+               /*
+                * Setup callbacks
+                */
+               final AtomicReference<CommitInfo> refCommitInfo = new 
AtomicReference<CommitInfo>();
+
+               CommitCallback testCommitCallback = new CommitCallback()
+               {
+                       @Override
+                       public void commitInfo(CommitInfo info)
+                       {
+                               refCommitInfo.set(info);
+                       }
+               };
+
+               final AtomicBoolean progressListenerCalled = new 
AtomicBoolean(false);
+               
+               ProgressCallback progressListener = new ProgressCallback()
+               {
+                       
+                       @Override
+                       public void onProgress(ProgressEvent event)
+                       {
+                               progressListenerCalled.set(true);
+                       }
+               };
+               session.setProgressCallback(progressListener);
+               final String logMessage = "RA Editor Test Commit";
+               
+               ISVNEditor editor = new SVNCommitEditorBuilder()
+                               .setCommitCallback(testCommitCallback)
+                               .setCommitMessage(logMessage)
+                               .keepLocks()
+                               .create(session);
+               
+               assertNotNull(editor);
+
+               /*
+                * Test commit editor functions:
+                * Root open 
+                * Directory add
+                * Directory open 
+                * Directory delete 
+                * Directory property change
+                * Directory close 
+                * File Add 
+                * File Open 
+                * File delete 
+                * File (full stream)
+                * File (delta stream) 
+                * File property change
+                * File close 
+                */
+               final long baseRevision = 1;
+               final long newRevision = baseRevision + 1;
+
+               /*
+                * Open root
+                */
+               ISVNDirectory directoryRoot = editor.openRoot(baseRevision);
+
+               assertNotNull(directoryRoot);
+
+               /*
+                * Open Directories
+                */
+               ISVNDirectory directoryA = directoryRoot.openDirectory("A", 
baseRevision);
+               assertNotNull(directoryA);
+
+               ISVNDirectory directoryB = directoryA.openDirectory("A/B", 
baseRevision);
+               assertNotNull(directoryB);
+
+               ISVNDirectory directoryE = directoryB.openDirectory("A/B/E", 
baseRevision);
+               assertNotNull(directoryE);
+
+               /*
+                * Add directory
+                */
+               ISVNDirectory directoryI = 
directoryE.addDirectory(DIR_WITH_PROPERTY_CHANGE, url + "/A/D",
+                               baseRevision);
+               assertNotNull(directoryI);
+
+               /*
+                * Change directory property
+                */
+               directoryI.changeProperty(DIR_PROPERTY_NAME, PROPERTY_VALUE);
+               
+               /*
+                * Delete directory
+                */
+               directoryI.deleteEntry("A/B/E/I/G", baseRevision);
+               directoryI.close();
+
+               /*
+                * Copy file
+                */
+               ISVNFile fileDeltaCopy = directoryE.addFile("A/B/E/delta", url 
+ "/A/D/G/pi",
+                               baseRevision);
+               assertNotNull(fileDeltaCopy);
+               
+               //Verify that copy md5 checksum is correct
+               final String piMd5 = "44d43786ca76767c3b57d5c5bfe93299";
+               fileDeltaCopy.close(piMd5);
+
+               /*
+                * Create new file
+                */
+               {
+                       final byte[] epsilonContent = "This is the file 
'epsilon'.".getBytes("UTF-8");
+                       final String epsilonMd5 = 
"72cf2e20fb7d113b2ed1a353e53cfc71";
+                       
+                       ISVNFile fileEpsilonNew = 
directoryE.addFile(FILE_WITH_PROPERTY_CHANGE);
+                       assertNotNull(fileEpsilonNew);
+                       fileEpsilonNew.changeProperty(FILE_PROPERTY_NAME, 
PROPERTY_VALUE);
+                       
+                       fileEpsilonNew.sendStream(
+                                       new 
ByteArrayInputStream(epsilonContent),
+                                       null);
+                       
+                       fileEpsilonNew.close(epsilonMd5);
+               }
+               
+               /*
+                * Modify existing file
+                */
+               {
+                       final byte[] alphaContentV1 = "This is the file 
'alpha'.".getBytes("UTF-8");
+                       final String alphaV1Md5 = 
"440bc1eb6bd3fbeefb383cbaa6b02528";
+
+                       final byte[] alphaContentV2 = "This is the file 
'alphaV2'.".getBytes("UTF-8");
+                       final String alphaV2Md5 = 
"8a49d51be9c13a06de92d7ff53f27524";
+                       
+                       ISVNFile fileAlphaMod = 
directoryE.openFile("A/B/E/alpha", baseRevision);
+                       assertNotNull(fileAlphaMod);
+
+                       fileAlphaMod.sendDeltaStream(new 
ByteArrayInputStream(alphaContentV1), 
+                                       new 
ByteArrayInputStream(alphaContentV2), alphaV1Md5);
+                       
+                       fileAlphaMod.close(alphaV2Md5);
+               }
+
+               /*
+                * Delete file
+                */
+               directoryE.deleteEntry("A/B/E/beta", baseRevision);
+               
+               directoryE.close();
+               directoryB.close();
+               directoryA.close();
+               directoryRoot.close();
+               
+               editor.closeEdit();
+
+        // ### FIXME: This isn't working over ra_local, because
+        // ### ra_local is not invoking the progress callback.
+        if (!url.startsWith("file://"))
+        {
+            assertTrue("Progress listener called", 
progressListenerCalled.get());
+        }
+        
+               /*
+                * Verify commit info
+                */
+               CommitInfo commitInfo = refCommitInfo.get(); 
+               
+               assertNotNull("Sucessfull commit should have resulted in commit 
callback", commitInfo);
+               
+               
+               assertEquals(USERNAME, commitInfo.author);
+               assertEquals(newRevision, commitInfo.revision);
+
+               /*
+                * Check that results of editing are as expected
+                */
+               final Map<String, NodeAssertInfo> expectedState = 
getExpectedEditorResults(url, newRevision, baseRevision); 
+                               
+               final AtomicInteger nodesVisited = new AtomicInteger(0);
+               Revision objNewRevision = Revision.getInstance(newRevision); 
+               
+               /*
+                * Confirm expected repository layout
+                */
+               super.client.info2(url, objNewRevision, objNewRevision, 
Depth.infinity, null, 
+                               new InfoCallback()
+                               {
+                                       @Override
+                                       public void singleInfo(Info info)
+                                       {
+                                               nodesVisited.incrementAndGet();
+                                               
+                                               final String url = 
info.getUrl();
+                                               NodeAssertInfo assertInfo = 
expectedState.get(url);
+                                               
+                                               
assertNotNull(String.format("Expected state for url %s not found", url), 
assertInfo);
+                                               
+                                               assertEquals("Kind", 
assertInfo.getKind(), info.getKind());
+                                               assertEquals("Revision", 
assertInfo.getRevision(), info.getRev());
+                                       }
+                               } 
+               );
+
+               assertEquals(expectedState.size(), nodesVisited.get());
+               
+               /*
+                * Confirm copy from paths and text mods
+                */
+               final Set<ChangePath> changedPathsSet = new 
HashSet<ChangePath>();
+               final Map<String, byte[]> revPropsMap = new HashMap<String, 
byte[]>();
+               
+               super.client.logMessages(url, objNewRevision, 
+                               Collections.singletonList(new 
RevisionRange(objNewRevision, objNewRevision)), false, true, false, 
+                               Collections.singleton(Property.REV_LOG), 1, 
+                               new LogMessageCallback()
+                               {
+                                       @Override
+                                       public void 
singleMessage(Set<ChangePath> changedPaths, long revision,
+                                                       Map<String, byte[]> 
revprops, boolean hasChildren)
+                                       {
+                                               assertEquals(newRevision, 
revision);
+                                               
+                                               
changedPathsSet.addAll(changedPaths);
+                                               
+                                               revPropsMap.putAll(revprops);
+                                       }
+                               });
+               
+               assertTrue("Changed paths set had no data", 
changedPathsSet.size() > 0);
+               assertTrue("revision properties map had no data", 
revPropsMap.size() > 0);
+               
+               assertEquals(logMessage, new 
String(revPropsMap.get(Property.REV_LOG), "UTF-8"));
+               
+               final Map<String, NodeAssertInfo> deletedState = 
getExpectedEditorDeletions(url, newRevision, baseRevision); 
+               
+               for (ChangePath changePath : changedPathsSet)
+               {
+                       final String lookupUrl = url + changePath.getPath();
+                       NodeAssertInfo assertInfo = 
expectedState.get(lookupUrl);
+                       
+                       if(assertInfo == null)
+                       {
+                               assertInfo = deletedState.get(lookupUrl);
+                       }
+                       
+                       assertNotNull(String.format("Expected state for url %s 
not found", lookupUrl), assertInfo);
+
+                       if(assertInfo.getTextMods() != null)
+                       {
+                               assertEquals(assertInfo.getTextMods(), 
changePath.getTextMods());
+                       }
+                       
+                       if(assertInfo.getAction() != null)
+                       {
+                               assertEquals(assertInfo.getAction(), 
changePath.getAction());
+                       }
+                       
+                       assertEquals("Copy From URL", 
assertInfo.getCopyFromUrl(), changePath.getCopySrcPath());
+                       assertEquals("Copy From Rev", 
assertInfo.getCopyFromRev(), changePath.getCopySrcRevision());
+               }
+               
+               final byte[] filePropertyValue = super.client.propertyGet(url + 
FILE_WITH_PROPERTY_CHANGE, FILE_PROPERTY_NAME, objNewRevision, objNewRevision);
+               assertTrue("File property", Arrays.equals(PROPERTY_VALUE, 
filePropertyValue));
+               
+               final byte[] dirPropertyValue = super.client.propertyGet(url + 
DIR_WITH_PROPERTY_CHANGE, DIR_PROPERTY_NAME, objNewRevision, objNewRevision);
+               assertTrue("Dir property", Arrays.equals(PROPERTY_VALUE, 
dirPropertyValue));
+       }
+       
+       private Map<String, NodeAssertInfo> getExpectedEditorDeletions(String 
url, long newRevision, long baseRevision)
+       {
+               final Map<String, NodeAssertInfo> expectedState = new 
HashMap<String, RaTests.NodeAssertInfo>();
+               
+               {
+                       final NodeAssertInfo nodeInfo = new NodeAssertInfo(url 
+ "/A/B/E/I/G", NodeKind.dir, newRevision, ChangePath.Action.delete);
+                       expectedState.put(nodeInfo.getUrl(), nodeInfo);
+               }
+
+               {
+                       final NodeAssertInfo nodeInfo = new NodeAssertInfo(url 
+ "/A/B/E/beta", NodeKind.file, newRevision, ChangePath.Action.delete);
+                       expectedState.put(nodeInfo.getUrl(), nodeInfo);
+               }
+               
+               return expectedState;
+       }
+       
+       private Map<String, NodeAssertInfo> getExpectedEditorResults(String 
url, long newRevision, long baseRevision)
+       {
+               final Map<String, NodeAssertInfo> expectedState = new 
HashMap<String, RaTests.NodeAssertInfo>();
+               {
+                       final NodeAssertInfo nodeInfo = new NodeAssertInfo(url, 
NodeKind.dir, newRevision);
+                       expectedState.put(nodeInfo.getUrl(), nodeInfo);
+               }
+
+               {
+                       final NodeAssertInfo nodeInfo = new NodeAssertInfo(url 
+ "/iota", NodeKind.file, newRevision);
+                       expectedState.put(nodeInfo.getUrl(), nodeInfo);
+               }
+               
+               {
+                       final NodeAssertInfo nodeInfo = new NodeAssertInfo(url 
+ "/A", NodeKind.dir, newRevision);
+                       expectedState.put(nodeInfo.getUrl(), nodeInfo);
+               }
+
+               {
+                       final NodeAssertInfo nodeInfo = new NodeAssertInfo(url 
+ "/A/mu", NodeKind.file, newRevision);
+                       expectedState.put(nodeInfo.getUrl(), nodeInfo);
+               }
+
+               {
+                       final NodeAssertInfo nodeInfo = new NodeAssertInfo(url 
+ "/A/B", NodeKind.dir, newRevision);
+                       expectedState.put(nodeInfo.getUrl(), nodeInfo);
+               }
+
+               {
+                       final NodeAssertInfo nodeInfo = new NodeAssertInfo(url 
+ "/A/B/lambda", NodeKind.file, newRevision);
+                       expectedState.put(nodeInfo.getUrl(), nodeInfo);
+               }
+
+               {
+                       final NodeAssertInfo nodeInfo = new NodeAssertInfo(url 
+ "/A/B/E", NodeKind.dir, newRevision);
+                       expectedState.put(nodeInfo.getUrl(), nodeInfo);
+               }
+               
+               {
+                       final NodeAssertInfo nodeInfo = new NodeAssertInfo(url 
+ "/A/B/E/alpha", NodeKind.file, newRevision, ChangePath.Action.modify);
+                       expectedState.put(nodeInfo.getUrl(), nodeInfo);
+               }
+               
+               {
+                       final NodeAssertInfo nodeInfo = new NodeAssertInfo(url 
+ "/A/B/E/I", NodeKind.dir, newRevision, "/A/D", baseRevision);
+                       expectedState.put(nodeInfo.getUrl(), nodeInfo);
+               }
+               
+               {
+                       final NodeAssertInfo nodeInfo = new NodeAssertInfo(url 
+ "/A/B/E/I/gamma", NodeKind.file, newRevision);
+                       expectedState.put(nodeInfo.getUrl(), nodeInfo);
+               }
+
+               {
+                       final NodeAssertInfo nodeInfo = new NodeAssertInfo(url 
+ "/A/B/E/I/H", NodeKind.dir, newRevision);
+                       expectedState.put(nodeInfo.getUrl(), nodeInfo);
+               }
+               
+               
+               {
+                       final NodeAssertInfo nodeInfo = new NodeAssertInfo(url 
+ "/A/B/E/I/H/chi", NodeKind.file, newRevision);
+                       expectedState.put(nodeInfo.getUrl(), nodeInfo);
+               }
+               
+               {
+                       final NodeAssertInfo nodeInfo = new NodeAssertInfo(url 
+ "/A/B/E/I/H/omega", NodeKind.file, newRevision);
+                       expectedState.put(nodeInfo.getUrl(), nodeInfo);
+               }
+               
+               {
+                       final NodeAssertInfo nodeInfo = new NodeAssertInfo(url 
+ "/A/B/E/I/H/psi", NodeKind.file, newRevision);
+                       expectedState.put(nodeInfo.getUrl(), nodeInfo);
+               }
+               
+               {
+                       final NodeAssertInfo nodeInfo = new NodeAssertInfo(url 
+ "/A/B/E/delta", NodeKind.file, newRevision, "/A/D/G/pi", baseRevision);
+                       expectedState.put(nodeInfo.getUrl(), nodeInfo);
+               }
+               
+               {
+                       final NodeAssertInfo nodeInfo = new NodeAssertInfo(url 
+ "/A/B/E/epsilon", NodeKind.file, newRevision, ChangePath.Action.add);
+                       expectedState.put(nodeInfo.getUrl(), nodeInfo);
+               }
+
+               {
+                       final NodeAssertInfo nodeInfo = new NodeAssertInfo(url 
+ "/A/B/F", NodeKind.dir, newRevision);
+                       expectedState.put(nodeInfo.getUrl(), nodeInfo);
+               }
+               
+               {
+                       final NodeAssertInfo nodeInfo = new NodeAssertInfo(url 
+ "/A/C", NodeKind.dir, newRevision);
+                       expectedState.put(nodeInfo.getUrl(), nodeInfo);
+               }
+
+               {
+                       final NodeAssertInfo nodeInfo = new NodeAssertInfo(url 
+ "/A/D", NodeKind.dir, newRevision);
+                       expectedState.put(nodeInfo.getUrl(), nodeInfo);
+               }
+
+               {
+                       final NodeAssertInfo nodeInfo = new NodeAssertInfo(url 
+ "/A/D/gamma", NodeKind.file, newRevision);
+                       expectedState.put(nodeInfo.getUrl(), nodeInfo);
+               }
+
+               {
+                       final NodeAssertInfo nodeInfo = new NodeAssertInfo(url 
+ "/A/D/G", NodeKind.dir, newRevision);
+                       expectedState.put(nodeInfo.getUrl(), nodeInfo);
+               }
+
+               {
+                       final NodeAssertInfo nodeInfo = new NodeAssertInfo(url 
+ "/A/D/G/pi", NodeKind.file, newRevision);
+                       expectedState.put(nodeInfo.getUrl(), nodeInfo);
+               }
+
+               {
+                       final NodeAssertInfo nodeInfo = new NodeAssertInfo(url 
+ "/A/D/G/rho", NodeKind.file, newRevision);
+                       expectedState.put(nodeInfo.getUrl(), nodeInfo);
+               }
+
+               {
+                       final NodeAssertInfo nodeInfo = new NodeAssertInfo(url 
+ "/A/D/G/tau", NodeKind.file, newRevision);
+                       expectedState.put(nodeInfo.getUrl(), nodeInfo);
+               }
+               {
+                       final NodeAssertInfo nodeInfo = new NodeAssertInfo(url 
+ "/A/D/H", NodeKind.dir, newRevision);
+                       expectedState.put(nodeInfo.getUrl(), nodeInfo);
+               }
+
+               {
+                       final NodeAssertInfo nodeInfo = new NodeAssertInfo(url 
+ "/A/D/H/chi", NodeKind.file, newRevision);
+                       expectedState.put(nodeInfo.getUrl(), nodeInfo);
+               }
+
+               {
+                       final NodeAssertInfo nodeInfo = new NodeAssertInfo(url 
+ "/A/D/H/omega", NodeKind.file, newRevision);
+                       expectedState.put(nodeInfo.getUrl(), nodeInfo);
+               }
+
+               {
+                       final NodeAssertInfo nodeInfo = new NodeAssertInfo(url 
+ "/A/D/H/psi", NodeKind.file, newRevision);
+                       expectedState.put(nodeInfo.getUrl(), nodeInfo);
+               }
+
+
+               return expectedState;
+       }
+       
+       private static class NodeAssertInfo
+       {
+               private String url;
+               private NodeKind kind;
+               private long revision;
+               private String copyFromUrl;
+               private long copyFromRev;
+               private Tristate textMods;
+               private ChangePath.Action action;
+               
+               public NodeAssertInfo(String path, NodeKind kind, long revision)
+               {
+                       this(path, kind, revision, null, 
Revision.SVN_INVALID_REVNUM);
+               }
+
+               public NodeAssertInfo(String path, NodeKind kind, long 
revision, ChangePath.Action action)
+               {
+                       this(path, kind, revision, null, 
Revision.SVN_INVALID_REVNUM, null, action);
+               }
+
+               public NodeAssertInfo(String path, NodeKind kind, long 
revision, String copyFromUrl, long copyFromRev)
+               {
+                       this(path, kind, revision, copyFromUrl, copyFromRev, 
null, ChangePath.Action.add);
+               }
+               
+               public NodeAssertInfo(String path, NodeKind kind, long 
revision, String copyFromUrl, long copyFromRev,
+                               Tristate textMods, ChangePath.Action action)
+               {
+                       this.url = path;
+                       this.kind = kind;
+                       this.revision = revision;
+                       this.copyFromUrl = copyFromUrl;
+                       this.copyFromRev = copyFromRev;
+                       this.textMods = textMods;
+                       this.action = action;
+               }
+               
+               public String getUrl()
+               {
+                       return url;
+               }
+               
+               public NodeKind getKind()
+               {
+                       return kind;
+               }
+               
+               public long getRevision()
+               {
+                       return revision;
+               }
+               
+               public String getCopyFromUrl()
+               {
+                       return copyFromUrl;
+               }
+
+               public long getCopyFromRev()
+               {
+                       return copyFromRev;
+               }
+
+               public Tristate getTextMods()
+               {
+                       return textMods;
+               }
+
+               public ChangePath.Action getAction()
+               {
+                       return action;
+               }
+       }
+}
Index: 
subversion/bindings/javahl/tests/org/apache/subversion/javahl/RunTests.java
===================================================================
--- subversion/bindings/javahl/tests/org/apache/subversion/javahl/RunTests.java 
(revision 1328758)
+++ subversion/bindings/javahl/tests/org/apache/subversion/javahl/RunTests.java 
(working copy)
@@ -93,6 +93,8 @@ public class RunTests
                 // Add default test suites.
                 suite.addTestSuite(SVNReposTests.class);
                 suite.addTestSuite(BasicTests.class);
+                suite.addTestSuite(RaTests.class);
+                suite.addTestSuite(RaReadonlyTests.class);
             }
             else
             {

Reply via email to