Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e4786400 authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Fix unregister callbacks bug" into main

parents 7561f717 e728730c
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -159,7 +159,7 @@ public class ProtoLogDataSource extends DataSource<ProtoLogDataSource.Instance,
     * @param onStartCallback The callback object to unregister.
     */
    public void unregisterOnStartCallback(Instance.TracingInstanceStartCallback onStartCallback) {
        mOnStartCallbacks.add(onStartCallback);
        mOnStartCallbacks.remove(onStartCallback);
    }

    /**
@@ -167,7 +167,7 @@ public class ProtoLogDataSource extends DataSource<ProtoLogDataSource.Instance,
     * @param onFlushCallback The callback object to unregister.
     */
    public void unregisterOnFlushCallback(Instance.TracingFlushCallback onFlushCallback) {
        mOnFlushCallbacks.add(onFlushCallback);
        mOnFlushCallbacks.remove(onFlushCallback);
    }

    /**
@@ -175,7 +175,7 @@ public class ProtoLogDataSource extends DataSource<ProtoLogDataSource.Instance,
     * @param onStopCallback The callback object to unregister.
     */
    public void unregisterOnStopCallback(Instance.TracingInstanceStopCallback onStopCallback) {
        mOnStopCallbacks.add(onStopCallback);
        mOnStopCallbacks.remove(onStopCallback);
    }

    private synchronized void executeOnStartCallbacks(int instanceIdx, ProtoLogConfig config) {
+50 −0
Original line number Diff line number Diff line
@@ -144,6 +144,56 @@ public class ProtologDataSourceTest {
        Truth.assertThat(tlsState.getShouldCollectStacktrace("UNKNOWN_TAG")).isFalse();
    }

    @Test
    public void registerAndUnregisterAllCallbacksSuccessfully() {
        final ProtoLogDataSource ds = new ProtoLogDataSource();
        ProtoLogDataSource.Instance.TracingInstanceStartCallback mockStartCallback =
                Mockito.mock(ProtoLogDataSource.Instance.TracingInstanceStartCallback.class);
        // Updated type for mockFlushCallback
        ProtoLogDataSource.Instance.TracingFlushCallback mockFlushCallback =
                Mockito.mock(ProtoLogDataSource.Instance.TracingFlushCallback.class);
        ProtoLogDataSource.Instance.TracingInstanceStopCallback mockStopCallback =
                Mockito.mock(ProtoLogDataSource.Instance.TracingInstanceStopCallback.class);

        // Register all callbacks
        ds.registerOnStartCallback(mockStartCallback);
        ds.registerOnFlushCallback(mockFlushCallback);
        ds.registerOnStopCallback(mockStopCallback);

        // Simulate events to trigger callbacks
        ProtoLogDataSource.Instance instance1 = ds.createInstance(new ProtoInputStream(
                DataSourceConfigOuterClass.DataSourceConfig.newBuilder().build().toByteArray()), 0);
        instance1.onStart(Mockito.mock(android.tracing.perfetto.StartCallbackArguments.class));
        instance1.onFlush(Mockito.mock(android.tracing.perfetto.FlushCallbackArguments.class));
        instance1.onStop(Mockito.mock(android.tracing.perfetto.StopCallbackArguments.class));

        // Verify callbacks were called once with correct methods and arguments
        Mockito.verify(mockStartCallback, Mockito.times(1)).onTracingInstanceStart(Mockito.anyInt(),
                Mockito.any(ProtoLogDataSource.ProtoLogConfig.class));
        Mockito.verify(mockFlushCallback, Mockito.times(1)).onTracingFlush();
        Mockito.verify(mockStopCallback, Mockito.times(1)).onTracingInstanceStop(Mockito.anyInt(),
                Mockito.any(ProtoLogDataSource.ProtoLogConfig.class));

        // Unregister all callbacks
        ds.unregisterOnStartCallback(mockStartCallback);
        ds.unregisterOnFlushCallback(mockFlushCallback);
        ds.unregisterOnStopCallback(mockStopCallback);

        // Simulate events again
        ProtoLogDataSource.Instance instance2 = ds.createInstance(new ProtoInputStream(
                DataSourceConfigOuterClass.DataSourceConfig.newBuilder().build().toByteArray()), 1);
        instance2.onStart(Mockito.mock(android.tracing.perfetto.StartCallbackArguments.class));
        instance2.onFlush(Mockito.mock(android.tracing.perfetto.FlushCallbackArguments.class));
        instance2.onStop(Mockito.mock(android.tracing.perfetto.StopCallbackArguments.class));

        // Verify callbacks were not called again (still only once in total)
        Mockito.verify(mockStartCallback, Mockito.times(1)).onTracingInstanceStart(Mockito.anyInt(),
                Mockito.any(ProtoLogDataSource.ProtoLogConfig.class));
        Mockito.verify(mockFlushCallback, Mockito.times(1)).onTracingFlush();
        Mockito.verify(mockStopCallback, Mockito.times(1)).onTracingInstanceStop(Mockito.anyInt(),
                Mockito.any(ProtoLogDataSource.ProtoLogConfig.class));
    }

    private ProtoLogDataSource.TlsState createTlsState(
            DataSourceConfigOuterClass.DataSourceConfig config) {
        final ProtoLogDataSource ds = Mockito.spy(new ProtoLogDataSource());