Enable stress test for pipe config

- Replace Camera2CameraInfo usages to other approaches. e.g. Using CameraInfoInternal instead.
- OpenCloseCameraStressTest uses CameraDevice.StateCallback to monitor state events. Skip pipe-integration part because it can't run passed now.
- OpenCloseCaptureSessionStressTest uses CameraCaptureSession.StateCallback to monitor state events. Skip pipe-integration part because it can't run passed now.

Bug: 254198768
Test: manual test locally and run MH test on some lab devices

Change-Id: I63cdf4fdf1b0b380f70f5d6f535d51891a996c5e
diff --git a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/BindUnbindUseCasesStressTest.kt b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/BindUnbindUseCasesStressTest.kt
index ff9cca4..2a55cbd 100644
--- a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/BindUnbindUseCasesStressTest.kt
+++ b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/BindUnbindUseCasesStressTest.kt
@@ -22,14 +22,16 @@
 import android.os.HandlerThread
 import android.util.Log
 import android.util.Size
-import androidx.camera.camera2.Camera2Config
+import androidx.camera.camera2.pipe.integration.CameraPipeConfig
 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.ImageProxy
 import androidx.camera.core.Preview
 import androidx.camera.core.impl.utils.executor.CameraXExecutors
+import androidx.camera.integration.core.util.StressTestUtil
 import androidx.camera.integration.core.util.StressTestUtil.STRESS_TEST_OPERATION_REPEAT_COUNT
 import androidx.camera.integration.core.util.StressTestUtil.STRESS_TEST_REPEAT_COUNT
 import androidx.camera.integration.core.util.StressTestUtil.VERIFICATION_TARGET_IMAGE_ANALYSIS
@@ -38,6 +40,7 @@
 import androidx.camera.integration.core.util.StressTestUtil.VERIFICATION_TARGET_VIDEO_CAPTURE
 import androidx.camera.integration.core.util.StressTestUtil.createCameraSelectorById
 import androidx.camera.lifecycle.ProcessCameraProvider
+import androidx.camera.testing.CameraPipeConfigTestRule
 import androidx.camera.testing.CameraUtil
 import androidx.camera.testing.GLUtil
 import androidx.camera.testing.LabTestRule
@@ -81,11 +84,18 @@
 @RunWith(Parameterized::class)
 @SdkSuppress(minSdkVersion = 21)
 class BindUnbindUseCasesStressTest(
-    private val cameraId: String
+    val implName: String,
+    val cameraConfig: CameraXConfig,
+    val cameraId: String
 ) {
     @get:Rule
+    val cameraPipeConfigTestRule = CameraPipeConfigTestRule(
+        active = implName == CameraPipeConfig::class.simpleName,
+    )
+
+    @get:Rule
     val useCamera = CameraUtil.grantCameraPermissionAndPreTest(
-        CameraUtil.PreTestCameraIdList(Camera2Config.defaultConfig())
+        CameraUtil.PreTestCameraIdList(cameraConfig)
     )
 
     @get:Rule
@@ -135,6 +145,8 @@
 
     @Before
     fun setUp(): Unit = runBlocking {
+        // Configures the test target config
+        ProcessCameraProvider.configureInstance(cameraConfig)
         cameraProvider = ProcessCameraProvider.getInstance(context)[10000, TimeUnit.MILLISECONDS]
 
         cameraIdCameraSelector = createCameraSelectorById(cameraId)
@@ -164,9 +176,8 @@
         @JvmField val stressTest = StressTestRule()
 
         @JvmStatic
-        @get:Parameterized.Parameters(name = "cameraId = {0}")
-        val parameters: Collection<String>
-            get() = CameraUtil.getBackwardCompatibleCameraIdListOrThrow()
+        @Parameterized.Parameters(name = "config = {0}, cameraId = {2}")
+        fun data() = StressTestUtil.getAllCameraXConfigCameraIdCombinations()
     }
 
     @LabTestRule.LabTestOnly
diff --git a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/OpenCloseCameraStressTest.kt b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/OpenCloseCameraStressTest.kt
index 52c6853..0fa1f88 100644
--- a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/OpenCloseCameraStressTest.kt
+++ b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/OpenCloseCameraStressTest.kt
@@ -17,17 +17,22 @@
 package androidx.camera.integration.core
 
 import android.content.Context
-import androidx.camera.camera2.Camera2Config
+import android.hardware.camera2.CameraDevice
+import androidx.camera.camera2.interop.Camera2Interop
+import androidx.camera.camera2.pipe.integration.CameraPipeConfig
+import androidx.camera.camera2.pipe.integration.interop.ExperimentalCamera2Interop
 import androidx.camera.core.Camera
 import androidx.camera.core.CameraSelector
-import androidx.camera.core.CameraState
+import androidx.camera.core.CameraXConfig
 import androidx.camera.core.ImageAnalysis
 import androidx.camera.core.ImageCapture
 import androidx.camera.core.Preview
+import androidx.camera.integration.core.util.StressTestUtil
 import androidx.camera.integration.core.util.StressTestUtil.STRESS_TEST_OPERATION_REPEAT_COUNT
 import androidx.camera.integration.core.util.StressTestUtil.STRESS_TEST_REPEAT_COUNT
 import androidx.camera.integration.core.util.StressTestUtil.createCameraSelectorById
 import androidx.camera.lifecycle.ProcessCameraProvider
+import androidx.camera.testing.CameraPipeConfigTestRule
 import androidx.camera.testing.CameraUtil
 import androidx.camera.testing.CameraUtil.PreTestCameraIdList
 import androidx.camera.testing.LabTestRule
@@ -36,7 +41,6 @@
 import androidx.camera.testing.fakes.FakeLifecycleOwner
 import androidx.camera.video.Recorder
 import androidx.camera.video.VideoCapture
-import androidx.lifecycle.Observer
 import androidx.test.core.app.ApplicationProvider
 import androidx.test.filters.LargeTest
 import androidx.test.filters.SdkSuppress
@@ -60,11 +64,18 @@
 @RunWith(Parameterized::class)
 @SdkSuppress(minSdkVersion = 21)
 class OpenCloseCameraStressTest(
-    private val cameraId: String
+    val implName: String,
+    val cameraConfig: CameraXConfig,
+    val cameraId: String
 ) {
     @get:Rule
+    val cameraPipeConfigTestRule = CameraPipeConfigTestRule(
+        active = implName == CameraPipeConfig::class.simpleName,
+    )
+
+    @get:Rule
     val useCamera = CameraUtil.grantCameraPermissionAndPreTest(
-        PreTestCameraIdList(Camera2Config.defaultConfig())
+        PreTestCameraIdList(cameraConfig)
     )
 
     @get:Rule
@@ -81,9 +92,14 @@
     private lateinit var preview: Preview
     private lateinit var imageCapture: ImageCapture
     private lateinit var lifecycleOwner: FakeLifecycleOwner
+    private val cameraDeviceStateMonitor = CameraDeviceStateMonitor()
 
     @Before
     fun setUp(): Unit = runBlocking {
+        // Skips CameraPipe part now and will open this when camera-pipe-integration can support
+        assumeTrue(implName != CameraPipeConfig::class.simpleName)
+        // Configures the test target config
+        ProcessCameraProvider.configureInstance(cameraConfig)
         cameraProvider = ProcessCameraProvider.getInstance(context)[10000, TimeUnit.MILLISECONDS]
 
         cameraIdCameraSelector = createCameraSelectorById(cameraId)
@@ -94,7 +110,7 @@
             cameraProvider.bindToLifecycle(lifecycleOwner, cameraIdCameraSelector)
         }
 
-        preview = Preview.Builder().build()
+        preview = createPreviewWithDeviceStateMonitor(implName, cameraDeviceStateMonitor)
         withContext(Dispatchers.Main) {
             preview.setSurfaceProvider(SurfaceTextureProvider.createSurfaceTextureProvider())
         }
@@ -116,16 +132,19 @@
         @JvmField val stressTest = StressTestRule()
 
         @JvmStatic
-        @get:Parameterized.Parameters(name = "cameraId = {0}")
-        val parameters: Collection<String>
-            get() = CameraUtil.getBackwardCompatibleCameraIdListOrThrow()
+        @Parameterized.Parameters(name = "config = {0}, cameraId = {2}")
+        fun data() = StressTestUtil.getAllCameraXConfigCameraIdCombinations()
     }
 
     @LabTestRule.LabTestOnly
     @Test
     @RepeatRule.Repeat(times = STRESS_TEST_REPEAT_COUNT)
     fun openCloseCameraStressTest_withPreviewImageCapture(): Unit = runBlocking {
-        bindUseCase_unbindAll_toCheckCameraState_repeatedly(preview, imageCapture)
+        bindUseCase_unbindAll_toCheckCameraState_repeatedly(
+            preview,
+            imageCapture,
+            cameraDeviceStateMonitor = cameraDeviceStateMonitor
+        )
     }
 
     @LabTestRule.LabTestOnly
@@ -137,7 +156,8 @@
         bindUseCase_unbindAll_toCheckCameraState_repeatedly(
             preview,
             imageCapture,
-            imageAnalysis = imageAnalysis
+            imageAnalysis = imageAnalysis,
+            cameraDeviceStateMonitor = cameraDeviceStateMonitor
         )
     }
 
