Add ffx and arm64 emulator support for femu_test and emulator_arch flag in engine.proto

Also introduces a 'platform' attribute to test_suites.yaml. This will allow us to determine whether to run a test on an arm64/x64 emulator (or both)

Bug:fxb/114574
Change-Id: I894bac672b06e51f5ca387167bd7dd16f31f673b
Reviewed-on: https://flutter-review.googlesource.com/c/recipes/+/36360
Commit-Queue: Erik Lin <erkln@google.com>
Reviewed-by: Godofredo Contreras <godofredoc@google.com>
diff --git a/recipes/engine/engine.proto b/recipes/engine/engine.proto
index d35d91c..b6f7ab0 100644
--- a/recipes/engine/engine.proto
+++ b/recipes/engine/engine.proto
@@ -65,6 +65,10 @@
 
   // GClient variables.
   GClientVariables gclient_variables = 31;
+
+  // emulator architecture to run tests on
+  // Currently only used by femu_test
+  string emulator_arch = 32;
 }
 
 message EnvProperties {
diff --git a/recipes/engine/femu_test.expected/test-run test_command.json b/recipes/engine/femu_test.expected/arm64_emulator_arch.json
similarity index 94%
copy from recipes/engine/femu_test.expected/test-run test_command.json
copy to recipes/engine/femu_test.expected/arm64_emulator_arch.json
index 83a7065..c4708ec 100644
--- a/recipes/engine/femu_test.expected/test-run test_command.json
+++ b/recipes/engine/femu_test.expected/arm64_emulator_arch.json
@@ -187,7 +187,7 @@
       "--goma",
       "--fuchsia",
       "--fuchsia-cpu",
-      "x64",
+      "arm64",
       "--runtime-mode",
       "debug",
       "--no-lto"
@@ -209,7 +209,7 @@
         "RECIPE_REPO[depot_tools]"
       ]
     },
-    "name": "gn --fuchsia --fuchsia-cpu x64 --runtime-mode debug --no-lto"
+    "name": "gn --fuchsia --fuchsia-cpu arm64 --runtime-mode debug --no-lto"
   },
   {
     "cmd": [
@@ -218,7 +218,7 @@
       "--goma",
       "--fuchsia",
       "--fuchsia-cpu",
-      "x64",
+      "arm64",
       "--runtime-mode",
       "profile",
       "--no-lto"
@@ -240,7 +240,7 @@
         "RECIPE_REPO[depot_tools]"
       ]
     },
-    "name": "gn --fuchsia --fuchsia-cpu x64 --runtime-mode profile --no-lto"
+    "name": "gn --fuchsia --fuchsia-cpu arm64 --runtime-mode profile --no-lto"
   },
   {
     "cmd": [],
@@ -456,7 +456,7 @@
       "-j",
       "1024",
       "-C",
-      "[CACHE]/builder/src/out/fuchsia_debug_x64",
+      "[CACHE]/builder/src/out/fuchsia_debug_arm64",
       "flutter/shell/platform/fuchsia:fuchsia",
       "fuchsia_tests"
     ],
@@ -479,7 +479,7 @@
         "RECIPE_REPO[depot_tools]"
       ]
     },
-    "name": "build fuchsia_debug_x64 flutter/shell/platform/fuchsia:fuchsia fuchsia_tests"
+    "name": "build fuchsia_debug_arm64 flutter/shell/platform/fuchsia:fuchsia fuchsia_tests"
   },
   {
     "cmd": [],
@@ -734,7 +734,7 @@
       "-j",
       "1024",
       "-C",
-      "[CACHE]/builder/src/out/fuchsia_profile_x64",
+      "[CACHE]/builder/src/out/fuchsia_profile_arm64",
       "flutter/shell/platform/fuchsia:fuchsia",
       "fuchsia_tests"
     ],
@@ -757,7 +757,7 @@
         "RECIPE_REPO[depot_tools]"
       ]
     },
-    "name": "build fuchsia_profile_x64 flutter/shell/platform/fuchsia:fuchsia fuchsia_tests"
+    "name": "build fuchsia_profile_arm64 flutter/shell/platform/fuchsia:fuchsia fuchsia_tests"
   },
   {
     "cmd": [],
@@ -971,7 +971,7 @@
       "HEAD",
       "--skip-build",
       "--archs",
-      "x64",
+      "arm64",
       "--runtime-mode",
       "debug"
     ],
@@ -1002,7 +1002,7 @@
       "HEAD",
       "--skip-build",
       "--archs",
-      "x64",
+      "arm64",
       "--runtime-mode",
       "profile",
       "--skip-remove-buckets"
@@ -2636,12 +2636,10 @@
     "name": "Retrieve list of test suites",
     "~followup_annotations": [
       "@@@STEP_LOG_LINE@yaml@# This is a comment.@@@",
-      "@@@STEP_LOG_LINE@yaml@- test_command: test-run fuchsia-pkg://fuchsia.com/dart-jit-runner-integration-test#meta/dart-jit-runner-integration-test.cm@@@",
-      "@@@STEP_LOG_LINE@yaml@  run_with_dart_aot: true@@@",
-      "@@@STEP_LOG_LINE@yaml@  packages:@@@",
-      "@@@STEP_LOG_LINE@yaml@    - dart-aot-runner-integration-test-0.far@@@",
-      "@@@STEP_LOG_LINE@yaml@    - dart_aot_runner-0.far@@@",
-      "@@@STEP_LOG_LINE@yaml@    - gen/flutter/shell/platform/fuchsia/dart_runner/tests/startup_integration_test/dart_jit_runner/dart_jit_echo_server/dart_jit_echo_server/dart_jit_echo_server.far@@@",
+      "@@@STEP_LOG_LINE@yaml@- package: v2_test-123.far@@@",
+      "@@@STEP_LOG_LINE@yaml@  test_command: test-run fuchsia-pkg://fuchsia.com/v2_test#meta/v2_test.cm@@@",
+      "@@@STEP_LOG_LINE@yaml@  emulator_arch:@@@",
+      "@@@STEP_LOG_LINE@yaml@    - arm64@@@",
       "@@@STEP_LOG_END@yaml@@@"
     ]
   },
@@ -2678,12 +2676,10 @@
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@test_suites.yaml@# This is a comment.@@@",
-      "@@@STEP_LOG_LINE@test_suites.yaml@- test_command: test-run fuchsia-pkg://fuchsia.com/dart-jit-runner-integration-test#meta/dart-jit-runner-integration-test.cm@@@",
-      "@@@STEP_LOG_LINE@test_suites.yaml@  run_with_dart_aot: true@@@",
-      "@@@STEP_LOG_LINE@test_suites.yaml@  packages:@@@",
-      "@@@STEP_LOG_LINE@test_suites.yaml@    - dart-aot-runner-integration-test-0.far@@@",
-      "@@@STEP_LOG_LINE@test_suites.yaml@    - dart_aot_runner-0.far@@@",
-      "@@@STEP_LOG_LINE@test_suites.yaml@    - gen/flutter/shell/platform/fuchsia/dart_runner/tests/startup_integration_test/dart_jit_runner/dart_jit_echo_server/dart_jit_echo_server/dart_jit_echo_server.far@@@",
+      "@@@STEP_LOG_LINE@test_suites.yaml@- package: v2_test-123.far@@@",
+      "@@@STEP_LOG_LINE@test_suites.yaml@  test_command: test-run fuchsia-pkg://fuchsia.com/v2_test#meta/v2_test.cm@@@",
+      "@@@STEP_LOG_LINE@test_suites.yaml@  emulator_arch:@@@",
+      "@@@STEP_LOG_LINE@test_suites.yaml@    - arm64@@@",
       "@@@STEP_LOG_END@test_suites.yaml@@@"
     ]
   },
@@ -2719,12 +2715,11 @@
       "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@[@@@",
       "@@@STEP_LOG_LINE@json.output@  {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"packages\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      \"dart-aot-runner-integration-test-0.far\", @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"dart_aot_runner-0.far\", @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"gen/flutter/shell/platform/fuchsia/dart_runner/tests/startup_integration_test/dart_jit_runner/dart_jit_echo_server/dart_jit_echo_server/dart_jit_echo_server.far\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"emulator_arch\": [@@@",
+      "@@@STEP_LOG_LINE@json.output@      \"arm64\"@@@",
       "@@@STEP_LOG_LINE@json.output@    ], @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"test_command\": \"test-run fuchsia-pkg://fuchsia.com/dart-jit-runner-integration-test#meta/dart-jit-runner-integration-test.cm\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"package\": \"v2_test-123.far\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"test_command\": \"test-run fuchsia-pkg://fuchsia.com/v2_test#meta/v2_test.cm\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
       "@@@STEP_LOG_LINE@json.output@]@@@",
       "@@@STEP_LOG_END@json.output@@@"
@@ -2736,7 +2731,7 @@
       "-u",
       "RECIPE_MODULE[fuchsia::cas_util]/resources/hardlink.py",
       "--link-json",
