Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Adding support for Activity and Fragment coming from the support libraries: #275

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Expand Up @@ -73,8 +73,22 @@ final class ErrorProneCLIFlagsConfig extends AbstractConfig {
"android.app.Service.onCreate",
"android.app.Activity.onCreate",
"android.app.Fragment.onCreate",
"android.app.Fragment.onAttach",
"android.app.Fragment.onCreateView",
"android.app.Application.onCreate",
"javax.annotation.processing.Processor.init");
"javax.annotation.processing.Processor.init",
// Support Library v4 - can be removed once AndroidX becomes more popular
"android.support.v4.app.ActivityCompat.onCreate",
"android.support.v4.app.Fragment.onCreate",
"android.support.v4.app.Fragment.onAttach",
"android.support.v4.app.Fragment.onCreateView",
// Support Library v4 - can be removed once AndroidX becomes more popular
"androidx.core.app.ActivityCompat.onCreate",
"androidx.fragment.app.Fragment.onCreate",
"androidx.fragment.app.Fragment.onAttach",
"androidx.fragment.app.Fragment.onCreateView",
// Multidex app
"android.support.multidex.Application.onCreate");

static final ImmutableSet<String> DEFAULT_INITIALIZER_ANNOT =
ImmutableSet.of(
Expand Down
186 changes: 186 additions & 0 deletions nullaway/src/test/java/com/uber/nullaway/NullAwayAndroidTest.java
@@ -0,0 +1,186 @@
package com.uber.nullaway;

import com.google.errorprone.CompilationTestHelper;
import java.util.Arrays;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;

/** Unit tests for {@link com.uber.nullaway.NullAway}. */
@RunWith(JUnit4.class)
@SuppressWarnings("CheckTestExtendsBaseClass")
public class NullAwayAndroidTest {
@Rule public final TemporaryFolder temporaryFolder = new TemporaryFolder();

private CompilationTestHelper compilationHelper;

@Before
public void setup() {
compilationHelper = CompilationTestHelper.newInstance(NullAway.class, getClass());
compilationHelper.setArgs(
Arrays.asList(
"-d",
temporaryFolder.getRoot().getAbsolutePath(),
"-XepOpt:NullAway:AnnotatedPackages=com.uber,com.ubercab,io.reactivex"));
}

// Core Fragment tests

@Test
public void coreFragmentSuccess() {
initialiseAndroidCoreClasses();
compilationHelper
.addSourceFile("androidstubs/core/Fragment.java")
.addSourceFile("android-success/CoreFragment.java")
.doTest();
}

@Test
public void coreFragmentMissingOnAttachError() {
initialiseAndroidCoreClasses();
compilationHelper
.addSourceFile("androidstubs/core/Fragment.java")
.addSourceFile("android-error/CoreFragmentWithoutOnAttach.java")
yanislavm marked this conversation as resolved.
Show resolved Hide resolved
.doTest();
}

@Test
public void coreFragmentMissingOnCreateError() {
initialiseAndroidCoreClasses();
compilationHelper
.addSourceFile("androidstubs/core/Fragment.java")
.addSourceFile("android-error/CoreFragmentWithoutOnCreate.java")
.doTest();
}

@Test
public void coreFragmentMissingOnCreateViewError() {
initialiseAndroidCoreClasses();
compilationHelper
.addSourceFile("androidstubs/core/Fragment.java")
.addSourceFile("android-error/CoreFragmentWithoutOnCreateView.java")
.doTest();
}

// AndroidX Library Fragment
@Test
public void androidxFragmentSuccess() {
initialiseAndroidCoreClasses();
compilationHelper
.addSourceFile("androidstubs/androidx/Fragment.java")
.addSourceFile("android-success/AndroidxFragment.java")
.doTest();
}

@Test
public void androidxFragmentMissingOnAttachError() {
initialiseAndroidCoreClasses();
compilationHelper
.addSourceFile("androidstubs/androidx/Fragment.java")
.addSourceFile("android-error/AndroidxFragmentWithoutOnAttach.java")
.doTest();
}

@Test
public void androidxFragmentMissingOnCreateError() {
initialiseAndroidCoreClasses();
compilationHelper
.addSourceFile("androidstubs/androidx/Fragment.java")
.addSourceFile("android-error/AndroidxFragmentWithoutOnCreate.java")
.doTest();
}

@Test
public void androidxFragmentMissingOnCreateViewError() {
initialiseAndroidCoreClasses();
compilationHelper
.addSourceFile("androidstubs/androidx/Fragment.java")
.addSourceFile("android-error/AndroidxFragmentWithoutOnCreateView.java")
.doTest();
}

// Android support library Fragment

@Test
public void supportLibFragmentSuccess() {
initialiseAndroidCoreClasses();
compilationHelper
.addSourceFile("androidstubs/supportlib/Fragment.java")
.addSourceFile("android-success/SupportLibraryFragment.java")
.doTest();
}

@Test
public void supportLibFragmentMissingOnAttachError() {
initialiseAndroidCoreClasses();
compilationHelper
.addSourceFile("androidstubs/supportlib/Fragment.java")
.addSourceFile("android-error/SupportLibraryFragmentWithoutOnAttach.java")
.doTest();
}

@Test
public void supportLibFragmentMissingOnCreateError() {
initialiseAndroidCoreClasses();
compilationHelper
.addSourceFile("androidstubs/supportlib/Fragment.java")
.addSourceFile("android-error/SupportLibraryFragmentWithoutOnCreate.java")
.doTest();
}

@Test
public void supportLibFragmentMissingOnCreateViewError() {
initialiseAndroidCoreClasses();
compilationHelper
.addSourceFile("androidstubs/supportlib/Fragment.java")
.addSourceFile("android-error/SupportLibraryFragmentWithoutOnCreateView.java")
.doTest();
}

// Core Activity

@Test
public void coreActivitySuccess() {
initialiseAndroidCoreClasses();
compilationHelper
.addSourceFile("androidstubs/core/Activity.java")
.addSourceFile("android-success/CoreActivity.java")
.doTest();
}

// Support Library Activity

@Test
public void supportLibActivitySuccess() {
initialiseAndroidCoreClasses();
compilationHelper
.addSourceFile("androidstubs/supportlib/ActivityCompat.java")
.addSourceFile("android-success/SupportLibActivityCompat.java")
.doTest();
}

// AndroidX Library Activity

@Test
public void androidxActivitySuccess() {
initialiseAndroidCoreClasses();
compilationHelper
.addSourceFile("androidstubs/androidx/ActivityCompat.java")
.addSourceFile("android-success/AndroidxActivityCompat.java")
.doTest();
}

/** Initialises the default android classes that are commonly used. */
private void initialiseAndroidCoreClasses() {
compilationHelper
.addSourceFile("androidstubs/core/Context.java")
.addSourceFile("androidstubs/core/Bundle.java")
.addSourceFile("androidstubs/core/LayoutInflater.java")
.addSourceFile("androidstubs/core/PersistableBundle.java")
.addSourceFile("androidstubs/core/View.java")
.addSourceFile("androidstubs/core/ViewGroup.java");
}
}
@@ -0,0 +1,28 @@
package com.uber.myapplication;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.fragment.app.Fragment;

public class AndroidxFragmentWithoutOnAttach extends Fragment {

private Object mOnCreateInitialisedField;
private Object mOnCreateViewInitialisedField;
// BUG: Diagnostic contains: @NonNull field mOnAttachInitialisedField not initialized
private Object mOnAttachInitialisedField;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mOnCreateInitialisedField = new Object();
}

@Override
public View onCreateView(
LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
mOnCreateViewInitialisedField = new Object();
return super.onCreateView(inflater, container, savedInstanceState);
}
}
@@ -0,0 +1,28 @@
package com.uber.myapplication;

