Index: base/test/android/javatests/src/org/chromium/base/test/util/CommandLineFlags.java |
diff --git a/base/test/android/javatests/src/org/chromium/base/test/util/CommandLineFlags.java b/base/test/android/javatests/src/org/chromium/base/test/util/CommandLineFlags.java |
index d5579e3b1017e482c739957a7b3deecf5552bb42..6a0d9238d6aa56239593c205b60f1f3ad313de52 100644 |
--- a/base/test/android/javatests/src/org/chromium/base/test/util/CommandLineFlags.java |
+++ b/base/test/android/javatests/src/org/chromium/base/test/util/CommandLineFlags.java |
@@ -14,12 +14,13 @@ import org.chromium.base.test.BaseTestResult.PreTestHook; |
import org.chromium.base.test.util.parameter.BaseParameter; |
import java.lang.annotation.ElementType; |
-import java.lang.annotation.Inherited; |
+import java.lang.annotation.Repeatable; |
import java.lang.annotation.Retention; |
import java.lang.annotation.RetentionPolicy; |
import java.lang.annotation.Target; |
import java.lang.reflect.AnnotatedElement; |
import java.lang.reflect.Method; |
+import java.util.ArrayList; |
import java.util.Arrays; |
import java.util.HashSet; |
import java.util.List; |
@@ -40,25 +41,37 @@ public final class CommandLineFlags { |
/** |
* Adds command-line flags to the {@link org.chromium.base.CommandLine} for this test. |
*/ |
- @Inherited |
+ @Repeatable(AddContainer.class) |
@Retention(RetentionPolicy.RUNTIME) |
@Target({ElementType.METHOD, ElementType.TYPE}) |
public @interface Add { |
String[] value(); |
} |
+ @Retention(RetentionPolicy.RUNTIME) |
+ @Target({ElementType.METHOD, ElementType.TYPE}) |
+ public @interface AddContainer { |
+ Add[] value() default {}; |
+ } |
+ |
/** |
* Removes command-line flags from the {@link org.chromium.base.CommandLine} from this test. |
* |
* Note that this can only remove flags added via {@link Add} above. |
*/ |
- @Inherited |
+ @Repeatable(RemoveContainer.class) |
@Retention(RetentionPolicy.RUNTIME) |
@Target({ElementType.METHOD, ElementType.TYPE}) |
public @interface Remove { |
String[] value(); |
} |
+ @Retention(RetentionPolicy.RUNTIME) |
+ @Target({ElementType.METHOD, ElementType.TYPE}) |
+ public @interface RemoveContainer { |
+ Remove[] value() default {}; |
+ } |
+ |
/** |
* Sets up the CommandLine with the appropriate flags. |
* |
@@ -84,16 +97,26 @@ public final class CommandLineFlags { |
private static Set<String> getFlags(AnnotatedElement element) { |
AnnotatedElement parent = (element instanceof Method) |
? ((Method) element).getDeclaringClass() |
- : ((Class) element).getSuperclass(); |
+ : ((Class<?>) element).getSuperclass(); |
Set<String> flags = (parent == null) ? new HashSet<String>() : getFlags(parent); |
- if (element.isAnnotationPresent(CommandLineFlags.Add.class)) { |
+ if (element.isAnnotationPresent(CommandLineFlags.AddContainer.class)) { |
+ for (Add addflag : element.getAnnotation(CommandLineFlags.AddContainer.class).value()) { |
+ flags.addAll(Arrays.asList(addflag.value())); |
+ } |
+ } else if (element.isAnnotationPresent(CommandLineFlags.Add.class)) { |
flags.addAll( |
Arrays.asList(element.getAnnotation(CommandLineFlags.Add.class).value())); |
} |
- if (element.isAnnotationPresent(CommandLineFlags.Remove.class)) { |
- List<String> flagsToRemove = |
+ List<String> flagsToRemove = new ArrayList<>(); |
+ if (element.isAnnotationPresent(CommandLineFlags.RemoveContainer.class)) { |
+ for (Remove removeflag : |
+ element.getAnnotation(CommandLineFlags.RemoveContainer.class).value()) { |
+ flagsToRemove.addAll(Arrays.asList(removeflag.value())); |
+ } |
+ } else if (element.isAnnotationPresent(CommandLineFlags.Remove.class)) { |
+ flagsToRemove = |
Arrays.asList(element.getAnnotation(CommandLineFlags.Remove.class).value()); |
for (String flagToRemove : flagsToRemove) { |
// If your test fails here, you have tried to remove a command-line flag via |
@@ -102,8 +125,8 @@ public final class CommandLineFlags { |
Assert.assertFalse("Unable to remove command-line flag \"" + flagToRemove + "\".", |
CommandLine.getInstance().hasSwitch(flagToRemove)); |
} |
- flags.removeAll(flagsToRemove); |
} |
+ flags.removeAll(flagsToRemove); |
return flags; |
} |