-      "{\"RECIPE[flutter::engine/femu_test].resources/run_vdl_test.sh\": [\"[CLEANUP]/vdl_runfiles__tmp_1/run_vdl_test.sh\"], \"[CACHE]/builder/0.20200101.0.1/fuchsia_image/linux_intel_64/buildargs.gn\": [\"[CLEANUP]/vdl_runfiles__tmp_1/qemu_buildargs\"], \"[CACHE]/builder/0.20200101.0.1/fuchsia_image/linux_intel_64/qemu-kernel.kernel\": [\"[CLEANUP]/vdl_runfiles__tmp_1/qemu_kernel\"], \"[CACHE]/builder/0.20200101.0.1/fuchsia_image/linux_intel_64/storage-full.blk\": [\"[CLEANUP]/vdl_runfiles__tmp_1/qemu_fvm\"], \"[CACHE]/builder/0.20200101.0.1/fuchsia_packages/linux_intel_64/amber-files\": [\"[CLEANUP]/vdl_runfiles__tmp_1/amber-files\"], \"[CACHE]/builder/0.20200101.0.1/fuchsia_packages/linux_intel_64/pm\": [\"[CLEANUP]/vdl_runfiles__tmp_1/pm\"], \"[CACHE]/builder/0.20200101.0.1/fuchsia_sdk/linux_intel_64/tools/x64/far\": [\"[CLEANUP]/vdl_runfiles__tmp_1/far\"], \"[CACHE]/builder/0.20200101.0.1/fuchsia_sdk/linux_intel_64/tools/x64/fvm\": [\"[CLEANUP]/vdl_runfiles__tmp_1/fvm\"], \"[CACHE]/builder/0.20200101.0.1/fuchsia_sdk/linux_intel_64/tools/x64/symbolizer\": [\"[CLEANUP]/vdl_runfiles__tmp_1/symbolizer\"], \"[CACHE]/builder/aemu\": [\"[CLEANUP]/vdl_runfiles__tmp_1/aemu\"], \"[CACHE]/builder/device_spec/virtual_device.textproto\": [\"[CLEANUP]/vdl_runfiles__tmp_1/virtual_device.textproto\"], \"[CACHE]/builder/src/out/fuchsia_bucket/flutter/x64/debug/aot/flutter_aot_runner-0.far\": [\"[CLEANUP]/vdl_runfiles__tmp_1/flutter_aot_runner-0.far\"], \"[CACHE]/builder/src/out/fuchsia_debug_x64/dart-aot-runner-integration-test-0.far\": [\"[CLEANUP]/vdl_runfiles__tmp_1/dart-aot-runner-integration-test-0.far\"], \"[CACHE]/builder/src/out/fuchsia_debug_x64/dart_aot_runner-0.far\": [\"[CLEANUP]/vdl_runfiles__tmp_1/dart_aot_runner-0.far\"], \"[CACHE]/builder/src/out/fuchsia_debug_x64/gen/flutter/shell/platform/fuchsia/dart_runner/tests/startup_integration_test/dart_jit_runner/dart_jit_echo_server/dart_jit_echo_server/dart_jit_echo_server.far\": [\"[CLEANUP]/vdl_runfiles__tmp_1/dart_jit_echo_server.far\"], \"[CACHE]/builder/ssh/id_ed25519\": [\"[CLEANUP]/vdl_runfiles__tmp_1/id_ed25519\"], \"[CACHE]/builder/ssh/id_ed25519.pub\": [\"[CLEANUP]/vdl_runfiles__tmp_1/id_ed25519.pub\"], \"[CACHE]/builder/ssh_config\": [\"[CLEANUP]/vdl_runfiles__tmp_1/ssh_config\"], \"[CACHE]/builder/vdl/device_launcher\": [\"[CLEANUP]/vdl_runfiles__tmp_1/device_launcher\"], \"[CACHE]/builder/zircon-authorized.zbi\": [\"[CLEANUP]/vdl_runfiles__tmp_1/qemu_zircona-ed25519\"]}"
+      "{\"RECIPE[flutter::engine/femu_test].resources/run_vdl_test.sh\": [\"[CLEANUP]/vdl_runfiles__tmp_1/run_vdl_test.sh\"], \"[CACHE]/builder/0.20200101.0.1/fuchsia_image/linux_intel_64/buildargs.gn\": [\"[CLEANUP]/vdl_runfiles__tmp_1/qemu_buildargs\"], \"[CACHE]/builder/0.20200101.0.1/fuchsia_image/linux_intel_64/qemu-kernel.kernel\": [\"[CLEANUP]/vdl_runfiles__tmp_1/qemu_kernel\"], \"[CACHE]/builder/0.20200101.0.1/fuchsia_image/linux_intel_64/storage-full.blk\": [\"[CLEANUP]/vdl_runfiles__tmp_1/qemu_fvm\"], \"[CACHE]/builder/0.20200101.0.1/fuchsia_packages/linux_intel_64/amber-files\": [\"[CLEANUP]/vdl_runfiles__tmp_1/amber-files\"], \"[CACHE]/builder/0.20200101.0.1/fuchsia_packages/linux_intel_64/pm\": [\"[CLEANUP]/vdl_runfiles__tmp_1/pm\"], \"[CACHE]/builder/0.20200101.0.1/fuchsia_sdk/linux_intel_64/tools/x64/far\": [\"[CLEANUP]/vdl_runfiles__tmp_1/far\"], \"[CACHE]/builder/0.20200101.0.1/fuchsia_sdk/linux_intel_64/tools/x64/fvm\": [\"[CLEANUP]/vdl_runfiles__tmp_1/fvm\"], \"[CACHE]/builder/0.20200101.0.1/fuchsia_sdk/linux_intel_64/tools/x64/symbolizer\": [\"[CLEANUP]/vdl_runfiles__tmp_1/symbolizer\"], \"[CACHE]/builder/aemu\": [\"[CLEANUP]/vdl_runfiles__tmp_1/aemu\"], \"[CACHE]/builder/device_spec/virtual_device.textproto\": [\"[CLEANUP]/vdl_runfiles__tmp_1/virtual_device.textproto\"], \"[CACHE]/builder/src/out/fuchsia_bucket/flutter/arm64/debug/aot/flutter_aot_runner-0.far\": [\"[CLEANUP]/vdl_runfiles__tmp_1/flutter_aot_runner-0.far\"], \"[CACHE]/builder/src/out/fuchsia_debug_arm64/v2_test-123.far\": [\"[CLEANUP]/vdl_runfiles__tmp_1/v2_test-123.far\"], \"[CACHE]/builder/ssh/id_ed25519\": [\"[CLEANUP]/vdl_runfiles__tmp_1/id_ed25519\"], \"[CACHE]/builder/ssh/id_ed25519.pub\": [\"[CLEANUP]/vdl_runfiles__tmp_1/id_ed25519.pub\"], \"[CACHE]/builder/ssh_config\": [\"[CLEANUP]/vdl_runfiles__tmp_1/ssh_config\"], \"[CACHE]/builder/vdl/device_launcher\": [\"[CLEANUP]/vdl_runfiles__tmp_1/device_launcher\"], \"[CACHE]/builder/zircon-authorized.zbi\": [\"[CLEANUP]/vdl_runfiles__tmp_1/qemu_zircona-ed25519\"]}"
     ],
     "cwd": "[CACHE]/builder",
     "env": {
@@ -2921,7 +2916,7 @@
   },
   {
     "cmd": [],
-    "name": "FEMU Test.run FEMU Test dart-jit-runner-integration-test",
+    "name": "FEMU Test.run FEMU Test v2_test",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@"
     ]
@@ -2931,7 +2926,7 @@
       "[CACHE]/builder/src/fuchsia/sdk/linux/tools/x64/ffx",
       "product-bundle",
       "get",
-      "terminal.qemu-x64"
+      "terminal.qemu-arm64"
     ],
     "cwd": "[CLEANUP]/vdl_runfiles__tmp_1",
     "env": {
@@ -2950,7 +2945,7 @@
         "RECIPE_REPO[depot_tools]"
       ]
     },
-    "name": "FEMU Test.run FEMU Test dart-jit-runner-integration-test.get terminal.qemu-x64 product bundle",
+    "name": "FEMU Test.run FEMU Test v2_test.get terminal.qemu-arm64 product bundle",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@2@@@"
     ]
@@ -2960,10 +2955,14 @@
       "[CACHE]/builder/src/fuchsia/sdk/linux/tools/x64/ffx",
       "emu",
       "start",
-      "terminal.qemu-x64",
+      "terminal.qemu-arm64",
+      "--engine",
+      "qemu",
       "--headless",
+      "--startup-timeout",
+      "360",
       "--log",
-      "/path/to/tmp/"
+      "[CLEANUP]/emulator_log_tmp_1"
     ],
     "cwd": "[CLEANUP]/vdl_runfiles__tmp_1",
     "env": {
@@ -2982,18 +2981,16 @@
         "RECIPE_REPO[depot_tools]"
       ]
     },
-    "name": "FEMU Test.run FEMU Test dart-jit-runner-integration-test.launch x64 emulator with QEMU engine",
+    "name": "FEMU Test.run FEMU Test v2_test.launch arm64 emulator with QEMU engine",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
-      "@@@STEP_LOG_LINE@emulator_log@@@@",
-      "@@@STEP_LOG_END@emulator_log@@@"
+      "@@@STEP_NEST_LEVEL@2@@@"
     ]
   },
   {
     "cmd": [
       "[CACHE]/builder/src/fuchsia/sdk/linux/tools/x64/fserve",
       "-image",
-      "qemu-x64",
+      "qemu-arm64",
       "-server-port",
       "8084"
     ],
@@ -3014,7 +3011,7 @@
         "RECIPE_REPO[depot_tools]"
       ]
     },
-    "name": "FEMU Test.run FEMU Test dart-jit-runner-integration-test.start fserve",
+    "name": "FEMU Test.run FEMU Test v2_test.start fserve",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@2@@@"
     ]
@@ -3022,7 +3019,7 @@
   {
     "cmd": [
       "[CACHE]/builder/src/fuchsia/sdk/linux/tools/x64/fpublish",
-      "dart-aot-runner-integration-test-0.far"
+      "v2_test-123.far"
     ],
     "cwd": "[CLEANUP]/vdl_runfiles__tmp_1",
     "env": {
@@ -3041,61 +3038,7 @@
         "RECIPE_REPO[depot_tools]"
       ]
     },
-    "name": "FEMU Test.run FEMU Test dart-jit-runner-integration-test.publishing dart-aot-runner-integration-test-0.far",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CACHE]/builder/src/fuchsia/sdk/linux/tools/x64/fpublish",
-      "dart_aot_runner-0.far"
-    ],
-    "cwd": "[CLEANUP]/vdl_runfiles__tmp_1",
-    "env": {
-      "GOMA_DIR": "[CACHE]/goma/client"
-    },
-    "env_prefixes": {
-      "PATH": [
-        "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
-      ]
-    },
-    "env_suffixes": {
-      "DEPOT_TOOLS_UPDATE": [
-        "0"
-      ],
-      "PATH": [
-        "RECIPE_REPO[depot_tools]"
-      ]
-    },
-    "name": "FEMU Test.run FEMU Test dart-jit-runner-integration-test.publishing dart_aot_runner-0.far",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CACHE]/builder/src/fuchsia/sdk/linux/tools/x64/fpublish",
-      "dart_jit_echo_server.far"
-    ],
-    "cwd": "[CLEANUP]/vdl_runfiles__tmp_1",
-    "env": {
-      "GOMA_DIR": "[CACHE]/goma/client"
-    },
-    "env_prefixes": {
-      "PATH": [
-        "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
-      ]
-    },
-    "env_suffixes": {
-      "DEPOT_TOOLS_UPDATE": [
-        "0"
-      ],
-      "PATH": [
-        "RECIPE_REPO[depot_tools]"
-      ]
-    },
-    "name": "FEMU Test.run FEMU Test dart-jit-runner-integration-test.publishing dart_jit_echo_server.far",
+    "name": "FEMU Test.run FEMU Test v2_test.publishing v2_test-123.far",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@2@@@"
     ]
@@ -3105,7 +3048,7 @@
       "[CACHE]/builder/src/fuchsia/sdk/linux/tools/x64/ffx",
       "test",
       "run",
-      "fuchsia-pkg://fuchsia.com/dart-jit-runner-integration-test#meta/dart-jit-runner-integration-test.cm"
+      "fuchsia-pkg://fuchsia.com/v2_test#meta/v2_test.cm"
     ],
     "cwd": "[CLEANUP]/vdl_runfiles__tmp_1",
     "env": {
@@ -3124,7 +3067,7 @@
         "RECIPE_REPO[depot_tools]"
       ]
     },
