Skip to content

Commit

Permalink
Add more test cases in Protected Mode Manager unit test
Browse files Browse the repository at this point in the history
Summary: as title

Differential Revision: D47075155

fbshipit-source-id: 7796db601deecbf64a41ea0f6655be9675b6c7ad
  • Loading branch information
Xinzhu Cai authored and facebook-github-bot committed Jul 7, 2023
1 parent 97e5441 commit d58d113
Showing 1 changed file with 116 additions and 18 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -11,33 +11,75 @@ package com.facebook.appevents.integrity
import android.os.Bundle
import com.facebook.FacebookPowerMockTestCase
import com.facebook.FacebookSdk
import com.facebook.appevents.ml.ModelManager
import com.facebook.internal.FetchedAppGateKeepersManager
import org.assertj.core.api.Assertions.assertThat
import com.facebook.internal.*
import org.junit.Assert.assertTrue
import org.json.JSONArray
import org.junit.After
import org.junit.Before
import org.junit.Test
import org.mockito.kotlin.mock
import org.mockito.Mock
import org.mockito.kotlin.whenever
import org.powermock.api.mockito.PowerMockito
import org.powermock.core.classloader.annotations.PrepareForTest

@PrepareForTest(ModelManager::class, FacebookSdk::class, FetchedAppGateKeepersManager::class)
@PrepareForTest(ProtectedModeManager::class, FacebookSdk::class, FetchedAppSettingsManager::class)
class ProtectedModeManagerTest : FacebookPowerMockTestCase() {

@Mock
private lateinit var mockFacebookRequestErrorClassification: FacebookRequestErrorClassification
private lateinit var mockStandardParamsFromServer: JSONArray
private val mockAppID = "123"
private val emptyJSONArray = JSONArray()


@Before
override fun setup() {
super.setup()
PowerMockito.mockStatic(FacebookSdk::class.java)
whenever(FacebookSdk.getApplicationId()).thenReturn("123")
whenever(FacebookSdk.getApplicationId()).thenReturn(mockAppID)

mockStandardParamsFromServer = JSONArray()
mockStandardParamsFromServer.put("standard_param_from_server_1")
mockStandardParamsFromServer.put("standard_param_from_server_2")
}

@After
fun tearDown() {
ProtectedModeManager.disable()
}

fun initMockFetchedAppSettings(mockStandardParams:JSONArray?) {
val mockFetchedAppSettings = FetchedAppSettings(
false,
"",
false,
1,
SmartLoginOption.parseOptions(0),
emptyMap(),
false,
mockFacebookRequestErrorClassification,
"",
"",
false,
codelessEventsEnabled = false,
eventBindings = emptyJSONArray,
sdkUpdateMessage = "",
trackUninstallEnabled = false,
monitorViaDialogEnabled = false,
rawAamRules = "",
suggestedEventsSetting = "",
restrictiveDataSetting = "",
protectedModeStandardParamsSetting = mockStandardParams,
MACARuleMatchingSetting = emptyJSONArray,
)
PowerMockito.mockStatic(FetchedAppSettingsManager::class.java)
whenever(FetchedAppSettingsManager.queryAppSettings(mockAppID, false))
.thenReturn(mockFetchedAppSettings)
}

@Test
fun `test null as parameters when enable`() {
fun `test null as parameters when enable and server return standard params list`() {
initMockFetchedAppSettings(mockStandardParamsFromServer)
ProtectedModeManager.enable()
val mockParameters = null
val expectedParameters = null
Expand All @@ -47,71 +89,123 @@ class ProtectedModeManagerTest : FacebookPowerMockTestCase() {
}

@Test
fun `test empty parameters when enable`() {
fun `test empty parameters when enable and server return standard params list`() {
initMockFetchedAppSettings(mockStandardParamsFromServer)
ProtectedModeManager.enable()
val mockParameters = Bundle()
val expectedParameters = Bundle()

ProtectedModeManager.processParametersForProtectedMode(mockParameters)
assertEqual(mockParameters, expectedParameters)
}

@Test
fun `test all standard parameters when enable and server return standard params list`() {
initMockFetchedAppSettings(mockStandardParamsFromServer)
ProtectedModeManager.enable()
val mockParameters = Bundle().apply {
putString("standard_param_from_server_1", "value_1")
putString("standard_param_from_server_2", "value_2")
}
val expectedParameters = Bundle().apply {
putString("standard_param_from_server_1", "value_1")
putString("standard_param_from_server_2", "value_2")
putString("pm", "1")
}

ProtectedModeManager.processParametersForProtectedMode(mockParameters)
assertEqual(mockParameters, expectedParameters)
}

@Test
fun `test all standard parameters when enable`() {
fun `test filter out non-standard parameters when enable and server return standard params list`() {
initMockFetchedAppSettings(mockStandardParamsFromServer)
ProtectedModeManager.enable()
val mockParameters = Bundle().apply {
putString("standard_param_from_server_1", "value_1")
putString("standard_param_from_server_2", "value_2")
putString("non_standard_param_1", "value_1")
putString("non_standard_param_2", "value_2")
}
val expectedParameters = Bundle().apply {
putString("standard_param_from_server_1", "value_1")
putString("standard_param_from_server_2", "value_2")
putString("pm", "1")
}

ProtectedModeManager.processParametersForProtectedMode(mockParameters)
assertEqual(mockParameters, expectedParameters)
}

@Test
// This should not happen in the current design, the server will drop empty standard params.
// Adding this test case to ensure empty standard params from server will not crash the App in
// case.
fun `test filter out non-standard parameters when enable and server return empty standard params list`() {
initMockFetchedAppSettings(emptyJSONArray)
ProtectedModeManager.enable()
val mockParameters = Bundle().apply {
putString("fb_currency", "USD")
putString("fb_price", "0.99")
putString("fb_product_price_amount", "0.990")
putString("quantity", "1")
}
val expectedParameters = Bundle().apply {
putString("fb_currency", "USD")
putString("fb_price", "0.99")
putString("pm", "1")
}

// We use static standard params list defined in FB SDK.
ProtectedModeManager.processParametersForProtectedMode(mockParameters)

assertEqual(mockParameters, expectedParameters)
}

@Test
fun `test filter out non-standard parameters when enable`() {
fun `test filter out non-standard parameters when enable and server do not return standard params`() {
initMockFetchedAppSettings(null)
ProtectedModeManager.enable()
val mockParameters = Bundle().apply {
putString("fb_currency", "USD")
putString("fb_price", "0.99")
putString("fb_product_price_amount", "0.990")
putString("quantity", "1")
putString("standard_param_from_server_1", "value_1")
putString("standard_param_from_server_2", "value_2")
}
val expectedParameters = Bundle().apply {
putString("fb_currency", "USD")
putString("fb_price", "0.99")
putString("pm", "1")
}

// We use static standard params list defined in FB SDK.
ProtectedModeManager.processParametersForProtectedMode(mockParameters)

assertEqual(mockParameters, expectedParameters)
}

@Test
fun `test not filter out non-standard parameters when disable`() {
initMockFetchedAppSettings(mockStandardParamsFromServer)
val mockParameters = Bundle().apply {
putString("fb_currency", "USD")
putString("fb_price", "0.99")
putString("fb_product_price_amount", "0.990")
putString("standard_param_from_server_1", "value_1")
putString("standard_param_from_server_2", "value_2")
}
val expectedParameters = Bundle().apply {
putString("fb_currency", "USD")
putString("fb_price", "0.99")
putString("fb_product_price_amount", "0.990")
putString("standard_param_from_server_1", "value_1")
putString("standard_param_from_server_2", "value_2")
}

ProtectedModeManager.processParametersForProtectedMode(mockParameters)

assertEqual(mockParameters, expectedParameters)
}

private fun assertEqual(mockBundle: Bundle?, expectedBundle: Bundle?): Boolean {
private fun isEqual(mockBundle: Bundle?, expectedBundle: Bundle?): Boolean {
if (mockBundle == null && expectedBundle == null) {
return true
}
val s1 = mockBundle?.keySet() ?: return false
val s2 = expectedBundle?.keySet() ?: return false

Expand All @@ -128,4 +222,8 @@ class ProtectedModeManagerTest : FacebookPowerMockTestCase() {
}
return true
}

private fun assertEqual(mockBundle: Bundle?, expectedBundle: Bundle?) {
assertTrue(isEqual(mockBundle,expectedBundle ))
}
}

0 comments on commit d58d113

Please sign in to comment.