Parameterize camera-extensions tests

This CL parameterizes camera-extensions tests, allowing them to be run
on both the camera-camera2 backend and the camera-camera2-pipe backend.

Bug: 320485616
Test: Run tests on supported devices
Change-Id: If3d239c717ac409f414893edcfe8fc6e6b62c44f
diff --git a/camera/camera-extensions/build.gradle b/camera/camera-extensions/build.gradle
index 1cc83d2..95a8346 100644
--- a/camera/camera-extensions/build.gradle
+++ b/camera/camera-extensions/build.gradle
@@ -60,6 +60,7 @@
     androidTestImplementation(libs.truth)
     androidTestImplementation(libs.multidex)
     androidTestImplementation(project(":camera:camera-camera2"))
+    androidTestImplementation(project(":camera:camera-camera2-pipe-integration"))
     androidTestImplementation(project(":camera:camera-lifecycle"))
     androidTestImplementation(project(":camera:camera-testing")) {
         // Ensure camera-testing does not pull in androidx.test dependencies
diff --git a/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ExtensionsManagerTest.kt b/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ExtensionsManagerTest.kt
index 5eafbc8..18e7195 100644
--- a/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ExtensionsManagerTest.kt
+++ b/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ExtensionsManagerTest.kt
@@ -24,6 +24,7 @@
 import androidx.camera.core.Camera
 import androidx.camera.core.CameraInfo
 import androidx.camera.core.CameraSelector
+import androidx.camera.core.CameraXConfig
 import androidx.camera.core.SurfaceRequest
 import androidx.camera.core.impl.CameraInfoInternal
 import androidx.camera.core.impl.MutableStateObservable
@@ -34,7 +35,9 @@
 import androidx.camera.extensions.internal.VendorExtender
 import androidx.camera.extensions.internal.Version
 import androidx.camera.extensions.util.ExtensionsTestUtil
+import androidx.camera.extensions.util.ExtensionsTestUtil.CAMERA_PIPE_IMPLEMENTATION_OPTION
 import androidx.camera.lifecycle.ProcessCameraProvider
+import androidx.camera.testing.impl.CameraPipeConfigTestRule
 import androidx.camera.testing.impl.CameraUtil
 import androidx.camera.testing.impl.fakes.FakeLifecycleOwner
 import androidx.camera.testing.impl.fakes.FakeUseCase
@@ -55,6 +58,7 @@
 import org.junit.Assume.assumeFalse
 import org.junit.Assume.assumeTrue
 import org.junit.Before
+import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.junit.runners.Parameterized
@@ -63,10 +67,16 @@
 @RunWith(Parameterized::class)
 @SdkSuppress(minSdkVersion = 21)
 class ExtensionsManagerTest(
+    private val implName: String,
+    private val cameraXConfig: CameraXConfig,
     private val implType: ExtensionsTestlibControl.ImplementationType,
     @field:ExtensionMode.Mode @param:ExtensionMode.Mode private val extensionMode: Int,
     @field:CameraSelector.LensFacing @param:CameraSelector.LensFacing private val lensFacing: Int
 ) {
+    @get:Rule
+    val cameraPipeConfigTestRule = CameraPipeConfigTestRule(
+        active = implName == CAMERA_PIPE_IMPLEMENTATION_OPTION
+    )
 
     private val context = InstrumentationRegistry.getInstrumentation().context
 
@@ -86,6 +96,7 @@
             )
         )
 
+        ProcessCameraProvider.configureInstance(cameraXConfig)
         cameraProvider =
             ProcessCameraProvider.getInstance(context)[10000, TimeUnit.MILLISECONDS]
 
@@ -112,10 +123,14 @@
 
     companion object {
         val context: Context = ApplicationProvider.getApplicationContext()
+
         @JvmStatic
-        @get:Parameterized.Parameters(name = "implType = {0}, mode = {1}, facing = {2}")
-        val parameters: Collection<Array<Any>>
-            get() = ExtensionsTestUtil.getAllImplExtensionsLensFacingCombinations(context, false)
+        @Parameterized.Parameters(
+            name = "cameraXConfig = {0}, implType = {2}, mode = {3}, facing = {4}"
+        )
+        fun data(): Collection<Array<Any>> {
+            return ExtensionsTestUtil.getAllImplExtensionsLensFacingCombinations(context, false)
+        }
     }
 
     @Test
