From 0797d82d67046b6ee9bc622fb63333812e9f3aae Mon Sep 17 00:00:00 2001
From: Hans-Christoph Steiner <hans@eds.org>
Date: Wed, 21 Oct 2020 11:10:46 +0200
Subject: [PATCH] fix emulator test breakage from !873

Use Mockito to mock LocaleList rather than changing App.java.  The only
reliably working emulator tests on gitlab-ci are emulator-22. The change to
App.java in 3406edefcd1807cc9352589ac86dbb725c3165b0 broke there:

E/ACRA    ( 2231): Caused by: java.lang.NoClassDefFoundError: android.os.LocaleList
E/ACRA    ( 2231): 	at libcore.reflect.InternalNames.getClass(InternalNames.java:55)
E/ACRA    ( 2231): 	at java.lang.Class.getDexCacheType(Class.java:479)
E/ACRA    ( 2231): 	at java.lang.reflect.ArtMethod.getDexCacheType(ArtMethod.java:191)
E/ACRA    ( 2231): 	at java.lang.reflect.ArtMethod.getReturnType(ArtMethod.java:145)
E/ACRA    ( 2231): 	at java.lang.reflect.Method.getReturnType(Method.java:184)
E/ACRA    ( 2231): 	at java.lang.Class.getDeclaredMethods(Class.java:771)
E/ACRA    ( 2231): 	at com.fasterxml.jackson.databind.util.ClassUtil.getClassMethods(ClassUtil.java:1172)
E/ACRA    ( 2231): 	at com.fasterxml.jackson.databind.introspect.AnnotatedMethodCollector._addMemberMethods(AnnotatedMethodCollector.java:117)
E/ACRA    ( 2231): 	at com.fasterxml.jackson.databind.introspect.AnnotatedMethodCollector.collect(AnnotatedMethodCollector.java:49)
E/ACRA    ( 2231): 	at com.fasterxml.jackson.databind.introspect.AnnotatedMethodCollector.collectMethods(AnnotatedMethodCollector.java:40)
E/ACRA    ( 2231): 	at com.fasterxml.jackson.databind.introspect.AnnotatedClass._methods(AnnotatedClass.java:382)
E/ACRA    ( 2231): 	at com.fasterxml.jackson.databind.introspect.AnnotatedClass.memberMethods(AnnotatedClass.java:322)
E/ACRA    ( 2231): 	at com.fasterxml.jackson.databind.introspect.POJOPropertiesCollector._addMethods(POJOPropertiesCollector.java:555)
E/ACRA    ( 2231): 	at com.fasterxml.jackson.databind.introspect.POJOPropertiesCollector.collectAll(POJOPropertiesCollector.java:323)
E/ACRA    ( 2231): 	at com.fasterxml.jackson.databind.introspect.POJOPropertiesCollector.getPropertyMap(POJOPropertiesCollector.java:287)
E/ACRA    ( 2231): 	at com.fasterxml.jackson.databind.introspect.POJOPropertiesCollector.getProperties(POJOPropertiesCollector.java:186)
E/ACRA    ( 2231): 	at com.fasterxml.jackson.databind.introspect.BasicBeanDescription._properties(BasicBeanDescription.java:164)
E/ACRA    ( 2231): 	at com.fasterxml.jackson.databind.introspect.BasicBeanDescription.findProperties(BasicBeanDescription.java:239)
E/ACRA    ( 2231): 	at com.fasterxml.jackson.databind.deser.BasicDeserializerFactory._findCreatorsFromProperties(BasicDeserializerFactory.java:292)
E/ACRA    ( 2231): 	at com.fasterxml.jackson.databind.deser.BasicDeserializerFactory._constructDefaultValueInstantiator(BasicDeserializerFactory.java:276)
E/ACRA    ( 2231): 	at com.fasterxml.jackson.databind.deser.BasicDeserializerFactory.findValueInstantiator(BasicDeserializerFactory.java:224)
E/ACRA    ( 2231): 	at com.fasterxml.jackson.databind.deser.BeanDeserializerFactory.buildBeanDeserializer(BeanDeserializerFactory.java:220)
E/ACRA    ( 2231): 	at com.fasterxml.jackson.databind.deser.BeanDeserializerFactory.createBeanDeserializer(BeanDeserializerFactory.java:143)
E/ACRA    ( 2231): 	at com.fasterxml.jackson.databind.deser.DeserializerCache._createDeserializer2(DeserializerCache.java:414)
E/ACRA    ( 2231): 	at com.fasterxml.jackson.databind.deser.DeserializerCache._createDeserializer(DeserializerCache.java:349)
E/ACRA    ( 2231): 	at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:264)
E/ACRA    ( 2231): 	at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCacheValueDeserializer(DeserializerCache.java:244)
E/ACRA    ( 2231): 	at com.fasterxml.jackson.databind.deser.DeserializerCache.findValueDeserializer(DeserializerCache.java:142)
E/ACRA    ( 2231): 	at com.fasterxml.jackson.databind.DeserializationContext.findContextualValueDeserializer(DeserializationContext.java:458)
E/ACRA    ( 2231): 	at com.fasterxml.jackson.databind.deser.std.ObjectArrayDeserializer.createContextual(ObjectArrayDeserializer.java:128)
E/ACRA    ( 2231): 	at com.fasterxml.jackson.databind.DeserializationContext.handleSecondaryContextualization(DeserializationContext.java:696)
E/ACRA    ( 2231): 	at com.fasterxml.jackson.databind.DeserializationContext.findRootValueDeserializer(DeserializationContext.java:496)
E/ACRA    ( 2231): 	at com.fasterxml.jackson.databind.Objec
---
 app/src/main/java/org/fdroid/fdroid/data/App.java        | 8 +-------
 .../java/org/fdroid/fdroid/data/LocaleSelectionTest.java | 9 ++++++---
 2 files changed, 7 insertions(+), 10 deletions(-)