-    "name": "FEMU Test.run FEMU Test dart-jit-runner-integration-test.run ffx test",
+    "name": "FEMU Test.run FEMU Test v2_test.run ffx test",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@2@@@"
     ]
@@ -3152,7 +3095,65 @@
         "RECIPE_REPO[depot_tools]"
       ]
     },
-    "name": "FEMU Test.run FEMU Test dart-jit-runner-integration-test.dump ffx log",
+    "name": "FEMU Test.run FEMU Test v2_test.ffx log dump",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@",
+      "@@@STEP_LOG_LINE@emulator_log@log@@@",
+      "@@@STEP_LOG_END@emulator_log@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "[CACHE]/builder/src/fuchsia/sdk/linux/tools/x64/fserve",
+      "-kill"
+    ],
+    "cwd": "[CLEANUP]/vdl_runfiles__tmp_1",
+    "env": {
+      "GOMA_DIR": "[CACHE]/goma/client"
+    },
+    "env_prefixes": {
+      "PATH": [
+        "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
+      ]
+    },
+    "env_suffixes": {
+      "DEPOT_TOOLS_UPDATE": [
+        "0"
+      ],
+      "PATH": [
+        "RECIPE_REPO[depot_tools]"
+      ]
+    },
+    "name": "FEMU Test.run FEMU Test v2_test.kill fserve",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "[CACHE]/builder/src/fuchsia/sdk/linux/tools/x64/ffx",
+      "emu",
+      "stop",
+      "--all"
+    ],
+    "cwd": "[CLEANUP]/vdl_runfiles__tmp_1",
+    "env": {
+      "GOMA_DIR": "[CACHE]/goma/client"
+    },
+    "env_prefixes": {
+      "PATH": [
+        "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
+      ]
+    },
+    "env_suffixes": {
+      "DEPOT_TOOLS_UPDATE": [
+        "0"
+      ],
+      "PATH": [
+        "RECIPE_REPO[depot_tools]"
+      ]
+    },
+    "name": "FEMU Test.run FEMU Test v2_test.stop arm64 emulator",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@2@@@"
     ]
diff --git a/recipes/engine/femu_test.expected/test-run test_command.json b/recipes/engine/femu_test.expected/invalid_emulator_arch.json
similarity index 94%
copy from recipes/engine/femu_test.expected/test-run test_command.json
copy to recipes/engine/femu_test.expected/invalid_emulator_arch.json
index 83a7065..f4a9b00 100644
--- a/recipes/engine/femu_test.expected/test-run test_command.json
+++ b/recipes/engine/femu_test.expected/invalid_emulator_arch.json
@@ -2636,12 +2636,8 @@
     "name": "Retrieve list of test suites",
     "~followup_annotations": [
       "@@@STEP_LOG_LINE@yaml@# This is a comment.@@@",
-      "@@@STEP_LOG_LINE@yaml@- test_command: test-run fuchsia-pkg://fuchsia.com/dart-jit-runner-integration-test#meta/dart-jit-runner-integration-test.cm@@@",
-      "@@@STEP_LOG_LINE@yaml@  run_with_dart_aot: true@@@",
-      "@@@STEP_LOG_LINE@yaml@  packages:@@@",
-      "@@@STEP_LOG_LINE@yaml@    - dart-aot-runner-integration-test-0.far@@@",
-      "@@@STEP_LOG_LINE@yaml@    - dart_aot_runner-0.far@@@",
-      "@@@STEP_LOG_LINE@yaml@    - gen/flutter/shell/platform/fuchsia/dart_runner/tests/startup_integration_test/dart_jit_runner/dart_jit_echo_server/dart_jit_echo_server/dart_jit_echo_server.far@@@",
+      "@@@STEP_LOG_LINE@yaml@- package: v2_test-123.far@@@",
+      "@@@STEP_LOG_LINE@yaml@  test_command: test-run fuchsia-pkg://fuchsia.com/v2_test#meta/v2_test.cm@@@",
       "@@@STEP_LOG_END@yaml@@@"
     ]
   },
@@ -2678,12 +2674,8 @@
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@test_suites.yaml@# This is a comment.@@@",
-      "@@@STEP_LOG_LINE@test_suites.yaml@- test_command: test-run fuchsia-pkg://fuchsia.com/dart-jit-runner-integration-test#meta/dart-jit-runner-integration-test.cm@@@",
-      "@@@STEP_LOG_LINE@test_suites.yaml@  run_with_dart_aot: true@@@",
-      "@@@STEP_LOG_LINE@test_suites.yaml@  packages:@@@",
-      "@@@STEP_LOG_LINE@test_suites.yaml@    - dart-aot-runner-integration-test-0.far@@@",
-      "@@@STEP_LOG_LINE@test_suites.yaml@    - dart_aot_runner-0.far@@@",
-      "@@@STEP_LOG_LINE@test_suites.yaml@    - gen/flutter/shell/platform/fuchsia/dart_runner/tests/startup_integration_test/dart_jit_runner/dart_jit_echo_server/dart_jit_echo_server/dart_jit_echo_server.far@@@",
+      "@@@STEP_LOG_LINE@test_suites.yaml@- package: v2_test-123.far@@@",
+      "@@@STEP_LOG_LINE@test_suites.yaml@  test_command: test-run fuchsia-pkg://fuchsia.com/v2_test#meta/v2_test.cm@@@",
       "@@@STEP_LOG_END@test_suites.yaml@@@"
     ]
   },
@@ -2719,12 +2711,8 @@
       "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@[@@@",
       "@@@STEP_LOG_LINE@json.output@  {@@@",
-      "@@@STEP_LOG_LINE@json.output@    \"packages\": [@@@",
-      "@@@STEP_LOG_LINE@json.output@      \"dart-aot-runner-integration-test-0.far\", @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"dart_aot_runner-0.far\", @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"gen/flutter/shell/platform/fuchsia/dart_runner/tests/startup_integration_test/dart_jit_runner/dart_jit_echo_server/dart_jit_echo_server/dart_jit_echo_server.far\"@@@",
-      "@@@STEP_LOG_LINE@json.output@    ], @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"test_command\": \"test-run fuchsia-pkg://fuchsia.com/dart-jit-runner-integration-test#meta/dart-jit-runner-integration-test.cm\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"package\": \"v2_test-123.far\", @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"test_command\": \"test-run fuchsia-pkg://fuchsia.com/v2_test#meta/v2_test.cm\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
       "@@@STEP_LOG_LINE@json.output@]@@@",
       "@@@STEP_LOG_END@json.output@@@"
@@ -2736,7 +2724,7 @@
       "-u",
       "RECIPE_MODULE[fuchsia::cas_util]/resources/hardlink.py",
       "--link-json",
-      "{\"RECIPE[flutter::engine/femu_test].resources/run_vdl_test.sh\": [\"[CLEANUP]/vdl_runfiles__tmp_1/run_vdl_test.sh\"], \"[CACHE]/builder/0.20200101.0.1/fuchsia_image/linux_intel_64/buildargs.gn\": [\"[CLEANUP]/vdl_runfiles__tmp_1/qemu_buildargs\"], \"[CACHE]/builder/0.20200101.0.1/fuchsia_image/linux_intel_64/qemu-kernel.kernel\": [\"[CLEANUP]/vdl_runfiles__tmp_1/qemu_kernel\"], \"[CACHE]/builder/0.20200101.0.1/fuchsia_image/linux_intel_64/storage-full.blk\": [\"[CLEANUP]/vdl_runfiles__tmp_1/qemu_fvm\"], \"[CACHE]/builder/0.20200101.0.1/fuchsia_packages/linux_intel_64/amber-files\": [\"[CLEANUP]/vdl_runfiles__tmp_1/amber-files\"], \"[CACHE]/builder/0.20200101.0.1/fuchsia_packages/linux_intel_64/pm\": [\"[CLEANUP]/vdl_runfiles__tmp_1/pm\"], \"[CACHE]/builder/0.20200101.0.1/fuchsia_sdk/linux_intel_64/tools/x64/far\": [\"[CLEANUP]/vdl_runfiles__tmp_1/far\"], \"[CACHE]/builder/0.20200101.0.1/fuchsia_sdk/linux_intel_64/tools/x64/fvm\": [\"[CLEANUP]/vdl_runfiles__tmp_1/fvm\"], \"[CACHE]/builder/0.20200101.0.1/fuchsia_sdk/linux_intel_64/tools/x64/symbolizer\": [\"[CLEANUP]/vdl_runfiles__tmp_1/symbolizer\"], \"[CACHE]/builder/aemu\": [\"[CLEANUP]/vdl_runfiles__tmp_1/aemu\"], \"[CACHE]/builder/device_spec/virtual_device.textproto\": [\"[CLEANUP]/vdl_runfiles__tmp_1/virtual_device.textproto\"], \"[CACHE]/builder/src/out/fuchsia_bucket/flutter/x64/debug/aot/flutter_aot_runner-0.far\": [\"[CLEANUP]/vdl_runfiles__tmp_1/flutter_aot_runner-0.far\"], \"[CACHE]/builder/src/out/fuchsia_debug_x64/dart-aot-runner-integration-test-0.far\": [\"[CLEANUP]/vdl_runfiles__tmp_1/dart-aot-runner-integration-test-0.far\"], \"[CACHE]/builder/src/out/fuchsia_debug_x64/dart_aot_runner-0.far\": [\"[CLEANUP]/vdl_runfiles__tmp_1/dart_aot_runner-0.far\"], \"[CACHE]/builder/src/out/fuchsia_debug_x64/gen/flutter/shell/platform/fuchsia/dart_runner/tests/startup_integration_test/dart_jit_runner/dart_jit_echo_server/dart_jit_echo_server/dart_jit_echo_server.far\": [\"[CLEANUP]/vdl_runfiles__tmp_1/dart_jit_echo_server.far\"], \"[CACHE]/builder/ssh/id_ed25519\": [\"[CLEANUP]/vdl_runfiles__tmp_1/id_ed25519\"], \"[CACHE]/builder/ssh/id_ed25519.pub\": [\"[CLEANUP]/vdl_runfiles__tmp_1/id_ed25519.pub\"], \"[CACHE]/builder/ssh_config\": [\"[CLEANUP]/vdl_runfiles__tmp_1/ssh_config\"], \"[CACHE]/builder/vdl/device_launcher\": [\"[CLEANUP]/vdl_runfiles__tmp_1/device_launcher\"], \"[CACHE]/builder/zircon-authorized.zbi\": [\"[CLEANUP]/vdl_runfiles__tmp_1/qemu_zircona-ed25519\"]}"
+      "{\"RECIPE[flutter::engine/femu_test].resources/run_vdl_test.sh\": [\"[CLEANUP]/vdl_runfiles__tmp_1/run_vdl_test.sh\"], \"[CACHE]/builder/0.20200101.0.1/fuchsia_image/linux_intel_64/buildargs.gn\": [\"[CLEANUP]/vdl_runfiles__tmp_1/qemu_buildargs\"], \"[CACHE]/builder/0.20200101.0.1/fuchsia_image/linux_intel_64/qemu-kernel.kernel\": [\"[CLEANUP]/vdl_runfiles__tmp_1/qemu_kernel\"], \"[CACHE]/builder/0.20200101.0.1/fuchsia_image/linux_intel_64/storage-full.blk\": [\"[CLEANUP]/vdl_runfiles__tmp_1/qemu_fvm\"], \"[CACHE]/builder/0.20200101.0.1/fuchsia_packages/linux_intel_64/amber-files\": [\"[CLEANUP]/vdl_runfiles__tmp_1/amber-files\"], \"[CACHE]/builder/0.20200101.0.1/fuchsia_packages/linux_intel_64/pm\": [\"[CLEANUP]/vdl_runfiles__tmp_1/pm\"], \"[CACHE]/builder/0.20200101.0.1/fuchsia_sdk/linux_intel_64/tools/x64/far\": [\"[CLEANUP]/vdl_runfiles__tmp_1/far\"], \"[CACHE]/builder/0.20200101.0.1/fuchsia_sdk/linux_intel_64/tools/x64/fvm\": [\"[CLEANUP]/vdl_runfiles__tmp_1/fvm\"], \"[CACHE]/builder/0.20200101.0.1/fuchsia_sdk/linux_intel_64/tools/x64/symbolizer\": [\"[CLEANUP]/vdl_runfiles__tmp_1/symbolizer\"], \"[CACHE]/builder/aemu\": [\"[CLEANUP]/vdl_runfiles__tmp_1/aemu\"], \"[CACHE]/builder/device_spec/virtual_device.textproto\": [\"[CLEANUP]/vdl_runfiles__tmp_1/virtual_device.textproto\"], \"[CACHE]/builder/src/out/fuchsia_bucket/flutter/x64/debug/aot/flutter_aot_runner-0.far\": [\"[CLEANUP]/vdl_runfiles__tmp_1/flutter_aot_runner-0.far\"], \"[CACHE]/builder/src/out/fuchsia_debug_x64/v2_test-123.far\": [\"[CLEANUP]/vdl_runfiles__tmp_1/v2_test-123.far\"], \"[CACHE]/builder/ssh/id_ed25519\": [\"[CLEANUP]/vdl_runfiles__tmp_1/id_ed25519\"], \"[CACHE]/builder/ssh/id_ed25519.pub\": [\"[CLEANUP]/vdl_runfiles__tmp_1/id_ed25519.pub\"], \"[CACHE]/builder/ssh_config\": [\"[CLEANUP]/vdl_runfiles__tmp_1/ssh_config\"], \"[CACHE]/builder/vdl/device_launcher\": [\"[CLEANUP]/vdl_runfiles__tmp_1/device_launcher\"], \"[CACHE]/builder/zircon-authorized.zbi\": [\"[CLEANUP]/vdl_runfiles__tmp_1/qemu_zircona-ed25519\"]}"
     ],
     "cwd": "[CACHE]/builder",
     "env": {
@@ -2921,7 +2909,7 @@
   },
   {
     "cmd": [],
-    "name": "FEMU Test.run FEMU Test dart-jit-runner-integration-test",
+    "name": "FEMU Test.run FEMU Test v2_test",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@"
     ]