@@ -302,7 +317,7 @@
                 return true
             }
 
-            override fun getEstimatedCaptureLatencyRange(size: Size?): Range<Long>? {
+            override fun getEstimatedCaptureLatencyRange(size: Size?): Range<Long> {
                 return estimatedCaptureLatency
             }
         }
@@ -310,9 +325,11 @@
             fakeVendorExtender
         }
 
-        assertThat(extensionsManager.getEstimatedCaptureLatencyRange(
-            baseCameraSelector,
-            extensionMode)
+        assertThat(
+            extensionsManager.getEstimatedCaptureLatencyRange(
+                baseCameraSelector,
+                extensionMode
+            )
         ).isEqualTo(estimatedCaptureLatency)
     }
 
@@ -329,9 +346,11 @@
                 != ExtensionsManager.ExtensionsAvailability.LIBRARY_AVAILABLE
         )
 
-        assertThat(extensionsManager.getEstimatedCaptureLatencyRange(
+        assertThat(
+            extensionsManager.getEstimatedCaptureLatencyRange(
                 baseCameraSelector,
-                extensionMode)
+                extensionMode
+            )
         ).isNull()
     }
 
@@ -483,9 +502,11 @@
                 == ExtensionsManager.ExtensionsAvailability.LIBRARY_AVAILABLE
         )
 
-        assertThat(extensionsManager.isImageAnalysisSupported(
-            baseCameraSelector,
-            extensionMode)
+        assertThat(
+            extensionsManager.isImageAnalysisSupported(
+                baseCameraSelector,
+                extensionMode
+            )
         ).isFalse()
     }
 
@@ -517,11 +538,14 @@
                 == ExtensionsManager.ExtensionsAvailability.LIBRARY_AVAILABLE
         )
 
-        assertThat(extensionsManager.isImageAnalysisSupported(
-            baseCameraSelector,
-            extensionMode)
+        assertThat(
+            extensionsManager.isImageAnalysisSupported(
+                baseCameraSelector,
+                extensionMode
+            )
         ).isTrue()
     }