diff --git a/app/src/main/java/org/fdroid/fdroid/data/App.java b/app/src/main/java/org/fdroid/fdroid/data/App.java
index 25f1fcd2b..af7bb638e 100644
--- a/app/src/main/java/org/fdroid/fdroid/data/App.java
+++ b/app/src/main/java/org/fdroid/fdroid/data/App.java
@@ -19,7 +19,6 @@ import android.text.TextUtils;
 import android.util.Log;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
-import androidx.annotation.RequiresApi;
 import com.fasterxml.jackson.annotation.JacksonInject;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
@@ -545,7 +544,7 @@ public class App extends ValueObject implements Comparable<App>, Parcelable {
             }
         }
         if (Build.VERSION.SDK_INT >= 24) {
-            LocaleList localeList = getLocales();
+            LocaleList localeList = Resources.getSystem().getConfiguration().getLocales();
             String[] sortedLocaleList = localeList.toLanguageTags().split(",");
             Arrays.sort(sortedLocaleList, new java.util.Comparator<String>() {
                 @Override
@@ -625,11 +624,6 @@ public class App extends ValueObject implements Comparable<App>, Parcelable {
         tvScreenshots = getLocalizedListEntry(localized, localesToUse, "tvScreenshots");
     }
 
-    @RequiresApi(api = Build.VERSION_CODES.N)
-    LocaleList getLocales() {
-        return Resources.getSystem().getConfiguration().getLocales();
-    }
-
     /**
      * Returns the right localized version of this entry, based on an immitation of
      * the logic that Android/Java uses.  On Android >= 24, this can get the
diff --git a/app/src/test/java/org/fdroid/fdroid/data/LocaleSelectionTest.java b/app/src/test/java/org/fdroid/fdroid/data/LocaleSelectionTest.java
index 60ec8b872..184d93dbc 100644
--- a/app/src/test/java/org/fdroid/fdroid/data/LocaleSelectionTest.java
+++ b/app/src/test/java/org/fdroid/fdroid/data/LocaleSelectionTest.java
@@ -1,6 +1,6 @@
 package org.fdroid.fdroid.data;
 
-
+import android.content.res.Configuration;
 import android.os.Build;
 import android.os.LocaleList;
 import org.fdroid.fdroid.TestUtils;
@@ -20,6 +20,7 @@ import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.when;
 
 @RunWith(RobolectricTestRunner.class)
+@SuppressWarnings("LocalVariableName")
 public class LocaleSelectionTest {
 
     private static final String KEY = "summary";
@@ -92,10 +93,12 @@ public class LocaleSelectionTest {
         assertTrue(Build.VERSION.SDK_INT >= 24);
 
         App app = spy(new App());
-        LocaleList localeList = mock(LocaleList.class);
 
         // we mock both the getLocales call and the conversion to a language tag string.
-        doReturn(localeList).when(app).getLocales();
+        Configuration configuration = mock(Configuration.class);
+        LocaleList localeList = mock(LocaleList.class);
+        doReturn(localeList).when(configuration).getLocales();
+
         // Set both default locale as well as the locale list, because the algorithm uses both...
         Locale.setDefault(new Locale("en", "US"));
         when(localeList.toLanguageTags()).thenReturn("en-US,de-DE");