Complement some CTS tests for internal API.
Bug: 218830137
Test: atest CtsSafetyCenterTestCases
Change-Id: Ib9ac669306f50389589f582382c19fd94dbfd7e7
diff --git a/tests/cts/safetycenter/src/android/safetycenter/cts/SafetyCenterManagerTest.kt b/tests/cts/safetycenter/src/android/safetycenter/cts/SafetyCenterManagerTest.kt
index 9626dc7..54f4e8e 100644
--- a/tests/cts/safetycenter/src/android/safetycenter/cts/SafetyCenterManagerTest.kt
+++ b/tests/cts/safetycenter/src/android/safetycenter/cts/SafetyCenterManagerTest.kt
@@ -25,20 +25,21 @@
import android.content.IntentFilter
import android.os.Build.VERSION_CODES.TIRAMISU
import android.safetycenter.SafetyCenterData
+import android.safetycenter.SafetyCenterEntry
+import android.safetycenter.SafetyCenterEntry.SEVERITY_UNSPECIFIED_ICON_TYPE_NO_RECOMMENDATION
+import android.safetycenter.SafetyCenterEntryGroup
+import android.safetycenter.SafetyCenterEntryOrGroup
import android.safetycenter.SafetyCenterErrorDetails
+import android.safetycenter.SafetyCenterIssue
import android.safetycenter.SafetyCenterManager
import android.safetycenter.SafetyCenterManager.ACTION_SAFETY_CENTER_ENABLED_CHANGED
import android.safetycenter.SafetyCenterManager.OnSafetyCenterDataChangedListener
import android.safetycenter.SafetyCenterManager.REFRESH_REASON_PAGE_OPEN
import android.safetycenter.SafetyCenterManager.REFRESH_REASON_RESCAN_BUTTON_CLICK
import android.safetycenter.SafetyCenterStatus
-import android.safetycenter.SafetyCenterStatus.OVERALL_SEVERITY_LEVEL_UNKNOWN
import android.safetycenter.SafetyEvent
import android.safetycenter.SafetyEvent.SAFETY_EVENT_TYPE_SOURCE_STATE_CHANGED
import android.safetycenter.SafetySourceData
-import android.safetycenter.SafetySourceData.SEVERITY_LEVEL_CRITICAL_WARNING
-import android.safetycenter.SafetySourceData.SEVERITY_LEVEL_INFORMATION
-import android.safetycenter.SafetySourceData.SEVERITY_LEVEL_UNSPECIFIED
import android.safetycenter.SafetySourceErrorDetails
import android.safetycenter.SafetySourceIssue
import android.safetycenter.SafetySourceStatus
@@ -59,6 +60,7 @@
import android.safetycenter.cts.testing.SafetyCenterApisWithShellPermissions.setSafetyCenterConfigForTestsWithPermission
import android.safetycenter.cts.testing.SafetyCenterApisWithShellPermissions.setSafetySourceDataWithPermission
import android.safetycenter.cts.testing.SafetyCenterCtsConfig.CTS_CONFIG
+import android.safetycenter.cts.testing.SafetyCenterCtsConfig.CTS_SOURCE_GROUP_ID
import android.safetycenter.cts.testing.SafetyCenterCtsConfig.CTS_SOURCE_ID
import android.safetycenter.cts.testing.SafetyCenterEnabledChangedReceiver
import android.safetycenter.cts.testing.SafetyCenterFlags
@@ -97,7 +99,11 @@
private val safetySourceDataUnspecified =
SafetySourceData.Builder()
.setStatus(
- SafetySourceStatus.Builder("None title", "None summary", SEVERITY_LEVEL_UNSPECIFIED)
+ SafetySourceStatus.Builder(
+ "Unspecified title",
+ "Unspecified summary",
+ SafetySourceData.SEVERITY_LEVEL_UNSPECIFIED
+ )
.setEnabled(false)
.build()
)
@@ -105,7 +111,11 @@
private val safetySourceDataInformation =
SafetySourceData.Builder()
.setStatus(
- SafetySourceStatus.Builder("Ok title", "Ok summary", SEVERITY_LEVEL_INFORMATION)
+ SafetySourceStatus.Builder(
+ "Ok title",
+ "Ok summary",
+ SafetySourceData.SEVERITY_LEVEL_INFORMATION
+ )
.setPendingIntent(somePendingIntent)
.build()
)
@@ -116,7 +126,7 @@
SafetySourceStatus.Builder(
"Critical title",
"Critical summary",
- SEVERITY_LEVEL_CRITICAL_WARNING
+ SafetySourceData.SEVERITY_LEVEL_CRITICAL_WARNING
)
.setPendingIntent(somePendingIntent)
.build()
@@ -126,7 +136,7 @@
"critical_issue_id",
"Critical issue title",
"Critical issue summary",
- SEVERITY_LEVEL_CRITICAL_WARNING,
+ SafetySourceData.SEVERITY_LEVEL_CRITICAL_WARNING,
"issue_type_id"
)
.addAction(
@@ -137,6 +147,136 @@
.build()
)
.build()
+ private val safetyCenterDataFromConfig =
+ SafetyCenterData(
+ SafetyCenterStatus.Builder("Unknown", "Unknown safety status")
+ .setSeverityLevel(SafetyCenterStatus.OVERALL_SEVERITY_LEVEL_UNKNOWN)
+ .build(),
+ emptyList(),
+ listOf(
+ SafetyCenterEntryOrGroup(
+ SafetyCenterEntryGroup.Builder(CTS_SOURCE_GROUP_ID, "OK")
+ .setSeverityLevel(SafetyCenterEntry.ENTRY_SEVERITY_LEVEL_UNKNOWN)
+ .setSummary("OK")
+ .setEntries(
+ listOf(
+ SafetyCenterEntry.Builder(CTS_SOURCE_ID, "OK")
+ .setSeverityLevel(
+ SafetyCenterEntry.ENTRY_SEVERITY_LEVEL_UNKNOWN)
+ .setSummary("OK")
+ .setPendingIntent(somePendingIntent)
+ .setSeverityUnspecifiedIconType(
+ SEVERITY_UNSPECIFIED_ICON_TYPE_NO_RECOMMENDATION)
+ .build()
+ )
+ )
+ .build()
+ )
+ ),
+ emptyList()
+ )
+ private val safetyCenterDataUnspecified =
+ SafetyCenterData(
+ SafetyCenterStatus.Builder("All good", "No problemo maestro")
+ .setSeverityLevel(SafetyCenterStatus.OVERALL_SEVERITY_LEVEL_OK)
+ .build(),
+ emptyList(),
+ listOf(
+ SafetyCenterEntryOrGroup(
+ SafetyCenterEntryGroup.Builder(CTS_SOURCE_GROUP_ID, "OK")
+ .setSeverityLevel(SafetyCenterEntry.ENTRY_SEVERITY_LEVEL_UNSPECIFIED)
+ .setSummary("OK")
+ .setEntries(
+ listOf(
+ SafetyCenterEntry.Builder(CTS_SOURCE_ID, "Unspecified title")
+ .setSeverityLevel(
+ SafetyCenterEntry.ENTRY_SEVERITY_LEVEL_UNSPECIFIED)
+ .setSummary("Unspecified summary")
+ .setPendingIntent(somePendingIntent)
+ .setEnabled(false)
+ .setSeverityUnspecifiedIconType(
+ SEVERITY_UNSPECIFIED_ICON_TYPE_NO_RECOMMENDATION)
+ .build()
+ )
+ )
+ .build()
+ )
+ ),
+ emptyList()
+ )
+ private val safetyCenterDataOk =
+ SafetyCenterData(
+ SafetyCenterStatus.Builder("All good", "No problemo maestro")
+ .setSeverityLevel(SafetyCenterStatus.OVERALL_SEVERITY_LEVEL_OK)
+ .build(),
+ emptyList(),
+ listOf(
+ SafetyCenterEntryOrGroup(
+ SafetyCenterEntryGroup.Builder(CTS_SOURCE_GROUP_ID, "OK")
+ .setSeverityLevel(SafetyCenterEntry.ENTRY_SEVERITY_LEVEL_OK)
+ .setSummary("OK")
+ .setEntries(
+ listOf(
+ SafetyCenterEntry.Builder(CTS_SOURCE_ID, "Ok title")
+ .setSeverityLevel(SafetyCenterEntry.ENTRY_SEVERITY_LEVEL_OK)
+ .setSummary("Ok summary")
+ .setPendingIntent(somePendingIntent)
+ .setSeverityUnspecifiedIconType(
+ SEVERITY_UNSPECIFIED_ICON_TYPE_NO_RECOMMENDATION)
+ .build()
+ )
+ )
+ .build()
+ )
+ ),
+ emptyList()
+ )
+ private val safetyCenterDataCritical =
+ SafetyCenterData(
+ SafetyCenterStatus.Builder("Uh-oh", "Code red")
+ .setSeverityLevel(SafetyCenterStatus.OVERALL_SEVERITY_LEVEL_CRITICAL_WARNING)
+ .build(),
+ listOf(
+ SafetyCenterIssue.Builder(
+ "critical_issue_id",
+ "Critical issue title",
+ "Critical issue summary"
+ )
+ .setSeverityLevel(SafetyCenterIssue.ISSUE_SEVERITY_LEVEL_CRITICAL_WARNING)
+ .setActions(
+ listOf(
+ SafetyCenterIssue.Action.Builder(
+ "critical_action_id",
+ "Solve issue",
+ somePendingIntent
+ )
+ .build()
+ )
+ )
+ .build()
+ ),
+ listOf(
+ SafetyCenterEntryOrGroup(
+ SafetyCenterEntryGroup.Builder(CTS_SOURCE_GROUP_ID, "OK")
+ .setSeverityLevel(SafetyCenterEntry.ENTRY_SEVERITY_LEVEL_CRITICAL_WARNING)
+ .setSummary("OK")
+ .setEntries(
+ listOf(
+ SafetyCenterEntry.Builder(CTS_SOURCE_ID, "Critical title")
+ .setSeverityLevel(
+ SafetyCenterEntry.ENTRY_SEVERITY_LEVEL_CRITICAL_WARNING)
+ .setSummary("Critical summary")
+ .setPendingIntent(somePendingIntent)
+ .setSeverityUnspecifiedIconType(
+ SEVERITY_UNSPECIFIED_ICON_TYPE_NO_RECOMMENDATION)
+ .build()
+ )
+ )
+ .build()
+ )
+ ),
+ emptyList()
+ )
private val listener =
object : OnSafetyCenterDataChangedListener {
private val dataChannel = Channel<SafetyCenterData>(UNLIMITED)
@@ -259,6 +399,19 @@
}
@Test
+ fun setSafetySourceData_unknownId_throwsIllegalArgumentException() {
+ val thrown =
+ assertFailsWith(IllegalArgumentException::class) {
+ safetyCenterManager.setSafetySourceDataWithPermission(
+ CTS_SOURCE_ID,
+ safetySourceDataUnspecified,
+ EVENT_SOURCE_STATE_CHANGED
+ )
+ }
+ assertThat(thrown).hasMessageThat().isEqualTo("Unexpected safety source \"$CTS_SOURCE_ID\"")
+ }
+
+ @Test
fun setSafetySourceData_withFlagDisabled_noOp() {
SafetyCenterFlags.setSafetyCenterEnabled(false)
@@ -295,6 +448,15 @@
}
@Test
+ fun getSafetySourceData_unknownId_throwsIllegalArgumentException() {
+ val thrown =
+ assertFailsWith(IllegalArgumentException::class) {
+ safetyCenterManager.getSafetySourceDataWithPermission(CTS_SOURCE_ID)
+ }
+ assertThat(thrown).hasMessageThat().isEqualTo("Unexpected safety source \"$CTS_SOURCE_ID\"")
+ }
+
+ @Test
fun getSafetySourceData_withoutPermission_throwsSecurityException() {
assertFailsWith(SecurityException::class) {
safetyCenterManager.getSafetySourceData(CTS_SOURCE_ID)
@@ -333,8 +495,10 @@
@Test
fun safetyCenterEnabledChanged_whenImplicitReceiverHasPermission_receiverCalled() {
val enabledChangedReceiver = SafetyCenterEnabledChangedReceiver()
- context.registerReceiver(enabledChangedReceiver,
- IntentFilter(ACTION_SAFETY_CENTER_ENABLED_CHANGED))
+ context.registerReceiver(
+ enabledChangedReceiver,
+ IntentFilter(ACTION_SAFETY_CENTER_ENABLED_CHANGED)
+ )
var receiverValue =
enabledChangedReceiver.setSafetyCenterEnabledWithReceiverPermissionAndWait(false)
@@ -351,8 +515,10 @@
@Test
fun safetyCenterEnabledChanged_whenImplicitReceiverDoesNotHavePermission_receiverNotCalled() {
val enabledChangedReceiver = SafetyCenterEnabledChangedReceiver()
- context.registerReceiver(enabledChangedReceiver,
- IntentFilter(ACTION_SAFETY_CENTER_ENABLED_CHANGED))
+ context.registerReceiver(
+ enabledChangedReceiver,
+ IntentFilter(ACTION_SAFETY_CENTER_ENABLED_CHANGED)
+ )
SafetyCenterFlags.setSafetyCenterEnabled(false)
@@ -502,8 +668,8 @@
fun getSafetyCenterConfig_isNotNull() {
val config = safetyCenterManager.getSafetyCenterConfigWithPermission()
- // TODO(b/225152057): Assert on content.
assertThat(config).isNotNull()
+ assertThat(config).isNotEqualTo(CTS_CONFIG)
}
@Test
@@ -517,8 +683,7 @@
val apiSafetyCenterData = safetyCenterManager.getSafetyCenterDataWithPermission()
- // TODO(b/218830137): Assert on content.
- assertThat(apiSafetyCenterData).isNotNull()
+ assertThat(apiSafetyCenterData).isEqualTo(safetyCenterDataFromConfig)
}
@Test
@@ -532,8 +697,7 @@
val apiSafetyCenterData = safetyCenterManager.getSafetyCenterDataWithPermission()
- // TODO(b/218830137): Assert on content.
- assertThat(apiSafetyCenterData).isNotNull()
+ assertThat(apiSafetyCenterData).isEqualTo(safetyCenterDataUnspecified)
}
@Test
@@ -554,8 +718,8 @@
val apiSafetyCenterData = safetyCenterManager.getSafetyCenterDataWithPermission()
- // TODO(b/218830137): Assert on content.
assertThat(apiSafetyCenterData).isNotEqualTo(previousApiSafetyCenterData)
+ assertThat(apiSafetyCenterData).isEqualTo(safetyCenterDataCritical)
}
@Test
@@ -565,17 +729,7 @@
val apiSafetyCenterData = safetyCenterManager.getSafetyCenterDataWithPermission()
- assertThat(apiSafetyCenterData)
- .isEqualTo(
- SafetyCenterData(
- SafetyCenterStatus.Builder("Unknown", "Unknown safety status")
- .setSeverityLevel(OVERALL_SEVERITY_LEVEL_UNKNOWN)
- .build(),
- emptyList(),
- emptyList(),
- emptyList()
- )
- )
+ assertThat(apiSafetyCenterData).isEqualTo(DEFAULT_SAFETY_CENTER_DATA)
}
@Test
@@ -592,8 +746,7 @@
)
val safetyCenterDataFromListener = listener.receiveSafetyCenterData()
- // TODO(b/218830137): Assert on content.
- assertThat(safetyCenterDataFromListener).isNotNull()
+ assertThat(safetyCenterDataFromListener).isEqualTo(safetyCenterDataFromConfig)
}
@Test
@@ -613,8 +766,7 @@
)
val safetyCenterDataFromListener = listener.receiveSafetyCenterData()
- // TODO(b/218830137): Assert on content.
- assertThat(safetyCenterDataFromListener).isNotNull()
+ assertThat(safetyCenterDataFromListener).isEqualTo(safetyCenterDataOk)
}
@Test
@@ -641,8 +793,7 @@
)
val safetyCenterDataFromListener = listener.receiveSafetyCenterData()
- // TODO(b/218830137): Assert on content.
- assertThat(safetyCenterDataFromListener).isNotNull()
+ assertThat(safetyCenterDataFromListener).isEqualTo(safetyCenterDataCritical)
}
@Test
@@ -669,8 +820,7 @@
)
val safetyCenterDataFromListener = listener.receiveSafetyCenterData()
- // TODO(b/218830137): Assert on content.
- assertThat(safetyCenterDataFromListener).isNotNull()
+ assertThat(safetyCenterDataFromListener).isEqualTo(safetyCenterDataFromConfig)
}
@Test
@@ -738,13 +888,6 @@
}
@Test
- fun addOnSafetyCenterDataChangedListener_withoutPermission_throwsSecurityException() {
- assertFailsWith(SecurityException::class) {
- safetyCenterManager.addOnSafetyCenterDataChangedListener(directExecutor(), listener)
- }
- }
-
- @Test
// Permission is held for the entire test to avoid a racy scenario where the shell identity is
// dropped while it's being acquired on another thread.
fun addOnSafetyCenterDataChangedListener_oneShot_doesntDeadlock() {
@@ -771,6 +914,13 @@
}
@Test
+ fun addOnSafetyCenterDataChangedListener_withoutPermission_throwsSecurityException() {
+ assertFailsWith(SecurityException::class) {
+ safetyCenterManager.addOnSafetyCenterDataChangedListener(directExecutor(), listener)
+ }
+ }
+
+ @Test
fun removeOnSafetyCenterDataChangedListener_listenerNotCalledOnSafetySourceData() {
safetyCenterManager.setSafetyCenterConfigForTestsWithPermission(CTS_CONFIG)
safetyCenterManager.addOnSafetyCenterDataChangedListenerWithPermission(
@@ -853,6 +1003,15 @@
}
@Test
+ fun setSafetyCenterConfigForTests_setsConfig() {
+ safetyCenterManager.setSafetyCenterConfigForTestsWithPermission(CTS_CONFIG)
+
+ val config = safetyCenterManager.getSafetyCenterConfigWithPermission()
+
+ assertThat(config).isEqualTo(CTS_CONFIG)
+ }
+
+ @Test
fun setSafetyCenterConfigForTests_withoutPermission_throwsSecurityException() {
assertFailsWith(SecurityException::class) {
safetyCenterManager.setSafetyCenterConfigForTests(CTS_CONFIG)
@@ -869,5 +1028,14 @@
companion object {
private val EVENT_SOURCE_STATE_CHANGED =
SafetyEvent.Builder(SAFETY_EVENT_TYPE_SOURCE_STATE_CHANGED).build()
+ private val DEFAULT_SAFETY_CENTER_DATA =
+ SafetyCenterData(
+ SafetyCenterStatus.Builder("Unknown", "Unknown safety status")
+ .setSeverityLevel(SafetyCenterStatus.OVERALL_SEVERITY_LEVEL_UNKNOWN)
+ .build(),
+ emptyList(),
+ emptyList(),
+ emptyList()
+ )
}
}
diff --git a/tests/cts/safetycenter/src/android/safetycenter/cts/testing/SafetyCenterCtsConfig.kt b/tests/cts/safetycenter/src/android/safetycenter/cts/testing/SafetyCenterCtsConfig.kt
index 2bf5c8a..ef07a95 100644
--- a/tests/cts/safetycenter/src/android/safetycenter/cts/testing/SafetyCenterCtsConfig.kt
+++ b/tests/cts/safetycenter/src/android/safetycenter/cts/testing/SafetyCenterCtsConfig.kt
@@ -32,7 +32,8 @@
/** ID of the only source provided by [CTS_CONFIG]. */
const val CTS_SOURCE_ID = "cts_source_id"
- private const val CTS_SOURCE_GROUP_ID = "cts_source_group"
+ /** ID of the only [SafetySourcesGroup] provided by [CTS_CONFIG]. */
+ const val CTS_SOURCE_GROUP_ID = "cts_source_group"
private val CTS_SOURCE =
SafetySource.Builder(SAFETY_SOURCE_TYPE_DYNAMIC)