+
     @Test
     fun isImageAnalysisSupportedIsFalse_whenExtensionAvailabilityIsNotAvailable() {
         extensionsManager = ExtensionsManager.getInstanceAsync(
@@ -535,9 +559,11 @@
                 != ExtensionsManager.ExtensionsAvailability.LIBRARY_AVAILABLE
         )
 
-        assertThat(extensionsManager.isImageAnalysisSupported(
-            baseCameraSelector,
-            extensionMode)
+        assertThat(
+            extensionsManager.isImageAnalysisSupported(
+                baseCameraSelector,
+                extensionMode
+            )
         ).isFalse()
     }
 
@@ -569,7 +595,7 @@
             }
 
             override fun isPostviewAvailable(): Boolean {
-                return true;
+                return true
             }
         }
         extensionsManager.setVendorExtenderFactory {
@@ -598,7 +624,7 @@
             }
 
             override fun isCaptureProcessProgressAvailable(): Boolean {
-                return true;
+                return true
             }
         }
         extensionsManager.setVendorExtenderFactory {
@@ -637,8 +663,10 @@
         var vendorExtender = ExtensionsTestUtil.createVendorExtender(extensionMode)
         val cameraId = (cameraInfo as CameraInfoInternal).cameraId
 
-        return vendorExtender.isExtensionAvailable(cameraId,
-            ExtensionsUtils.getCameraCharacteristicsMap(cameraInfo))
+        return vendorExtender.isExtensionAvailable(
+            cameraId,
+            ExtensionsUtils.getCameraCharacteristicsMap(cameraInfo)
+        )
     }
 
     private fun createVideoCapture(): VideoCapture<TestVideoOutput> {
@@ -658,6 +686,7 @@
         override fun onSurfaceRequested(@NonNull request: SurfaceRequest) {
             surfaceRequest = request
         }
+
         override fun getMediaSpec() = mediaSpecObservable
         override fun onSourceStateChanged(@NonNull sourceState: VideoOutput.SourceState) {
             this.sourceState = sourceState
diff --git a/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ImageAnalysisTest.kt b/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ImageAnalysisTest.kt
index db5d883..8ebfd99 100644
--- a/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ImageAnalysisTest.kt
+++ b/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ImageAnalysisTest.kt
@@ -21,9 +21,9 @@
 import android.hardware.camera2.CameraCharacteristics
 import android.util.Pair
 import android.util.Size
-import androidx.camera.camera2.Camera2Config
 import androidx.camera.core.Camera
 import androidx.camera.core.CameraSelector
+import androidx.camera.core.CameraXConfig
 import androidx.camera.core.ImageAnalysis
 import androidx.camera.core.ImageCapture
 import androidx.camera.core.Preview
@@ -33,7 +33,9 @@
 import androidx.camera.extensions.impl.ExtensionsTestlibControl
 import androidx.camera.extensions.internal.VendorExtender
 import androidx.camera.extensions.util.ExtensionsTestUtil
+import androidx.camera.extensions.util.ExtensionsTestUtil.CAMERA_PIPE_IMPLEMENTATION_OPTION
 import androidx.camera.lifecycle.ProcessCameraProvider
+import androidx.camera.testing.impl.CameraPipeConfigTestRule
 import androidx.camera.testing.impl.CameraUtil
 import androidx.camera.testing.impl.SurfaceTextureProvider
 import androidx.camera.testing.impl.fakes.FakeLifecycleOwner
@@ -59,21 +61,32 @@
 @RunWith(Parameterized::class)
 @SdkSuppress(minSdkVersion = 21)
 class ImageAnalysisTest(
+    private val implName: String,
+    private val cameraXConfig: CameraXConfig,
     private val implType: ExtensionsTestlibControl.ImplementationType,
     @ExtensionMode.Mode private val extensionMode: Int,
     @CameraSelector.LensFacing private val lensFacing: Int
 ) {
     companion object {
         val context: Context = ApplicationProvider.getApplicationContext()
+
         @JvmStatic
-        @get:Parameterized.Parameters(name = "implType = {0}, mode = {1}, facing = {2}")
-        val parameters: Collection<Array<Any>>
-            get() = ExtensionsTestUtil.getAllImplExtensionsLensFacingCombinations(context, true)
+        @Parameterized.Parameters(
+            name = "cameraXConfig = {0}, implType = {2}, mode = {3}, facing = {4}"
+        )
+        fun data(): Collection<Array<Any>> {
+            return ExtensionsTestUtil.getAllImplExtensionsLensFacingCombinations(context, true)
+        }
     }
 
     @get:Rule
+    val cameraPipeConfigTestRule = CameraPipeConfigTestRule(
+        active = implName == CAMERA_PIPE_IMPLEMENTATION_OPTION
+    )
+
+    @get:Rule
     val useCamera = CameraUtil.grantCameraPermissionAndPreTest(
-        CameraUtil.PreTestCameraIdList(Camera2Config.defaultConfig())
+        CameraUtil.PreTestCameraIdList(cameraXConfig)
     )
 
     private lateinit var cameraProvider: ProcessCameraProvider
@@ -92,6 +105,7 @@
             )
         )
 
+        ProcessCameraProvider.configureInstance(cameraXConfig)
         cameraProvider = ProcessCameraProvider.getInstance(context)[10000, TimeUnit.MILLISECONDS]
         ExtensionsTestlibControl.getInstance().setImplementationType(implType)
         baseCameraSelector = CameraSelector.Builder().requireLensFacing(lensFacing).build()
@@ -128,8 +142,9 @@
             baseCameraSelector,
             extensionMode
         )
-        Assume.assumeTrue(extensionsManager
-            .isImageAnalysisSupported(extensionsCameraSelector, extensionMode))
+        Assume.assumeTrue(
+            extensionsManager.isImageAnalysisSupported(extensionsCameraSelector, extensionMode)
+        )
 
         val analysisLatch = CountDownLatch(2)
         withContext(Dispatchers.Main) {
@@ -185,16 +200,21 @@
 
                 override fun getSupportedPreviewOutputResolutions(): List<Pair<Int, Array<Size>>> {
                     return listOf(
-                        Pair(ImageFormatConstants.INTERNAL_DEFINED_IMAGE_FORMAT_PRIVATE,
+                        Pair(
+                            ImageFormatConstants.INTERNAL_DEFINED_IMAGE_FORMAT_PRIVATE,
                             getOutputSizes(
-                                ImageFormatConstants.INTERNAL_DEFINED_IMAGE_FORMAT_PRIVATE))
+                                ImageFormatConstants.INTERNAL_DEFINED_IMAGE_FORMAT_PRIVATE
+                            )
+                        )
                     )
                 }
 
                 override fun getSupportedCaptureOutputResolutions(): List<Pair<Int, Array<Size>>> {
                     return listOf(
-                        Pair(ImageFormat.JPEG,
-                            getOutputSizes(ImageFormat.JPEG))
+                        Pair(
+                            ImageFormat.JPEG,
+                            getOutputSizes(ImageFormat.JPEG)
+                        )
                     )
                 }
             }