@@ -2950,7 +2938,7 @@
         "RECIPE_REPO[depot_tools]"
       ]
     },
-    "name": "FEMU Test.run FEMU Test dart-jit-runner-integration-test.get terminal.qemu-x64 product bundle",
+    "name": "FEMU Test.run FEMU Test v2_test.get terminal.qemu-x64 product bundle",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@2@@@"
     ]
@@ -2963,7 +2951,7 @@
       "terminal.qemu-x64",
       "--headless",
       "--log",
-      "/path/to/tmp/"
+      "[CLEANUP]/emulator_log_tmp_1"
     ],
     "cwd": "[CLEANUP]/vdl_runfiles__tmp_1",
     "env": {
@@ -2982,11 +2970,9 @@
         "RECIPE_REPO[depot_tools]"
       ]
     },
-    "name": "FEMU Test.run FEMU Test dart-jit-runner-integration-test.launch x64 emulator with QEMU engine",
+    "name": "FEMU Test.run FEMU Test v2_test.launch x64 emulator",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
-      "@@@STEP_LOG_LINE@emulator_log@@@@",
-      "@@@STEP_LOG_END@emulator_log@@@"
+      "@@@STEP_NEST_LEVEL@2@@@"
     ]
   },
   {
@@ -3014,7 +3000,7 @@
         "RECIPE_REPO[depot_tools]"
       ]
     },
-    "name": "FEMU Test.run FEMU Test dart-jit-runner-integration-test.start fserve",
+    "name": "FEMU Test.run FEMU Test v2_test.start fserve",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@2@@@"
     ]
@@ -3022,7 +3008,7 @@
   {
     "cmd": [
       "[CACHE]/builder/src/fuchsia/sdk/linux/tools/x64/fpublish",
-      "dart-aot-runner-integration-test-0.far"
+      "v2_test-123.far"
     ],
     "cwd": "[CLEANUP]/vdl_runfiles__tmp_1",
     "env": {
@@ -3041,61 +3027,7 @@
         "RECIPE_REPO[depot_tools]"
       ]
     },
-    "name": "FEMU Test.run FEMU Test dart-jit-runner-integration-test.publishing dart-aot-runner-integration-test-0.far",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CACHE]/builder/src/fuchsia/sdk/linux/tools/x64/fpublish",
-      "dart_aot_runner-0.far"
-    ],
-    "cwd": "[CLEANUP]/vdl_runfiles__tmp_1",
-    "env": {
-      "GOMA_DIR": "[CACHE]/goma/client"
-    },
-    "env_prefixes": {
-      "PATH": [
-        "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
-      ]
-    },
-    "env_suffixes": {
-      "DEPOT_TOOLS_UPDATE": [
-        "0"
-      ],
-      "PATH": [
-        "RECIPE_REPO[depot_tools]"
-      ]
-    },
-    "name": "FEMU Test.run FEMU Test dart-jit-runner-integration-test.publishing dart_aot_runner-0.far",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CACHE]/builder/src/fuchsia/sdk/linux/tools/x64/fpublish",
-      "dart_jit_echo_server.far"
-    ],
-    "cwd": "[CLEANUP]/vdl_runfiles__tmp_1",
-    "env": {
-      "GOMA_DIR": "[CACHE]/goma/client"
-    },
-    "env_prefixes": {
-      "PATH": [
-        "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
-      ]
-    },
-    "env_suffixes": {
-      "DEPOT_TOOLS_UPDATE": [
-        "0"
-      ],
-      "PATH": [
-        "RECIPE_REPO[depot_tools]"
-      ]
-    },
-    "name": "FEMU Test.run FEMU Test dart-jit-runner-integration-test.publishing dart_jit_echo_server.far",
+    "name": "FEMU Test.run FEMU Test v2_test.publishing v2_test-123.far",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@2@@@"
     ]
@@ -3105,7 +3037,7 @@
       "[CACHE]/builder/src/fuchsia/sdk/linux/tools/x64/ffx",
       "test",
       "run",
-      "fuchsia-pkg://fuchsia.com/dart-jit-runner-integration-test#meta/dart-jit-runner-integration-test.cm"
+      "fuchsia-pkg://fuchsia.com/v2_test#meta/v2_test.cm"
     ],
     "cwd": "[CLEANUP]/vdl_runfiles__tmp_1",
     "env": {
@@ -3124,7 +3056,7 @@
         "RECIPE_REPO[depot_tools]"
       ]
     },
-    "name": "FEMU Test.run FEMU Test dart-jit-runner-integration-test.run ffx test",
+    "name": "FEMU Test.run FEMU Test v2_test.run ffx test",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@2@@@"
     ]
@@ -3152,7 +3084,65 @@
         "RECIPE_REPO[depot_tools]"
       ]
     },
-    "name": "FEMU Test.run FEMU Test dart-jit-runner-integration-test.dump ffx log",
+    "name": "FEMU Test.run FEMU Test v2_test.ffx log dump",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@",
+      "@@@STEP_LOG_LINE@emulator_log@log@@@",
+      "@@@STEP_LOG_END@emulator_log@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "[CACHE]/builder/src/fuchsia/sdk/linux/tools/x64/fserve",
+      "-kill"
+    ],
+    "cwd": "[CLEANUP]/vdl_runfiles__tmp_1",
+    "env": {
+      "GOMA_DIR": "[CACHE]/goma/client"
+    },
+    "env_prefixes": {
+      "PATH": [
+        "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
+      ]
+    },
+    "env_suffixes": {
+      "DEPOT_TOOLS_UPDATE": [
+        "0"
+      ],
+      "PATH": [
+        "RECIPE_REPO[depot_tools]"
+      ]
+    },
+    "name": "FEMU Test.run FEMU Test v2_test.kill fserve",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "[CACHE]/builder/src/fuchsia/sdk/linux/tools/x64/ffx",
+      "emu",
+      "stop",
+      "--all"
+    ],
+    "cwd": "[CLEANUP]/vdl_runfiles__tmp_1",
+    "env": {
+      "GOMA_DIR": "[CACHE]/goma/client"
+    },
+    "env_prefixes": {
+      "PATH": [
+        "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
+      ]
+    },
+    "env_suffixes": {
+      "DEPOT_TOOLS_UPDATE": [
+        "0"
+      ],
+      "PATH": [
+        "RECIPE_REPO[depot_tools]"
+      ]
+    },
+    "name": "FEMU Test.run FEMU Test v2_test.stop x64 emulator",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@2@@@"
     ]
