diff options
-rw-r--r-- | java/Android.bp | 2 | ||||
-rw-r--r-- | java/android/annotation/NonNull.java | 4 | ||||
-rw-r--r-- | java/android/annotation/Nullable.java | 4 | ||||
-rw-r--r-- | java/com/android/modules/utils/FastDataInput.java | 4 | ||||
-rw-r--r-- | java/com/android/modules/utils/testing/AbstractExtendedMockitoRule.java | 70 | ||||
-rw-r--r-- | javatests/com/android/modules/utils/testing/ExtendedMockitoRuleTest.java | 49 |
6 files changed, 35 insertions, 98 deletions
diff --git a/java/Android.bp b/java/Android.bp index a1ab7a3..326dc51 100644 --- a/java/Android.bp +++ b/java/Android.bp @@ -70,7 +70,6 @@ java_library { host_supported: true, optimize: { proguard_flags_files: ["aconfig_proguard.flags"], - export_proguard_flags_files: true, }, visibility: [ "//visibility:public", @@ -81,6 +80,7 @@ filegroup { name: "framework-api-annotations", srcs: [ "android/annotation/Discouraged.java", + "android/annotation/FlaggedApi.java", "android/annotation/SystemApi.java", "android/annotation/TestApi.java", ], diff --git a/java/android/annotation/NonNull.java b/java/android/annotation/NonNull.java index 635959b..20472ba 100644 --- a/java/android/annotation/NonNull.java +++ b/java/android/annotation/NonNull.java @@ -18,7 +18,7 @@ package android.annotation; import static java.lang.annotation.ElementType.FIELD; import static java.lang.annotation.ElementType.METHOD; import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.CLASS; +import static java.lang.annotation.RetentionPolicy.SOURCE; import java.lang.annotation.Retention; import java.lang.annotation.Target; @@ -32,7 +32,7 @@ import java.lang.annotation.Target; * @returnDoc This value cannot be {@code null}. * @hide */ -@Retention(CLASS) +@Retention(SOURCE) @Target({METHOD, PARAMETER, FIELD}) public @interface NonNull { } diff --git a/java/android/annotation/Nullable.java b/java/android/annotation/Nullable.java index 11b6511..b8473e7 100644 --- a/java/android/annotation/Nullable.java +++ b/java/android/annotation/Nullable.java @@ -18,7 +18,7 @@ package android.annotation; import static java.lang.annotation.ElementType.FIELD; import static java.lang.annotation.ElementType.METHOD; import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.CLASS; +import static java.lang.annotation.RetentionPolicy.SOURCE; import java.lang.annotation.Retention; import java.lang.annotation.Target; @@ -39,7 +39,7 @@ import java.lang.annotation.Target; * @returnDoc This value may be {@code null}. * @hide */ -@Retention(CLASS) +@Retention(SOURCE) @Target({METHOD, PARAMETER, FIELD}) public @interface Nullable { } diff --git a/java/com/android/modules/utils/FastDataInput.java b/java/com/android/modules/utils/FastDataInput.java index daa86d5..1437f80 100644 --- a/java/com/android/modules/utils/FastDataInput.java +++ b/java/com/android/modules/utils/FastDataInput.java @@ -207,6 +207,10 @@ public class FastDataInput implements DataInput, Closeable { return s; } else { + if (ref >= mStringRefs.length) { + throw new IOException("Invalid interned string reference " + ref + " for " + + mStringRefs.length + " interned strings"); + } return mStringRefs[ref]; } } diff --git a/java/com/android/modules/utils/testing/AbstractExtendedMockitoRule.java b/java/com/android/modules/utils/testing/AbstractExtendedMockitoRule.java index 7a0f41b..2242ca0 100644 --- a/java/com/android/modules/utils/testing/AbstractExtendedMockitoRule.java +++ b/java/com/android/modules/utils/testing/AbstractExtendedMockitoRule.java @@ -77,7 +77,6 @@ public abstract class AbstractExtendedMockitoRule<R extends AbstractExtendedMock private final Set<Class<?>> mMockedStaticClasses; private final Set<Class<?>> mSpiedStaticClasses; private final List<StaticMockFixture> mStaticMockFixtures; - private final @Nullable SessionBuilderVisitor mSessionBuilderConfigurator; private final boolean mClearInlineMocks; private MockitoSession mMockitoSession; @@ -88,7 +87,6 @@ public abstract class AbstractExtendedMockitoRule<R extends AbstractExtendedMock mMockitoFramework = builder.mMockitoFramework; mMockitoSession = builder.mMockitoSession; mAfterSessionFinishedCallback = builder.mAfterSessionFinishedCallback; - mSessionBuilderConfigurator = builder.mSessionBuilderConfigurator; mMockedStaticClasses = builder.mMockedStaticClasses; mSpiedStaticClasses = builder.mSpiedStaticClasses; mStaticMockFixtures = builder.mStaticMockFixtures == null ? Collections.emptyList() @@ -98,7 +96,6 @@ public abstract class AbstractExtendedMockitoRule<R extends AbstractExtendedMock + ", mockedStaticClasses=" + mMockedStaticClasses + ", spiedStaticClasses=" + mSpiedStaticClasses + ", staticMockFixtures=" + mStaticMockFixtures - + ", sessionBuilderConfigurator=" + mSessionBuilderConfigurator + ", afterSessionFinishedCallback=" + mAfterSessionFinishedCallback + ", mockitoFramework=" + mMockitoFramework + ", mockitoSession=" + mMockitoSession @@ -133,8 +130,16 @@ public abstract class AbstractExtendedMockitoRule<R extends AbstractExtendedMock return Collections.unmodifiableSet(staticClasses); } - - + /** + * Gets whether the rule should clear the inline mocks after the given test. + * + * <p>By default, it returns {@code} (unless the rule was built with + * {@link AbstractBuilder#dontClearInlineMocks()}, but subclasses can override to change the + * behavior (for example, to decide based on custom annotations). + */ + protected boolean getClearInlineMethodsAtTheEnd(Description description) { + return mClearInlineMocks; + } @Override public Statement apply(Statement base, Description description) { @@ -211,10 +216,6 @@ public abstract class AbstractExtendedMockitoRule<R extends AbstractExtendedMock Log.v(TAG, "Calling spyStatic() on " + clazz); sessionBuilder.spyStatic(clazz); } - if (mSessionBuilderConfigurator != null) { - Log.v(TAG, "Visiting " + mSessionBuilderConfigurator + " with " + sessionBuilder); - mSessionBuilderConfigurator.visit(sessionBuilder); - } } private void setUpMockBehaviors() { @@ -247,12 +248,13 @@ public abstract class AbstractExtendedMockitoRule<R extends AbstractExtendedMock } } } finally { - clearInlineMocks(); + clearInlineMocks(description); } } - private void clearInlineMocks() { - if (!mClearInlineMocks) { + private void clearInlineMocks(Description description) { + boolean clearIt = getClearInlineMethodsAtTheEnd(description); + if (!clearIt) { Log.d(TAG, "NOT calling clearInlineMocks() as set on builder"); return; } @@ -278,7 +280,6 @@ public abstract class AbstractExtendedMockitoRule<R extends AbstractExtendedMock Strictness mStrictness = Strictness.LENIENT; @Nullable MockitoFramework mMockitoFramework; @Nullable MockitoSession mMockitoSession; - @Nullable SessionBuilderVisitor mSessionBuilderConfigurator; @Nullable Runnable mAfterSessionFinishedCallback; boolean mClearInlineMocks = true; @@ -312,11 +313,9 @@ public abstract class AbstractExtendedMockitoRule<R extends AbstractExtendedMock * com.android.dx.mockito.inline.extended.StaticMockitoSessionBuilder#mockStatic(Class)}. * * @throws IllegalStateException if the same class was already passed to - * {@link #mockStatic(Class)} or {@link #spyStatic(Class)} or if - * {@link #configureSessionBuilder(SessionBuilderVisitor)} was called before. + * {@link #mockStatic(Class)} or {@link #spyStatic(Class)}. */ public final B mockStatic(Class<?> clazz) { - checkConfigureSessionBuilderNotCalled(); mMockedStaticClasses.add(checkClassNotMockedOrSpied(clazz)); return thisBuilder(); } @@ -326,11 +325,9 @@ public abstract class AbstractExtendedMockitoRule<R extends AbstractExtendedMock * com.android.dx.mockito.inline.extended.StaticMockitoSessionBuilder#spyStatic(Class)}. * * @throws IllegalStateException if the same class was already passed to - * {@link #mockStatic(Class)} or {@link #spyStatic(Class)} or if - * {@link #configureSessionBuilder(SessionBuilderVisitor)} was called before. + * {@link #mockStatic(Class)} or {@link #spyStatic(Class)}. */ public final B spyStatic(Class<?> clazz) { - checkConfigureSessionBuilderNotCalled(); mSpiedStaticClasses.add(checkClassNotMockedOrSpied(clazz)); return thisBuilder(); } @@ -352,25 +349,6 @@ public abstract class AbstractExtendedMockitoRule<R extends AbstractExtendedMock return thisBuilder(); } - // TODO(b/281577492): remove once CachedAppOptimizerTest doesn't use anymore - /** - * Alternative for {@link #spyStatic(Class)} / {@link #mockStatic(Class)}; typically used - * when the same setup is shared by multiple tests. - * - * @deprecated use {@link #addStaticMockFixtures(Supplier...)} instead - * - * @throws IllegalStateException if {@link #mockStatic(Class)} or {@link #spyStatic(Class)} - * was called before. - */ - @Deprecated - public final B configureSessionBuilder( - SessionBuilderVisitor sessionBuilderConfigurator) { - checkState(mMockedStaticClasses.isEmpty(), "mockStatic() already called"); - checkState(mSpiedStaticClasses.isEmpty(), "spyStatic() already called"); - mSessionBuilderConfigurator = Objects.requireNonNull(sessionBuilderConfigurator); - return thisBuilder(); - } - /** * Runs the given {@code runnable} after the session finished. * @@ -416,11 +394,6 @@ public abstract class AbstractExtendedMockitoRule<R extends AbstractExtendedMock return (B) this; } - private void checkConfigureSessionBuilderNotCalled() { - checkState(mSessionBuilderConfigurator == null, - "configureSessionBuilder() already called"); - } - private Class<?> checkClassNotMockedOrSpied(Class<?> clazz) { Objects.requireNonNull(clazz); checkState(!mMockedStaticClasses.contains(clazz), "class %s already mocked", clazz); @@ -429,17 +402,6 @@ public abstract class AbstractExtendedMockitoRule<R extends AbstractExtendedMock } } - /** - * Visitor for {@link StaticMockitoSessionBuilder}. - */ - public interface SessionBuilderVisitor { - - /** - * Visits it. - */ - void visit(StaticMockitoSessionBuilder builder); - } - // Copied from com.android.internal.util.Preconditions, as that method is not available on RVC private static void checkState(boolean expression, String messageTemplate, Object... messageArgs) { diff --git a/javatests/com/android/modules/utils/testing/ExtendedMockitoRuleTest.java b/javatests/com/android/modules/utils/testing/ExtendedMockitoRuleTest.java index 6a80268..26d0cc3 100644 --- a/javatests/com/android/modules/utils/testing/ExtendedMockitoRuleTest.java +++ b/javatests/com/android/modules/utils/testing/ExtendedMockitoRuleTest.java @@ -65,7 +65,6 @@ public final class ExtendedMockitoRuleTest { private @Mock Statement mStatement; private @Mock Runnable mRunnable; - private @Mock ExtendedMockitoRule.SessionBuilderVisitor mSessionBuilderVisitor; private @Mock StaticMockFixture mStaticMockFixture1; private @Mock StaticMockFixture mStaticMockFixture2; private @Mock StaticMockFixture mStaticMockFixture3; @@ -100,12 +99,6 @@ public final class ExtendedMockitoRuleTest { } @Test - public void testBuilder_configureSessionBuilder_null() { - assertThrows(NullPointerException.class, - () -> mBuilder.configureSessionBuilder(null)); - } - - @Test public void testBuilder_mockStatic_null() { assertThrows(NullPointerException.class, () -> mBuilder.mockStatic(null)); } @@ -420,18 +413,6 @@ public final class ExtendedMockitoRuleTest { } @Test - public void testSpyStatic_afterConfigureSessionBuilder() throws Throwable { - assertThrows(IllegalStateException.class, () -> mBuilder - .configureSessionBuilder(mSessionBuilderVisitor).spyStatic(StaticClass.class)); - } - - @Test - public void testMockStatic_afterConfigureSessionBuilder() throws Throwable { - assertThrows(IllegalStateException.class, () -> mBuilder - .configureSessionBuilder(mSessionBuilderVisitor).mockStatic(StaticClass.class)); - } - - @Test public void testAddStaticMockFixtures_once() throws Throwable { InOrder inOrder = inOrder(mStaticMockFixture1, mStaticMockFixture2); @@ -515,26 +496,6 @@ public final class ExtendedMockitoRuleTest { } @Test - public void testConfigureSessionBuilder_afterMockStatic() throws Throwable { - assertThrows(IllegalStateException.class, () -> mBuilder.mockStatic(StaticClass.class) - .configureSessionBuilder(mSessionBuilderVisitor)); - } - - @Test - public void testConfigureSessionBuilder_afterSpyStatic() throws Throwable { - assertThrows(IllegalStateException.class, () -> mBuilder.spyStatic(StaticClass.class) - .configureSessionBuilder(mSessionBuilderVisitor)); - } - - @Test - public void testConfigureSessionBuilder() throws Throwable { - mUnsafeBuilder.configureSessionBuilder(mSessionBuilderVisitor) - .build().apply(mStatement, mDescription).evaluate(); - - verify(mSessionBuilderVisitor).visit(notNull()); - } - - @Test public void testAfterSessionFinished() throws Throwable { mUnsafeBuilder.afterSessionFinished(mRunnable).build().apply(mStatement, mDescription) .evaluate(); @@ -639,6 +600,16 @@ public final class ExtendedMockitoRuleTest { assertWithMessage("mockito framework cleared").that(mockitoFramework.called).isTrue(); } + @Test + public void testGetClearInlineMethodsAtTheEnd() throws Throwable { + assertWithMessage("getClearInlineMethodsAtTheEnd() by default") + .that(mBuilder.build().getClearInlineMethodsAtTheEnd(mDescription)).isTrue(); + assertWithMessage("getClearInlineMethodsAtTheEnd() when built with dontClearInlineMocks()") + .that(mBuilder.dontClearInlineMocks().build() + .getClearInlineMethodsAtTheEnd(mDescription)) + .isFalse(); + } + private void applyRuleOnTestThatDoesntUseExpectation(@Nullable Strictness strictness) throws Throwable { Log.d(TAG, "applyRuleOnTestThatDoesntUseExpectation(): strictness= " + strictness); |