@@ -204,8 +224,10 @@
             baseCameraSelector,
             extensionMode
         )
-        assertThat(extensionsManager
-            .isImageAnalysisSupported(baseCameraSelector, extensionMode)).isTrue()
+        assertThat(
+            extensionsManager
+                .isImageAnalysisSupported(baseCameraSelector, extensionMode)
+        ).isTrue()
         withContext(Dispatchers.Main) {
             val preview = Preview.Builder().build()
             val imageCapture = ImageCapture.Builder().build()
@@ -213,9 +235,9 @@
 
             // 2. Act
             cameraProvider.bindToLifecycle(
-                    fakeLifecycleOwner,
-                    extensionsCameraSelector,
-                    preview, imageCapture, imageAnalysis
+                fakeLifecycleOwner,
+                extensionsCameraSelector,
+                preview, imageCapture, imageAnalysis
             )
 
             // 3. Assert
@@ -241,16 +263,21 @@
 
                 override fun getSupportedPreviewOutputResolutions(): List<Pair<Int, Array<Size>>> {
                     return listOf(
-                        Pair(ImageFormatConstants.INTERNAL_DEFINED_IMAGE_FORMAT_PRIVATE,
+                        Pair(
+                            ImageFormatConstants.INTERNAL_DEFINED_IMAGE_FORMAT_PRIVATE,
                             getOutputSizes(
-                                ImageFormatConstants.INTERNAL_DEFINED_IMAGE_FORMAT_PRIVATE))
+                                ImageFormatConstants.INTERNAL_DEFINED_IMAGE_FORMAT_PRIVATE
+                            )
+                        )
                     )
                 }
 
                 override fun getSupportedCaptureOutputResolutions(): List<Pair<Int, Array<Size>>> {
                     return listOf(
-                        Pair(ImageFormat.JPEG,
-                            getOutputSizes(ImageFormat.JPEG))
+                        Pair(
+                            ImageFormat.JPEG,
+                            getOutputSizes(ImageFormat.JPEG)
+                        )
                     )
                 }
             }
@@ -260,8 +287,10 @@
             baseCameraSelector,
             extensionMode
         )
-        assertThat(extensionsManager
-            .isImageAnalysisSupported(baseCameraSelector, extensionMode)).isFalse()
+        assertThat(
+            extensionsManager
+                .isImageAnalysisSupported(baseCameraSelector, extensionMode)
+        ).isFalse()
         withContext(Dispatchers.Main) {
             val preview = Preview.Builder().build()
             val imageCapture = ImageCapture.Builder().build()
diff --git a/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ImageCaptureTest.kt b/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ImageCaptureTest.kt
index 40550df..96f066b 100644
--- a/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ImageCaptureTest.kt
+++ b/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ImageCaptureTest.kt
@@ -23,9 +23,9 @@
 import android.util.Log
 import android.util.Size
 import android.view.Surface
-import androidx.camera.camera2.Camera2Config
 import androidx.camera.core.Camera
 import androidx.camera.core.CameraSelector
+import androidx.camera.core.CameraXConfig
 import androidx.camera.core.ImageCapture
 import androidx.camera.core.ImageCaptureException
 import androidx.camera.core.ImageProxy
@@ -34,7 +34,9 @@
 import androidx.camera.core.internal.compat.workaround.ExifRotationAvailability
 import androidx.camera.extensions.impl.ExtensionsTestlibControl
 import androidx.camera.extensions.util.ExtensionsTestUtil
+import androidx.camera.extensions.util.ExtensionsTestUtil.CAMERA_PIPE_IMPLEMENTATION_OPTION
 import androidx.camera.lifecycle.ProcessCameraProvider
+import androidx.camera.testing.impl.CameraPipeConfigTestRule
 import androidx.camera.testing.impl.CameraUtil
 import androidx.camera.testing.impl.CameraUtil.PreTestCameraIdList
 import androidx.camera.testing.impl.ExifUtil
@@ -70,14 +72,21 @@
 @RunWith(Parameterized::class)
 @SdkSuppress(minSdkVersion = 21)
 class ImageCaptureTest(
+    private val implName: String,
+    private val cameraXConfig: CameraXConfig,
     private val implType: ExtensionsTestlibControl.ImplementationType,
     @field:ExtensionMode.Mode @param:ExtensionMode.Mode private val extensionMode: Int,
     @field:CameraSelector.LensFacing @param:CameraSelector.LensFacing private val lensFacing: Int
 ) {
 
     @get:Rule
+    val cameraPipeConfigTestRule = CameraPipeConfigTestRule(
+        active = implName == CAMERA_PIPE_IMPLEMENTATION_OPTION
+    )
+
+    @get:Rule
     val useCamera = CameraUtil.grantCameraPermissionAndPreTest(
-        PreTestCameraIdList(Camera2Config.defaultConfig())
+        PreTestCameraIdList(cameraXConfig)
     )
 
     @get:Rule
@@ -102,6 +111,7 @@
             )
         )
 