@@ -146,7 +166,11 @@
     @RepeatRule.Repeat(times = STRESS_TEST_REPEAT_COUNT)
     fun openCloseCameraStressTest_withPreviewVideoCapture(): Unit = runBlocking {
         val videoCapture = VideoCapture.withOutput(Recorder.Builder().build())
-        bindUseCase_unbindAll_toCheckCameraState_repeatedly(preview, videoCapture = videoCapture)
+        bindUseCase_unbindAll_toCheckCameraState_repeatedly(
+            preview,
+            videoCapture = videoCapture,
+            cameraDeviceStateMonitor = cameraDeviceStateMonitor
+        )
     }
 
     @LabTestRule.LabTestOnly
@@ -158,7 +182,8 @@
         bindUseCase_unbindAll_toCheckCameraState_repeatedly(
             preview,
             videoCapture = videoCapture,
-            imageCapture = imageCapture
+            imageCapture = imageCapture,
+            cameraDeviceStateMonitor = cameraDeviceStateMonitor
         )
     }
 
@@ -172,7 +197,8 @@
         bindUseCase_unbindAll_toCheckCameraState_repeatedly(
             preview,
             videoCapture = videoCapture,
-            imageAnalysis = imageAnalysis
+            imageAnalysis = imageAnalysis,
+            cameraDeviceStateMonitor = cameraDeviceStateMonitor
         )
     }
 
@@ -188,23 +214,13 @@
         imageCapture: ImageCapture? = null,
         videoCapture: VideoCapture<Recorder>? = null,
         imageAnalysis: ImageAnalysis? = null,
+        cameraDeviceStateMonitor: CameraDeviceStateMonitor,
         repeatCount: Int = STRESS_TEST_OPERATION_REPEAT_COUNT
     ): Unit = runBlocking {
         for (i in 1..repeatCount) {
-            val openCameraLatch = CountDownLatch(1)
-            val closeCameraLatch = CountDownLatch(1)
-            val observer = Observer<CameraState> { state ->
-                if (state.type == CameraState.Type.OPEN) {
-                    openCameraLatch.countDown()
-                } else if (state.type == CameraState.Type.CLOSED) {
-                    closeCameraLatch.countDown()
-                }
-            }
+            cameraDeviceStateMonitor.reset()
 
             withContext(Dispatchers.Main) {
-                // Arrange: sets up CameraState observer
-                camera.cameraInfo.cameraState.observe(lifecycleOwner, observer)
-
                 // VideoCapture needs to be recreated everytime until b/212654991 is fixed
                 var newVideoCapture: VideoCapture<Recorder>? = null
                 videoCapture?.let {
@@ -224,21 +240,68 @@
                 )
             }
 
-            // Assert: checks the CameraState.Type.OPEN can be received
-            assertThat(openCameraLatch.await(3000, TimeUnit.MILLISECONDS)).isTrue()
+            // Assert: checks the CameraDevice opened event can be received
+            cameraDeviceStateMonitor.awaitCameraOpenedAndAssert()
 
             // Act: unbinds all use cases
             withContext(Dispatchers.Main) {
                 cameraProvider.unbindAll()
             }
 
-            // Assert: checks the CameraState.Type.CLOSED can be received
-            assertThat(closeCameraLatch.await(3000, TimeUnit.MILLISECONDS)).isTrue()
+            // Assert: checks the CameraDevice closed event can be received
+            cameraDeviceStateMonitor.awaitCameraClosedAndAssert()
+        }
+    }
 
-            // Clean it up.
-            withContext(Dispatchers.Main) {
-                camera.cameraInfo.cameraState.removeObserver(observer)
+    @OptIn(ExperimentalCamera2Interop::class)
+    private fun createPreviewWithDeviceStateMonitor(
+        implementationName: String,
+        cameraDeviceStateMonitor: CameraDeviceStateMonitor
+    ): Preview {
+        val builder = Preview.Builder()
+
+        when (implementationName) {
+            CameraPipeConfig::class.simpleName -> {
+                androidx.camera.camera2.pipe.integration.interop.Camera2Interop.Extender(builder)
+                    .setDeviceStateCallback(cameraDeviceStateMonitor)
             }
+            else -> Camera2Interop.Extender(builder)
+                .setDeviceStateCallback(cameraDeviceStateMonitor)
+        }
+
+        return builder.build()
+    }
+
+    private class CameraDeviceStateMonitor : CameraDevice.StateCallback() {
+        private var openCameraLatch = CountDownLatch(1)
+        private var closeCameraLatch = CountDownLatch(1)
+        override fun onOpened(p0: CameraDevice) {
+            openCameraLatch.countDown()
+        }
+
+        override fun onClosed(camera: CameraDevice) {
+            closeCameraLatch.countDown()
+        }
+
+        override fun onDisconnected(p0: CameraDevice) {
+            // No op.
+        }
+
+        override fun onError(p0: CameraDevice, p1: Int) {
+            // No op.
+        }
+
+        fun reset() {
+            openCameraLatch = CountDownLatch(1)
+            closeCameraLatch = CountDownLatch(1)
+        }
+
+        fun awaitCameraOpenedAndAssert() {
+            assertThat(openCameraLatch.await(3000, TimeUnit.MILLISECONDS)).isTrue()
+        }
+
+        fun awaitCameraClosedAndAssert() {
+            assertThat(closeCameraLatch.await(3000, TimeUnit.MILLISECONDS)).isTrue()
         }
     }
 }
