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

Commit e728730c authored by Pablo Gamito's avatar Pablo Gamito
Browse files

Fix unregister callbacks bug

The methods `unregisterOnStartCallback`, `unregisterOnFlushCallback` and `unregisterOnStopCallback` were adding to the list instead of removing from the list...

Flag: EXEMPT small bug fix
Change-Id: I87130afefafb6b4eae32b796043839bc7fc3fa98
parent 2042b4a4
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());