diff options
14 files changed, 440 insertions, 43 deletions
diff --git a/proto/src/persist_atoms.proto b/proto/src/persist_atoms.proto index f158806458..d779e0178f 100644 --- a/proto/src/persist_atoms.proto +++ b/proto/src/persist_atoms.proto @@ -671,6 +671,14 @@ message SatelliteSession { 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 a0dc89d424..33423276e4 100644 --- a/src/java/com/android/internal/telephony/metrics/MetricsCollector.java +++ b/src/java/com/android/internal/telephony/metrics/MetricsCollector.java @@ -1374,7 +1374,15 @@ public class MetricsCollector implements StatsManager.StatsPullAtomCallback { 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 d0ef25245d..3710589c9b 100644 --- a/src/java/com/android/internal/telephony/metrics/PersistAtomsStorage.java +++ b/src/java/com/android/internal/telephony/metrics/PersistAtomsStorage.java @@ -2109,7 +2109,17 @@ public class PersistAtomsStorage { 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 55eee1a212..b58e62a13f 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 SatelliteStats { 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 @@ public class SatelliteStats { 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 @@ public class SatelliteStats { 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 @@ public class SatelliteStats { 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 @@ public class SatelliteStats { 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 2d052b6dfd..7ead441709 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.annotations.VisibleForTesting; 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 @@ public class DatagramDispatcher extends Handler { @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 @@ public class DatagramDispatcher extends Handler { mContext = context; mDatagramController = datagramController; mControllerMetricsStats = ControllerMetricsStats.getInstance(); + mSessionMetricsStats = SessionMetricsStats.getInstance(); synchronized (mLock) { mSendingDatagramInProgress = false; @@ -276,6 +279,7 @@ public class DatagramDispatcher extends Handler { getPendingDatagramCount(), error); mControllerMetricsStats.reportOutgoingDatagramSuccessCount( argument.datagramType); + mSessionMetricsStats.addCountOfSuccessfulOutgoingDatagram(); startWaitForSimulatedPollDatagramsDelayTimer(request); if (getPendingDatagramCount() > 0) { // Send response for current datagram @@ -304,6 +308,7 @@ public class DatagramDispatcher extends Handler { // Abort sending all the pending datagrams mControllerMetricsStats.reportOutgoingDatagramFailCount( argument.datagramType); + mSessionMetricsStats.addCountOfFailedOutgoingDatagram(); abortSendingPendingDatagrams(argument.subId, SatelliteManager.SATELLITE_RESULT_REQUEST_ABORTED); } @@ -593,8 +598,10 @@ public class DatagramDispatcher extends Handler { .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 @@ public class DatagramDispatcher extends Handler { 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 a4b1193455..94b4bd368c 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.IVoidConsumer; 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 @@ public class DatagramReceiver extends Handler { @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 @@ public class DatagramReceiver extends Handler { mContentResolver = context.getContentResolver(); mDatagramController = datagramController; mControllerMetricsStats = ControllerMetricsStats.getInstance(); + mSessionMetricsStats = SessionMetricsStats.getInstance(); try { mSharedPreferences = @@ -354,9 +358,6 @@ public class DatagramReceiver extends Handler { obtainMessage(EVENT_RETRY_DELIVERING_RECEIVED_DATAGRAM, argument), getTimeoutToReceiveAck()); }); - - sInstance.mControllerMetricsStats.reportIncomingDatagramCount( - SatelliteManager.SATELLITE_RESULT_SUCCESS); } if (pendingCount <= 0) { @@ -377,8 +378,8 @@ public class DatagramReceiver extends Handler { } // 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 @@ public class DatagramReceiver extends Handler { 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 @@ public class DatagramReceiver extends Handler { 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 @@ public class DatagramReceiver extends Handler { 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 @@ public class DatagramReceiver extends Handler { .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 @@ public class DatagramReceiver extends Handler { 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 4b387c8d6d..2d28c9c4ff 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 @@ public class SatelliteController extends Handler { @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 @@ public class SatelliteController extends Handler { private final BTWifiNFCStateReceiver mBTWifiNFCSateReceiver; private final UwbAdapterStateCallback mUwbAdapterStateCallback; + private long mSessionStartTimeStamp; + private long mSessionProcessingTimeStamp; + /** * @return The singleton instance of SatelliteController. */ @@ -464,6 +468,7 @@ public class SatelliteController extends Handler { // 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 @@ public class SatelliteController extends Handler { } 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 @@ public class SatelliteController extends Handler { } else { callback.accept(result); } + mProvisionMetricsStats.setResultCode(result) + .setIsProvisionRequest(true) + .reportProvisionMetrics(); + mControllerMetricsStats.reportProvisionCount(result); } private void handleEventDeprovisionSatelliteServiceDone( @@ -3103,6 +3125,12 @@ public class SatelliteController extends Handler { 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 @@ public class SatelliteController extends Handler { 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 @@ public class SatelliteController extends Handler { 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 @@ public class SatelliteController extends Handler { 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 @@ public class SatelliteController extends Handler { } } + // 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 d48c4880ad..064723142c 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 @@ public class ProvisionMetricsStats { .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 6585bec7de..2effd89eff 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 @@ public class SessionMetricsStats { 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 @@ public class SessionMetricsStats { * 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 @@ public class SessionMetricsStats { 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 @@ public class SessionMetricsStats { 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 bc79a564ed..3df6200441 100644 --- a/tests/telephonytests/src/com/android/internal/telephony/metrics/PersistAtomsStorageTest.java +++ b/tests/telephonytests/src/com/android/internal/telephony/metrics/PersistAtomsStorageTest.java @@ -1137,6 +1137,15 @@ public class PersistAtomsStorageTest extends TelephonyTest { 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 = @@ -1144,6 +1153,15 @@ public class PersistAtomsStorageTest extends TelephonyTest { 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[] { @@ -5095,7 +5113,22 @@ public class PersistAtomsStorageTest extends TelephonyTest { 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 959b643aec..0081dc69f0 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 @@ public class SatelliteStatsTest extends TelephonyTest { .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 @@ public class SatelliteStatsTest extends TelephonyTest { 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 3d6f61715b..3708a478ad 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.Phone; 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 @@ public class DatagramDispatcherTest extends TelephonyTest { @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 @@ public class DatagramDispatcherTest extends TelephonyTest { 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 @@ public class DatagramDispatcherTest extends TelephonyTest { 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 @@ public class DatagramDispatcherTest extends TelephonyTest { 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 @@ public class DatagramDispatcherTest extends TelephonyTest { assertThat(mResultListener.peek()).isEqualTo( SatelliteManager.SATELLITE_RESULT_REQUEST_ABORTED); assertFalse(mDatagramDispatcherUT.isDatagramWaitForConnectedStateTimerStarted()); + verify(mMockSessionMetricsStats, times(1)).addCountOfFailedOutgoingDatagram(); } @Test @@ -321,7 +328,7 @@ public class DatagramDispatcherTest extends TelephonyTest { 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 @@ public class DatagramDispatcherTest extends TelephonyTest { 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 @@ public class DatagramDispatcherTest extends TelephonyTest { assertThat(mResultListener.peek()).isEqualTo( SatelliteManager.SATELLITE_RESULT_SERVICE_ERROR); + verify(mMockSessionMetricsStats, times(1)).addCountOfFailedOutgoingDatagram(); } @Test @@ -426,6 +435,7 @@ public class DatagramDispatcherTest extends TelephonyTest { 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 @@ public class DatagramDispatcherTest extends TelephonyTest { 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 @@ public class DatagramDispatcherTest extends TelephonyTest { .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 @@ public class DatagramDispatcherTest extends TelephonyTest { 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 0a07f03071..7eae18b9e9 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 android.util.Pair; 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 @@ public class DatagramReceiverTest extends TelephonyTest { @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 @@ public class DatagramReceiverTest extends TelephonyTest { mMockControllerMetricsStats); replaceInstance(SatelliteSessionController.class, "sInstance", null, mMockSatelliteSessionController); + replaceInstance(SessionMetricsStats.class, "sInstance", null, + mMockSessionMetricsStats); mDatagramReceiverUT = DatagramReceiver.make(mContext, Looper.myLooper(), mMockDatagramController); @@ -194,6 +198,7 @@ public class DatagramReceiverTest extends TelephonyTest { assertFalse(mDatagramReceiverUT.isDatagramWaitForConnectedStateTimerStarted()); clearInvocations(mMockSatelliteModemInterface); + clearInvocations(mMockSessionMetricsStats); mResultListener.clear(); doReturn(true).when(mMockDatagramController).needsWaitingForSatelliteConnected(); mDatagramReceiverUT.pollPendingSatelliteDatagrams(SUB_ID, mResultListener::offer); @@ -215,6 +220,7 @@ public class DatagramReceiverTest extends TelephonyTest { 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 @@ public class DatagramReceiverTest extends TelephonyTest { assertThat(mResultListener.peek()).isEqualTo( SatelliteManager.SATELLITE_RESULT_SERVICE_ERROR); + + verify(mMockSessionMetricsStats, times(1)).addCountOfFailedIncomingDatagram(); } @Test @@ -273,6 +281,8 @@ public class DatagramReceiverTest extends TelephonyTest { .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 @@ public class DatagramReceiverTest extends TelephonyTest { 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 @@ public class DatagramReceiverTest extends TelephonyTest { .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 @@ public class DatagramReceiverTest extends TelephonyTest { 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 43ca1c6eb8..c38b6a9e94 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.any; 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 @@ public class SatelliteControllerTest extends TelephonyTest { 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 @@ public class SatelliteControllerTest extends TelephonyTest { 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 @@ public class SatelliteControllerTest extends TelephonyTest { 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. |