import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.fragment.app.Fragment;

public class AndroidxFragmentWithoutOnCreate extends Fragment {
// BUG: Diagnostic contains: @NonNull field mOnCreateInitialisedField not initialized
private Object mOnCreateInitialisedField;
private Object mOnCreateViewInitialisedField;
private Object mOnAttachInitialisedField;

@Override
public View onCreateView(
LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
mOnCreateViewInitialisedField = new Object();
return super.onCreateView(inflater, container, savedInstanceState);
}

@Override
public void onAttach(Context context) {
super.onAttach(context);
mOnAttachInitialisedField = new Object();
}
}
@@ -0,0 +1,25 @@
package com.uber.myapplication;

import android.content.Context;
import android.os.Bundle;
import androidx.fragment.app.Fragment;

public class AndroidxFragmentWithoutOnCreateView extends Fragment {

private Object mOnCreateInitialisedField;
// BUG: Diagnostic contains: @NonNull field mOnCreateViewInitialisedField not initialized
private Object mOnCreateViewInitialisedField;
private Object mOnAttachInitialisedField;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mOnCreateInitialisedField = new Object();
}

@Override
public void onAttach(Context context) {
super.onAttach(context);
mOnAttachInitialisedField = new Object();
}
}
@@ -0,0 +1,28 @@
package com.uber.myapplication;

import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class CoreFragmentWithoutOnAttach extends Fragment {

private Object mOnCreateInitialisedField;
private Object mOnCreateViewInitialisedField;
// BUG: Diagnostic contains: @NonNull field mOnAttachInitialisedField not initialized
private Object mOnAttachInitialisedField;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mOnCreateInitialisedField = new Object();
}

@Override
public View onCreateView(
LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
mOnCreateViewInitialisedField = new Object();
return super.onCreateView(inflater, container, savedInstanceState);
}
}
@@ -0,0 +1,28 @@
package com.uber.myapplication;

import android.app.Fragment;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class CoreFragmentWithoutOnCreate extends Fragment {
// BUG: Diagnostic contains: @NonNull field mOnCreateInitialisedField not initialized
private Object mOnCreateInitialisedField;
private Object mOnCreateViewInitialisedField;
private Object mOnAttachInitialisedField;

@Override
public View onCreateView(
LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
mOnCreateViewInitialisedField = new Object();
return super.onCreateView(inflater, container, savedInstanceState);
}

@Override
public void onAttach(Context context) {
super.onAttach(context);
mOnAttachInitialisedField = new Object();
}
}
@@ -0,0 +1,25 @@
package com.uber.myapplication;

import android.app.Fragment;
import android.content.Context;
import android.os.Bundle;

public class CoreFragmentWithoutOnCreateView extends Fragment {

private Object mOnCreateInitialisedField;
// BUG: Diagnostic contains: @NonNull field mOnCreateViewInitialisedField not initialized
private Object mOnCreateViewInitialisedField;
private Object mOnAttachInitialisedField;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mOnCreateInitialisedField = new Object();
}

@Override
public void onAttach(Context context) {
super.onAttach(context);
mOnAttachInitialisedField = new Object();
}
}