diff --git a/recipes/engine/femu_test.expected/test-run test_command.json b/recipes/engine/femu_test.expected/run_on_test_specified_arch.json
similarity index 94%
copy from recipes/engine/femu_test.expected/test-run test_command.json
copy to recipes/engine/femu_test.expected/run_on_test_specified_arch.json
index 83a7065..9bce7b6 100644
--- a/recipes/engine/femu_test.expected/test-run test_command.json
+++ b/recipes/engine/femu_test.expected/run_on_test_specified_arch.json
@@ -2636,12 +2636,19 @@
     "name": "Retrieve list of test suites",
     "~followup_annotations": [
       "@@@STEP_LOG_LINE@yaml@# This is a comment.@@@",
-      "@@@STEP_LOG_LINE@yaml@- test_command: test-run fuchsia-pkg://fuchsia.com/dart-jit-runner-integration-test#meta/dart-jit-runner-integration-test.cm@@@",
+      "@@@STEP_LOG_LINE@yaml@- test_command: test-run fuchsia-pkg://fuchsia.com/run-on-both-arch#meta/run-on-both-arch.cm@@@",
       "@@@STEP_LOG_LINE@yaml@  run_with_dart_aot: true@@@",
       "@@@STEP_LOG_LINE@yaml@  packages:@@@",
       "@@@STEP_LOG_LINE@yaml@    - dart-aot-runner-integration-test-0.far@@@",
       "@@@STEP_LOG_LINE@yaml@    - dart_aot_runner-0.far@@@",
-      "@@@STEP_LOG_LINE@yaml@    - gen/flutter/shell/platform/fuchsia/dart_runner/tests/startup_integration_test/dart_jit_runner/dart_jit_echo_server/dart_jit_echo_server/dart_jit_echo_server.far@@@",
+      "@@@STEP_LOG_LINE@yaml@  emulator_arch:@@@",
+      "@@@STEP_LOG_LINE@yaml@    - x64@@@",
+      "@@@STEP_LOG_LINE@yaml@    - arm64@@@",
+      "@@@STEP_LOG_LINE@yaml@- test_command: test-run fuchsia-pkg://fuchsia.com/only-run-on-arm64#meta/only-run-on-arm64',@@@",
+      "@@@STEP_LOG_LINE@yaml@  packages:@@@",
+      "@@@STEP_LOG_LINE@yaml@    - dart_aot_runner-0.far'@@@",
+      "@@@STEP_LOG_LINE@yaml@  emulator_arch:@@@",
+      "@@@STEP_LOG_LINE@yaml@    - arm64@@@",
       "@@@STEP_LOG_END@yaml@@@"
     ]
   },
@@ -2678,12 +2685,19 @@
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@test_suites.yaml@# This is a comment.@@@",
-      "@@@STEP_LOG_LINE@test_suites.yaml@- test_command: test-run fuchsia-pkg://fuchsia.com/dart-jit-runner-integration-test#meta/dart-jit-runner-integration-test.cm@@@",
+      "@@@STEP_LOG_LINE@test_suites.yaml@- test_command: test-run fuchsia-pkg://fuchsia.com/run-on-both-arch#meta/run-on-both-arch.cm@@@",
       "@@@STEP_LOG_LINE@test_suites.yaml@  run_with_dart_aot: true@@@",
       "@@@STEP_LOG_LINE@test_suites.yaml@  packages:@@@",
       "@@@STEP_LOG_LINE@test_suites.yaml@    - dart-aot-runner-integration-test-0.far@@@",
       "@@@STEP_LOG_LINE@test_suites.yaml@    - dart_aot_runner-0.far@@@",
-      "@@@STEP_LOG_LINE@test_suites.yaml@    - gen/flutter/shell/platform/fuchsia/dart_runner/tests/startup_integration_test/dart_jit_runner/dart_jit_echo_server/dart_jit_echo_server/dart_jit_echo_server.far@@@",
+      "@@@STEP_LOG_LINE@test_suites.yaml@  emulator_arch:@@@",
+      "@@@STEP_LOG_LINE@test_suites.yaml@    - x64@@@",
+      "@@@STEP_LOG_LINE@test_suites.yaml@    - arm64@@@",
+      "@@@STEP_LOG_LINE@test_suites.yaml@- test_command: test-run fuchsia-pkg://fuchsia.com/only-run-on-arm64#meta/only-run-on-arm64',@@@",
+      "@@@STEP_LOG_LINE@test_suites.yaml@  packages:@@@",
+      "@@@STEP_LOG_LINE@test_suites.yaml@    - dart_aot_runner-0.far'@@@",
+      "@@@STEP_LOG_LINE@test_suites.yaml@  emulator_arch:@@@",
+      "@@@STEP_LOG_LINE@test_suites.yaml@    - arm64@@@",
       "@@@STEP_LOG_END@test_suites.yaml@@@"
     ]
   },
@@ -2719,12 +2733,24 @@
       "@@@STEP_NEST_LEVEL@1@@@",
       "@@@STEP_LOG_LINE@json.output@[@@@",
       "@@@STEP_LOG_LINE@json.output@  {@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"emulator_arch\": [@@@",
+      "@@@STEP_LOG_LINE@json.output@      \"x64\", @@@",
+      "@@@STEP_LOG_LINE@json.output@      \"arm64\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    ], @@@",
       "@@@STEP_LOG_LINE@json.output@    \"packages\": [@@@",
       "@@@STEP_LOG_LINE@json.output@      \"dart-aot-runner-integration-test-0.far\", @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"dart_aot_runner-0.far\", @@@",
-      "@@@STEP_LOG_LINE@json.output@      \"gen/flutter/shell/platform/fuchsia/dart_runner/tests/startup_integration_test/dart_jit_runner/dart_jit_echo_server/dart_jit_echo_server/dart_jit_echo_server.far\"@@@",
+      "@@@STEP_LOG_LINE@json.output@      \"dart_aot_runner-0.far\"@@@",
       "@@@STEP_LOG_LINE@json.output@    ], @@@",
-      "@@@STEP_LOG_LINE@json.output@    \"test_command\": \"test-run fuchsia-pkg://fuchsia.com/dart-jit-runner-integration-test#meta/dart-jit-runner-integration-test.cm\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"test_command\": \"test-run fuchsia-pkg://fuchsia.com/run-on-both-arch#meta/run-on-both-arch.cm\"@@@",
+      "@@@STEP_LOG_LINE@json.output@  }, @@@",
+      "@@@STEP_LOG_LINE@json.output@  {@@@",
+      "@@@STEP_LOG_LINE@json.output@    \"emulator_arch\": [@@@",
+      "@@@STEP_LOG_LINE@json.output@      \"arm64\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    ], @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"packages\": [@@@",
+      "@@@STEP_LOG_LINE@json.output@      \"dart_aot_runner-0.far\"@@@",
+      "@@@STEP_LOG_LINE@json.output@    ], @@@",
+      "@@@STEP_LOG_LINE@json.output@    \"test_command\": \"test-run fuchsia-pkg://fuchsia.com/only-run-on-arm64#meta/only-run-on-arm64\"@@@",
       "@@@STEP_LOG_LINE@json.output@  }@@@",
       "@@@STEP_LOG_LINE@json.output@]@@@",
       "@@@STEP_LOG_END@json.output@@@"
@@ -2736,7 +2762,7 @@
       "-u",
       "RECIPE_MODULE[fuchsia::cas_util]/resources/hardlink.py",
       "--link-json",
-      "{\"RECIPE[flutter::engine/femu_test].resources/run_vdl_test.sh\": [\"[CLEANUP]/vdl_runfiles__tmp_1/run_vdl_test.sh\"], \"[CACHE]/builder/0.20200101.0.1/fuchsia_image/linux_intel_64/buildargs.gn\": [\"[CLEANUP]/vdl_runfiles__tmp_1/qemu_buildargs\"], \"[CACHE]/builder/0.20200101.0.1/fuchsia_image/linux_intel_64/qemu-kernel.kernel\": [\"[CLEANUP]/vdl_runfiles__tmp_1/qemu_kernel\"], \"[CACHE]/builder/0.20200101.0.1/fuchsia_image/linux_intel_64/storage-full.blk\": [\"[CLEANUP]/vdl_runfiles__tmp_1/qemu_fvm\"], \"[CACHE]/builder/0.20200101.0.1/fuchsia_packages/linux_intel_64/amber-files\": [\"[CLEANUP]/vdl_runfiles__tmp_1/amber-files\"], \"[CACHE]/builder/0.20200101.0.1/fuchsia_packages/linux_intel_64/pm\": [\"[CLEANUP]/vdl_runfiles__tmp_1/pm\"], \"[CACHE]/builder/0.20200101.0.1/fuchsia_sdk/linux_intel_64/tools/x64/far\": [\"[CLEANUP]/vdl_runfiles__tmp_1/far\"], \"[CACHE]/builder/0.20200101.0.1/fuchsia_sdk/linux_intel_64/tools/x64/fvm\": [\"[CLEANUP]/vdl_runfiles__tmp_1/fvm\"], \"[CACHE]/builder/0.20200101.0.1/fuchsia_sdk/linux_intel_64/tools/x64/symbolizer\": [\"[CLEANUP]/vdl_runfiles__tmp_1/symbolizer\"], \"[CACHE]/builder/aemu\": [\"[CLEANUP]/vdl_runfiles__tmp_1/aemu\"], \"[CACHE]/builder/device_spec/virtual_device.textproto\": [\"[CLEANUP]/vdl_runfiles__tmp_1/virtual_device.textproto\"], \"[CACHE]/builder/src/out/fuchsia_bucket/flutter/x64/debug/aot/flutter_aot_runner-0.far\": [\"[CLEANUP]/vdl_runfiles__tmp_1/flutter_aot_runner-0.far\"], \"[CACHE]/builder/src/out/fuchsia_debug_x64/dart-aot-runner-integration-test-0.far\": [\"[CLEANUP]/vdl_runfiles__tmp_1/dart-aot-runner-integration-test-0.far\"], \"[CACHE]/builder/src/out/fuchsia_debug_x64/dart_aot_runner-0.far\": [\"[CLEANUP]/vdl_runfiles__tmp_1/dart_aot_runner-0.far\"], \"[CACHE]/builder/src/out/fuchsia_debug_x64/gen/flutter/shell/platform/fuchsia/dart_runner/tests/startup_integration_test/dart_jit_runner/dart_jit_echo_server/dart_jit_echo_server/dart_jit_echo_server.far\": [\"[CLEANUP]/vdl_runfiles__tmp_1/dart_jit_echo_server.far\"], \"[CACHE]/builder/ssh/id_ed25519\": [\"[CLEANUP]/vdl_runfiles__tmp_1/id_ed25519\"], \"[CACHE]/builder/ssh/id_ed25519.pub\": [\"[CLEANUP]/vdl_runfiles__tmp_1/id_ed25519.pub\"], \"[CACHE]/builder/ssh_config\": [\"[CLEANUP]/vdl_runfiles__tmp_1/ssh_config\"], \"[CACHE]/builder/vdl/device_launcher\": [\"[CLEANUP]/vdl_runfiles__tmp_1/device_launcher\"], \"[CACHE]/builder/zircon-authorized.zbi\": [\"[CLEANUP]/vdl_runfiles__tmp_1/qemu_zircona-ed25519\"]}"
+      "{\"RECIPE[flutter::engine/femu_test].resources/run_vdl_test.sh\": [\"[CLEANUP]/vdl_runfiles__tmp_1/run_vdl_test.sh\"], \"[CACHE]/builder/0.20200101.0.1/fuchsia_image/linux_intel_64/buildargs.gn\": [\"[CLEANUP]/vdl_runfiles__tmp_1/qemu_buildargs\"], \"[CACHE]/builder/0.20200101.0.1/fuchsia_image/linux_intel_64/qemu-kernel.kernel\": [\"[CLEANUP]/vdl_runfiles__tmp_1/qemu_kernel\"], \"[CACHE]/builder/0.20200101.0.1/fuchsia_image/linux_intel_64/storage-full.blk\": [\"[CLEANUP]/vdl_runfiles__tmp_1/qemu_fvm\"], \"[CACHE]/builder/0.20200101.0.1/fuchsia_packages/linux_intel_64/amber-files\": [\"[CLEANUP]/vdl_runfiles__tmp_1/amber-files\"], \"[CACHE]/builder/0.20200101.0.1/fuchsia_packages/linux_intel_64/pm\": [\"[CLEANUP]/vdl_runfiles__tmp_1/pm\"], \"[CACHE]/builder/0.20200101.0.1/fuchsia_sdk/linux_intel_64/tools/x64/far\": [\"[CLEANUP]/vdl_runfiles__tmp_1/far\"], \"[CACHE]/builder/0.20200101.0.1/fuchsia_sdk/linux_intel_64/tools/x64/fvm\": [\"[CLEANUP]/vdl_runfiles__tmp_1/fvm\"], \"[CACHE]/builder/0.20200101.0.1/fuchsia_sdk/linux_intel_64/tools/x64/symbolizer\": [\"[CLEANUP]/vdl_runfiles__tmp_1/symbolizer\"], \"[CACHE]/builder/aemu\": [\"[CLEANUP]/vdl_runfiles__tmp_1/aemu\"], \"[CACHE]/builder/device_spec/virtual_device.textproto\": [\"[CLEANUP]/vdl_runfiles__tmp_1/virtual_device.textproto\"], \"[CACHE]/builder/src/out/fuchsia_bucket/flutter/x64/debug/aot/flutter_aot_runner-0.far\": [\"[CLEANUP]/vdl_runfiles__tmp_1/flutter_aot_runner-0.far\"], \"[CACHE]/builder/src/out/fuchsia_debug_x64/dart-aot-runner-integration-test-0.far\": [\"[CLEANUP]/vdl_runfiles__tmp_1/dart-aot-runner-integration-test-0.far\"], \"[CACHE]/builder/src/out/fuchsia_debug_x64/dart_aot_runner-0.far\": [\"[CLEANUP]/vdl_runfiles__tmp_1/dart_aot_runner-0.far\"], \"[CACHE]/builder/ssh/id_ed25519\": [\"[CLEANUP]/vdl_runfiles__tmp_1/id_ed25519\"], \"[CACHE]/builder/ssh/id_ed25519.pub\": [\"[CLEANUP]/vdl_runfiles__tmp_1/id_ed25519.pub\"], \"[CACHE]/builder/ssh_config\": [\"[CLEANUP]/vdl_runfiles__tmp_1/ssh_config\"], \"[CACHE]/builder/vdl/device_launcher\": [\"[CLEANUP]/vdl_runfiles__tmp_1/device_launcher\"], \"[CACHE]/builder/zircon-authorized.zbi\": [\"[CLEANUP]/vdl_runfiles__tmp_1/qemu_zircona-ed25519\"]}"
     ],
     "cwd": "[CACHE]/builder",
     "env": {
@@ -2921,7 +2947,7 @@
   },
   {
     "cmd": [],
-    "name": "FEMU Test.run FEMU Test dart-jit-runner-integration-test",
+    "name": "FEMU Test.run FEMU Test run-on-both-arch",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@1@@@"
     ]
