Skip to content

Commit

Permalink
Adding support for Activity and Fragment coming from the support libr…
Browse files Browse the repository at this point in the history
…aries: (#275)

Adding support for:
* Fragment and Activity classes that are coming from the support library and Android X
* onCreateView and onAttach for the Fragment

* Adding a fragment to test the changes for onCreate, onCreateView and onAttach

* Adding unit tests
  • Loading branch information
yanislavm authored and msridhar committed Dec 22, 2018
1 parent 404dc89 commit ba56d5b
Show file tree
Hide file tree
Showing 31 changed files with 1,053 additions and 1 deletion.
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")
.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();
}
}

0 comments on commit ba56d5b

Please sign in to comment.