Extract AbstractStubsTest

Checked tests report:
* 869 tests
* 0 failures
* 12 ignored

Bug: 287473897
Test: time ./gradlew --rerun-tasks
Change-Id: If6407b9f9b4f638336084ecb6d4a2eb0c5feb9e3
diff --git a/src/test/java/com/android/tools/metalava/stub/AbstractStubsTest.kt b/src/test/java/com/android/tools/metalava/stub/AbstractStubsTest.kt
new file mode 100644
index 0000000..27cab97
--- /dev/null
+++ b/src/test/java/com/android/tools/metalava/stub/AbstractStubsTest.kt
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tools.metalava.stub
+
+import com.android.tools.lint.checks.infrastructure.TestFile
+import com.android.tools.metalava.ANDROIDX_NONNULL
+import com.android.tools.metalava.ARG_EXCLUDE_ANNOTATION
+import com.android.tools.metalava.DriverTest
+import com.android.tools.metalava.FileFormat
+import com.android.tools.metalava.java
+import org.intellij.lang.annotations.Language
+
+open class AbstractStubsTest : DriverTest() {
+    protected fun checkStubs(
+        // source is a wrapper for stubFiles. When passing multiple stub Java files to test,
+        // use stubFiles.
+        @Language("JAVA") source: String = "",
+        stubFiles: Array<TestFile> = emptyArray(),
+        warnings: String? = "",
+        api: String? = null,
+        extraArguments: Array<String> = emptyArray(),
+        docStubs: Boolean = false,
+        showAnnotations: Array<String> = emptyArray(),
+        skipEmitPackages: List<String> = listOf("java.lang", "java.util", "java.io"),
+        format: FileFormat = FileFormat.latest,
+        sourceFiles: Array<TestFile> = emptyArray(),
+        signatureSources: Array<String> = emptyArray(),
+        checkTextStubEquivalence: Boolean = false
+    ) {
+        val stubFilesArr = if (source.isNotEmpty()) arrayOf(java(source)) else stubFiles
+        check(
+            sourceFiles = sourceFiles,
+            signatureSources = signatureSources,
+            showAnnotations = showAnnotations,
+            stubFiles = stubFilesArr,
+            expectedIssues = warnings,
+            checkCompilation = true,
+            api = api,
+            extraArguments = extraArguments,
+            docStubs = docStubs,
+            skipEmitPackages = skipEmitPackages,
+            format = format
+        )
+        if (checkTextStubEquivalence) {
+            if (stubFilesArr.isEmpty()) {
+                addError("Stub files may not be empty when checkTextStubEquivalence is set to true.")
+                return
+            }
+            if (docStubs) {
+                addError("From-text stub generation is not supported for documentation stub.")
+                return
+            }
+            if (stubFilesArr.any { it !is TestFile.JavaTestFile }) {
+                addError("From-text stub generation is only supported for Java stubs.")
+                return
+            }
+            check(
+                signatureSources = arrayOf(readFile(getApiFile())),
+                showAnnotations = showAnnotations,
+                stubFiles = stubFilesArr,
+                expectedIssues = warnings,
+                checkCompilation = true,
+                extraArguments = arrayOf(*extraArguments, ARG_EXCLUDE_ANNOTATION, ANDROIDX_NONNULL),
+                skipEmitPackages = skipEmitPackages,
+                format = format
+            )
+        }
+    }
+}
diff --git a/src/test/java/com/android/tools/metalava/stub/StubsTest.kt b/src/test/java/com/android/tools/metalava/stub/StubsTest.kt
index cc30a59..908afe9 100644
--- a/src/test/java/com/android/tools/metalava/stub/StubsTest.kt
+++ b/src/test/java/com/android/tools/metalava/stub/StubsTest.kt
@@ -18,15 +18,12 @@
 
 package com.android.tools.metalava.stub
 
-import com.android.tools.lint.checks.infrastructure.TestFile
-import com.android.tools.metalava.ANDROIDX_NONNULL
 import com.android.tools.metalava.ARG_EXCLUDE_ALL_ANNOTATIONS
 import com.android.tools.metalava.ARG_EXCLUDE_ANNOTATION
 import com.android.tools.metalava.ARG_EXCLUDE_DOCUMENTATION_FROM_STUBS
 import com.android.tools.metalava.ARG_HIDE_PACKAGE
 import com.android.tools.metalava.ARG_KOTLIN_STUBS
 import com.android.tools.metalava.ARG_PASS_THROUGH_ANNOTATION
-import com.android.tools.metalava.DriverTest
 import com.android.tools.metalava.FileFormat
 import com.android.tools.metalava.androidxNullableSource
 import com.android.tools.metalava.deprecatedForSdkSource
@@ -41,72 +38,15 @@
 import com.android.tools.metalava.supportParameterName
 import com.android.tools.metalava.systemApiSource
 import com.android.tools.metalava.testApiSource
-import org.intellij.lang.annotations.Language
 import org.junit.Test
 import java.io.File
 import kotlin.test.assertEquals
 
 @SuppressWarnings("ALL")
-class StubsTest : DriverTest() {
+class StubsTest : AbstractStubsTest() {
     // TODO: test fields that need initialization
     // TODO: test @DocOnly handling
 
-    private fun checkStubs(
-        // source is a wrapper for stubFiles. When passing multiple stub Java files to test,
-        // use stubFiles.
-        @Language("JAVA") source: String = "",
-        stubFiles: Array<TestFile> = emptyArray(),
-        warnings: String? = "",
-        api: String? = null,
-        extraArguments: Array<String> = emptyArray(),
-        docStubs: Boolean = false,
-        showAnnotations: Array<String> = emptyArray(),
-        skipEmitPackages: List<String> = listOf("java.lang", "java.util", "java.io"),
-        format: FileFormat = FileFormat.latest,
-        sourceFiles: Array<TestFile> = emptyArray(),
-        signatureSources: Array<String> = emptyArray(),
-        checkTextStubEquivalence: Boolean = false
-    ) {
-        val stubFilesArr = if (source.isNotEmpty()) arrayOf(java(source)) else stubFiles
-        check(
-            sourceFiles = sourceFiles,
-            signatureSources = signatureSources,
-            showAnnotations = showAnnotations,
-            stubFiles = stubFilesArr,
-            expectedIssues = warnings,
-            checkCompilation = true,
-            api = api,
-            extraArguments = extraArguments,
-            docStubs = docStubs,
-            skipEmitPackages = skipEmitPackages,
-            format = format
-        )
-        if (checkTextStubEquivalence) {
-            if (stubFilesArr.isEmpty()) {
-                addError("Stub files may not be empty when checkTextStubEquivalence is set to true.")
-                return
-            }
-            if (docStubs) {
-                addError("From-text stub generation is not supported for documentation stub.")
-                return
-            }
-            if (stubFilesArr.any { it !is TestFile.JavaTestFile }) {
-                addError("From-text stub generation is only supported for Java stubs.")
-                return
-            }
-            check(
-                signatureSources = arrayOf(readFile(getApiFile())),
-                showAnnotations = showAnnotations,
-                stubFiles = stubFilesArr,
-                expectedIssues = warnings,
-                checkCompilation = true,
-                extraArguments = arrayOf(*extraArguments, ARG_EXCLUDE_ANNOTATION, ANDROIDX_NONNULL),
-                skipEmitPackages = skipEmitPackages,
-                format = format
-            )
-        }
-    }
-
     @Test
     fun `Generate stubs for basic class`() {
         checkStubs(