[jboss-svn-commits] JBL Code SVN: r26963 - labs/jbossrules/trunk/drools-repository/src/test/java/org/drools/repository.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Sun Jun 14 23:08:01 EDT 2009


Author: jervisliu
Date: 2009-06-14 23:08:00 -0400 (Sun, 14 Jun 2009)
New Revision: 26963

Modified:
   labs/jbossrules/trunk/drools-repository/src/test/java/org/drools/repository/RulesRepositoryTest.java
Log:
Test case for https://jira.jboss.org/jira/browse/GUVNOR-346 (Copy to packages at the same time using the same name, results an exception). Note, the test was commented out as it failed probably due to a JackRabbit problem.

Modified: labs/jbossrules/trunk/drools-repository/src/test/java/org/drools/repository/RulesRepositoryTest.java
===================================================================
--- labs/jbossrules/trunk/drools-repository/src/test/java/org/drools/repository/RulesRepositoryTest.java	2009-06-15 02:40:24 UTC (rev 26962)
+++ labs/jbossrules/trunk/drools-repository/src/test/java/org/drools/repository/RulesRepositoryTest.java	2009-06-15 03:08:00 UTC (rev 26963)
@@ -1,6 +1,7 @@
 package org.drools.repository;
 
 import java.io.ByteArrayInputStream;
+import java.io.File;
 import java.io.IOException;
 import java.io.ByteArrayOutputStream;
 import java.util.ArrayList;
@@ -12,20 +13,24 @@
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipInputStream;
 
+import javax.jcr.LoginException;
 import javax.jcr.Node;
 import javax.jcr.NodeIterator;
 import javax.jcr.PathNotFoundException;
+import javax.jcr.Repository;
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
 import javax.jcr.SimpleCredentials;
 
+import org.apache.jackrabbit.core.TransientRepository;
 import org.drools.repository.RulesRepository.DateQuery;
 import org.drools.repository.migration.MigrateDroolsPackage;
 
 import junit.framework.TestCase;
 
 public class RulesRepositoryTest extends TestCase {
-
+	int running = 0;
+	
     public void testDefaultPackage() throws Exception {
         RulesRepository repo = RepositorySessionUtil.getRepository();
 
@@ -1074,8 +1079,113 @@
         }
     }
 
+	//In this test case we expect an ItemExistException from the second thread,  
+    //other than ending up with two packages with same name. 
+	public void testConcurrentCopyPackage() throws Exception {
+		//We have to handle how to get an instance of RulesRepository, 
+		//by ourself, as different threads need to use different sessions. 
+		final Repository repository;
 
+		File dir = new File("repository");
+		System.out.println("DELETING test repo: " + dir.getAbsolutePath());
+		deleteDir(dir);
+		System.out.println("TEST repo was deleted.");
 
+		JCRRepositoryConfigurator config = new JackrabbitRepositoryConfigurator();
+
+		repository = new TransientRepository("/repository.xml", "tmpdir");
+		//repository = config.getJCRRepository("tmpdir");
+		Session session = repository.login(new SimpleCredentials("alan_parsons",
+				"password".toCharArray()));
+		RulesRepositoryAdministrator admin = new RulesRepositoryAdministrator(
+				session);
+
+		// clear out and setup
+		if (admin.isRepositoryInitialized()) {
+			admin.clearRulesRepository();
+		}
+		config.setupRulesRepository(session);
+		RulesRepository repo = new RulesRepository(session);
+
+		// set up testing data
+		PackageItem source = repo.createPackage("testConcurrentCopyPackage",
+				"asset");
+		AssetItem item = source.addAsset("testCopyPackage", "desc");
+		item.updateContent("la");
+		item.checkin("");
+		repo.save();
+
+		Thread[] t = new Thread[2];
+
+		for (int i = 0; i < t.length; i++) {
+			t[i] = new Thread(new Runnable() {
+				public void run() {
+					running++;
+					try {
+						Session localSession = repository
+								.login(new SimpleCredentials("admin", "admin"
+										.toCharArray()));
+						RulesRepository repo1 = new RulesRepository(
+								localSession);
+
+						repo1.copyPackage("testConcurrentCopyPackage",
+								"testConcurrentCopyPackage2");
+						PackageItem dest = repo1
+								.loadPackage("testConcurrentCopyPackage2");
+						assertNotNull(dest);
+						Thread.yield();
+					} catch (LoginException e) {
+						// TODO Auto-generated catch block
+						e.printStackTrace();
+						fail();
+					} catch (RepositoryException e) {
+						// TODO Auto-generated catch block
+						e.printStackTrace();
+						fail();
+					} finally {
+						running--;
+					}
+				}
+			});
+		}
+
+		for (int i = 0; i < t.length; i++) {
+			t[i].start();
+			Thread.yield();
+		}
+
+		while (running > 0) {
+			Thread.yield();
+		}
+
+		Node folderNode = repo.getAreaNode(RulesRepository.RULE_PACKAGE_AREA);
+		NodeIterator results = folderNode.getNodes("testConcurrentCopyPackage2");
+		while (results.hasNext()) {
+			Node node = results.nextNode();
+			System.out.println("---" + node.getName());
+		}
+
+		//TO-BE-FIXED: https://jira.jboss.org/jira/browse/GUVNOR-346
+		//assertEquals(1, results.getSize());
+	} 
+
+    private static boolean deleteDir(File dir) {
+
+        if (dir.isDirectory()) {
+            String[] children = dir.list();
+            for (int i=0; i<children.length; i++) {
+                boolean success = deleteDir(new File(dir, children[i]));
+                if (!success) {
+                    return false;
+                }
+            }
+        }
+
+        // The directory is now empty so delete it
+        return dir.delete();
+    }
+
+
     public static <T> List<T> iteratorToList(Iterator<T> it) {
         List<T> list = new ArrayList<T>();
         while ( it.hasNext() ) {




More information about the jboss-svn-commits mailing list