Snap for 6686656 from c192a20f81d085674cf8d69d8c4a560b51b81af3 to sdk-release

Change-Id: Ifcf1c503aa5543c54fd35ffb9ac45c5e46d342fa
diff --git a/results/generate_result.py b/results/generate_result.py
index 1488c20..7358a51 100755
--- a/results/generate_result.py
+++ b/results/generate_result.py
@@ -28,6 +28,7 @@
 import csv
 import os
 import re
+import math
 
 
 class ScoreException(Exception):
@@ -54,6 +55,8 @@
     (re.compile('mobilenet_v1.*'), 'MobileNet v1 Float'),
     (re.compile('mobilenet_v2.*quant.*'), 'MobileNet v2 Quantized'),
     (re.compile('mobilenet_v2.*'), 'MobileNet v2 Float'),
+    (re.compile('mobilenet_v3.*uint8.*'), 'MobileNet v3 Quantized'),
+    (re.compile('mobilenet_v3.*'), 'MobileNet v3 Float'),
     (re.compile('tts.*'), 'LSTM Text-to-speech'),
     (re.compile('asr.*'), 'LSTM Automatic Speech Recognition'),
 ]
@@ -146,9 +149,13 @@
 def get_frequency_graph(time_freq_start_sec, time_freq_step_sec, time_freq_sec,
                         start_sec, end_sec):
   """Generate input x/y data for latency frequency graph."""
-  left_to_pad = int((time_freq_start_sec - start_sec) / time_freq_step_sec)
+  left_to_pad = (int((time_freq_start_sec - start_sec) / time_freq_step_sec)
+                 if time_freq_step_sec != 0
+                 else math.inf)
   end_time = time_freq_start_sec + len(time_freq_sec) * time_freq_step_sec
-  right_to_pad = int((end_sec - end_time) / time_freq_step_sec)
+  right_to_pad = (int((end_sec - end_time) / time_freq_step_sec)
+                  if time_freq_step_sec != 0
+                  else math.inf)
 
   # After pading more that 64 values, graphs start to look messy,
   # bail out in that case.
diff --git a/src/com/android/nn/crashtest/app/NNCrashTestActivity.java b/src/com/android/nn/crashtest/app/NNCrashTestActivity.java
new file mode 100644
index 0000000..b1ae0fe
--- /dev/null
+++ b/src/com/android/nn/crashtest/app/NNCrashTestActivity.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.nn.crashtest.app;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.util.Log;
+
+import com.android.nn.crashtest.core.CrashTest;
+import com.android.nn.crashtest.core.CrashTestCoordinator;
+
+import java.time.Duration;
+import java.util.concurrent.TimeUnit;
+
+public abstract class NNCrashTestActivity extends Activity {
+  public static final Duration MAX_TEST_DELAY_BEFORE_HANG = Duration.ofSeconds(30);
+
+  private final CrashTestStatus mTestStatus = new CrashTestStatus(this::logMessage);
+  private final CrashTestCoordinator mCoordinator = new CrashTestCoordinator(this);
+  private Duration mDuration;
+
+  protected void logMessage(String msg) {
+    Log.i(getTag(), msg);
+  }
+
+  protected abstract String getTag();
+
+  protected abstract String getTestName(Intent intent);
+
+  protected abstract long getTestDurationMillis(Intent intent);
+
+  protected abstract CrashTestCoordinator.CrashTestIntentInitializer getIntentInitializer(Intent intent);
+
+  protected abstract Class<? extends CrashTest> getTestClass();
+
+
+  @Override
+  protected void onResume() {
+    super.onResume();
+
+    final Intent intent = getIntent();
+
+    mDuration = Duration.ofMillis(getTestDurationMillis(intent));
+    mCoordinator.startTest(getTestClass(),
+        getIntentInitializer(intent),
+        mTestStatus,
+        /*separateProcess=*/true, getTestName(intent));
+  }
+
+  // This method blocks until the tests complete and returns true if all tests completed
+  // successfully
+  public CrashTestStatus.TestResult testResult() {
+    try {
+      final Duration testTimeout = mDuration.plus(MAX_TEST_DELAY_BEFORE_HANG);
+      boolean completed =
+              mTestStatus.waitForCompletion(testTimeout.toMillis(), TimeUnit.MILLISECONDS);
+      if (!completed) {
+        Log.w(getTag(), String.format("Test didn't complete within %s. Returning HANG", testTimeout));
+        return CrashTestStatus.TestResult.HANG;
+      }
+      return mTestStatus.result();
+    } catch (InterruptedException e) {
+      Log.w(getTag(), "Interrupted while waiting for test completion. Returning HANG");
+      return CrashTestStatus.TestResult.HANG;
+    }
+  }
+}
\ No newline at end of file
diff --git a/src/com/android/nn/crashtest/app/NNMultiProcessTestActivity.java b/src/com/android/nn/crashtest/app/NNMultiProcessTestActivity.java
index fb34ad4..026d070 100644
--- a/src/com/android/nn/crashtest/app/NNMultiProcessTestActivity.java
+++ b/src/com/android/nn/crashtest/app/NNMultiProcessTestActivity.java
@@ -19,59 +19,39 @@
 import android.app.Activity;
 import android.content.Intent;
 import android.util.Log;