@@ -2950,7 +2976,7 @@
         "RECIPE_REPO[depot_tools]"
       ]
     },
-    "name": "FEMU Test.run FEMU Test dart-jit-runner-integration-test.get terminal.qemu-x64 product bundle",
+    "name": "FEMU Test.run FEMU Test run-on-both-arch.get terminal.qemu-x64 product bundle",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@2@@@"
     ]
@@ -2963,7 +2989,7 @@
       "terminal.qemu-x64",
       "--headless",
       "--log",
-      "/path/to/tmp/"
+      "[CLEANUP]/emulator_log_tmp_1"
     ],
     "cwd": "[CLEANUP]/vdl_runfiles__tmp_1",
     "env": {
@@ -2982,11 +3008,9 @@
         "RECIPE_REPO[depot_tools]"
       ]
     },
-    "name": "FEMU Test.run FEMU Test dart-jit-runner-integration-test.launch x64 emulator with QEMU engine",
+    "name": "FEMU Test.run FEMU Test run-on-both-arch.launch x64 emulator",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
-      "@@@STEP_LOG_LINE@emulator_log@@@@",
-      "@@@STEP_LOG_END@emulator_log@@@"
+      "@@@STEP_NEST_LEVEL@2@@@"
     ]
   },
   {
@@ -3014,7 +3038,7 @@
         "RECIPE_REPO[depot_tools]"
       ]
     },
-    "name": "FEMU Test.run FEMU Test dart-jit-runner-integration-test.start fserve",
+    "name": "FEMU Test.run FEMU Test run-on-both-arch.start fserve",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@2@@@"
     ]
@@ -3041,7 +3065,7 @@
         "RECIPE_REPO[depot_tools]"
       ]
     },
-    "name": "FEMU Test.run FEMU Test dart-jit-runner-integration-test.publishing dart-aot-runner-integration-test-0.far",
+    "name": "FEMU Test.run FEMU Test run-on-both-arch.publishing dart-aot-runner-integration-test-0.far",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@2@@@"
     ]
@@ -3068,34 +3092,7 @@
         "RECIPE_REPO[depot_tools]"
       ]
     },
-    "name": "FEMU Test.run FEMU Test dart-jit-runner-integration-test.publishing dart_aot_runner-0.far",
-    "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@"
-    ]
-  },
-  {
-    "cmd": [
-      "[CACHE]/builder/src/fuchsia/sdk/linux/tools/x64/fpublish",
-      "dart_jit_echo_server.far"
-    ],
-    "cwd": "[CLEANUP]/vdl_runfiles__tmp_1",
-    "env": {
-      "GOMA_DIR": "[CACHE]/goma/client"
-    },
-    "env_prefixes": {
-      "PATH": [
-        "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
-      ]
-    },
-    "env_suffixes": {
-      "DEPOT_TOOLS_UPDATE": [
-        "0"
-      ],
-      "PATH": [
-        "RECIPE_REPO[depot_tools]"
-      ]
-    },
-    "name": "FEMU Test.run FEMU Test dart-jit-runner-integration-test.publishing dart_jit_echo_server.far",
+    "name": "FEMU Test.run FEMU Test run-on-both-arch.publishing dart_aot_runner-0.far",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@2@@@"
     ]
@@ -3105,7 +3102,7 @@
       "[CACHE]/builder/src/fuchsia/sdk/linux/tools/x64/ffx",
       "test",
       "run",
-      "fuchsia-pkg://fuchsia.com/dart-jit-runner-integration-test#meta/dart-jit-runner-integration-test.cm"
+      "fuchsia-pkg://fuchsia.com/run-on-both-arch#meta/run-on-both-arch.cm"
     ],
     "cwd": "[CLEANUP]/vdl_runfiles__tmp_1",
     "env": {
@@ -3124,7 +3121,7 @@
         "RECIPE_REPO[depot_tools]"
       ]
     },
-    "name": "FEMU Test.run FEMU Test dart-jit-runner-integration-test.run ffx test",
+    "name": "FEMU Test.run FEMU Test run-on-both-arch.run ffx test",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@2@@@"
     ]
@@ -3152,7 +3149,65 @@
         "RECIPE_REPO[depot_tools]"
       ]
     },
-    "name": "FEMU Test.run FEMU Test dart-jit-runner-integration-test.dump ffx log",
+    "name": "FEMU Test.run FEMU Test run-on-both-arch.ffx log dump",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@",
+      "@@@STEP_LOG_LINE@emulator_log@log@@@",
+      "@@@STEP_LOG_END@emulator_log@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "[CACHE]/builder/src/fuchsia/sdk/linux/tools/x64/fserve",
+      "-kill"
+    ],
+    "cwd": "[CLEANUP]/vdl_runfiles__tmp_1",
+    "env": {
+      "GOMA_DIR": "[CACHE]/goma/client"
+    },
+    "env_prefixes": {
+      "PATH": [
+        "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
+      ]
+    },
+    "env_suffixes": {
+      "DEPOT_TOOLS_UPDATE": [
+        "0"
+      ],
+      "PATH": [
+        "RECIPE_REPO[depot_tools]"
+      ]
+    },
+    "name": "FEMU Test.run FEMU Test run-on-both-arch.kill fserve",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "[CACHE]/builder/src/fuchsia/sdk/linux/tools/x64/ffx",
+      "emu",
+      "stop",
+      "--all"
+    ],
+    "cwd": "[CLEANUP]/vdl_runfiles__tmp_1",
+    "env": {
+      "GOMA_DIR": "[CACHE]/goma/client"
+    },
+    "env_prefixes": {
+      "PATH": [
+        "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
+      ]
+    },
+    "env_suffixes": {
+      "DEPOT_TOOLS_UPDATE": [
+        "0"
+      ],
+      "PATH": [
+        "RECIPE_REPO[depot_tools]"
+      ]
+    },
+    "name": "FEMU Test.run FEMU Test run-on-both-arch.stop x64 emulator",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@2@@@"
     ]
diff --git a/recipes/engine/femu_test.expected/test-run test_command.json b/recipes/engine/femu_test.expected/test_run_command.json
similarity index 98%
rename from recipes/engine/femu_test.expected/test-run test_command.json
rename to recipes/engine/femu_test.expected/test_run_command.json
index 83a7065..eb85152 100644
--- a/recipes/engine/femu_test.expected/test-run test_command.json
+++ b/recipes/engine/femu_test.expected/test_run_command.json
@@ -2963,7 +2963,7 @@
       "terminal.qemu-x64",
       "--headless",
       "--log",
-      "/path/to/tmp/"
+      "[CLEANUP]/emulator_log_tmp_1"
     ],
     "cwd": "[CLEANUP]/vdl_runfiles__tmp_1",
     "env": {
@@ -2982,11 +2982,9 @@
         "RECIPE_REPO[depot_tools]"
       ]
     },
