@@ -403,6 +403,44 @@ public void testGaugeCounterIsDecrementedWhenLogged() {
403403 assertThat (GaugeCounter .count ()).isEqualTo (priorGaugeCounter );
404404 }
405405
406+ @ Test
407+ public void testDuplicateGaugeLoggingIsAvoided () {
408+ int priorGaugeCounter = GaugeCounter .count ();
409+ PerfSession fakeSession = createTestSession (1 );
410+ testGaugeManager .setApplicationProcessState (ApplicationProcessState .FOREGROUND );
411+ testGaugeManager .startCollectingGauges (fakeSession );
412+ GaugeCounter .setGaugeManager (testGaugeManager );
413+
414+ // There's no job to log the gauges.
415+ assertThat (fakeScheduledExecutorService .isEmpty ()).isTrue ();
416+
417+ generateMetricsAndIncrementCounter (MAX_GAUGE_COUNTER_BEFORE_LOGGING - 20 );
418+
419+ // There's still no job to log the gauges.
420+ assertThat (fakeScheduledExecutorService .isEmpty ()).isTrue ();
421+
422+ generateMetricsAndIncrementCounter (MAX_GAUGE_COUNTER_BEFORE_LOGGING );
423+
424+ assertThat (fakeScheduledExecutorService .isEmpty ()).isFalse ();
425+ assertThat (fakeScheduledExecutorService .getDelayToNextTask (TimeUnit .MILLISECONDS ))
426+ .isEqualTo (TIME_TO_WAIT_BEFORE_FLUSHING_GAUGES_QUEUE_MS );
427+
428+ fakeScheduledExecutorService .simulateSleepExecutingAtMostOneTask ();
429+ assertThat (fakeScheduledExecutorService .isEmpty ()).isTrue ();
430+
431+ GaugeMetric recordedGaugeMetric =
432+ getLastRecordedGaugeMetric (ApplicationProcessState .FOREGROUND );
433+
434+ // It flushes all the metrics in the ConcurrentLinkedQueues that were added.
435+ int recordedGaugeMetricsCount =
436+ recordedGaugeMetric .getAndroidMemoryReadingsCount ()
437+ + recordedGaugeMetric .getCpuMetricReadingsCount ();
438+ assertThat (recordedGaugeMetricsCount ).isEqualTo (2 * MAX_GAUGE_COUNTER_BEFORE_LOGGING - 20 );
439+
440+ assertThat (recordedGaugeMetric .getSessionId ()).isEqualTo (testSessionId (1 ));
441+ assertThat (GaugeCounter .count ()).isEqualTo (priorGaugeCounter );
442+ }
443+
406444 @ Test
407445 public void testUpdateAppStateHandlesMultipleAppStates () {
408446 PerfSession fakeSession = createTestSession (1 );
@@ -564,7 +602,7 @@ public void testLogGaugeMetadataSendDataToTransport() {
564602 testGaugeManager .logGaugeMetadata (testSessionId (1 ));
565603
566604 GaugeMetric recordedGaugeMetric =
567- getLastRecordedGaugeMetric (ApplicationProcessState .FOREGROUND );
605+ getLastRecordedGaugeMetric (ApplicationProcessState .APPLICATION_PROCESS_STATE_UNKNOWN );
568606 GaugeMetadata recordedGaugeMetadata = recordedGaugeMetric .getGaugeMetadata ();
569607
570608 assertThat (recordedGaugeMetric .getSessionId ()).isEqualTo (testSessionId (1 ));
@@ -609,7 +647,7 @@ public void testLogGaugeMetadataLogsAfterApplicationContextIsSet() {
609647 assertThat (testGaugeManager .logGaugeMetadata (testSessionId (1 ))).isTrue ();
610648
611649 GaugeMetric recordedGaugeMetric =
612- getLastRecordedGaugeMetric (ApplicationProcessState .FOREGROUND );
650+ getLastRecordedGaugeMetric (ApplicationProcessState .APPLICATION_PROCESS_STATE_UNKNOWN );
613651 GaugeMetadata recordedGaugeMetadata = recordedGaugeMetric .getGaugeMetadata ();
614652
615653 assertThat (recordedGaugeMetric .getSessionId ()).isEqualTo (testSessionId (1 ));
@@ -675,8 +713,16 @@ private AndroidMemoryReading createFakeAndroidMetricReading(int currentUsedAppJa
675713 private GaugeMetric getLastRecordedGaugeMetric (
676714 ApplicationProcessState expectedApplicationProcessState ) {
677715 ArgumentCaptor <GaugeMetric > argMetric = ArgumentCaptor .forClass (GaugeMetric .class );
678- verify (mockTransportManager , times (1 ))
679- .log (argMetric .capture (), eq (expectedApplicationProcessState ));
716+
717+ // TODO(b/394127311): Revisit transportManager.log method which is only being called in unit
718+ // tests.
719+ if (expectedApplicationProcessState
720+ == ApplicationProcessState .APPLICATION_PROCESS_STATE_UNKNOWN ) {
721+ verify (mockTransportManager , times (1 )).log (argMetric .capture ());
722+ } else {
723+ verify (mockTransportManager , times (1 ))
724+ .log (argMetric .capture (), eq (expectedApplicationProcessState ));
725+ }
680726 reset (mockTransportManager );
681727 // Required after resetting the mock. By default we assume that Transport is initialized.
682728 when (mockTransportManager .isInitialized ()).thenReturn (true );
0 commit comments