You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by pp...@apache.org on 2008/11/13 05:09:09 UTC

svn commit: r713630 - in /openjpa/trunk/openjpa-persistence-jdbc: ./ src/test/java/org/apache/openjpa/persistence/kernel/ src/test/java/org/apache/openjpa/persistence/test/

Author: ppoddar
Date: Wed Nov 12 20:09:08 2008
New Revision: 713630

URL: http://svn.apache.org/viewvc?rev=713630&view=rev
Log:
OPENJPA-766: Use @AllowFailure to remove <exclude> clause for failing tests in pom.xml. Also added a facility to list tests that are annotated with AllowFailure.

Added:
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/test/ClassSelector.java
Modified:
    openjpa/trunk/openjpa-persistence-jdbc/pom.xml
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/kernel/TestInitialValueFetching.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/test/PersistenceTestCase.java

Modified: openjpa/trunk/openjpa-persistence-jdbc/pom.xml
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/pom.xml?rev=713630&r1=713629&r2=713630&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/pom.xml (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/pom.xml Wed Nov 12 20:09:08 2008
@@ -320,7 +320,6 @@
 
                         <!-- exclude new tests that aren't passing yet -->
                         <exclude>org/apache/openjpa/persistence/jpql/clauses/TestEJBQueryInterface.java</exclude>
-                        <exclude>org/apache/openjpa/persistence/kernel/TestInitialValueFetching.java</exclude>
                         <exclude>org/apache/openjpa/persistence/kernel/TestOpenResultsCommit.java</exclude>
                         <exclude>org/apache/openjpa/persistence/query/TestQuotedNumbersInFilters2.java</exclude>
 

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/kernel/TestInitialValueFetching.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/kernel/TestInitialValueFetching.java?rev=713630&r1=713629&r2=713630&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/kernel/TestInitialValueFetching.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/kernel/TestInitialValueFetching.java Wed Nov 12 20:09:08 2008
@@ -34,6 +34,7 @@
 
 
 import org.apache.openjpa.persistence.kernel.common.apps.RuntimeTest1;
+import org.apache.openjpa.persistence.test.AllowFailure;
 
 import org.apache.openjpa.kernel.OpenJPAStateManager;
 import org.apache.openjpa.meta.FieldMetaData;
@@ -97,6 +98,7 @@
         endEm(pm);
     }
 
+    @AllowFailure
     public void testInitialValueMutableValueFailures() {
         Map props = new HashMap();
         props.put("openjpa.RestoreMutableValues", "false");
@@ -120,6 +122,7 @@
         pmf.close();
     }
 
