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 ' '",