Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3055)

Unified Diff: base/test/android/javatests/src/org/chromium/base/test/params/ParameterizedRunnerDelegateFactory.java

Issue 2568633002: Create Next Gen Parameter Test Framework for JUnit4 (Closed)
Patch Set: rebase Created 3 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: base/test/android/javatests/src/org/chromium/base/test/params/ParameterizedRunnerDelegateFactory.java
diff --git a/base/test/android/javatests/src/org/chromium/base/test/params/ParameterizedRunnerDelegateFactory.java b/base/test/android/javatests/src/org/chromium/base/test/params/ParameterizedRunnerDelegateFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..eaf6873b50d810b36ed524b6adad7833c9103d4f
--- /dev/null
+++ b/base/test/android/javatests/src/org/chromium/base/test/params/ParameterizedRunnerDelegateFactory.java
@@ -0,0 +1,156 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.base.test.params;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runners.model.FrameworkMethod;
+import org.junit.runners.model.TestClass;
+
+import org.chromium.base.test.params.ParameterAnnotations.UseMethodParameter;
+import org.chromium.base.test.params.ParameterizedRunner.ParameterizedTestInstantiationException;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+/**
+ * Factory to generate delegate class runners for ParameterizedRunner
+ */
+public class ParameterizedRunnerDelegateFactory {
+ /**
+ * Create a runner that implements ParameterizedRunner and extends BlockJUnit4ClassRunner
+ *
+ * @param testClass the TestClass object for current test class
+ * @param classParameterSet A parameter set for test constructor arguments
+ * @param testMethodToParameterSetListMap maps annotation tag to list of parameter set
+ * @param parameterizedRunnerDelegateClass the parameterized runner delegate class specified
+ * through {@code @UseRunnerDelegate}
+ */
+ <T extends ParameterizedRunnerDelegate> T createRunner(TestClass testClass,
+ ParameterSet classParameterSet,
+ Map<String, List<ParameterSet>> testMethodToParameterSetListMap,
+ Class<T> parameterizedRunnerDelegateClass)
+ throws ParameterizedTestInstantiationException,
+ ParameterizedRunnerDelegateInstantiationException {
+ String testMethodPostfix = classParameterSet == null ? null : classParameterSet.getName();
+ List<FrameworkMethod> unmodifiableFrameworkMethodList =
+ generateUnmodifiableFrameworkMethodList(
+ testClass, testMethodToParameterSetListMap, testMethodPostfix);
+ Object test = createTest(testClass, classParameterSet);
+ ParameterizedRunnerDelegateCommon delegateCommon =
+ new ParameterizedRunnerDelegateCommon(test, unmodifiableFrameworkMethodList);
+ try {
+ T runnerDelegate = parameterizedRunnerDelegateClass
+ .getDeclaredConstructor(
+ Class.class, ParameterizedRunnerDelegateCommon.class)
+ .newInstance(testClass.getJavaClass(), delegateCommon);
+ return runnerDelegate;
+ } catch (Exception e) {
+ throw new ParameterizedRunnerDelegateInstantiationException(
+ parameterizedRunnerDelegateClass.toString(), e);
+ }
+ }
+
+ /**
+ * Match test methods annotated by @UseMethodParameter(X) with
+ * ParameterSetList annotated by @MethodParameter(X)
+ *
+ * @param testClass a {@code TestClass} that wraps around the actual java
+ * test class
+ * @param tagToParameterSetList A map of String tags to ParameterSetList
+ * @param postFix a name postfix for each test
+ * @return a list of ParameterizedFrameworkMethod
+ */
+ static List<FrameworkMethod> generateUnmodifiableFrameworkMethodList(TestClass testClass,
+ Map<String, List<ParameterSet>> tagToParameterSetList, String postFix) {
+ // A Map that maps string tag X to a list of test framework methods that are
+ // annotated with @UseMethodParameter(X)
+ Map<String, List<FrameworkMethod>> tagToListOfFrameworkMethod = new HashMap<>();
+
+ // Represent the list of all ParameterizedFrameworkMethod in this test class
+ List<FrameworkMethod> returnList = new ArrayList<>();
+
+ // Create tagToListOfFrameworkMethod
+ for (FrameworkMethod method : testClass.getAnnotatedMethods(Test.class)) {
+ // If test method is not parameterized (does not have
+ // UseMethodParameter annotation)
+ if (!method.getMethod().isAnnotationPresent(UseMethodParameter.class)) {
+ returnList.add(new ParameterizedFrameworkMethod(method.getMethod(), null, postFix));
+ } else {
+ String currentGroup = method.getAnnotation(UseMethodParameter.class).value();
+ if (tagToListOfFrameworkMethod.get(currentGroup) == null) {
+ List<FrameworkMethod> list = new ArrayList<>();
+ list.add(method);
+ tagToListOfFrameworkMethod.put(currentGroup, list);
+ } else {
+ tagToListOfFrameworkMethod.get(currentGroup).add(method);
+ }
+ }
+ }
+
+ Assert.assertArrayEquals(
+ "All parameters used by must be defined, and all defined parameters must be used.",
+ tagToParameterSetList.keySet().toArray(),
+ tagToListOfFrameworkMethod.keySet().toArray());
+
+ // Loop through each of the tags and create all the parameterized framework
+ // methods for every method parameter set in the method parameter set list
+ // annotated with that tag
+ for (Entry<String, List<ParameterSet>> entry : tagToParameterSetList.entrySet()) {
+ String tagString = entry.getKey();
+ List<ParameterSet> parameterSetList = entry.getValue();
+ for (FrameworkMethod method : tagToListOfFrameworkMethod.get(tagString)) {
+ for (ParameterSet set : parameterSetList) {
+ if (set.getValues() == null) {
+ throw new IllegalArgumentException(
+ "No parameter is added to method ParameterSet");
+ }
+ returnList.add(
+ new ParameterizedFrameworkMethod(method.getMethod(), set, postFix));
+ }
+ }
+ }
+ return Collections.unmodifiableList(returnList);
+ }
+
+ /**
+ * Create a test object using the list of class parameter set
+ *
+ * @param testClass the {@link TestClass} object for current test class
+ * @param classParameterSet the parameter set needed for the test class constructor
+ */
+ static Object createTest(TestClass testClass, ParameterSet classParameterSet)
+ throws ParameterizedTestInstantiationException {
+ try {
+ if (classParameterSet == null) {
+ return testClass.getOnlyConstructor().newInstance();
+ }
+ return testClass.getOnlyConstructor().newInstance(
+ classParameterSet.getValues().toArray());
+ } catch (Exception e) {
+ String parameterSetString =
+ classParameterSet == null ? "null" : classParameterSet.toString();
+ throw new ParameterizedTestInstantiationException(testClass, parameterSetString, e);
+ }
+ }
+
+ /**
+ * Exception caused by instantiating the provided Runner delegate
+ * Potentially caused by not overriding collecInitializationErrors() method
+ * to be empty
+ */
+ public static class ParameterizedRunnerDelegateInstantiationException extends Exception {
+ private ParameterizedRunnerDelegateInstantiationException(
+ String runnerDelegateClass, Exception e) {
+ super(String.format("Current class runner delegate %s can not be instantiated.",
+ runnerDelegateClass),
+ e);
+ }
+ }
+}

Powered by Google App Engine
This is Rietveld 408576698