|
| 1 | +// SPDX-License-Identifier: BUSL-1.1; Copyright (c) 2025 Social Connect Labs, Inc.; Licensed under BUSL-1.1 (see LICENSE); Apache-2.0 from 2029-06-11 |
| 2 | + |
| 3 | +package com.proofofpassportapp |
| 4 | + |
| 5 | +import android.app.Application |
| 6 | +import android.content.Context |
| 7 | +import android.content.ContextWrapper |
| 8 | +import androidx.test.core.app.ApplicationProvider |
| 9 | +import com.facebook.react.ReactNativeHost |
| 10 | +import org.junit.Assert.assertTrue |
| 11 | +import org.junit.Test |
| 12 | +import org.junit.runner.RunWith |
| 13 | +import org.robolectric.RobolectricTestRunner |
| 14 | +import org.robolectric.annotation.Config |
| 15 | + |
| 16 | +// Uses a plain Application so Robolectric skips MainApplication.onCreate, |
| 17 | +// which loads native libraries unavailable on the JVM. |
| 18 | +@RunWith(RobolectricTestRunner::class) |
| 19 | +@Config(application = Application::class, sdk = [35]) |
| 20 | +class MainApplicationTest { |
| 21 | + |
| 22 | + // Regression test: an unqualified `packages` reference inside the anonymous |
| 23 | + // DefaultReactNativeHost resolved to the host's own getPackages() instead of |
| 24 | + // MainApplication's property, recursing until StackOverflowError. Only |
| 25 | + // old-arch callers (e.g. BlobProvider) hit getPackages(), so startup testing |
| 26 | + // never caught it. |
| 27 | + @Test |
| 28 | + fun getPackagesReturnsWithoutInfiniteRecursion() { |
| 29 | + val app = MainApplication() |
| 30 | + val attach = |
| 31 | + ContextWrapper::class.java.getDeclaredMethod("attachBaseContext", Context::class.java) |
| 32 | + attach.isAccessible = true |
| 33 | + attach.invoke(app, ApplicationProvider.getApplicationContext<Application>()) |
| 34 | + |
| 35 | + val getPackages = ReactNativeHost::class.java.getDeclaredMethod("getPackages") |
| 36 | + getPackages.isAccessible = true |
| 37 | + val packages = getPackages.invoke(app.reactNativeHost) as List<*> |
| 38 | + |
| 39 | + assertTrue(packages.any { it is CameraActivityPackage }) |
| 40 | + assertTrue(packages.any { it is QRCodeScannerPackage }) |
| 41 | + assertTrue(packages.any { it is BackupPackage }) |
| 42 | + } |
| 43 | +} |
0 commit comments