Skip to content

Commit

Permalink
Track segments sync by Key
Browse files Browse the repository at this point in the history
  • Loading branch information
gthea committed Dec 3, 2024
1 parent ff03a85 commit 015180d
Show file tree
Hide file tree
Showing 9 changed files with 57 additions and 43 deletions.
9 changes: 5 additions & 4 deletions src/androidTest/java/fake/SynchronizerSpyImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.atomic.AtomicInteger;

import io.split.android.client.api.Key;
import io.split.android.client.dtos.Event;
import io.split.android.client.impressions.Impression;
import io.split.android.client.service.synchronizer.Synchronizer;
Expand Down Expand Up @@ -122,12 +123,12 @@ public void unregisterAttributesSynchronizer(String userKey) {
}

@Override
public void registerMySegmentsSynchronizer(String userKey, MySegmentsSynchronizer mySegmentsSynchronizer) {
((MySegmentsSynchronizerRegistry) mSynchronizer).registerMySegmentsSynchronizer(userKey, mySegmentsSynchronizer);
public void registerMySegmentsSynchronizer(Key key, MySegmentsSynchronizer mySegmentsSynchronizer) {
((MySegmentsSynchronizerRegistry) mSynchronizer).registerMySegmentsSynchronizer(key, mySegmentsSynchronizer);
}

@Override
public void unregisterMySegmentsSynchronizer(String userKey) {
((MySegmentsSynchronizerRegistry) mSynchronizer).unregisterMySegmentsSynchronizer(userKey);
public void unregisterMySegmentsSynchronizer(Key key) {
((MySegmentsSynchronizerRegistry) mSynchronizer).unregisterMySegmentsSynchronizer(key);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,14 @@ public void telemetryOccupancySecStreamingEvent() throws InterruptedException, I
pushOccupancy(SECONDARY_CHANNEL, 1);
sleep(2000);

List<StreamingEvent> streamingEvents = mTelemetryStorage.popStreamingEvents();
long startTime = System.currentTimeMillis();
List<StreamingEvent> streamingEvents = new ArrayList<>();
streamingEvents = mTelemetryStorage.popStreamingEvents();
while (System.currentTimeMillis() - startTime < 5000 &&
!streamingEvents.stream().anyMatch(event -> event instanceof OccupancySecStreamingEvent)) {
Thread.sleep(100);
streamingEvents = mTelemetryStorage.popStreamingEvents();
}
assertTrue(streamingEvents.stream().anyMatch(event -> event instanceof OccupancySecStreamingEvent));
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@

import io.split.android.client.RetryBackoffCounterTimerFactory;
import io.split.android.client.SplitClientConfig;
import io.split.android.client.api.Key;
import io.split.android.client.dtos.Event;
import io.split.android.client.events.ISplitEventsManager;
import io.split.android.client.impressions.Impression;
Expand Down Expand Up @@ -259,13 +260,13 @@ public void pushImpression(Impression impression) {
}

@Override
public void registerMySegmentsSynchronizer(String userKey, MySegmentsSynchronizer mySegmentsSynchronizer) {
mMySegmentsSynchronizerRegistry.registerMySegmentsSynchronizer(userKey, mySegmentsSynchronizer);
public void registerMySegmentsSynchronizer(Key key, MySegmentsSynchronizer mySegmentsSynchronizer) {
mMySegmentsSynchronizerRegistry.registerMySegmentsSynchronizer(key, mySegmentsSynchronizer);
}

@Override
public void unregisterMySegmentsSynchronizer(String userKey) {
mMySegmentsSynchronizerRegistry.unregisterMySegmentsSynchronizer(userKey);
public void unregisterMySegmentsSynchronizer(Key key) {
mMySegmentsSynchronizerRegistry.unregisterMySegmentsSynchronizer(key);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
package io.split.android.client.service.synchronizer.mysegments;

import io.split.android.client.api.Key;

public interface MySegmentsSynchronizerRegistry {

void registerMySegmentsSynchronizer(String userKey, MySegmentsSynchronizer mySegmentsSynchronizer);
void registerMySegmentsSynchronizer(Key key, MySegmentsSynchronizer mySegmentsSynchronizer);

void unregisterMySegmentsSynchronizer(String userKey);
void unregisterMySegmentsSynchronizer(Key key);
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.atomic.AtomicBoolean;

import io.split.android.client.api.Key;
import io.split.android.client.service.mysegments.MySegmentUpdateParams;

public class MySegmentsSynchronizerRegistryImpl implements MySegmentsSynchronizerRegistry,
Expand All @@ -15,23 +16,23 @@ public class MySegmentsSynchronizerRegistryImpl implements MySegmentsSynchronize
private final AtomicBoolean mSynchronizedSegments = new AtomicBoolean(false);
private final AtomicBoolean mScheduledSegmentsSyncTask = new AtomicBoolean(false);
private final AtomicBoolean mStoppedPeriodicFetching = new AtomicBoolean(false);
private final ConcurrentMap<String, MySegmentsSynchronizer> mMySegmentsSynchronizers = new ConcurrentHashMap<>();
private final ConcurrentMap<Key, MySegmentsSynchronizer> mMySegmentsSynchronizers = new ConcurrentHashMap<>();

@Override
public synchronized void registerMySegmentsSynchronizer(String userKey, MySegmentsSynchronizer mySegmentsSynchronizer) {
mMySegmentsSynchronizers.put(userKey, mySegmentsSynchronizer);
public synchronized void registerMySegmentsSynchronizer(Key key, MySegmentsSynchronizer mySegmentsSynchronizer) {
mMySegmentsSynchronizers.put(key, mySegmentsSynchronizer);
triggerPendingActions(mySegmentsSynchronizer);
}

@Override
public synchronized void unregisterMySegmentsSynchronizer(String userKey) {
MySegmentsSynchronizer mySegmentsSynchronizer = mMySegmentsSynchronizers.get(userKey);
public synchronized void unregisterMySegmentsSynchronizer(Key key) {
MySegmentsSynchronizer mySegmentsSynchronizer = mMySegmentsSynchronizers.get(key);
if (mySegmentsSynchronizer != null) {
mySegmentsSynchronizer.stopPeriodicFetching();
mySegmentsSynchronizer.destroy();
}

mMySegmentsSynchronizers.remove(userKey);
mMySegmentsSynchronizers.remove(key);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ public void registerComponents(Key key, SplitEventsManager eventsManager, MySegm
@Override
public void unregisterComponentsForKey(Key key) {
mAttributesSynchronizerRegistry.unregisterAttributesSynchronizer(key.matchingKey());
mMySegmentsSynchronizerRegistry.unregisterMySegmentsSynchronizer(key.matchingKey());
mMySegmentsSynchronizerRegistry.unregisterMySegmentsSynchronizer(key);
mEventsManagerRegistry.unregisterEventsManager(key);

if (isSyncEnabled()) {
Expand All @@ -116,7 +116,7 @@ private void registerAttributesSynchronizer(Key key, SplitEventsManager eventsMa
}

private void registerMySegmentsSynchronizer(Key key, MySegmentsSynchronizer mySegmentsSynchronizer) {
mMySegmentsSynchronizerRegistry.registerMySegmentsSynchronizer(key.matchingKey(),
mMySegmentsSynchronizerRegistry.registerMySegmentsSynchronizer(key,
mySegmentsSynchronizer);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@

import io.split.android.client.RetryBackoffCounterTimerFactory;
import io.split.android.client.SplitClientConfig;
import io.split.android.client.api.Key;
import io.split.android.client.dtos.Event;
import io.split.android.client.dtos.KeyImpression;
import io.split.android.client.dtos.SplitChange;
Expand Down Expand Up @@ -243,7 +244,7 @@ public void splitExecutorSchedule() {
verify(mWorkManagerWrapper).removeWork();
verify(mWorkManagerWrapper, never()).scheduleWork();

mSynchronizer.unregisterMySegmentsSynchronizer("userKey");
mSynchronizer.unregisterMySegmentsSynchronizer(new Key("userKey"));
}

@Test
Expand Down Expand Up @@ -544,7 +545,7 @@ public void loadLocalData() {
when(loadMySegmentsTask.execute()).thenReturn(SplitTaskExecutionInfo.success(SplitTaskType.LOAD_LOCAL_MY_SEGMENTS));
when(mMySegmentsTaskFactory.createLoadMySegmentsTask()).thenReturn(loadMySegmentsTask);

((MySegmentsSynchronizerRegistry) mSynchronizer).registerMySegmentsSynchronizer("", mMySegmentsSynchronizer);
((MySegmentsSynchronizerRegistry) mSynchronizer).registerMySegmentsSynchronizer(new Key(""), mMySegmentsSynchronizer);

mSynchronizer.loadAndSynchronizeSplits();
mSynchronizer.loadMySegmentsFromCache();
Expand Down Expand Up @@ -775,9 +776,9 @@ public void reschedulingEventsTaskCancelsPreviousWhenCallingSequentially() {
public void registerMySegmentsSynchronizerDelegatesToRegistry() {
setup(SplitClientConfig.builder().synchronizeInBackground(false).build());

mSynchronizer.registerMySegmentsSynchronizer("userKey", mMySegmentsSynchronizer);
mSynchronizer.registerMySegmentsSynchronizer(new Key("userKey"), mMySegmentsSynchronizer);

verify(mMySegmentsSynchronizerRegistry).registerMySegmentsSynchronizer("userKey", mMySegmentsSynchronizer);
verify(mMySegmentsSynchronizerRegistry).registerMySegmentsSynchronizer(new Key("userKey"), mMySegmentsSynchronizer);
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import org.junit.Before;
import org.junit.Test;

import io.split.android.client.api.Key;
import io.split.android.client.service.mysegments.MySegmentUpdateParams;

public class MySegmentsSynchronizerRegistryImplTest {
Expand All @@ -21,7 +22,7 @@ public void setUp() {
public void loadMySegmentsFromCacheGetCalledInEveryRegisteredSync() {
MySegmentsSynchronizer syncMock = mock(MySegmentsSynchronizer.class);

mRegistry.registerMySegmentsSynchronizer("key", syncMock);
mRegistry.registerMySegmentsSynchronizer(new Key("key"), syncMock);
mRegistry.loadMySegmentsFromCache();

verify(syncMock).loadMySegmentsFromCache();
Expand All @@ -31,7 +32,7 @@ public void loadMySegmentsFromCacheGetCalledInEveryRegisteredSync() {
public void synchronizeMySegmentsGetCalledInEveryRegisteredSync() {
MySegmentsSynchronizer syncMock = mock(MySegmentsSynchronizer.class);

mRegistry.registerMySegmentsSynchronizer("key", syncMock);
mRegistry.registerMySegmentsSynchronizer(new Key("key"), syncMock);
mRegistry.synchronizeMySegments();

verify(syncMock).synchronizeMySegments();
Expand All @@ -42,7 +43,7 @@ public void forceMySegmentsSyncGetCalledInEveryRegisteredSync() {
MySegmentsSynchronizer syncMock = mock(MySegmentsSynchronizer.class);
MySegmentUpdateParams params = new MySegmentUpdateParams(4L, 1L, 2L);

mRegistry.registerMySegmentsSynchronizer("key", syncMock);
mRegistry.registerMySegmentsSynchronizer(new Key("key"), syncMock);
mRegistry.forceMySegmentsSync(params);

verify(syncMock).forceMySegmentsSync(params);
Expand All @@ -52,7 +53,7 @@ public void forceMySegmentsSyncGetCalledInEveryRegisteredSync() {
public void destroyGetCalledInEveryRegisteredSync() {
MySegmentsSynchronizer syncMock = mock(MySegmentsSynchronizer.class);

mRegistry.registerMySegmentsSynchronizer("key", syncMock);
mRegistry.registerMySegmentsSynchronizer(new Key("key"), syncMock);
mRegistry.destroy();

verify(syncMock).destroy();
Expand All @@ -62,7 +63,7 @@ public void destroyGetCalledInEveryRegisteredSync() {
public void scheduleSegmentsSyncTaskGetCalledInEveryRegisteredSync() {
MySegmentsSynchronizer syncMock = mock(MySegmentsSynchronizer.class);

mRegistry.registerMySegmentsSynchronizer("key", syncMock);
mRegistry.registerMySegmentsSynchronizer(new Key("key"), syncMock);
mRegistry.scheduleSegmentsSyncTask();

verify(syncMock).scheduleSegmentsSyncTask();
Expand All @@ -72,7 +73,7 @@ public void scheduleSegmentsSyncTaskGetCalledInEveryRegisteredSync() {
public void submitMySegmentsLoadingTaskGetCalledInEveryRegisteredSync() {
MySegmentsSynchronizer syncMock = mock(MySegmentsSynchronizer.class);

mRegistry.registerMySegmentsSynchronizer("key", syncMock);
mRegistry.registerMySegmentsSynchronizer(new Key("key"), syncMock);
mRegistry.submitMySegmentsLoadingTask();

verify(syncMock).submitMySegmentsLoadingTask();
Expand All @@ -82,7 +83,7 @@ public void submitMySegmentsLoadingTaskGetCalledInEveryRegisteredSync() {
public void stopPeriodicFetchingGetCalledInEveryRegisteredSync() {
MySegmentsSynchronizer syncMock = mock(MySegmentsSynchronizer.class);

mRegistry.registerMySegmentsSynchronizer("key", syncMock);
mRegistry.registerMySegmentsSynchronizer(new Key("key"), syncMock);
mRegistry.stopPeriodicFetching();

verify(syncMock).stopPeriodicFetching();
Expand All @@ -92,8 +93,8 @@ public void stopPeriodicFetchingGetCalledInEveryRegisteredSync() {
public void unregisterStopsTasksBeforeRemovingSync() {
MySegmentsSynchronizer syncMock = mock(MySegmentsSynchronizer.class);

mRegistry.registerMySegmentsSynchronizer("key", syncMock);
mRegistry.unregisterMySegmentsSynchronizer("key");
mRegistry.registerMySegmentsSynchronizer(new Key("key"), syncMock);
mRegistry.unregisterMySegmentsSynchronizer(new Key("key"));

verify(syncMock).stopPeriodicFetching();
verify(syncMock).destroy();
Expand All @@ -105,10 +106,10 @@ public void callLoadSegmentsFromCacheForNewlyRegisteredSyncIfNecessary() {
MySegmentsSynchronizer syncMock2 = mock(MySegmentsSynchronizer.class);
MySegmentsSynchronizer syncMock3 = mock(MySegmentsSynchronizer.class);

mRegistry.registerMySegmentsSynchronizer("key", syncMock);
mRegistry.registerMySegmentsSynchronizer(new Key("key"), syncMock);
mRegistry.loadMySegmentsFromCache();
mRegistry.registerMySegmentsSynchronizer("new_key", syncMock2);
mRegistry.registerMySegmentsSynchronizer("new_key", syncMock3);
mRegistry.registerMySegmentsSynchronizer(new Key("new_key"), syncMock2);
mRegistry.registerMySegmentsSynchronizer(new Key("new_key"), syncMock3);

verify(syncMock2).loadMySegmentsFromCache();
verify(syncMock3).loadMySegmentsFromCache();
Expand All @@ -120,10 +121,10 @@ public void callSynchronizeMySegmentsForNewlyRegisteredSyncIfNecessary() {
MySegmentsSynchronizer syncMock2 = mock(MySegmentsSynchronizer.class);
MySegmentsSynchronizer syncMock3 = mock(MySegmentsSynchronizer.class);

mRegistry.registerMySegmentsSynchronizer("key", syncMock);
mRegistry.registerMySegmentsSynchronizer(new Key("key"), syncMock);
mRegistry.synchronizeMySegments();
mRegistry.registerMySegmentsSynchronizer("new_key", syncMock2);
mRegistry.registerMySegmentsSynchronizer("new_key", syncMock3);
mRegistry.registerMySegmentsSynchronizer(new Key("new_key"), syncMock2);
mRegistry.registerMySegmentsSynchronizer(new Key("new_key"), syncMock3);

verify(syncMock2).synchronizeMySegments();
verify(syncMock3).synchronizeMySegments();
Expand All @@ -135,10 +136,10 @@ public void callScheduleSegmentsSyncTaskForNewlyRegisteredSyncIfNecessary() {
MySegmentsSynchronizer syncMock2 = mock(MySegmentsSynchronizer.class);
MySegmentsSynchronizer syncMock3 = mock(MySegmentsSynchronizer.class);

mRegistry.registerMySegmentsSynchronizer("key", syncMock);
mRegistry.registerMySegmentsSynchronizer(new Key("key"), syncMock);
mRegistry.scheduleSegmentsSyncTask();
mRegistry.registerMySegmentsSynchronizer("new_key", syncMock2);
mRegistry.registerMySegmentsSynchronizer("new_key", syncMock3);
mRegistry.registerMySegmentsSynchronizer(new Key("new_key"), syncMock2);
mRegistry.registerMySegmentsSynchronizer(new Key("new_key"), syncMock3);

verify(syncMock2).scheduleSegmentsSyncTask();
verify(syncMock3).scheduleSegmentsSyncTask();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ public void attributesSynchronizerIsRegistered() {
public void mySegmentsSynchronizerIsRegistered() {
register.registerComponents(mMatchingKey, mSplitEventsManager, mMySegmentsTaskFactory);

verify(mMySegmentsSynchronizerRegistry).registerMySegmentsSynchronizer("matching_key", mMySegmentsSynchronizer);
verify(mMySegmentsSynchronizerRegistry).registerMySegmentsSynchronizer(new Key("matching_key", "bucketing_key"), mMySegmentsSynchronizer);
}

@Test
Expand Down Expand Up @@ -120,7 +120,7 @@ public void componentsAreCorrectlyUnregistered() {
register.unregisterComponentsForKey(mMatchingKey);

verify(mAttributesSynchronizerRegistry).unregisterAttributesSynchronizer("matching_key");
verify(mMySegmentsSynchronizerRegistry).unregisterMySegmentsSynchronizer("matching_key");
verify(mMySegmentsSynchronizerRegistry).unregisterMySegmentsSynchronizer(new Key("matching_key", "bucketing_key"));
verify(mMySegmentsUpdateWorkerRegistry).unregisterMySegmentsUpdateWorker("matching_key");
verify(mMySegmentsNotificationProcessorRegistry).unregisterMembershipsProcessor("matching_key");
verify(mEventsManagerRegistry).unregisterEventsManager(mMatchingKey);
Expand Down

0 comments on commit 015180d

Please sign in to comment.