Skip to content

Commit ee5edee

Browse files
test: more nullness array tests
1 parent d49a29a commit ee5edee

File tree

13 files changed

+220
-0
lines changed

13 files changed

+220
-0
lines changed

checker/src/test/java/io/github/eisop/checker/nullness/NullnessDirectoryTest.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,30 @@ public void testArrayScenarios() throws Exception {
3737
false);
3838
}
3939

40+
@Test
41+
public void testGradualArrayScenarios() throws Exception {
42+
runDirectoryTest(
43+
"nullness-array-gradual",
44+
"io.github.eisop.runtimeframework.checker.nullness.NullnessRuntimeChecker",
45+
false);
46+
}
47+
48+
@Test
49+
public void testGradualArrayGlobalScenarios() throws Exception {
50+
runDirectoryTest(
51+
"nullness-array-gradual-global",
52+
"io.github.eisop.runtimeframework.checker.nullness.NullnessRuntimeChecker",
53+
true);
54+
}
55+
56+
@Test
57+
public void testGradualArrayGlobalOverrideScenarios() throws Exception {
58+
runDirectoryTest(
59+
"nullness-array-gradual-global-override",
60+
"io.github.eisop.runtimeframework.checker.nullness.NullnessRuntimeChecker",
61+
true);
62+
}
63+
4064
@Test
4165
public void testFieldWriteScenarios() throws Exception {
4266
runDirectoryTest(
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
public class ArrayOverrideRunner {
2+
3+
public static void main(String[] args) {
4+
SafeArrayContract contract = new LegacyArrayTrojan();
5+
contract.acceptArray(null);
6+
// :: error: (Parameter 0 in overridden method acceptArray must be NonNull)
7+
8+
contract.getArray();
9+
}
10+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
public class LegacyArrayTrojan extends SafeArrayContract {
2+
3+
@Override
4+
public void acceptArray(String[] input) {}
5+
6+
@Override
7+
public String[] getArray() {
8+
return null;
9+
// :: error: (Return value of overridden method getArray must be NonNull)
10+
}
11+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import io.github.eisop.runtimeframework.qual.AnnotatedFor;
2+
import org.checkerframework.checker.nullness.qual.NonNull;
3+
4+
@AnnotatedFor("nullness")
5+
public class SafeArrayContract {
6+
7+
public void acceptArray(String @NonNull [] input) {}
8+
9+
public String @NonNull [] getArray() {
10+
return new String[1];
11+
}
12+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import io.github.eisop.runtimeframework.qual.AnnotatedFor;
2+
3+
@AnnotatedFor("nullness")
4+
public class ArrayFieldWriteElements {
5+
6+
public String[] data = new String[1];
7+
8+
static class UncheckedWriter {
9+
static void poison(ArrayFieldWriteElements target) {
10+
target.data[0] = null;
11+
// :: error: (Array Element Write must be NonNull)
12+
}
13+
}
14+
15+
public static void main(String[] args) {
16+
UncheckedWriter.poison(new ArrayFieldWriteElements());
17+
}
18+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import io.github.eisop.runtimeframework.qual.AnnotatedFor;
2+
import org.checkerframework.checker.nullness.qual.NonNull;
3+
4+
@AnnotatedFor("nullness")
5+
public class ArrayFieldWriteReference {
6+
7+
public String @NonNull [] data = new String[1];
8+
9+
static class UncheckedWriter {
10+
static void poison(ArrayFieldWriteReference target) {
11+
target.data = null;
12+
// :: error: (Field 'data' must be NonNull)
13+
}
14+
}
15+
16+
public static void main(String[] args) {
17+
UncheckedWriter.poison(new ArrayFieldWriteReference());
18+
}
19+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import io.github.eisop.runtimeframework.qual.AnnotatedFor;
2+
import org.checkerframework.checker.nullness.qual.NonNull;
3+
import org.checkerframework.checker.nullness.qual.Nullable;
4+
5+
@AnnotatedFor("nullness")
6+
public class ArrayBoundaryReturnElements {
7+
8+
static class UncheckedLib {
9+
static @Nullable String[] getNullableElementArray() {
10+
return new @Nullable String[1];
11+
}
12+
}
13+
14+
static void accept(@NonNull String value) {}
15+
16+
public static void main(String[] args) {
17+
@Nullable String[] values = UncheckedLib.getNullableElementArray();
18+
values[0] = null;
19+
accept(values[0]);
20+
// :: error: (Parameter 0 must be NonNull)
21+
}
22+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import io.github.eisop.runtimeframework.qual.AnnotatedFor;
2+
3+
@AnnotatedFor("nullness")
4+
public class ArrayBoundaryReturnReference {
5+
6+
static class UncheckedLib {
7+
static String[] getNullArray() {
8+
return null;
9+
}
10+
}
11+
12+
public static void main(String[] args) {
13+
UncheckedLib.getNullArray();
14+
// :: error: (Return value of getNullArray (Boundary) must be NonNull)
15+
}
16+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import io.github.eisop.runtimeframework.qual.AnnotatedFor;
2+
3+
@AnnotatedFor("nullness")
4+
public class ArrayBridgeTest extends UncheckedParentArrays {
5+
6+
public static void main(String[] args) {
7+
ArrayBridgeTest test = new ArrayBridgeTest();
8+
9+
test.dangerousArray(new String[1]);
10+
test.dangerousArray(null);
11+
// :: error: (Parameter 0 in inherited method dangerousArray must be NonNull)
12+
13+
test.returnArray();
14+
// :: error: (Return value of inherited method returnArray must be NonNull)
15+
}
16+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import io.github.eisop.runtimeframework.qual.AnnotatedFor;
2+
import org.checkerframework.checker.nullness.qual.NonNull;
3+
import org.checkerframework.checker.nullness.qual.Nullable;
4+
5+
@AnnotatedFor("nullness")
6+
public class ArrayFieldReadElements {
7+
8+
static class UncheckedLib {
9+
public @Nullable String[] values = new @Nullable String[1];
10+
}
11+
12+
static void accept(@NonNull String value) {}
13+
14+
public static void main(String[] args) {
15+
UncheckedLib lib = new UncheckedLib();
16+
lib.values[0] = null;
17+
accept(lib.values[0]);
18+
// :: error: (Parameter 0 must be NonNull)
19+
}
20+
}

0 commit comments

Comments
 (0)