diff --git a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/OpenCloseCaptureSessionStressTest.kt b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/OpenCloseCaptureSessionStressTest.kt
index a6dfbca..4a33164 100644
--- a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/OpenCloseCaptureSessionStressTest.kt
+++ b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/OpenCloseCaptureSessionStressTest.kt
@@ -17,20 +17,23 @@
 package androidx.camera.integration.core
 
 import android.content.Context
-import androidx.camera.camera2.Camera2Config
-import androidx.camera.camera2.impl.Camera2ImplConfig
-import androidx.camera.camera2.impl.CameraEventCallback
-import androidx.camera.camera2.impl.CameraEventCallbacks
+import android.hardware.camera2.CameraCaptureSession
+import android.hardware.camera2.CameraCaptureSession.StateCallback
+import androidx.camera.camera2.interop.Camera2Interop
+import androidx.camera.camera2.pipe.integration.CameraPipeConfig
+import androidx.camera.camera2.pipe.integration.interop.ExperimentalCamera2Interop
 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
-import androidx.camera.core.impl.CaptureConfig
+import androidx.camera.integration.core.util.StressTestUtil
 import androidx.camera.integration.core.util.StressTestUtil.STRESS_TEST_OPERATION_REPEAT_COUNT
 import androidx.camera.integration.core.util.StressTestUtil.STRESS_TEST_REPEAT_COUNT
 import androidx.camera.integration.core.util.StressTestUtil.createCameraSelectorById
 import androidx.camera.lifecycle.ProcessCameraProvider
+import androidx.camera.testing.CameraPipeConfigTestRule
 import androidx.camera.testing.CameraUtil
 import androidx.camera.testing.LabTestRule
 import androidx.camera.testing.StressTestRule
@@ -61,11 +64,18 @@
 @RunWith(Parameterized::class)
 @SdkSuppress(minSdkVersion = 21)
 class OpenCloseCaptureSessionStressTest(
-    private val cameraId: String
+    val implName: String,
+    val cameraConfig: CameraXConfig,
+    val cameraId: String
 ) {
     @get:Rule
+    val cameraPipeConfigTestRule = CameraPipeConfigTestRule(
+        active = implName == CameraPipeConfig::class.simpleName,
+    )
+
+    @get:Rule
     val useCamera = CameraUtil.grantCameraPermissionAndPreTest(
-        CameraUtil.PreTestCameraIdList(Camera2Config.defaultConfig())
+        CameraUtil.PreTestCameraIdList(cameraConfig)
     )
 
     @get:Rule
@@ -82,10 +92,14 @@
     private lateinit var preview: Preview
     private lateinit var imageCapture: ImageCapture
     private lateinit var lifecycleOwner: FakeLifecycleOwner
-    private val cameraEventMonitor = CameraEventMonitor()
+    private val sessionStateMonitor = CameraCaptureSessionStateMonitor()
 
     @Before
     fun setUp(): Unit = runBlocking {
+        // Skips CameraPipe part now and will open this when camera-pipe-integration can support
+        assumeTrue(implName != CameraPipeConfig::class.simpleName)
+        // Configures the test target config
+        ProcessCameraProvider.configureInstance(cameraConfig)
         cameraProvider = ProcessCameraProvider.getInstance(context)[10000, TimeUnit.MILLISECONDS]
 
         cameraIdCameraSelector = createCameraSelectorById(cameraId)
@@ -96,9 +110,10 @@
             cameraProvider.bindToLifecycle(lifecycleOwner, cameraIdCameraSelector)
         }
 
-        // Creates the Preview with the CameraEventMonitor to monitor whether the event callbacks
-        // are called.
-        preview = createPreviewWithCameraEventMonitor(cameraEventMonitor)
+        // Creates the Preview with the CameraCaptureSessionStateMonitor to monitor whether the
+        // event callbacks are called.
+        preview = createPreviewWithSessionStateMonitor(implName, sessionStateMonitor)
+
         withContext(Dispatchers.Main) {
             preview.setSurfaceProvider(SurfaceTextureProvider.createSurfaceTextureProvider())
         }
@@ -193,7 +208,7 @@
     ): Unit = runBlocking {
         for (i in 1..repeatCount) {
             // Arrange: resets the camera event monitor
-            cameraEventMonitor.reset()
+            sessionStateMonitor.reset()
 
             withContext(Dispatchers.Main) {
                 // VideoCapture needs to be recreated everytime until b/212654991 is fixed
@@ -215,16 +230,13 @@
                 )
             }
 
-            // Assert: checks the CameraEvent#onEnableSession callback function is called
-            cameraEventMonitor.awaitSessionEnabledAndAssert()
+            // Assert: checks the capture session opened callback function is called
+            sessionStateMonitor.awaitSessionConfiguredAndAssert()
 
             // Act: unbinds all use cases
             withContext(Dispatchers.Main) {
                 cameraProvider.unbindAll()
             }
-
-            // Assert: checks the CameraEvent#onSessionDisabled callback function is called
-            cameraEventMonitor.awaitSessionDisabledAndAssert()
         }
     }
 
@@ -233,51 +245,49 @@
         @JvmField val stressTest = StressTestRule()
 
         @JvmStatic
-        @get:Parameterized.Parameters(name = "cameraId = {0}")
-        val parameters: Collection<String>
-            get() = CameraUtil.getBackwardCompatibleCameraIdListOrThrow()
+        @Parameterized.Parameters(name = "config = {0}, cameraId = {2}")
+        fun data() = StressTestUtil.getAllCameraXConfigCameraIdCombinations()
     }
 
