Enforce satellite session metrics
1. Add missed provision metrics report case
2. fix unnecessary type casting from long to int which may cause
overflow.
3. enforce satelite session metrics
Bug: 330262741
Test: atest SatelliteStatsTest SatelliteControllerTest DatagramDispatcherTest DatagramReceiverTest PersistAtomsStorageTest
MetricsCollectorTest
Manually tested whether telephony satellite atoms are saved as expected on pixel using below command
adb pull /data/user_de/0/com.android.phone/files/persist_atoms.pb && gqui from persist_atoms.pb proto ~/src/24D1-dev/frameworks/opt/telephony/proto/src/persist_atoms.proto:telephonyStatsLog.PersistAtoms
and logs
Change-Id: Id9d3507067424e50ccdd3ca1d1f646e799e79450
diff --git a/proto/src/persist_atoms.proto b/proto/src/persist_atoms.proto
index 59b177b..609bf7a 100644
--- a/proto/src/persist_atoms.proto
+++ b/proto/src/persist_atoms.proto
@@ -665,6 +665,14 @@
optional int32 satellite_service_initialization_result = 1;
optional int32 satellite_technology = 2;
optional int32 count = 3;
+ optional int32 satellite_service_termination_result = 4;
+ optional int64 initialization_processing_time_millis = 5;
+ optional int64 termination_processing_time_millis = 6;
+ optional int32 session_duration_seconds = 7;
+ optional int32 count_of_outgoing_datagram_success = 8;
+ optional int32 count_of_outgoing_datagram_failed = 9;
+ optional int32 count_of_incoming_datagram_success = 10;
+ optional int32 count_of_incoming_datagram_failed = 11;
}
message SatelliteIncomingDatagram {
diff --git a/src/java/com/android/internal/telephony/metrics/MetricsCollector.java b/src/java/com/android/internal/telephony/metrics/MetricsCollector.java
index fbdf909..6aeb2fc 100644
--- a/src/java/com/android/internal/telephony/metrics/MetricsCollector.java
+++ b/src/java/com/android/internal/telephony/metrics/MetricsCollector.java
@@ -1353,7 +1353,15 @@
SATELLITE_SESSION,
satelliteSession.satelliteServiceInitializationResult,
satelliteSession.satelliteTechnology,
- satelliteSession.count);
+ satelliteSession.count,
+ satelliteSession.satelliteServiceTerminationResult,
+ satelliteSession.initializationProcessingTimeMillis,
+ satelliteSession.terminationProcessingTimeMillis,
+ satelliteSession.sessionDurationSeconds,
+ satelliteSession.countOfOutgoingDatagramSuccess,
+ satelliteSession.countOfOutgoingDatagramFailed,
+ satelliteSession.countOfIncomingDatagramSuccess,
+ satelliteSession.countOfIncomingDatagramFailed);
}
private static StatsEvent buildStatsEvent(SatelliteIncomingDatagram stats) {
diff --git a/src/java/com/android/internal/telephony/metrics/PersistAtomsStorage.java b/src/java/com/android/internal/telephony/metrics/PersistAtomsStorage.java
index 64b9bda..9b9afaa 100644
--- a/src/java/com/android/internal/telephony/metrics/PersistAtomsStorage.java
+++ b/src/java/com/android/internal/telephony/metrics/PersistAtomsStorage.java
@@ -2058,7 +2058,17 @@
for (SatelliteSession stats : mAtoms.satelliteSession) {
if (stats.satelliteServiceInitializationResult
== key.satelliteServiceInitializationResult
- && stats.satelliteTechnology == key.satelliteTechnology) {
+ && stats.satelliteTechnology == key.satelliteTechnology
+ && stats.satelliteServiceTerminationResult
+ == key.satelliteServiceTerminationResult
+ && stats.initializationProcessingTimeMillis
+ == key.initializationProcessingTimeMillis
+ && stats.terminationProcessingTimeMillis == key.terminationProcessingTimeMillis
+ && stats.sessionDurationSeconds == key.sessionDurationSeconds
+ && stats.countOfOutgoingDatagramSuccess == key.countOfOutgoingDatagramSuccess
+ && stats.countOfOutgoingDatagramFailed == key.countOfOutgoingDatagramFailed
+ && stats.countOfIncomingDatagramSuccess == key.countOfIncomingDatagramSuccess
+ && stats.countOfIncomingDatagramFailed == key.countOfIncomingDatagramFailed) {
return stats;
}
}
diff --git a/src/java/com/android/internal/telephony/metrics/SatelliteStats.java b/src/java/com/android/internal/telephony/metrics/SatelliteStats.java
index 55eee1a..b58e62a 100644
--- a/src/java/com/android/internal/telephony/metrics/SatelliteStats.java
+++ b/src/java/com/android/internal/telephony/metrics/SatelliteStats.java
@@ -16,6 +16,8 @@
package com.android.internal.telephony.metrics;
+import android.telephony.satellite.SatelliteManager;
+
import com.android.internal.telephony.PhoneFactory;
import com.android.internal.telephony.nano.PersistAtomsProto.SatelliteController;
import com.android.internal.telephony.nano.PersistAtomsProto.SatelliteIncomingDatagram;
@@ -385,11 +387,28 @@
public class SatelliteSessionParams {
private final int mSatelliteServiceInitializationResult;
private final int mSatelliteTechnology;
+ private final int mTerminationResult;
+ private final long mInitializationProcessingTimeMillis;
+ private final long mTerminationProcessingTimeMillis;
+ private final int mSessionDurationSec;
+ private final int mCountOfOutgoingDatagramSuccess;
+ private final int mCountOfOutgoingDatagramFailed;
+ private final int mCountOfIncomingDatagramSuccess;
+ private final int mCountOfIncomingDatagramFailed;
private SatelliteSessionParams(Builder builder) {
this.mSatelliteServiceInitializationResult =
builder.mSatelliteServiceInitializationResult;
this.mSatelliteTechnology = builder.mSatelliteTechnology;
+ this.mTerminationResult = builder.mTerminationResult;
+ this.mInitializationProcessingTimeMillis = builder.mInitializationProcessingTimeMillis;
+ this.mTerminationProcessingTimeMillis =
+ builder.mTerminationProcessingTimeMillis;
+ this.mSessionDurationSec = builder.mSessionDurationSec;
+ this.mCountOfOutgoingDatagramSuccess = builder.mCountOfOutgoingDatagramSuccess;
+ this.mCountOfOutgoingDatagramFailed = builder.mCountOfOutgoingDatagramFailed;
+ this.mCountOfIncomingDatagramSuccess = builder.mCountOfIncomingDatagramSuccess;
+ this.mCountOfIncomingDatagramFailed = builder.mCountOfIncomingDatagramFailed;
}
public int getSatelliteServiceInitializationResult() {
@@ -400,12 +419,52 @@
return mSatelliteTechnology;
}
+ public int getTerminationResult() {
+ return mTerminationResult;
+ }
+
+ public long getInitializationProcessingTime() {
+ return mInitializationProcessingTimeMillis;
+ }
+
+ public long getTerminationProcessingTime() {
+ return mTerminationProcessingTimeMillis;
+ }
+
+ public int getSessionDuration() {
+ return mSessionDurationSec;
+ }
+
+ public int getCountOfOutgoingDatagramSuccess() {
+ return mCountOfOutgoingDatagramSuccess;
+ }
+
+ public int getCountOfOutgoingDatagramFailed() {
+ return mCountOfOutgoingDatagramFailed;
+ }
+
+ public int getCountOfIncomingDatagramSuccess() {
+ return mCountOfIncomingDatagramSuccess;
+ }
+
+ public int getCountOfIncomingDatagramFailed() {
+ return mCountOfIncomingDatagramFailed;
+ }
+
/**
* A builder class to create {@link SatelliteSessionParams} data structure class
*/
public static class Builder {
private int mSatelliteServiceInitializationResult = -1;
private int mSatelliteTechnology = -1;
+ private int mTerminationResult = -1;
+ private long mInitializationProcessingTimeMillis = -1;
+ private long mTerminationProcessingTimeMillis = -1;
+ private int mSessionDurationSec = -1;
+ private int mCountOfOutgoingDatagramSuccess = -1;
+ private int mCountOfOutgoingDatagramFailed = -1;
+ private int mCountOfIncomingDatagramSuccess = -1;
+ private int mCountOfIncomingDatagramFailed = -1;
/**
* Sets satelliteServiceInitializationResult value of {@link SatelliteSession}
@@ -426,6 +485,55 @@
return this;
}
+ /** Sets the satellite de-initialization result. */
+ public Builder setTerminationResult(
+ @SatelliteManager.SatelliteResult int result) {
+ this.mTerminationResult = result;
+ return this;
+ }
+
+ /** Sets the satellite initialization processing time. */
+ public Builder setInitializationProcessingTime(long processingTime) {
+ this.mInitializationProcessingTimeMillis = processingTime;
+ return this;
+ }
+
+ /** Sets the satellite de-initialization processing time. */
+ public Builder setTerminationProcessingTime(long processingTime) {
+ this.mTerminationProcessingTimeMillis = processingTime;
+ return this;
+ }
+
+ /** Sets the total enabled time for the satellite session. */
+ public Builder setSessionDuration(int sessionDurationSec) {
+ this.mSessionDurationSec = sessionDurationSec;
+ return this;
+ }
+
+ /** Sets the total number of successful outgoing datagram transmission. */
+ public Builder setCountOfOutgoingDatagramSuccess(int countOfoutgoingDatagramSuccess) {
+ this.mCountOfOutgoingDatagramSuccess = countOfoutgoingDatagramSuccess;
+ return this;
+ }
+
+ /** Sets the total number of failed outgoing datagram transmission. */
+ public Builder setCountOfOutgoingDatagramFailed(int countOfoutgoingDatagramFailed) {
+ this.mCountOfOutgoingDatagramFailed = countOfoutgoingDatagramFailed;
+ return this;
+ }
+
+ /** Sets the total number of successful incoming datagram transmission. */
+ public Builder setCountOfIncomingDatagramSuccess(int countOfincomingDatagramSuccess) {
+ this.mCountOfIncomingDatagramSuccess = countOfincomingDatagramSuccess;
+ return this;
+ }
+
+ /** Sets the total number of failed incoming datagram transmission. */
+ public Builder setCountOfIncomingDatagramFailed(int countOfincomingDatagramFailed) {
+ this.mCountOfIncomingDatagramFailed = countOfincomingDatagramFailed;
+ return this;
+ }
+
/**
* Returns SessionParams, which contains whole component of
* {@link SatelliteSession} atom
@@ -441,7 +549,14 @@
return "SessionParams("
+ ", satelliteServiceInitializationResult="
+ mSatelliteServiceInitializationResult
- + ", satelliteTechnology=" + mSatelliteTechnology
+ + ", TerminationResult=" + mTerminationResult
+ + ", InitializationProcessingTimeMillis=" + mInitializationProcessingTimeMillis
+ + ", TerminationProcessingTimeMillis=" + mTerminationProcessingTimeMillis
+ + ", SessionDurationSec=" + mSessionDurationSec
+ + ", CountOfOutgoingDatagramSuccess=" + mCountOfOutgoingDatagramSuccess
+ + ", CountOfOutgoingDatagramFailed=" + mCountOfOutgoingDatagramFailed
+ + ", CountOfIncomingDatagramSuccess=" + mCountOfIncomingDatagramSuccess
+ + ", CountOfIncomingDatagramFailed=" + mCountOfIncomingDatagramFailed
+ ")";
}
}
@@ -912,6 +1027,14 @@
param.getSatelliteServiceInitializationResult();
proto.satelliteTechnology = param.getSatelliteTechnology();
proto.count = 1;
+ proto.satelliteServiceTerminationResult = param.getTerminationResult();
+ proto.initializationProcessingTimeMillis = param.getInitializationProcessingTime();
+ proto.terminationProcessingTimeMillis = param.getTerminationProcessingTime();
+ proto.sessionDurationSeconds = param.getSessionDuration();
+ proto.countOfOutgoingDatagramSuccess = param.getCountOfIncomingDatagramSuccess();
+ proto.countOfOutgoingDatagramFailed = param.getCountOfOutgoingDatagramFailed();
+ proto.countOfIncomingDatagramSuccess = param.getCountOfIncomingDatagramSuccess();
+ proto.countOfIncomingDatagramFailed = param.getCountOfOutgoingDatagramFailed();
mAtomsStorage.addSatelliteSessionStats(proto);
}
diff --git a/src/java/com/android/internal/telephony/satellite/DatagramDispatcher.java b/src/java/com/android/internal/telephony/satellite/DatagramDispatcher.java
index 2d052b6..7ead441 100644
--- a/src/java/com/android/internal/telephony/satellite/DatagramDispatcher.java
+++ b/src/java/com/android/internal/telephony/satellite/DatagramDispatcher.java
@@ -43,6 +43,7 @@
import com.android.internal.telephony.Phone;
import com.android.internal.telephony.metrics.SatelliteStats;
import com.android.internal.telephony.satellite.metrics.ControllerMetricsStats;
+import com.android.internal.telephony.satellite.metrics.SessionMetricsStats;
import java.util.LinkedHashMap;
import java.util.Map.Entry;
@@ -70,6 +71,7 @@
@NonNull private final Context mContext;
@NonNull private final DatagramController mDatagramController;
@NonNull private final ControllerMetricsStats mControllerMetricsStats;
+ @NonNull private final SessionMetricsStats mSessionMetricsStats;
private boolean mIsDemoMode = false;
private boolean mIsAligned = false;
@@ -134,6 +136,7 @@
mContext = context;
mDatagramController = datagramController;
mControllerMetricsStats = ControllerMetricsStats.getInstance();
+ mSessionMetricsStats = SessionMetricsStats.getInstance();
synchronized (mLock) {
mSendingDatagramInProgress = false;
@@ -276,6 +279,7 @@
getPendingDatagramCount(), error);
mControllerMetricsStats.reportOutgoingDatagramSuccessCount(
argument.datagramType);
+ mSessionMetricsStats.addCountOfSuccessfulOutgoingDatagram();
startWaitForSimulatedPollDatagramsDelayTimer(request);
if (getPendingDatagramCount() > 0) {
// Send response for current datagram
@@ -304,6 +308,7 @@
// Abort sending all the pending datagrams
mControllerMetricsStats.reportOutgoingDatagramFailCount(
argument.datagramType);
+ mSessionMetricsStats.addCountOfFailedOutgoingDatagram();
abortSendingPendingDatagrams(argument.subId,
SatelliteManager.SATELLITE_RESULT_REQUEST_ABORTED);
}
@@ -593,8 +598,10 @@
.setDatagramType(argument.datagramType)
.setResultCode(resultCode)
.setDatagramSizeBytes(argument.getDatagramRoundedSizeBytes())
- .setDatagramTransferTimeMillis(
- System.currentTimeMillis() - argument.datagramStartTime)
+ /* In case pending datagram has not been attempted to send to modem
+ interface. transfer time will be 0. */
+ .setDatagramTransferTimeMillis(argument.datagramStartTime > 0
+ ? (System.currentTimeMillis() - argument.datagramStartTime) : 0)
.build());
}
@@ -719,6 +726,8 @@
0, SatelliteManager.SATELLITE_RESULT_SUCCESS);
abortSendingPendingDatagrams(SubscriptionManager.DEFAULT_SUBSCRIPTION_ID,
SATELLITE_RESULT_NOT_REACHABLE);
+ mControllerMetricsStats.reportOutgoingDatagramFailCount(argument.datagramType);
+ mSessionMetricsStats.addCountOfFailedOutgoingDatagram();
}
}
diff --git a/src/java/com/android/internal/telephony/satellite/DatagramReceiver.java b/src/java/com/android/internal/telephony/satellite/DatagramReceiver.java
index a4b1193..94b4bd3 100644
--- a/src/java/com/android/internal/telephony/satellite/DatagramReceiver.java
+++ b/src/java/com/android/internal/telephony/satellite/DatagramReceiver.java
@@ -17,6 +17,7 @@
package com.android.internal.telephony.satellite;
import static android.telephony.satellite.SatelliteManager.SATELLITE_MODEM_STATE_CONNECTED;
+import static android.telephony.satellite.SatelliteManager.SATELLITE_RESULT_SUCCESS;
import static com.android.internal.telephony.satellite.DatagramController.ROUNDING_UNIT;
@@ -51,6 +52,7 @@
import com.android.internal.telephony.Phone;
import com.android.internal.telephony.metrics.SatelliteStats;
import com.android.internal.telephony.satellite.metrics.ControllerMetricsStats;
+import com.android.internal.telephony.satellite.metrics.SessionMetricsStats;
import com.android.internal.util.FunctionalUtils;
import java.util.concurrent.ConcurrentHashMap;
@@ -79,6 +81,7 @@
@NonNull private SharedPreferences mSharedPreferences = null;
@NonNull private final DatagramController mDatagramController;
@NonNull private final ControllerMetricsStats mControllerMetricsStats;
+ @NonNull private final SessionMetricsStats mSessionMetricsStats;
@NonNull private final Looper mLooper;
private long mDatagramTransferStartTime = 0;
@@ -137,6 +140,7 @@
mContentResolver = context.getContentResolver();
mDatagramController = datagramController;
mControllerMetricsStats = ControllerMetricsStats.getInstance();
+ mSessionMetricsStats = SessionMetricsStats.getInstance();
try {
mSharedPreferences =
@@ -354,9 +358,6 @@
obtainMessage(EVENT_RETRY_DELIVERING_RECEIVED_DATAGRAM,
argument), getTimeoutToReceiveAck());
});
-
- sInstance.mControllerMetricsStats.reportIncomingDatagramCount(
- SatelliteManager.SATELLITE_RESULT_SUCCESS);
}
if (pendingCount <= 0) {
@@ -377,8 +378,8 @@
}
// Send the captured data about incoming datagram to metric
- sInstance.reportMetrics(
- satelliteDatagram, SatelliteManager.SATELLITE_RESULT_SUCCESS);
+ sInstance.reportMetrics(satelliteDatagram,
+ SatelliteManager.SATELLITE_RESULT_SUCCESS);
break;
}
@@ -468,7 +469,6 @@
SatelliteManager.SATELLITE_RESULT_SUCCESS);
reportMetrics(null, error);
- mControllerMetricsStats.reportIncomingDatagramCount(error);
}
// Send response for current request
((Consumer<Integer>) request.argument).accept(error);
@@ -712,7 +712,7 @@
private void reportMetrics(@Nullable SatelliteDatagram satelliteDatagram,
@NonNull @SatelliteManager.SatelliteResult int resultCode) {
int datagramSizeRoundedBytes = -1;
- int datagramTransferTime = 0;
+ long datagramTransferTime = 0;
if (satelliteDatagram != null) {
if (satelliteDatagram.getSatelliteDatagram() != null) {
@@ -721,7 +721,7 @@
datagramSizeRoundedBytes =
(int) (Math.round((double) sizeBytes / ROUNDING_UNIT) * ROUNDING_UNIT);
}
- datagramTransferTime = (int) (System.currentTimeMillis() - mDatagramTransferStartTime);
+ datagramTransferTime = (System.currentTimeMillis() - mDatagramTransferStartTime);
mDatagramTransferStartTime = 0;
}
@@ -731,6 +731,13 @@
.setDatagramSizeBytes(datagramSizeRoundedBytes)
.setDatagramTransferTimeMillis(datagramTransferTime)
.build());
+
+ mControllerMetricsStats.reportIncomingDatagramCount(resultCode);
+ if (resultCode == SATELLITE_RESULT_SUCCESS) {
+ mSessionMetricsStats.addCountOfSuccessfulIncomingDatagram();
+ } else {
+ mSessionMetricsStats.addCountOfFailedIncomingDatagram();
+ }
}
/** Set demo mode
@@ -841,8 +848,6 @@
SatelliteManager.SATELLITE_RESULT_SUCCESS);
reportMetrics(null, SatelliteManager.SATELLITE_RESULT_NOT_REACHABLE);
- mControllerMetricsStats.reportIncomingDatagramCount(
- SatelliteManager.SATELLITE_RESULT_NOT_REACHABLE);
Consumer<Integer> callback =
(Consumer<Integer>) mPendingPollSatelliteDatagramsRequest.argument;
diff --git a/src/java/com/android/internal/telephony/satellite/SatelliteController.java b/src/java/com/android/internal/telephony/satellite/SatelliteController.java
index 4b387c8..2d28c9c 100644
--- a/src/java/com/android/internal/telephony/satellite/SatelliteController.java
+++ b/src/java/com/android/internal/telephony/satellite/SatelliteController.java
@@ -17,12 +17,12 @@
package com.android.internal.telephony.satellite;
import static android.provider.Settings.ACTION_SATELLITE_SETTING;
+import static android.telephony.CarrierConfigManager.KEY_CARRIER_ROAMING_SATELLITE_DEFAULT_SERVICES_INT_ARRAY;
import static android.telephony.CarrierConfigManager.KEY_CARRIER_SUPPORTED_SATELLITE_SERVICES_PER_PROVIDER_BUNDLE;
import static android.telephony.CarrierConfigManager.KEY_EMERGENCY_CALL_TO_SATELLITE_T911_HANDOVER_TIMEOUT_MILLIS_INT;
+import static android.telephony.CarrierConfigManager.KEY_EMERGENCY_MESSAGING_SUPPORTED_BOOL;
import static android.telephony.CarrierConfigManager.KEY_SATELLITE_ATTACH_SUPPORTED_BOOL;
import static android.telephony.CarrierConfigManager.KEY_SATELLITE_CONNECTION_HYSTERESIS_SEC_INT;
-import static android.telephony.CarrierConfigManager.KEY_CARRIER_ROAMING_SATELLITE_DEFAULT_SERVICES_INT_ARRAY;
-import static android.telephony.CarrierConfigManager.KEY_EMERGENCY_MESSAGING_SUPPORTED_BOOL;
import static android.telephony.CarrierConfigManager.KEY_SATELLITE_ENTITLEMENT_SUPPORTED_BOOL;
import static android.telephony.SubscriptionManager.SATELLITE_ATTACH_ENABLED_FOR_CARRIER;
import static android.telephony.SubscriptionManager.SATELLITE_ENTITLEMENT_STATUS;
@@ -218,6 +218,7 @@
@NonNull private final DatagramController mDatagramController;
@NonNull private final ControllerMetricsStats mControllerMetricsStats;
@NonNull private final ProvisionMetricsStats mProvisionMetricsStats;
+ @NonNull private SessionMetricsStats mSessionMetricsStats;
@NonNull private final SubscriptionManagerService mSubscriptionManagerService;
private final CommandsInterface mCi;
private ContentResolver mContentResolver;
@@ -411,6 +412,9 @@
private final BTWifiNFCStateReceiver mBTWifiNFCSateReceiver;
private final UwbAdapterStateCallback mUwbAdapterStateCallback;
+ private long mSessionStartTimeStamp;
+ private long mSessionProcessingTimeStamp;
+
/**
* @return The singleton instance of SatelliteController.
*/
@@ -464,6 +468,7 @@
// should be called before making DatagramController
mControllerMetricsStats = ControllerMetricsStats.make(mContext);
mProvisionMetricsStats = ProvisionMetricsStats.getOrCreateInstance();
+ mSessionMetricsStats = SessionMetricsStats.getInstance();
mSubscriptionManagerService = SubscriptionManagerService.getInstance();
// Create the DatagramController singleton,
@@ -1005,18 +1010,31 @@
}
if (argument.enableSatellite) {
+ mSessionMetricsStats.setInitializationResult(error)
+ .setSatelliteTechnology(getSupportedNtnRadioTechnology())
+ .setInitializationProcessingTime(
+ System.currentTimeMillis() - mSessionProcessingTimeStamp);
+ mSessionProcessingTimeStamp = 0;
+
if (error == SATELLITE_RESULT_SUCCESS) {
mControllerMetricsStats.onSatelliteEnabled();
mControllerMetricsStats.reportServiceEnablementSuccessCount();
} else {
+ mSessionMetricsStats.reportSessionMetrics();
+ mSessionStartTimeStamp = 0;
mControllerMetricsStats.reportServiceEnablementFailCount();
}
- SessionMetricsStats.getInstance()
- .setInitializationResult(error)
- .setRadioTechnology(getSupportedNtnRadioTechnology())
- .reportSessionMetrics();
} else {
+ mSessionMetricsStats.setTerminationResult(error)
+ .setTerminationProcessingTime(System.currentTimeMillis()
+ - mSessionProcessingTimeStamp)
+ .setSessionDurationSec(calculateSessionDurationTimeSec())
+ .reportSessionMetrics();
+ mSessionStartTimeStamp = 0;
+ mSessionProcessingTimeStamp = 0;
+
mControllerMetricsStats.onSatelliteDisabled();
+
synchronized (mIsSatelliteEnabledLock) {
mWaitingForDisableSatelliteModemResponse = false;
}
@@ -2966,6 +2984,10 @@
} else {
callback.accept(result);
}
+ mProvisionMetricsStats.setResultCode(result)
+ .setIsProvisionRequest(true)
+ .reportProvisionMetrics();
+ mControllerMetricsStats.reportProvisionCount(result);
}
private void handleEventDeprovisionSatelliteServiceDone(
@@ -3103,6 +3125,12 @@
mSatelliteModemInterface.requestSatelliteEnabled(argument.enableSatellite,
argument.enableDemoMode, argument.isEmergency, onCompleted);
startWaitForSatelliteEnablingResponseTimer(argument);
+ // Logs satellite session timestamps for session metrics
+ if (argument.enableSatellite) {
+ mSessionStartTimeStamp = System.currentTimeMillis();
+ }
+ mSessionProcessingTimeStamp = System.currentTimeMillis();
+
}
private void handleRequestSatelliteAttachRestrictionForCarrierCmd(
@@ -4007,10 +4035,11 @@
private void sendErrorAndReportSessionMetrics(@SatelliteManager.SatelliteResult int error,
Consumer<Integer> result) {
result.accept(error);
- SessionMetricsStats.getInstance()
- .setInitializationResult(error)
- .setRadioTechnology(getSupportedNtnRadioTechnology())
+ mSessionMetricsStats.setInitializationResult(error)
+ .setSatelliteTechnology(getSupportedNtnRadioTechnology())
.reportSessionMetrics();
+ mSessionStartTimeStamp = 0;
+ mSessionProcessingTimeStamp = 0;
}
private void registerForServiceStateChanged() {
@@ -4220,10 +4249,13 @@
sendRequestAsync(CMD_SET_SATELLITE_ENABLED, request, null);
}
mControllerMetricsStats.reportServiceEnablementFailCount();
- SessionMetricsStats.getInstance()
- .setInitializationResult(SATELLITE_RESULT_MODEM_TIMEOUT)
- .setRadioTechnology(getSupportedNtnRadioTechnology())
+ mSessionMetricsStats.setInitializationResult(SATELLITE_RESULT_MODEM_TIMEOUT)
+ .setSatelliteTechnology(getSupportedNtnRadioTechnology())
+ .setInitializationProcessingTime(
+ System.currentTimeMillis() - mSessionProcessingTimeStamp)
.reportSessionMetrics();
+ mSessionStartTimeStamp = 0;
+ mSessionProcessingTimeStamp = 0;
} else {
/*
* Unregister Importance Listener for Pointing UI when Satellite is disabled
@@ -4237,6 +4269,14 @@
mControllerMetricsStats.onSatelliteDisabled();
mWaitingForDisableSatelliteModemResponse = false;
mWaitingForSatelliteModemOff = false;
+ mSessionMetricsStats.setTerminationResult(SATELLITE_RESULT_MODEM_TIMEOUT)
+ .setSatelliteTechnology(getSupportedNtnRadioTechnology())
+ .setTerminationProcessingTime(
+ System.currentTimeMillis() - mSessionProcessingTimeStamp)
+ .setSessionDurationSec(calculateSessionDurationTimeSec())
+ .reportSessionMetrics();
+ mSessionStartTimeStamp = 0;
+ mSessionProcessingTimeStamp = 0;
}
}
}
@@ -4417,6 +4457,14 @@
}
}
+ // Should be invoked only when session termination done or session termination failed.
+ private int calculateSessionDurationTimeSec() {
+ return (int) (
+ (System.currentTimeMillis() - mSessionStartTimeStamp
+ - mSessionMetricsStats.getSessionInitializationProcessingTimeMillis()
+ - mSessionMetricsStats.getSessionTerminationProcessingTimeMillis()) / 1000);
+ }
+
private static void logd(@NonNull String log) {
Rlog.d(TAG, log);
}
diff --git a/src/java/com/android/internal/telephony/satellite/metrics/ProvisionMetricsStats.java b/src/java/com/android/internal/telephony/satellite/metrics/ProvisionMetricsStats.java
index d48c488..0647231 100644
--- a/src/java/com/android/internal/telephony/satellite/metrics/ProvisionMetricsStats.java
+++ b/src/java/com/android/internal/telephony/satellite/metrics/ProvisionMetricsStats.java
@@ -91,7 +91,7 @@
.setIsCanceled(mIsCanceled)
.build();
SatelliteStats.getInstance().onSatelliteProvisionMetrics(provisionParams);
- logd(provisionParams.toString());
+ logd("reportProvisionMetrics: " + provisionParams.toString());
initializeProvisionParams();
}
diff --git a/src/java/com/android/internal/telephony/satellite/metrics/SessionMetricsStats.java b/src/java/com/android/internal/telephony/satellite/metrics/SessionMetricsStats.java
index 6585bec..2effd89 100644
--- a/src/java/com/android/internal/telephony/satellite/metrics/SessionMetricsStats.java
+++ b/src/java/com/android/internal/telephony/satellite/metrics/SessionMetricsStats.java
@@ -32,6 +32,15 @@
private static SessionMetricsStats sInstance = null;
private @SatelliteManager.SatelliteResult int mInitializationResult;
private @SatelliteManager.NTRadioTechnology int mRadioTechnology;
+ private @SatelliteManager.SatelliteResult int mTerminationResult;
+ private long mInitializationProcessingTimeMillis;
+ private long mTerminationProcessingTimeMillis;
+ private int mSessionDurationSec;
+ private int mCountOfSuccessfulOutgoingDatagram;
+ private int mCountOfFailedOutgoingDatagram;
+ private int mCountOfSuccessfulIncomingDatagram;
+ private int mCountOfIncomingDatagramFailed;
+
private SessionMetricsStats() {
initializeSessionMetricsParam();
@@ -42,7 +51,7 @@
* If an instance of the Singleton class has not been created,
* it creates a new instance and returns it. Otherwise, it returns
* the existing instance.
- * @return the Singleton instance of SessionMetricsStats
+ * @return the Singleton instance of SessionMetricsStats.
*/
public static SessionMetricsStats getInstance() {
if (sInstance == null) {
@@ -52,7 +61,7 @@
return sInstance;
}
- /** Sets the satellite initialization result */
+ /** Sets the satellite initialization result. */
public SessionMetricsStats setInitializationResult(
@SatelliteManager.SatelliteResult int result) {
logd("setInitializationResult(" + result + ")");
@@ -60,29 +69,114 @@
return this;
}
- /** Sets the satellite ratio technology */
- public SessionMetricsStats setRadioTechnology(
+ /** Sets the satellite ratio technology. */
+ public SessionMetricsStats setSatelliteTechnology(
@SatelliteManager.NTRadioTechnology int radioTechnology) {
- logd("setRadioTechnology(" + radioTechnology + ")");
+ logd("setSatelliteTechnology(" + radioTechnology + ")");
mRadioTechnology = radioTechnology;
return this;
}
- /** Report the session metrics atoms to PersistAtomsStorage in telephony */
+ /** Sets the satellite de-initialization result. */
+ public SessionMetricsStats setTerminationResult(
+ @SatelliteManager.SatelliteResult int result) {
+ logd("setTerminationResult(" + result + ")");
+ mTerminationResult = result;
+ return this;
+ }
+
+ /** Sets the satellite initialization processing time. */
+ public SessionMetricsStats setInitializationProcessingTime(long processingTime) {
+ logd("setInitializationProcessingTime(" + processingTime + ")");
+ mInitializationProcessingTimeMillis = processingTime;
+ return this;
+ }
+
+ /** Sets the satellite de-initialization processing time. */
+ public SessionMetricsStats setTerminationProcessingTime(long processingTime) {
+ logd("setTerminationProcessingTime(" + processingTime + ")");
+ mTerminationProcessingTimeMillis = processingTime;
+ return this;
+ }
+
+ /** Sets the total enabled time for the satellite session. */
+ public SessionMetricsStats setSessionDurationSec(int sessionDurationSec) {
+ logd("setSessionDuration(" + sessionDurationSec + ")");
+ mSessionDurationSec = sessionDurationSec;
+ return this;
+ }
+
+ /** Increase the count of successful outgoing datagram transmission. */
+ public SessionMetricsStats addCountOfSuccessfulOutgoingDatagram() {
+ mCountOfSuccessfulOutgoingDatagram++;
+ logd("addCountOfSuccessfulOutgoingDatagram: current count="
+ + mCountOfSuccessfulOutgoingDatagram);
+ return this;
+ }
+
+ /** Increase the count of failed outgoing datagram transmission. */
+ public SessionMetricsStats addCountOfFailedOutgoingDatagram() {
+ mCountOfFailedOutgoingDatagram++;
+ logd("addCountOfFailedOutgoingDatagram: current count=" + mCountOfFailedOutgoingDatagram);
+ return this;
+ }
+
+ /** Increase the count of successful incoming datagram transmission. */
+ public SessionMetricsStats addCountOfSuccessfulIncomingDatagram() {
+ mCountOfSuccessfulIncomingDatagram++;
+ logd("addCountOfSuccessfulIncomingDatagram: current count="
+ + mCountOfSuccessfulIncomingDatagram);
+ return this;
+ }
+
+ /** Increase the count of failed incoming datagram transmission. */
+ public SessionMetricsStats addCountOfFailedIncomingDatagram() {
+ mCountOfIncomingDatagramFailed++;
+ logd("addCountOfFailedIncomingDatagram: current count=" + mCountOfIncomingDatagramFailed);
+ return this;
+ }
+
+ /** Report the session metrics atoms to PersistAtomsStorage in telephony. */
public void reportSessionMetrics() {
SatelliteStats.SatelliteSessionParams sessionParams =
new SatelliteStats.SatelliteSessionParams.Builder()
.setSatelliteServiceInitializationResult(mInitializationResult)
.setSatelliteTechnology(mRadioTechnology)
+ .setTerminationResult(mTerminationResult)
+ .setInitializationProcessingTime(mInitializationProcessingTimeMillis)
+ .setTerminationProcessingTime(mTerminationProcessingTimeMillis)
+ .setSessionDuration(mSessionDurationSec)
+ .setCountOfOutgoingDatagramSuccess(mCountOfSuccessfulOutgoingDatagram)
+ .setCountOfOutgoingDatagramFailed(mCountOfFailedOutgoingDatagram)
+ .setCountOfIncomingDatagramSuccess(mCountOfSuccessfulIncomingDatagram)
+ .setCountOfIncomingDatagramFailed(mCountOfIncomingDatagramFailed)
.build();
- logd(sessionParams.toString());
+ logd("reportSessionMetrics: " + sessionParams.toString());
SatelliteStats.getInstance().onSatelliteSessionMetrics(sessionParams);
initializeSessionMetricsParam();
}
+ /** Returns the processing time for satellite session initialization. */
+ public long getSessionInitializationProcessingTimeMillis() {
+ return mInitializationProcessingTimeMillis;
+ }
+
+ /** Returns the processing time for satellite session termination. */
+ public long getSessionTerminationProcessingTimeMillis() {
+ return mTerminationProcessingTimeMillis;
+ }
+
private void initializeSessionMetricsParam() {
mInitializationResult = SatelliteManager.SATELLITE_RESULT_SUCCESS;
mRadioTechnology = SatelliteManager.NT_RADIO_TECHNOLOGY_UNKNOWN;
+ mTerminationResult = SatelliteManager.SATELLITE_RESULT_SUCCESS;
+ mInitializationProcessingTimeMillis = 0;
+ mTerminationProcessingTimeMillis = 0;
+ mSessionDurationSec = 0;
+ mCountOfSuccessfulOutgoingDatagram = 0;
+ mCountOfFailedOutgoingDatagram = 0;
+ mCountOfSuccessfulIncomingDatagram = 0;
+ mCountOfIncomingDatagramFailed = 0;
}
private static void logd(@NonNull String log) {
diff --git a/tests/telephonytests/src/com/android/internal/telephony/metrics/PersistAtomsStorageTest.java b/tests/telephonytests/src/com/android/internal/telephony/metrics/PersistAtomsStorageTest.java
index 75ef7ec..b9f58c4 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/metrics/PersistAtomsStorageTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/metrics/PersistAtomsStorageTest.java
@@ -1123,6 +1123,15 @@
mSatelliteSession1.satelliteTechnology =
SatelliteProtoEnums.NT_RADIO_TECHNOLOGY_PROPRIETARY;
mSatelliteSession1.count = 1;
+ mSatelliteSession1.satelliteServiceTerminationResult =
+ SatelliteProtoEnums.SATELLITE_ERROR_NONE;
+ mSatelliteSession1.initializationProcessingTimeMillis = 100;
+ mSatelliteSession1.terminationProcessingTimeMillis = 200;
+ mSatelliteSession1.sessionDurationSeconds = 3;
+ mSatelliteSession1.countOfOutgoingDatagramSuccess = 1;
+ mSatelliteSession1.countOfOutgoingDatagramFailed = 0;
+ mSatelliteSession1.countOfIncomingDatagramSuccess = 1;
+ mSatelliteSession1.countOfIncomingDatagramFailed = 0;
mSatelliteSession2 = new SatelliteSession();
mSatelliteSession2.satelliteServiceInitializationResult =
@@ -1130,6 +1139,15 @@
mSatelliteSession2.satelliteTechnology =
SatelliteProtoEnums.NT_RADIO_TECHNOLOGY_NB_IOT_NTN;
mSatelliteSession2.count = 1;
+ mSatelliteSession1.satelliteServiceTerminationResult =
+ SatelliteProtoEnums.SATELLITE_ERROR_NONE;
+ mSatelliteSession1.initializationProcessingTimeMillis = 300;
+ mSatelliteSession1.terminationProcessingTimeMillis = 100;
+ mSatelliteSession1.sessionDurationSeconds = 10;
+ mSatelliteSession1.countOfOutgoingDatagramSuccess = 0;
+ mSatelliteSession1.countOfOutgoingDatagramFailed = 2;
+ mSatelliteSession1.countOfIncomingDatagramSuccess = 0;
+ mSatelliteSession1.countOfIncomingDatagramFailed = 1;
mSatelliteSessions =
new SatelliteSession[] {
@@ -4944,7 +4962,22 @@
for (SatelliteSession stats : tested) {
if (stats.satelliteServiceInitializationResult
== expectedStats.satelliteServiceInitializationResult
- && stats.satelliteTechnology == expectedStats.satelliteTechnology) {
+ && stats.satelliteTechnology == expectedStats.satelliteTechnology
+ && stats.satelliteServiceTerminationResult
+ == expectedStats.satelliteServiceTerminationResult
+ && stats.initializationProcessingTimeMillis
+ == expectedStats.initializationProcessingTimeMillis
+ && stats.terminationProcessingTimeMillis
+ == expectedStats.terminationProcessingTimeMillis
+ && stats.sessionDurationSeconds == expectedStats.sessionDurationSeconds
+ && stats.countOfOutgoingDatagramSuccess
+ == expectedStats.countOfOutgoingDatagramSuccess
+ && stats.countOfOutgoingDatagramFailed
+ == expectedStats.countOfOutgoingDatagramFailed
+ && stats.countOfIncomingDatagramSuccess
+ == expectedStats.countOfIncomingDatagramSuccess
+ && stats.countOfIncomingDatagramFailed
+ == expectedStats.countOfIncomingDatagramFailed) {
actualCount = stats.count;
}
}
diff --git a/tests/telephonytests/src/com/android/internal/telephony/metrics/SatelliteStatsTest.java b/tests/telephonytests/src/com/android/internal/telephony/metrics/SatelliteStatsTest.java
index 959b643..0081dc6 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/metrics/SatelliteStatsTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/metrics/SatelliteStatsTest.java
@@ -134,6 +134,14 @@
.setSatelliteServiceInitializationResult(
SatelliteProtoEnums.SATELLITE_ERROR_NONE)
.setSatelliteTechnology(SatelliteProtoEnums.NT_RADIO_TECHNOLOGY_PROPRIETARY)
+ .setTerminationResult(SatelliteProtoEnums.SATELLITE_ERROR_NONE)
+ .setInitializationProcessingTime(100)
+ .setTerminationProcessingTime(200)
+ .setSessionDuration(3)
+ .setCountOfOutgoingDatagramSuccess(1)
+ .setCountOfOutgoingDatagramFailed(0)
+ .setCountOfIncomingDatagramSuccess(1)
+ .setCountOfIncomingDatagramFailed(0)
.build();
mSatelliteStats.onSatelliteSessionMetrics(param);
@@ -144,7 +152,18 @@
SatelliteSession stats = captor.getValue();
assertEquals(param.getSatelliteServiceInitializationResult(),
stats.satelliteServiceInitializationResult);
- assertEquals(param.getSatelliteTechnology(), stats.satelliteTechnology);
+ assertEquals(param.getTerminationResult(), stats.satelliteServiceTerminationResult);
+ assertEquals(param.getInitializationProcessingTime(),
+ stats.initializationProcessingTimeMillis);
+ assertEquals(param.getTerminationProcessingTime(), stats.terminationProcessingTimeMillis);
+ assertEquals(param.getSessionDuration(), stats.sessionDurationSeconds);
+ assertEquals(param.getCountOfOutgoingDatagramSuccess(),
+ stats.countOfOutgoingDatagramSuccess);
+ assertEquals(param.getCountOfOutgoingDatagramFailed(), stats.countOfOutgoingDatagramFailed);
+ assertEquals(param.getCountOfIncomingDatagramSuccess(),
+ stats.countOfIncomingDatagramSuccess);
+ assertEquals(param.getCountOfIncomingDatagramFailed(), stats.countOfIncomingDatagramFailed);
+
verifyNoMoreInteractions(mPersistAtomsStorage);
}
diff --git a/tests/telephonytests/src/com/android/internal/telephony/satellite/DatagramDispatcherTest.java b/tests/telephonytests/src/com/android/internal/telephony/satellite/DatagramDispatcherTest.java
index 3d6f617..3708a47 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/satellite/DatagramDispatcherTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/satellite/DatagramDispatcherTest.java
@@ -61,6 +61,7 @@
import com.android.internal.telephony.PhoneFactory;
import com.android.internal.telephony.TelephonyTest;
import com.android.internal.telephony.satellite.metrics.ControllerMetricsStats;
+import com.android.internal.telephony.satellite.metrics.SessionMetricsStats;
import org.junit.After;
import org.junit.Before;
@@ -100,6 +101,7 @@
@Mock private SatelliteModemInterface mMockSatelliteModemInterface;
@Mock private ControllerMetricsStats mMockControllerMetricsStats;
@Mock private SatelliteSessionController mMockSatelliteSessionController;
+ @Mock private SessionMetricsStats mMockSessionMetricsStats;
/** Variables required to send datagram in the unit tests. */
LinkedBlockingQueue<Integer> mResultListener;
@@ -138,6 +140,8 @@
mMockControllerMetricsStats);
replaceInstance(SatelliteSessionController.class, "sInstance", null,
mMockSatelliteSessionController);
+ replaceInstance(SessionMetricsStats.class, "sInstance", null,
+ mMockSessionMetricsStats);
when(mFeatureFlags.oemEnabledSatelliteFlag()).thenReturn(true);
mDatagramDispatcherUT = new TestDatagramDispatcher(mContext, Looper.myLooper(),
@@ -206,6 +210,7 @@
eq(SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_IDLE), eq(0),
eq(SATELLITE_RESULT_SUCCESS));
verifyNoMoreInteractions(mMockDatagramController);
+ verify(mMockSessionMetricsStats, times(1)).addCountOfSuccessfulOutgoingDatagram();
verify(mMockSatelliteModemInterface, times(1)).sendSatelliteDatagram(
any(SatelliteDatagram.class), anyBoolean(), anyBoolean(), any(Message.class));
assertFalse(mDatagramDispatcherUT.isDatagramWaitForConnectedStateTimerStarted());
@@ -244,6 +249,7 @@
assertThat(mResultListener.peek()).isEqualTo(
SatelliteManager.SATELLITE_RESULT_NOT_REACHABLE);
assertFalse(mDatagramDispatcherUT.isDatagramWaitForConnectedStateTimerStarted());
+ verify(mMockSessionMetricsStats, times(1)).addCountOfFailedOutgoingDatagram();
mResultListener.clear();
mDatagramDispatcherUT.onSatelliteModemStateChanged(
@@ -272,6 +278,7 @@
assertThat(mResultListener.peek()).isEqualTo(
SatelliteManager.SATELLITE_RESULT_REQUEST_ABORTED);
assertFalse(mDatagramDispatcherUT.isDatagramWaitForConnectedStateTimerStarted());
+ verify(mMockSessionMetricsStats, times(1)).addCountOfFailedOutgoingDatagram();
}
@Test
@@ -321,7 +328,7 @@
verify(mMockSatelliteModemInterface, times(1)).sendSatelliteDatagram(
any(SatelliteDatagram.class), anyBoolean(), anyBoolean(), any(Message.class));
assertThat(mResultListener.peek()).isEqualTo(SATELLITE_RESULT_SUCCESS);
-
+ verify(mMockSessionMetricsStats, times(1)).addCountOfSuccessfulOutgoingDatagram();
clearInvocations(mMockSatelliteModemInterface);
clearInvocations(mMockDatagramController);
mResultListener.clear();
@@ -352,6 +359,7 @@
any(SatelliteDatagram.class), anyBoolean(), anyBoolean(), any(Message.class));
verify(mMockSatelliteModemInterface).abortSendingSatelliteDatagrams(any(Message.class));
assertThat(mResultListener.peek()).isEqualTo(SATELLITE_RESULT_MODEM_TIMEOUT);
+ verify(mMockSessionMetricsStats, never()).addCountOfFailedOutgoingDatagram();
}
@Test
@@ -391,6 +399,7 @@
assertThat(mResultListener.peek()).isEqualTo(
SatelliteManager.SATELLITE_RESULT_SERVICE_ERROR);
+ verify(mMockSessionMetricsStats, times(1)).addCountOfFailedOutgoingDatagram();
}
@Test
@@ -426,6 +435,7 @@
eq(SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_IDLE), eq(0),
eq(SATELLITE_RESULT_SUCCESS));
assertThat(mResultListener.peek()).isEqualTo(SATELLITE_RESULT_SUCCESS);
+ verify(mMockSessionMetricsStats, times(1)).addCountOfSuccessfulOutgoingDatagram();
mDatagramDispatcherUT.setDemoMode(false);
mDatagramDispatcherUT.setDeviceAlignedWithSatellite(false);
}
@@ -467,6 +477,7 @@
verify(mMockDatagramController, never()).pollPendingSatelliteDatagrams(anyInt(), any());
verify(mMockDatagramController, never()).pushDemoModeDatagram(
anyInt(), any(SatelliteDatagram.class));
+ verify(mMockSessionMetricsStats, times(1)).addCountOfFailedOutgoingDatagram();
mDatagramDispatcherUT.setDemoMode(false);
mDatagramDispatcherUT.setDeviceAlignedWithSatellite(false);
mDatagramDispatcherUT.setDuration(previousTimer);
@@ -509,6 +520,7 @@
.updateSendStatus(eq(SUB_ID), eq(DATAGRAM_TYPE2),
eq(SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_IDLE), eq(0),
eq(SATELLITE_RESULT_SUCCESS));
+ verify(mMockSessionMetricsStats, times(1)).addCountOfSuccessfulOutgoingDatagram();
mDatagramDispatcherUT.setDemoMode(false);
mDatagramDispatcherUT.setDeviceAlignedWithSatellite(false);
@@ -605,6 +617,7 @@
verify(mMockDatagramController).pushDemoModeDatagram(
anyInt(), any(SatelliteDatagram.class));
verify(mMockDatagramController).pollPendingSatelliteDatagrams(anyInt(), any());
+ verify(mMockSessionMetricsStats, times(1)).addCountOfSuccessfulOutgoingDatagram();
// Test when overlay config config_send_satellite_datagram_to_modem_in_demo_mode is false
reset(mMockSatelliteModemInterface);
diff --git a/tests/telephonytests/src/com/android/internal/telephony/satellite/DatagramReceiverTest.java b/tests/telephonytests/src/com/android/internal/telephony/satellite/DatagramReceiverTest.java
index 0a07f03..7eae18b 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/satellite/DatagramReceiverTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/satellite/DatagramReceiverTest.java
@@ -58,6 +58,7 @@
import com.android.internal.telephony.IVoidConsumer;
import com.android.internal.telephony.TelephonyTest;
import com.android.internal.telephony.satellite.metrics.ControllerMetricsStats;
+import com.android.internal.telephony.satellite.metrics.SessionMetricsStats;
import org.junit.After;
import org.junit.Before;
@@ -90,6 +91,7 @@
@Mock private SatelliteModemInterface mMockSatelliteModemInterface;
@Mock private ControllerMetricsStats mMockControllerMetricsStats;
@Mock private SatelliteSessionController mMockSatelliteSessionController;
+ @Mock private SessionMetricsStats mMockSessionMetricsStats;
/** Variables required to receive datagrams in the unit tests. */
LinkedBlockingQueue<Integer> mResultListener;
@@ -120,6 +122,8 @@
mMockControllerMetricsStats);
replaceInstance(SatelliteSessionController.class, "sInstance", null,
mMockSatelliteSessionController);
+ replaceInstance(SessionMetricsStats.class, "sInstance", null,
+ mMockSessionMetricsStats);
mDatagramReceiverUT = DatagramReceiver.make(mContext, Looper.myLooper(),
mMockDatagramController);
@@ -194,6 +198,7 @@
assertFalse(mDatagramReceiverUT.isDatagramWaitForConnectedStateTimerStarted());
clearInvocations(mMockSatelliteModemInterface);
+ clearInvocations(mMockSessionMetricsStats);
mResultListener.clear();
doReturn(true).when(mMockDatagramController).needsWaitingForSatelliteConnected();
mDatagramReceiverUT.pollPendingSatelliteDatagrams(SUB_ID, mResultListener::offer);
@@ -215,6 +220,7 @@
assertEquals(1, mResultListener.size());
assertThat(mResultListener.peek()).isEqualTo(
SatelliteManager.SATELLITE_RESULT_NOT_REACHABLE);
+ verify(mMockSessionMetricsStats, times(1)).addCountOfFailedIncomingDatagram();
assertFalse(mDatagramReceiverUT.isDatagramWaitForConnectedStateTimerStarted());
mResultListener.clear();
@@ -255,6 +261,8 @@
assertThat(mResultListener.peek()).isEqualTo(
SatelliteManager.SATELLITE_RESULT_SERVICE_ERROR);
+
+ verify(mMockSessionMetricsStats, times(1)).addCountOfFailedIncomingDatagram();
}
@Test
@@ -273,6 +281,8 @@
.updateReceiveStatus(eq(SUB_ID),
eq(SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_IDLE),
eq(0), eq(SatelliteManager.SATELLITE_RESULT_SUCCESS));
+
+ verify(mMockSessionMetricsStats, never()).addCountOfFailedIncomingDatagram();
}
@Test
@@ -295,6 +305,7 @@
eq(SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_IDLE),
eq(0), eq(SatelliteManager.SATELLITE_RESULT_SUCCESS));
assertTrue(testSatelliteDatagramCallback.waitForOnSatelliteDatagramReceived());
+ verify(mMockSessionMetricsStats, times(1)).addCountOfSuccessfulIncomingDatagram();
assertTrue(testSatelliteDatagramCallback.sendInternalAck());
try {
@@ -316,6 +327,7 @@
.updateReceiveStatus(eq(SUB_ID),
eq(SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_RECEIVE_SUCCESS),
eq(10), eq(SatelliteManager.SATELLITE_RESULT_SUCCESS));
+ verify(mMockSessionMetricsStats, times(1)).addCountOfSuccessfulIncomingDatagram();
}
@Test
@@ -376,6 +388,7 @@
eq(SatelliteManager.SATELLITE_RESULT_SUCCESS));
assertThat(mResultListener.peek())
.isEqualTo(SatelliteManager.SATELLITE_RESULT_NOT_REACHABLE);
+ verify(mMockSessionMetricsStats, times(1)).addCountOfFailedIncomingDatagram();
mTestDemoModeDatagramReceiver.setDemoMode(false);
mTestDemoModeDatagramReceiver.setDeviceAlignedWithSatellite(false);
diff --git a/tests/telephonytests/src/com/android/internal/telephony/satellite/SatelliteControllerTest.java b/tests/telephonytests/src/com/android/internal/telephony/satellite/SatelliteControllerTest.java
index 43ca1c6..c38b6a9 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/satellite/SatelliteControllerTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/satellite/SatelliteControllerTest.java
@@ -72,6 +72,7 @@
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyList;
+import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.anyVararg;
import static org.mockito.ArgumentMatchers.eq;
@@ -516,13 +517,21 @@
doReturn(mMockSessionMetricsStats)
.when(mMockSessionMetricsStats).setInitializationResult(anyInt());
doReturn(mMockSessionMetricsStats)
- .when(mMockSessionMetricsStats).setRadioTechnology(anyInt());
+ .when(mMockSessionMetricsStats).setSatelliteTechnology(anyInt());
+ doReturn(mMockSessionMetricsStats)
+ .when(mMockSessionMetricsStats).setTerminationResult(anyInt());
+ doReturn(mMockSessionMetricsStats)
+ .when(mMockSessionMetricsStats).setInitializationProcessingTime(anyLong());
+ doReturn(mMockSessionMetricsStats)
+ .when(mMockSessionMetricsStats).setTerminationProcessingTime(anyLong());
+ doReturn(mMockSessionMetricsStats)
+ .when(mMockSessionMetricsStats).setSessionDurationSec(anyInt());
doNothing().when(mMockSessionMetricsStats).reportSessionMetrics();
doReturn(mMockProvisionMetricsStats).when(mMockProvisionMetricsStats)
.setResultCode(anyInt());
doReturn(mMockProvisionMetricsStats).when(mMockProvisionMetricsStats)
- .setIsProvisionRequest(eq(false));
+ .setIsProvisionRequest(anyBoolean());
doNothing().when(mMockProvisionMetricsStats).reportProvisionMetrics();
doNothing().when(mMockControllerMetricsStats).reportDeprovisionCount(anyInt());
when(mFeatureFlags.oemEnabledSatelliteFlag()).thenReturn(true);
@@ -814,9 +823,6 @@
verify(mMockDatagramController, times(4)).setDemoMode(eq(false));
verify(mMockControllerMetricsStats, times(2)).onSatelliteEnabled();
verify(mMockControllerMetricsStats, times(2)).reportServiceEnablementSuccessCount();
- verify(mMockSessionMetricsStats, times(7)).setInitializationResult(anyInt());
- verify(mMockSessionMetricsStats, times(7)).setRadioTechnology(anyInt());
- verify(mMockSessionMetricsStats, times(7)).reportSessionMetrics();
// Successfully enable satellite when it is already enabled.
mIIntegerConsumerResults.clear();
@@ -904,6 +910,14 @@
assertTrue(waitForIIntegerConsumerResult(1));
assertEquals(SATELLITE_RESULT_INVALID_MODEM_STATE, (long) mIIntegerConsumerResults.get(0));
+ verify(mMockSessionMetricsStats, times(15)).setInitializationResult(anyInt());
+ verify(mMockSessionMetricsStats, times(15)).setSatelliteTechnology(anyInt());
+ verify(mMockSessionMetricsStats, times(3)).setInitializationProcessingTime(anyLong());
+ verify(mMockSessionMetricsStats, times(2)).setTerminationResult(anyInt());
+ verify(mMockSessionMetricsStats, times(2)).setTerminationProcessingTime(anyLong());
+ verify(mMockSessionMetricsStats, times(2)).setSessionDurationSec(anyInt());
+ verify(mMockSessionMetricsStats, times(15)).reportSessionMetrics();
+
/**
* Make areAllRadiosDisabled return false and move mWaitingForRadioDisabled to true, which
* will lead to no response for requestSatelliteEnabled.