Use JUnit4 for skylark tests.

--
Change-Id: I3cf7a8127da60d93005594d73abbdb8f7bda7cf2
Reviewed-on: https://bazel-review.googlesource.com/#/c/2041
MOS_MIGRATED_REVID=103940423
diff --git a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java
index 730205e..1c57974 100644
--- a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java
@@ -35,14 +35,17 @@
 import com.google.devtools.build.lib.util.FileTypeSet;
 
 import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  * Tests for SkylarkRuleClassFunctions.
  */
+@RunWith(JUnit4.class)
 public class SkylarkRuleClassFunctionsTest extends SkylarkTestCase {
 
   @Before
-  @Override
   public void setUp() throws Exception {
     super.setUp();
     scratch.file(
@@ -66,6 +69,7 @@
         ")");
   }
 
+  @Test
   public void testCannotOverrideBuiltInAttribute() throws Exception {
     checkEvalError(
         "There is already a built-in attribute 'tags' which cannot be overridden",
@@ -73,6 +77,7 @@
         "r = rule(impl, attrs = {'tags': attr.string_list()})");
   }
 
+  @Test
   public void testImplicitArgsAttribute() throws Exception {
     eval(
         "def _impl(ctx):",
@@ -91,48 +96,56 @@
     eval("def impl():\n" + "  return 0\n");
   }
 
+  @Test
   public void testAttrWithOnlyType() throws Exception {
     Object result = evalRuleClassCode("attr.string_list()");
     Attribute attr = ((Attribute.Builder<?>) result).build("a1");
     assertEquals(Type.STRING_LIST, attr.getType());
   }
 
+  @Test
   public void testOutputListAttr() throws Exception {
     Object result = evalRuleClassCode("attr.output_list()");
     Attribute attr = ((Attribute.Builder<?>) result).build("a1");
     assertEquals(BuildType.OUTPUT_LIST, attr.getType());
   }
 
+  @Test
   public void testIntListAttr() throws Exception {
     Object result = evalRuleClassCode("attr.int_list()");
     Attribute attr = ((Attribute.Builder<?>) result).build("a1");
     assertEquals(Type.INTEGER_LIST, attr.getType());
   }
 
+  @Test
   public void testOutputAttr() throws Exception {
     Object result = evalRuleClassCode("attr.output()");
     Attribute attr = ((Attribute.Builder<?>) result).build("a1");
     assertEquals(BuildType.OUTPUT, attr.getType());
   }
 
+  @Test
   public void testStringDictAttr() throws Exception {
     Object result = evalRuleClassCode("attr.string_dict(default = {'a': 'b'})");
     Attribute attr = ((Attribute.Builder<?>) result).build("a1");
     assertEquals(Type.STRING_DICT, attr.getType());
   }
 
+  @Test
   public void testAttrAllowedFileTypesAnyFile() throws Exception {
     Object result = evalRuleClassCode("attr.label_list(allow_files = True)");
     Attribute attr = ((Attribute.Builder<?>) result).build("a1");
     assertEquals(FileTypeSet.ANY_FILE, attr.getAllowedFileTypesPredicate());
   }
 
+  @Test
   public void testAttrAllowedFileTypesWrongType() throws Exception {
     checkErrorContains(
         "allow_files should be a boolean or a filetype object.",
         "attr.label_list(allow_files = ['.xml'])");
   }
 
+  @Test
   public void testAttrWithSkylarkFileType() throws Exception {
     Object result = evalRuleClassCode("attr.label_list(allow_files = FileType(['.xml']))");
     Attribute attr = ((Attribute.Builder<?>) result).build("a1");
@@ -140,6 +153,7 @@
     assertFalse(attr.getAllowedFileTypesPredicate().apply("a.txt"));
   }
 
+  @Test
   public void testAttrWithProviders() throws Exception {
     Object result =
         evalRuleClassCode("attr.label_list(allow_files = True, providers = ['a', 'b'])");
@@ -147,6 +161,7 @@
     assertEquals(ImmutableSet.of("a", "b"), attr.getMandatoryProviders());
   }
 
+  @Test
   public void testNonLabelAttrWithProviders() throws Exception {
     checkErrorContains(
         "unexpected keyword 'providers' in call to string", "attr.string(providers = ['a'])");
@@ -167,7 +182,7 @@
         .add(Attribute.attr("tags", Type.STRING_LIST))
         .build();
   }
-
+  @Test
   public void testAttrAllowedRuleClassesSpecificRuleClasses() throws Exception {
     Object result =
         evalRuleClassCode("attr.label_list(allow_rules = ['java_binary'], allow_files = True)");
@@ -175,13 +190,14 @@
     assertTrue(attr.getAllowedRuleClassesPredicate().apply(ruleClass("java_binary")));
     assertFalse(attr.getAllowedRuleClassesPredicate().apply(ruleClass("genrule")));
   }
-
+  @Test
   public void testAttrDefaultValue() throws Exception {
     Object result = evalRuleClassCode("attr.string(default = 'some value')");
     Attribute attr = ((Attribute.Builder<?>) result).build("a1");
     assertEquals("some value", attr.getDefaultValueForTesting());
   }
 
+  @Test
   public void testAttrDefaultValueBadType() throws Exception {
     checkErrorContains(
         "Method attr.string(*, default: string, mandatory: bool, values: sequence of strings) "
@@ -190,6 +206,7 @@
         "attr.string(default = 1)");
   }
 
+  @Test
   public void testAttrMandatory() throws Exception {
     Object result = evalRuleClassCode("attr.string(mandatory=True)");
     Attribute attr = ((Attribute.Builder<?>) result).build("a1");
@@ -197,6 +214,7 @@
     assertFalse(attr.isNonEmpty());
   }
 
+  @Test
   public void testAttrNonEmpty() throws Exception {
     Object result = evalRuleClassCode("attr.string_list(non_empty=True)");
     Attribute attr = ((Attribute.Builder<?>) result).build("a1");
@@ -204,17 +222,20 @@
     assertFalse(attr.isMandatory());
   }
 
+  @Test
   public void testAttrBadKeywordArguments() throws Exception {
     checkErrorContains(
         "unexpected keyword 'bad_keyword' in call to string", "attr.string(bad_keyword = '')");
   }
 
+  @Test
   public void testAttrCfg() throws Exception {
     Object result = evalRuleClassCode("attr.label(cfg = HOST_CFG, allow_files = True)");
     Attribute attr = ((Attribute.Builder<?>) result).build("a1");
     assertEquals(ConfigurationTransition.HOST, attr.getConfigurationTransition());
   }
 
+  @Test
   public void testAttrValues() throws Exception {
     Object result = evalRuleClassCode("attr.string(values = ['ab', 'cd'])");
     Attribute attr = ((Attribute.Builder<?>) result).build("a1");
@@ -223,6 +244,7 @@
     assertThat(predicate.apply("xy")).isFalse();
   }
 
+  @Test
   public void testAttrIntValues() throws Exception {
     Object result = evalRuleClassCode("attr.int(values = [1, 2])");
     Attribute attr = ((Attribute.Builder<?>) result).build("a1");
@@ -231,12 +253,14 @@
     assertThat(predicate.apply(3)).isFalse();
   }
 
+  @Test
   public void testRuleImplementation() throws Exception {
     eval("def impl(ctx): return None", "rule1 = rule(impl)");
     RuleClass c = ((RuleFunction) lookup("rule1")).getBuilder().build("rule1");
     assertEquals("impl", c.getConfiguredTargetFunction().getName());
   }
 
+  @Test
   public void testLateBoundAttrWorksWithOnlyLabel() throws Exception {
     checkEvalError(
         "Method attr.string(*, default: string, mandatory: bool, values: sequence of strings) "
@@ -246,18 +270,21 @@
         "attr.string(default=attr_value)");
   }
 
+  @Test
   public void testRuleAddAttribute() throws Exception {
     eval("def impl(ctx): return None", "r1 = rule(impl, attrs={'a1': attr.string()})");
     RuleClass c = ((RuleFunction) lookup("r1")).getBuilder().build("r1");
     assertTrue(c.hasAttr("a1", Type.STRING));
   }
 
+  @Test
   public void testOutputToGenfiles() throws Exception {
     eval("def impl(ctx): pass", "r1 = rule(impl, output_to_genfiles=True)");
     RuleClass c = ((RuleFunction) lookup("r1")).getBuilder().build("r1");
     assertFalse(c.hasBinaryOutput());
   }
 
+  @Test
   public void testRuleAddMultipleAttributes() throws Exception {
     eval(
         "def impl(ctx): return None",
@@ -270,7 +297,7 @@
     assertTrue(c.hasAttr("a1", BuildType.LABEL_LIST));
     assertTrue(c.hasAttr("a2", Type.INTEGER));
   }
-
+  @Test
   public void testRuleAttributeFlag() throws Exception {
     eval(
         "def impl(ctx): return None",
@@ -279,6 +306,7 @@
     assertTrue(c.getAttributeByName("a1").isMandatory());
   }
 
+  @Test
   public void testRuleOutputs() throws Exception {
     eval("def impl(ctx): return None", "r1 = rule(impl, outputs = {'a': 'a.txt'})");
     RuleClass c = ((RuleFunction) lookup("r1")).getBuilder().build("r1");
@@ -286,6 +314,7 @@
     assertEquals("a.txt", Iterables.getOnlyElement(function.getImplicitOutputs(null)));
   }
 
+  @Test
   public void testRuleUnknownKeyword() throws Exception {
     registerDummyUserDefinedFunction();
     checkErrorContains(
@@ -293,6 +322,7 @@
         "rule(impl, bad_keyword = 'some text')");
   }
 
+  @Test
   public void testRuleImplementationMissing() throws Exception {
     checkErrorContains(
         "missing mandatory positional argument 'implementation' while calling "
@@ -300,6 +330,7 @@
         "rule(attrs = {})");
   }
 
+  @Test
   public void testRuleBadTypeForAdd() throws Exception {
     registerDummyUserDefinedFunction();
     checkErrorContains(
@@ -308,6 +339,7 @@
         "rule(impl, attrs = 'some text')");
   }
 
+  @Test
   public void testRuleBadTypeInAdd() throws Exception {
     registerDummyUserDefinedFunction();
     checkErrorContains(
@@ -316,11 +348,13 @@
         "rule(impl, attrs = {'a1': 'some text'})");
   }
 
+  @Test
   public void testLabel() throws Exception {
     Object result = evalRuleClassCode("Label('//foo/foo:foo')");
     assertEquals("//foo/foo:foo", ((Label) result).toString());
   }
 
+  @Test
   public void testLabelSameInstance() throws Exception {
     Object l1 = evalRuleClassCode("Label('//foo/foo:foo')");
     // Implicitly creates a new pkgContext and environment, yet labels should be the same.
@@ -328,6 +362,7 @@
     assertSame(l2, l1);
   }
 
+  @Test
   public void testLabelNameAndPackage() throws Exception {
     Object result = evalRuleClassCode("Label('//foo/bar:baz').name");
     assertEquals("baz", result);
@@ -336,6 +371,7 @@
     assertEquals("foo/bar", result);
   }
 
+  @Test
   public void testRuleLabelDefaultValue() throws Exception {
     eval(
         "def impl(ctx): return None\n"
@@ -346,6 +382,7 @@
     assertEquals("//foo:foo", ((Label) a.getDefaultValueForTesting()).toString());
   }
 
+  @Test
   public void testIntDefaultValue() throws Exception {
     eval("def impl(ctx): return None", "r1 = rule(impl, attrs = {'a1': attr.int(default = 40+2)})");
     RuleClass c = ((RuleFunction) lookup("r1")).getBuilder().build("r1");
@@ -353,12 +390,14 @@
     assertEquals(42, a.getDefaultValueForTesting());
   }
 
+  @Test
   public void testFileType() throws Exception {
     Object result = evalRuleClassCode("FileType(['.css'])");
     SkylarkFileType fts = (SkylarkFileType) result;
     assertEquals(ImmutableList.of(".css"), fts.getExtensions());
   }
 
+  @Test
   public void testRuleInheritsBaseRuleAttributes() throws Exception {
     eval("def impl(ctx): return None", "r1 = rule(impl)");
     RuleClass c = ((RuleFunction) lookup("r1")).getBuilder().build("r1");
@@ -373,11 +412,13 @@
     assertEquals(Joiner.on("\n").join(lines) + "\n", result);
   }
 
+  @Test
   public void testSimpleTextMessagesBooleanFields() throws Exception {
     checkTextMessage("struct(name=True).to_proto()", "name: true");
     checkTextMessage("struct(name=False).to_proto()", "name: false");
   }
 
+  @Test
   public void testSimpleTextMessages() throws Exception {
     checkTextMessage("struct(name='value').to_proto()", "name: \"value\"");
     checkTextMessage("struct(name=['a', 'b']).to_proto()", "name: \"a\"", "name: \"b\"");
@@ -396,12 +437,14 @@
         "struct(a=struct(b=struct(c='c'))).to_proto()", "a {", "  b {", "    c: \"c\"", "  }", "}");
   }
 
+  @Test
   public void testTextMessageEscapes() throws Exception {
     checkTextMessage("struct(name='a\"b').to_proto()", "name: \"a\\\"b\"");
     checkTextMessage("struct(name='a\\'b').to_proto()", "name: \"a'b\"");
     checkTextMessage("struct(name='a\\nb').to_proto()", "name: \"a\\nb\"");
   }
 
+  @Test
   public void testTextMessageInvalidElementInListStructure() throws Exception {
     checkErrorContains(
         "Invalid text format, expected a struct, a string, a bool, or "
@@ -409,6 +452,7 @@
         "struct(a=[['b']]).to_proto()");
   }
 
+  @Test
   public void testTextMessageInvalidStructure() throws Exception {
     checkErrorContains(
         "Invalid text format, expected a struct, a string, a bool, or an int "
@@ -416,7 +460,7 @@
         "struct(a=DATA_CFG).to_proto()");
   }
 
-  // Regression test for b/18352962
+  @Test
   public void testLabelAttrWrongDefault() throws Exception {
     checkErrorContains(
         "expected Label or Label-returning function or NoneType for 'default' "
@@ -424,11 +468,13 @@
         "attr.label(default = '//foo:bar')");
   }
 
+  @Test
   public void testLabelGetRelative() throws Exception {
     assertEquals("//foo:baz", eval("Label('//foo:bar').relative('baz')").toString());
     assertEquals("//baz:qux", eval("Label('//foo:bar').relative('//baz:qux')").toString());
   }
 
+  @Test
   public void testLabelGetRelativeSyntaxError() throws Exception {
     checkErrorContains(
         "invalid target name 'bad syntax': target names may not contain ' '",