+        ProcessCameraProvider.configureInstance(cameraXConfig)
         cameraProvider = ProcessCameraProvider.getInstance(context)[10000, TimeUnit.MILLISECONDS]
         baseCameraSelector = CameraSelector.Builder().requireLensFacing(lensFacing).build()
         ExtensionsTestlibControl.getInstance().setImplementationType(implType)
@@ -136,10 +146,14 @@
     companion object {
         val TAG = "ImageCaptureTest"
         val context: Context = ApplicationProvider.getApplicationContext()
+
         @JvmStatic
-        @get:Parameterized.Parameters(name = "impl= {0}, mode = {1}, facing = {2}")
-        val parameters: Collection<Array<Any>>
-            get() = ExtensionsTestUtil.getAllImplExtensionsLensFacingCombinations(context, true)
+        @Parameterized.Parameters(
+            name = "cameraXConfig = {0}, impl = {2}, mode = {3}, facing = {4}"
+        )
+        fun data(): Collection<Array<Any>> {
+            return ExtensionsTestUtil.getAllImplExtensionsLensFacingCombinations(context, true)
+        }
     }
 
     @Test
@@ -186,8 +200,10 @@
 
     // TODO(b/322416654): Enable test after it can pass on most devices
     fun canInterruptTakePictureAndResume_forLongCapture(): Unit = runBlocking {
-        val latency = extensionsManager.getEstimatedCaptureLatencyRange(extensionsCameraSelector,
-            extensionMode)
+        val latency = extensionsManager.getEstimatedCaptureLatencyRange(
+            extensionsCameraSelector,
+            extensionMode
+        )
         assumeTrue(latency != null && latency.lower >= 2000)
         canInterruptTakePictureAndResumeInternal(
             delayForStopLifecycle = latency!!.lower,
@@ -207,7 +223,7 @@
         delayForStopLifecycle: Long
     ): Unit = runBlocking {
         if (enablePostview) {
-            assumeTrue(isPostviewSupported());
+            assumeTrue(isPostviewSupported())
         }
         val imageCapturedCallback = FakeOnImageCaptureCallback()
         val imageCapture = ImageCapture.Builder()
@@ -265,8 +281,9 @@
                 Bitmap::class.java
             )
             Mockito.verify(mockOnImageCapturedCallback, Mockito.timeout(10000))
-                .onPostviewBitmapAvailable(bitmap.capture()
-            )
+                .onPostviewBitmapAvailable(
+                    bitmap.capture()
+                )
             assertThat(bitmap).isNotNull()
         }
 
@@ -555,12 +572,15 @@
             override fun onError(exception: ImageCaptureException) {
                 hasError = true
             }
+
             override fun onCaptureStarted() {
                 captureStartedDeferred.complete(true)
             }
+
             override fun onCaptureSuccess(image: ImageProxy) {
                 captureSuccessDeferred.complete(image)
             }
+
             override fun onPostviewBitmapAvailable(bitmap: Bitmap) {
                 PostviewDeferred.complete(bitmap)
             }
@@ -605,6 +625,7 @@
             override fun onError(exception: ImageCaptureException) {
                 hasError = true
             }
