summaryrefslogtreecommitdiff
path: root/tests/src/com/android/ons/ONSStatsTest.java
diff options
context:
space:
mode:
Diffstat (limited to 'tests/src/com/android/ons/ONSStatsTest.java')
-rw-r--r--tests/src/com/android/ons/ONSStatsTest.java317
1 files changed, 317 insertions, 0 deletions
diff --git a/tests/src/com/android/ons/ONSStatsTest.java b/tests/src/com/android/ons/ONSStatsTest.java
new file mode 100644
index 0000000..12c49af
--- /dev/null
+++ b/tests/src/com/android/ons/ONSStatsTest.java
@@ -0,0 +1,317 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.ons;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doReturn;
+
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.telephony.SubscriptionInfo;
+import android.telephony.SubscriptionManager;
+
+import com.android.ons.ONSProfileActivator.Result;
+import com.android.ons.ONSProfileDownloader.DownloadRetryResultCode;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.mockito.Spy;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+@RunWith(JUnit4.class)
+public class ONSStatsTest {
+
+ private static final String ONS_ATOM_LOG_FILE = "ons_atom_log_info";
+ private static final String KEY_DETAILED_ERROR_CODE = "_detailed_error_code";
+
+ @Spy private Context mContext;
+ @Mock private SubscriptionManager mSubscriptionManager;
+ private SharedPreferences mSharedPreferences;
+ @Mock private SubscriptionInfo mSubInfoId1;
+ @Mock private SubscriptionInfo mSubInfoId2;
+ private ONSStats mONSStats;
+
+ private class FakeSharedPreferences implements SharedPreferences {
+ HashMap<String, Object> mMap = new HashMap<>();
+
+ @Override
+ public Map<String, ?> getAll() {
+ return mMap;
+ }
+
+ @Override
+ public String getString(String key, String defValue) {
+ return (String) mMap.getOrDefault(key, defValue);
+ }
+
+ @Override
+ public Set<String> getStringSet(String key, Set<String> defValues) {
+ if (mMap.containsKey(key)) {
+ return (Set<String>) mMap.get(key);
+ }
+ return defValues;
+ }
+
+ @Override
+ public int getInt(String key, int defValue) {
+ return (int) mMap.getOrDefault(key, defValue);
+ }
+
+ @Override
+ public long getLong(String key, long defValue) {
+ return 0; // not used
+ }
+
+ @Override
+ public float getFloat(String key, float defValue) {
+ return (float) mMap.getOrDefault(key, defValue);
+ }
+
+ @Override
+ public boolean getBoolean(String key, boolean defValue) {
+ return (boolean) mMap.getOrDefault(key, defValue);
+ }
+
+ @Override
+ public boolean contains(String key) {
+ return mMap.containsKey(key);
+ }
+
+ @Override
+ public Editor edit() {
+ TestEditor editor = new TestEditor();
+ editor.map = mMap;
+ return editor;
+ }
+
+ @Override
+ public void registerOnSharedPreferenceChangeListener(
+ OnSharedPreferenceChangeListener listener) {}
+
+ @Override
+ public void unregisterOnSharedPreferenceChangeListener(
+ OnSharedPreferenceChangeListener listener) {}
+
+ private class TestEditor implements SharedPreferences.Editor {
+ HashMap<String, Object> map = new HashMap<>();
+
+ @Override
+ public SharedPreferences.Editor putString(String key, String value) {
+ map.put(key, value);
+ return this;
+ }
+
+ @Override
+ public SharedPreferences.Editor putStringSet(String key, Set<String> values) {
+ map.put(key, values);
+ return this;
+ }
+
+ @Override
+ public SharedPreferences.Editor putInt(String key, int value) {
+ map.put(key, value);
+ return this;
+ }
+
+ @Override
+ public SharedPreferences.Editor putLong(String key, long value) {
+ map.put(key, value);
+ return this;
+ }
+
+ @Override
+ public SharedPreferences.Editor putFloat(String key, float value) {
+ map.put(key, value);
+ return this;
+ }
+
+ @Override
+ public SharedPreferences.Editor putBoolean(String key, boolean value) {
+ map.put(key, value);
+ return this;
+ }
+
+ @Override
+ public SharedPreferences.Editor remove(String key) {
+ map.remove(key);
+ return this;
+ }
+
+ @Override
+ public SharedPreferences.Editor clear() {
+ map.clear();
+ return this;
+ }
+
+ @Override
+ public boolean commit() {
+ mMap = map;
+ return true;
+ }
+
+ @Override
+ public void apply() {
+ mMap = map;
+ }
+ }
+ ;
+ }
+ ;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mSharedPreferences = new FakeSharedPreferences();
+ doReturn(mSharedPreferences)
+ .when(mContext)
+ .getSharedPreferences(eq(ONS_ATOM_LOG_FILE), eq(Context.MODE_PRIVATE));
+ doReturn(123).when(mSubInfoId1).getCarrierId();
+ doReturn(456).when(mSubInfoId2).getCarrierId();
+ doReturn(mSubInfoId1).when(mSubscriptionManager).getActiveSubscriptionInfo(1);
+ doReturn(mSubInfoId2).when(mSubscriptionManager).getActiveSubscriptionInfo(2);
+ mONSStats = new ONSStats(mContext, mSubscriptionManager);
+ }
+
+ @After
+ public void tearDown() {
+ mSharedPreferences.edit().clear().apply();
+ }
+
+ @Test
+ public void testLogEvent() {
+ ONSStatsInfo info =
+ new ONSStatsInfo()
+ .setPrimarySimSubId(1)
+ .setProvisioningResult(Result.ERR_CANNOT_SWITCH_TO_DUAL_SIM_MODE);
+ assertTrue(mONSStats.logEvent(info));
+ }
+
+ @Test
+ public void testIgnoredLogEvents() {
+ // ignored error codes should not log.
+ ONSStatsInfo info = new ONSStatsInfo().setProvisioningResult(Result.DOWNLOAD_REQUESTED);
+ assertFalse(mONSStats.logEvent(info));
+
+ info = new ONSStatsInfo().setProvisioningResult(Result.ERR_NO_SIM_INSERTED);
+ assertFalse(mONSStats.logEvent(info));
+
+ info = new ONSStatsInfo().setProvisioningResult(Result.ERR_DUPLICATE_DOWNLOAD_REQUEST);
+ assertFalse(mONSStats.logEvent(info));
+
+ info = new ONSStatsInfo().setProvisioningResult(Result.ERR_SWITCHING_TO_DUAL_SIM_MODE);
+ assertFalse(mONSStats.logEvent(info));
+ }
+
+ @Test
+ public void testRepeatedLogEvents() {
+ ONSStatsInfo info;
+ info =
+ new ONSStatsInfo()
+ .setDownloadResult(DownloadRetryResultCode.ERR_MEMORY_FULL)
+ .setDetailedErrCode(10011);
+ assertTrue(mONSStats.logEvent(info));
+
+ // same result should not log consecutively
+ assertFalse(mONSStats.logEvent(info));
+ assertFalse(mONSStats.logEvent(info));
+ }
+
+ @Test
+ public void testRepeatedAllowedLogEvents() {
+ ONSStatsInfo info;
+ info = new ONSStatsInfo().setProvisioningResult(Result.ERR_DOWNLOADED_ESIM_NOT_FOUND);
+ assertTrue(mONSStats.logEvent(info));
+
+ // ERR_DOWNLOADED_ESIM_NOT_FOUND is allowed to log consecutively
+ assertTrue(mONSStats.logEvent(info));
+ assertTrue(mONSStats.logEvent(info));
+
+ info =
+ new ONSStatsInfo()
+ .setDownloadResult(DownloadRetryResultCode.ERR_INSTALL_ESIM_PROFILE_FAILED);
+ assertTrue(mONSStats.logEvent(info));
+
+ // ERR_INSTALL_ESIM_PROFILE_FAILED is allowed to log consecutively
+ assertTrue(mONSStats.logEvent(info));
+ assertTrue(mONSStats.logEvent(info));
+ }
+
+ @Test
+ public void testRepeatedSuccessLogEvents() {
+ ONSStatsInfo info;
+ info = new ONSStatsInfo().setProvisioningResult(Result.SUCCESS).setRetryCount(2);
+
+ // should log every time if eSIM is newly downloaded.
+ assertTrue(mONSStats.logEvent(info));
+ assertTrue(mONSStats.logEvent(info));
+
+ info = new ONSStatsInfo().setProvisioningResult(Result.SUCCESS);
+ // should log even if eSIM is already downloaded and event triggered just to group it.
+ assertTrue(mONSStats.logEvent(info));
+ assertTrue(mONSStats.logEvent(info));
+ }
+
+ @Test
+ public void testRepeatedErrorWithInfoChangeLogEvents() {
+ ONSStatsInfo info =
+ new ONSStatsInfo()
+ .setPrimarySimSubId(1)
+ .setProvisioningResult(Result.ERR_AUTO_PROVISIONING_DISABLED);
+ assertTrue(mONSStats.logEvent(info));
+
+ // Same error should log if the info is changed.
+ info.setPrimarySimSubId(2);
+ assertTrue(mONSStats.logEvent(info));
+
+ // no change in info
+ assertFalse(mONSStats.logEvent(info));
+ }
+
+ @Test
+ public void testDetailedErrorCodeLogEvents() {
+ ONSStatsInfo info;
+ info = new ONSStatsInfo().setProvisioningResult(Result.ERR_WAITING_FOR_INTERNET_CONNECTION);
+ assertTrue(mONSStats.logEvent(info));
+
+ // For provisioning errors; Result enum ordinal is set as detailed error code.
+ assertEquals(
+ Result.ERR_WAITING_FOR_INTERNET_CONNECTION.ordinal(),
+ mSharedPreferences.getInt(KEY_DETAILED_ERROR_CODE, -1));
+ assertEquals(
+ Result.ERR_WAITING_FOR_INTERNET_CONNECTION.ordinal(), info.getDetailedErrCode());
+
+ // For Download errors; detailed error code is updated from EuiccManager.
+ info =
+ new ONSStatsInfo()
+ .setDownloadResult(DownloadRetryResultCode.ERR_MEMORY_FULL)
+ .setDetailedErrCode(10223);
+ assertTrue(mONSStats.logEvent(info));
+ assertEquals(10223, mSharedPreferences.getInt(KEY_DETAILED_ERROR_CODE, -1));
+ assertEquals(10223, info.getDetailedErrCode());
+ }
+}