-    private fun createPreviewWithCameraEventMonitor(
-        cameraEventMonitor: CameraEventMonitor
+    @OptIn(ExperimentalCamera2Interop::class)
+    private fun createPreviewWithSessionStateMonitor(
+        implementationName: String,
+        sessionStateMonitor: CameraCaptureSessionStateMonitor
     ): Preview {
         val builder = Preview.Builder()
 
-        Camera2ImplConfig.Extender(builder)
-            .setCameraEventCallback(CameraEventCallbacks(cameraEventMonitor))
+        when (implementationName) {
+            CameraPipeConfig::class.simpleName -> {
+                androidx.camera.camera2.pipe.integration.interop.Camera2Interop.Extender(
+                    builder
+                ).setSessionStateCallback(sessionStateMonitor)
+            }
+            else -> Camera2Interop.Extender(builder).setSessionStateCallback(sessionStateMonitor)
+        }
 
         return builder.build()
     }
 
     /**
-     * An implementation of CameraEventCallback to monitor whether the camera event callbacks are
-     * called properly or not.
+     * An implementation of CameraCaptureSession.StateCallback to monitor whether the event
+     * callbacks are called properly or not.
      */
-    private class CameraEventMonitor : CameraEventCallback() {
-        private var sessionEnabledLatch = CountDownLatch(1)
-        private var sessionDisabledLatch = CountDownLatch(1)
-
-        override fun onEnableSession(): CaptureConfig? {
-            sessionEnabledLatch.countDown()
-            return null
+    private class CameraCaptureSessionStateMonitor : StateCallback() {
+        private var sessionConfiguredLatch = CountDownLatch(1)
+        override fun onConfigured(session: CameraCaptureSession) {
+            sessionConfiguredLatch.countDown()
         }
 
-        override fun onDisableSession(): CaptureConfig? {
-            sessionDisabledLatch.countDown()
-            return null
+        override fun onConfigureFailed(session: CameraCaptureSession) {
+            throw RuntimeException("Capture session configures failed!")
         }
 
         fun reset() {
-            sessionEnabledLatch = CountDownLatch(1)
-            sessionDisabledLatch = CountDownLatch(1)
+            sessionConfiguredLatch = CountDownLatch(1)
         }
 
-        fun awaitSessionEnabledAndAssert() {
-            assertThat(sessionEnabledLatch.await(15000, TimeUnit.MILLISECONDS)).isTrue()
-        }
-
-        fun awaitSessionDisabledAndAssert() {
-            assertThat(sessionDisabledLatch.await(15000, TimeUnit.MILLISECONDS)).isTrue()
+        fun awaitSessionConfiguredAndAssert() {
+            assertThat(sessionConfiguredLatch.await(15000, TimeUnit.MILLISECONDS)).isTrue()
         }
     }
 }
diff --git a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/ImageAnalysisLifecycleStatusChangeStressTest.kt b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/ImageAnalysisLifecycleStatusChangeStressTest.kt
index e37c5f1..c03d388 100644
--- a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/ImageAnalysisLifecycleStatusChangeStressTest.kt
+++ b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/ImageAnalysisLifecycleStatusChangeStressTest.kt
@@ -16,6 +16,7 @@
 
 package androidx.camera.integration.core.stresstest
 
+import androidx.camera.core.CameraXConfig
 import androidx.camera.integration.core.CameraXActivity.BIND_IMAGE_ANALYSIS
 import androidx.camera.integration.core.CameraXActivity.BIND_IMAGE_CAPTURE
 import androidx.camera.integration.core.CameraXActivity.BIND_PREVIEW
@@ -34,8 +35,11 @@
 @LargeTest
 @RunWith(Parameterized::class)
 @SdkSuppress(minSdkVersion = 21)
-class ImageAnalysisLifecycleStatusChangeStressTest constructor(cameraId: String) :
-    LifecycleStatusChangeStressTestBase(cameraId) {
+class ImageAnalysisLifecycleStatusChangeStressTest constructor(
+    implName: String,
+    cameraConfig: CameraXConfig,
+    cameraId: String
+) : LifecycleStatusChangeStressTestBase(implName, cameraConfig, cameraId) {
 
     @LabTestRule.LabTestOnly
     @Test
diff --git a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/ImageAnalysisSwitchCameraStressTest.kt b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/ImageAnalysisSwitchCameraStressTest.kt
index f0996e9..6d2ab58 100644
--- a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/ImageAnalysisSwitchCameraStressTest.kt
+++ b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/ImageAnalysisSwitchCameraStressTest.kt
@@ -16,6 +16,7 @@
 
 package androidx.camera.integration.core.stresstest
 
+import androidx.camera.core.CameraXConfig
 import androidx.camera.integration.core.CameraXActivity.BIND_IMAGE_ANALYSIS
 import androidx.camera.integration.core.CameraXActivity.BIND_IMAGE_CAPTURE
 import androidx.camera.integration.core.CameraXActivity.BIND_PREVIEW
@@ -34,8 +35,11 @@
 @LargeTest
 @RunWith(Parameterized::class)
 @SdkSuppress(minSdkVersion = 21)
-class ImageAnalysisSwitchCameraStressTest constructor(cameraId: String) :
-    SwitchCameraStressTestBase(cameraId) {
+class ImageAnalysisSwitchCameraStressTest constructor(
+    implName: String,
+    cameraConfig: CameraXConfig,
+    cameraId: String
+) : SwitchCameraStressTestBase(implName, cameraConfig, cameraId) {
 
     @LabTestRule.LabTestOnly
     @Test
diff --git a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/ImageCaptureLifecycleStatusChangeStressTest.kt b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/ImageCaptureLifecycleStatusChangeStressTest.kt
index 8e35e34..2682fa5 100644
--- a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/ImageCaptureLifecycleStatusChangeStressTest.kt
+++ b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/ImageCaptureLifecycleStatusChangeStressTest.kt
@@ -16,6 +16,7 @@
 
 package androidx.camera.integration.core.stresstest
 
+import androidx.camera.core.CameraXConfig
 import androidx.camera.integration.core.CameraXActivity.BIND_IMAGE_ANALYSIS
 import androidx.camera.integration.core.CameraXActivity.BIND_IMAGE_CAPTURE
 import androidx.camera.integration.core.CameraXActivity.BIND_PREVIEW
@@ -34,8 +35,11 @@
 @LargeTest
 @RunWith(Parameterized::class)
 @SdkSuppress(minSdkVersion = 21)
-class ImageCaptureLifecycleStatusChangeStressTest constructor(cameraId: String) :
-    LifecycleStatusChangeStressTestBase(cameraId) {
+class ImageCaptureLifecycleStatusChangeStressTest constructor(
+    implName: String,
+    cameraConfig: CameraXConfig,
+    cameraId: String
+) : LifecycleStatusChangeStressTestBase(implName, cameraConfig, cameraId) {
 
     @LabTestRule.LabTestOnly
     @Test
diff --git a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/ImageCaptureStressTest.kt b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/ImageCaptureStressTest.kt
index befb664..a447c7f 100644
--- a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/ImageCaptureStressTest.kt
+++ b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/ImageCaptureStressTest.kt
@@ -18,7 +18,8 @@
 
 import android.Manifest
 import android.content.Context
-import androidx.camera.camera2.Camera2Config
+import androidx.camera.camera2.pipe.integration.CameraPipeConfig
+import androidx.camera.core.CameraXConfig
 import androidx.camera.integration.core.CameraXActivity.BIND_IMAGE_CAPTURE
 import androidx.camera.integration.core.CameraXActivity.BIND_PREVIEW
 import androidx.camera.integration.core.takePictureAndWaitForImageSavedIdle
@@ -28,6 +29,7 @@
 import androidx.camera.integration.core.util.StressTestUtil.launchCameraXActivityAndWaitForPreviewReady
 import androidx.camera.integration.core.waitForViewfinderIdle
 import androidx.camera.lifecycle.ProcessCameraProvider
+import androidx.camera.testing.CameraPipeConfigTestRule
 import androidx.camera.testing.CameraUtil
 import androidx.camera.testing.CoreAppTestUtil
 import androidx.camera.testing.LabTestRule
@@ -58,12 +60,21 @@
 @LargeTest
 @RunWith(Parameterized::class)
 @SdkSuppress(minSdkVersion = 21)
-class ImageCaptureStressTest(val cameraId: String) {
+class ImageCaptureStressTest(
+    val implName: String,
+    val cameraConfig: CameraXConfig,
+    val cameraId: String
+) {
     private val device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
 
     @get:Rule
+    val cameraPipeConfigTestRule = CameraPipeConfigTestRule(
+        active = implName == CameraPipeConfig::class.simpleName,
+    )
+
+    @get:Rule
     val useCamera = CameraUtil.grantCameraPermissionAndPreTest(
-        CameraUtil.PreTestCameraIdList(Camera2Config.defaultConfig())
+        CameraUtil.PreTestCameraIdList(cameraConfig)
     )
 
     @get:Rule
@@ -78,15 +89,17 @@
     @get:Rule
     val repeatRule = RepeatRule()
 
+    private val context = ApplicationProvider.getApplicationContext<Context>()
+    private lateinit var cameraProvider: ProcessCameraProvider
+
     companion object {
         @ClassRule
         @JvmField
         val stressTest = StressTestRule()
 
         @JvmStatic
-        @get:Parameterized.Parameters(name = "cameraId = {0}")
-        val parameters: Collection<String>
-            get() = CameraUtil.getBackwardCompatibleCameraIdListOrThrow()
+        @Parameterized.Parameters(name = "config = {0}, cameraId = {2}")
+        fun data() = StressTestUtil.getAllCameraXConfigCameraIdCombinations()
     }
 
     @Before
@@ -94,6 +107,17 @@
         Assume.assumeTrue(CameraUtil.deviceHasCamera())
         CoreAppTestUtil.assumeCompatibleDevice()
         CoreAppTestUtil.assumeNotUntestableFrontCamera(cameraId)
+
+        // For running the ImageCaptureStressTest, we need to get the target test camera to check
+        // whether the testing use case combination can be supported to skip unsupported cases. For
+        // the purpose, we force configure the target testing config first
+        // (Camera2Config/CameraPipeConfig) and gets the CameraProvider instance in the setup()
+        // function. Then, the activity launched afterward will also run on the same config
+        // environment. The setup config environment will be cleared after
+        // CameraProvider#shutdown() is called in the tearDown() function.
+        ProcessCameraProvider.configureInstance(cameraConfig)
+        cameraProvider = ProcessCameraProvider.getInstance(context)[10000, TimeUnit.MILLISECONDS]
+
         // Clear the device UI and check if there is no dialog or lock screen on the top of the
         // window before start the test.
         CoreAppTestUtil.prepareDeviceUI(InstrumentationRegistry.getInstrumentation())
@@ -106,17 +130,17 @@
 
     @After
     fun tearDown(): Unit = runBlocking {
+        if (::cameraProvider.isInitialized) {
+            withContext(Dispatchers.Main) {
+                cameraProvider.shutdown()[10000, TimeUnit.MILLISECONDS]
+            }
+        }
+
         // Unfreeze rotation so the device can choose the orientation via its own policy. Be nice
         // to other tests :)
         device.unfreezeRotation()
         device.pressHome()
         device.waitForIdle(StressTestUtil.HOME_TIMEOUT_MS)
-
-        withContext(Dispatchers.Main) {
-            val context = ApplicationProvider.getApplicationContext<Context>()
-            val cameraProvider = ProcessCameraProvider.getInstance(context)[10, TimeUnit.SECONDS]
-            cameraProvider.shutdown()[10, TimeUnit.SECONDS]
-        }
     }
 
     @LabTestRule.LabTestOnly
diff --git a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/ImageCaptureSwitchCameraStressTest.kt b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/ImageCaptureSwitchCameraStressTest.kt
index c446e77..0837894 100644
--- a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/ImageCaptureSwitchCameraStressTest.kt
+++ b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/ImageCaptureSwitchCameraStressTest.kt
@@ -16,6 +16,7 @@
 
 package androidx.camera.integration.core.stresstest
 
+import androidx.camera.core.CameraXConfig
 import androidx.camera.integration.core.CameraXActivity.BIND_IMAGE_ANALYSIS
 import androidx.camera.integration.core.CameraXActivity.BIND_IMAGE_CAPTURE
 import androidx.camera.integration.core.CameraXActivity.BIND_PREVIEW
@@ -34,9 +35,11 @@
 @LargeTest
 @RunWith(Parameterized::class)
 @SdkSuppress(minSdkVersion = 21)
-class ImageCaptureSwitchCameraStressTest constructor(cameraId: String) :
-    SwitchCameraStressTestBase(cameraId) {
-
+class ImageCaptureSwitchCameraStressTest constructor(
+    implName: String,
+    cameraConfig: CameraXConfig,
+    cameraId: String
+) : SwitchCameraStressTestBase(implName, cameraConfig, cameraId) {
     @LabTestRule.LabTestOnly
     @Test
     @RepeatRule.Repeat(times = LARGE_STRESS_TEST_REPEAT_COUNT)
diff --git a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/LifecycleStatusChangeStressTestBase.kt b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/LifecycleStatusChangeStressTestBase.kt
index cfc9c26..3c59a34 100644
--- a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/LifecycleStatusChangeStressTestBase.kt
+++ b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/LifecycleStatusChangeStressTestBase.kt
@@ -18,9 +18,10 @@
 
 import android.Manifest
 import android.content.Context
-import androidx.camera.camera2.Camera2Config
+import androidx.camera.camera2.pipe.integration.CameraPipeConfig
 import androidx.camera.core.Camera
 import androidx.camera.core.CameraSelector
+import androidx.camera.core.CameraXConfig
 import androidx.camera.integration.core.recordVideoAndWaitForVideoSavedIdle
 import androidx.camera.integration.core.takePictureAndWaitForImageSavedIdle
 import androidx.camera.integration.core.util.StressTestUtil.HOME_TIMEOUT_MS
@@ -30,10 +31,12 @@
 import androidx.camera.integration.core.util.StressTestUtil.VERIFICATION_TARGET_PREVIEW
 import androidx.camera.integration.core.util.StressTestUtil.VERIFICATION_TARGET_VIDEO_CAPTURE
 import androidx.camera.integration.core.util.StressTestUtil.createCameraSelectorById
+import androidx.camera.integration.core.util.StressTestUtil.getAllCameraXConfigCameraIdCombinations
 import androidx.camera.integration.core.util.StressTestUtil.launchCameraXActivityAndWaitForPreviewReady
 import androidx.camera.integration.core.waitForImageAnalysisIdle
 import androidx.camera.integration.core.waitForViewfinderIdle
 import androidx.camera.lifecycle.ProcessCameraProvider
+import androidx.camera.testing.CameraPipeConfigTestRule
 import androidx.camera.testing.CameraUtil
 import androidx.camera.testing.CoreAppTestUtil
 import androidx.camera.testing.LabTestRule
@@ -57,13 +60,20 @@
 import org.junit.runners.Parameterized
 
 abstract class LifecycleStatusChangeStressTestBase(
+    val implName: String,
+    val cameraConfig: CameraXConfig,
     val cameraId: String
 ) {
     private val device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
 
     @get:Rule
+    val cameraPipeConfigTestRule = CameraPipeConfigTestRule(
+        active = implName == CameraPipeConfig::class.simpleName,
+    )
+
+    @get:Rule
     val useCamera = CameraUtil.grantCameraPermissionAndPreTest(
-        CameraUtil.PreTestCameraIdList(Camera2Config.defaultConfig())
+        CameraUtil.PreTestCameraIdList(cameraConfig)
     )
 
     @get:Rule
@@ -90,9 +100,8 @@
         @JvmField val stressTest = StressTestRule()
 
         @JvmStatic
-        @get:Parameterized.Parameters(name = "cameraId = {0}")
-        val parameters: Collection<String>
-            get() = CameraUtil.getBackwardCompatibleCameraIdListOrThrow()
+        @Parameterized.Parameters(name = "config = {0}, cameraId = {2}")
+        fun data() = getAllCameraXConfigCameraIdCombinations()
     }
 
     @Before
@@ -109,6 +118,15 @@
         // explicitly initiated from within the test.
         device.setOrientationNatural()
 
+        // For running the LifecycleStatusChangeStressTest, we need to get the target test camera
+        // to check whether the testing use case combination can be supported to skip unsupported
+        // cases. For the purpose, we force configure the target testing config first
+        // (Camera2Config/CameraPipeConfig) and gets the CameraProvider instance in the setup()
+        // function. Then, the activity launched afterward will also run on the same config
+        // environment. The setup config environment will be cleared after
+        // CameraProvider#shutdown() is called in the tearDown() function.
+        ProcessCameraProvider.configureInstance(cameraConfig)
+
         cameraProvider = ProcessCameraProvider.getInstance(context)[10000, TimeUnit.MILLISECONDS]
 
         cameraIdCameraSelector = createCameraSelectorById(cameraId)
diff --git a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/PreviewLifecycleStatusChangeStressTest.kt b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/PreviewLifecycleStatusChangeStressTest.kt
index 04e4fe4..464e84d 100644
--- a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/PreviewLifecycleStatusChangeStressTest.kt
+++ b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/PreviewLifecycleStatusChangeStressTest.kt
@@ -16,6 +16,7 @@
 
 package androidx.camera.integration.core.stresstest
 
+import androidx.camera.core.CameraXConfig
 import androidx.camera.integration.core.CameraXActivity.BIND_IMAGE_ANALYSIS
 import androidx.camera.integration.core.CameraXActivity.BIND_IMAGE_CAPTURE
 import androidx.camera.integration.core.CameraXActivity.BIND_PREVIEW
@@ -34,8 +35,11 @@
 @LargeTest
 @RunWith(Parameterized::class)
 @SdkSuppress(minSdkVersion = 21)
-class PreviewLifecycleStatusChangeStressTest constructor(cameraId: String) :
-    LifecycleStatusChangeStressTestBase(cameraId) {
+class PreviewLifecycleStatusChangeStressTest constructor(
+    implName: String,
+    cameraConfig: CameraXConfig,
+    cameraId: String
+) : LifecycleStatusChangeStressTestBase(implName, cameraConfig, cameraId) {
 
     @LabTestRule.LabTestOnly
     @Test
diff --git a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/PreviewSwitchCameraStressTest.kt b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/PreviewSwitchCameraStressTest.kt
index ee61902..30fc762 100644
--- a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/PreviewSwitchCameraStressTest.kt
+++ b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/PreviewSwitchCameraStressTest.kt
@@ -16,6 +16,7 @@
 
 package androidx.camera.integration.core.stresstest
 
+import androidx.camera.core.CameraXConfig
 import androidx.camera.integration.core.CameraXActivity.BIND_IMAGE_ANALYSIS
 import androidx.camera.integration.core.CameraXActivity.BIND_IMAGE_CAPTURE
 import androidx.camera.integration.core.CameraXActivity.BIND_PREVIEW
@@ -33,8 +34,11 @@
 @LargeTest
 @RunWith(Parameterized::class)
 @SdkSuppress(minSdkVersion = 21)
-class PreviewSwitchCameraStressTest constructor(cameraId: String) :
-    SwitchCameraStressTestBase(cameraId) {
+class PreviewSwitchCameraStressTest constructor(
+    implName: String,
+    cameraConfig: CameraXConfig,
+    cameraId: String
+) : SwitchCameraStressTestBase(implName, cameraConfig, cameraId) {
 
     @LabTestRule.LabTestOnly
     @Test
diff --git a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/SwitchCameraStressTestBase.kt b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/SwitchCameraStressTestBase.kt
index bbb9455..f710cab8 100644
--- a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/SwitchCameraStressTestBase.kt
+++ b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/SwitchCameraStressTestBase.kt
@@ -19,13 +19,15 @@
 import android.Manifest
 import android.content.Context
 import android.hardware.camera2.CameraCharacteristics
-import androidx.camera.camera2.Camera2Config
-import androidx.camera.camera2.interop.Camera2CameraInfo
+import androidx.camera.camera2.pipe.integration.CameraPipeConfig
 import androidx.camera.core.Camera
 import androidx.camera.core.CameraSelector
+import androidx.camera.core.CameraXConfig
+import androidx.camera.core.impl.CameraInfoInternal
 import androidx.camera.integration.core.recordVideoAndWaitForVideoSavedIdle
 import androidx.camera.integration.core.switchCameraAndWaitForViewfinderIdle
 import androidx.camera.integration.core.takePictureAndWaitForImageSavedIdle
+import androidx.camera.integration.core.util.StressTestUtil
 import androidx.camera.integration.core.util.StressTestUtil.HOME_TIMEOUT_MS
 import androidx.camera.integration.core.util.StressTestUtil.STRESS_TEST_OPERATION_REPEAT_COUNT
 import androidx.camera.integration.core.util.StressTestUtil.VERIFICATION_TARGET_IMAGE_ANALYSIS
@@ -38,6 +40,7 @@
 import androidx.camera.integration.core.waitForImageAnalysisIdle
 import androidx.camera.integration.core.waitForViewfinderIdle
 import androidx.camera.lifecycle.ProcessCameraProvider
+import androidx.camera.testing.CameraPipeConfigTestRule
 import androidx.camera.testing.CameraUtil
 import androidx.camera.testing.CoreAppTestUtil
 import androidx.camera.testing.LabTestRule
@@ -60,13 +63,20 @@
 import org.junit.runners.Parameterized
 
 abstract class SwitchCameraStressTestBase(
+    val implName: String,
+    val cameraConfig: CameraXConfig,
     val cameraId: String
 ) {
     private val device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
 
     @get:Rule
+    val cameraPipeConfigTestRule = CameraPipeConfigTestRule(
+        active = implName == CameraPipeConfig::class.simpleName,
+    )
+
+    @get:Rule
     val useCamera = CameraUtil.grantCameraPermissionAndPreTest(
-        CameraUtil.PreTestCameraIdList(Camera2Config.defaultConfig())
+        CameraUtil.PreTestCameraIdList(cameraConfig)
     )
 
     @get:Rule
@@ -93,9 +103,8 @@
         @JvmField val stressTest = StressTestRule()
 
         @JvmStatic
-        @get:Parameterized.Parameters(name = "cameraId = {0}")
-        val parameters: Collection<String>
-            get() = CameraUtil.getBackwardCompatibleCameraIdListOrThrow()
+        @Parameterized.Parameters(name = "config = {0}, cameraId = {2}")
+        fun data() = StressTestUtil.getAllCameraXConfigCameraIdCombinations()
     }
 
     @Before
@@ -112,6 +121,15 @@
         // explicitly initiated from within the test.
         device.setOrientationNatural()
 
+        // For running the LifecycleStatusChangeStressTest, we need to get the target test camera
+        // to check whether the testing use case combination can be supported to skip unsupported
+        // cases. For the purpose, we force configure the target testing config first
+        // (Camera2Config/CameraPipeConfig) and gets the CameraProvider instance in the setup()
+        // function. Then, the activity launched afterward will also run on the same config
+        // environment. The setup config environment will be cleared after
+        // CameraProvider#shutdown() is called in the tearDown() function.
+        ProcessCameraProvider.configureInstance(cameraConfig)
+
         cameraProvider = ProcessCameraProvider.getInstance(context)[10000, TimeUnit.MILLISECONDS]
 
         cameraIdCameraSelector = createCameraSelectorById(cameraId)
@@ -233,9 +251,7 @@
         // Checks whether the input camera can support the use case combination
         assumeCameraSupportUseCaseCombination(camera, useCaseCombination)
 
-        val camera2CameraInfo = Camera2CameraInfo.from(camera.cameraInfo)
-        val lensFacing =
-            camera2CameraInfo.getCameraCharacteristic(CameraCharacteristics.LENS_FACING)
+        val lensFacing = (camera.cameraInfo as CameraInfoInternal).lensFacing
 
         val otherLensFacingCameraSelector =
             if (lensFacing == CameraCharacteristics.LENS_FACING_BACK) {
diff --git a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/VideoCaptureLifecycleStatusChangeStressTest.kt b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/VideoCaptureLifecycleStatusChangeStressTest.kt
index cd215e3..13defec 100644
--- a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/VideoCaptureLifecycleStatusChangeStressTest.kt
+++ b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/VideoCaptureLifecycleStatusChangeStressTest.kt
@@ -16,6 +16,7 @@
 
 package androidx.camera.integration.core.stresstest
 
+import androidx.camera.core.CameraXConfig
 import androidx.camera.integration.core.CameraXActivity.BIND_IMAGE_ANALYSIS
 import androidx.camera.integration.core.CameraXActivity.BIND_IMAGE_CAPTURE
 import androidx.camera.integration.core.CameraXActivity.BIND_PREVIEW
@@ -34,8 +35,11 @@
 @LargeTest
 @RunWith(Parameterized::class)
 @SdkSuppress(minSdkVersion = 21)
-class VideoCaptureLifecycleStatusChangeStressTest constructor(cameraId: String) :
-    LifecycleStatusChangeStressTestBase(cameraId) {
+class VideoCaptureLifecycleStatusChangeStressTest constructor(
+    implName: String,
+    cameraConfig: CameraXConfig,
+    cameraId: String
+) : LifecycleStatusChangeStressTestBase(implName, cameraConfig, cameraId) {
 
     @LabTestRule.LabTestOnly
     @Test
diff --git a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/VideoCaptureSwitchCameraStressTest.kt b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/VideoCaptureSwitchCameraStressTest.kt
index 39e7011..7d8630d 100644
--- a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/VideoCaptureSwitchCameraStressTest.kt
+++ b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/stresstest/VideoCaptureSwitchCameraStressTest.kt
@@ -16,6 +16,7 @@
 
 package androidx.camera.integration.core.stresstest
 
+import androidx.camera.core.CameraXConfig
 import androidx.camera.integration.core.CameraXActivity.BIND_IMAGE_ANALYSIS
 import androidx.camera.integration.core.CameraXActivity.BIND_IMAGE_CAPTURE
 import androidx.camera.integration.core.CameraXActivity.BIND_PREVIEW
@@ -33,8 +34,11 @@
 @LargeTest
 @RunWith(Parameterized::class)
 @SdkSuppress(minSdkVersion = 21)
-class VideoCaptureSwitchCameraStressTest constructor(cameraId: String) :
-    SwitchCameraStressTestBase(cameraId) {
+class VideoCaptureSwitchCameraStressTest constructor(
+    implName: String,
+    cameraConfig: CameraXConfig,
+    cameraId: String
+) : SwitchCameraStressTestBase(implName, cameraConfig, cameraId) {
 
     @LabTestRule.LabTestOnly
     @Test
diff --git a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/util/StressTestUtil.kt b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/util/StressTestUtil.kt
index da6f867..857db58 100644
--- a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/util/StressTestUtil.kt
+++ b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/util/StressTestUtil.kt
@@ -18,9 +18,8 @@
 
 import android.content.Context
 import android.content.Intent
-import androidx.annotation.OptIn
-import androidx.camera.camera2.interop.Camera2CameraInfo
-import androidx.camera.camera2.interop.ExperimentalCamera2Interop
+import androidx.camera.camera2.Camera2Config
+import androidx.camera.camera2.pipe.integration.CameraPipeConfig
 import androidx.camera.core.Camera
 import androidx.camera.core.CameraFilter
 import androidx.camera.core.CameraInfo
@@ -28,6 +27,7 @@
 import androidx.camera.core.ImageAnalysis
 import androidx.camera.core.ImageCapture
 import androidx.camera.core.Preview
+import androidx.camera.core.impl.CameraInfoInternal
 import androidx.camera.integration.core.CameraXActivity
 import androidx.camera.integration.core.CameraXActivity.BIND_IMAGE_ANALYSIS
 import androidx.camera.integration.core.CameraXActivity.BIND_IMAGE_CAPTURE
@@ -36,6 +36,7 @@
 import androidx.camera.integration.core.CameraXActivity.INTENT_EXTRA_CAMERA_ID
 import androidx.camera.integration.core.CameraXActivity.INTENT_EXTRA_USE_CASE_COMBINATION
 import androidx.camera.integration.core.waitForViewfinderIdle
+import androidx.camera.testing.CameraUtil
 import androidx.camera.video.Recorder
 import androidx.camera.video.VideoCapture
 import androidx.test.core.app.ActivityScenario
@@ -80,9 +81,7 @@
 
         activityScenario.onActivity {
             // Checks that the camera id is correct
-            val camera2CameraInfo = Camera2CameraInfo.from(it.camera!!.cameraInfo)
-
-            if (camera2CameraInfo.cameraId != cameraId) {
+            if ((it.camera!!.cameraInfo as CameraInfoInternal).cameraId != cameraId) {
                 it.finish()
                 throw IllegalArgumentException("The activity is not launched with the correct" +
                     " camera of expected id.")
@@ -131,11 +130,10 @@
     }
 
     @JvmStatic
-    @OptIn(ExperimentalCamera2Interop::class)
     fun createCameraSelectorById(cameraId: String) =
         CameraSelector.Builder().addCameraFilter(CameraFilter { cameraInfos ->
             cameraInfos.forEach {
-                if (Camera2CameraInfo.from(it).cameraId.equals(cameraId)) {
+                if ((it as CameraInfoInternal).cameraId == cameraId) {
                     return@CameraFilter listOf<CameraInfo>(it)
                 }
             }
@@ -143,6 +141,30 @@
             throw IllegalArgumentException("No camera can be find for id: $cameraId")
         }).build()
 
+    @JvmStatic
+    fun getAllCameraXConfigCameraIdCombinations() = mutableListOf<Array<Any?>>().apply {
+        val cameraxConfigs =
+            listOf(Camera2Config::class.simpleName, CameraPipeConfig::class.simpleName)
+
+        cameraxConfigs.forEach { configImplName ->
+            CameraUtil.getBackwardCompatibleCameraIdListOrThrow().forEach { cameraId ->
+                add(
+                    arrayOf(
+                        configImplName,
+                        when (configImplName) {
+                            CameraPipeConfig::class.simpleName ->
+                                CameraPipeConfig.defaultConfig()
+                            Camera2Config::class.simpleName ->
+                                Camera2Config.defaultConfig()
+                            else -> Camera2Config.defaultConfig()
+                        },
+                        cameraId
+                    )
+                )
+            }
+        }
+    }
+
     /**
      * Large stress test repeat count to run the test
      */
diff --git a/camera/integration-tests/coretestapp/src/main/java/androidx/camera/integration/core/CameraXActivity.java b/camera/integration-tests/coretestapp/src/main/java/androidx/camera/integration/core/CameraXActivity.java
index 24257c5..0d374a3 100644
--- a/camera/integration-tests/coretestapp/src/main/java/androidx/camera/integration/core/CameraXActivity.java
+++ b/camera/integration-tests/coretestapp/src/main/java/androidx/camera/integration/core/CameraXActivity.java
@@ -1276,7 +1276,6 @@
      *
      * @param calledBySelf flag indicates if this is a recursive call.
      */
-    @OptIn(markerClass = ExperimentalCamera2Interop.class)
     void tryBindUseCases(boolean calledBySelf) {
         boolean isViewFinderReady = mViewFinder.getWidth() != 0 && mViewFinder.getHeight() != 0;
         boolean isCameraReady = mCameraProvider != null;
@@ -1312,10 +1311,7 @@
             // camera id.
             if (mCurrentCameraSelector == mLaunchingCameraIdSelector
                     && mLaunchingCameraLensFacing == UNKNOWN_LENS_FACING) {
-                Camera2CameraInfo camera2CameraInfo =
-                        Camera2CameraInfo.from(mCamera.getCameraInfo());
-                mLaunchingCameraLensFacing = camera2CameraInfo.getCameraCharacteristic(
-                        CameraCharacteristics.LENS_FACING);
+                mLaunchingCameraLensFacing = getLensFacing(mCamera.getCameraInfo());
             }
             List<UseCase> useCases = buildUseCases();
             mCamera = bindToLifecycleSafely(useCases);
@@ -1989,10 +1985,9 @@
         return new CameraSelector.Builder().addCameraFilter(new CameraFilter() {
             @NonNull
             @Override
-            @OptIn(markerClass = ExperimentalCamera2Interop.class)
             public List<CameraInfo> filter(@NonNull List<CameraInfo> cameraInfos) {
                 for (CameraInfo cameraInfo : cameraInfos) {
-                    if (cameraId.equals(Camera2CameraInfo.from(cameraInfo).getCameraId())) {
+                    if (Objects.equals(cameraId, getCameraId(cameraInfo))) {
                         return Collections.singletonList(cameraInfo);
                     }
                 }
@@ -2001,4 +1996,53 @@
             }
         }).build();
     }
+
+    private static int getLensFacing(@NonNull CameraInfo cameraInfo) {
+        try {
+            return getCamera2LensFacing(cameraInfo);
+        } catch (IllegalArgumentException e) {
+            return getCamera2PipeLensFacing(cameraInfo);
+        }
+    }
+
+    @OptIn(markerClass = ExperimentalCamera2Interop.class)
+    private static int getCamera2LensFacing(@NonNull CameraInfo cameraInfo) {
+        Integer lensFacing = Camera2CameraInfo.from(cameraInfo).getCameraCharacteristic(
+                    CameraCharacteristics.LENS_FACING);
+
+        return lensFacing == null ? CameraCharacteristics.LENS_FACING_BACK : lensFacing;
+    }
+
+    @OptIn(markerClass =
+            androidx.camera.camera2.pipe.integration.interop.ExperimentalCamera2Interop.class)
+    private static int getCamera2PipeLensFacing(@NonNull CameraInfo cameraInfo) {
+        Integer lensFacing =
+                androidx.camera.camera2.pipe.integration.interop.Camera2CameraInfo.from(
+                        cameraInfo).getCameraCharacteristic(CameraCharacteristics.LENS_FACING);
+
+        return lensFacing == null ? CameraCharacteristics.LENS_FACING_BACK : lensFacing;
+    }
+
+    @NonNull
+    private static String getCameraId(@NonNull CameraInfo cameraInfo) {
+        try {
+            return getCamera2CameraId(cameraInfo);
+        } catch (IllegalArgumentException e) {
+            return getCameraPipeCameraId(cameraInfo);
+        }
+    }
+
+    @OptIn(markerClass = ExperimentalCamera2Interop.class)
+    @NonNull
+    private static String getCamera2CameraId(@NonNull CameraInfo cameraInfo) {
+        return Camera2CameraInfo.from(cameraInfo).getCameraId();
+    }
+
+    @OptIn(markerClass =
+            androidx.camera.camera2.pipe.integration.interop.ExperimentalCamera2Interop.class)
+    @NonNull
+    private static String getCameraPipeCameraId(@NonNull CameraInfo cameraInfo) {
+        return androidx.camera.camera2.pipe.integration.interop.Camera2CameraInfo.from(
+                cameraInfo).getCameraId();
+    }
 }