+
             override fun onCaptureStarted() {
                 captureStartedDeferred.complete(true)
             }
@@ -612,6 +633,7 @@
             override fun onImageSaved(outputFileResults: ImageCapture.OutputFileResults) {
                 imageSavedDeferred.complete(outputFileResults)
             }
+
             override fun onPostviewBitmapAvailable(bitmap: Bitmap) {
                 PostviewDeferred.complete(bitmap)
             }
@@ -643,7 +665,8 @@
             cameraProvider.bindToLifecycle(
                 fakeLifecycleOwner,
                 extensionsCameraSelector,
-                imageCapture)
+                imageCapture
+            )
         }
 
         assertThat(imageCapture.currentConfig.isHigResolutionDisabled(false)).isTrue()
diff --git a/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/PreviewTest.kt b/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/PreviewTest.kt
index 3d527c9..cea52da 100644
--- a/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/PreviewTest.kt
+++ b/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/PreviewTest.kt
@@ -21,12 +21,14 @@
 import android.os.Handler
 import android.os.HandlerThread
 import android.util.Size
-import androidx.camera.camera2.Camera2Config
 import androidx.camera.core.CameraSelector
+import androidx.camera.core.CameraXConfig
 import androidx.camera.core.Preview
 import androidx.camera.extensions.impl.ExtensionsTestlibControl
 import androidx.camera.extensions.util.ExtensionsTestUtil
+import androidx.camera.extensions.util.ExtensionsTestUtil.CAMERA_PIPE_IMPLEMENTATION_OPTION
 import androidx.camera.lifecycle.ProcessCameraProvider
+import androidx.camera.testing.impl.CameraPipeConfigTestRule
 import androidx.camera.testing.impl.CameraUtil
 import androidx.camera.testing.impl.CameraUtil.PreTestCameraIdList
 import androidx.camera.testing.impl.GLUtil
@@ -54,14 +56,20 @@
 @RunWith(Parameterized::class)
 @SdkSuppress(minSdkVersion = 21)
 class PreviewTest(
+    private val implName: String,
+    private val cameraXConfig: CameraXConfig,
     private val implType: ExtensionsTestlibControl.ImplementationType,
     @field:ExtensionMode.Mode @param:ExtensionMode.Mode private val extensionMode: Int,
     @field:CameraSelector.LensFacing @param:CameraSelector.LensFacing private val lensFacing: Int
 ) {
+    @get:Rule
+    val cameraPipeConfigTestRule = CameraPipeConfigTestRule(
+        active = implName == CAMERA_PIPE_IMPLEMENTATION_OPTION
+    )
 
     @get:Rule
     val useCamera = CameraUtil.grantCameraPermissionAndPreTest(
-        PreTestCameraIdList(Camera2Config.defaultConfig())
+        PreTestCameraIdList(cameraXConfig)
     )
 
     private lateinit var cameraProvider: ProcessCameraProvider
@@ -118,6 +126,7 @@
             )
         )
 
+        ProcessCameraProvider.configureInstance(cameraXConfig)
         cameraProvider = ProcessCameraProvider.getInstance(context)[10000, TimeUnit.MILLISECONDS]
         ExtensionsTestlibControl.getInstance().setImplementationType(implType)
         baseCameraSelector = CameraSelector.Builder().requireLensFacing(lensFacing).build()
@@ -151,10 +160,14 @@
 
     companion object {
         val context: Context = ApplicationProvider.getApplicationContext()
+
         @JvmStatic
-        @get:Parameterized.Parameters(name = "implType = {0}, mode = {1}, facing = {2}")
-        val parameters: Collection<Array<Any>>
-            get() = ExtensionsTestUtil.getAllImplExtensionsLensFacingCombinations(context, true)
+        @Parameterized.Parameters(
+            name = "cameraXConfig = {0}, implType = {2}, mode = {3}, facing = {4}"
+        )
+        fun data(): Collection<Array<Any>> {
+            return ExtensionsTestUtil.getAllImplExtensionsLensFacingCombinations(context, true)
+        }
     }
 
     @UiThreadTest
