aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--java/Android.bp2
-rw-r--r--java/android/annotation/NonNull.java4
-rw-r--r--java/android/annotation/Nullable.java4
-rw-r--r--java/com/android/modules/utils/FastDataInput.java4
-rw-r--r--java/com/android/modules/utils/testing/AbstractExtendedMockitoRule.java70
-rw-r--r--javatests/com/android/modules/utils/testing/ExtendedMockitoRuleTest.java49
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);