-    "name": "FEMU Test.run FEMU Test dart-jit-runner-integration-test.launch x64 emulator with QEMU engine",
+    "name": "FEMU Test.run FEMU Test dart-jit-runner-integration-test.launch x64 emulator",
     "~followup_annotations": [
-      "@@@STEP_NEST_LEVEL@2@@@",
-      "@@@STEP_LOG_LINE@emulator_log@@@@",
-      "@@@STEP_LOG_END@emulator_log@@@"
+      "@@@STEP_NEST_LEVEL@2@@@"
     ]
   },
   {
@@ -3152,7 +3150,65 @@
         "RECIPE_REPO[depot_tools]"
       ]
     },
-    "name": "FEMU Test.run FEMU Test dart-jit-runner-integration-test.dump ffx log",
+    "name": "FEMU Test.run FEMU Test dart-jit-runner-integration-test.ffx log dump",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@",
+      "@@@STEP_LOG_LINE@emulator_log@log@@@",
+      "@@@STEP_LOG_END@emulator_log@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "[CACHE]/builder/src/fuchsia/sdk/linux/tools/x64/fserve",
+      "-kill"
+    ],
+    "cwd": "[CLEANUP]/vdl_runfiles__tmp_1",
+    "env": {
+      "GOMA_DIR": "[CACHE]/goma/client"
+    },
+    "env_prefixes": {
+      "PATH": [
+        "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
+      ]
+    },
+    "env_suffixes": {
+      "DEPOT_TOOLS_UPDATE": [
+        "0"
+      ],
+      "PATH": [
+        "RECIPE_REPO[depot_tools]"
+      ]
+    },
+    "name": "FEMU Test.run FEMU Test dart-jit-runner-integration-test.kill fserve",
+    "~followup_annotations": [
+      "@@@STEP_NEST_LEVEL@2@@@"
+    ]
+  },
+  {
+    "cmd": [
+      "[CACHE]/builder/src/fuchsia/sdk/linux/tools/x64/ffx",
+      "emu",
+      "stop",
+      "--all"
+    ],
+    "cwd": "[CLEANUP]/vdl_runfiles__tmp_1",
+    "env": {
+      "GOMA_DIR": "[CACHE]/goma/client"
+    },
+    "env_prefixes": {
+      "PATH": [
+        "[CACHE]/builder/src/third_party/dart/tools/sdks/dart-sdk/bin"
+      ]
+    },
+    "env_suffixes": {
+      "DEPOT_TOOLS_UPDATE": [
+        "0"
+      ],
+      "PATH": [
+        "RECIPE_REPO[depot_tools]"
+      ]
+    },
+    "name": "FEMU Test.run FEMU Test dart-jit-runner-integration-test.stop x64 emulator",
     "~followup_annotations": [
       "@@@STEP_NEST_LEVEL@2@@@"
     ]
diff --git a/recipes/engine/femu_test.py b/recipes/engine/femu_test.py
index d741f99..8801b60 100644
--- a/recipes/engine/femu_test.py
+++ b/recipes/engine/femu_test.py
@@ -37,12 +37,21 @@
 
 PROPERTIES = InputProperties
 ENV_PROPERTIES = EnvProperties
+FSERVE_PORT = 8084
 
 
 def GetCheckoutPath(api):
   return api.path['cache'].join('builder', 'src')
 
 
+def GetEmulatorArch(api):
+  arch = api.properties.get('emulator_arch', 'x64')
+  if arch not in ['arm64', 'x64']:
+    api.step.StepWarning('invalid architecture: %s - defaulting to x64' % arch)
+    return 'x64'
+  return arch
+
+
 def Build(api, config, *targets):
   checkout = GetCheckoutPath(api)
   build_dir = checkout.join('out/%s' % config)
@@ -62,16 +71,17 @@
 
 
 def BuildAndTestFuchsia(api, build_script, git_rev):
+  arch = GetEmulatorArch(api)
   # Prepares build files for debug/JIT Fuchsia
-  RunGN(api, '--fuchsia', '--fuchsia-cpu', 'x64', '--runtime-mode', 'debug',
+  RunGN(api, '--fuchsia', '--fuchsia-cpu', arch, '--runtime-mode', 'debug',
         '--no-lto')
   # Prepares build files for profile/AOT Fuchsia
-  RunGN(api, '--fuchsia', '--fuchsia-cpu', 'x64', '--runtime-mode', 'profile',
+  RunGN(api, '--fuchsia', '--fuchsia-cpu', arch, '--runtime-mode', 'profile',
         '--no-lto')
   # Builds debug/JIT Fuchsia
-  Build(api, 'fuchsia_debug_x64', *GetFlutterFuchsiaBuildTargets(False, True))
+  Build(api, 'fuchsia_debug_%s' % arch, *GetFlutterFuchsiaBuildTargets(False, True))
   # Builds profile/AOT Fuchsia
-  Build(api, 'fuchsia_profile_x64', *GetFlutterFuchsiaBuildTargets(False, True))
+  Build(api, 'fuchsia_profile_%s' % arch, *GetFlutterFuchsiaBuildTargets(False, True))
 
   # Package the build artifacts.
   #
@@ -82,11 +92,11 @@
   # TODO(akbiggs): Clean this up if we feel brave.
   fuchsia_debug_package_cmd = [
       'python', build_script, '--engine-version', git_rev, '--skip-build',
-      '--archs', 'x64', '--runtime-mode', 'debug',
+      '--archs', arch, '--runtime-mode', 'debug',
   ]
   fuchsia_profile_package_cmd = [
       'python', build_script, '--engine-version', git_rev, '--skip-build',
-      '--archs', 'x64', '--runtime-mode', 'profile', '--skip-remove-buckets'
+      '--archs', arch, '--runtime-mode', 'profile', '--skip-remove-buckets'
   ]
   api.step('Package Debug/JIT Fuchsia Artifacts', fuchsia_debug_package_cmd)
   api.step('Package Profile/AOT Fuchsia Artifacts', fuchsia_profile_package_cmd)
@@ -168,13 +178,22 @@
     add(ssh_config, "ssh_config")
 
   def addFlutterTests():
+    arch = GetEmulatorArch(api)
     add(
-        checkout.join('out', 'fuchsia_bucket', 'flutter', 'x64', 'debug', 'aot',
+        checkout.join('out', 'fuchsia_bucket', 'flutter', arch, 'debug', 'aot',
                       'flutter_aot_runner-0.far'), 'flutter_aot_runner-0.far')
     test_suites_file = checkout.join(
       'flutter', 'testing', 'fuchsia', 'test_suites.yaml')
+
     for suite in api.yaml.read('Retrieve list of test suites',
                       test_suites_file, api.json.output()).json.output:
+      # Default behavior is to run all tests on x64 if "emulator_arch" not present
+      # If "emulator_arch" is present, we run based on the emulator_arch specified
+      # x64 - femu_test.py
+      # arm64 - arm_femu_test.py
+      if arch not in suite.get('emulator_arch', ['x64']):
+        continue
+
       # Ensure command is well-formed.
       # See https://fuchsia.dev/fuchsia-src/concepts/packages/package_url.
       match = re.match(r'^(run-test-component|run-test-suite|test-run) (?P<test_far_file>fuchsia-pkg://[0-9a-z\-_\.]+/(?P<name>[0-9a-z\-_\.]+)#meta/[0-9a-z\-_\.]+(\.cm|\.cmx))( +[0-9a-zA-Z\-_*\.: =]+)?$', suite['test_command'])
@@ -193,9 +212,9 @@
         basename = re.match(r'(:?.*/)*([^/]*$)', path).group(2)
         suite['package_basenames'].append(basename)
         if suite['run_with_dart_aot']:
-            add(checkout.join('out', 'fuchsia_profile_x64', path), basename)
+            add(checkout.join('out', 'fuchsia_profile_%s' % arch, path), basename)
         else:
-          add(checkout.join('out', 'fuchsia_debug_x64', path), basename)
+          add(checkout.join('out', 'fuchsia_debug_%s' % arch, path), basename)
       test_suites.append(suite)
 
   def addTestScript():
@@ -217,6 +236,8 @@
 def TestFuchsiaFEMU(api):
   """Run flutter tests on FEMU."""
   test_suites, root_dir, cas_hash = CasRoot(api)
+  arch = GetEmulatorArch(api)
+
   cmd = ['./run_vdl_test.sh']
   # These flags will be passed through to VDL
   cmd.append('--emulator_binary_path=aemu/emulator')
@@ -250,21 +271,69 @@
   fserve = checkout.join('fuchsia/sdk/linux/tools/x64/fserve')
   fpublish = checkout.join('fuchsia/sdk/linux/tools/x64/fpublish')
 
-  with api.context(cwd=root_dir), api.step.nest('FEMU Test'), api.step.defer_results():
+  with api.context(
+      cwd=root_dir), api.step.nest('FEMU Test'), api.step.defer_results():
     for suite in test_suites:
       if 'test-run' in suite['test_command']:
-        with api.context(cwd=root_dir), api.step.nest('run FEMU Test %s' % suite['name']):
-          api.step('get terminal.qemu-x64 product bundle', [ffx, 'product-bundle', 'get', 'terminal.qemu-x64'])
-          deferred_launch_step = api.step('launch x64 emulator with QEMU engine', [ffx, 'emu', 'start', 'terminal.qemu-x64', '--headless', '--log', api.raw_io.output_text(name='emulator_log')])
-          launch_step = deferred_launch_step.get_result()
-          launch_step.presentation.logs['emulator_log'] = launch_step.raw_io.output_texts['emulator_log']
-          api.step('start fserve', [fserve, '-image', 'qemu-x64', '-server-port', '8084'])
+        with api.step.nest('run FEMU Test %s' % suite['name']):
+          # Retrieve the required product bundle
+          # Contains necessary images, packages, etc to launch the emulator
+          api.step('get terminal.qemu-%s product bundle' % arch,
+                   [ffx, 'product-bundle', 'get',
+                    'terminal.qemu-%s' % arch])
 
+          # Launch the emulator
+          # Route the emulator_log to a temporary, defined path to output later
+          emulator_log_path = api.path.mkstemp('emulator_log')
+          if arch == 'arm64':
+            deferred_launch_step = api.step(
+                'launch arm64 emulator with QEMU engine', [
+                    ffx, 'emu', 'start', 'terminal.qemu-arm64', '--engine',
+                    'qemu', '--headless', '--startup-timeout', '360', '--log',
+                    api.raw_io.output_text(
+                        name='emulator_log', leak_to=emulator_log_path)
+                ],
+                step_test_data=(lambda: api.raw_io.test_api.output_text(
+                    'log', name='emulator_log')))
+          else:
+            deferred_launch_step = api.step(
+                'launch x64 emulator', [
+                    ffx, 'emu', 'start', 'terminal.qemu-x64', '--headless',
+                    '--log',
+                    api.raw_io.output_text(
+                        name='emulator_log', leak_to=emulator_log_path)
+                ],
+                step_test_data=(lambda: api.raw_io.test_api.output_text(
+                    'log', name='emulator_log')))
+
+          # Start a package server, this listens in the background for published files
+          # https://fuchsia.dev/reference/tools/sdk/fserve
+          api.step(
+              'start fserve',
+              [fserve, '-image',
+               'qemu-%s' % arch, '-server-port', FSERVE_PORT])
+
+          # Publishes the required FAR files needed to run the test to the package server
+          # https://fuchsia.dev/reference/tools/sdk/fpublish
           for package in suite['package_basenames']:
             api.step('publishing {}'.format(package), [fpublish, package])
 
-          api.step('run ffx test', [ffx, 'test', 'run', suite['test_far_file']])
-          api.step('dump ffx log', [ffx, 'log', 'dump'])
+          # Run the actual test
+          api.retry.step('run ffx test',
+                         [ffx, 'test', 'run', suite['test_far_file']])
+
+          # Outputs ffx log and emulator_log for debugging
+          deferred_dump_step = api.step('ffx log dump', [ffx, 'log', 'dump'])
+          dump_step = deferred_dump_step.get_result()
+          launch_step = deferred_launch_step.get_result()
+          # TODO(http://fxb/115447): Investigate why emulator_log isn't
+          # outputting full emulator logs
+          dump_step.presentation.logs[
+              'emulator_log'] = launch_step.raw_io.output_texts['emulator_log']
+
+          # Cleans up running processes to prevent clashing with future test runs
+          api.step('kill fserve', [fserve, '-kill'])
+          api.step('stop %s emulator' % arch, [ffx, 'emu', 'stop', '--all'])
       else:
         if suite['run_with_dart_aot']:
           test_cmd = cmd + [
@@ -309,6 +378,7 @@
               )
           )
 
+
 def BuildFuchsia(api):
   """
   Schedules release builds for x64 on other bots, and then builds the x64 runners
@@ -746,7 +816,7 @@
   )
 
   yield api.test(
-      'test-run test_command',
+      'test_run_command',
       api.properties(
           InputProperties(
               goma_jobs='1024',
@@ -810,3 +880,208 @@
           api.path['cache'].join('builder/ssh/ssh_host_key'),
       ),
   )
+
+  yield api.test(
+      'invalid_emulator_arch',
+      api.properties(
+          InputProperties(
+              goma_jobs='1024',
+              build_fuchsia=True,
+              test_fuchsia=True,
+              git_url='https://github.com/flutter/engine',
+              git_ref='refs/pull/1/head',
+              clobber=False,
+              emulator_arch='x32'
+          ),),
+      api.step_data(
+          'Retrieve list of test suites.parse',
+          api.json.output([{
+              'package':
+                  'v2_test-123.far',
+              'test_command':
+                  'test-run fuchsia-pkg://fuchsia.com/v2_test#meta/v2_test.cm'
+          }])),
+      api.step_data(
+          'Retrieve list of test suites.read',
+          api.file.read_text("""# This is a comment.
+- package: v2_test-123.far
+  test_command: test-run fuchsia-pkg://fuchsia.com/v2_test#meta/v2_test.cm""")),
+      api.step_data(
+          'Read manifest',
+          api.file.read_json({'id': '0.20200101.0.1'}),
+      ),
+      api.properties.environ(EnvProperties(SWARMING_TASK_ID='deadbeef')),
+      api.platform('linux', 64),
+      api.path.exists(
+          api.path['cache'].join(
+              'builder/0.20200101.0.1/fuchsia_image/linux_intel_64/buildargs.gn'
+          ),
+          api.path['cache'].join(
+              'builder/0.20200101.0.1/fuchsia_image/linux_intel_64/qemu-kernel.kernel'
+          ),
+          api.path['cache'].join(
+              'builder/0.20200101.0.1/fuchsia_image/linux_intel_64/storage-full.blk'
+          ),
+          api.path['cache'].join(
+              'builder/0.20200101.0.1/fuchsia_image/linux_intel_64/zircon-a.zbi'
+          ),
+          api.path['cache'].join(
+              'builder/0.20200101.0.1/fuchsia_packages/linux_intel_64/pm'),
+          api.path['cache'].join(
+              'builder/0.20200101.0.1/fuchsia_packages/linux_intel_64/amber-files'
+          ),
+          api.path['cache'].join(
+              'builder/0.20200101.0.1/fuchsia_packages/linux_intel_64/qemu-x64.tar.gz'
+          ),
+          api.path['cache'].join('builder/ssh/id_ed25519.pub'),
+          api.path['cache'].join('builder/ssh/id_ed25519'),
+          api.path['cache'].join('builder/ssh/ssh_host_key.pub'),
+          api.path['cache'].join('builder/ssh/ssh_host_key'),
+      ),
+  )
+
+  yield api.test(
+    'run_on_test_specified_arch',
+    api.properties(
+        InputProperties(
+            goma_jobs='1024',
+            build_fuchsia=True,
+            test_fuchsia=True,
+            git_url='https://github.com/flutter/engine',
+            git_ref='refs/pull/1/head',
+            clobber=False,
+        ),),
+    api.step_data(
+        'Retrieve list of test suites.parse',
+        api.json.output([{
+          'test_command': 'test-run fuchsia-pkg://fuchsia.com/run-on-both-arch#meta/run-on-both-arch.cm',
+          'packages': [
+            'dart-aot-runner-integration-test-0.far',
+            'dart_aot_runner-0.far',
+          ],
+          'emulator_arch': [
+            'x64',
+            'arm64',
+          ]
+        },{
+          'test_command': 'test-run fuchsia-pkg://fuchsia.com/only-run-on-arm64#meta/only-run-on-arm64',
+          'packages': [
+            'dart_aot_runner-0.far'
+          ],
+          'emulator_arch': [
+            'arm64'
+          ]
+        }])
+    ),
+    api.step_data(
+        'Retrieve list of test suites.read',
+        api.file.read_text('''# This is a comment.
+- test_command: test-run fuchsia-pkg://fuchsia.com/run-on-both-arch#meta/run-on-both-arch.cm
+  run_with_dart_aot: true
+  packages:
+    - dart-aot-runner-integration-test-0.far
+    - dart_aot_runner-0.far
+  emulator_arch:
+    - x64
+    - arm64
+- test_command: test-run fuchsia-pkg://fuchsia.com/only-run-on-arm64#meta/only-run-on-arm64',
+  packages:
+    - dart_aot_runner-0.far'
+  emulator_arch:
+    - arm64''')
+      ),
+      api.step_data(
+          'Read manifest',
+          api.file.read_json({'id': '0.20200101.0.1'}),
+      ),
+      api.properties.environ(EnvProperties(SWARMING_TASK_ID='deadbeef')),
+      api.platform('linux', 64),
+      api.path.exists(
+          api.path['cache'].join(
+              'builder/0.20200101.0.1/fuchsia_image/linux_intel_64/buildargs.gn'
+          ),
+          api.path['cache'].join(
+              'builder/0.20200101.0.1/fuchsia_image/linux_intel_64/qemu-kernel.kernel'
+          ),
+          api.path['cache'].join(
+              'builder/0.20200101.0.1/fuchsia_image/linux_intel_64/storage-full.blk'
+          ),
+          api.path['cache'].join(
+              'builder/0.20200101.0.1/fuchsia_image/linux_intel_64/zircon-a.zbi'
+          ),
+          api.path['cache'].join(
+              'builder/0.20200101.0.1/fuchsia_packages/linux_intel_64/pm'),
+          api.path['cache'].join(
+              'builder/0.20200101.0.1/fuchsia_packages/linux_intel_64/amber-files'
+          ),
+          api.path['cache'].join(
+              'builder/0.20200101.0.1/fuchsia_packages/linux_intel_64/qemu-x64.tar.gz'
+          ),
+          api.path['cache'].join('builder/ssh/id_ed25519.pub'),
+          api.path['cache'].join('builder/ssh/id_ed25519'),
+          api.path['cache'].join('builder/ssh/ssh_host_key.pub'),
+          api.path['cache'].join('builder/ssh/ssh_host_key'),
+      ),
+  )
+
+  yield api.test(
+      'arm64_emulator_arch',
+      api.properties(
+          InputProperties(
+              goma_jobs='1024',
+              build_fuchsia=True,
+              test_fuchsia=True,
+              git_url='https://github.com/flutter/engine',
+              git_ref='refs/pull/1/head',
+              clobber=False,
+              emulator_arch='arm64'
+          ),),
+      api.step_data(
+          'Retrieve list of test suites.parse',
+          api.json.output([{
+              'package':
+                  'v2_test-123.far',
+              'test_command':
+                  'test-run fuchsia-pkg://fuchsia.com/v2_test#meta/v2_test.cm',
+              'emulator_arch': ['arm64']
+          }])),
+      api.step_data(
+          'Retrieve list of test suites.read',
+          api.file.read_text("""# This is a comment.
+- package: v2_test-123.far
+  test_command: test-run fuchsia-pkg://fuchsia.com/v2_test#meta/v2_test.cm
+  emulator_arch:
+    - arm64""")),
+      api.step_data(
+          'Read manifest',
+          api.file.read_json({'id': '0.20200101.0.1'}),
+      ),
+      api.properties.environ(EnvProperties(SWARMING_TASK_ID='deadbeef')),
+      api.platform('linux', 64),
+      api.path.exists(
+          api.path['cache'].join(
+              'builder/0.20200101.0.1/fuchsia_image/linux_intel_64/buildargs.gn'
+          ),
+          api.path['cache'].join(
+              'builder/0.20200101.0.1/fuchsia_image/linux_intel_64/qemu-kernel.kernel'
+          ),
+          api.path['cache'].join(
+              'builder/0.20200101.0.1/fuchsia_image/linux_intel_64/storage-full.blk'
+          ),
+          api.path['cache'].join(
+              'builder/0.20200101.0.1/fuchsia_image/linux_intel_64/zircon-a.zbi'
+          ),
+          api.path['cache'].join(
+              'builder/0.20200101.0.1/fuchsia_packages/linux_intel_64/pm'),
+          api.path['cache'].join(
+              'builder/0.20200101.0.1/fuchsia_packages/linux_intel_64/amber-files'
+          ),
+          api.path['cache'].join(
+              'builder/0.20200101.0.1/fuchsia_packages/linux_intel_64/qemu-x64.tar.gz'
+          ),
+          api.path['cache'].join('builder/ssh/id_ed25519.pub'),
+          api.path['cache'].join('builder/ssh/id_ed25519'),
+          api.path['cache'].join('builder/ssh/ssh_host_key.pub'),
+          api.path['cache'].join('builder/ssh/ssh_host_key'),
+      ),
+  )