diff --git a/nullaway/src/main/java/com/uber/nullaway/handlers/LibraryModelsHandler.java b/nullaway/src/main/java/com/uber/nullaway/handlers/LibraryModelsHandler.java index 799ef241ed..1ed32ebac6 100644 --- a/nullaway/src/main/java/com/uber/nullaway/handlers/LibraryModelsHandler.java +++ b/nullaway/src/main/java/com/uber/nullaway/handlers/LibraryModelsHandler.java @@ -452,6 +452,54 @@ private static class DefaultLibraryModels implements LibraryModels { "org.junit.jupiter.api.Assertions", "assertNotNull(java.lang.Object,java.util.function.Supplier)"), 0) + .put(methodRef("org.apache.commons.lang3.Validate", "notNull(T)"), 0) + .put( + methodRef( + "org.apache.commons.lang3.Validate", + "notNull(T,java.lang.String,java.lang.Object...)"), + 0) + .put( + methodRef( + "org.apache.commons.lang3.Validate", + "notEmpty(T[],java.lang.String,java.lang.Object...)"), + 0) + .put(methodRef("org.apache.commons.lang3.Validate", "notEmpty(T[])"), 0) + .put( + methodRef( + "org.apache.commons.lang3.Validate", + "notEmpty(T,java.lang.String,java.lang.Object...)"), + 0) + .put(methodRef("org.apache.commons.lang3.Validate", "notEmpty(T)"), 0) + .put( + methodRef( + "org.apache.commons.lang3.Validate", + "notBlank(T,java.lang.String,java.lang.Object...)"), + 0) + .put(methodRef("org.apache.commons.lang3.Validate", "notBlank(T)"), 0) + .put( + methodRef( + "org.apache.commons.lang3.Validate", + "noNullElements(T[],java.lang.String,java.lang.Object...)"), + 0) + .put(methodRef("org.apache.commons.lang3.Validate", "noNullElements(T[])"), 0) + .put( + methodRef( + "org.apache.commons.lang3.Validate", + "noNullElements(T,java.lang.String,java.lang.Object...)"), + 0) + .put(methodRef("org.apache.commons.lang3.Validate", "noNullElements(T)"), 0) + .put( + methodRef( + "org.apache.commons.lang3.Validate", + "validIndex(T[],int,java.lang.String,java.lang.Object...)"), + 0) + .put(methodRef("org.apache.commons.lang3.Validate", "validIndex(T[],int)"), 0) + .put( + methodRef( + "org.apache.commons.lang3.Validate", + "validIndex(T,int,java.lang.String,java.lang.Object...)"), + 0) + .put(methodRef("org.apache.commons.lang3.Validate", "validIndex(T,int)"), 0) .build(); private static final ImmutableSetMultimap EXPLICITLY_NULLABLE_PARAMETERS = diff --git a/nullaway/src/test/java/com/uber/nullaway/NullAwayFrameworkTests.java b/nullaway/src/test/java/com/uber/nullaway/NullAwayFrameworkTests.java index d3678632e8..8a41d2fd18 100644 --- a/nullaway/src/test/java/com/uber/nullaway/NullAwayFrameworkTests.java +++ b/nullaway/src/test/java/com/uber/nullaway/NullAwayFrameworkTests.java @@ -454,4 +454,386 @@ public void defaultLibraryModelsClassCast() { "}") .doTest(); } + + @Test + public void apacheValidateNotNull() { + defaultCompilationHelper + .addSourceLines( + "Foo.java", + "package com.uber;", + "import org.apache.commons.lang3.Validate;", + "import org.jetbrains.annotations.Nullable;", + "public class Foo {", + " public void bar(@Nullable String s) {", + " Validate.notNull(s);", + " int l = s.length();", + " }", + "}") + .doTest(); + } + + @Test + public void apacheValidateNotNullWithMessage() { + defaultCompilationHelper + .addSourceLines( + "Foo.java", + "package com.uber;", + "import org.apache.commons.lang3.Validate;", + "import org.jetbrains.annotations.Nullable;", + "public class Foo {", + " public void bar(@Nullable String s) {", + " Validate.notNull(s, \"Message\");", + " int l = s.length();", + " }", + "}") + .doTest(); + } + + @Test + public void apacheValidateArrayNotEmptyWithMessage() { + defaultCompilationHelper + .addSourceLines( + "Foo.java", + "package com.uber;", + "import org.apache.commons.lang3.Validate;", + "import org.jetbrains.annotations.Nullable;", + "public class Foo {", + " public void bar(@Nullable String[] s) {", + " Validate.notEmpty(s, \"Message\");", + " int l = s.length;", + " }", + "}") + .doTest(); + } + + @Test + public void apacheValidateArrayNotEmpty() { + defaultCompilationHelper + .addSourceLines( + "Foo.java", + "package com.uber;", + "import org.apache.commons.lang3.Validate;", + "import org.jetbrains.annotations.Nullable;", + "public class Foo {", + " public void bar(@Nullable String[] s) {", + " Validate.notEmpty(s);", + " int l = s.length;", + " }", + "}") + .doTest(); + } + + @Test + public void apacheValidateListNotEmptyWithMessage() { + defaultCompilationHelper + .addSourceLines( + "Foo.java", + "package com.uber;", + "import org.apache.commons.lang3.Validate;", + "import org.jetbrains.annotations.Nullable;", + "import java.util.List;", + "public class Foo {", + " public void bar(@Nullable List s) {", + " Validate.notEmpty(s, \"Message\");", + " int l = s.size();", + " }", + "}") + .doTest(); + } + + @Test + public void apacheValidateListNotEmpty() { + defaultCompilationHelper + .addSourceLines( + "Foo.java", + "package com.uber;", + "import org.apache.commons.lang3.Validate;", + "import org.jetbrains.annotations.Nullable;", + "import java.util.List;", + "public class Foo {", + " public void bar(@Nullable List s) {", + " Validate.notEmpty(s);", + " int l = s.size();", + " }", + "}") + .doTest(); + } + + @Test + public void apacheValidateMapNotEmptyWithMessage() { + defaultCompilationHelper + .addSourceLines( + "Foo.java", + "package com.uber;", + "import org.apache.commons.lang3.Validate;", + "import org.jetbrains.annotations.Nullable;", + "import java.util.Map;", + "public class Foo {", + " public void bar(@Nullable Map s) {", + " Validate.notEmpty(s, \"Message\");", + " int l = s.size();", + " }", + "}") + .doTest(); + } + + @Test + public void apacheValidateMapNotEmpty() { + defaultCompilationHelper + .addSourceLines( + "Foo.java", + "package com.uber;", + "import org.apache.commons.lang3.Validate;", + "import org.jetbrains.annotations.Nullable;", + "import java.util.Map;", + "public class Foo {", + " public void bar(@Nullable Map s) {", + " Validate.notEmpty(s);", + " int l = s.size();", + " }", + "}") + .doTest(); + } + + @Test + public void apacheValidateStringNotEmptyWithMessage() { + defaultCompilationHelper + .addSourceLines( + "Foo.java", + "package com.uber;", + "import org.apache.commons.lang3.Validate;", + "import org.jetbrains.annotations.Nullable;", + "public class Foo {", + " public void bar(@Nullable String s) {", + " Validate.notEmpty(s, \"Message\");", + " int l = s.length();", + " }", + "}") + .doTest(); + } + + @Test + public void apacheValidateStringNotEmpty() { + defaultCompilationHelper + .addSourceLines( + "Foo.java", + "package com.uber;", + "import org.apache.commons.lang3.Validate;", + "import org.jetbrains.annotations.Nullable;", + "public class Foo {", + " public void bar(@Nullable String s) {", + " Validate.notEmpty(s);", + " int l = s.length();", + " }", + "}") + .doTest(); + } + + @Test + public void apacheValidateStringNotBlankWithMessage() { + defaultCompilationHelper + .addSourceLines( + "Foo.java", + "package com.uber;", + "import org.apache.commons.lang3.Validate;", + "import org.jetbrains.annotations.Nullable;", + "public class Foo {", + " public void bar(@Nullable String s) {", + " Validate.notBlank(s, \"Message\");", + " int l = s.length();", + " }", + "}") + .doTest(); + } + + @Test + public void apacheValidateStringNotBlank() { + defaultCompilationHelper + .addSourceLines( + "Foo.java", + "package com.uber;", + "import org.apache.commons.lang3.Validate;", + "import org.jetbrains.annotations.Nullable;", + "public class Foo {", + " public void bar(@Nullable String s) {", + " Validate.notBlank(s);", + " int l = s.length();", + " }", + "}") + .doTest(); + } + + @Test + public void apacheValidateArrayNoNullElementsWithMessage() { + defaultCompilationHelper + .addSourceLines( + "Foo.java", + "package com.uber;", + "import org.apache.commons.lang3.Validate;", + "import org.jetbrains.annotations.Nullable;", + "public class Foo {", + " public void bar(@Nullable String[] s) {", + " Validate.noNullElements(s, \"Message\");", + " int l = s.length;", + " }", + "}") + .doTest(); + } + + @Test + public void apacheValidateArrayNoNullElements() { + defaultCompilationHelper + .addSourceLines( + "Foo.java", + "package com.uber;", + "import org.apache.commons.lang3.Validate;", + "import org.jetbrains.annotations.Nullable;", + "public class Foo {", + " public void bar(@Nullable String[] s) {", + " Validate.noNullElements(s);", + " int l = s.length;", + " }", + "}") + .doTest(); + } + + @Test + public void apacheValidateIterableNoNullElementsWithMessage() { + defaultCompilationHelper + .addSourceLines( + "Foo.java", + "package com.uber;", + "import org.apache.commons.lang3.Validate;", + "import org.jetbrains.annotations.Nullable;", + "import java.util.Iterator;", + "public class Foo {", + " public void bar(@Nullable Iterable s) {", + " Validate.noNullElements(s, \"Message\");", + " Iterator l = s.iterator();", + " }", + "}") + .doTest(); + } + + @Test + public void apacheValidateIterableNoNullElements() { + defaultCompilationHelper + .addSourceLines( + "Foo.java", + "package com.uber;", + "import org.apache.commons.lang3.Validate;", + "import org.jetbrains.annotations.Nullable;", + "import java.util.Iterator;", + "public class Foo {", + " public void bar(@Nullable Iterable s) {", + " Validate.noNullElements(s);", + " Iterator l = s.iterator();", + " }", + "}") + .doTest(); + } + + @Test + public void apacheValidateArrayValidIndexWithMessage() { + defaultCompilationHelper + .addSourceLines( + "Foo.java", + "package com.uber;", + "import org.apache.commons.lang3.Validate;", + "import org.jetbrains.annotations.Nullable;", + "public class Foo {", + " public void bar(@Nullable String[] s) {", + " Validate.validIndex(s, 0, \"Message\");", + " int l = s.length;", + " }", + "}") + .doTest(); + } + + @Test + public void apacheValidateArrayValidIndex() { + defaultCompilationHelper + .addSourceLines( + "Foo.java", + "package com.uber;", + "import org.apache.commons.lang3.Validate;", + "import org.jetbrains.annotations.Nullable;", + "public class Foo {", + " public void bar(@Nullable String[] s) {", + " Validate.validIndex(s, 0);", + " int l = s.length;", + " }", + "}") + .doTest(); + } + + @Test + public void apacheValidateCollectionValidIndexWithMessage() { + defaultCompilationHelper + .addSourceLines( + "Foo.java", + "package com.uber;", + "import org.apache.commons.lang3.Validate;", + "import org.jetbrains.annotations.Nullable;", + "import java.util.List;", + "public class Foo {", + " public void bar(@Nullable List s) {", + " Validate.validIndex(s, 0, \"Message\");", + " int l = s.size();", + " }", + "}") + .doTest(); + } + + @Test + public void apacheValidateCollectionValidIndex() { + defaultCompilationHelper + .addSourceLines( + "Foo.java", + "package com.uber;", + "import org.apache.commons.lang3.Validate;", + "import org.jetbrains.annotations.Nullable;", + "import java.util.List;", + "public class Foo {", + " public void bar(@Nullable List s) {", + " Validate.validIndex(s, 0);", + " int l = s.size();", + " }", + "}") + .doTest(); + } + + @Test + public void apacheValidateStringValidIndexWithMessage() { + defaultCompilationHelper + .addSourceLines( + "Foo.java", + "package com.uber;", + "import org.apache.commons.lang3.Validate;", + "import org.jetbrains.annotations.Nullable;", + "public class Foo {", + " public void bar(@Nullable String s) {", + " Validate.validIndex(s, 0, \"Message\");", + " int l = s.length();", + " }", + "}") + .doTest(); + } + + @Test + public void apacheValidateStringValidIndex() { + defaultCompilationHelper + .addSourceLines( + "Foo.java", + "package com.uber;", + "import org.apache.commons.lang3.Validate;", + "import org.jetbrains.annotations.Nullable;", + "public class Foo {", + " public void bar(@Nullable String s) {", + " Validate.validIndex(s, 0);", + " int l = s.length();", + " }", + "}") + .doTest(); + } }