+    @AllowFailure
     public void testInitialValueDate() {
         Map props = new HashMap();
         props.put("openjpa.RestoreState", "all");

Added: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/test/ClassSelector.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/test/ClassSelector.java?rev=713630&view=auto
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/test/ClassSelector.java (added)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/test/ClassSelector.java Wed Nov 12 20:09:08 2008
@@ -0,0 +1,244 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.    
+ */
+package org.apache.openjpa.persistence.test;
+
+import java.io.File;
+import java.io.FilenameFilter;
+import java.util.ArrayList;
+import java.util.List;
+
+import serp.bytecode.Annotations;
+import serp.bytecode.BCClass;
+import serp.bytecode.BCMethod;
+import serp.bytecode.Project;
+
+/**
+ * List class names that match specific selection criteria based on inheritance, 
+ * implemented interface or annotations. The classes are scanned starting from
+ * a root directory or a single file. Uses serp bytecode library for reading the 
+ * bytecode. The classes are not loaded in Java Virtual Machine and hence 
+ * dependent classes need not be in the classpath.
+ * 
+ * @author Pinaki Poddar
+ * 
+ */
+public class ClassSelector {
+	private List<String> _supers = new ArrayList<String>();
+	private List<String> _interfaces = new ArrayList<String>();
+	private List<String> _annotations = new ArrayList<String>();
+
+	/**
+	 * Prints the class names that satisfy the following criteria
+	 *   extends org.apache.openjpa.persistence.test.SingleEMFTestCase or 
+	 *           junit.framework.TestCase
+	 *   and annotated with org.apache.openjpa.persistence.test.AllowFailure
+	 *   
+	 * @param args the root directory of the class files to be scanned. If no
+	 * argument is given then assumes the current directory.
+	 * 
+	 */
+	public static void main(String[] args) throws Exception {
+		String dir = (args.length == 0) ? System.getProperty("user.dir")
+				: args[0];
+		ClassSelector reader = new ClassSelector()
+		.addSuper("org.apache.openjpa.persistence.test.SingleEMTestCase")
+			.addSuper("org.apache.openjpa.persistence.test.SingleEMFTestCase")
+			.addSuper("org.apache.openjpa.persistence.kernel.BaseKernelTest")
+			.addSuper("org.apache.openjpa.persistence.query.BaseQueryTest")
+		    .addSuper("org.apache.openjpa.persistence.jdbc.kernel.BaseJDBCTest")
+		    .addSuper("org.apache.openjpa.persistence.common.utils.AbstractTestCase")
+			.addAnnotation("org.apache.openjpa.persistence.test.AllowFailure");
+		List<String> names = reader.list(new File(dir), true);
+		String spec = reader.getSpecification();
+		System.err.println("Found " + names.size() + " classes under " 
+				+ dir + (spec.length() > 0 ? " that" : ""));
+		System.err.println(spec);
+		for (String name : names)
+			System.err.println(name);
+	}
+	
+	/**
+	 * List all the class names that match the selection.
+	 * 
+	 * @param file a root file or directory
+	 * @param recursive if true scans all directory recursively
+	 * @return list of class names that match the selection. 
+	 */
+	public List<String> list(File file, boolean recursive) {
+		List<String> names = new ArrayList<String>();
+		list(file, recursive, names);
+		return names;
+	}
+	
+	private void list(File file, boolean recursive, List<String> names) {
+		if (file.isDirectory()) {
+			if (recursive) {
+				String[] children = file.list(new FilenameFilter() {
+					public boolean accept(File dir, String name) {
+						return name.endsWith(".class");
+					}
+				});
+				for (String name : children)
+					list(new File(file, name), recursive, names);
+				String[] dirs = file.list(new FilenameFilter() {
+					public boolean accept(File dir, String name) {
+						return new File(dir, name).isDirectory();
+					}
+				});
+				for (String name : dirs)
+					list(new File(file, name), recursive, names);
+			}
+		} else if (file.getName().endsWith(".class")) {
+			String cls = select(file);
+			if (cls != null)
+				names.add(cls);
+		}
+	}
+
+	/**
+	 * Adds fully-qualified name of a super class for selection.
+	 */
+	public ClassSelector addSuper(String s) {
+		_supers.add(s);
+		return this;
+	}
+
+	/**
+	 * Adds fully-qualified name of an interface for selection.
+	 */
+	public ClassSelector addInterface(String s) {
+		_interfaces.add(s);
+		return this;
+	}
+
+	/**
+	 * Adds fully-qualified name of an annotation for selection.
+	 */
+	public ClassSelector addAnnotation(String s) {
+		_annotations.add(s);
+		return this;
+	}
+
+	private String select(File file) {
+		try {
+			BCClass bcls = new Project().loadClass(file);
+			if (applyInheritanceFilter(bcls) 
+			 && applyInterfaceFilter(bcls)
+			 && applyAnnotationFilter(bcls))
+				return bcls.getName();
+		} catch (Exception e) {
+			System.err.println("Error reading " + file.getAbsolutePath()
+					+ " : " + e);
+		}
+		return null;
+	}
+
+	/**
+	 * Affirms if super class of the given class matches any of the
+	 * selection filter names. If no super class name has been set for
+	 * selection then return true.
+	 * 
+	 * @see #addSuper(String)
+	 */
+	private boolean applyInheritanceFilter(BCClass bcls) {
+		if (_supers.isEmpty())
+			return true;
+		String superc = bcls.getSuperclassName();
+		return _supers.contains(superc);
+	}
+
+	/**
+	 * Affirms if interfaces of the given class match any of the
+	 * selection filter names. If no interface name has been set for
+	 * selection then return true.
+	 * 
+	 * @see #addInterface(String)
+	 */
+	private boolean applyInterfaceFilter(BCClass bcls) {
+		if (_interfaces.isEmpty())
+			return true;
+		String[] ifaces = bcls.getInterfaceNames();
+		if (ifaces == null || ifaces.length == 0)
+			return false;
+		for (String iface : ifaces)
+			if (_interfaces.contains(iface))
+				return true;
+		return false;
+	}
+
+	/**
+	 * Affirms if annotations of the given class or its methods match any of the
+	 * selection filter names. If no annotation name has been set for
+	 * selection then return true.
+	 * 
+	 * @see #addAnnotation(String)
+	 */
+	private boolean applyAnnotationFilter(BCClass bcls) {
+		if (_annotations.isEmpty())
+			return true;
+		Annotations annos = bcls.getDeclaredRuntimeAnnotations(false);
+		if (hasAnnotation(annos))
+			return true;
+		BCMethod[] methods = bcls.getDeclaredMethods();
+		for (BCMethod m : methods) {
+			annos = m.getDeclaredRuntimeAnnotations(false);
+			if (hasAnnotation(annos))
+				return true;
+		}
+		return false;
+	}
+
+	private boolean hasAnnotation(Annotations annos) {
+		if (annos == null)
+			return false;
+		for (String anno : _annotations)
+			if (annos.getAnnotation(anno) != null)
+				return true;
+		return false;
+	}
+	
+	/**
+	 * Gets a printable description of the currently set selection criteria.
+	 */
+	public String getSpecification() {
+		StringBuffer tmp = new StringBuffer();
+		String and = "";
+		if (!_supers.isEmpty()) {
+			tmp.append("\textends ");
+			and = "and ";
+			for (int i=0; i<_supers.size(); i++)
+				tmp.append(_supers.get(i))
+				   .append((i != _supers.size()-1 ? "\r\n\t     or " : "\r\n"));
+		}
+		if (!_interfaces.isEmpty()) {
+			tmp.append("\t" + and + "implements ");
+			and = "and ";
+			for (int i=0; i<_interfaces.size(); i++)
+				tmp.append(_interfaces.get(i))
+				   .append((i != _interfaces.size()-1 ? "\r\n\t        or " : "\r\n"));
+		}
+		if (!_annotations.isEmpty()) {
+			tmp.append("\t" + and + "annotatated with ");
+			for (int i=0; i<_annotations.size(); i++)
+				tmp.append(_annotations.get(i))
+				   .append((i != _annotations.size()-1 ? " or " : "\r\n"));
+		}
+		return tmp.toString();
+	}
+}

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/test/PersistenceTestCase.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/test/PersistenceTestCase.java?rev=713630&r1=713629&r2=713630&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/test/PersistenceTestCase.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/test/PersistenceTestCase.java Wed Nov 12 20:09:08 2008
@@ -414,8 +414,10 @@
         try {
             super.runBare();
         } catch (Throwable t) {
-            if (allowFailure() && t instanceof AssertionFailedError) {
-                System.err.println("*** Failed but ignored:" + this);
+            if (allowFailure()) {
+                System.err.println("*** FAILED (but ignored):" + this);
+                System.err.println("Stacktrace of failure");
+                t.printStackTrace();
             } else {
                 throw t;
             }