Use fresh accounts to update in PushFeedbackProcessor
This commit is contained in:
parent
158d65c6a7
commit
817866caf3
|
@ -60,30 +60,33 @@ public class PushFeedbackProcessor extends AccountDatabaseCrawlerListener {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (update) {
|
if (update) {
|
||||||
account = accountsManager.update(account, a -> {
|
// fetch a new version, since the chunk is shared and implicitly read-only
|
||||||
for (Device device: a.getDevices()) {
|
accountsManager.get(account.getUuid()).ifPresent(accountToUpdate -> {
|
||||||
if (deviceNeedsUpdate(device)) {
|
Account updatedAccount = accountsManager.update(accountToUpdate, a -> {
|
||||||
if (deviceExpired(device)) {
|
for (Device device : a.getDevices()) {
|
||||||
if (!Util.isEmpty(device.getApnId())) {
|
if (deviceNeedsUpdate(device)) {
|
||||||
if (device.getId() == 1) {
|
if (deviceExpired(device)) {
|
||||||
device.setUserAgent("OWI");
|
if (!Util.isEmpty(device.getApnId())) {
|
||||||
} else {
|
if (device.getId() == 1) {
|
||||||
device.setUserAgent("OWP");
|
device.setUserAgent("OWI");
|
||||||
|
} else {
|
||||||
|
device.setUserAgent("OWP");
|
||||||
|
}
|
||||||
|
} else if (!Util.isEmpty(device.getGcmId())) {
|
||||||
|
device.setUserAgent("OWA");
|
||||||
}
|
}
|
||||||
} else if (!Util.isEmpty(device.getGcmId())) {
|
device.setGcmId(null);
|
||||||
device.setUserAgent("OWA");
|
device.setApnId(null);
|
||||||
|
device.setVoipApnId(null);
|
||||||
|
device.setFetchesMessages(false);
|
||||||
|
} else {
|
||||||
|
device.setUninstalledFeedbackTimestamp(0);
|
||||||
}
|
}
|
||||||
device.setGcmId(null);
|
|
||||||
device.setApnId(null);
|
|
||||||
device.setVoipApnId(null);
|
|
||||||
device.setFetchesMessages(false);
|
|
||||||
} else {
|
|
||||||
device.setUninstalledFeedbackTimestamp(0);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
});
|
||||||
|
directoryUpdateAccounts.add(updatedAccount);
|
||||||
});
|
});
|
||||||
directoryUpdateAccounts.add(account);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -15,6 +15,7 @@ import static org.mockito.Mockito.never;
|
||||||
import static org.mockito.Mockito.verify;
|
import static org.mockito.Mockito.verify;
|
||||||
import static org.mockito.Mockito.verifyZeroInteractions;
|
import static org.mockito.Mockito.verifyZeroInteractions;
|
||||||
import static org.mockito.Mockito.when;
|
import static org.mockito.Mockito.when;
|
||||||
|
import static org.whispersystems.textsecuregcm.tests.util.AccountsHelper.eqUuid;
|
||||||
|
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -83,6 +84,11 @@ class PushFeedbackProcessorTest {
|
||||||
when(stillActiveAccount.getDevices()).thenReturn(Set.of(stillActiveDevice));
|
when(stillActiveAccount.getDevices()).thenReturn(Set.of(stillActiveDevice));
|
||||||
when(undiscoverableAccount.getDevices()).thenReturn(Set.of(undiscoverableDevice));
|
when(undiscoverableAccount.getDevices()).thenReturn(Set.of(undiscoverableDevice));
|
||||||
|
|
||||||
|
when(mixedAccount.getUuid()).thenReturn(UUID.randomUUID());
|
||||||
|
when(freshAccount.getUuid()).thenReturn(UUID.randomUUID());
|
||||||
|
when(cleanAccount.getUuid()).thenReturn(UUID.randomUUID());
|
||||||
|
when(stillActiveAccount.getUuid()).thenReturn(UUID.randomUUID());
|
||||||
|
|
||||||
when(uninstalledAccount.isEnabled()).thenReturn(true);
|
when(uninstalledAccount.isEnabled()).thenReturn(true);
|
||||||
when(uninstalledAccount.isDiscoverableByPhoneNumber()).thenReturn(true);
|
when(uninstalledAccount.isDiscoverableByPhoneNumber()).thenReturn(true);
|
||||||
when(uninstalledAccount.getUuid()).thenReturn(UUID.randomUUID());
|
when(uninstalledAccount.getUuid()).thenReturn(UUID.randomUUID());
|
||||||
|
@ -92,6 +98,8 @@ class PushFeedbackProcessorTest {
|
||||||
when(undiscoverableAccount.isDiscoverableByPhoneNumber()).thenReturn(false);
|
when(undiscoverableAccount.isDiscoverableByPhoneNumber()).thenReturn(false);
|
||||||
when(undiscoverableAccount.getUuid()).thenReturn(UUID.randomUUID());
|
when(undiscoverableAccount.getUuid()).thenReturn(UUID.randomUUID());
|
||||||
when(undiscoverableAccount.getNumber()).thenReturn("+18005559876");
|
when(undiscoverableAccount.getNumber()).thenReturn("+18005559876");
|
||||||
|
|
||||||
|
AccountsHelper.setupMockGet(accountsManager, Set.of(uninstalledAccount, mixedAccount, freshAccount, cleanAccount, stillActiveAccount, undiscoverableAccount));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -113,7 +121,7 @@ class PushFeedbackProcessorTest {
|
||||||
verify(uninstalledDevice).setGcmId(isNull());
|
verify(uninstalledDevice).setGcmId(isNull());
|
||||||
verify(uninstalledDevice).setFetchesMessages(eq(false));
|
verify(uninstalledDevice).setFetchesMessages(eq(false));
|
||||||
|
|
||||||
verify(accountsManager).update(eq(uninstalledAccount), any());
|
verify(accountsManager).update(eqUuid(uninstalledAccount), any());
|
||||||
|
|
||||||
verify(uninstalledDeviceTwo).setApnId(isNull());
|
verify(uninstalledDeviceTwo).setApnId(isNull());
|
||||||
verify(uninstalledDeviceTwo).setGcmId(isNull());
|
verify(uninstalledDeviceTwo).setGcmId(isNull());
|
||||||
|
@ -123,26 +131,26 @@ class PushFeedbackProcessorTest {
|
||||||
verify(installedDevice, never()).setGcmId(any());
|
verify(installedDevice, never()).setGcmId(any());
|
||||||
verify(installedDevice, never()).setFetchesMessages(anyBoolean());
|
verify(installedDevice, never()).setFetchesMessages(anyBoolean());
|
||||||
|
|
||||||
verify(accountsManager).update(eq(mixedAccount), any());
|
verify(accountsManager).update(eqUuid(mixedAccount), any());
|
||||||
|
|
||||||
verify(recentUninstalledDevice, never()).setApnId(any());
|
verify(recentUninstalledDevice, never()).setApnId(any());
|
||||||
verify(recentUninstalledDevice, never()).setGcmId(any());
|
verify(recentUninstalledDevice, never()).setGcmId(any());
|
||||||
verify(recentUninstalledDevice, never()).setFetchesMessages(anyBoolean());
|
verify(recentUninstalledDevice, never()).setFetchesMessages(anyBoolean());
|
||||||
|
|
||||||
verify(accountsManager, never()).update(eq(freshAccount), any());
|
verify(accountsManager, never()).update(eqUuid(freshAccount), any());
|
||||||
|
|
||||||
verify(installedDeviceTwo, never()).setApnId(any());
|
verify(installedDeviceTwo, never()).setApnId(any());
|
||||||
verify(installedDeviceTwo, never()).setGcmId(any());
|
verify(installedDeviceTwo, never()).setGcmId(any());
|
||||||
verify(installedDeviceTwo, never()).setFetchesMessages(anyBoolean());
|
verify(installedDeviceTwo, never()).setFetchesMessages(anyBoolean());
|
||||||
|
|
||||||
verify(accountsManager, never()).update(eq(cleanAccount), any());
|
verify(accountsManager, never()).update(eqUuid(cleanAccount), any());
|
||||||
|
|
||||||
verify(stillActiveDevice).setUninstalledFeedbackTimestamp(eq(0L));
|
verify(stillActiveDevice).setUninstalledFeedbackTimestamp(eq(0L));
|
||||||
verify(stillActiveDevice, never()).setApnId(any());
|
verify(stillActiveDevice, never()).setApnId(any());
|
||||||
verify(stillActiveDevice, never()).setGcmId(any());
|
verify(stillActiveDevice, never()).setGcmId(any());
|
||||||
verify(stillActiveDevice, never()).setFetchesMessages(anyBoolean());
|
verify(stillActiveDevice, never()).setFetchesMessages(anyBoolean());
|
||||||
|
|
||||||
verify(accountsManager).update(eq(stillActiveAccount), any());
|
verify(accountsManager).update(eqUuid(stillActiveAccount), any());
|
||||||
|
|
||||||
final ArgumentCaptor<List<Account>> refreshedAccountArgumentCaptor = ArgumentCaptor.forClass(List.class);
|
final ArgumentCaptor<List<Account>> refreshedAccountArgumentCaptor = ArgumentCaptor.forClass(List.class);
|
||||||
verify(directoryQueue).refreshRegisteredUsers(refreshedAccountArgumentCaptor.capture());
|
verify(directoryQueue).refreshRegisteredUsers(refreshedAccountArgumentCaptor.capture());
|
||||||
|
|
|
@ -14,6 +14,8 @@ import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.UUID;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
import org.mockito.MockingDetails;
|
import org.mockito.MockingDetails;
|
||||||
import org.mockito.stubbing.Stubbing;
|
import org.mockito.stubbing.Stubbing;
|
||||||
|
@ -40,6 +42,24 @@ public class AccountsHelper {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void setupMockGet(final AccountsManager mockAccountsManager, final Set<Account> mockAccounts) {
|
||||||
|
when(mockAccountsManager.get(any(UUID.class))).thenAnswer(answer -> {
|
||||||
|
|
||||||
|
final UUID uuid = answer.getArgument(0, UUID.class);
|
||||||
|
|
||||||
|
return mockAccounts.stream()
|
||||||
|
.filter(account -> uuid.equals(account.getUuid()))
|
||||||
|
.findFirst()
|
||||||
|
.map(account -> {
|
||||||
|
try {
|
||||||
|
return copyAndMarkStale(account);
|
||||||
|
} catch (final Exception e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
private static Account copyAndMarkStale(Account account) throws IOException {
|
private static Account copyAndMarkStale(Account account) throws IOException {
|
||||||
MockingDetails mockingDetails = mockingDetails(account);
|
MockingDetails mockingDetails = mockingDetails(account);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue