Excise PowerMock and reenable like a bunch of ignored tests.

Co-authored-by: Rashad Sookram <rashad@signal.org>
fork-5.53.8
Alex Hart 2022-03-10 12:31:48 -04:00 zatwierdzone przez Cody Henthorne
rodzic 1f82ceecc6
commit 711148423d
25 zmienionych plików z 342 dodań i 631 usunięć

Wyświetl plik

@ -524,10 +524,6 @@ dependencies {
testImplementation testLibs.junit.junit
testImplementation testLibs.assertj.core
testImplementation testLibs.mockito.core
testImplementation testLibs.powermock.api.mockito
testImplementation testLibs.powermock.module.junit4.core
testImplementation testLibs.powermock.module.junit4.rule
testImplementation testLibs.powermock.classloading.xstream
testImplementation testLibs.androidx.test.core
testImplementation (testLibs.robolectric.robolectric) {

Wyświetl plik

@ -8,63 +8,75 @@ import android.preference.PreferenceManager;
import android.text.TextUtils;
import org.junit.Before;
import org.junit.Rule;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockedConstruction;
import org.mockito.MockedStatic;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule;
import org.mockito.stubbing.Answer;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import org.signal.core.util.logging.Log;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyBoolean;
import static org.mockito.Matchers.anyFloat;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.anyLong;
import static org.mockito.Matchers.anyString;
import static org.powermock.api.mockito.PowerMockito.mock;
import static org.powermock.api.mockito.PowerMockito.mockStatic;
import static org.powermock.api.mockito.PowerMockito.when;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyFloat;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@RunWith(PowerMockRunner.class)
@PrepareForTest({ Log.class, Handler.class, Looper.class, TextUtils.class, PreferenceManager.class })
public abstract class BaseUnitTest {
@Rule
public MockitoRule rule = MockitoJUnit.rule();
@Mock
private MockedStatic<Looper> looperMockedStatic;
@Mock
private MockedStatic<Log> logMockedStatic;
@Mock
private MockedStatic<Handler> handlerMockedStatic;
@Mock
private MockedStatic<TextUtils> textUtilsMockedStatic;
@Mock
private MockedStatic<PreferenceManager> preferenceManagerMockedStatic;
@Mock
private MockedConstruction<Handler> handlerMockedConstruction;
protected Context context = mock(Context.class);
protected SharedPreferences sharedPreferences = mock(SharedPreferences.class);
@Before
public void setUp() throws Exception {
mockStatic(Looper.class);
mockStatic(Log.class);
mockStatic(Handler.class);
mockStatic(TextUtils.class);
mockStatic(PreferenceManager.class);
when(PreferenceManager.getDefaultSharedPreferences(any(Context.class))).thenReturn(sharedPreferences);
when(Looper.getMainLooper()).thenReturn(null);
PowerMockito.whenNew(Handler.class).withAnyArguments().thenReturn(null);
Answer<?> logAnswer = new Answer<Void>() {
@Override public Void answer(InvocationOnMock invocation) throws Throwable {
final String tag = (String)invocation.getArguments()[0];
final String msg = (String)invocation.getArguments()[1];
System.out.println(invocation.getMethod().getName().toUpperCase() + "/[" + tag + "] " + msg);
return null;
}
Answer<?> logAnswer = (Answer<Void>) invocation -> {
final String tag = (String)invocation.getArguments()[0];
final String msg = (String)invocation.getArguments()[1];
System.out.println(invocation.getMethod().getName().toUpperCase() + "/[" + tag + "] " + msg);
return null;
};
PowerMockito.doAnswer(logAnswer).when(Log.class, "d", anyString(), anyString());
PowerMockito.doAnswer(logAnswer).when(Log.class, "i", anyString(), anyString());
PowerMockito.doAnswer(logAnswer).when(Log.class, "w", anyString(), anyString());
PowerMockito.doAnswer(logAnswer).when(Log.class, "e", anyString(), anyString());
PowerMockito.doAnswer(new Answer<Boolean>() {
@Override
public Boolean answer(InvocationOnMock invocation) throws Throwable {
final String s = (String)invocation.getArguments()[0];
return s == null || s.length() == 0;
}
}).when(TextUtils.class, "isEmpty", anyString());
logMockedStatic.when(() -> Log.d(anyString(), anyString())).thenAnswer(logAnswer);
logMockedStatic.when(() -> Log.i(anyString(), anyString())).thenAnswer(logAnswer);
logMockedStatic.when(() -> Log.w(anyString(), anyString())).thenAnswer(logAnswer);
logMockedStatic.when(() -> Log.e(anyString(), anyString())).thenAnswer(logAnswer);
Answer<Boolean> isEmptyAnswer = invocation -> {
final String s = (String)invocation.getArguments()[0];
return s == null || s.length() == 0;
};
textUtilsMockedStatic.when(() -> TextUtils.isEmpty(anyString())).thenAnswer(isEmptyAnswer);
when(sharedPreferences.getString(anyString(), anyString())).thenReturn("");
when(sharedPreferences.getLong(anyString(), anyLong())).thenReturn(0L);

Wyświetl plik

@ -8,10 +8,11 @@ import org.junit.Ignore;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PowerMockIgnore;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.rule.PowerMockRule;
import org.mockito.Mock;
import org.mockito.MockedConstruction;
import org.mockito.MockedStatic;
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule;
import org.robolectric.ParameterizedRobolectricTestRunner;
import org.robolectric.annotation.Config;
import org.thoughtcrime.securesms.crypto.AttachmentSecretProvider;
@ -25,15 +26,15 @@ import java.util.Collection;
import static org.junit.Assert.assertEquals;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@Ignore("PowerMock failing")
@RunWith(ParameterizedRobolectricTestRunner.class)
@Config(manifest = Config.NONE, application = Application.class)
@PowerMockIgnore({"org.mockito.*", "org.robolectric.*", "android.*", "androidx.*", "org.powermock.*" })
@PrepareForTest({ApplicationDependencies.class, AttachmentSecretProvider.class, SignalStore.class, InternalValues.class})
public class EmojiUtilTest_isEmoji {
public @Rule PowerMockRule rule = new PowerMockRule();
@Rule
public MockitoRule rule = MockitoJUnit.rule();
private final String input;
private final boolean output;
@ -60,6 +61,17 @@ public class EmojiUtilTest_isEmoji {
});
}
@Mock
private MockedStatic<ApplicationDependencies> applicationDependenciesMockedStatic;
@Mock
private MockedStatic<AttachmentSecretProvider> attachmentSecretProviderMockedStatic;
@Mock
private MockedStatic<SignalStore> signalStoreMockedStatic;
@Mock
private MockedConstruction<SignalStore> signalStoreMockedConstruction;
public EmojiUtilTest_isEmoji(String input, boolean output) {
this.input = input;
@ -70,13 +82,9 @@ public class EmojiUtilTest_isEmoji {
public void isEmoji() throws Exception {
Application application = ApplicationProvider.getApplicationContext();
PowerMockito.mockStatic(ApplicationDependencies.class);
PowerMockito.when(ApplicationDependencies.getApplication()).thenReturn(application);
PowerMockito.mockStatic(AttachmentSecretProvider.class);
PowerMockito.when(AttachmentSecretProvider.getInstance(any())).thenThrow(RuntimeException.class);
PowerMockito.whenNew(SignalStore.class).withAnyArguments().thenReturn(null);
PowerMockito.mockStatic(SignalStore.class);
PowerMockito.when(SignalStore.internalValues()).thenReturn(PowerMockito.mock(InternalValues.class));
when(ApplicationDependencies.getApplication()).thenReturn(application);
when(AttachmentSecretProvider.getInstance(any())).thenThrow(RuntimeException.class);
when(SignalStore.internalValues()).thenReturn(mock(InternalValues.class));
EmojiSource.refresh();
assertEquals(output, EmojiUtil.isEmoji(input));

Wyświetl plik

@ -9,9 +9,10 @@ import org.junit.Ignore;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.core.classloader.annotations.PowerMockIgnore;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.rule.PowerMockRule;
import org.mockito.Mock;
import org.mockito.MockedStatic;
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;
import org.thoughtcrime.securesms.conversationlist.model.ConversationReader;
@ -23,22 +24,24 @@ import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.anyLong;
import static org.mockito.Matchers.eq;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.powermock.api.mockito.PowerMockito.mock;
import static org.powermock.api.mockito.PowerMockito.mockStatic;
import static org.powermock.api.mockito.PowerMockito.when;
import static org.mockito.Mockito.when;
@Ignore("PowerMock failing")
@RunWith(RobolectricTestRunner.class)
@Config(manifest = Config.NONE, application = Application.class)
@PowerMockIgnore({ "org.mockito.*", "org.robolectric.*", "android.*", "androidx.*", "org.powermock.*" })
@PrepareForTest({ ApplicationDependencies.class, SignalDatabase.class, DatabaseObserver.class })
public class UnarchivedConversationListDataSourceTest {
@Rule
public PowerMockRule rule = new PowerMockRule();
public MockitoRule rule = MockitoJUnit.rule();
@Mock
private MockedStatic<ApplicationDependencies> applicationDependenciesMockedStatic;
@Mock
private MockedStatic<SignalDatabase> signalDatabaseMockedStatic;
private ConversationListDataSource.UnarchivedConversationListDataSource testSubject;
@ -46,9 +49,6 @@ public class UnarchivedConversationListDataSourceTest {
@Before
public void setUp() {
mockStatic(ApplicationDependencies.class);
mockStatic(SignalDatabase.class);
threadDatabase = mock(ThreadDatabase.class);
when(SignalDatabase.threads()).thenReturn(threadDatabase);

Wyświetl plik

@ -13,7 +13,7 @@ import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
import static org.mockito.Matchers.anyInt;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

Wyświetl plik

@ -9,13 +9,15 @@ import androidx.test.core.app.ApplicationProvider;
import com.annimon.stream.Stream;
import com.google.common.collect.ImmutableMap;
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.core.classloader.annotations.PowerMockIgnore;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.rule.PowerMockRule;
import org.mockito.Mock;
import org.mockito.MockedStatic;
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;
import org.signal.core.util.ThreadUtil;
@ -24,8 +26,6 @@ import org.signal.storageservice.protos.groups.local.DecryptedGroup;
import org.signal.storageservice.protos.groups.local.DecryptedGroupChange;
import org.signal.storageservice.protos.groups.local.DecryptedMember;
import org.signal.storageservice.protos.groups.local.DecryptedPendingMember;
import org.thoughtcrime.securesms.testutil.MainThreadUtil;
import org.whispersystems.signalservice.api.push.ACI;
import org.whispersystems.signalservice.api.push.ServiceId;
import org.whispersystems.signalservice.api.util.UuidUtil;
@ -35,22 +35,21 @@ import java.util.Map;
import java.util.UUID;
import java.util.stream.Collectors;
import static java.util.Collections.emptyList;
import static java.util.Collections.singletonList;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mockStatic;
import static org.thoughtcrime.securesms.groups.v2.ChangeBuilder.changeBy;
import static org.thoughtcrime.securesms.groups.v2.ChangeBuilder.changeByUnknown;
import static org.thoughtcrime.securesms.util.StringUtil.isolateBidi;
import static java.util.Collections.emptyList;
import static java.util.Collections.singletonList;
@RunWith(RobolectricTestRunner.class)
@Config(manifest = Config.NONE, application = Application.class)
@PowerMockIgnore({ "org.mockito.*", "org.robolectric.*", "android.*", "androidx.*" })
@PrepareForTest(ThreadUtil.class)
public final class GroupsV2UpdateMessageProducerTest {
private UUID you;
@ -60,7 +59,10 @@ public final class GroupsV2UpdateMessageProducerTest {
private GroupsV2UpdateMessageProducer producer;
@Rule
public PowerMockRule powerMockRule = new PowerMockRule();
public MockitoRule rule = MockitoJUnit.rule();
@Mock
public MockedStatic<ThreadUtil> threadUtilMockedStatic;
@Before
public void setup() {
@ -69,6 +71,9 @@ public final class GroupsV2UpdateMessageProducerTest {
bob = UUID.randomUUID();
GroupsV2UpdateMessageProducer.DescribeMemberStrategy describeMember = createDescriber(ImmutableMap.of(alice, "Alice", bob, "Bob"));
producer = new GroupsV2UpdateMessageProducer(ApplicationProvider.getApplicationContext(), describeMember, you);
threadUtilMockedStatic.when(ThreadUtil::assertMainThread).thenCallRealMethod();
threadUtilMockedStatic.when(ThreadUtil::assertNotMainThread).thenCallRealMethod();
}
@Test
@ -1332,7 +1337,7 @@ public final class GroupsV2UpdateMessageProducerTest {
private @NonNull List<String> describeChange(@Nullable DecryptedGroup previousGroupState,
@NonNull DecryptedGroupChange change)
{
MainThreadUtil.setMainThread(false);
threadUtilMockedStatic.when(ThreadUtil::isMainThread).thenReturn(false);
return Stream.of(producer.describeChanges(previousGroupState, change))
.map(UpdateDescription::getString)
.toList();
@ -1343,7 +1348,7 @@ public final class GroupsV2UpdateMessageProducerTest {
}
private @NonNull String describeNewGroup(@NonNull DecryptedGroup group, @NonNull DecryptedGroupChange groupChange) {
MainThreadUtil.setMainThread(false);
threadUtilMockedStatic.when(ThreadUtil::isMainThread).thenReturn(false);
return producer.describeNewGroup(group, groupChange).getString();
}

Wyświetl plik

@ -1,12 +1,13 @@
package org.thoughtcrime.securesms.database.model;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import org.mockito.Mock;
import org.mockito.MockedStatic;
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule;
import org.signal.core.util.ThreadUtil;
import org.whispersystems.signalservice.api.push.ACI;
import org.whispersystems.signalservice.api.push.ServiceId;
import java.util.Arrays;
@ -18,15 +19,20 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import static org.thoughtcrime.securesms.testutil.MainThreadUtil.setMainThread;
@RunWith(PowerMockRunner.class)
@PrepareForTest(ThreadUtil.class)
public final class UpdateDescriptionTest {
@Rule
public MockitoRule rule = MockitoJUnit.rule();
@Mock
private MockedStatic<ThreadUtil> threadUtilMockedStatic;
@Before
public void setup() {
setMainThread(true);
threadUtilMockedStatic.when(ThreadUtil::isMainThread).thenReturn(true);
threadUtilMockedStatic.when(ThreadUtil::assertMainThread).thenCallRealMethod();
threadUtilMockedStatic.when(ThreadUtil::assertNotMainThread).thenCallRealMethod();
}
@Test
@ -54,7 +60,7 @@ public final class UpdateDescriptionTest {
public void stringFactory_cannot_run_on_main_thread() {
UpdateDescription description = UpdateDescription.mentioning(Collections.singletonList(ServiceId.from(UUID.randomUUID())), () -> "update", 0);
setMainThread(true);
threadUtilMockedStatic.when(ThreadUtil::isMainThread).thenReturn(true);
description.getString();
}
@ -79,7 +85,7 @@ public final class UpdateDescriptionTest {
assertEquals(0, factoryCalls.get());
setMainThread(false);
threadUtilMockedStatic.when(ThreadUtil::isMainThread).thenReturn(false);
String string = description.getString();
@ -93,7 +99,7 @@ public final class UpdateDescriptionTest {
UpdateDescription.StringFactory stringFactory = () -> "call" + factoryCalls.incrementAndGet();
UpdateDescription description = UpdateDescription.mentioning(Collections.singletonList(ServiceId.from(UUID.randomUUID())), stringFactory, 0);
setMainThread(false);
threadUtilMockedStatic.when(ThreadUtil::isMainThread).thenReturn(false);
assertEquals("call1", description.getString());
assertEquals("call2", description.getString());
@ -137,7 +143,7 @@ public final class UpdateDescriptionTest {
assertFalse(description.isStringStatic());
setMainThread(false);
threadUtilMockedStatic.when(ThreadUtil::isMainThread).thenReturn(false);
assertEquals("update.11\nupdate.21", description.getString());
assertEquals("update.12\nupdate.22", description.getString());
@ -161,7 +167,7 @@ public final class UpdateDescriptionTest {
assertFalse(description.isStringStatic());
setMainThread(false);
threadUtilMockedStatic.when(ThreadUtil::isMainThread).thenReturn(false);
assertEquals("update.101\nstatic\nupdate.201", description.getString());
assertEquals("update.102\nstatic\nupdate.202", description.getString());

Wyświetl plik

@ -13,7 +13,7 @@ import java.util.Arrays;
import java.util.Collections;
import static org.junit.Assert.assertEquals;
import static org.mockito.Matchers.any;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;

Wyświetl plik

@ -1,10 +1,12 @@
package org.thoughtcrime.securesms.jobmanager.migrations;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import org.mockito.Mock;
import org.mockito.MockedStatic;
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule;
import org.thoughtcrime.securesms.jobmanager.Data;
import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.jobmanager.JobMigration.JobData;
@ -15,18 +17,18 @@ import org.thoughtcrime.securesms.recipients.Recipient;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.powermock.api.mockito.PowerMockito.mock;
import static org.powermock.api.mockito.PowerMockito.mockStatic;
import static org.mockito.Mockito.mock;
@RunWith(PowerMockRunner.class)
@PrepareForTest({ Recipient.class, Job.Parameters.class })
public class RecipientIdFollowUpJobMigrationTest {
@Before
public void init() {
mockStatic(Recipient.class);
mockStatic(Job.Parameters.class);
}
@Rule
public MockitoRule rule = MockitoJUnit.rule();
@Mock
private MockedStatic<Recipient> recipientMockedStatic;
@Mock
private MockedStatic<Job.Parameters> jobParametersMockedStatic;
@Test
public void migrate_requestGroupInfoJob_good() throws Exception {

Wyświetl plik

@ -4,10 +4,13 @@ import android.app.Application;
import android.content.Context;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import org.mockito.Mock;
import org.mockito.MockedStatic;
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule;
import org.thoughtcrime.securesms.jobmanager.Data;
import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.jobmanager.JobMigration.JobData;
@ -34,22 +37,22 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.eq;
import static org.powermock.api.mockito.PowerMockito.doReturn;
import static org.powermock.api.mockito.PowerMockito.mock;
import static org.powermock.api.mockito.PowerMockito.mockStatic;
import static org.powermock.api.mockito.PowerMockito.when;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@RunWith(PowerMockRunner.class)
@PrepareForTest({ Recipient.class, Job.Parameters.class })
public class RecipientIdJobMigrationTest {
@Before
public void init() {
mockStatic(Recipient.class);
mockStatic(Job.Parameters.class);
}
@Rule
public MockitoRule rule = MockitoJUnit.rule();
@Mock
private MockedStatic<Recipient> recipientMockedStatic;
@Mock
private MockedStatic<Job.Parameters> jobParametersMockStatic;
@Test
public void migrate_multiDeviceContactUpdateJob() throws Exception {
@ -348,8 +351,9 @@ public class RecipientIdJobMigrationTest {
new SmsSendJob.Factory().create(mock(Job.Parameters.class), converted.getData());
}
private void mockRecipientResolve(String address, long recipientId) throws Exception {
doReturn(mockRecipient(recipientId)).when(Recipient.class, "external", any(Context.class), eq(address));
private void mockRecipientResolve(String address, long recipientId) {
Recipient mockRecipient = mockRecipient(recipientId);
recipientMockedStatic.when(() -> Recipient.external(any(), eq(address))).thenReturn(mockRecipient);
}
private Recipient mockRecipient(long id) {

Wyświetl plik

@ -11,7 +11,7 @@ import java.util.ArrayList;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.anyLong;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

Wyświetl plik

@ -7,10 +7,11 @@ import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import org.powermock.api.mockito.PowerMockito
import org.powermock.core.classloader.annotations.PowerMockIgnore
import org.powermock.core.classloader.annotations.PrepareForTest
import org.powermock.modules.junit4.rule.PowerMockRule
import org.mockito.Mock
import org.mockito.MockedStatic
import org.mockito.Mockito.`when`
import org.mockito.junit.MockitoJUnit
import org.mockito.junit.MockitoRule
import org.robolectric.RobolectricTestRunner
import org.robolectric.annotation.Config
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies
@ -19,20 +20,19 @@ import org.thoughtcrime.securesms.util.FeatureFlags
@RunWith(RobolectricTestRunner::class)
@Config(manifest = Config.NONE, application = Application::class)
@PowerMockIgnore("org.mockito.*", "org.robolectric.*", "android.*", "androidx.*", "org.powermock.*")
@PrepareForTest(FeatureFlags::class)
class PaymentsValuesTest {
@get:Rule
val powerMockRule = PowerMockRule()
@Rule
@JvmField val mockitoRule: MockitoRule = MockitoJUnit.rule()
@Mock
private lateinit var featureFlags: MockedStatic<FeatureFlags>
@Before
fun setup() {
if (!ApplicationDependencies.isInitialized()) {
ApplicationDependencies.init(ApplicationProvider.getApplicationContext(), MockApplicationDependencyProvider())
}
PowerMockito.mockStatic(FeatureFlags::class.java)
}
@Test
@ -56,8 +56,8 @@ class PaymentsValuesTest {
}
)
PowerMockito.`when`(FeatureFlags.payments()).thenReturn(false)
PowerMockito.`when`(FeatureFlags.paymentsCountryBlocklist()).thenReturn("")
`when`(FeatureFlags.payments()).thenReturn(false)
`when`(FeatureFlags.paymentsCountryBlocklist()).thenReturn("")
assertEquals(PaymentsAvailability.DISABLED_REMOTELY, SignalStore.paymentsValues().paymentsAvailability)
}
@ -72,8 +72,8 @@ class PaymentsValuesTest {
}
)
PowerMockito.`when`(FeatureFlags.payments()).thenReturn(false)
PowerMockito.`when`(FeatureFlags.paymentsCountryBlocklist()).thenReturn("")
`when`(FeatureFlags.payments()).thenReturn(false)
`when`(FeatureFlags.paymentsCountryBlocklist()).thenReturn("")
assertEquals(PaymentsAvailability.WITHDRAW_ONLY, SignalStore.paymentsValues().paymentsAvailability)
}
@ -88,8 +88,8 @@ class PaymentsValuesTest {
}
)
PowerMockito.`when`(FeatureFlags.payments()).thenReturn(true)
PowerMockito.`when`(FeatureFlags.paymentsCountryBlocklist()).thenReturn("")
`when`(FeatureFlags.payments()).thenReturn(true)
`when`(FeatureFlags.paymentsCountryBlocklist()).thenReturn("")
assertEquals(PaymentsAvailability.REGISTRATION_AVAILABLE, SignalStore.paymentsValues().paymentsAvailability)
}
@ -104,8 +104,8 @@ class PaymentsValuesTest {
}
)
PowerMockito.`when`(FeatureFlags.payments()).thenReturn(true)
PowerMockito.`when`(FeatureFlags.paymentsCountryBlocklist()).thenReturn("")
`when`(FeatureFlags.payments()).thenReturn(true)
`when`(FeatureFlags.paymentsCountryBlocklist()).thenReturn("")
assertEquals(PaymentsAvailability.WITHDRAW_AND_SEND, SignalStore.paymentsValues().paymentsAvailability)
}
@ -120,8 +120,8 @@ class PaymentsValuesTest {
}
)
PowerMockito.`when`(FeatureFlags.payments()).thenReturn(true)
PowerMockito.`when`(FeatureFlags.paymentsCountryBlocklist()).thenReturn("1")
`when`(FeatureFlags.payments()).thenReturn(true)
`when`(FeatureFlags.paymentsCountryBlocklist()).thenReturn("1")
assertEquals(PaymentsAvailability.NOT_IN_REGION, SignalStore.paymentsValues().paymentsAvailability)
}
@ -136,8 +136,8 @@ class PaymentsValuesTest {
}
)
PowerMockito.`when`(FeatureFlags.payments()).thenReturn(true)
PowerMockito.`when`(FeatureFlags.paymentsCountryBlocklist()).thenReturn("1")
`when`(FeatureFlags.payments()).thenReturn(true)
`when`(FeatureFlags.paymentsCountryBlocklist()).thenReturn("1")
assertEquals(PaymentsAvailability.WITHDRAW_ONLY, SignalStore.paymentsValues().paymentsAvailability)
}

Wyświetl plik

@ -10,11 +10,11 @@ import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.ArgumentMatchers
import org.powermock.api.mockito.PowerMockito
import org.powermock.api.mockito.PowerMockito.mockStatic
import org.powermock.core.classloader.annotations.PowerMockIgnore
import org.powermock.core.classloader.annotations.PrepareForTest
import org.powermock.modules.junit4.rule.PowerMockRule
import org.mockito.Mock
import org.mockito.MockedStatic
import org.mockito.Mockito.`when`
import org.mockito.junit.MockitoJUnit
import org.mockito.junit.MockitoRule
import org.robolectric.RobolectricTestRunner
import org.robolectric.annotation.Config
import org.signal.core.util.logging.Log
@ -25,13 +25,13 @@ import org.whispersystems.libsignal.util.guava.Optional
@RunWith(RobolectricTestRunner::class)
@Config(manifest = Config.NONE, application = Application::class)
@PowerMockIgnore("org.mockito.*", "org.robolectric.*", "android.*", "androidx.*")
@PrepareForTest(MediaUtil::class)
class MediaRepositoryTest {
@Rule
@JvmField
val rule = PowerMockRule()
@JvmField val mockitoRule: MockitoRule = MockitoJUnit.rule()
@Mock
private lateinit var staticMediaUtilMock: MockedStatic<MediaUtil>
private lateinit var context: Context
@ -40,8 +40,7 @@ class MediaRepositoryTest {
Log.initialize(EmptyLogger())
context = ApplicationProvider.getApplicationContext()
mockStatic(MediaUtil::class.java)
PowerMockito.`when`(MediaUtil.isOctetStream(MediaUtil.OCTET)).thenReturn(true)
`when`(MediaUtil.isOctetStream(MediaUtil.OCTET)).thenReturn(true)
}
@Test
@ -62,7 +61,7 @@ class MediaRepositoryTest {
val media = buildMedia(mimeType = MediaUtil.OCTET)
// WHEN
PowerMockito.`when`(MediaUtil.getMimeType(ArgumentMatchers.any(), ArgumentMatchers.any())).thenReturn(MediaUtil.IMAGE_JPEG)
`when`(MediaUtil.getMimeType(ArgumentMatchers.any(), ArgumentMatchers.any())).thenReturn(MediaUtil.IMAGE_JPEG)
val result: Media = MediaRepository.fixMimeType(context, media)
// THEN

Wyświetl plik

@ -7,11 +7,14 @@ import androidx.annotation.NonNull;
import com.annimon.stream.Stream;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockedStatic;
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule;
import org.mockito.stubbing.Answer;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import org.thoughtcrime.securesms.database.MessageDatabase;
import org.thoughtcrime.securesms.database.model.MessageId;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
@ -31,16 +34,22 @@ import java.util.Set;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.any;
import static org.powermock.api.mockito.PowerMockito.doAnswer;
import static org.powermock.api.mockito.PowerMockito.mock;
import static org.powermock.api.mockito.PowerMockito.mockStatic;
import static org.powermock.api.mockito.PowerMockito.when;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@RunWith(PowerMockRunner.class)
@PrepareForTest({ApplicationDependencies.class, Recipient.class})
public class MarkReadReceiverTest {
@Rule
public MockitoRule rule = MockitoJUnit.rule();
@Mock
private MockedStatic<ApplicationDependencies> applicationDependenciesMockedStatic;
@Mock
private MockedStatic<Recipient> recipientMockedStatic;
private final Context mockContext = mock(Context.class);
private final JobManager mockJobManager = mock(JobManager.class);
private final Recipient mockSelf = mock(Recipient.class);
@ -48,14 +57,12 @@ public class MarkReadReceiverTest {
@Before
public void setUp() {
mockStatic(ApplicationDependencies.class);
mockStatic(Recipient.class);
when(ApplicationDependencies.getJobManager()).thenReturn(mockJobManager);
applicationDependenciesMockedStatic.when(ApplicationDependencies::getJobManager).thenReturn(mockJobManager);
doAnswer((Answer<Void>) invocation -> {
jobs.add((Job) invocation.getArguments()[0]);
return null;
}).when(mockJobManager).add(any());
when(Recipient.self()).thenReturn(mockSelf);
recipientMockedStatic.when(Recipient::self).thenReturn(mockSelf);
when(mockSelf.getId()).thenReturn(RecipientId.from(-1));
}

Wyświetl plik

@ -1,45 +1,42 @@
package org.thoughtcrime.securesms.payments;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import org.mockito.Mock;
import org.mockito.MockedStatic;
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule;
import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.BuildConfig;
import org.thoughtcrime.securesms.testutil.EmptyLogger;
import org.thoughtcrime.securesms.util.FeatureFlags;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assume.assumeFalse;
import static org.junit.Assume.assumeTrue;
import static org.mockito.Mockito.when;
@RunWith(PowerMockRunner.class)
@PrepareForTest(FeatureFlags.class)
public final class GeographicalRestrictionsTest {
@Before
public void setup() {
Log.initialize(new EmptyLogger());
PowerMockito.mockStatic(FeatureFlags.class);
}
@Rule
public MockitoRule rule = MockitoJUnit.rule();
@Mock
private MockedStatic<FeatureFlags> featureFlagsMockedStatic;
@Test
public void e164Allowed_general() {
PowerMockito.when(FeatureFlags.paymentsCountryBlocklist()).thenReturn("");
when(FeatureFlags.paymentsCountryBlocklist()).thenReturn("");
assertTrue(GeographicalRestrictions.e164Allowed("+15551234567"));
PowerMockito.when(FeatureFlags.paymentsCountryBlocklist()).thenReturn("1");
when(FeatureFlags.paymentsCountryBlocklist()).thenReturn("1");
assertFalse(GeographicalRestrictions.e164Allowed("+15551234567"));
PowerMockito.when(FeatureFlags.paymentsCountryBlocklist()).thenReturn("1,44");
when(FeatureFlags.paymentsCountryBlocklist()).thenReturn("1,44");
assertFalse(GeographicalRestrictions.e164Allowed("+15551234567"));
assertFalse(GeographicalRestrictions.e164Allowed("+445551234567"));
assertTrue(GeographicalRestrictions.e164Allowed("+525551234567"));
PowerMockito.when(FeatureFlags.paymentsCountryBlocklist()).thenReturn("1 234,44");
when(FeatureFlags.paymentsCountryBlocklist()).thenReturn("1 234,44");
assertFalse(GeographicalRestrictions.e164Allowed("+12341234567"));
assertTrue(GeographicalRestrictions.e164Allowed("+15551234567"));
assertTrue(GeographicalRestrictions.e164Allowed("+525551234567"));

Wyświetl plik

@ -6,36 +6,42 @@ import org.junit.Before
import org.junit.Rule
import org.junit.runner.RunWith
import org.mockito.ArgumentMatchers
import org.powermock.api.mockito.PowerMockito
import org.powermock.core.classloader.annotations.PowerMockIgnore
import org.powermock.core.classloader.annotations.PrepareForTest
import org.powermock.modules.junit4.rule.PowerMockRule
import org.mockito.Mock
import org.mockito.MockedConstruction
import org.mockito.MockedStatic
import org.mockito.Mockito.`when`
import org.mockito.junit.MockitoJUnit
import org.mockito.junit.MockitoRule
import org.robolectric.RobolectricTestRunner
import org.robolectric.annotation.Config
import org.thoughtcrime.securesms.crypto.AttachmentSecretProvider
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies
import org.thoughtcrime.securesms.keyvalue.ChatColorsValues
import org.thoughtcrime.securesms.keyvalue.SignalStore
import org.thoughtcrime.securesms.keyvalue.WallpaperValues
@RunWith(RobolectricTestRunner::class)
@Config(manifest = Config.NONE, application = Application::class)
@PowerMockIgnore("org.mockito.*", "org.robolectric.*", "android.*", "androidx.*", "org.powermock.*")
@PrepareForTest(ApplicationDependencies::class, AttachmentSecretProvider::class, SignalStore::class, WallpaperValues::class, ChatColorsValues::class)
abstract class BaseRecipientTest {
@Rule
@JvmField
var rule = PowerMockRule()
@JvmField val mockitoRule: MockitoRule = MockitoJUnit.rule()
@Mock
private lateinit var applicationDependenciesStaticMock: MockedStatic<ApplicationDependencies>
@Mock
private lateinit var attachmentSecretProviderStaticMock: MockedStatic<AttachmentSecretProvider>
@Mock
private lateinit var signalStoreStaticMock: MockedStatic<SignalStore>
@Mock
private lateinit var mockedSignalStoreConstruction: MockedConstruction<SignalStore>
@Before
fun superSetUp() {
val application = ApplicationProvider.getApplicationContext<Application>()
PowerMockito.mockStatic(ApplicationDependencies::class.java)
PowerMockito.`when`(ApplicationDependencies.getApplication()).thenReturn(application)
PowerMockito.mockStatic(AttachmentSecretProvider::class.java)
PowerMockito.`when`(AttachmentSecretProvider.getInstance(ArgumentMatchers.any())).thenThrow(RuntimeException::class.java)
PowerMockito.whenNew(SignalStore::class.java).withAnyArguments().thenReturn(null)
PowerMockito.mockStatic(SignalStore::class.java)
`when`(ApplicationDependencies.getApplication()).thenReturn(application)
`when`(AttachmentSecretProvider.getInstance(ArgumentMatchers.any())).thenThrow(RuntimeException::class.java)
}
}

Wyświetl plik

@ -4,10 +4,12 @@ import android.content.Context;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import org.mockito.Mock;
import org.mockito.MockedStatic;
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule;
import org.thoughtcrime.securesms.database.MmsSmsDatabase;
import org.thoughtcrime.securesms.database.RecipientDatabase;
import org.thoughtcrime.securesms.database.SignalDatabase;
@ -16,30 +18,34 @@ import org.thoughtcrime.securesms.util.FeatureFlags;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.anyLong;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.powermock.api.mockito.PowerMockito.mockStatic;
import static org.powermock.api.mockito.PowerMockito.when;
import static org.mockito.Mockito.when;
@RunWith(PowerMockRunner.class)
@PrepareForTest({SignalDatabase.class, FeatureFlags.class})
public class RecipientUtilTest {
@Rule
public MockitoRule rule = MockitoJUnit.rule();
private Context context = mock(Context.class);
private Recipient recipient = mock(Recipient.class);
private ThreadDatabase mockThreadDatabase = mock(ThreadDatabase.class);
private MmsSmsDatabase mockMmsSmsDatabase = mock(MmsSmsDatabase.class);
private RecipientDatabase mockRecipientDatabase = mock(RecipientDatabase.class);
@Mock
private MockedStatic<SignalDatabase> signalDatabaseMockedStatic;
@Mock
private MockedStatic<FeatureFlags> featureFlagsMockedStatic;
@Before
public void setUp() {
mockStatic(SignalDatabase.class);
when(SignalDatabase.threads()).thenReturn(mockThreadDatabase);
when(SignalDatabase.mmsSms()).thenReturn(mockMmsSmsDatabase);
when(SignalDatabase.recipients()).thenReturn(mockRecipientDatabase);
mockStatic(FeatureFlags.class);
signalDatabaseMockedStatic.when(SignalDatabase::threads).thenReturn(mockThreadDatabase);
signalDatabaseMockedStatic.when(SignalDatabase::mmsSms).thenReturn(mockMmsSmsDatabase);
signalDatabaseMockedStatic.when(SignalDatabase::recipients).thenReturn(mockRecipientDatabase);
when(recipient.getId()).thenReturn(RecipientId.from(5));
when(recipient.resolve()).thenReturn(recipient);

Wyświetl plik

@ -3,9 +3,9 @@ package org.thoughtcrime.securesms.recipients
import android.graphics.Color
import org.junit.Assert.assertEquals
import org.junit.Before
import org.junit.Ignore
import org.junit.Test
import org.powermock.api.mockito.PowerMockito
import org.mockito.Mockito.mock
import org.mockito.Mockito.`when`
import org.thoughtcrime.securesms.conversation.colors.ChatColors
import org.thoughtcrime.securesms.conversation.colors.ChatColorsPalette
import org.thoughtcrime.securesms.database.RecipientDatabaseTestUtils.createRecipient
@ -14,7 +14,6 @@ import org.thoughtcrime.securesms.keyvalue.SignalStore
import org.thoughtcrime.securesms.keyvalue.WallpaperValues
import org.thoughtcrime.securesms.wallpaper.ChatWallpaper
@Ignore("PowerMock failing")
@Suppress("ClassName")
class Recipient_getChatColorsTest : BaseRecipientTest() {
@ -27,14 +26,14 @@ class Recipient_getChatColorsTest : BaseRecipientTest() {
@Before
fun setUp() {
wallpaperValues = PowerMockito.mock(WallpaperValues::class.java)
chatColorsValues = PowerMockito.mock(ChatColorsValues::class.java)
wallpaperValues = mock(WallpaperValues::class.java)
chatColorsValues = mock(ChatColorsValues::class.java)
val globalWallpaper = createWallpaper(globalWallpaperChatColor)
PowerMockito.`when`(wallpaperValues.wallpaper).thenReturn(globalWallpaper)
PowerMockito.`when`(chatColorsValues.chatColors).thenReturn(globalChatColor)
PowerMockito.`when`(SignalStore.wallpaper()).thenReturn(wallpaperValues)
PowerMockito.`when`(SignalStore.chatColorsValues()).thenReturn(chatColorsValues)
`when`(wallpaperValues.wallpaper).thenReturn(globalWallpaper)
`when`(chatColorsValues.chatColors).thenReturn(globalChatColor)
`when`(SignalStore.wallpaper()).thenReturn(wallpaperValues)
`when`(SignalStore.chatColorsValues()).thenReturn(chatColorsValues)
}
@Test
@ -94,7 +93,7 @@ class Recipient_getChatColorsTest : BaseRecipientTest() {
@Test
fun `Given recipient has auto chat color set and no wallpaper set and no global wallpaper set, when I getChatColors, then I expect the default chat color`() {
// GIVEN
PowerMockito.`when`(wallpaperValues.wallpaper).thenReturn(null)
`when`(wallpaperValues.wallpaper).thenReturn(null)
val auto = ChatColors.forColor(ChatColors.Id.Auto, Color.BLACK)
val recipient = createRecipient(chatColors = auto)
@ -109,7 +108,7 @@ class Recipient_getChatColorsTest : BaseRecipientTest() {
fun `Given recipient has no chat color set and there is a custom global chat color, when I getChatColors, then I expect the global chat color`() {
// GIVEN
val expected = globalChatColor.withId(ChatColors.Id.Custom(12))
PowerMockito.`when`(chatColorsValues.chatColors).thenReturn(expected)
`when`(chatColorsValues.chatColors).thenReturn(expected)
val recipient = createRecipient()
// WHEN
@ -134,7 +133,7 @@ class Recipient_getChatColorsTest : BaseRecipientTest() {
@Test
fun `Given recipient has no chat color set and there is an auto global chat color and the recipient has a wallpaper, when I getChatColors, then I expect the wallpaper chat color`() {
// GIVEN
PowerMockito.`when`(chatColorsValues.chatColors).thenReturn(globalChatColor.withId(ChatColors.Id.Auto))
`when`(chatColorsValues.chatColors).thenReturn(globalChatColor.withId(ChatColors.Id.Auto))
val color = ChatColors.forColor(ChatColors.Id.BuiltIn, Color.CYAN)
val recipient = createRecipient(wallpaper = createWallpaper(color))
@ -148,7 +147,7 @@ class Recipient_getChatColorsTest : BaseRecipientTest() {
@Test
fun `Given recipient has no chat color set and there is no global chat color and the recipient has a wallpaper, when I getChatColors, then I expect the wallpaper chat color`() {
// GIVEN
PowerMockito.`when`(chatColorsValues.chatColors).thenReturn(null)
`when`(chatColorsValues.chatColors).thenReturn(null)
val color = ChatColors.forColor(ChatColors.Id.BuiltIn, Color.CYAN)
val recipient = createRecipient(wallpaper = createWallpaper(color))
@ -162,7 +161,7 @@ class Recipient_getChatColorsTest : BaseRecipientTest() {
@Test
fun `Given recipient has no chat color set and there is an auto global chat color and the recipient has no wallpaper and global wallpaper set, when I getChatColors, then I expect the global wallpaper chat color`() {
// GIVEN
PowerMockito.`when`(chatColorsValues.chatColors).thenReturn(globalChatColor.withId(ChatColors.Id.Auto))
`when`(chatColorsValues.chatColors).thenReturn(globalChatColor.withId(ChatColors.Id.Auto))
val recipient = createRecipient()
// WHEN
@ -175,7 +174,7 @@ class Recipient_getChatColorsTest : BaseRecipientTest() {
@Test
fun `Given recipient has no chat color set and there is no global chat color and the recipient has no wallpaper and global wallpaper set, when I getChatColors, then I expect the global wallpaper chat color`() {
// GIVEN
PowerMockito.`when`(chatColorsValues.chatColors).thenReturn(null)
`when`(chatColorsValues.chatColors).thenReturn(null)
val recipient = createRecipient()
// WHEN
@ -188,8 +187,8 @@ class Recipient_getChatColorsTest : BaseRecipientTest() {
@Test
fun `Given no recipient colors and auto global colors and no wallpaper set, when I getChatColors, then I expect default blue`() {
// GIVEN
PowerMockito.`when`(wallpaperValues.wallpaper).thenReturn(null)
PowerMockito.`when`(chatColorsValues.chatColors).thenReturn(globalChatColor.withId(ChatColors.Id.Auto))
`when`(wallpaperValues.wallpaper).thenReturn(null)
`when`(chatColorsValues.chatColors).thenReturn(globalChatColor.withId(ChatColors.Id.Auto))
val recipient = createRecipient()
// WHEN
@ -202,8 +201,8 @@ class Recipient_getChatColorsTest : BaseRecipientTest() {
@Test
fun `Given no colors or wallpaper set, when I getChatColors, then I expect default blue`() {
// GIVEN
PowerMockito.`when`(wallpaperValues.wallpaper).thenReturn(null)
PowerMockito.`when`(chatColorsValues.chatColors).thenReturn(null)
`when`(wallpaperValues.wallpaper).thenReturn(null)
`when`(chatColorsValues.chatColors).thenReturn(null)
val recipient = createRecipient()
// WHEN
@ -215,7 +214,7 @@ class Recipient_getChatColorsTest : BaseRecipientTest() {
private fun createWallpaper(
chatColors: ChatColors?
): ChatWallpaper = PowerMockito.mock(ChatWallpaper::class.java).apply {
PowerMockito.`when`(autoChatColors).thenReturn(chatColors)
): ChatWallpaper = mock(ChatWallpaper::class.java).apply {
`when`(autoChatColors).thenReturn(chatColors)
}
}

Wyświetl plik

@ -18,13 +18,13 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.any;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.verifyZeroInteractions;
import static org.mockito.Mockito.verifyNoInteractions;
@RunWith(RobolectricTestRunner.class)
@Config(manifest = Config.NONE, application = Application.class)
@ -87,7 +87,7 @@ public final class PushChallengeRequestTest {
Optional<String> challenge = PushChallengeRequest.getPushChallengeBlocking(signal, Optional.absent(), "+123456", 500L);
verifyZeroInteractions(signal);
verifyNoInteractions(signal);
assertFalse(challenge.isPresent());
}

Wyświetl plik

@ -10,8 +10,8 @@ import java.util.Collection;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.anyBoolean;
import static org.mockito.Matchers.contains;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.contains;
import static org.mockito.Mockito.when;
public class VerificationCodeParserTest extends BaseUnitTest {

Wyświetl plik

@ -3,13 +3,14 @@ package org.thoughtcrime.securesms.storage;
import com.annimon.stream.Stream;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import org.powermock.core.classloader.annotations.PowerMockIgnore;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import org.powermock.modules.junit4.PowerMockRunnerDelegate;
import org.mockito.Mock;
import org.mockito.MockedStatic;
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule;
import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.storage.StorageSyncHelper.IdDifferenceResult;
@ -34,17 +35,12 @@ import static junit.framework.TestCase.assertTrue;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotEquals;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import static org.powermock.api.mockito.PowerMockito.mock;
import static org.powermock.api.mockito.PowerMockito.mockStatic;
import static org.thoughtcrime.securesms.testutil.TestHelpers.assertContentsEqual;
import static org.thoughtcrime.securesms.testutil.TestHelpers.byteArray;
import static org.thoughtcrime.securesms.testutil.TestHelpers.byteListOf;
@RunWith(PowerMockRunner.class)
@PrepareForTest({ Recipient.class, FeatureFlags.class})
@PowerMockIgnore("javax.crypto.*")
@PowerMockRunnerDelegate(JUnit4.class)
public final class StorageSyncHelperTest {
private static final ServiceId SID_A = ServiceId.parseOrThrow("ebef429e-695e-4f51-bcc4-526a60ac68c7");
@ -60,12 +56,19 @@ public final class StorageSyncHelperTest {
when(SELF.resolve()).thenReturn(SELF);
}
@Rule
public MockitoRule rule = MockitoJUnit.rule();
@Mock
private MockedStatic<Recipient> recipientMockedStatic;
@Mock
private MockedStatic<FeatureFlags> featureFlagsMockedStatic;
@Before
public void setup() {
mockStatic(Recipient.class);
when(Recipient.self()).thenReturn(SELF);
recipientMockedStatic.when(Recipient::self).thenReturn(SELF);
Log.initialize(new Log.Logger[0]);
mockStatic(FeatureFlags.class);
StorageSyncHelper.setTestKeyGenerator(null);
}

Wyświetl plik

@ -1,30 +0,0 @@
package org.thoughtcrime.securesms.testutil;
import org.signal.core.util.ThreadUtil;
import static org.mockito.Mockito.when;
import static org.powermock.api.mockito.PowerMockito.doCallRealMethod;
import static org.powermock.api.mockito.PowerMockito.mockStatic;
public final class MainThreadUtil {
private MainThreadUtil() {
}
/**
* Makes {@link ThreadUtil}'s Main thread assertions pass or fail during tests.
* <p>
* Use with {@link org.powermock.modules.junit4.PowerMockRunner} or robolectric with powermock
* rule and {@code @PrepareForTest(Util.class)}
*/
public static void setMainThread(boolean isMainThread) {
mockStatic(ThreadUtil.class);
when(ThreadUtil.isMainThread()).thenReturn(isMainThread);
try {
doCallRealMethod().when(ThreadUtil.class, "assertMainThread");
doCallRealMethod().when(ThreadUtil.class, "assertNotMainThread");
} catch (Exception e) {
throw new AssertionError();
}
}
}

Wyświetl plik

@ -4,24 +4,29 @@ package org.thoughtcrime.securesms.util;
import android.text.TextUtils;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockedStatic;
import org.mockito.Mockito;
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule;
import org.mockito.stubbing.Answer;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import static junit.framework.Assert.assertEquals;
import static org.mockito.ArgumentMatchers.anyString;
@RunWith(PowerMockRunner.class)
@PrepareForTest(TextUtils.class)
public class DelimiterUtilTest {
@Rule
public MockitoRule rule = MockitoJUnit.rule();
@Mock
private MockedStatic<TextUtils> textUtilsMockedStatic;
@Before
public void setup() {
PowerMockito.mockStatic(TextUtils.class);
PowerMockito.when(TextUtils.isEmpty(Mockito.anyString())).thenAnswer((Answer<Boolean>) invocation -> {
textUtilsMockedStatic.when(() -> TextUtils.isEmpty(anyString())).thenAnswer((Answer<Boolean>) invocation -> {
if (invocation.getArguments()[0] == null) return true;
return ((String) invocation.getArguments()[0]).isEmpty();
});

Wyświetl plik

@ -125,22 +125,17 @@ dependencyResolutionManagement {
testLibs {
version('robolectric', '4.4')
version('powermock', '2.0.9')
alias('junit-junit').to('junit:junit:4.13.2')
alias('androidx-test-core').to('androidx.test:core:1.2.0')
alias('androidx-test-ext-junit').to('androidx.test.ext:junit:1.1.1')
alias('espresso-core').to('androidx.test.espresso:espresso-core:3.2.0')
alias('mockito-core').to('org.mockito:mockito-core:2.23.4')
alias('mockito-core').to('org.mockito:mockito-inline:4.4.0')
alias('robolectric-robolectric').to('org.robolectric', 'robolectric').versionRef('robolectric')
alias('robolectric-shadows-multidex').to('org.robolectric', 'shadows-multidex').versionRef('robolectric')
alias('bouncycastle-bcprov-jdk15on').to('org.bouncycastle:bcprov-jdk15on:1.70')
alias('hamcrest-hamcrest').to('org.hamcrest:hamcrest:2.2')
alias('assertj-core').to('org.assertj:assertj-core:3.11.1')
alias('powermock-api-mockito').to('org.powermock', 'powermock-api-mockito2').versionRef('powermock')
alias('powermock-module-junit4-core').to('org.powermock', 'powermock-module-junit4').versionRef('powermock')
alias('powermock-module-junit4-rule').to('org.powermock', 'powermock-module-junit4-rule').versionRef('powermock')
alias('powermock-classloading-xstream').to('org.powermock', 'powermock-classloading-xstream').versionRef('powermock')
alias('conscrypt-openjdk-uber').to('org.conscrypt:conscrypt-openjdk-uber:2.0.0')
}

Wyświetl plik

@ -33,14 +33,6 @@ https://docs.gradle.org/current/userguide/dependency_verification.html
<sha256 value="b7730754793e2fa510ddb10b7514e65f8706e4ec4b100acf7e4215f0bd5519b4" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="androidx.activity" name="activity" version="1.4.0">
<artifact name="activity-1.4.0.aar">
<sha256 value="89dc38e0cdbd11f328c7d0b3b021ddb387ca9da0d49f14b18c91e300c45ed79c" origin="Generated by Gradle"/>
</artifact>
<artifact name="activity-1.4.0.module">
<sha256 value="b38ce719cf1862701ab54b48405fc832a8ca8d4aacb2ce0d37456d0aff329147" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="androidx.activity" name="activity-ktx" version="1.2.2">
<artifact name="activity-ktx-1.2.2.aar">
<sha256 value="9829e13d6a6b045b03b21a330512e091dc76eb5b3ded0d88d1ab0509cf84a50e" origin="Generated by Gradle"/>
@ -49,14 +41,6 @@ https://docs.gradle.org/current/userguide/dependency_verification.html
<sha256 value="92f4431091650b5a67cc4f654bd9b822c585cf4262180912f075779f07a04ba6" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="androidx.activity" name="activity-ktx" version="1.4.0">
<artifact name="activity-ktx-1.4.0.aar">
<sha256 value="3f301941f37a90b4bc553dbbe84e7464a97c0d21df6cf2d6c0cb1b2c07349f33" origin="Generated by Gradle"/>
</artifact>
<artifact name="activity-ktx-1.4.0.module">
<sha256 value="44950669cc9951b30ca8f9dd426fff3d660672262e74afac785bded4aacc5a03" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="androidx.annotation" name="annotation" version="1.0.0">
<artifact name="annotation-1.0.0.jar">
<sha256 value="0baae9755f7caf52aa80cd04324b91ba93af55d4d1d17dcc9a7b53d99ef7c016" origin="Generated by Gradle"/>
@ -80,14 +64,6 @@ https://docs.gradle.org/current/userguide/dependency_verification.html
<sha256 value="b219d2b568e7e4ba534e09f8c2fd242343df6ccbdfbbe938846f5d740e6b0b11" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="androidx.annotation" name="annotation-experimental" version="1.1.0">
<artifact name="annotation-experimental-1.1.0.aar">
<sha256 value="0157de61a2064047896a058080f3fd67ba57ad9a94857b3f7a363660243e3f90" origin="Generated by Gradle"/>
</artifact>
<artifact name="annotation-experimental-1.1.0.module">
<sha256 value="0361d1526a4d7501255e19779e09e93cdbd07fee0e2f5c50b7a137432d510119" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="androidx.appcompat" name="appcompat" version="1.2.0">
<artifact name="appcompat-1.2.0.aar">
<sha256 value="3d2131a55a61a777322e2126e0018011efa6339e53b44153eb651b16020cca70" origin="Generated by Gradle"/>
@ -247,14 +223,6 @@ https://docs.gradle.org/current/userguide/dependency_verification.html
<sha256 value="e3877fa529fe29177f34a26e0790ed35544848b0c7503bfed30b2539f1686d65" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="androidx.core" name="core" version="1.7.0">
<artifact name="core-1.7.0.aar">
<sha256 value="aaf6734226fff923784f92f65d78a2984dbf17534138855c5ce2038f18656e0b" origin="Generated by Gradle"/>
</artifact>
<artifact name="core-1.7.0.module">
<sha256 value="988f820899d5a4982e5c878ca1cd417970ace332ea2ff72f5be19b233fa0e788" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="androidx.core" name="core-ktx" version="1.5.0">
<artifact name="core-ktx-1.5.0.aar">
<sha256 value="5964cfe7a4882da2a00fb6ca3d3a072d04139208186f7bc4b3cb66022764fc42" origin="Generated by Gradle"/>
@ -706,11 +674,6 @@ https://docs.gradle.org/current/userguide/dependency_verification.html
<sha256 value="8341ff092d6060d62a07227f29237155fff36fb16f96c95fbd9a884e375db912" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="androidx.sqlite" name="sqlite-framework" version="2.1.0">
<artifact name="sqlite-framework-2.1.0.aar">
<sha256 value="8673737fdb2efbad91aeaeed1927ebb29212d36a867d93b9639c8069019f8a1e" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="androidx.swiperefreshlayout" name="swiperefreshlayout" version="1.0.0">
<artifact name="swiperefreshlayout-1.0.0.aar">
<sha256 value="9761b3a809c9b093fd06a3c4bbc645756dec0e95b5c9da419bc9f2a3f3026e8d" origin="Generated by Gradle"/>
@ -901,76 +864,6 @@ https://docs.gradle.org/current/userguide/dependency_verification.html
<sha256 value="6d7539a6ae29bd6f21ad50da86ab9427c69e5cae9075b5324584d9372aa73191" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="com.android.support" name="animated-vector-drawable" version="25.3.1">
<artifact name="animated-vector-drawable-25.3.1.aar">
<sha256 value="4bc46edf1946b32d518b41416d1734e915e0cbb28021de3b340527419b070691" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="com.android.support" name="appcompat-v7" version="25.3.1">
<artifact name="appcompat-v7-25.3.1.aar">
<sha256 value="ac1ebbc46589195dda3e0b1becfe410bafd75bdf3edd1cd9acf04850f3895830" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="com.android.support" name="exifinterface" version="27.1.0">
<artifact name="exifinterface-27.1.0.aar">
<sha256 value="941b5f1c85bab0f999e63a003993acb7dad6c01ad19104ad53e63529ee2d82e0" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="com.android.support" name="multidex" version="1.0.3">
<artifact name="multidex-1.0.3.aar">
<sha256 value="ecf6098572e23b5155bab3b9a82b2fd1530eda6c6c157745e0f5287c66eec60c" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="com.android.support" name="recyclerview-v7" version="25.3.1">
<artifact name="recyclerview-v7-25.3.1.aar">
<sha256 value="375974a8724e359d97d77fa8522c614f813a3ac4583c1807f154a3f9a054b0a1" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="com.android.support" name="support-annotations" version="25.3.1">
<artifact name="support-annotations-25.3.1.jar">
<sha256 value="aedf76962584adfaed2bd3fcaa22406461c4310237fc27e301128edaa2dba2fa" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="com.android.support" name="support-compat" version="25.3.1">
<artifact name="support-compat-25.3.1.aar">
<sha256 value="e02d781268dc60aab6638d8dc20156ea11ca20b962d294b85e6f1e8418cabfa7" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="com.android.support" name="support-core-ui" version="25.3.1">
<artifact name="support-core-ui-25.3.1.aar">
<sha256 value="6182278a6653e6c111c888963626cbb16f2d0022571cb239760475119e0b92a8" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="com.android.support" name="support-core-utils" version="25.3.1">
<artifact name="support-core-utils-25.3.1.aar">
<sha256 value="32fac02eb2c20a77fa3e3bc3ede62392a19613f72b8f8e10f5dfa84bb4c89ea1" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="com.android.support" name="support-fragment" version="25.3.1">
<artifact name="support-fragment-25.3.1.aar">
<sha256 value="541d6393c1e024453aca2a14f31bea0c7270ff4e2a02783f3528aa426367444d" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="com.android.support" name="support-media-compat" version="25.3.1">
<artifact name="support-media-compat-25.3.1.aar">
<sha256 value="cbed07d07e0e84fdb4b75712f5fd946229a8af155933c9a92e41db64d00791e0" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="com.android.support" name="support-v13" version="25.3.1">
<artifact name="support-v13-25.3.1.aar">
<sha256 value="edd86bab8578e24443b56ee115b38023dacaacb8bb3188c9de3fdbb8e15023d3" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="com.android.support" name="support-v4" version="25.3.1">
<artifact name="support-v4-25.3.1.aar">
<sha256 value="07d389154bcf73b47e514964df1578136b26cba78257b8a577a3ccb54beff0ae" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="com.android.support" name="support-vector-drawable" version="25.3.1">
<artifact name="support-vector-drawable-25.3.1.aar">
<sha256 value="13728f337f36d1c02d52198a6c20724edb447a0875454d829f95cb9eb4aa293b" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="com.android.tools" name="annotations" version="26.6.3">
<artifact name="annotations-26.6.3.jar">
<sha256 value="9bb9e1aef699819309fb30ab9094d7beb04fb09da184ddabc14ca3ec21c7f14a" origin="Generated by Gradle"/>
@ -1120,12 +1013,6 @@ https://docs.gradle.org/current/userguide/dependency_verification.html
<artifact name="aapt2-7.0.3-7396180-linux.jar">
<sha256 value="bcecb8127be3ff1e764af5e7f35ebb5a61fd54d14118f8ec1e4e6cfb517e5b6d" origin="Generated by Gradle"/>
</artifact>
<artifact name="aapt2-7.0.3-7396180-osx.jar">
<sha256 value="91c63ff4aa93f8b7db53f0410bf33b1c3eb3a2641358ad094a188868c717edda" origin="Generated by Gradle"/>
</artifact>
<artifact name="aapt2-7.0.3-7396180-windows.jar">
<sha256 value="261092207d3e8d99c972c02cc86b09055f6a4b493fac339795d1259c0eef6b37" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="com.android.tools.build" name="aapt2-proto" version="0.4.0">
<artifact name="aapt2-proto-0.4.0.jar">
@ -1426,37 +1313,6 @@ https://docs.gradle.org/current/userguide/dependency_verification.html
<sha256 value="c76e3d9796cd16ce9894063ea8c53be6903c7df4081f8adca63a6ac1651a019d" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="com.facebook.fbjni" name="fbjni" version="0.2.2">
<artifact name="fbjni-0.2.2.aar">
<sha256 value="f609dc043bf788b910727149e175cf4d023f8cbc6b8ecde611c4c7788d66378f" origin="Generated by Gradle"/>
</artifact>
<artifact name="fbjni-0.2.2.module">
<sha256 value="73bbbeef31689216a44acb6814b49b8c6016dc28c23156616c468cc463ad817d" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="com.facebook.flipper" name="flipper" version="0.91.0">
<artifact name="flipper-0.91.0.aar">
<sha256 value="39db2137a0241eb9d77974f7a337e5ec505b45d1d97920e3e055fbb4f82320d4" origin="Generated by Gradle"/>
</artifact>
<artifact name="flipper-0.91.0.module">
<sha256 value="deb5a0d605fbf82da1a0e404f8b500ff7eb19fdd96ce5c89a01263bab80d1464" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="com.facebook.soloader" name="annotation" version="0.10.1">
<artifact name="annotation-0.10.1.jar">
<sha256 value="ad0c87aef7029b64c9f47fd0904b143b2d5d05f49453b2f801a2351943b1d4eb" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="com.facebook.soloader" name="nativeloader" version="0.10.1">
<artifact name="nativeloader-0.10.1.jar">
<sha256 value="82ca9c348f605984fa72e08aee0c35e7aa103ec6b0eccf592e498392c4d601b8" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="com.facebook.soloader" name="soloader" version="0.10.1">
<artifact name="soloader-0.10.1.aar">
<sha256 value="0e0a82f8502f81a0a07f91c12f07ec54522e5ea48512604c6a249f55f3490957" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="com.fasterxml.jackson.core" name="jackson-annotations" version="2.12.0">
<artifact name="jackson-annotations-2.12.0.jar">
<sha256 value="c28fbe62e7be1e29df75953fa8a887ff875d4482291fbfddb1aec5c91191ecda" origin="Generated by Gradle"/>
@ -1549,21 +1405,11 @@ https://docs.gradle.org/current/userguide/dependency_verification.html
<sha256 value="23f5c982e1c7771423d37d52c774e8d2e80fd7ea7305ebe448797a96f67e6fca" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="com.github.jknack" name="handlebars" version="4.0.6">
<artifact name="handlebars-4.0.6.jar">
<sha256 value="f20c47fd6572170951e83af1c11a5c12e724fa60535d62219bf2f762620d5781" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="com.github.jknack" name="handlebars" version="4.0.7">
<artifact name="handlebars-4.0.7.jar">
<sha256 value="d9b155fe8c8ddb0f9b3e5b156b5909dcd4c89d93defb2f72d0961aa633ad838f" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="com.github.jknack" name="handlebars" version="4.3.0">
<artifact name="handlebars-4.3.0.jar">
<sha256 value="9441bb30635ae1db3a73d793accfe91ed4c2a4edec39750557f11f1debbc8eb7" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="com.github.shyiko.klob" name="klob" version="0.2.1">
<artifact name="klob-0.2.1.jar">
<sha256 value="2f6174e3049008f263fd832813390df645ac5c7cfa79f170ace58690810476f2" origin="Generated by Gradle"/>
@ -1867,11 +1713,6 @@ https://docs.gradle.org/current/userguide/dependency_verification.html
<sha256 value="e6dd072f9d3fe02a4600688380bd422bdac184caf6fe2418cfdd0934f09432aa" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="com.google.guava" name="listenablefuture" version="1.0">
<artifact name="listenablefuture-1.0.jar">
<sha256 value="e4ad7607e5c0477c6f890ef26a49cb8d1bb4dffb650bab4502afee64644e3069" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="com.google.guava" name="listenablefuture" version="9999.0-empty-to-avoid-conflict-with-guava">
<artifact name="listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar">
<sha256 value="b372a037d4230aa57fbeffdef30fd6123f9c0c2db85d0aced00c91b974f33f99" origin="Generated by Gradle"/>
@ -1946,26 +1787,11 @@ https://docs.gradle.org/current/userguide/dependency_verification.html
<sha256 value="da4d94dc952c65914bf9e3c0b4f4a05f5aea536aa5de9a4660b859409dda4bad" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="com.google.zxing" name="android-integration" version="3.1.0">
<artifact name="android-integration-3.1.0.jar">
<sha256 value="89e56aadf1164bd71e57949163c53abf90af368b51669c0d4a47a163335f95c4" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="com.google.zxing" name="android-integration" version="3.3.0">
<artifact name="android-integration-3.3.0.jar">
<sha256 value="dc6d6da7d4f4a7dffa6a049e62db6d0cd4c28aa14524968e41460e559a444e84" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="com.google.zxing" name="core" version="3.2.1">
<artifact name="core-3.2.1.jar">
<sha256 value="b4d82452e7a6bf6ec2698904b332431717ed8f9a850224f295aec89de80f2259" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="com.google.zxing" name="core" version="3.3.0">
<artifact name="core-3.3.0.jar">
<sha256 value="bba7724e02a997cec38213af77133ee8e24b0d5cf5fa7ecbc16a4fa93f11ee0d" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="com.google.zxing" name="core" version="3.4.1">
<artifact name="core-3.4.1.jar">
<sha256 value="acfa30338c26267b6cab665509c2251bb96e8350bfcad89d59b949ba77011f8d" origin="Generated by Gradle"/>
@ -1991,11 +1817,6 @@ https://docs.gradle.org/current/userguide/dependency_verification.html
<sha256 value="757bfe906193b8b651e79dc26cd67d6b55d0770a2cdfb0381591504f779d4a76" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="com.googlecode.libphonenumber" name="libphonenumber" version="8.12.33">
<artifact name="libphonenumber-8.12.33.jar">
<sha256 value="eb983d0b10104f5f31592dacf691dde6032139e626bd95ec22e1ae949ef1806d" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="com.googlecode.libphonenumber" name="libphonenumber" version="8.12.42">
<artifact name="libphonenumber-8.12.42.jar">
<sha256 value="06d91ada46f7ad70257e6807ee03d2eaf557605d9e617e50fab87e05f6ec4961" origin="Generated by Gradle"/>
@ -2285,11 +2106,6 @@ https://docs.gradle.org/current/userguide/dependency_verification.html
<sha256 value="21fba22f830e9268f07cf4ab2d99e8181abbdcb0cb91ee0228eb3cb918dcdd1d" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="com.thoughtworks.xstream" name="xstream" version="1.4.10">
<artifact name="xstream-1.4.10.jar">
<sha256 value="a1587f35fa617513607c86ec9e6e4de5eb8acdf9a3a6d7f7458f8a8c40b00858" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="com.tomergoldst.android" name="tooltips" version="1.0.6">
<artifact name="tooltips-1.0.6.aar">
<sha256 value="4c56697dd1ad64b8066535c61f961a6d901e7ae5d97ae27084ba40ad620349b6" origin="Generated by Gradle"/>
@ -2569,9 +2385,9 @@ https://docs.gradle.org/current/userguide/dependency_verification.html
<sha256 value="db469ce0f48dd96b892eac424ed76870e54bf00fe0a28cdcddfbe5f2a226a0e1" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="net.bytebuddy" name="byte-buddy" version="1.10.14">
<artifact name="byte-buddy-1.10.14.jar">
<sha256 value="0e6b935bfcb3e451d525956acad53ec86ff916d714abdbd32b3d2039771896f8" origin="Generated by Gradle"/>
<component group="net.bytebuddy" name="byte-buddy" version="1.12.8">
<artifact name="byte-buddy-1.12.8.jar">
<sha256 value="42ba43dcccd8d9d77bfe8776a83e72b67f1fa52c4038a98629e7d288b648da4e" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="net.bytebuddy" name="byte-buddy" version="1.8.10">
@ -2579,14 +2395,9 @@ https://docs.gradle.org/current/userguide/dependency_verification.html
<sha256 value="8c29e0118256acf9fbadcd75143df2d8bd9bfb07623ccf95a14646be5a92380c" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="net.bytebuddy" name="byte-buddy" version="1.9.3">
<artifact name="byte-buddy-1.9.3.jar">
<sha256 value="a27350be602caea67a33d31281496c84c69b5ab34ddc228e9ff2253fc8f9cd31" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="net.bytebuddy" name="byte-buddy-agent" version="1.10.14">
<artifact name="byte-buddy-agent-1.10.14.jar">
<sha256 value="30272167eceb1cb68fa84730a12d1abfd1daed6ae0c19fdefee47a9a9a0cfd33" origin="Generated by Gradle"/>
<component group="net.bytebuddy" name="byte-buddy-agent" version="1.12.8">
<artifact name="byte-buddy-agent-1.12.8.jar">
<sha256 value="18faf4f33893c3e883a3220adfdab25d6ceff9e46b1ad760a5b6f83df9373307" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="net.bytebuddy" name="byte-buddy-agent" version="1.8.10">
@ -2594,11 +2405,6 @@ https://docs.gradle.org/current/userguide/dependency_verification.html
<sha256 value="f7403b1126137eb68a5cc3beaf543d965bafca87fad7d7d30082617748c19e05" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="net.bytebuddy" name="byte-buddy-agent" version="1.9.3">
<artifact name="byte-buddy-agent-1.9.3.jar">
<sha256 value="547288e013a9d1f4a4ce2ab84c24e3edda6e433c7fa6b2c3c3613932671b05b1" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="net.java.dev.jna" name="jna" version="5.6.0">
<artifact name="jna-5.6.0.jar">
<sha256 value="5557e235a8aa2f9766d5dc609d67948f2a8832c2d796cea9ef1d6cbe0b3b7eaf" origin="Generated by Gradle"/>
@ -2624,11 +2430,6 @@ https://docs.gradle.org/current/userguide/dependency_verification.html
<sha256 value="a32de739cfdf515774e696f91aa9697d2e7731e5cb5045ca8a4b657f8b1b4fb4" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.antlr" name="antlr4-runtime" version="4.5.1-1">
<artifact name="antlr4-runtime-4.5.1-1.jar">
<sha256 value="ffca72bc2a25bb2b0c80a58cee60530a78be17da739bb6c91a8c2e3584ca099e" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.antlr" name="antlr4-runtime" version="4.5.2-1">
<artifact name="antlr4-runtime-4.5.2-1.jar">
<sha256 value="e831413004bceed7d915c3a175927b1daabc4974b7b8a6f87bbce886d3550398" origin="Generated by Gradle"/>
@ -2874,11 +2675,6 @@ https://docs.gradle.org/current/userguide/dependency_verification.html
<sha256 value="bf1c8c8f9ba5f92ff5a79adc674f564e1e90c62c25c8c606206366754ae8645e" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.ec4j.core" name="ec4j-core" version="0.2.2">
<artifact name="ec4j-core-0.2.2.jar">
<sha256 value="be45da18ff9b4172b7d65cee320f65af815813b013149086d3ba58c21469aec4" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.ec4j.core" name="ec4j-core" version="0.3.0">
<artifact name="ec4j-core-0.3.0.jar">
<sha256 value="cadef0207077074b11a12be442f89ab6cf93fbc2f848702d9371a9611414d558" origin="Generated by Gradle"/>
@ -2949,11 +2745,6 @@ https://docs.gradle.org/current/userguide/dependency_verification.html
<sha256 value="aae08fa4ff043c807b8876cdb2d8705eb8449a55efce461baa6c09da245088c1" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.javassist" name="javassist" version="3.27.0-GA">
<artifact name="javassist-3.27.0-GA.jar">
<sha256 value="0730bdb1547a5a3f458d60400d804078d80f329c5b5dbc2498a4e220de8f7013" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.jdom" name="jdom2" version="2.0.6">
<artifact name="jdom2-2.0.6.jar">
<sha256 value="1345f11ba606d15603d6740551a8c21947c0215640770ec67271fe78bea97cf5" origin="Generated by Gradle"/>
@ -2989,11 +2780,6 @@ https://docs.gradle.org/current/userguide/dependency_verification.html
<sha256 value="d8c1fab9ff7dfdb385fc0789da5f2574114926897060fcf7cc6d93207ae88ee4" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.jetbrains.kotlin" name="kotlin-compiler-embeddable" version="1.4.10">
<artifact name="kotlin-compiler-embeddable-1.4.10.jar">
<sha256 value="c0d023cff6ee64d360a5b6d7da17aa068b63a4a721f6323a855249d6737978e6" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.jetbrains.kotlin" name="kotlin-compiler-embeddable" version="1.4.32">
<artifact name="kotlin-compiler-embeddable-1.4.32.jar">
<sha256 value="083d80ea6262faac293d248c32bf89e062a4e44d657ea6a095c8066e31791e5e" origin="Generated by Gradle"/>
@ -3014,11 +2800,6 @@ https://docs.gradle.org/current/userguide/dependency_verification.html
<sha256 value="4c77d463ba41fb43f9e8a7868fc99712431e8f6b3b8df24aa7df3e5778863a6c" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.jetbrains.kotlin" name="kotlin-daemon-embeddable" version="1.4.10">
<artifact name="kotlin-daemon-embeddable-1.4.10.jar">
<sha256 value="b0ba729c8bd039e1973bab95a88577fbc407baefaef016acecf73c06a504a05e" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.jetbrains.kotlin" name="kotlin-daemon-embeddable" version="1.4.32">
<artifact name="kotlin-daemon-embeddable-1.4.32.jar">
<sha256 value="0c52722dfb15d6c79f77e1c1c55caf93d0a480f9e1ee76da751cf0cc1e4b6d19" origin="Generated by Gradle"/>
@ -3064,11 +2845,6 @@ https://docs.gradle.org/current/userguide/dependency_verification.html
<sha256 value="59c57ab609494d2a30d6ea3737428a56918ff0b8031081ea73b8472fdec06e44" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.jetbrains.kotlin" name="kotlin-reflect" version="1.4.10">
<artifact name="kotlin-reflect-1.4.10.jar">
<sha256 value="3ab3413ec945f801448360ad97bc6e14fec6d606889ede3c707cc277b4467f45" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.jetbrains.kotlin" name="kotlin-reflect" version="1.4.32">
<artifact name="kotlin-reflect-1.4.32.jar">
<sha256 value="dbf19e9cdaa9c3c170f3f6f6ce3922f38dfc1d7fa1cab5b7c23a19da8b5eec5b" origin="Generated by Gradle"/>
@ -3084,11 +2860,6 @@ https://docs.gradle.org/current/userguide/dependency_verification.html
<sha256 value="6e0f5490e6b9649ddd2670534e4d3a03bd283c3358b8eef5d1304fd5f8a5a4fb" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.jetbrains.kotlin" name="kotlin-script-runtime" version="1.4.10">
<artifact name="kotlin-script-runtime-1.4.10.jar">
<sha256 value="142c51b9bed14244abdd6ea4551e645be57c3a03a70b9933822e870c05fa8fac" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.jetbrains.kotlin" name="kotlin-script-runtime" version="1.4.32">
<artifact name="kotlin-script-runtime-1.4.32.jar">
<sha256 value="4496e90565b6cc312213acd65fe8ad6d149264ff12d2f1f6b6ba4122afffbbfe" origin="Generated by Gradle"/>
@ -3204,11 +2975,6 @@ https://docs.gradle.org/current/userguide/dependency_verification.html
<sha256 value="5f801e75ca27d8791c14b07943c608da27620d910a8093022af57f543d5d98b6" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.jetbrains.kotlin" name="kotlin-stdlib-jdk7" version="1.5.0">
<artifact name="kotlin-stdlib-jdk7-1.5.0.jar">
<sha256 value="ac12f092f12b575c1f9e0ab5025b1e610b0fe95663e26371c16c328895711bae" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.jetbrains.kotlin" name="kotlin-stdlib-jdk7" version="1.5.10">
<artifact name="kotlin-stdlib-jdk7-1.5.10.jar">
<sha256 value="75ed5680aaacfd94b93c3695d8eb8bfa7cf83893d2e46ca9788345c52d393f8a" origin="Generated by Gradle"/>
@ -3234,11 +3000,6 @@ https://docs.gradle.org/current/userguide/dependency_verification.html
<sha256 value="adc43e54757b106e0cd7b3b7aa257dff471b61efdabe067fc02b2f57e2396262" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.jetbrains.kotlin" name="kotlin-stdlib-jdk8" version="1.5.0">
<artifact name="kotlin-stdlib-jdk8-1.5.0.jar">
<sha256 value="15e6c81b9e845eefe58d51a04670bb90418046f458264ec0e61ee9bdbc1bfae7" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.jetbrains.kotlin" name="kotlin-stdlib-jdk8" version="1.5.10">
<artifact name="kotlin-stdlib-jdk8-1.5.10.jar">
<sha256 value="270b05aa3cc92f157a7ed71ff09cf136ee3fb18cbac94f71a12931009c49f550" origin="Generated by Gradle"/>
@ -3436,14 +3197,14 @@ https://docs.gradle.org/current/userguide/dependency_verification.html
<sha256 value="d6ac2e04164c5d5c89e73838dc1c8b3856ca6582d3f2daf91816fd9d7ba3c9a9" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.mockito" name="mockito-core" version="2.23.4">
<artifact name="mockito-core-2.23.4.jar">
<sha256 value="d77e018b6bc211d78ddcec54bc508732c4677b9a9eb9103793be85441b20bc5d" origin="Generated by Gradle"/>
<component group="org.mockito" name="mockito-core" version="4.4.0">
<artifact name="mockito-core-4.4.0.jar">
<sha256 value="9a5f59ad06d0bb7d0fd2d4a74eb4d66d561ee0327f0febacb7f9cfb5be4abbfb" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.mockito" name="mockito-core" version="3.3.3">
<artifact name="mockito-core-3.3.3.jar">
<sha256 value="4be648c50456fba4686ba825000d628c1d805a3b92272ba9ad5b697dfa43036b" origin="Generated by Gradle"/>
<component group="org.mockito" name="mockito-inline" version="4.4.0">
<artifact name="mockito-inline-4.4.0.jar">
<sha256 value="ee52e1c299a632184fba274a9370993e09140429f5e516e6c5570fd6574b297f" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.mozilla" name="rhino" version="1.7.7">
@ -3451,11 +3212,6 @@ https://docs.gradle.org/current/userguide/dependency_verification.html
<sha256 value="73b8d6bbbd1a6a3a87ea0eea301996deac83f8d40b404518a10afd4d320b5b31" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.mozilla" name="rhino" version="1.7R4">
<artifact name="rhino-1.7R4.jar">
<sha256 value="eb4cbd05a48ee4448825da229e94115e68adc6c5638d29022914e1178c60a6c4" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.mp4parser" name="isoparser" version="1.9.39">
<artifact name="isoparser-1.9.39.jar">
<sha256 value="a3a7172648f1ac4b2a369ecca2861317e472179c842a5217b08643ba0a1dfa12" origin="Generated by Gradle"/>
@ -3486,9 +3242,9 @@ https://docs.gradle.org/current/userguide/dependency_verification.html
<sha256 value="5e168368fbc250af3c79aa5fef0c3467a2d64e5a7bd74005f25d8399aeb0708d" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.objenesis" name="objenesis" version="3.0.1">
<artifact name="objenesis-3.0.1.jar">
<sha256 value="7a8ff780b9ff48415d7c705f60030b0acaa616e7f823c98eede3b63508d4e984" origin="Generated by Gradle"/>
<component group="org.objenesis" name="objenesis" version="3.2">
<artifact name="objenesis-3.2.jar">
<sha256 value="03d960bd5aef03c653eb000413ada15eb77cdd2b8e4448886edf5692805e35f3" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.opentest4j" name="opentest4j" version="1.2.0">
@ -3546,51 +3302,6 @@ https://docs.gradle.org/current/userguide/dependency_verification.html
<sha256 value="6e24913b021ffacfe8e7e053d6e0ccc731941148cfa078d4f1ed3d96904530f8" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.powermock" name="powermock-api-mockito2" version="2.0.9">
<artifact name="powermock-api-mockito2-2.0.9.jar">
<sha256 value="fe3b61dff44163724c6046605919a0ccb5f24bf0e14f2f3b8a44894ef04fbf2c" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.powermock" name="powermock-api-support" version="2.0.9">
<artifact name="powermock-api-support-2.0.9.jar">
<sha256 value="49e4cb9045aabf9bb280fd21b134008006280fe394ef428e468e5de5a1eceee2" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.powermock" name="powermock-classloading-base" version="2.0.9">
<artifact name="powermock-classloading-base-2.0.9.jar">
<sha256 value="d68577a69f27de3adcbeb27e597e3629dc6bf8d1e3443134e9b4c881e012be91" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.powermock" name="powermock-classloading-xstream" version="2.0.9">
<artifact name="powermock-classloading-xstream-2.0.9.jar">
<sha256 value="331869c627441eea64984120fd4382391f1510475a3e6e9e8a903dd89236b383" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.powermock" name="powermock-core" version="2.0.9">
<artifact name="powermock-core-2.0.9.jar">
<sha256 value="e5183d1e197bcd67e8f86eeb5acc4cc4b4a7aa993e9daa249f8d8d6973f06c49" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.powermock" name="powermock-module-junit4" version="2.0.9">
<artifact name="powermock-module-junit4-2.0.9.jar">
<sha256 value="d0e8a83183a9a8a18ff83e1592a611fa206cab0838466ce367e3d0a851a274e2" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.powermock" name="powermock-module-junit4-common" version="2.0.9">
<artifact name="powermock-module-junit4-common-2.0.9.jar">
<sha256 value="446f975ffa98960ab6eafccb5c4d1e2cb5747f7d80cda653548a02d584289e83" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.powermock" name="powermock-module-junit4-rule" version="2.0.9">
<artifact name="powermock-module-junit4-rule-2.0.9.jar">
<sha256 value="4ed4337bb601a93377a11c5cf523828538f536c066284e688b2d89ef22274955" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.powermock" name="powermock-reflect" version="2.0.9">
<artifact name="powermock-reflect-2.0.9.jar">
<sha256 value="a1374bd368b52b54b252d5281b9391363b58cb667a6375242fd6a3f482bc8c23" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.reactivestreams" name="reactive-streams" version="1.0.3">
<artifact name="reactive-streams-1.0.3.jar">
<sha256 value="1dee0481072d19c929b623e155e14d2f6085dc011529a0a0dbefc84cf571d865" origin="Generated by Gradle"/>
@ -3686,11 +3397,6 @@ https://docs.gradle.org/current/userguide/dependency_verification.html
<sha256 value="baf3c7fe15fefeaf9e5b000d94547379dc48370f22a8797e239c127e7d7756ec" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.slf4j" name="slf4j-api" version="1.7.32">
<artifact name="slf4j-api-1.7.32.jar">
<sha256 value="3624f8474c1af46d75f98bc097d7864a323c81b3808aa43689a6e1c601c027be" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.smali" name="dexlib2" version="2.2.4">
<artifact name="dexlib2-2.2.4.jar">
<sha256 value="cb2677bfb66cfbc954e96e806ac6bda13051ad37754f9d1bcce38514e50e41e6" origin="Generated by Gradle"/>
@ -3716,21 +3422,11 @@ https://docs.gradle.org/current/userguide/dependency_verification.html
<sha256 value="f4c23ffaaed717c3b99c003e0ee02d6d66377fd47d866fec7d971bd8644fc1a7" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.whispersystems" name="signal-client-android" version="0.11.0">
<artifact name="signal-client-android-0.11.0.aar">
<sha256 value="970c62e785f9364860a6cba69e481d2d4b830827e616eec470b5dd29410753f1" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.whispersystems" name="signal-client-android" version="0.12.3">
<artifact name="signal-client-android-0.12.3.aar">
<sha256 value="d3dbb49c3feaa62c98652ff902574edcdbd901e08337cecaf35512b58d131244" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.whispersystems" name="signal-client-java" version="0.11.0">
<artifact name="signal-client-java-0.11.0.jar">
<sha256 value="7bd19ccfbfc9c0f98c80aafc44bedc18706ab2e142e257e91f592bf9cbbd070a" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.whispersystems" name="signal-client-java" version="0.12.3">
<artifact name="signal-client-java-0.12.3.jar">
<sha256 value="d772561ea16a158f1e4a4ab0e64ec11591b8731af9739947f656391d037b152f" origin="Generated by Gradle"/>
@ -3766,10 +3462,5 @@ https://docs.gradle.org/current/userguide/dependency_verification.html
<sha256 value="0341395a481bb887803957145a6a37879853dd625e9244c2ea2509d9bb7531b9" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="xpp3" name="xpp3_min" version="1.1.4c">
<artifact name="xpp3_min-1.1.4c.jar">
<sha256 value="bfc90e9e32d0eab1f397fb974b5f150a815188382ac41f372a7149d5bc178008" origin="Generated by Gradle"/>
</artifact>
</component>
</components>
</verification-metadata>