@@ -186,10 +199,15 @@
         val preview = Preview.Builder().build()
 
         withContext(Dispatchers.Main) {
+            preview.setSurfaceProvider(
+                SurfaceTextureProvider.createSurfaceTextureProvider(createSurfaceTextureCallback())
+            )
+
             cameraProvider.bindToLifecycle(
                 fakeLifecycleOwner,
                 extensionsCameraSelector,
-                preview)
+                preview
+            )
         }
 
         assertThat(preview.currentConfig.isHigResolutionDisabled(false)).isTrue()
diff --git a/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/VideoCaptureTest.kt b/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/VideoCaptureTest.kt
index 81cfe97..6661554 100644
--- a/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/VideoCaptureTest.kt
+++ b/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/VideoCaptureTest.kt
@@ -23,16 +23,18 @@
 import android.net.Uri
 import android.util.Log
 import android.util.Size
-import androidx.camera.camera2.Camera2Config
 import androidx.camera.core.CameraSelector
+import androidx.camera.core.CameraXConfig
 import androidx.camera.core.ImageCapture
 import androidx.camera.core.Preview
 import androidx.camera.core.Preview.SurfaceProvider
 import androidx.camera.core.impl.utils.executor.CameraXExecutors
 import androidx.camera.extensions.impl.ExtensionsTestlibControl
 import androidx.camera.extensions.util.ExtensionsTestUtil
+import androidx.camera.extensions.util.ExtensionsTestUtil.CAMERA_PIPE_IMPLEMENTATION_OPTION
 import androidx.camera.lifecycle.ProcessCameraProvider
 import androidx.camera.testing.impl.AndroidUtil.skipVideoRecordingTestIfNotSupportedByEmulator
+import androidx.camera.testing.impl.CameraPipeConfigTestRule
 import androidx.camera.testing.impl.CameraUtil
 import androidx.camera.testing.impl.SurfaceTextureProvider
 import androidx.camera.testing.impl.fakes.FakeLifecycleOwner
@@ -67,13 +69,20 @@
 @RunWith(Parameterized::class)
 @SdkSuppress(minSdkVersion = 21)
 class VideoCaptureTest(
+    private val implName: String,
+    private val cameraXConfig: CameraXConfig,
     private val implType: ExtensionsTestlibControl.ImplementationType,
     @field:ExtensionMode.Mode @param:ExtensionMode.Mode private val extensionMode: Int,
     @field:CameraSelector.LensFacing @param:CameraSelector.LensFacing private val lensFacing: Int
 ) {
     @get:Rule
+    val cameraPipeConfigTestRule = CameraPipeConfigTestRule(
+        active = implName == CAMERA_PIPE_IMPLEMENTATION_OPTION
+    )
+
+    @get:Rule
     val useCamera = CameraUtil.grantCameraPermissionAndPreTest(
-        CameraUtil.PreTestCameraIdList(Camera2Config.defaultConfig())
+        CameraUtil.PreTestCameraIdList(cameraXConfig)
     )
 
     @get:Rule
@@ -102,19 +111,23 @@
                 Log.d(TAG, "Recording start")
                 latchForVideoStarted.countDown()
             }
+
             is VideoRecordEvent.Finalize -> {
                 Log.d(TAG, "Recording finalize")
                 finalize = it
                 latchForVideoSaved.countDown()
             }
+
             is VideoRecordEvent.Status -> {
                 Log.d(TAG, "Recording Status")
                 latchForVideoRecording.countDown()
             }
+
             is VideoRecordEvent.Pause,
             is VideoRecordEvent.Resume -> {
                 // Do nothing.
             }
+
             else -> {
                 throw IllegalStateException()
             }
@@ -131,6 +144,7 @@
         )
         skipVideoRecordingTestIfNotSupportedByEmulator()
 
+        ProcessCameraProvider.configureInstance(cameraXConfig)
         cameraProvider = ProcessCameraProvider.getInstance(context)[10000, TimeUnit.MILLISECONDS]
         ExtensionsTestlibControl.getInstance().setImplementationType(implType)
         baseCameraSelector = CameraSelector.Builder().requireLensFacing(lensFacing).build()
@@ -282,9 +296,13 @@
         private const val VIDEO_TIMEOUT_SEC = 10L
         private const val TAG = "VideoCaptureTest"
         val context: Context = ApplicationProvider.getApplicationContext()
+
         @JvmStatic
-        @get:Parameterized.Parameters(name = "implType = {0}, mode = {1}, facing = {2}")
-        val parameters: Collection<Array<Any>>
-            get() = ExtensionsTestUtil.getAllImplExtensionsLensFacingCombinations(context, true)
+        @Parameterized.Parameters(
+            name = "cameraXConfig = {0}, implType = {2}, mode = {3}, facing = {4}"
+        )
+        fun data(): Collection<Array<Any>> {
+            return ExtensionsTestUtil.getAllImplExtensionsLensFacingCombinations(context, true)
+        }
     }
 }
diff --git a/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/util/ExtensionsTestUtil.java b/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/util/ExtensionsTestUtil.java
index 56b3bac..24baeae 100644
--- a/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/util/ExtensionsTestUtil.java
+++ b/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/util/ExtensionsTestUtil.java
@@ -32,7 +32,10 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.RequiresApi;
+import androidx.camera.camera2.Camera2Config;
+import androidx.camera.camera2.pipe.integration.CameraPipeConfig;
 import androidx.camera.core.CameraSelector;
+import androidx.camera.core.CameraXConfig;
 import androidx.camera.core.ExtendableBuilder;
 import androidx.camera.core.impl.Config;
 import androidx.camera.extensions.ExtensionMode;
@@ -62,14 +65,18 @@
             SESSION_CAPTURE_CALLBACK_OPTION =
             Config.Option.create("camera2.cameraCaptureSession.captureCallback",
                     CameraCaptureSession.CaptureCallback.class);
+    public static final String CAMERA2_IMPLEMENTATION_OPTION = "camera2";
+    public static final String CAMERA_PIPE_IMPLEMENTATION_OPTION = "camera_pipe";
 
     /**
-     * Returns the parameters which contains the combination of implementationType, extensions
-     * mode and lens facing.
+     * Returns the parameters which contains the combination of CameraXConfig
+     * name, CameraXConfig, implementationType, extensions mode and lens facing.
      */
     @NonNull
     public static Collection<Object[]> getAllImplExtensionsLensFacingCombinations(
-            @NonNull Context context, boolean excludeUnavailableModes) {
+            @NonNull Context context,
+            boolean excludeUnavailableModes
+    ) {
         ExtensionsTestlibControl.ImplementationType implType =
                 ExtensionsTestlibControl.getInstance().getImplementationType();
 
@@ -92,8 +99,9 @@
         });
 
         if (implType == OEM_IMPL) {
-            return excludeUnavailableModes ? filterOutUnavailableMode(context, basicOrOemImplList)
-                    : basicOrOemImplList;
+            List<Object[]> allList = excludeUnavailableModes ? filterOutUnavailableMode(context,
+                    basicOrOemImplList) : basicOrOemImplList;
+            return getConfigPrependedCombinations(allList);
         }
 
         List<Object[]> advancedList = Arrays.asList(new Object[][]{
@@ -119,7 +127,8 @@
 
         // Reset to basic in case advanced is used accidentally.
         ExtensionsTestlibControl.getInstance().setImplementationType(TESTLIB_BASIC);
-        return allList;
+
+        return getConfigPrependedCombinations(allList);
     }
 
     private static List<Object[]> filterOutUnavailableMode(Context context,
@@ -158,6 +167,24 @@
         }
     }
 
+    private static List<Object[]> getConfigPrependedCombinations(List<Object[]> combinations) {
+        CameraXConfig camera2Config = Camera2Config.defaultConfig();
+        CameraXConfig cameraPipeConfig = CameraPipeConfig.defaultConfig();
+        List<Object[]> combinationsWithConfig = new ArrayList<Object[]>();
+        for (Object[] combination: combinations) {
+            List<Object> combinationCamera2 = new ArrayList<Object>(
+                    Arrays.asList(CAMERA2_IMPLEMENTATION_OPTION, camera2Config));
+            combinationCamera2.addAll(Arrays.asList(combination));
+            combinationsWithConfig.add(combinationCamera2.toArray());
+
+            List<Object> combinationCameraPipe = new ArrayList<Object>(
+                    Arrays.asList(CAMERA_PIPE_IMPLEMENTATION_OPTION, cameraPipeConfig));
+            combinationCameraPipe.addAll(Arrays.asList(combination));
+            combinationsWithConfig.add(combinationCameraPipe.toArray());
+        }
+        return combinationsWithConfig;
+    }
+
     /**
      * Returns whether the target camera device can support the test for a specific extension mode.
      */