diff --git a/fidldev/env.py b/fidldev/env.py
index f34ecfc..e5fbe8e 100644
--- a/fidldev/env.py
+++ b/fidldev/env.py
@@ -10,7 +10,7 @@
 assert FUCHSIA_DIR.exists()
 
 with open(FUCHSIA_DIR / ".fx-build-dir") as f:
-    BUILD_DIR = f.read().strip()
+    BUILD_DIR = os.path.join(FUCHSIA_DIR, f.read().strip())
 
 if sys.platform.startswith('linux'):
     PLATFORM = 'linux'
@@ -19,6 +19,3 @@
 else:
     print("Unsupported platform: " + sys.platform)
     sys.exit(1)
-
-with open(FUCHSIA_DIR / (BUILD_DIR + '.zircon') / 'args.gn') as f:
-    MODE = 'asan' if 'asan' in f.read() else 'clang'
diff --git a/fidldev/fidldev.py b/fidldev/fidldev.py
index 3bd6c06..edd9bef 100755
--- a/fidldev/fidldev.py
+++ b/fidldev/fidldev.py
@@ -49,6 +49,9 @@
 
 """
 
+VALID_TEST_TARGETS = [name for (name, _) in test_.TEST_GROUPS] + ['all']
+VALID_REGEN_TARGETS = [name for (name, _) in regen.REGEN_TARGETS] + ['all']
+
 
 def test(args):
     success = True
@@ -56,17 +59,23 @@
         if not args.no_regen:
             util.print_warning(
                 'explicit test targets provided, skipping regen...')
-        success = test_.test_explicit(
-            args.targets, not args.no_build, args.dry_run, args.interactive,
-            args.fx_test_args)
+        unknown_args = set(args.targets) - set(VALID_TEST_TARGETS)
+        if unknown_args:
+            util.print_err(
+                'Error: unknown test targets {}'.format(unknown_args))
+            print('use `fidldev test --help` to print list of valid targets')
+            sys.exit(1)
+        success = test_.test_explicit(args.targets, not args.no_build,
+                                      args.dry_run, args.interactive,
+                                      args.fx_test_args)
     else:
         changed_files = util.get_changed_files()
         if not args.no_regen:
             regen.regen_changed(changed_files, not args.no_build, args.dry_run)
             changed_files = util.get_changed_files()
-        success = test_.test_changed(
-            changed_files, not args.no_build, args.dry_run, args.interactive,
-            args.fx_test_args)
+        success = test_.test_changed(changed_files, not args.no_build,
+                                     args.dry_run, args.interactive,
+                                     args.fx_test_args)
         if args.dry_run:
             print_dryrun_warning()
     if not success:
@@ -75,6 +84,12 @@
 
 def regen_cmd(args):
     if args.targets:
+        unknown_args = set(args.targets) - set(VALID_REGEN_TARGETS)
+        if unknown_args:
+            util.print_err(
+                'Error: unknown regen targets {}'.format(unknown_args))
+            print('use `fidldev regen --help` to print list of valid targets')
+            sys.exit(1)
         regen.regen_explicit(args.targets, not args.no_build, args.dry_run)
     else:
         changed_files = util.get_changed_files()
@@ -84,10 +99,9 @@
 
 
 def print_dryrun_warning():
-    print(
-        'NOTE: dry run is conservative and assumes that regen will '
-        'always change files. If goldens do not change during an actual '
-        'run, fewer tests/regen scripts may be run.')
+    print('NOTE: dry run is conservative and assumes that regen will '
+          'always change files. If goldens do not change during an actual '
+          'run, fewer tests/regen scripts may be run.')
 
 
 parser = argparse.ArgumentParser(
@@ -98,14 +112,13 @@
 
 test_parser = subparsers.add_parser("test", help="Test your FIDL changes")
 test_parser.set_defaults(func=test)
-test_targets = [name for (name, _) in test_.TEST_GROUPS] + ['all']
 test_parser.add_argument(
     'targets',
     metavar='target',
     nargs='*',
     help=
     "Manually specify targets to regen, where a target is one of {}. Omit positional arguments to test based on changed files"
-    .format(test_targets))
+    .format(VALID_TEST_TARGETS))
 test_parser.add_argument(
     "--dry-run",
     "-n",
@@ -140,14 +153,13 @@
 
 regen_parser = subparsers.add_parser("regen", help="Run regen commands")
 regen_parser.set_defaults(func=regen_cmd)
-regen_targets = [name for (name, _) in regen.REGEN_TARGETS] + ['all']
 regen_parser.add_argument(
     'targets',
     metavar='target',
     nargs='*',
     help=
     "Manually specify targets to regen, where a target is one of {}. Omit positional arguments to regen based on changed files"
-    .format(regen_targets))
+    .format(VALID_REGEN_TARGETS))
 regen_parser.add_argument(
     "--dry-run",
     "-n",
diff --git a/fidldev/test_util.py b/fidldev/test_util.py
index c70ca7c..826c234 100644
--- a/fidldev/test_util.py
+++ b/fidldev/test_util.py
@@ -6,11 +6,10 @@
 
 # mock out these environment consts before importing anything else
 MOCK_FUCHSIA_DIR = 'fuchsia_dir'
-MOCK_BUILD_DIR = 'out/default'
+MOCK_BUILD_DIR = 'fuchsia_dir/out/default'
 env.FUCHSIA_DIR = MOCK_FUCHSIA_DIR
 env.BUILD_DIR = MOCK_BUILD_DIR
 env.PLATFORM = 'linux'
-env.MODE = 'clang'
 
 import fidldev
 import util
diff --git a/fidldev/util.py b/fidldev/util.py
index a07e250..1bfeed6 100644
--- a/fidldev/util.py
+++ b/fidldev/util.py
@@ -1,7 +1,7 @@
 import os
 import subprocess
 
-from env import FUCHSIA_DIR, BUILD_DIR, MODE, PLATFORM
+from env import FUCHSIA_DIR, BUILD_DIR, PLATFORM
 
 TOPAZ_DIR = os.path.join(FUCHSIA_DIR, 'topaz')
 GO_DIR = os.path.join(FUCHSIA_DIR, 'third_party/go')
@@ -22,7 +22,7 @@
     'tools/fidl/fidlgen_syzkaller',
 ]
 
-TEST_FIDLC = os.path.join(FUCHSIA_DIR, BUILD_DIR, 'host_x64/fidl-compiler')
+TEST_FIDLC = os.path.join(BUILD_DIR, 'host_x64/fidl-compiler')
 FIDLGEN_TEST_TARGETS = FIDLGEN_BACKEND_DIRS
 FIDLGEN_DART_TEST_TARGET = '//topaz/bin/fidlgen_dart'
 HLCPP_TEST_TARGET = '//sdk/lib/fidl'
@@ -65,8 +65,8 @@
     retcode = subprocess.call(command, shell=isinstance(command, str))
     success = retcode == 0
     if exit_on_failure and not success:
-        print_err(
-            'Error: command failed with status {}! {}'.format(retcode, command))
+        print_err('Error: command failed with status {}! {}'.format(
+            retcode, command))
         exit(1)
     return success
 