+
+import com.android.nn.crashtest.core.CrashTest;
 import com.android.nn.crashtest.core.CrashTestCoordinator;
 import com.android.nn.crashtest.core.test.RunModelsInMultipleProcesses;
 import java.time.Duration;
 import java.util.concurrent.TimeUnit;
 
-public class NNMultiProcessTestActivity extends Activity {
+public class NNMultiProcessTestActivity extends NNCrashTestActivity {
   private static final String TAG = "NNMultiProcessTest";
-  public static final Duration MAX_TEST_DELAY_BEFORE_HANG = Duration.ofSeconds(30);
 
-  private final CrashTestStatus mTestStatus = new CrashTestStatus(this::logMessage);
-  private final CrashTestCoordinator mCoordinator = new CrashTestCoordinator(this);
-  private Duration mDuration;
-
-  protected void logMessage(String msg) {
-    Log.i(TAG, msg);
+  @Override
+  protected String getTag() {
+    return TAG;
   }
 
   @Override
-  protected void onResume() {
-    super.onResume();
-
-    final Intent intent = getIntent();
-
-    mDuration = Duration.ofMillis(intent.getLongExtra(
-        RunModelsInMultipleProcesses.TEST_DURATION, Duration.ofSeconds(30).toMillis()));
-    mCoordinator.startTest(RunModelsInMultipleProcesses.class,
-        RunModelsInMultipleProcesses.intentInitializer(
-            intent.getStringExtra(RunModelsInMultipleProcesses.TEST_NAME),
-            intent.getStringExtra(RunModelsInMultipleProcesses.MODEL_NAME),
-            intent.getIntExtra(RunModelsInMultipleProcesses.PROCESSES, 3),
-            intent.getIntExtra(RunModelsInMultipleProcesses.THREADS, 1), mDuration,
-            intent.getStringExtra(RunModelsInMultipleProcesses.NNAPI_DEVICE_NAME),
-            intent.getBooleanExtra(RunModelsInMultipleProcesses.JUST_COMPILE, false),
-            intent.getIntExtra(RunModelsInMultipleProcesses.CLIENT_FAILURE_RATE_PERCENT, 0)),
-        mTestStatus,
-        /*separateProcess=*/false, intent.getStringExtra(RunModelsInMultipleProcesses.TEST_NAME));
+  protected String getTestName(Intent intent) {
+    return intent.getStringExtra(RunModelsInMultipleProcesses.TEST_NAME);
   }
 
-  // This method blocks until the tests complete and returns true if all tests completed
-  // successfully
-  public CrashTestStatus.TestResult testResult() {
-    try {
-      final Duration testTimeout = mDuration.plus(MAX_TEST_DELAY_BEFORE_HANG);
-      boolean completed =
-          mTestStatus.waitForCompletion(testTimeout.toMillis(), TimeUnit.MILLISECONDS);
-      if (!completed) {
-        Log.w(TAG, String.format("Test didn't comoplete within %s. Returning HANG", testTimeout));
-        return CrashTestStatus.TestResult.HANG;
-      }
-      return mTestStatus.result();
-    } catch (InterruptedException e) {
-      Log.w(TAG, "Interrupted while waiting for test completion. Returning HANG");
-      return CrashTestStatus.TestResult.HANG;
-    }
+  @Override
+  protected long getTestDurationMillis(Intent intent) {
+    return intent.getLongExtra(
+            RunModelsInMultipleProcesses.TEST_DURATION, RunModelsInMultipleProcesses.DEFAULT_TEST_DURATION);
+  }
+
+  @Override
+  protected CrashTestCoordinator.CrashTestIntentInitializer getIntentInitializer(Intent intent) {
+    return RunModelsInMultipleProcesses.intentInitializer(intent);
+  }
+
+  @Override
+  protected Class<? extends CrashTest> getTestClass() {
+    return RunModelsInMultipleProcesses.class;
   }
 }
\ No newline at end of file
diff --git a/src/com/android/nn/crashtest/app/NNRandomGraphTestActivity.java b/src/com/android/nn/crashtest/app/NNRandomGraphTestActivity.java
index 76e2f64..d533532 100644
--- a/src/com/android/nn/crashtest/app/NNRandomGraphTestActivity.java
+++ b/src/com/android/nn/crashtest/app/NNRandomGraphTestActivity.java
@@ -16,68 +16,39 @@
 
 package com.android.nn.crashtest.app;
 
-import android.app.Activity;
 import android.content.Intent;
-import android.util.Log;
 
-
+import com.android.nn.crashtest.core.CrashTest;
 import com.android.nn.crashtest.core.CrashTestCoordinator;
 import com.android.nn.crashtest.core.test.RandomGraphTest;
 
-import java.time.Duration;
-import java.util.concurrent.TimeUnit;
-
-public class NNRandomGraphTestActivity extends Activity {
+public class NNRandomGraphTestActivity extends NNCrashTestActivity {
   private static final String TAG = "NN_RAND_MODEL";
 
-  private final CrashTestStatus mTestStatus = new CrashTestStatus(this::logMessage);
-  private final CrashTestCoordinator mCoordinator = new CrashTestCoordinator(this);
-  private Duration mDuration;
 
-  protected void logMessage(String msg) {
-    Log.i(TAG, msg);
+  @Override
+  protected String getTag() {
+    return TAG;
   }
 
   @Override
-  protected void onResume() {
-    super.onResume();
-
-    final Intent intent = getIntent();
-
-    mDuration = Duration.ofMillis(intent.getLongExtra(
-        RandomGraphTest.MAX_TEST_DURATION, RandomGraphTest.DEFAULT_MAX_TEST_DURATION_MILLIS));
-    mCoordinator.startTest(RandomGraphTest.class,
-        RandomGraphTest.intentInitializer(
-            intent.getIntExtra(RandomGraphTest.GRAPH_SIZE, RandomGraphTest.DEFAULT_GRAPH_SIZE),
-            intent.getIntExtra(
-                RandomGraphTest.DIMENSIONS_RANGE, RandomGraphTest.DEFAULT_DIMENSIONS_RANGE),
-            intent.getIntExtra(RandomGraphTest.MODELS_COUNT, RandomGraphTest.DEFAULT_MODELS_COUNT),
-            intent.getLongExtra(RandomGraphTest.PAUSE_BETWEEN_MODELS_MS,
-                RandomGraphTest.DEFAULT_PAUSE_BETWEEN_MODELS_MILLIS),
-            intent.getBooleanExtra(
-                RandomGraphTest.COMPILATION_ONLY, RandomGraphTest.DEFAULT_COMPILATION_ONLY),
-            intent.getStringExtra(RandomGraphTest.DEVICE_NAME),
-            mDuration.toMillis(),
-            intent.getStringExtra(RandomGraphTest.TEST_NAME)),
-        mTestStatus,
-        /*separateProcess=*/true, intent.getStringExtra(RandomGraphTest.TEST_NAME));
+  protected String getTestName(Intent intent) {
+    return intent.getStringExtra(RandomGraphTest.TEST_NAME);
   }
 
-  // This method blocks until the tests complete and returns true if all tests completed
-  // successfully
-  public CrashTestStatus.TestResult testResult() {
-    try {
-      final Duration testTimeout = mDuration.plus(Duration.ofSeconds(15));
-      boolean completed =
-          mTestStatus.waitForCompletion(testTimeout.toMillis(), TimeUnit.MILLISECONDS);
-      if (!completed) {
-        Log.w(TAG, String.format("Test didn't comoplete within %s. Returning HANG", testTimeout));
-        return CrashTestStatus.TestResult.HANG;
-      }
-      return mTestStatus.result();
-    } catch (InterruptedException e) {
-      Log.w(TAG, "Interrupted while waiting for test completion. Returning HANG");
-      return CrashTestStatus.TestResult.HANG;
-    }
+  @Override
+  protected long getTestDurationMillis(Intent intent) {
+    return intent.getLongExtra(
+            RandomGraphTest.MAX_TEST_DURATION, RandomGraphTest.DEFAULT_MAX_TEST_DURATION_MILLIS);
+  }
+
+  @Override
+  protected CrashTestCoordinator.CrashTestIntentInitializer getIntentInitializer(Intent intent) {
+    return RandomGraphTest.intentInitializer(intent);
+  }
+
+  @Override
+  protected Class<? extends CrashTest> getTestClass() {
+    return RandomGraphTest.class;
   }
 }
\ No newline at end of file
diff --git a/src/com/android/nn/crashtest/core/test/RandomGraphTest.java b/src/com/android/nn/crashtest/core/test/RandomGraphTest.java
index c5403ca..7abfb53 100644
--- a/src/com/android/nn/crashtest/core/test/RandomGraphTest.java
+++ b/src/com/android/nn/crashtest/core/test/RandomGraphTest.java
@@ -123,6 +123,24 @@
         };
     }
 
+    static public CrashTestCoordinator.CrashTestIntentInitializer intentInitializer(
+            Intent copyFrom) {
+        return intentInitializer(
+                copyFrom.getIntExtra(RandomGraphTest.GRAPH_SIZE,
+                        RandomGraphTest.DEFAULT_GRAPH_SIZE),
+                copyFrom.getIntExtra(
+                        RandomGraphTest.DIMENSIONS_RANGE, RandomGraphTest.DEFAULT_DIMENSIONS_RANGE),
+                copyFrom.getIntExtra(RandomGraphTest.MODELS_COUNT,
+                        RandomGraphTest.DEFAULT_MODELS_COUNT),
+                copyFrom.getLongExtra(RandomGraphTest.PAUSE_BETWEEN_MODELS_MS,
+                        RandomGraphTest.DEFAULT_PAUSE_BETWEEN_MODELS_MILLIS),
+                copyFrom.getBooleanExtra(
+                        RandomGraphTest.COMPILATION_ONLY, RandomGraphTest.DEFAULT_COMPILATION_ONLY),
+                copyFrom.getStringExtra(RandomGraphTest.DEVICE_NAME),
+                copyFrom.getLongExtra(MAX_TEST_DURATION,
+                        DEFAULT_MAX_TEST_DURATION_MILLIS),
+                copyFrom.getStringExtra(RandomGraphTest.TEST_NAME));
+    }
 
     private Context mContext;
     private String mDeviceName;
diff --git a/src/com/android/nn/crashtest/core/test/RunModelsInMultipleProcesses.java b/src/com/android/nn/crashtest/core/test/RunModelsInMultipleProcesses.java
index 320c31c..d23564e 100644
--- a/src/com/android/nn/crashtest/core/test/RunModelsInMultipleProcesses.java
+++ b/src/com/android/nn/crashtest/core/test/RunModelsInMultipleProcesses.java
@@ -47,6 +47,11 @@
   public static final String NNAPI_DEVICE_NAME = "nnapi_device_name";
   public static final String JUST_COMPILE = "just_compile";
   public static final String CLIENT_FAILURE_RATE_PERCENT = "client_failure_rate_percent";
+  public static final long DEFAULT_TEST_DURATION = Duration.ofSeconds(60).toMillis();
+  public static final int DEFAULT_PROCESSES = 3;
+  public static final int DEFAULT_THREADS = 1;
+  public static final boolean DEFAULT_JUST_COMPILE = false;
+  public static final int DEFAULT_CLIENT_FAILURE_RATE_PERCENT = 0;
 
   private Context mContext;
   private int mThreadCount;
@@ -72,6 +77,20 @@
       intent.putExtra(CLIENT_FAILURE_RATE_PERCENT, clientFailureRatePercent);
     };
   }
+  static public CrashTestCoordinator.CrashTestIntentInitializer intentInitializer(
+            Intent copyFrom) {
+    return intentInitializer(
+            copyFrom.getStringExtra(RunModelsInMultipleProcesses.TEST_NAME),
+            copyFrom.getStringExtra(RunModelsInMultipleProcesses.MODEL_NAME),
+            copyFrom.getIntExtra(RunModelsInMultipleProcesses.PROCESSES, DEFAULT_PROCESSES),
+            copyFrom.getIntExtra(RunModelsInMultipleProcesses.THREADS, DEFAULT_THREADS),
+            Duration.ofMillis(copyFrom.getLongExtra(TEST_DURATION, DEFAULT_TEST_DURATION)),
+            copyFrom.getStringExtra(RunModelsInMultipleProcesses.NNAPI_DEVICE_NAME),
+            copyFrom.getBooleanExtra(RunModelsInMultipleProcesses.JUST_COMPILE,
+                    DEFAULT_JUST_COMPILE),
+            copyFrom.getIntExtra(RunModelsInMultipleProcesses.CLIENT_FAILURE_RATE_PERCENT,
+                    DEFAULT_CLIENT_FAILURE_RATE_PERCENT));
+  }
 
   @Override
   public void init(
@@ -79,13 +98,14 @@
     mContext = context;
     mTestName = configParams.getStringExtra(TEST_NAME);
     mTestModelEntry = TestModels.getModelByName(configParams.getStringExtra(MODEL_NAME));
-    mProcessCount = configParams.getIntExtra(PROCESSES, 3);
-    mThreadCount = configParams.getIntExtra(THREADS, 1);
+    mProcessCount = configParams.getIntExtra(PROCESSES, DEFAULT_PROCESSES);
+    mThreadCount = configParams.getIntExtra(THREADS, DEFAULT_THREADS);
     mTestDuration = Duration.ofMillis(
-        configParams.getLongExtra(TEST_DURATION, Duration.ofSeconds(60).toMillis()));
+        configParams.getLongExtra(TEST_DURATION, DEFAULT_TEST_DURATION));
     mNnApiDeviceName = configParams.getStringExtra(NNAPI_DEVICE_NAME);
-    mJustCompileModel = configParams.getBooleanExtra(JUST_COMPILE, false);
-    mClientFailureRatePercent = configParams.getIntExtra(CLIENT_FAILURE_RATE_PERCENT, 0);
+    mJustCompileModel = configParams.getBooleanExtra(JUST_COMPILE, DEFAULT_JUST_COMPILE);
+    mClientFailureRatePercent = configParams.getIntExtra(CLIENT_FAILURE_RATE_PERCENT,
+            DEFAULT_CLIENT_FAILURE_RATE_PERCENT);
   }
 
   private void deleteOrWarn(File fileToDelete) {