Bug 1417255 - Add espresso to Fennec. r?maliu draft
authorNevin Chen <cnevinchen@gmail.com>
Wed, 15 Nov 2017 07:22:34 +0800
changeset 719458 bf46ae19a62fc2ec3bba001acb14cb07b224d2f7
parent 715543 7d81f423c7ff33c6be38b51e50bd8934e0b50dd9
child 719459 1b9b136d8ecca52b60aa2d44f6837525b1443dbd
push id95274
push userbmo:cnevinchen@gmail.com
push dateFri, 12 Jan 2018 08:44:43 +0000
reviewersmaliu
bugs1417255
milestone59.0a1
Bug 1417255 - Add espresso to Fennec. r?maliu The purpose of this bug is to run Espresso in Fennec locally. MozReview-Commit-ID: 9WsX63oDWQN
build.gradle
mobile/android/app/build.gradle
mobile/android/app/src/androidTest/java/org/mozilla/gecko/EspressoOnly.java
mobile/android/app/src/androidTest/java/org/mozilla/gecko/PwaBadgeTest.java
mobile/android/app/src/espresso/assets/pwa_test_site/badge_display.html
mobile/android/app/src/espresso/assets/pwa_test_site/badge_hide.html
mobile/android/app/src/espresso/assets/pwa_test_site/images/icon.png
mobile/android/app/src/espresso/assets/pwa_test_site/pwa.webmanifest
mobile/android/app/src/espresso/java/org/mozilla/gecko/uitest/UiTestConfig.java
mobile/android/app/src/local/java/org/mozilla/gecko/uitest/UiTestConfig.java
mobile/android/app/src/localOld/java/org/mozilla/gecko/uitest/UiTestConfig.java
mobile/android/app/src/official/java/org/mozilla/gecko/uitest/UiTestConfig.java
mobile/android/base/AppConstants.java.in
mobile/android/base/java/org/mozilla/gecko/BrowserApp.java
mobile/android/base/java/org/mozilla/gecko/pwa/PwaUtils.java
mobile/android/base/java/org/mozilla/gecko/toolbar/BrowserToolbar.java
mobile/android/base/java/org/mozilla/gecko/toolbar/PageActionLayout.java
mobile/android/base/moz.build
mobile/android/config/proguard/proguard-test.pro
testing/config/tooltool-manifests/linux64/hostutils.manifest
--- a/build.gradle
+++ b/build.gradle
@@ -10,16 +10,19 @@ def tryInt = { string ->
 
 allprojects {
     // Expose the per-object-directory configuration to all projects.
     ext {
         mozconfig = gradle.mozconfig
         topsrcdir = gradle.mozconfig.topsrcdir
         topobjdir = gradle.mozconfig.topobjdir
 
+        espressoVersion = '3.0.1'
+        androidTestVersion = '1.0.1'
+
         compileSdkVersion = tryInt(mozconfig.substs.ANDROID_COMPILE_SDK_VERSION)
         buildToolsVersion = tryInt(mozconfig.substs.ANDROID_BUILD_TOOLS_VERSION)
         targetSdkVersion = tryInt(mozconfig.substs.ANDROID_TARGET_SDK)
         minSdkVersion = tryInt(mozconfig.substs.MOZ_ANDROID_MIN_SDK_VERSION)
         manifestPlaceholders = [
             ANDROID_PACKAGE_NAME: mozconfig.substs.ANDROID_PACKAGE_NAME,
             ANDROID_TARGET_SDK: mozconfig.substs.ANDROID_TARGET_SDK,
             MOZ_ANDROID_MIN_SDK_VERSION: mozconfig.substs.MOZ_ANDROID_MIN_SDK_VERSION,
--- a/mobile/android/app/build.gradle
+++ b/mobile/android/app/build.gradle
@@ -58,16 +58,17 @@ android {
         // unfortunate side effect of Proguarding the instrumentation (Robocop) APK, but nothing
         // uses runtime inspection or class-loading with that APK, so it shouldn't be a problem.
         def configureMinifyClosure = {
             // Bug 1229269: we can't yet shrinkResources effectively.  Be sure
             // to use -stripped.ap_ after enabling this.
             // shrinkResources true
             minifyEnabled true
             proguardFile "${topsrcdir}/mobile/android/config/proguard/proguard.cfg"
+            testProguardFile "${topsrcdir}/mobile/android/config/proguard/proguard-test.pro"
         }
         release configureMinifyClosure
         if (mozconfig.substs.MOZILLA_OFFICIAL) {
             debug configureMinifyClosure
         }
     }
 
     // The "audience" flavour dimension distinguishes between _local_ builds (intended for
@@ -76,16 +77,25 @@ android {
     //
     // The "skin" flavor dimension distinguishes between different user interfaces.  We sometimes
     // want to develop significant new user interface pieces in-tree that don't ship (even in the
     // Nightly channel) while under development.  A new "skin" flavour allows us to develop such
     // pieces in Gradle without changing the mainline configuration.
     flavorDimensions "audience", "skin"
 
     productFlavors {
+        espresso{
+            dimension "audience"
+
+            testInstrumentationRunner 'android.support.test.runner.AndroidJUnitRunner'
+            testInstrumentationRunnerArgument 'annotation', 'org.mozilla.gecko.EspressoOnly'
+            testOptions {
+                animationsDisabled = true
+            }
+        }
         // For API 21+ - with pre-dexing, this will be faster for local development.
         local {
             dimension "audience"
 
             // For pre-dexing, setting `minSdkVersion 21` allows the Android gradle plugin to
             // pre-DEX each module and produce an APK that can be tested on
             // Android Lollipop without time consuming DEX merging processes.
             minSdkVersion 21
@@ -205,16 +215,18 @@ android {
         }
 
         androidTest {
             java {
                 srcDir "${topsrcdir}/mobile/android/tests/browser/robocop/src"
                 // Bug 1229149 tracks pushing this into a :services Gradle project.
                 srcDir "${topsrcdir}/mobile/android/services/src/androidTest/java"
                 srcDir "${topsrcdir}/mobile/android/tests/browser/junit3/src"
+                srcDir "${topsrcdir}/mobile/android/app/src/androidTest/java"
+
             }
             res {
                 srcDir "${topsrcdir}/mobile/android/tests/browser/robocop/res"
             }
             assets {
                 srcDir "${topsrcdir}/mobile/android/tests/browser/robocop/assets"
             }
         }
@@ -260,20 +272,41 @@ dependencies {
     // Include LeakCanary in most gradle based builds. LeakCanary adds about 5k methods, so we disable
     // it for the (non-proguarded, non-predex) localOld builds to allow space for other libraries.
     // Gradle based tests include the no-op version.  Mach based builds only include the no-op version
     // of this library.
     // It doesn't seem like there is a non-trivial way to be conditional on 'localOld', so instead we explicitly
     // define a version of leakcanary for every flavor:
     localCompile 'com.squareup.leakcanary:leakcanary-android:1.4-beta1'
     localOldCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.4-beta1'
+    espressoCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.4-beta1'
+
     officialCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.4-beta1'
     officialCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.4-beta1'
     testCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.4-beta1'
 
+    androidTestCompile ("com.android.support.test.espresso:espresso-core:$project.ext.espressoVersion"){
+        exclude module: 'support-annotations'
+        exclude module: 'support-v4'
+        exclude module: 'support-v13'
+        exclude module: 'recyclerview-v7'
+        exclude module: 'appcompat-v7'
+    }
+    androidTestCompile ("com.android.support.test:runner:$project.ext.androidTestVersion"){
+        exclude module: 'support-annotations'
+        exclude module: 'support-v4'
+        exclude module: 'support-v13'
+        exclude module: 'recyclerview-v7'
+        exclude module: 'appcompat-v7'
+    }
+    // Note that espresso-idling-resource is used in the code under test.
+    espressoCompile "com.android.support.test.espresso:espresso-idling-resource:$project.ext.espressoVersion";
+
+
+
     // With a simple "compile", Gradle will always build these libraries in their default configuration
     // (i.e. release), so we need to explicitly forward our own build configuration here (bug 1385695).
     //
     // Official builds compile a hacked up app:Official..Debug, but need the
     // release versions of the dependencies, in order to not have debugging
     // information.  It's not yet possible to specify just officialDebug, so we
     // hack around it here.
     if (mozconfig.substs.MOZILLA_OFFICIAL) {
new file mode 100644
--- /dev/null
+++ b/mobile/android/app/src/androidTest/java/org/mozilla/gecko/EspressoOnly.java
@@ -0,0 +1,17 @@
+package org.mozilla.gecko;
+
+
+import android.support.annotation.Keep;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+// https://medium.com/@satyajit/running-subset-of-espresso-tests-locally-and-gcloud-4713931da56
+//Needed to have annotations at a test level
+@Keep
+@Target({ ElementType.METHOD, ElementType.TYPE })
+@Retention(RetentionPolicy.RUNTIME)
+public @interface EspressoOnly {
+}
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/mobile/android/app/src/androidTest/java/org/mozilla/gecko/PwaBadgeTest.java
@@ -0,0 +1,31 @@
+package org.mozilla.gecko;
+
+import android.support.annotation.Keep;
+import android.support.test.rule.ActivityTestRule;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static android.support.test.espresso.Espresso.onView;
+import static android.support.test.espresso.assertion.ViewAssertions.matches;
+import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed;
+import static android.support.test.espresso.matcher.ViewMatchers.withId;
+
+@EspressoOnly
+@Keep
+@RunWith(AndroidJUnit4.class)
+public class PwaBadgeTest {
+
+    @Rule
+    public ActivityTestRule<BrowserApp> activityRule = new ActivityTestRule<>(BrowserApp.class);
+
+    @Test
+    public void simpleTest() {
+
+        onView(withId(R.id.url_bar_title_scroll_view)).check(matches(isDisplayed()));
+
+    }
+
+}
new file mode 100644
--- /dev/null
+++ b/mobile/android/app/src/espresso/assets/pwa_test_site/badge_display.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <title> test pwa</title>
+    <link rel="manifest" href="pwa.webmanifest">
+</head>
+<body>
+TEST
+</body>
+</html>
+
new file mode 100644
--- /dev/null
+++ b/mobile/android/app/src/espresso/assets/pwa_test_site/badge_hide.html
@@ -0,0 +1,10 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <title> test pwa</title>
+</head>
+<body>
+TEST
+</body>
+</html>
+
new file mode 100644
index 0000000000000000000000000000000000000000..5cf5c37e0ebc577a96453e0944181e3b3aec1ef4
GIT binary patch
literal 25413
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
A-T(jq
new file mode 100644
--- /dev/null
+++ b/mobile/android/app/src/espresso/assets/pwa_test_site/pwa.webmanifest
@@ -0,0 +1,16 @@
+{
+	"short_name": "PWA TEST",
+	"name": "PWA TEST",
+	"display": "standalone",
+	"icons": [
+	
+		{
+			"src": "images/icon.png",
+			"sizes": "192x192",
+			"type": "image/png"
+		}
+	],
+	"start_url": ".",
+	"theme_color": "#64c639",
+	"background_color": "#3c3c3c"
+}
new file mode 100644
--- /dev/null
+++ b/mobile/android/app/src/espresso/java/org/mozilla/gecko/uitest/UiTestConfig.java
@@ -0,0 +1,21 @@
+/* -*- Mode: Java; c-basic-offset: 4; tab-width: 4; indent-tabs-mode: nil; -*-
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+package org.mozilla.gecko.uitest;
+
+
+import android.support.annotation.VisibleForTesting;
+
+public class UiTestConfig {
+
+    // This method has different implementations among flavors.
+    // Only implementation in espresso flavor will return true;
+    // We do this because mach build can't recognize BuildConfig generated by Gradle build
+    @VisibleForTesting
+    public static boolean underUiTest() {
+        return true;
+    }
+
+
+}
new file mode 100644
--- /dev/null
+++ b/mobile/android/app/src/local/java/org/mozilla/gecko/uitest/UiTestConfig.java
@@ -0,0 +1,16 @@
+/* -*- Mode: Java; c-basic-offset: 4; tab-width: 4; indent-tabs-mode: nil; -*-
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+package org.mozilla.gecko.uitest;
+
+
+public class UiTestConfig {
+
+
+    public static boolean underUiTest() {
+        return false;
+    }
+
+
+}
new file mode 100644
--- /dev/null
+++ b/mobile/android/app/src/localOld/java/org/mozilla/gecko/uitest/UiTestConfig.java
@@ -0,0 +1,16 @@
+/* -*- Mode: Java; c-basic-offset: 4; tab-width: 4; indent-tabs-mode: nil; -*-
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+package org.mozilla.gecko.uitest;
+
+
+public class UiTestConfig {
+
+
+    public static boolean underUiTest() {
+        return false;
+    }
+
+
+}
new file mode 100644
--- /dev/null
+++ b/mobile/android/app/src/official/java/org/mozilla/gecko/uitest/UiTestConfig.java
@@ -0,0 +1,16 @@
+/* -*- Mode: Java; c-basic-offset: 4; tab-width: 4; indent-tabs-mode: nil; -*-
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+package org.mozilla.gecko.uitest;
+
+
+public class UiTestConfig {
+
+
+    public static boolean underUiTest() {
+        return false;
+    }
+
+
+}
--- a/mobile/android/base/AppConstants.java.in
+++ b/mobile/android/base/AppConstants.java.in
@@ -329,9 +329,10 @@ public class AppConstants {
 //#endif
 
     public static final String MOZ_POCKET_API_KEY =
 //#ifdef MOZ_ANDROID_POCKET
         "@MOZ_POCKET_API_KEY@";
 //#else
         null;
 //#endif
+
 }
--- a/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java
+++ b/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java
@@ -267,16 +267,26 @@ public class BrowserApp extends GeckoApp
     public static final String TAB_HISTORY_FRAGMENT_TAG = "tabHistoryFragment";
 
     // When the static action bar is shown, only the real toolbar chrome should be
     // shown when the toolbar is visible. Causing the toolbar animator to also
     // show the snapshot causes the content to shift under the users finger.
     // See: Bug 1358554
     private boolean mShowingToolbarChromeForActionBar;
 
+    private PwaBadgeListener pwaBadgeListener;
+
+    public void setPwaBadgeListener(PwaBadgeListener listener) {
+        pwaBadgeListener = listener;
+    }
+
+    interface PwaBadgeListener {
+        void onPwaBadgeChange();
+    }
+
     private static class MenuItemInfo {
         public int id;
         public String label;
         public boolean checkable;
         public boolean checked;
         public boolean enabled = true;
         public boolean visible = true;
         public int parent;
@@ -794,16 +804,17 @@ public class BrowserApp extends GeckoApp
             "Tab:Added",
             "Video:Play",
             "CharEncoding:Data",
             "CharEncoding:State",
             "Settings:Show",
             "Updater:Launch",
             "Sanitize:Finished",
             "Sanitize:OpenTabs",
+            "PageActions:Add",
             null);
 
         EventDispatcher.getInstance().registerBackgroundThreadListener(this,
             "Experiments:GetActive",
             "Experiments:SetOverride",
             "Experiments:ClearOverride",
             "Favicon:Request",
             "Feedback:MaybeLater",
@@ -1616,16 +1627,17 @@ public class BrowserApp extends GeckoApp
             "Tab:Added",
             "Video:Play",
             "CharEncoding:Data",
             "CharEncoding:State",
             "Settings:Show",
             "Updater:Launch",
             "Sanitize:Finished",
             "Sanitize:OpenTabs",
+            "PageActions:Add",
             null);
 
         EventDispatcher.getInstance().unregisterBackgroundThreadListener(this,
             "Experiments:GetActive",
             "Experiments:SetOverride",
             "Experiments:ClearOverride",
             "Favicon:Request",
             "Feedback:MaybeLater",
@@ -2199,16 +2211,21 @@ public class BrowserApp extends GeckoApp
                             BrowserDB.from(getProfile()),
                             contentProviderClient,
                             location, hasImage, metadata);
                 } finally {
                     contentProviderClient.release();
                 }
 
                 break;
+            case "PageActions:Add":
+                if (pwaBadgeListener != null) {
+                    pwaBadgeListener.onPwaBadgeChange();
+                }
+                break;
 
             default:
                 super.handleMessage(event, message, callback);
                 break;
         }
     }
 
     /**
--- a/mobile/android/base/java/org/mozilla/gecko/pwa/PwaUtils.java
+++ b/mobile/android/base/java/org/mozilla/gecko/pwa/PwaUtils.java
@@ -2,16 +2,17 @@
  * This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 package org.mozilla.gecko.pwa;
 
 import android.support.annotation.CheckResult;
 
 import org.mozilla.gecko.Tab;
+import org.mozilla.gecko.uitest.UiTestConfig;
 
 
 public class PwaUtils {
     /**
      * Check if this tab should add as PWA shortcut
      * From the document :https://developers.google.com/web/fundamentals/security/encrypt-in-transit/why-https
      * PWA must be served from a secure origin. We also restrict it to
      * 1. Not allow user accept exception
@@ -21,11 +22,19 @@ public class PwaUtils {
      * @return true if the tab shouldAddPwaShortcut
      */
     @CheckResult
     public static boolean shouldAddPwaShortcut(Tab tab) {
         final boolean secure = tab.getSiteIdentity().isSecure();
         // This tab is safe for pwa only when the site is absolutely secure.
         // so no exception is allowed
         final boolean exception = tab.getSiteIdentity().isSecurityException();
-        return !tab.isPrivate() && secure && !exception;
+
+        // There's no https/mixed content check for espresso.... for now.
+        if (UiTestConfig.underUiTest()) {
+            return !tab.isPrivate();
+        } else {
+            return !tab.isPrivate() && secure && !exception;
+        }
+
+
     }
 }
--- a/mobile/android/base/java/org/mozilla/gecko/toolbar/BrowserToolbar.java
+++ b/mobile/android/base/java/org/mozilla/gecko/toolbar/BrowserToolbar.java
@@ -7,16 +7,17 @@ package org.mozilla.gecko.toolbar;
 
 import java.util.ArrayList;
 import java.util.EnumSet;
 import java.util.List;
 
 import android.graphics.Rect;
 import android.support.annotation.Nullable;
 import android.support.v4.content.ContextCompat;
+
 import org.mozilla.gecko.BrowserApp;
 import org.mozilla.gecko.Clipboard;
 import org.mozilla.gecko.GeckoSharedPrefs;
 import org.mozilla.gecko.R;
 import org.mozilla.gecko.Tab;
 import org.mozilla.gecko.Tabs;
 import org.mozilla.gecko.Telemetry;
 import org.mozilla.gecko.TelemetryContract;
--- a/mobile/android/base/java/org/mozilla/gecko/toolbar/PageActionLayout.java
+++ b/mobile/android/base/java/org/mozilla/gecko/toolbar/PageActionLayout.java
@@ -1,15 +1,16 @@
 /* -*- Mode: Java; c-basic-offset: 4; tab-width: 20; indent-tabs-mode: nil; -*-
  * This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 package org.mozilla.gecko.toolbar;
 
+import org.mozilla.gecko.BrowserApp;
 import org.mozilla.gecko.EventDispatcher;
 import org.mozilla.gecko.GeckoSharedPrefs;
 import org.mozilla.gecko.R;
 import org.mozilla.gecko.Tab;
 import org.mozilla.gecko.Tabs;
 import org.mozilla.gecko.preferences.GeckoPreferences;
 import org.mozilla.gecko.pwa.PwaUtils;
 import org.mozilla.gecko.util.DrawableUtil;
@@ -153,20 +154,20 @@ public class PageActionLayout extends Th
                 @Override
                 public boolean onLongClick(String id) {
                     final GeckoBundle data = new GeckoBundle(1);
                     data.putString("id", id);
                     EventDispatcher.getInstance().dispatch("PageActions:LongClicked", data);
                     return true;
                 }
             }, important);
-
         } else if ("PageActions:Remove".equals(event)) {
             removePageAction(message.getString("id"));
         }
+
     }
 
     private void maybeShowPwaOnboarding(String id) {
         // only show pwa at normal mode
         final Tab selectedTab = Tabs.getInstance().getSelectedTab();
         if (!PwaUtils.shouldAddPwaShortcut(selectedTab)) {
             return;
         }
--- a/mobile/android/base/moz.build
+++ b/mobile/android/base/moz.build
@@ -982,16 +982,23 @@ gbjar.sources += ['java/org/mozilla/geck
     'widget/SquaredImageView.java',
     'widget/SquaredRelativeLayout.java',
     'widget/SwipeDismissListViewTouchListener.java',
     'widget/SwitchPreferenceView.java',
     'widget/TabThumbnailWrapper.java',
     'widget/ThumbnailView.java',
     'widget/TouchDelegateWithReset.java',
 ]]
+
+# We only pick the file in official flavor for mach build (underUiTest() will return false) .
+# The other UiTestConfig in other flavors are only used by Gradle
+gbjar.sources += ['../app/src/official/java/org/mozilla/gecko/' + x for x in [
+    'uitest/UiTestConfig.java'
+]]
+
 # The following sources are checked in to version control but
 # generated by a script (java/org/mozilla/gecko/widget/themed/generate_themed_views.py).
 # If you're editing this list, make sure to edit that script.
 gbjar.sources += ['java/org/mozilla/gecko/' + x for x in [
     'widget/themed/ThemedEditText.java',
     'widget/themed/ThemedFrameLayout.java',
     'widget/themed/ThemedImageButton.java',
     'widget/themed/ThemedImageView.java',
@@ -1016,17 +1023,17 @@ gbjar.sources += ['../app/src/photon/jav
     'toolbar/BrowserToolbarTabletBase.java',
     'toolbar/ForwardButton.java',
     'toolbar/TabCounter.java',
     'toolbar/ToolbarDisplayLayout.java',
     'toolbar/ToolbarRoundButton.java',
 ]]
 
 android_package_dir = CONFIG['ANDROID_PACKAGE_NAME'].replace('.', '/')
-gbjar.generated_sources = [] # Keep it this way.
+
 gbjar.extra_jars += [
     CONFIG['ANDROID_SUPPORT_ANNOTATIONS_JAR_LIB'],
     CONFIG['ANDROID_SUPPORT_V4_AAR_LIB'],
     CONFIG['ANDROID_SUPPORT_V4_AAR_INTERNAL_LIB'],
     'constants.jar',
 ]
 if CONFIG['MOZ_CRASHREPORTER']:
     gbjar.sources += [ 'java/org/mozilla/gecko/CrashReporter.java' ]
new file mode 100644
--- /dev/null
+++ b/mobile/android/config/proguard/proguard-test.pro
@@ -0,0 +1,35 @@
+# proguard-test.cfg:
+-include proguard.cfg
+
+-keepattributes SourceFile,LineNumberTable
+# ------------------- Nevin add -----
+
+#-ignorewarnings
+#-keep class org.kobjects.** { *; }
+#-keep class org.ksoap2.** { *; }
+#-keep class org.kxml2.** { *; }
+-keep class org.xmlpull.** { *; }
+-dontwarn org.xmlpull.**
+
+#-keep class javax.lang.model.element.Modifier
+
+-dontwarn com.squareup.javawriter.JavaWriter
+
+
+# ------------------- TEST DEPENDENCIES -------------------
+-dontwarn org.hamcrest.**
+-dontwarn android.test.**
+-dontwarn android.support.test.**
+
+-keep class org.hamcrest.** {
+   *;
+}
+
+-keep class org.junit.** { *; }
+-dontwarn org.junit.**
+
+-keep class junit.** { *; }
+-dontwarn junit.**
+
+-keep class sun.misc.** { *; }
+-dontwarn sun.misc.**
--- a/testing/config/tooltool-manifests/linux64/hostutils.manifest
+++ b/testing/config/tooltool-manifests/linux64/hostutils.manifest
@@ -1,10 +1,10 @@
 [
   {
-    "size": 72528696,
+    "size": 72112596,
     "visibility": "public",
-    "digest": "6a0ed81e1aa43ad9bb3ebbb32d259fbcb15d7f5bd0bac47471cb41fb29fe74c6ff8ab4559cecd9d4f15c68cf5ad2ed4a8e924e4f89638cb4e2edaa06b65e5527",
+    "digest": "4d3fe61dd8ad9ca09c72e677e8d2d5b7409988de32d6feb9fc55cb0a320a4835b6e2f384a68d2409e89e7a0d2f622bf3ceb9b707e01ad8afe1270ad0d1c9973c",
     "algorithm": "sha512",
-    "filename": "host-utils-58.0a1.en-US-linux-x86_64.tar.gz",
+    "filename": "host-utils-58.0a1.en-US.mac.tar.gz,
     "unpack": true
   }
 ]