diff --git a/tests/mobly/asserts_test.py b/tests/mobly/asserts_test.py
index ac54393..547f4a9 100755
--- a/tests/mobly/asserts_test.py
+++ b/tests/mobly/asserts_test.py
@@ -21,14 +21,14 @@
 
 
 class AssertsTest(unittest.TestCase):
-    """Verifies that asserts.xxx functions raise the correct test signals.
-    """
-    def test_assert_false(self):
-        asserts.assert_false(False, MSG_EXPECTED_EXCEPTION)
-        with self.assertRaisesRegex(signals.TestFailure,
-                                     MSG_EXPECTED_EXCEPTION):
-            asserts.assert_false(True, MSG_EXPECTED_EXCEPTION)
+  """Verifies that asserts.xxx functions raise the correct test signals.
+  """
+  def test_assert_false(self):
+    asserts.assert_false(False, MSG_EXPECTED_EXCEPTION)
+    with self.assertRaisesRegex(signals.TestFailure,
+                   MSG_EXPECTED_EXCEPTION):
+      asserts.assert_false(True, MSG_EXPECTED_EXCEPTION)
 
 
 if __name__ == "__main__":
-    unittest.main()
+  unittest.main()
diff --git a/tests/mobly/base_instrumentation_test_test.py b/tests/mobly/base_instrumentation_test_test.py
index 20d6424..ea6d2e4 100755
--- a/tests/mobly/base_instrumentation_test_test.py
+++ b/tests/mobly/base_instrumentation_test_test.py
@@ -48,208 +48,208 @@
 
 
 class InstrumentationResult(object):
-    def __init__(self):
-        self.error = None
-        self.completed_and_passed = False
-        self.executed = []
-        self.skipped = []
+  def __init__(self):
+    self.error = None
+    self.completed_and_passed = False
+    self.executed = []
+    self.skipped = []
 
 
 class BaseInstrumentationTestTest(unittest.TestCase):
-    def setUp(self):
-        self.tmp_dir = tempfile.mkdtemp()
+  def setUp(self):
+    self.tmp_dir = tempfile.mkdtemp()
 
-    def tearDown(self):
-        shutil.rmtree(self.tmp_dir)
+  def tearDown(self):
+    shutil.rmtree(self.tmp_dir)
 
-    def assert_parse_instrumentation_options(self, user_params,
-                                             expected_instrumentation_options):
-        mit = mock_instrumentation_test.MockInstrumentationTest(
-            self.tmp_dir, user_params)
-        instrumentation_options = mit.parse_instrumentation_options(
-            mit.user_params)
-        self.assertEqual(instrumentation_options,
-                         expected_instrumentation_options)
+  def assert_parse_instrumentation_options(self, user_params,
+                       expected_instrumentation_options):
+    mit = mock_instrumentation_test.MockInstrumentationTest(
+      self.tmp_dir, user_params)
+    instrumentation_options = mit.parse_instrumentation_options(
+      mit.user_params)
+    self.assertEqual(instrumentation_options,
+             expected_instrumentation_options)
 
-    def test_parse_instrumentation_options_with_no_user_params(self):
-        self.assert_parse_instrumentation_options({}, {})
+  def test_parse_instrumentation_options_with_no_user_params(self):
+    self.assert_parse_instrumentation_options({}, {})
 
-    def test_parse_instrumentation_options_with_no_instrumentation_params(
-            self):
-        self.assert_parse_instrumentation_options(
-            {
-                'param1': 'val1',
-                'param2': 'val2',
-            },
-            {},
-        )
+  def test_parse_instrumentation_options_with_no_instrumentation_params(
+      self):
+    self.assert_parse_instrumentation_options(
+      {
+        'param1': 'val1',
+        'param2': 'val2',
+      },
+      {},
+    )
 
-    def test_parse_instrumentation_options_with_only_instrumentation_params(
-            self):
-        self.assert_parse_instrumentation_options(
-            {
-                'instrumentation_option_key1': 'value1',
-                'instrumentation_option_key2': 'value2',
-            },
-            {'key1': 'value1',
-             'key2': 'value2'},
-        )
+  def test_parse_instrumentation_options_with_only_instrumentation_params(
+      self):
+    self.assert_parse_instrumentation_options(
+      {
+        'instrumentation_option_key1': 'value1',
+        'instrumentation_option_key2': 'value2',
+      },
+      {'key1': 'value1',
+       'key2': 'value2'},
+    )
 
-    def test_parse_instrumentation_options_with_mixed_user_params(self):
-        self.assert_parse_instrumentation_options(
-            {
-                'param1': 'val1',
-                'param2': 'val2',
-                'instrumentation_option_key1': 'value1',
-                'instrumentation_option_key2': 'value2',
-            },
-            {'key1': 'value1',
-             'key2': 'value2'},
-        )
+  def test_parse_instrumentation_options_with_mixed_user_params(self):
+    self.assert_parse_instrumentation_options(
+      {
+        'param1': 'val1',
+        'param2': 'val2',
+        'instrumentation_option_key1': 'value1',
+        'instrumentation_option_key2': 'value2',
+      },
+      {'key1': 'value1',
+       'key2': 'value2'},
+    )
 
-    def run_instrumentation_test(self, instrumentation_output, prefix=None):
-        mit = mock_instrumentation_test.MockInstrumentationTest(self.tmp_dir)
-        result = InstrumentationResult()
-        try:
-            result.completed_and_passed = mit.run_mock_instrumentation_test(
-                instrumentation_output, prefix=prefix)
-        except signals.TestError as e:
-            result.error = e
-        result.executed = mit.results.executed
-        result.skipped = mit.results.skipped
-        return result
+  def run_instrumentation_test(self, instrumentation_output, prefix=None):
+    mit = mock_instrumentation_test.MockInstrumentationTest(self.tmp_dir)
+    result = InstrumentationResult()
+    try:
+      result.completed_and_passed = mit.run_mock_instrumentation_test(
+        instrumentation_output, prefix=prefix)
+    except signals.TestError as e:
+      result.error = e
+    result.executed = mit.results.executed
+    result.skipped = mit.results.skipped
+    return result
 
-    def assert_equal_test(self, actual_test, expected_test):
-        (expected_test_name, expected_signal) = expected_test
-        self.assertEqual(actual_test.test_class,
-                         MOCK_INSTRUMENTATION_TEST_CLASS_NAME)
-        self.assertEqual(actual_test.test_name, expected_test_name)
-        self.assertIsInstance(actual_test.termination_signal.exception,
-                              expected_signal)
+  def assert_equal_test(self, actual_test, expected_test):
+    (expected_test_name, expected_signal) = expected_test
+    self.assertEqual(actual_test.test_class,
+             MOCK_INSTRUMENTATION_TEST_CLASS_NAME)
+    self.assertEqual(actual_test.test_name, expected_test_name)
+    self.assertIsInstance(actual_test.termination_signal.exception,
+                expected_signal)
 
-    def convert_to_raw_output(self, test_output):
-        """Converts code-based strings into adb output strings.
+  def convert_to_raw_output(self, test_output):
+    """Converts code-based strings into adb output strings.
 
-        In python3, adb returns 'utf-8' encoded byte arrays, which do not work
-        correctly with code-based unicode strings, so to simulate that, the raw
-        instrumentation output should be converted accordingly.
-        """
-        if sys.version_info >= (3, 0):
-            return bytes(test_output, 'utf-8')
-        else:
-            return bytes(test_output)
+    In python3, adb returns 'utf-8' encoded byte arrays, which do not work
+    correctly with code-based unicode strings, so to simulate that, the raw
+    instrumentation output should be converted accordingly.
+    """
+    if sys.version_info >= (3, 0):
+      return bytes(test_output, 'utf-8')
+    else:
+      return bytes(test_output)
 
-    def assert_run_instrumentation_test(self,
-                                        instrumentation_output,
-                                        expected_executed=[],
-                                        expected_skipped=[],
-                                        expected_completed_and_passed=False,
-                                        expected_has_error=False,
-                                        prefix=None,
-                                        expected_executed_times=[]):
-        result = self.run_instrumentation_test(
-            self.convert_to_raw_output(instrumentation_output), prefix=prefix)
-        if expected_has_error:
-            self.assertIsInstance(result.error, signals.TestError)
-        else:
-            self.assertIsNone(result.error)
-            self.assertEqual(result.completed_and_passed,
-                             expected_completed_and_passed)
-        self.assertEqual(len(result.executed), len(expected_executed))
-        for actual_test, expected_test in zip(result.executed,
-                                              expected_executed):
-            self.assert_equal_test(actual_test, expected_test)
-        self.assertEqual(len(result.skipped), len(expected_skipped))
-        for actual_test, expected_test in zip(result.skipped,
-                                              expected_skipped):
-            self.assert_equal_test(actual_test, expected_test)
-        if expected_executed_times:
-            for actual_test, expected_time in zip(result.executed,
-                                                  expected_executed_times):
-                (expected_begin_time, expected_end_time) = expected_time
-                self.assertEqual(actual_test.begin_time, expected_begin_time)
-                self.assertEqual(actual_test.end_time, expected_end_time)
+  def assert_run_instrumentation_test(self,
+                    instrumentation_output,
+                    expected_executed=[],
+                    expected_skipped=[],
+                    expected_completed_and_passed=False,
+                    expected_has_error=False,
+                    prefix=None,
+                    expected_executed_times=[]):
+    result = self.run_instrumentation_test(
+      self.convert_to_raw_output(instrumentation_output), prefix=prefix)
+    if expected_has_error:
+      self.assertIsInstance(result.error, signals.TestError)
+    else:
+      self.assertIsNone(result.error)
+      self.assertEqual(result.completed_and_passed,
+               expected_completed_and_passed)
+    self.assertEqual(len(result.executed), len(expected_executed))
+    for actual_test, expected_test in zip(result.executed,
+                        expected_executed):
+      self.assert_equal_test(actual_test, expected_test)
+    self.assertEqual(len(result.skipped), len(expected_skipped))
+    for actual_test, expected_test in zip(result.skipped,
+                        expected_skipped):
+      self.assert_equal_test(actual_test, expected_test)
+    if expected_executed_times:
+      for actual_test, expected_time in zip(result.executed,
+                          expected_executed_times):
+        (expected_begin_time, expected_end_time) = expected_time
+        self.assertEqual(actual_test.begin_time, expected_begin_time)
+        self.assertEqual(actual_test.end_time, expected_end_time)
 
-    def test_run_instrumentation_test_with_invalid_syntax(self):
-        instrumentation_output = """\
+  def test_run_instrumentation_test_with_invalid_syntax(self):
+    instrumentation_output = """\
 usage: am [subcommand] [options]
 usage: am start [-D] [-N] [-W] [-P <FILE>] [--start-profiler <FILE>]
-               [--sampling INTERVAL] [-R COUNT] [-S]
+         [--sampling INTERVAL] [-R COUNT] [-S]
 
 am start: start an Activity.  Options are:
-    -D: enable debugging
+  -D: enable debugging
 
 am startservice: start a Service.  Options are:
-    --user <USER_ID> | current: Specify which user to run as; if not
-        specified then run as the current user.
+  --user <USER_ID> | current: Specify which user to run as; if not
+    specified then run as the current user.
 
 am task lock: bring <TASK_ID> to the front and don't allow other tasks to run.
 
 <INTENT> specifications include these flags and arguments:
-    [-a <ACTION>] [-d <DATA_URI>] [-t <MIME_TYPE>]
-    [-c <CATEGORY> [-c <CATEGORY>] ...]
+  [-a <ACTION>] [-d <DATA_URI>] [-t <MIME_TYPE>]
+  [-c <CATEGORY> [-c <CATEGORY>] ...]
 
 Error: Bad component name: /
 """
-        self.assert_run_instrumentation_test(
-            instrumentation_output, expected_has_error=True)
+    self.assert_run_instrumentation_test(
+      instrumentation_output, expected_has_error=True)
 
-    def test_run_instrumentation_test_with_no_output(self):
-        instrumentation_output = """\
+  def test_run_instrumentation_test_with_no_output(self):
+    instrumentation_output = """\
 """
-        self.assert_run_instrumentation_test(
-            instrumentation_output, expected_has_error=True)
+    self.assert_run_instrumentation_test(
+      instrumentation_output, expected_has_error=True)
 
-    def test_run_instrumentation_test_with_missing_test_package(self):
-        instrumentation_output = """\
+  def test_run_instrumentation_test_with_missing_test_package(self):
+    instrumentation_output = """\
 android.util.AndroidException: INSTRUMENTATION_FAILED: com.my.package.test/com.my.package.test.runner.MyRunner
-	at com.android.commands.am.Am.runInstrument(Am.java:897)
-	at com.android.commands.am.Am.onRun(Am.java:405)
-	at com.android.internal.os.BaseCommand.run(BaseCommand.java:51)
-	at com.android.commands.am.Am.main(Am.java:124)
-	at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)
-	at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:262)
+  at com.android.commands.am.Am.runInstrument(Am.java:897)
+  at com.android.commands.am.Am.onRun(Am.java:405)
+  at com.android.internal.os.BaseCommand.run(BaseCommand.java:51)
+  at com.android.commands.am.Am.main(Am.java:124)
+  at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)
+  at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:262)
 INSTRUMENTATION_STATUS: id=ActivityManagerService
 INSTRUMENTATION_STATUS: Error=Unable to find instrumentation info for: ComponentInfo{com.my.package.test/com.my.package.test.runner.MyRunner}
 INSTRUMENTATION_STATUS_CODE: -1"""
-        self.assert_run_instrumentation_test(
-            instrumentation_output, expected_has_error=True)
+    self.assert_run_instrumentation_test(
+      instrumentation_output, expected_has_error=True)
 
-    def test_run_instrumentation_test_with_missing_runner(self):
-        instrumentation_output = """\
+  def test_run_instrumentation_test_with_missing_runner(self):
+    instrumentation_output = """\
 android.util.AndroidException: INSTRUMENTATION_FAILED: com.my.package.test/com.my.package.test.runner
 INSTRUMENTATION_STATUS: id=ActivityManagerService
 INSTRUMENTATION_STATUS: Error=Unable to find instrumentation info for: ComponentInfo{com.my.package.test/com.my.package.test.runner}
 INSTRUMENTATION_STATUS_CODE: -1
-	at com.android.commands.am.Am.runInstrument(Am.java:897)
-	at com.android.commands.am.Am.onRun(Am.java:405)
-	at com.android.internal.os.BaseCommand.run(BaseCommand.java:51)
-	at com.android.commands.am.Am.main(Am.java:124)
-	at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)
-	at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:262)"""
-        self.assert_run_instrumentation_test(
-            instrumentation_output, expected_has_error=True)
+  at com.android.commands.am.Am.runInstrument(Am.java:897)
+  at com.android.commands.am.Am.onRun(Am.java:405)
+  at com.android.internal.os.BaseCommand.run(BaseCommand.java:51)
+  at com.android.commands.am.Am.main(Am.java:124)
+  at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)
+  at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:262)"""
+    self.assert_run_instrumentation_test(
+      instrumentation_output, expected_has_error=True)
 
-    def test_run_instrumentation_test_with_no_tests(self):
-        instrumentation_output = MOCK_EMPTY_INSTRUMENTATION_TEST
-        self.assert_run_instrumentation_test(
-            instrumentation_output, expected_completed_and_passed=True)
+  def test_run_instrumentation_test_with_no_tests(self):
+    instrumentation_output = MOCK_EMPTY_INSTRUMENTATION_TEST
+    self.assert_run_instrumentation_test(
+      instrumentation_output, expected_completed_and_passed=True)
 
-    @unittest.skipUnless(
-        sys.version_info >= (3, 0),
-        'Only python3 displays different string types differently.')
-    @mock.patch('logging.info')
-    def test_run_instrumentation_test_logs_correctly(self, mock_info_logger):
-        instrumentation_output = MOCK_EMPTY_INSTRUMENTATION_TEST
-        self.assert_run_instrumentation_test(
-            instrumentation_output, expected_completed_and_passed=True)
-        for mock_call in mock_info_logger.mock_calls:
-            logged_format = mock_call[1][0]
-            self.assertIsInstance(logged_format, str)
+  @unittest.skipUnless(
+    sys.version_info >= (3, 0),
+    'Only python3 displays different string types differently.')
+  @mock.patch('logging.info')
+  def test_run_instrumentation_test_logs_correctly(self, mock_info_logger):
+    instrumentation_output = MOCK_EMPTY_INSTRUMENTATION_TEST
+    self.assert_run_instrumentation_test(
+      instrumentation_output, expected_completed_and_passed=True)
+    for mock_call in mock_info_logger.mock_calls:
+      logged_format = mock_call[1][0]
+      self.assertIsInstance(logged_format, str)
 
-    @mock.patch('mobly.utils.get_current_epoch_time')
-    def test_run_instrumentation_test_with_passing_test(self, mock_get_time):
-        instrumentation_output = """\
+  @mock.patch('mobly.utils.get_current_epoch_time')
+  def test_run_instrumentation_test_with_passing_test(self, mock_get_time):
+    instrumentation_output = """\
 INSTRUMENTATION_STATUS: numtests=1
 INSTRUMENTATION_STATUS: stream=
 com.my.package.test.BasicTest:
@@ -274,18 +274,18 @@
 
 INSTRUMENTATION_CODE: -1
 """
-        expected_executed = [
-            ('com.my.package.test.BasicTest#basicTest', signals.TestPass),
-        ]
-        mock_get_time.side_effect = [13, 51]
-        self.assert_run_instrumentation_test(
-            instrumentation_output,
-            expected_executed=expected_executed,
-            expected_completed_and_passed=True,
-            expected_executed_times=[(13, 51)])
+    expected_executed = [
+      ('com.my.package.test.BasicTest#basicTest', signals.TestPass),
+    ]
+    mock_get_time.side_effect = [13, 51]
+    self.assert_run_instrumentation_test(
+      instrumentation_output,
+      expected_executed=expected_executed,
+      expected_completed_and_passed=True,
+      expected_executed_times=[(13, 51)])
 
-    def test_run_instrumentation_test_with_random_whitespace(self):
-        instrumentation_output = """\
+  def test_run_instrumentation_test_with_random_whitespace(self):
+    instrumentation_output = """\
 
 INSTRUMENTATION_STATUS: numtests=1
 
@@ -331,16 +331,16 @@
 INSTRUMENTATION_CODE: -1
 
 """
-        expected_executed = [
-            ('com.my.package.test.BasicTest#basicTest', signals.TestPass),
-        ]
-        self.assert_run_instrumentation_test(
-            instrumentation_output,
-            expected_executed=expected_executed,
-            expected_completed_and_passed=True)
+    expected_executed = [
+      ('com.my.package.test.BasicTest#basicTest', signals.TestPass),
+    ]
+    self.assert_run_instrumentation_test(
+      instrumentation_output,
+      expected_executed=expected_executed,
+      expected_completed_and_passed=True)
 
-    def test_run_instrumentation_test_with_prefix_test(self):
-        instrumentation_output = """\
+  def test_run_instrumentation_test_with_prefix_test(self):
+    instrumentation_output = """\
 INSTRUMENTATION_STATUS: numtests=1
 INSTRUMENTATION_STATUS: stream=
 com.my.package.test.BasicTest:
@@ -365,18 +365,18 @@
 
 INSTRUMENTATION_CODE: -1
 """
-        expected_executed = [
-            ('%s.com.my.package.test.BasicTest#basicTest' % MOCK_PREFIX,
-             signals.TestPass),
-        ]
-        self.assert_run_instrumentation_test(
-            instrumentation_output,
-            expected_executed=expected_executed,
-            expected_completed_and_passed=True,
-            prefix=MOCK_PREFIX)
+    expected_executed = [
+      ('%s.com.my.package.test.BasicTest#basicTest' % MOCK_PREFIX,
+       signals.TestPass),
+    ]
+    self.assert_run_instrumentation_test(
+      instrumentation_output,
+      expected_executed=expected_executed,
+      expected_completed_and_passed=True,
+      prefix=MOCK_PREFIX)
 
-    def test_run_instrumentation_test_with_failing_test(self):
-        instrumentation_output = """\
+  def test_run_instrumentation_test_with_failing_test(self):
+    instrumentation_output = """\
 INSTRUMENTATION_STATUS: class=com.my.package.test.BasicTest
 INSTRUMENTATION_STATUS: current=1
 INSTRUMENTATION_STATUS: id=AndroidJUnitRunner
@@ -390,108 +390,108 @@
 INSTRUMENTATION_STATUS: id=AndroidJUnitRunner
 INSTRUMENTATION_STATUS: numtests=1
 INSTRUMENTATION_STATUS: stack=java.lang.UnsupportedOperationException: dummy failing test
-	at com.my.package.test.BasicTest.failingTest(BasicTest.java:38)
-	at java.lang.reflect.Method.invoke(Native Method)
-	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:57)
-	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
-	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:59)
-	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
-	at androidx.test.internal.runner.junit4.statement.RunBefores.evaluate(RunBefores.java:80)
-	at androidx.test.internal.runner.junit4.statement.RunAfters.evaluate(RunAfters.java:61)
-	at androidx.test.rule.ActivityTestRule$ActivityStatement.evaluate(ActivityTestRule.java:433)
-	at com.my.package.test.BaseTest$3.evaluate(BaseTest.java:96)
-	at com.my.package.test.BaseTest$4.evaluate(BaseTest.java:109)
-	at com.my.package.test.BaseTest$2.evaluate(BaseTest.java:77)
-	at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55)
-	at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55)
-	at org.junit.rules.RunRules.evaluate(RunRules.java:20)
-	at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:81)
-	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:327)
-	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:84)
-	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
-	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
-	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
-	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
-	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
-	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
-	at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
-	at androidx.test.runner.AndroidJUnit4.run(AndroidJUnit4.java:99)
-	at org.junit.runners.Suite.runChild(Suite.java:128)
-	at org.junit.runners.Suite.runChild(Suite.java:27)
-	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
-	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
-	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
-	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
-	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
-	at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
-	at org.junit.runners.Suite.runChild(Suite.java:128)
-	at org.junit.runners.Suite.runChild(Suite.java:27)
-	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
-	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
-	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
-	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
-	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
-	at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
-	at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
-	at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
-	at androidx.test.internal.runner.TestExecutor.execute(TestExecutor.java:56)
-	at com.my.package.test.BaseRunner.runTests(BaseRunner.java:344)
-	at com.my.package.test.BaseRunner.onStart(BaseRunner.java:330)
-	at com.my.package.test.runner.MyRunner.onStart(MyRunner.java:253)
-	at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:2074)
+  at com.my.package.test.BasicTest.failingTest(BasicTest.java:38)
+  at java.lang.reflect.Method.invoke(Native Method)
+  at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:57)
+  at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
+  at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:59)
+  at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
+  at androidx.test.internal.runner.junit4.statement.RunBefores.evaluate(RunBefores.java:80)
+  at androidx.test.internal.runner.junit4.statement.RunAfters.evaluate(RunAfters.java:61)
+  at androidx.test.rule.ActivityTestRule$ActivityStatement.evaluate(ActivityTestRule.java:433)
+  at com.my.package.test.BaseTest$3.evaluate(BaseTest.java:96)
+  at com.my.package.test.BaseTest$4.evaluate(BaseTest.java:109)
+  at com.my.package.test.BaseTest$2.evaluate(BaseTest.java:77)
+  at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55)
+  at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55)
+  at org.junit.rules.RunRules.evaluate(RunRules.java:20)
+  at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:81)
+  at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:327)
+  at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:84)
+  at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
+  at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
+  at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
+  at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
+  at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
+  at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
+  at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
+  at androidx.test.runner.AndroidJUnit4.run(AndroidJUnit4.java:99)
+  at org.junit.runners.Suite.runChild(Suite.java:128)
+  at org.junit.runners.Suite.runChild(Suite.java:27)
+  at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
+  at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
+  at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
+  at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
+  at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
+  at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
+  at org.junit.runners.Suite.runChild(Suite.java:128)
+  at org.junit.runners.Suite.runChild(Suite.java:27)
+  at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
+  at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
+  at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
+  at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
+  at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
+  at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
+  at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
+  at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
+  at androidx.test.internal.runner.TestExecutor.execute(TestExecutor.java:56)
+  at com.my.package.test.BaseRunner.runTests(BaseRunner.java:344)
+  at com.my.package.test.BaseRunner.onStart(BaseRunner.java:330)
+  at com.my.package.test.runner.MyRunner.onStart(MyRunner.java:253)
+  at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:2074)
 
 INSTRUMENTATION_STATUS: stream=
 Error in failingTest(com.my.package.test.BasicTest):
 java.lang.UnsupportedOperationException: dummy failing test
-	at com.my.package.test.BasicTest.failingTest(BasicTest.java:38)
-	at java.lang.reflect.Method.invoke(Native Method)
-	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:57)
-	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
-	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:59)
-	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
-	at androidx.test.internal.runner.junit4.statement.RunBefores.evaluate(RunBefores.java:80)
-	at androidx.test.internal.runner.junit4.statement.RunAfters.evaluate(RunAfters.java:61)
-	at androidx.test.rule.ActivityTestRule$ActivityStatement.evaluate(ActivityTestRule.java:433)
-	at com.my.package.test.BaseTest$3.evaluate(BaseTest.java:96)
-	at com.my.package.test.BaseTest$4.evaluate(BaseTest.java:109)
-	at com.my.package.test.BaseTest$2.evaluate(BaseTest.java:77)
-	at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55)
-	at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55)
-	at org.junit.rules.RunRules.evaluate(RunRules.java:20)
-	at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:81)
-	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:327)
-	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:84)
-	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
-	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
-	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
-	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
-	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
-	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
-	at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
-	at androidx.test.runner.AndroidJUnit4.run(AndroidJUnit4.java:99)
-	at org.junit.runners.Suite.runChild(Suite.java:128)
-	at org.junit.runners.Suite.runChild(Suite.java:27)
-	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
-	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
-	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
-	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
-	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
-	at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
-	at org.junit.runners.Suite.runChild(Suite.java:128)
-	at org.junit.runners.Suite.runChild(Suite.java:27)
-	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
-	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
-	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
-	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
-	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
-	at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
-	at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
-	at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
-	at androidx.test.internal.runner.TestExecutor.execute(TestExecutor.java:56)
-	at com.my.package.test.BaseRunner.runTests(BaseRunner.java:344)
-	at com.my.package.test.BaseRunner.onStart(BaseRunner.java:330)
-	at com.my.package.test.runner.MyRunner.onStart(MyRunner.java:253)
-	at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:2074)
+  at com.my.package.test.BasicTest.failingTest(BasicTest.java:38)
+  at java.lang.reflect.Method.invoke(Native Method)
+  at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:57)
+  at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
+  at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:59)
+  at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
+  at androidx.test.internal.runner.junit4.statement.RunBefores.evaluate(RunBefores.java:80)
+  at androidx.test.internal.runner.junit4.statement.RunAfters.evaluate(RunAfters.java:61)
+  at androidx.test.rule.ActivityTestRule$ActivityStatement.evaluate(ActivityTestRule.java:433)
+  at com.my.package.test.BaseTest$3.evaluate(BaseTest.java:96)
+  at com.my.package.test.BaseTest$4.evaluate(BaseTest.java:109)
+  at com.my.package.test.BaseTest$2.evaluate(BaseTest.java:77)
+  at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55)
+  at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55)
+  at org.junit.rules.RunRules.evaluate(RunRules.java:20)
+  at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:81)
+  at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:327)
+  at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:84)
+  at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
+  at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
+  at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
+  at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
+  at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
+  at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
+  at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
+  at androidx.test.runner.AndroidJUnit4.run(AndroidJUnit4.java:99)
+  at org.junit.runners.Suite.runChild(Suite.java:128)
+  at org.junit.runners.Suite.runChild(Suite.java:27)
+  at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
+  at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
+  at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
+  at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
+  at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
+  at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
+  at org.junit.runners.Suite.runChild(Suite.java:128)
+  at org.junit.runners.Suite.runChild(Suite.java:27)
+  at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
+  at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
+  at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
+  at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
+  at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
+  at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
+  at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
+  at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
+  at androidx.test.internal.runner.TestExecutor.execute(TestExecutor.java:56)
+  at com.my.package.test.BaseRunner.runTests(BaseRunner.java:344)
+  at com.my.package.test.BaseRunner.onStart(BaseRunner.java:330)
+  at com.my.package.test.runner.MyRunner.onStart(MyRunner.java:253)
+  at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:2074)
 
 INSTRUMENTATION_STATUS: test=failingTest
 INSTRUMENTATION_STATUS_CODE: -2
@@ -501,69 +501,69 @@
 There was 1 failure:
 1) failingTest(com.my.package.test.BasicTest)
 java.lang.UnsupportedOperationException: dummy failing test
-	at com.my.package.test.BasicTest.failingTest(BasicTest.java:38)
-	at java.lang.reflect.Method.invoke(Native Method)
-	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:57)
-	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
-	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:59)
-	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
-	at androidx.test.internal.runner.junit4.statement.RunBefores.evaluate(RunBefores.java:80)
-	at androidx.test.internal.runner.junit4.statement.RunAfters.evaluate(RunAfters.java:61)
-	at androidx.test.rule.ActivityTestRule$ActivityStatement.evaluate(ActivityTestRule.java:433)
-	at com.my.package.test.BaseTest$3.evaluate(BaseTest.java:96)
-	at com.my.package.test.BaseTest$4.evaluate(BaseTest.java:109)
-	at com.my.package.test.BaseTest$2.evaluate(BaseTest.java:77)
-	at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55)
-	at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55)
-	at org.junit.rules.RunRules.evaluate(RunRules.java:20)
-	at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:81)
-	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:327)
-	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:84)
-	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
-	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
-	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
-	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
-	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
-	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
-	at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
-	at androidx.test.runner.AndroidJUnit4.run(AndroidJUnit4.java:99)
-	at org.junit.runners.Suite.runChild(Suite.java:128)
-	at org.junit.runners.Suite.runChild(Suite.java:27)
-	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
-	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
-	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
-	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
-	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
-	at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
-	at org.junit.runners.Suite.runChild(Suite.java:128)
-	at org.junit.runners.Suite.runChild(Suite.java:27)
-	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
-	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
-	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
-	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
-	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
-	at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
-	at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
-	at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
-	at androidx.test.internal.runner.TestExecutor.execute(TestExecutor.java:56)
-	at com.my.package.test.BaseRunner.runTests(BaseRunner.java:344)
-	at com.my.package.test.BaseRunner.onStart(BaseRunner.java:330)
-	at com.my.package.test.runner.MyRunner.onStart(MyRunner.java:253)
-	at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:2074)
+  at com.my.package.test.BasicTest.failingTest(BasicTest.java:38)
+  at java.lang.reflect.Method.invoke(Native Method)
+  at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:57)
+  at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
+  at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:59)
+  at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
+  at androidx.test.internal.runner.junit4.statement.RunBefores.evaluate(RunBefores.java:80)
+  at androidx.test.internal.runner.junit4.statement.RunAfters.evaluate(RunAfters.java:61)
+  at androidx.test.rule.ActivityTestRule$ActivityStatement.evaluate(ActivityTestRule.java:433)
+  at com.my.package.test.BaseTest$3.evaluate(BaseTest.java:96)
+  at com.my.package.test.BaseTest$4.evaluate(BaseTest.java:109)
+  at com.my.package.test.BaseTest$2.evaluate(BaseTest.java:77)
+  at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55)
+  at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55)
+  at org.junit.rules.RunRules.evaluate(RunRules.java:20)
+  at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:81)
+  at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:327)
+  at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:84)
+  at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
+  at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
+  at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
+  at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
+  at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
+  at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
+  at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
+  at androidx.test.runner.AndroidJUnit4.run(AndroidJUnit4.java:99)
+  at org.junit.runners.Suite.runChild(Suite.java:128)
+  at org.junit.runners.Suite.runChild(Suite.java:27)
+  at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
+  at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
+  at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
+  at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
+  at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
+  at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
+  at org.junit.runners.Suite.runChild(Suite.java:128)
+  at org.junit.runners.Suite.runChild(Suite.java:27)
+  at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
+  at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
+  at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
+  at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
+  at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
+  at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
+  at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
+  at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
+  at androidx.test.internal.runner.TestExecutor.execute(TestExecutor.java:56)
+  at com.my.package.test.BaseRunner.runTests(BaseRunner.java:344)
+  at com.my.package.test.BaseRunner.onStart(BaseRunner.java:330)
+  at com.my.package.test.runner.MyRunner.onStart(MyRunner.java:253)
+  at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:2074)
 
 FAILURES!!!
 Tests run: 1,  Failures: 1
 
 
 INSTRUMENTATION_CODE: -1"""
-        expected_executed = [
-            ('com.my.package.test.BasicTest#failingTest', signals.TestFailure),
-        ]
-        self.assert_run_instrumentation_test(
-            instrumentation_output, expected_executed=expected_executed)
+    expected_executed = [
+      ('com.my.package.test.BasicTest#failingTest', signals.TestFailure),
+    ]
+    self.assert_run_instrumentation_test(
+      instrumentation_output, expected_executed=expected_executed)
 
-    def test_run_instrumentation_test_with_assumption_failure_test(self):
-        instrumentation_output = """\
+  def test_run_instrumentation_test_with_assumption_failure_test(self):
+    instrumentation_output = """\
 INSTRUMENTATION_STATUS: class=com.my.package.test.BasicTest
 INSTRUMENTATION_STATUS: current=1
 INSTRUMENTATION_STATUS: id=AndroidJUnitRunner
@@ -577,57 +577,57 @@
 INSTRUMENTATION_STATUS: id=AndroidJUnitRunner
 INSTRUMENTATION_STATUS: numtests=1
 INSTRUMENTATION_STATUS: stack=org.junit.AssumptionViolatedException: Assumption failure reason
-	at org.junit.Assume.assumeTrue(Assume.java:59)
-	at org.junit.Assume.assumeFalse(Assume.java:66)
-	at com.my.package.test.BasicTest.assumptionFailureTest(BasicTest.java:63)
-	at java.lang.reflect.Method.invoke(Native Method)
-	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:57)
-	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
-	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:59)
-	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
-	at androidx.test.internal.runner.junit4.statement.RunBefores.evaluate(RunBefores.java:80)
-	at androidx.test.internal.runner.junit4.statement.RunAfters.evaluate(RunAfters.java:61)
-	at androidx.test.rule.ActivityTestRule$ActivityStatement.evaluate(ActivityTestRule.java:433)
-	at com.my.package.test.MyBaseTest$3.evaluate(MyBaseTest.java:96)
-	at com.my.package.test.MyBaseTest$4.evaluate(MyBaseTest.java:109)
-	at com.my.package.test.MyBaseTest$2.evaluate(MyBaseTest.java:77)
-	at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55)
-	at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55)
-	at org.junit.rules.RunRules.evaluate(RunRules.java:20)
-	at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:81)
-	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:327)
-	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:84)
-	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
-	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
-	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
-	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
-	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
-	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
-	at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
-	at androidx.test.runner.AndroidJUnit4.run(AndroidJUnit4.java:99)
-	at org.junit.runners.Suite.runChild(Suite.java:128)
-	at org.junit.runners.Suite.runChild(Suite.java:27)
-	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
-	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
-	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
-	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
-	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
-	at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
-	at org.junit.runners.Suite.runChild(Suite.java:128)
-	at org.junit.runners.Suite.runChild(Suite.java:27)
-	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
-	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
-	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
-	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
-	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
-	at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
-	at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
-	at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
-	at androidx.test.internal.runner.TestExecutor.execute(TestExecutor.java:56)
-	at com.my.package.test.runner.BaseRunner.runTests(BaseRunner.java:344)
-	at com.my.package.test.runner.BaseRunner.onStart(BaseRunner.java:330)
-	at com.my.package.test.runner.BaseRunner.onStart(BaseRunner.java:253)
-	at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:2074)
+  at org.junit.Assume.assumeTrue(Assume.java:59)
+  at org.junit.Assume.assumeFalse(Assume.java:66)
+  at com.my.package.test.BasicTest.assumptionFailureTest(BasicTest.java:63)
+  at java.lang.reflect.Method.invoke(Native Method)
+  at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:57)
+  at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
+  at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:59)
+  at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
+  at androidx.test.internal.runner.junit4.statement.RunBefores.evaluate(RunBefores.java:80)
+  at androidx.test.internal.runner.junit4.statement.RunAfters.evaluate(RunAfters.java:61)
+  at androidx.test.rule.ActivityTestRule$ActivityStatement.evaluate(ActivityTestRule.java:433)
+  at com.my.package.test.MyBaseTest$3.evaluate(MyBaseTest.java:96)
+  at com.my.package.test.MyBaseTest$4.evaluate(MyBaseTest.java:109)
+  at com.my.package.test.MyBaseTest$2.evaluate(MyBaseTest.java:77)
+  at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55)
+  at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55)
+  at org.junit.rules.RunRules.evaluate(RunRules.java:20)
+  at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:81)
+  at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:327)
+  at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:84)
+  at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
+  at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
+  at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
+  at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
+  at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
+  at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
+  at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
+  at androidx.test.runner.AndroidJUnit4.run(AndroidJUnit4.java:99)
+  at org.junit.runners.Suite.runChild(Suite.java:128)
+  at org.junit.runners.Suite.runChild(Suite.java:27)
+  at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
+  at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
+  at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
+  at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
+  at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
+  at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
+  at org.junit.runners.Suite.runChild(Suite.java:128)
+  at org.junit.runners.Suite.runChild(Suite.java:27)
+  at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
+  at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
+  at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
+  at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
+  at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
+  at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
+  at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
+  at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
+  at androidx.test.internal.runner.TestExecutor.execute(TestExecutor.java:56)
+  at com.my.package.test.runner.BaseRunner.runTests(BaseRunner.java:344)
+  at com.my.package.test.runner.BaseRunner.onStart(BaseRunner.java:330)
+  at com.my.package.test.runner.BaseRunner.onStart(BaseRunner.java:253)
+  at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:2074)
 
 INSTRUMENTATION_STATUS: stream=
 com.my.package.test.BasicTest:
@@ -641,17 +641,17 @@
 
 
 INSTRUMENTATION_CODE: -1"""
-        expected_skipped = [
-            ('com.my.package.test.BasicTest#assumptionFailureTest',
-             signals.TestSkip),
-        ]
-        self.assert_run_instrumentation_test(
-            instrumentation_output,
-            expected_skipped=expected_skipped,
-            expected_completed_and_passed=True)
+    expected_skipped = [
+      ('com.my.package.test.BasicTest#assumptionFailureTest',
+       signals.TestSkip),
+    ]
+    self.assert_run_instrumentation_test(
+      instrumentation_output,
+      expected_skipped=expected_skipped,
+      expected_completed_and_passed=True)
 
-    def test_run_instrumentation_test_with_ignored_test(self):
-        instrumentation_output = """\
+  def test_run_instrumentation_test_with_ignored_test(self):
+    instrumentation_output = """\
 INSTRUMENTATION_STATUS: class=com.my.package.test.BasicTest
 INSTRUMENTATION_STATUS: current=1
 INSTRUMENTATION_STATUS: id=AndroidJUnitRunner
@@ -676,17 +676,17 @@
 
 
 INSTRUMENTATION_CODE: -1"""
-        expected_skipped = [
-            ('com.my.package.test.BasicTest#ignoredTest', signals.TestSkip),
-        ]
-        self.assert_run_instrumentation_test(
-            instrumentation_output,
-            expected_skipped=expected_skipped,
-            expected_completed_and_passed=True)
+    expected_skipped = [
+      ('com.my.package.test.BasicTest#ignoredTest', signals.TestSkip),
+    ]
+    self.assert_run_instrumentation_test(
+      instrumentation_output,
+      expected_skipped=expected_skipped,
+      expected_completed_and_passed=True)
 
-    @mock.patch('mobly.utils.get_current_epoch_time')
-    def test_run_instrumentation_test_with_crashed_test(self, mock_get_time):
-        instrumentation_output = """\
+  @mock.patch('mobly.utils.get_current_epoch_time')
+  def test_run_instrumentation_test_with_crashed_test(self, mock_get_time):
+    instrumentation_output = """\
 INSTRUMENTATION_STATUS: class=com.my.package.test.BasicTest
 INSTRUMENTATION_STATUS: current=1
 INSTRUMENTATION_STATUS: id=AndroidJUnitRunner
@@ -697,19 +697,19 @@
 INSTRUMENTATION_STATUS_CODE: 1
 INSTRUMENTATION_RESULT: shortMsg=Process crashed.
 INSTRUMENTATION_CODE: 0"""
-        expected_executed = [
-            ('com.my.package.test.BasicTest#crashTest', signals.TestError),
-        ]
-        mock_get_time.side_effect = [67, 942]
-        self.assert_run_instrumentation_test(
-            instrumentation_output,
-            expected_executed=expected_executed,
-            expected_has_error=True,
-            expected_executed_times=[(67, 942)])
+    expected_executed = [
+      ('com.my.package.test.BasicTest#crashTest', signals.TestError),
+    ]
+    mock_get_time.side_effect = [67, 942]
+    self.assert_run_instrumentation_test(
+      instrumentation_output,
+      expected_executed=expected_executed,
+      expected_has_error=True,
+      expected_executed_times=[(67, 942)])
 
-    @mock.patch('mobly.utils.get_current_epoch_time')
-    def test_run_instrumentation_test_with_crashing_test(self, mock_get_time):
-        instrumentation_output = """\
+  @mock.patch('mobly.utils.get_current_epoch_time')
+  def test_run_instrumentation_test_with_crashing_test(self, mock_get_time):
+    instrumentation_output = """\
 INSTRUMENTATION_STATUS: class=com.my.package.test.BasicTest
 INSTRUMENTATION_STATUS: current=1
 INSTRUMENTATION_STATUS: id=AndroidJUnitRunner
@@ -734,29 +734,29 @@
 
 
 INSTRUMENTATION_CODE: -1"""
-        expected_executed = [
-            ('com.my.package.test.BasicTest#crashAndRecover1Test',
-             signals.TestError),
-            ('com.my.package.test.BasicTest#crashAndRecover2Test',
-             signals.TestError),
-        ]
-        mock_get_time.side_effect = [16, 412, 4143, 6547]
-        # TODO(winterfrosts): Fix this issue with overlapping timing
-        self.assert_run_instrumentation_test(
-            instrumentation_output,
-            expected_executed=expected_executed,
-            expected_completed_and_passed=True,
-            expected_executed_times=[(16, 4143), (412, 6547)])
+    expected_executed = [
+      ('com.my.package.test.BasicTest#crashAndRecover1Test',
+       signals.TestError),
+      ('com.my.package.test.BasicTest#crashAndRecover2Test',
+       signals.TestError),
+    ]
+    mock_get_time.side_effect = [16, 412, 4143, 6547]
+    # TODO(winterfrosts): Fix this issue with overlapping timing
+    self.assert_run_instrumentation_test(
+      instrumentation_output,
+      expected_executed=expected_executed,
+      expected_completed_and_passed=True,
+      expected_executed_times=[(16, 4143), (412, 6547)])
 
-    def test_run_instrumentation_test_with_runner_setup_crash(self):
-        instrumentation_output = """\
+  def test_run_instrumentation_test_with_runner_setup_crash(self):
+    instrumentation_output = """\
 INSTRUMENTATION_RESULT: shortMsg=Process crashed.
 INSTRUMENTATION_CODE: 0"""
-        self.assert_run_instrumentation_test(
-            instrumentation_output, expected_has_error=True)
+    self.assert_run_instrumentation_test(
+      instrumentation_output, expected_has_error=True)
 
-    def test_run_instrumentation_test_with_runner_teardown_crash(self):
-        instrumentation_output = """\
+  def test_run_instrumentation_test_with_runner_teardown_crash(self):
+    instrumentation_output = """\
 INSTRUMENTATION_STATUS: numtests=1
 INSTRUMENTATION_STATUS: stream=
 com.my.package.test.BasicTest:
@@ -775,17 +775,17 @@
 INSTRUMENTATION_RESULT: shortMsg=Process crashed.
 INSTRUMENTATION_CODE: 0
 """
-        expected_executed = [
-            ('com.my.package.test.BasicTest#basicTest', signals.TestPass),
-        ]
-        self.assert_run_instrumentation_test(
-            instrumentation_output,
-            expected_executed=expected_executed,
-            expected_has_error=True)
+    expected_executed = [
+      ('com.my.package.test.BasicTest#basicTest', signals.TestPass),
+    ]
+    self.assert_run_instrumentation_test(
+      instrumentation_output,
+      expected_executed=expected_executed,
+      expected_has_error=True)
 
-    @mock.patch('mobly.utils.get_current_epoch_time')
-    def test_run_instrumentation_test_with_multiple_tests(self, mock_get_time):
-        instrumentation_output = """\
+  @mock.patch('mobly.utils.get_current_epoch_time')
+  def test_run_instrumentation_test_with_multiple_tests(self, mock_get_time):
+    instrumentation_output = """\
 INSTRUMENTATION_STATUS: class=com.my.package.test.BasicTest
 INSTRUMENTATION_STATUS: current=1
 INSTRUMENTATION_STATUS: id=AndroidJUnitRunner
@@ -799,108 +799,108 @@
 INSTRUMENTATION_STATUS: id=AndroidJUnitRunner
 INSTRUMENTATION_STATUS: numtests=4
 INSTRUMENTATION_STATUS: stack=java.lang.UnsupportedOperationException: dummy failing test
-	at com.my.package.test.BasicTest.failingTest(BasicTest.java:40)
-	at java.lang.reflect.Method.invoke(Native Method)
-	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:57)
-	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
-	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:59)
-	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
-	at androidx.test.internal.runner.junit4.statement.RunBefores.evaluate(RunBefores.java:80)
-	at androidx.test.internal.runner.junit4.statement.RunAfters.evaluate(RunAfters.java:61)
-	at androidx.test.rule.ActivityTestRule$ActivityStatement.evaluate(ActivityTestRule.java:433)
-	at com.my.package.test.BaseTest$3.evaluate(BaseTest.java:96)
-	at com.my.package.test.BaseTest$4.evaluate(BaseTest.java:109)
-	at com.my.package.test.BaseTest$2.evaluate(BaseTest.java:77)
-	at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55)
-	at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55)
-	at org.junit.rules.RunRules.evaluate(RunRules.java:20)
-	at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:81)
-	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:327)
-	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:84)
-	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
-	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
-	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
-	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
-	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
-	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
-	at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
-	at androidx.test.runner.AndroidJUnit4.run(AndroidJUnit4.java:99)
-	at org.junit.runners.Suite.runChild(Suite.java:128)
-	at org.junit.runners.Suite.runChild(Suite.java:27)
-	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
-	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
-	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
-	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
-	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
-	at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
-	at org.junit.runners.Suite.runChild(Suite.java:128)
-	at org.junit.runners.Suite.runChild(Suite.java:27)
-	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
-	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
-	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
-	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
-	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
-	at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
-	at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
-	at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
-	at androidx.test.internal.runner.TestExecutor.execute(TestExecutor.java:56)
-	at com.my.package.test.BaseRunner.runTests(BaseRunner.java:344)
-	at com.my.package.test.BaseRunner.onStart(BaseRunner.java:330)
-	at com.my.package.test.runner.MyRunner.onStart(MyRunner.java:253)
-	at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:2074)
+  at com.my.package.test.BasicTest.failingTest(BasicTest.java:40)
+  at java.lang.reflect.Method.invoke(Native Method)
+  at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:57)
+  at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
+  at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:59)
+  at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
+  at androidx.test.internal.runner.junit4.statement.RunBefores.evaluate(RunBefores.java:80)
+  at androidx.test.internal.runner.junit4.statement.RunAfters.evaluate(RunAfters.java:61)
+  at androidx.test.rule.ActivityTestRule$ActivityStatement.evaluate(ActivityTestRule.java:433)
+  at com.my.package.test.BaseTest$3.evaluate(BaseTest.java:96)
+  at com.my.package.test.BaseTest$4.evaluate(BaseTest.java:109)
+  at com.my.package.test.BaseTest$2.evaluate(BaseTest.java:77)
+  at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55)
+  at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55)
+  at org.junit.rules.RunRules.evaluate(RunRules.java:20)
+  at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:81)
+  at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:327)
+  at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:84)
+  at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
+  at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
+  at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
+  at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
+  at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
+  at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
+  at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
+  at androidx.test.runner.AndroidJUnit4.run(AndroidJUnit4.java:99)
+  at org.junit.runners.Suite.runChild(Suite.java:128)
+  at org.junit.runners.Suite.runChild(Suite.java:27)
+  at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
+  at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
+  at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
+  at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
+  at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
+  at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
+  at org.junit.runners.Suite.runChild(Suite.java:128)
+  at org.junit.runners.Suite.runChild(Suite.java:27)
+  at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
+  at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
+  at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
+  at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
+  at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
+  at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
+  at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
+  at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
+  at androidx.test.internal.runner.TestExecutor.execute(TestExecutor.java:56)
+  at com.my.package.test.BaseRunner.runTests(BaseRunner.java:344)
+  at com.my.package.test.BaseRunner.onStart(BaseRunner.java:330)
+  at com.my.package.test.runner.MyRunner.onStart(MyRunner.java:253)
+  at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:2074)
 
 INSTRUMENTATION_STATUS: stream=
 Error in failingTest(com.my.package.test.BasicTest):
 java.lang.UnsupportedOperationException: dummy failing test
-	at com.my.package.test.BasicTest.failingTest(BasicTest.java:40)
-	at java.lang.reflect.Method.invoke(Native Method)
-	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:57)
-	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
-	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:59)
-	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
-	at androidx.test.internal.runner.junit4.statement.RunBefores.evaluate(RunBefores.java:80)
-	at androidx.test.internal.runner.junit4.statement.RunAfters.evaluate(RunAfters.java:61)
-	at androidx.test.rule.ActivityTestRule$ActivityStatement.evaluate(ActivityTestRule.java:433)
-	at com.my.package.test.BaseTest$3.evaluate(BaseTest.java:96)
-	at com.my.package.test.BaseTest$4.evaluate(BaseTest.java:109)
-	at com.my.package.test.BaseTest$2.evaluate(BaseTest.java:77)
-	at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55)
-	at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55)
-	at org.junit.rules.RunRules.evaluate(RunRules.java:20)
-	at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:81)
-	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:327)
-	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:84)
-	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
-	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
-	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
-	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
-	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
-	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
-	at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
-	at androidx.test.runner.AndroidJUnit4.run(AndroidJUnit4.java:99)
-	at org.junit.runners.Suite.runChild(Suite.java:128)
-	at org.junit.runners.Suite.runChild(Suite.java:27)
-	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
-	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
-	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
-	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
-	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
-	at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
-	at org.junit.runners.Suite.runChild(Suite.java:128)
-	at org.junit.runners.Suite.runChild(Suite.java:27)
-	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
-	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
-	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
-	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
-	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
-	at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
-	at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
-	at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
-	at androidx.test.internal.runner.TestExecutor.execute(TestExecutor.java:56)
-	at com.my.package.test.BaseRunner.runTests(BaseRunner.java:344)
-	at com.my.package.test.BaseRunner.onStart(BaseRunner.java:330)
-	at com.my.package.test.runner.MyRunner.onStart(MyRunner.java:253)
-	at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:2074)
+  at com.my.package.test.BasicTest.failingTest(BasicTest.java:40)
+  at java.lang.reflect.Method.invoke(Native Method)
+  at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:57)
+  at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
+  at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:59)
+  at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
+  at androidx.test.internal.runner.junit4.statement.RunBefores.evaluate(RunBefores.java:80)
+  at androidx.test.internal.runner.junit4.statement.RunAfters.evaluate(RunAfters.java:61)
+  at androidx.test.rule.ActivityTestRule$ActivityStatement.evaluate(ActivityTestRule.java:433)
+  at com.my.package.test.BaseTest$3.evaluate(BaseTest.java:96)
+  at com.my.package.test.BaseTest$4.evaluate(BaseTest.java:109)
+  at com.my.package.test.BaseTest$2.evaluate(BaseTest.java:77)
+  at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55)
+  at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55)
+  at org.junit.rules.RunRules.evaluate(RunRules.java:20)
+  at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:81)
+  at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:327)
+  at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:84)
+  at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
+  at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
+  at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
+  at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
+  at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
+  at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
+  at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
+  at androidx.test.runner.AndroidJUnit4.run(AndroidJUnit4.java:99)
+  at org.junit.runners.Suite.runChild(Suite.java:128)
+  at org.junit.runners.Suite.runChild(Suite.java:27)
+  at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
+  at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
+  at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
+  at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
+  at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
+  at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
+  at org.junit.runners.Suite.runChild(Suite.java:128)
+  at org.junit.runners.Suite.runChild(Suite.java:27)
+  at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
+  at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
+  at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
+  at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
+  at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
+  at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
+  at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
+  at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
+  at androidx.test.internal.runner.TestExecutor.execute(TestExecutor.java:56)
+  at com.my.package.test.BaseRunner.runTests(BaseRunner.java:344)
+  at com.my.package.test.BaseRunner.onStart(BaseRunner.java:330)
+  at com.my.package.test.runner.MyRunner.onStart(MyRunner.java:253)
+  at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:2074)
 
 INSTRUMENTATION_STATUS: test=failingTest
 INSTRUMENTATION_STATUS_CODE: -2
@@ -916,56 +916,56 @@
 INSTRUMENTATION_STATUS: id=AndroidJUnitRunner
 INSTRUMENTATION_STATUS: numtests=4
 INSTRUMENTATION_STATUS: stack=org.junit.AssumptionViolatedException: Assumption failure reason
-	at org.junit.Assume.assumeTrue(Assume.java:59)
-	at com.my.package.test.BasicTest.assumptionFailureTest(BasicTest.java:61)
-	at java.lang.reflect.Method.invoke(Native Method)
-	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:57)
-	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
-	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:59)
-	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
-	at androidx.test.internal.runner.junit4.statement.RunBefores.evaluate(RunBefores.java:80)
-	at androidx.test.internal.runner.junit4.statement.RunAfters.evaluate(RunAfters.java:61)
-	at androidx.test.rule.ActivityTestRule$ActivityStatement.evaluate(ActivityTestRule.java:433)
-	at com.my.package.test.BaseTest$3.evaluate(BaseTest.java:96)
-	at com.my.package.test.BaseTest$4.evaluate(BaseTest.java:109)
-	at com.my.package.test.BaseTest$2.evaluate(BaseTest.java:77)
-	at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55)
-	at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55)
-	at org.junit.rules.RunRules.evaluate(RunRules.java:20)
-	at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:81)
-	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:327)
-	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:84)
-	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
-	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
-	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
-	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
-	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
-	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
-	at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
-	at androidx.test.runner.AndroidJUnit4.run(AndroidJUnit4.java:99)
-	at org.junit.runners.Suite.runChild(Suite.java:128)
-	at org.junit.runners.Suite.runChild(Suite.java:27)
-	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
-	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
-	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
-	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
-	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
-	at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
-	at org.junit.runners.Suite.runChild(Suite.java:128)
-	at org.junit.runners.Suite.runChild(Suite.java:27)
-	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
-	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
-	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
-	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
-	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
-	at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
-	at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
-	at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
-	at androidx.test.internal.runner.TestExecutor.execute(TestExecutor.java:56)
-	at com.my.package.test.BaseRunner.runTests(BaseRunner.java:344)
-	at com.my.package.test.BaseRunner.onStart(BaseRunner.java:330)
-	at com.my.package.test.runner.MyRunner.onStart(MyRunner.java:253)
-	at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:2074)
+  at org.junit.Assume.assumeTrue(Assume.java:59)
+  at com.my.package.test.BasicTest.assumptionFailureTest(BasicTest.java:61)
+  at java.lang.reflect.Method.invoke(Native Method)
+  at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:57)
+  at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
+  at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:59)
+  at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
+  at androidx.test.internal.runner.junit4.statement.RunBefores.evaluate(RunBefores.java:80)
+  at androidx.test.internal.runner.junit4.statement.RunAfters.evaluate(RunAfters.java:61)
+  at androidx.test.rule.ActivityTestRule$ActivityStatement.evaluate(ActivityTestRule.java:433)
+  at com.my.package.test.BaseTest$3.evaluate(BaseTest.java:96)
+  at com.my.package.test.BaseTest$4.evaluate(BaseTest.java:109)
+  at com.my.package.test.BaseTest$2.evaluate(BaseTest.java:77)
+  at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55)
+  at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55)
+  at org.junit.rules.RunRules.evaluate(RunRules.java:20)
+  at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:81)
+  at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:327)
+  at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:84)
+  at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
+  at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
+  at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
+  at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
+  at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
+  at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
+  at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
+  at androidx.test.runner.AndroidJUnit4.run(AndroidJUnit4.java:99)
+  at org.junit.runners.Suite.runChild(Suite.java:128)
+  at org.junit.runners.Suite.runChild(Suite.java:27)
+  at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
+  at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
+  at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
+  at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
+  at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
+  at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
+  at org.junit.runners.Suite.runChild(Suite.java:128)
+  at org.junit.runners.Suite.runChild(Suite.java:27)
+  at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
+  at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
+  at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
+  at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
+  at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
+  at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
+  at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
+  at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
+  at androidx.test.internal.runner.TestExecutor.execute(TestExecutor.java:56)
+  at com.my.package.test.BaseRunner.runTests(BaseRunner.java:344)
+  at com.my.package.test.BaseRunner.onStart(BaseRunner.java:330)
+  at com.my.package.test.runner.MyRunner.onStart(MyRunner.java:253)
+  at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:2074)
 
 INSTRUMENTATION_STATUS: stream=
 INSTRUMENTATION_STATUS: test=assumptionFailureTest
@@ -1004,85 +1004,85 @@
 There was 1 failure:
 1) failingTest(com.my.package.test.BasicTest)
 java.lang.UnsupportedOperationException: dummy failing test
-	at com.my.package.test.BasicTest.failingTest(BasicTest.java:40)
-	at java.lang.reflect.Method.invoke(Native Method)
-	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:57)
-	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
-	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:59)
-	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
-	at androidx.test.internal.runner.junit4.statement.RunBefores.evaluate(RunBefores.java:80)
-	at androidx.test.internal.runner.junit4.statement.RunAfters.evaluate(RunAfters.java:61)
-	at androidx.test.rule.ActivityTestRule$ActivityStatement.evaluate(ActivityTestRule.java:433)
-	at com.my.package.test.BaseTest$3.evaluate(BaseTest.java:96)
-	at com.my.package.test.BaseTest$4.evaluate(BaseTest.java:109)
-	at com.my.package.test.BaseTest$2.evaluate(BaseTest.java:77)
-	at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55)
-	at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55)
-	at org.junit.rules.RunRules.evaluate(RunRules.java:20)
-	at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:81)
-	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:327)
-	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:84)
-	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
-	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
-	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
-	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
-	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
-	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
-	at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
-	at androidx.test.runner.AndroidJUnit4.run(AndroidJUnit4.java:99)
-	at org.junit.runners.Suite.runChild(Suite.java:128)
-	at org.junit.runners.Suite.runChild(Suite.java:27)
-	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
-	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
-	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
-	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
-	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
-	at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
-	at org.junit.runners.Suite.runChild(Suite.java:128)
-	at org.junit.runners.Suite.runChild(Suite.java:27)
-	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
-	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
-	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
-	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
-	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
-	at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
-	at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
-	at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
-	at androidx.test.internal.runner.TestExecutor.execute(TestExecutor.java:56)
-	at com.my.package.test.BaseRunner.runTests(BaseRunner.java:344)
-	at com.my.package.test.BaseRunner.onStart(BaseRunner.java:330)
-	at com.my.package.test.runner.MyRunner.onStart(MyRunner.java:253)
-	at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:2074)
+  at com.my.package.test.BasicTest.failingTest(BasicTest.java:40)
+  at java.lang.reflect.Method.invoke(Native Method)
+  at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:57)
+  at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
+  at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:59)
+  at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
+  at androidx.test.internal.runner.junit4.statement.RunBefores.evaluate(RunBefores.java:80)
+  at androidx.test.internal.runner.junit4.statement.RunAfters.evaluate(RunAfters.java:61)
+  at androidx.test.rule.ActivityTestRule$ActivityStatement.evaluate(ActivityTestRule.java:433)
+  at com.my.package.test.BaseTest$3.evaluate(BaseTest.java:96)
+  at com.my.package.test.BaseTest$4.evaluate(BaseTest.java:109)
+  at com.my.package.test.BaseTest$2.evaluate(BaseTest.java:77)
+  at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55)
+  at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55)
+  at org.junit.rules.RunRules.evaluate(RunRules.java:20)
+  at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:81)
+  at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:327)
+  at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:84)
+  at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
+  at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
+  at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
+  at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
+  at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
+  at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
+  at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
+  at androidx.test.runner.AndroidJUnit4.run(AndroidJUnit4.java:99)
+  at org.junit.runners.Suite.runChild(Suite.java:128)
+  at org.junit.runners.Suite.runChild(Suite.java:27)
+  at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
+  at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
+  at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
+  at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
+  at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
+  at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
+  at org.junit.runners.Suite.runChild(Suite.java:128)
+  at org.junit.runners.Suite.runChild(Suite.java:27)
+  at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
+  at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
+  at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
+  at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
+  at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
+  at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
+  at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
+  at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
+  at androidx.test.internal.runner.TestExecutor.execute(TestExecutor.java:56)
+  at com.my.package.test.BaseRunner.runTests(BaseRunner.java:344)
+  at com.my.package.test.BaseRunner.onStart(BaseRunner.java:330)
+  at com.my.package.test.runner.MyRunner.onStart(MyRunner.java:253)
+  at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:2074)
 
 FAILURES!!!
 Tests run: 3,  Failures: 1
 
 
 INSTRUMENTATION_CODE: -1"""
-        expected_executed = [
-            ('com.my.package.test.BasicTest#failingTest', signals.TestFailure),
-            ('com.my.package.test.BasicTest#passingTest', signals.TestPass),
-        ]
-        expected_skipped = [
-            ('com.my.package.test.BasicTest#assumptionFailureTest',
-             signals.TestSkip),
-            ('com.my.package.test.BasicTest#ignoredTest', signals.TestSkip),
-        ]
-        mock_get_time.side_effect = [54, 64, -1, -1, -1, -1, 89, 94]
-        self.assert_run_instrumentation_test(
-            instrumentation_output,
-            expected_executed=expected_executed,
-            expected_skipped=expected_skipped,
-            expected_executed_times=[(54, 64), (89, 94)])
+    expected_executed = [
+      ('com.my.package.test.BasicTest#failingTest', signals.TestFailure),
+      ('com.my.package.test.BasicTest#passingTest', signals.TestPass),
+    ]
+    expected_skipped = [
+      ('com.my.package.test.BasicTest#assumptionFailureTest',
+       signals.TestSkip),
+      ('com.my.package.test.BasicTest#ignoredTest', signals.TestSkip),
+    ]
+    mock_get_time.side_effect = [54, 64, -1, -1, -1, -1, 89, 94]
+    self.assert_run_instrumentation_test(
+      instrumentation_output,
+      expected_executed=expected_executed,
+      expected_skipped=expected_skipped,
+      expected_executed_times=[(54, 64), (89, 94)])
 
-    def test__Instrumentation_block_set_key_on_multiple_equals_sign(self):
-        value = "blah=blah, blah2=blah2, blah=2=1=2"
-        parsed_line = "INSTRUMENTATION_STATUS: stack=%s" % value
-        block = _InstrumentationBlock()
-        block.set_key(_InstrumentationStructurePrefixes.STATUS, parsed_line)
-        self.assertIn(value,
-                      block.known_keys[_InstrumentationKnownStatusKeys.STACK])
+  def test__Instrumentation_block_set_key_on_multiple_equals_sign(self):
+    value = "blah=blah, blah2=blah2, blah=2=1=2"
+    parsed_line = "INSTRUMENTATION_STATUS: stack=%s" % value
+    block = _InstrumentationBlock()
+    block.set_key(_InstrumentationStructurePrefixes.STATUS, parsed_line)
+    self.assertIn(value,
+            block.known_keys[_InstrumentationKnownStatusKeys.STACK])
 
 
 if __name__ == '__main__':
-    unittest.main()
+  unittest.main()
diff --git a/tests/mobly/base_test_test.py b/tests/mobly/base_test_test.py
index 6eb7149..4946d1a 100755
--- a/tests/mobly/base_test_test.py
+++ b/tests/mobly/base_test_test.py
@@ -42,2173 +42,2173 @@
 
 
 def never_call():
-    raise Exception(MSG_UNEXPECTED_EXCEPTION)
+  raise Exception(MSG_UNEXPECTED_EXCEPTION)
 
 
 class SomeError(Exception):
-    """A custom exception class used for tests in this module."""
+  """A custom exception class used for tests in this module."""
 
 
 class BaseTestTest(unittest.TestCase):
-    def setUp(self):
-        self.tmp_dir = tempfile.mkdtemp()
-        self.mock_test_cls_configs = config_parser.TestRunConfig()
-        self.summary_file = os.path.join(self.tmp_dir, 'summary.yaml')
-        self.mock_test_cls_configs.summary_writer = records.TestSummaryWriter(
-            self.summary_file)
-        self.mock_test_cls_configs.controller_configs = {}
-        self.mock_test_cls_configs.log_path = self.tmp_dir
-        self.mock_test_cls_configs.user_params = {"some_param": "hahaha"}
-        self.mock_test_cls_configs.reporter = mock.MagicMock()
-        self.mock_test_name = "test_something"
+  def setUp(self):
+    self.tmp_dir = tempfile.mkdtemp()
+    self.mock_test_cls_configs = config_parser.TestRunConfig()
+    self.summary_file = os.path.join(self.tmp_dir, 'summary.yaml')
+    self.mock_test_cls_configs.summary_writer = records.TestSummaryWriter(
+      self.summary_file)
+    self.mock_test_cls_configs.controller_configs = {}
+    self.mock_test_cls_configs.log_path = self.tmp_dir
+    self.mock_test_cls_configs.user_params = {"some_param": "hahaha"}
+    self.mock_test_cls_configs.reporter = mock.MagicMock()
+    self.mock_test_name = "test_something"
 
-    def tearDown(self):
-        shutil.rmtree(self.tmp_dir)
+  def tearDown(self):
+    shutil.rmtree(self.tmp_dir)
 
-    def test_paths(self):
-        '''Checks the output paths set in `BaseTestClass`.'''
-        path_checker = mock.MagicMock()
+  def test_paths(self):
+    '''Checks the output paths set in `BaseTestClass`.'''
+    path_checker = mock.MagicMock()
 
-        class MockBaseTest(base_test.BaseTestClass):
-            def test_func(self):
-                path_checker.log_path = self.log_path
-                path_checker.root_output_path = self.root_output_path
+    class MockBaseTest(base_test.BaseTestClass):
+      def test_func(self):
+        path_checker.log_path = self.log_path
+        path_checker.root_output_path = self.root_output_path
 
-        bt_cls = MockBaseTest(self.mock_test_cls_configs)
-        bt_cls.run(test_names=["test_func"])
-        self.assertEqual(path_checker.root_output_path, self.tmp_dir)
-        self.assertTrue(os.path.exists(path_checker.root_output_path))
-        expected_log_path = os.path.join(self.tmp_dir, 'MockBaseTest')
-        self.assertEqual(path_checker.log_path, expected_log_path)
-        self.assertTrue(os.path.exists(path_checker.log_path))
+    bt_cls = MockBaseTest(self.mock_test_cls_configs)
+    bt_cls.run(test_names=["test_func"])
+    self.assertEqual(path_checker.root_output_path, self.tmp_dir)
+    self.assertTrue(os.path.exists(path_checker.root_output_path))
+    expected_log_path = os.path.join(self.tmp_dir, 'MockBaseTest')
+    self.assertEqual(path_checker.log_path, expected_log_path)
+    self.assertTrue(os.path.exists(path_checker.log_path))
 
-    def test_current_test_name(self):
-        class MockBaseTest(base_test.BaseTestClass):
-            def test_func(self):
-                asserts.assert_true(self.current_test_info.name == "test_func",
-                                    ("Got "
-                                     "unexpected test name %s.") %
-                                    self.current_test_info.name)
+  def test_current_test_name(self):
+    class MockBaseTest(base_test.BaseTestClass):
+      def test_func(self):
+        asserts.assert_true(self.current_test_info.name == "test_func",
+                  ("Got "
+                   "unexpected test name %s.") %
+                  self.current_test_info.name)
 
-        bt_cls = MockBaseTest(self.mock_test_cls_configs)
-        bt_cls.run(test_names=["test_func"])
-        actual_record = bt_cls.results.passed[0]
-        self.assertEqual(actual_record.test_name, "test_func")
-        self.assertIsNone(actual_record.details)
-        self.assertIsNone(actual_record.extras)
+    bt_cls = MockBaseTest(self.mock_test_cls_configs)
+    bt_cls.run(test_names=["test_func"])
+    actual_record = bt_cls.results.passed[0]
+    self.assertEqual(actual_record.test_name, "test_func")
+    self.assertIsNone(actual_record.details)
+    self.assertIsNone(actual_record.extras)
 
-    def test_current_test_info(self):
-        class MockBaseTest(base_test.BaseTestClass):
-            def test_func(self):
-                asserts.assert_true(
-                    self.current_test_info.name == 'test_func',
-                    'Got unexpected test name %s.' %
-                    self.current_test_info.name)
-                output_path = self.current_test_info.output_path
-                asserts.assert_true(os.path.exists(output_path),
-                                    'test output path missing')
+  def test_current_test_info(self):
+    class MockBaseTest(base_test.BaseTestClass):
+      def test_func(self):
+        asserts.assert_true(
+          self.current_test_info.name == 'test_func',
+          'Got unexpected test name %s.' %
+          self.current_test_info.name)
+        output_path = self.current_test_info.output_path
+        asserts.assert_true(os.path.exists(output_path),
+                  'test output path missing')
 
-        bt_cls = MockBaseTest(self.mock_test_cls_configs)
-        bt_cls.run(test_names=['test_func'])
-        actual_record = bt_cls.results.passed[0]
-        self.assertEqual(actual_record.test_name, 'test_func')
-        self.assertIsNone(actual_record.details)
-        self.assertIsNone(actual_record.extras)
+    bt_cls = MockBaseTest(self.mock_test_cls_configs)
+    bt_cls.run(test_names=['test_func'])
+    actual_record = bt_cls.results.passed[0]
+    self.assertEqual(actual_record.test_name, 'test_func')
+    self.assertIsNone(actual_record.details)
+    self.assertIsNone(actual_record.extras)
 
-    def test_current_test_info_in_setup_class(self):
-        class MockBaseTest(base_test.BaseTestClass):
-            def setup_class(self):
-                asserts.assert_true(
-                    self.current_test_info.name == 'setup_class',
-                    'Got unexpected test name %s.' %
-                    self.current_test_info.name)
-                output_path = self.current_test_info.output_path
-                asserts.assert_true(os.path.exists(output_path),
-                                    'test output path missing')
-                raise Exception(MSG_EXPECTED_EXCEPTION)
+  def test_current_test_info_in_setup_class(self):
+    class MockBaseTest(base_test.BaseTestClass):
+      def setup_class(self):
+        asserts.assert_true(
+          self.current_test_info.name == 'setup_class',
+          'Got unexpected test name %s.' %
+          self.current_test_info.name)
+        output_path = self.current_test_info.output_path
+        asserts.assert_true(os.path.exists(output_path),
+                  'test output path missing')
+        raise Exception(MSG_EXPECTED_EXCEPTION)
 
-        bt_cls = MockBaseTest(self.mock_test_cls_configs)
-        bt_cls.run()
-        actual_record = bt_cls.results.error[0]
-        self.assertEqual(actual_record.test_name, 'setup_class')
-        self.assertEqual(actual_record.details, MSG_EXPECTED_EXCEPTION)
-        self.assertIsNone(actual_record.extras)
+    bt_cls = MockBaseTest(self.mock_test_cls_configs)
+    bt_cls.run()
+    actual_record = bt_cls.results.error[0]
+    self.assertEqual(actual_record.test_name, 'setup_class')
+    self.assertEqual(actual_record.details, MSG_EXPECTED_EXCEPTION)
+    self.assertIsNone(actual_record.extras)
 
-    def test_self_tests_list(self):
-        class MockBaseTest(base_test.BaseTestClass):
-            def __init__(self, controllers):
-                super(MockBaseTest, self).__init__(controllers)
-                self.tests = ("test_something", )
+  def test_self_tests_list(self):
+    class MockBaseTest(base_test.BaseTestClass):
+      def __init__(self, controllers):
+        super(MockBaseTest, self).__init__(controllers)
+        self.tests = ("test_something", )
 
-            def test_something(self):
-                pass
+      def test_something(self):
+        pass
 
-            def test_never(self):
-                # This should not execute it's not on default test list.
-                never_call()
+      def test_never(self):
+        # This should not execute it's not on default test list.
+        never_call()
 
-        bt_cls = MockBaseTest(self.mock_test_cls_configs)
-        bt_cls.run()
-        actual_record = bt_cls.results.passed[0]
-        self.assertEqual(actual_record.test_name, "test_something")
+    bt_cls = MockBaseTest(self.mock_test_cls_configs)
+    bt_cls.run()
+    actual_record = bt_cls.results.passed[0]
+    self.assertEqual(actual_record.test_name, "test_something")
 
-    def test_self_tests_list_fail_by_convention(self):
-        class MockBaseTest(base_test.BaseTestClass):
-            def __init__(self, controllers):
-                super(MockBaseTest, self).__init__(controllers)
-                self.tests = ("not_a_test_something", )
+  def test_self_tests_list_fail_by_convention(self):
+    class MockBaseTest(base_test.BaseTestClass):
+      def __init__(self, controllers):
+        super(MockBaseTest, self).__init__(controllers)
+        self.tests = ("not_a_test_something", )
 
-            def not_a_test_something(self):
-                pass
+      def not_a_test_something(self):
+        pass
 
-            def test_never(self):
-                # This should not execute it's not on default test list.
-                never_call()
+      def test_never(self):
+        # This should not execute it's not on default test list.
+        never_call()
 
-        bt_cls = MockBaseTest(self.mock_test_cls_configs)
-        expected_msg = (
-            r'Test method name not_a_test_something does not follow '
-            r'naming convention test_\*, abort.')
-        with self.assertRaisesRegex(base_test.Error, expected_msg):
-            bt_cls.run()
+    bt_cls = MockBaseTest(self.mock_test_cls_configs)
+    expected_msg = (
+      r'Test method name not_a_test_something does not follow '
+      r'naming convention test_\*, abort.')
+    with self.assertRaisesRegex(base_test.Error, expected_msg):
+      bt_cls.run()
 
-    def test_cli_test_selection_override_self_tests_list(self):
-        class MockBaseTest(base_test.BaseTestClass):
-            def __init__(self, controllers):
-                super(MockBaseTest, self).__init__(controllers)
-                self.tests = ("test_never", )
+  def test_cli_test_selection_override_self_tests_list(self):
+    class MockBaseTest(base_test.BaseTestClass):
+      def __init__(self, controllers):
+        super(MockBaseTest, self).__init__(controllers)
+        self.tests = ("test_never", )
 
-            def test_something(self):
-                pass
+      def test_something(self):
+        pass
 
-            def test_never(self):
-                # This should not execute it's not selected by cmd line input.
-                never_call()
+      def test_never(self):
+        # This should not execute it's not selected by cmd line input.
+        never_call()
 
-        bt_cls = MockBaseTest(self.mock_test_cls_configs)
-        bt_cls.run(test_names=["test_something"])
-        actual_record = bt_cls.results.passed[0]
-        self.assertEqual(actual_record.test_name, "test_something")
+    bt_cls = MockBaseTest(self.mock_test_cls_configs)
+    bt_cls.run(test_names=["test_something"])
+    actual_record = bt_cls.results.passed[0]
+    self.assertEqual(actual_record.test_name, "test_something")
 
-    def test_cli_test_selection_fail_by_convention(self):
-        class MockBaseTest(base_test.BaseTestClass):
-            def __init__(self, controllers):
-                super(MockBaseTest, self).__init__(controllers)
-                self.tests = ("not_a_test_something", )
+  def test_cli_test_selection_fail_by_convention(self):
+    class MockBaseTest(base_test.BaseTestClass):
+      def __init__(self, controllers):
+        super(MockBaseTest, self).__init__(controllers)
+        self.tests = ("not_a_test_something", )
 
-            def not_a_test_something(self):
-                pass
+      def not_a_test_something(self):
+        pass
 
-            def test_never(self):
-                # This should not execute it's not selected by cmd line input.
-                never_call()
+      def test_never(self):
+        # This should not execute it's not selected by cmd line input.
+        never_call()
 
-        bt_cls = MockBaseTest(self.mock_test_cls_configs)
-        expected_msg = (
-            r'Test method name not_a_test_something does not follow '
-            r'naming convention test_\*, abort.')
-        with self.assertRaisesRegex(base_test.Error, expected_msg):
-            bt_cls.run(test_names=["not_a_test_something"])
+    bt_cls = MockBaseTest(self.mock_test_cls_configs)
+    expected_msg = (
+      r'Test method name not_a_test_something does not follow '
+      r'naming convention test_\*, abort.')
+    with self.assertRaisesRegex(base_test.Error, expected_msg):
+      bt_cls.run(test_names=["not_a_test_something"])
 
-    def test_default_execution_of_all_tests(self):
-        class MockBaseTest(base_test.BaseTestClass):
-            def test_something(self):
-                pass
+  def test_default_execution_of_all_tests(self):
+    class MockBaseTest(base_test.BaseTestClass):
+      def test_something(self):
+        pass
 
-            def not_a_test(self):
-                # This should not execute its name doesn't follow test method
-                # naming convention.
-                never_call()
+      def not_a_test(self):
+        # This should not execute its name doesn't follow test method
+        # naming convention.
+        never_call()
 
-        bt_cls = MockBaseTest(self.mock_test_cls_configs)
-        bt_cls.run()
-        actual_record = bt_cls.results.passed[0]
-        self.assertEqual(actual_record.test_name, "test_something")
+    bt_cls = MockBaseTest(self.mock_test_cls_configs)
+    bt_cls.run()
+    actual_record = bt_cls.results.passed[0]
+    self.assertEqual(actual_record.test_name, "test_something")
 
-    def test_default_execution_skip_noncallable_tests(self):
-        mock_decorated = mock.MagicMock()
-        mock_undecorated = mock.MagicMock()
+  def test_default_execution_skip_noncallable_tests(self):
+    mock_decorated = mock.MagicMock()
+    mock_undecorated = mock.MagicMock()
 
-        class TestDecorator(object):
-            def __init__(self, func):
-                self.func = func
+    class TestDecorator(object):
+      def __init__(self, func):
+        self.func = func
 
-            def __call__(self, *args, **kwargs):
-                return self.func(*args, **kwargs)
+      def __call__(self, *args, **kwargs):
+        return self.func(*args, **kwargs)
 
-            def __get__(self, instance, owner):
-                return functools.partial(self.__call__, instance)
+      def __get__(self, instance, owner):
+        return functools.partial(self.__call__, instance)
 
-        class MockBaseTest(base_test.BaseTestClass):
-            def __init__(self, controllers):
-                super(MockBaseTest, self).__init__(controllers)
-                self.test_noncallable = None
+    class MockBaseTest(base_test.BaseTestClass):
+      def __init__(self, controllers):
+        super(MockBaseTest, self).__init__(controllers)
+        self.test_noncallable = None
 
-            @TestDecorator
-            def test_decorated(self):
-                mock_decorated('test_decorated')
+      @TestDecorator
+      def test_decorated(self):
+        mock_decorated('test_decorated')
 
-            def test_undecorated(self):
-                mock_undecorated('test_undecorated')
+      def test_undecorated(self):
+        mock_undecorated('test_undecorated')
 
-        bt_cls = MockBaseTest(self.mock_test_cls_configs)
-        bt_cls.run()
-        self.assertNotIn('test_noncallable',
-                         [test.test_name for test in bt_cls.results.executed])
-        mock_decorated.assert_called_once_with('test_decorated')
-        mock_undecorated.assert_called_once_with('test_undecorated')
+    bt_cls = MockBaseTest(self.mock_test_cls_configs)
+    bt_cls.run()
+    self.assertNotIn('test_noncallable',
+             [test.test_name for test in bt_cls.results.executed])
+    mock_decorated.assert_called_once_with('test_decorated')
+    mock_undecorated.assert_called_once_with('test_undecorated')
 
-    def test_missing_requested_test_func(self):
-        class MockBaseTest(base_test.BaseTestClass):
-            pass
+  def test_missing_requested_test_func(self):
+    class MockBaseTest(base_test.BaseTestClass):
+      pass
 
-        bt_cls = MockBaseTest(self.mock_test_cls_configs)
-        expected_msg = ".* does not have test method test_something"
-        with self.assertRaisesRegex(base_test.Error, expected_msg):
-            bt_cls.run(test_names=["test_something"])
-        self.assertFalse(bt_cls.results.executed)
+    bt_cls = MockBaseTest(self.mock_test_cls_configs)
+    expected_msg = ".* does not have test method test_something"
+    with self.assertRaisesRegex(base_test.Error, expected_msg):
+      bt_cls.run(test_names=["test_something"])
+    self.assertFalse(bt_cls.results.executed)
 
-    def test_setup_class_fail_by_exception(self):
-        teardown_class_call_check = mock.MagicMock()
-        on_fail_call_check = mock.MagicMock()
+  def test_setup_class_fail_by_exception(self):
+    teardown_class_call_check = mock.MagicMock()
+    on_fail_call_check = mock.MagicMock()
 
-        class MockBaseTest(base_test.BaseTestClass):
-            def setup_class(self):
-                raise Exception(MSG_EXPECTED_EXCEPTION)
+    class MockBaseTest(base_test.BaseTestClass):
+      def setup_class(self):
+        raise Exception(MSG_EXPECTED_EXCEPTION)
 
-            def test_something(self):
-                # This should not execute because setup_class failed.
-                never_call()
+      def test_something(self):
+        # This should not execute because setup_class failed.
+        never_call()
 
-            def test_something2(self):
-                # This should not execute because setup_class failed.
-                never_call()
+      def test_something2(self):
+        # This should not execute because setup_class failed.
+        never_call()
 
-            def teardown_class(self):
-                # This should execute because the setup_class failure should
-                # have already been recorded.
-                if not self.results.is_all_pass:
-                    teardown_class_call_check("heehee")
+      def teardown_class(self):
+        # This should execute because the setup_class failure should
+        # have already been recorded.
+        if not self.results.is_all_pass:
+          teardown_class_call_check("heehee")
 
-            def on_fail(self, record):
-                on_fail_call_check("haha")
+      def on_fail(self, record):
+        on_fail_call_check("haha")
 
-        bt_cls = MockBaseTest(self.mock_test_cls_configs)
-        bt_cls.run()
-        actual_record = bt_cls.results.error[0]
-        skipped_record = bt_cls.results.skipped[0]
-        self.assertIsNone(skipped_record.begin_time)
-        self.assertIsNone(skipped_record.end_time)
-        utils.validate_test_result(bt_cls.results)
-        self.assertEqual(actual_record.test_name, "setup_class")
-        self.assertEqual(actual_record.details, MSG_EXPECTED_EXCEPTION)
-        self.assertIsNone(actual_record.extras)
-        expected_summary = ("Error 1, Executed 0, Failed 0, Passed 0, "
-                            "Requested 2, Skipped 2")
-        self.assertEqual(bt_cls.results.summary_str(), expected_summary)
-        teardown_class_call_check.assert_called_once_with("heehee")
-        on_fail_call_check.assert_called_once_with("haha")
+    bt_cls = MockBaseTest(self.mock_test_cls_configs)
+    bt_cls.run()
+    actual_record = bt_cls.results.error[0]
+    skipped_record = bt_cls.results.skipped[0]
+    self.assertIsNone(skipped_record.begin_time)
+    self.assertIsNone(skipped_record.end_time)
+    utils.validate_test_result(bt_cls.results)
+    self.assertEqual(actual_record.test_name, "setup_class")
+    self.assertEqual(actual_record.details, MSG_EXPECTED_EXCEPTION)
+    self.assertIsNone(actual_record.extras)
+    expected_summary = ("Error 1, Executed 0, Failed 0, Passed 0, "
+              "Requested 2, Skipped 2")
+    self.assertEqual(bt_cls.results.summary_str(), expected_summary)
+    teardown_class_call_check.assert_called_once_with("heehee")
+    on_fail_call_check.assert_called_once_with("haha")
 
-    def test_teardown_class_fail_by_exception(self):
-        mock_test_config = self.mock_test_cls_configs.copy()
-        mock_ctrlr_config_name = mock_controller.MOBLY_CONTROLLER_CONFIG_NAME
-        mock_ctrlr_2_config_name = mock_second_controller.MOBLY_CONTROLLER_CONFIG_NAME
-        my_config = [{'serial': 'xxxx', 'magic': 'Magic'}]
-        mock_test_config.controller_configs[mock_ctrlr_config_name] = my_config
-        mock_test_config.controller_configs[
-            mock_ctrlr_2_config_name] = copy.copy(my_config)
+  def test_teardown_class_fail_by_exception(self):
+    mock_test_config = self.mock_test_cls_configs.copy()
+    mock_ctrlr_config_name = mock_controller.MOBLY_CONTROLLER_CONFIG_NAME
+    mock_ctrlr_2_config_name = mock_second_controller.MOBLY_CONTROLLER_CONFIG_NAME
+    my_config = [{'serial': 'xxxx', 'magic': 'Magic'}]
+    mock_test_config.controller_configs[mock_ctrlr_config_name] = my_config
+    mock_test_config.controller_configs[
+      mock_ctrlr_2_config_name] = copy.copy(my_config)
 
-        class MockBaseTest(base_test.BaseTestClass):
-            def setup_class(self):
-                self.register_controller(mock_controller)
+    class MockBaseTest(base_test.BaseTestClass):
+      def setup_class(self):
+        self.register_controller(mock_controller)
 
-            def test_something(self):
-                pass
+      def test_something(self):
+        pass
 
-            def teardown_class(self):
-                raise Exception(MSG_EXPECTED_EXCEPTION)
+      def teardown_class(self):
+        raise Exception(MSG_EXPECTED_EXCEPTION)
 
-        bt_cls = MockBaseTest(mock_test_config)
-        bt_cls.run()
-        test_record = bt_cls.results.passed[0]
-        class_record = bt_cls.results.error[0]
-        self.assertFalse(bt_cls.results.is_all_pass)
-        self.assertEqual(class_record.test_name, 'teardown_class')
-        self.assertEqual(class_record.details, MSG_EXPECTED_EXCEPTION)
-        self.assertIsNotNone(class_record.begin_time)
-        self.assertIsNotNone(class_record.end_time)
-        self.assertIsNone(class_record.extras)
-        expected_summary = ('Error 1, Executed 1, Failed 0, Passed 1, '
-                            'Requested 1, Skipped 0')
-        self.assertEqual(bt_cls.results.summary_str(), expected_summary)
-        # Verify the controller info is recorded correctly.
-        info = bt_cls.results.controller_info[0]
-        self.assertEqual(info.test_class, 'MockBaseTest')
-        self.assertEqual(info.controller_name, 'MagicDevice')
-        self.assertEqual(info.controller_info, [{
-            'MyMagic': {
-                'magic': 'Magic'
-            }
-        }])
+    bt_cls = MockBaseTest(mock_test_config)
+    bt_cls.run()
+    test_record = bt_cls.results.passed[0]
+    class_record = bt_cls.results.error[0]
+    self.assertFalse(bt_cls.results.is_all_pass)
+    self.assertEqual(class_record.test_name, 'teardown_class')
+    self.assertEqual(class_record.details, MSG_EXPECTED_EXCEPTION)
+    self.assertIsNotNone(class_record.begin_time)
+    self.assertIsNotNone(class_record.end_time)
+    self.assertIsNone(class_record.extras)
+    expected_summary = ('Error 1, Executed 1, Failed 0, Passed 1, '
+              'Requested 1, Skipped 0')
+    self.assertEqual(bt_cls.results.summary_str(), expected_summary)
+    # Verify the controller info is recorded correctly.
+    info = bt_cls.results.controller_info[0]
+    self.assertEqual(info.test_class, 'MockBaseTest')
+    self.assertEqual(info.controller_name, 'MagicDevice')
+    self.assertEqual(info.controller_info, [{
+      'MyMagic': {
+        'magic': 'Magic'
+      }
+    }])
 
-    def test_teardown_class_raise_abort_all(self):
-        mock_test_config = self.mock_test_cls_configs.copy()
-        mock_ctrlr_config_name = mock_controller.MOBLY_CONTROLLER_CONFIG_NAME
-        mock_ctrlr_2_config_name = mock_second_controller.MOBLY_CONTROLLER_CONFIG_NAME
-        my_config = [{'serial': 'xxxx', 'magic': 'Magic'}]
-        mock_test_config.controller_configs[mock_ctrlr_config_name] = my_config
-        mock_test_config.controller_configs[
-            mock_ctrlr_2_config_name] = copy.copy(my_config)
+  def test_teardown_class_raise_abort_all(self):
+    mock_test_config = self.mock_test_cls_configs.copy()
+    mock_ctrlr_config_name = mock_controller.MOBLY_CONTROLLER_CONFIG_NAME
+    mock_ctrlr_2_config_name = mock_second_controller.MOBLY_CONTROLLER_CONFIG_NAME
+    my_config = [{'serial': 'xxxx', 'magic': 'Magic'}]
+    mock_test_config.controller_configs[mock_ctrlr_config_name] = my_config
+    mock_test_config.controller_configs[
+      mock_ctrlr_2_config_name] = copy.copy(my_config)
 
-        class MockBaseTest(base_test.BaseTestClass):
-            def setup_class(self):
-                self.register_controller(mock_controller)
+    class MockBaseTest(base_test.BaseTestClass):
+      def setup_class(self):
+        self.register_controller(mock_controller)
 
-            def test_something(self):
-                pass
+      def test_something(self):
+        pass
 
-            def teardown_class(self):
-                raise asserts.abort_all(MSG_EXPECTED_EXCEPTION)
+      def teardown_class(self):
+        raise asserts.abort_all(MSG_EXPECTED_EXCEPTION)
 
-        bt_cls = MockBaseTest(mock_test_config)
-        with self.assertRaisesRegex(signals.TestAbortAll,
-                                    MSG_EXPECTED_EXCEPTION):
-            bt_cls.run()
-        test_record = bt_cls.results.passed[0]
-        self.assertTrue(bt_cls.results.is_all_pass)
-        expected_summary = ('Error 0, Executed 1, Failed 0, Passed 1, '
-                            'Requested 1, Skipped 0')
-        self.assertEqual(bt_cls.results.summary_str(), expected_summary)
-        # Verify the controller info is recorded correctly.
-        info = bt_cls.results.controller_info[0]
-        self.assertEqual(info.test_class, 'MockBaseTest')
-        self.assertEqual(info.controller_name, 'MagicDevice')
-        self.assertEqual(info.controller_info, [{
-            'MyMagic': {
-                'magic': 'Magic'
-            }
-        }])
+    bt_cls = MockBaseTest(mock_test_config)
+    with self.assertRaisesRegex(signals.TestAbortAll,
+                  MSG_EXPECTED_EXCEPTION):
+      bt_cls.run()
+    test_record = bt_cls.results.passed[0]
+    self.assertTrue(bt_cls.results.is_all_pass)
+    expected_summary = ('Error 0, Executed 1, Failed 0, Passed 1, '
+              'Requested 1, Skipped 0')
+    self.assertEqual(bt_cls.results.summary_str(), expected_summary)
+    # Verify the controller info is recorded correctly.
+    info = bt_cls.results.controller_info[0]
+    self.assertEqual(info.test_class, 'MockBaseTest')
+    self.assertEqual(info.controller_name, 'MagicDevice')
+    self.assertEqual(info.controller_info, [{
+      'MyMagic': {
+        'magic': 'Magic'
+      }
+    }])
 
-    def test_setup_test_fail_by_exception(self):
-        mock_on_fail = mock.Mock()
+  def test_setup_test_fail_by_exception(self):
+    mock_on_fail = mock.Mock()
 
-        class MockBaseTest(base_test.BaseTestClass):
-            def on_fail(self, *args):
-                mock_on_fail('on_fail')
+    class MockBaseTest(base_test.BaseTestClass):
+      def on_fail(self, *args):
+        mock_on_fail('on_fail')
 
-            def setup_test(self):
-                raise Exception(MSG_EXPECTED_EXCEPTION)
+      def setup_test(self):
+        raise Exception(MSG_EXPECTED_EXCEPTION)
 
-            def test_something(self):
-                # This should not execute because setup_test failed.
-                never_call()
+      def test_something(self):
+        # This should not execute because setup_test failed.
+        never_call()
 
-        bt_cls = MockBaseTest(self.mock_test_cls_configs)
-        bt_cls.run(test_names=["test_something"])
-        mock_on_fail.assert_called_once_with('on_fail')
-        actual_record = bt_cls.results.error[0]
-        self.assertEqual(actual_record.test_name, self.mock_test_name)
-        self.assertEqual(actual_record.details, MSG_EXPECTED_EXCEPTION)
-        self.assertTrue('in setup_test\n    '
-                        'raise Exception(MSG_EXPECTED_EXCEPTION)\n'
-                        'Exception: This is an expected exception.\n' in
-                        actual_record.stacktrace)
-        self.assertIsNone(actual_record.extras)
-        expected_summary = ("Error 1, Executed 1, Failed 0, Passed 0, "
-                            "Requested 1, Skipped 0")
-        self.assertEqual(bt_cls.results.summary_str(), expected_summary)
+    bt_cls = MockBaseTest(self.mock_test_cls_configs)
+    bt_cls.run(test_names=["test_something"])
+    mock_on_fail.assert_called_once_with('on_fail')
+    actual_record = bt_cls.results.error[0]
+    self.assertEqual(actual_record.test_name, self.mock_test_name)
+    self.assertEqual(actual_record.details, MSG_EXPECTED_EXCEPTION)
+    self.assertTrue('in setup_test\n    '
+            'raise Exception(MSG_EXPECTED_EXCEPTION)\n'
+            'Exception: This is an expected exception.\n' in
+            actual_record.stacktrace)
+    self.assertIsNone(actual_record.extras)
+    expected_summary = ("Error 1, Executed 1, Failed 0, Passed 0, "
+              "Requested 1, Skipped 0")
+    self.assertEqual(bt_cls.results.summary_str(), expected_summary)
 
-    def test_setup_test_fail_by_test_signal(self):
-        class MockBaseTest(base_test.BaseTestClass):
-            def setup_test(self):
-                raise signals.TestFailure(MSG_EXPECTED_EXCEPTION)
+  def test_setup_test_fail_by_test_signal(self):
+    class MockBaseTest(base_test.BaseTestClass):
+      def setup_test(self):
+        raise signals.TestFailure(MSG_EXPECTED_EXCEPTION)
 
-            def test_something(self):
-                # This should not execute because setup_test failed.
-                never_call()
+      def test_something(self):
+        # This should not execute because setup_test failed.
+        never_call()
 
-        bt_cls = MockBaseTest(self.mock_test_cls_configs)
-        bt_cls.run(test_names=["test_something"])
-        actual_record = bt_cls.results.error[0]
-        self.assertEqual(actual_record.test_name, self.mock_test_name)
-        self.assertEqual(actual_record.details, MSG_EXPECTED_EXCEPTION)
-        # Make sure the full stacktrace of `setup_test` is preserved.
-        self.assertTrue('self.setup_test()' in actual_record.stacktrace)
-        self.assertIsNone(actual_record.extras)
-        self.assertTrue(actual_record.end_time)
-        expected_summary = ("Error 1, Executed 1, Failed 0, Passed 0, "
-                            "Requested 1, Skipped 0")
-        self.assertEqual(bt_cls.results.summary_str(), expected_summary)
+    bt_cls = MockBaseTest(self.mock_test_cls_configs)
+    bt_cls.run(test_names=["test_something"])
+    actual_record = bt_cls.results.error[0]
+    self.assertEqual(actual_record.test_name, self.mock_test_name)
+    self.assertEqual(actual_record.details, MSG_EXPECTED_EXCEPTION)
+    # Make sure the full stacktrace of `setup_test` is preserved.
+    self.assertTrue('self.setup_test()' in actual_record.stacktrace)
+    self.assertIsNone(actual_record.extras)
+    self.assertTrue(actual_record.end_time)
+    expected_summary = ("Error 1, Executed 1, Failed 0, Passed 0, "
+              "Requested 1, Skipped 0")
+    self.assertEqual(bt_cls.results.summary_str(), expected_summary)
 
-    def test_teardown_test_assert_fail(self):
-        class MockBaseTest(base_test.BaseTestClass):
-            def teardown_test(self):
-                asserts.fail(MSG_EXPECTED_EXCEPTION)
+  def test_teardown_test_assert_fail(self):
+    class MockBaseTest(base_test.BaseTestClass):
+      def teardown_test(self):
+        asserts.fail(MSG_EXPECTED_EXCEPTION)
 
-            def test_something(self):
-                pass
+      def test_something(self):
+        pass
 
-        bt_cls = MockBaseTest(self.mock_test_cls_configs)
-        bt_cls.run()
-        actual_record = bt_cls.results.error[0]
-        self.assertEqual(actual_record.test_name, self.mock_test_name)
-        self.assertEqual(actual_record.details, MSG_EXPECTED_EXCEPTION)
-        self.assertTrue(actual_record.end_time)
-        self.assertIsNone(actual_record.extras)
-        expected_summary = ("Error 1, Executed 1, Failed 0, Passed 0, "
-                            "Requested 1, Skipped 0")
-        self.assertEqual(bt_cls.results.summary_str(), expected_summary)
+    bt_cls = MockBaseTest(self.mock_test_cls_configs)
+    bt_cls.run()
+    actual_record = bt_cls.results.error[0]
+    self.assertEqual(actual_record.test_name, self.mock_test_name)
+    self.assertEqual(actual_record.details, MSG_EXPECTED_EXCEPTION)
+    self.assertTrue(actual_record.end_time)
+    self.assertIsNone(actual_record.extras)
+    expected_summary = ("Error 1, Executed 1, Failed 0, Passed 0, "
+              "Requested 1, Skipped 0")
+    self.assertEqual(bt_cls.results.summary_str(), expected_summary)
 
-    def test_teardown_test_raise_exception(self):
-        class MockBaseTest(base_test.BaseTestClass):
-            def teardown_test(self):
-                raise Exception(MSG_EXPECTED_EXCEPTION)
+  def test_teardown_test_raise_exception(self):
+    class MockBaseTest(base_test.BaseTestClass):
+      def teardown_test(self):
+        raise Exception(MSG_EXPECTED_EXCEPTION)
 
-            def test_something(self):
-                pass
+      def test_something(self):
+        pass
 
-        bt_cls = MockBaseTest(self.mock_test_cls_configs)
-        bt_cls.run()
-        actual_record = bt_cls.results.error[0]
-        self.assertEqual(actual_record.test_name, self.mock_test_name)
-        self.assertEqual(actual_record.details, MSG_EXPECTED_EXCEPTION)
-        self.assertIsNone(actual_record.extras)
-        self.assertFalse(actual_record.extra_errors)
-        expected_summary = ("Error 1, Executed 1, Failed 0, Passed 0, "
-                            "Requested 1, Skipped 0")
-        self.assertEqual(bt_cls.results.summary_str(), expected_summary)
+    bt_cls = MockBaseTest(self.mock_test_cls_configs)
+    bt_cls.run()
+    actual_record = bt_cls.results.error[0]
+    self.assertEqual(actual_record.test_name, self.mock_test_name)
+    self.assertEqual(actual_record.details, MSG_EXPECTED_EXCEPTION)
+    self.assertIsNone(actual_record.extras)
+    self.assertFalse(actual_record.extra_errors)
+    expected_summary = ("Error 1, Executed 1, Failed 0, Passed 0, "
+              "Requested 1, Skipped 0")
+    self.assertEqual(bt_cls.results.summary_str(), expected_summary)
 
-    def test_teardown_test_executed_if_test_pass(self):
-        my_mock = mock.MagicMock()
+  def test_teardown_test_executed_if_test_pass(self):
+    my_mock = mock.MagicMock()
 
-        class MockBaseTest(base_test.BaseTestClass):
-            def teardown_test(self):
-                my_mock("teardown_test")
+    class MockBaseTest(base_test.BaseTestClass):
+      def teardown_test(self):
+        my_mock("teardown_test")
 
-            def test_something(self):
-                pass
+      def test_something(self):
+        pass
 
-        bt_cls = MockBaseTest(self.mock_test_cls_configs)
-        bt_cls.run()
-        actual_record = bt_cls.results.passed[0]
-        my_mock.assert_called_once_with("teardown_test")
-        self.assertEqual(actual_record.test_name, self.mock_test_name)
-        self.assertIsNone(actual_record.details)
-        self.assertIsNone(actual_record.extras)
-        self.assertTrue(actual_record.end_time)
-        expected_summary = ("Error 0, Executed 1, Failed 0, Passed 1, "
-                            "Requested 1, Skipped 0")
-        self.assertEqual(bt_cls.results.summary_str(), expected_summary)
+    bt_cls = MockBaseTest(self.mock_test_cls_configs)
+    bt_cls.run()
+    actual_record = bt_cls.results.passed[0]
+    my_mock.assert_called_once_with("teardown_test")
+    self.assertEqual(actual_record.test_name, self.mock_test_name)
+    self.assertIsNone(actual_record.details)
+    self.assertIsNone(actual_record.extras)
+    self.assertTrue(actual_record.end_time)
+    expected_summary = ("Error 0, Executed 1, Failed 0, Passed 1, "
+              "Requested 1, Skipped 0")
+    self.assertEqual(bt_cls.results.summary_str(), expected_summary)
 
-    def test_teardown_test_executed_if_setup_test_fails(self):
-        my_mock = mock.MagicMock()
+  def test_teardown_test_executed_if_setup_test_fails(self):
+    my_mock = mock.MagicMock()
 
-        class MockBaseTest(base_test.BaseTestClass):
-            def setup_test(self):
-                raise Exception(MSG_EXPECTED_EXCEPTION)
+    class MockBaseTest(base_test.BaseTestClass):
+      def setup_test(self):
+        raise Exception(MSG_EXPECTED_EXCEPTION)
 
-            def teardown_test(self):
-                my_mock("teardown_test")
+      def teardown_test(self):
+        my_mock("teardown_test")
 
-            def test_something(self):
-                pass
+      def test_something(self):
+        pass
 
-        bt_cls = MockBaseTest(self.mock_test_cls_configs)
-        bt_cls.run()
-        actual_record = bt_cls.results.error[0]
-        my_mock.assert_called_once_with("teardown_test")
-        self.assertEqual(actual_record.test_name, self.mock_test_name)
-        self.assertEqual(actual_record.details, MSG_EXPECTED_EXCEPTION)
-        self.assertIsNone(actual_record.extras)
-        self.assertTrue(actual_record.end_time)
-        expected_summary = ("Error 1, Executed 1, Failed 0, Passed 0, "
-                            "Requested 1, Skipped 0")
-        self.assertEqual(bt_cls.results.summary_str(), expected_summary)
+    bt_cls = MockBaseTest(self.mock_test_cls_configs)
+    bt_cls.run()
+    actual_record = bt_cls.results.error[0]
+    my_mock.assert_called_once_with("teardown_test")
+    self.assertEqual(actual_record.test_name, self.mock_test_name)
+    self.assertEqual(actual_record.details, MSG_EXPECTED_EXCEPTION)
+    self.assertIsNone(actual_record.extras)
+    self.assertTrue(actual_record.end_time)
+    expected_summary = ("Error 1, Executed 1, Failed 0, Passed 0, "
+              "Requested 1, Skipped 0")
+    self.assertEqual(bt_cls.results.summary_str(), expected_summary)
 
-    def test_teardown_test_executed_if_test_fails(self):
-        my_mock = mock.MagicMock()
+  def test_teardown_test_executed_if_test_fails(self):
+    my_mock = mock.MagicMock()
 
-        class MockBaseTest(base_test.BaseTestClass):
-            def teardown_test(self):
-                my_mock("teardown_test")
+    class MockBaseTest(base_test.BaseTestClass):
+      def teardown_test(self):
+        my_mock("teardown_test")
 
-            def on_pass(self, record):
-                never_call()
+      def on_pass(self, record):
+        never_call()
 
-            def test_something(self):
-                raise Exception(MSG_EXPECTED_EXCEPTION)
+      def test_something(self):
+        raise Exception(MSG_EXPECTED_EXCEPTION)
 
-        bt_cls = MockBaseTest(self.mock_test_cls_configs)
-        bt_cls.run()
-        actual_record = bt_cls.results.error[0]
-        my_mock.assert_called_once_with("teardown_test")
-        self.assertEqual(actual_record.test_name, self.mock_test_name)
-        self.assertEqual(actual_record.details, MSG_EXPECTED_EXCEPTION)
-        self.assertIsNone(actual_record.extras)
-        expected_summary = ("Error 1, Executed 1, Failed 0, Passed 0, "
-                            "Requested 1, Skipped 0")
-        self.assertEqual(bt_cls.results.summary_str(), expected_summary)
+    bt_cls = MockBaseTest(self.mock_test_cls_configs)
+    bt_cls.run()
+    actual_record = bt_cls.results.error[0]
+    my_mock.assert_called_once_with("teardown_test")
+    self.assertEqual(actual_record.test_name, self.mock_test_name)
+    self.assertEqual(actual_record.details, MSG_EXPECTED_EXCEPTION)
+    self.assertIsNone(actual_record.extras)
+    expected_summary = ("Error 1, Executed 1, Failed 0, Passed 0, "
+              "Requested 1, Skipped 0")
+    self.assertEqual(bt_cls.results.summary_str(), expected_summary)
 
-    def test_on_fail_executed_if_teardown_test_fails(self):
-        my_mock = mock.MagicMock()
+  def test_on_fail_executed_if_teardown_test_fails(self):
+    my_mock = mock.MagicMock()
 
-        class MockBaseTest(base_test.BaseTestClass):
-            def on_fail(self, record):
-                my_mock("on_fail")
+    class MockBaseTest(base_test.BaseTestClass):
+      def on_fail(self, record):
+        my_mock("on_fail")
 
-            def on_pass(self, record):
-                never_call()
+      def on_pass(self, record):
+        never_call()
 
-            def teardown_test(self):
-                raise Exception(MSG_EXPECTED_EXCEPTION)
+      def teardown_test(self):
+        raise Exception(MSG_EXPECTED_EXCEPTION)
 
-            def test_something(self):
-                pass
+      def test_something(self):
+        pass
 
-        bt_cls = MockBaseTest(self.mock_test_cls_configs)
-        bt_cls.run()
-        my_mock.assert_called_once_with('on_fail')
-        actual_record = bt_cls.results.error[0]
-        self.assertEqual(actual_record.test_name, self.mock_test_name)
-        self.assertEqual(actual_record.details, MSG_EXPECTED_EXCEPTION)
-        self.assertIsNone(actual_record.extras)
-        expected_summary = ("Error 1, Executed 1, Failed 0, Passed 0, "
-                            "Requested 1, Skipped 0")
-        self.assertEqual(bt_cls.results.summary_str(), expected_summary)
+    bt_cls = MockBaseTest(self.mock_test_cls_configs)
+    bt_cls.run()
+    my_mock.assert_called_once_with('on_fail')
+    actual_record = bt_cls.results.error[0]
+    self.assertEqual(actual_record.test_name, self.mock_test_name)
+    self.assertEqual(actual_record.details, MSG_EXPECTED_EXCEPTION)
+    self.assertIsNone(actual_record.extras)
+    expected_summary = ("Error 1, Executed 1, Failed 0, Passed 0, "
+              "Requested 1, Skipped 0")
+    self.assertEqual(bt_cls.results.summary_str(), expected_summary)
 
-    def test_on_fail_executed_if_test_fails(self):
-        my_mock = mock.MagicMock()
+  def test_on_fail_executed_if_test_fails(self):
+    my_mock = mock.MagicMock()
 
-        class MockBaseTest(base_test.BaseTestClass):
-            def on_fail(self, record):
-                assert self.current_test_info.name == 'test_something'
-                my_mock("on_fail")
+    class MockBaseTest(base_test.BaseTestClass):
+      def on_fail(self, record):
+        assert self.current_test_info.name == 'test_something'
+        my_mock("on_fail")
 
-            def on_pass(self, record):
-                never_call()
+      def on_pass(self, record):
+        never_call()
 
-            def test_something(self):
-                asserts.assert_true(False, MSG_EXPECTED_EXCEPTION)
+      def test_something(self):
+        asserts.assert_true(False, MSG_EXPECTED_EXCEPTION)
 
-        bt_cls = MockBaseTest(self.mock_test_cls_configs)
-        bt_cls.run()
-        my_mock.assert_called_once_with("on_fail")
-        actual_record = bt_cls.results.failed[0]
-        self.assertEqual(actual_record.test_name, self.mock_test_name)
-        self.assertEqual(actual_record.details, MSG_EXPECTED_EXCEPTION)
-        self.assertIsNone(actual_record.extras)
-        expected_summary = ("Error 0, Executed 1, Failed 1, Passed 0, "
-                            "Requested 1, Skipped 0")
-        self.assertEqual(bt_cls.results.summary_str(), expected_summary)
+    bt_cls = MockBaseTest(self.mock_test_cls_configs)
+    bt_cls.run()
+    my_mock.assert_called_once_with("on_fail")
+    actual_record = bt_cls.results.failed[0]
+    self.assertEqual(actual_record.test_name, self.mock_test_name)
+    self.assertEqual(actual_record.details, MSG_EXPECTED_EXCEPTION)
+    self.assertIsNone(actual_record.extras)
+    expected_summary = ("Error 0, Executed 1, Failed 1, Passed 0, "
+              "Requested 1, Skipped 0")
+    self.assertEqual(bt_cls.results.summary_str(), expected_summary)
 
-    def test_procedure_function_gets_correct_record(self):
-        on_fail_mock = mock.MagicMock()
+  def test_procedure_function_gets_correct_record(self):
+    on_fail_mock = mock.MagicMock()
 
-        class MockBaseTest(base_test.BaseTestClass):
-            def on_fail(self, record):
-                on_fail_mock.record = record
+    class MockBaseTest(base_test.BaseTestClass):
+      def on_fail(self, record):
+        on_fail_mock.record = record
 
-            def test_something(self):
-                asserts.fail(MSG_EXPECTED_EXCEPTION)
+      def test_something(self):
+        asserts.fail(MSG_EXPECTED_EXCEPTION)
 
-        bt_cls = MockBaseTest(self.mock_test_cls_configs)
-        bt_cls.run()
-        actual_record = bt_cls.results.failed[0]
-        self.assertEqual(actual_record.test_name, 'test_something')
-        self.assertEqual(on_fail_mock.record.test_name,
-                         actual_record.test_name)
-        self.assertEqual(on_fail_mock.record.begin_time,
-                         actual_record.begin_time)
-        self.assertEqual(on_fail_mock.record.end_time, actual_record.end_time)
-        self.assertEqual(on_fail_mock.record.stacktrace,
-                         actual_record.stacktrace)
-        self.assertEqual(on_fail_mock.record.extras, actual_record.extras)
-        self.assertEqual(on_fail_mock.record.extra_errors,
-                         actual_record.extra_errors)
-        # But they are not the same object.
-        self.assertIsNot(on_fail_mock.record, actual_record)
+    bt_cls = MockBaseTest(self.mock_test_cls_configs)
+    bt_cls.run()
+    actual_record = bt_cls.results.failed[0]
+    self.assertEqual(actual_record.test_name, 'test_something')
+    self.assertEqual(on_fail_mock.record.test_name,
+             actual_record.test_name)
+    self.assertEqual(on_fail_mock.record.begin_time,
+             actual_record.begin_time)
+    self.assertEqual(on_fail_mock.record.end_time, actual_record.end_time)
+    self.assertEqual(on_fail_mock.record.stacktrace,
+             actual_record.stacktrace)
+    self.assertEqual(on_fail_mock.record.extras, actual_record.extras)
+    self.assertEqual(on_fail_mock.record.extra_errors,
+             actual_record.extra_errors)
+    # But they are not the same object.
+    self.assertIsNot(on_fail_mock.record, actual_record)
 
-    def test_on_fail_cannot_modify_original_record(self):
-        class MockBaseTest(base_test.BaseTestClass):
-            def on_fail(self, record):
-                record.test_name = 'blah'
+  def test_on_fail_cannot_modify_original_record(self):
+    class MockBaseTest(base_test.BaseTestClass):
+      def on_fail(self, record):
+        record.test_name = 'blah'
 
-            def test_something(self):
-                asserts.assert_true(False, MSG_EXPECTED_EXCEPTION)
+      def test_something(self):
+        asserts.assert_true(False, MSG_EXPECTED_EXCEPTION)
 
-        bt_cls = MockBaseTest(self.mock_test_cls_configs)
-        bt_cls.run()
-        actual_record = bt_cls.results.failed[0]
-        self.assertEqual(actual_record.test_name, 'test_something')
+    bt_cls = MockBaseTest(self.mock_test_cls_configs)
+    bt_cls.run()
+    actual_record = bt_cls.results.failed[0]
+    self.assertEqual(actual_record.test_name, 'test_something')
 
-    def test_on_fail_executed_if_both_test_and_teardown_test_fails(self):
-        on_fail_mock = mock.MagicMock()
+  def test_on_fail_executed_if_both_test_and_teardown_test_fails(self):
+    on_fail_mock = mock.MagicMock()
 
-        class MockBaseTest(base_test.BaseTestClass):
-            def on_fail(self, record):
-                on_fail_mock("on_fail")
+    class MockBaseTest(base_test.BaseTestClass):
+      def on_fail(self, record):
+        on_fail_mock("on_fail")
 
-            def on_pass(self, record):
-                never_call()
+      def on_pass(self, record):
+        never_call()
 
-            def teardown_test(self):
-                raise Exception(MSG_EXPECTED_EXCEPTION + 'ha')
+      def teardown_test(self):
+        raise Exception(MSG_EXPECTED_EXCEPTION + 'ha')
 
-            def test_something(self):
-                raise Exception(MSG_EXPECTED_EXCEPTION)
+      def test_something(self):
+        raise Exception(MSG_EXPECTED_EXCEPTION)
 
-        bt_cls = MockBaseTest(self.mock_test_cls_configs)
-        bt_cls.run()
-        on_fail_mock.assert_called_once_with("on_fail")
-        actual_record = bt_cls.results.error[0]
-        self.assertEqual(actual_record.test_name, self.mock_test_name)
-        self.assertEqual(actual_record.details, MSG_EXPECTED_EXCEPTION)
-        self.assertEqual(actual_record.extra_errors['teardown_test'].details,
-                         'This is an expected exception.ha')
-        self.assertIsNone(actual_record.extras)
-        expected_summary = ("Error 1, Executed 1, Failed 0, Passed 0, "
-                            "Requested 1, Skipped 0")
-        self.assertEqual(bt_cls.results.summary_str(), expected_summary)
+    bt_cls = MockBaseTest(self.mock_test_cls_configs)
+    bt_cls.run()
+    on_fail_mock.assert_called_once_with("on_fail")
+    actual_record = bt_cls.results.error[0]
+    self.assertEqual(actual_record.test_name, self.mock_test_name)
+    self.assertEqual(actual_record.details, MSG_EXPECTED_EXCEPTION)
+    self.assertEqual(actual_record.extra_errors['teardown_test'].details,
+             'This is an expected exception.ha')
+    self.assertIsNone(actual_record.extras)
+    expected_summary = ("Error 1, Executed 1, Failed 0, Passed 0, "
+              "Requested 1, Skipped 0")
+    self.assertEqual(bt_cls.results.summary_str(), expected_summary)
 
-    def test_on_fail_executed_if_setup_test_fails_by_exception(self):
-        my_mock = mock.MagicMock()
+  def test_on_fail_executed_if_setup_test_fails_by_exception(self):
+    my_mock = mock.MagicMock()
 
-        class MockBaseTest(base_test.BaseTestClass):
-            def setup_test(self):
-                raise Exception(MSG_EXPECTED_EXCEPTION)
+    class MockBaseTest(base_test.BaseTestClass):
+      def setup_test(self):
+        raise Exception(MSG_EXPECTED_EXCEPTION)
 
-            def on_fail(self, record):
-                my_mock("on_fail")
+      def on_fail(self, record):
+        my_mock("on_fail")
 
-            def test_something(self):
-                pass
+      def test_something(self):
+        pass
 
-        bt_cls = MockBaseTest(self.mock_test_cls_configs)
-        bt_cls.run()
-        my_mock.assert_called_once_with("on_fail")
-        actual_record = bt_cls.results.error[0]
-        self.assertEqual(actual_record.test_name, self.mock_test_name)
-        self.assertEqual(actual_record.details, MSG_EXPECTED_EXCEPTION)
-        self.assertIsNone(actual_record.extras)
-        expected_summary = ("Error 1, Executed 1, Failed 0, Passed 0, "
-                            "Requested 1, Skipped 0")
-        self.assertEqual(bt_cls.results.summary_str(), expected_summary)
+    bt_cls = MockBaseTest(self.mock_test_cls_configs)
+    bt_cls.run()
+    my_mock.assert_called_once_with("on_fail")
+    actual_record = bt_cls.results.error[0]
+    self.assertEqual(actual_record.test_name, self.mock_test_name)
+    self.assertEqual(actual_record.details, MSG_EXPECTED_EXCEPTION)
+    self.assertIsNone(actual_record.extras)
+    expected_summary = ("Error 1, Executed 1, Failed 0, Passed 0, "
+              "Requested 1, Skipped 0")
+    self.assertEqual(bt_cls.results.summary_str(), expected_summary)
 
-    def test_on_fail_executed_if_setup_class_fails_by_exception(self):
-        my_mock = mock.MagicMock()
+  def test_on_fail_executed_if_setup_class_fails_by_exception(self):
+    my_mock = mock.MagicMock()
 
-        class MockBaseTest(base_test.BaseTestClass):
-            def setup_class(self):
-                raise Exception(MSG_EXPECTED_EXCEPTION)
+    class MockBaseTest(base_test.BaseTestClass):
+      def setup_class(self):
+        raise Exception(MSG_EXPECTED_EXCEPTION)
 
-            def on_fail(self, record):
-                my_mock("on_fail")
+      def on_fail(self, record):
+        my_mock("on_fail")
 
-            def test_something(self):
-                pass
+      def test_something(self):
+        pass
 
-        bt_cls = MockBaseTest(self.mock_test_cls_configs)
-        bt_cls.run()
-        my_mock.assert_called_once_with("on_fail")
-        actual_record = bt_cls.results.error[0]
-        self.assertEqual(actual_record.test_name, 'setup_class')
-        self.assertEqual(actual_record.details, MSG_EXPECTED_EXCEPTION)
-        self.assertIsNone(actual_record.extras)
-        expected_summary = ("Error 1, Executed 0, Failed 0, Passed 0, "
-                            "Requested 1, Skipped 1")
-        self.assertEqual(bt_cls.results.summary_str(), expected_summary)
+    bt_cls = MockBaseTest(self.mock_test_cls_configs)
+    bt_cls.run()
+    my_mock.assert_called_once_with("on_fail")
+    actual_record = bt_cls.results.error[0]
+    self.assertEqual(actual_record.test_name, 'setup_class')
+    self.assertEqual(actual_record.details, MSG_EXPECTED_EXCEPTION)
+    self.assertIsNone(actual_record.extras)
+    expected_summary = ("Error 1, Executed 0, Failed 0, Passed 0, "
+              "Requested 1, Skipped 1")
+    self.assertEqual(bt_cls.results.summary_str(), expected_summary)
 
-    def test_on_fail_triggered_by_setup_class_failure_then_fail_too(self):
-        """Errors thrown from on_fail should be captured."""
+  def test_on_fail_triggered_by_setup_class_failure_then_fail_too(self):
+    """Errors thrown from on_fail should be captured."""
 
-        class MockBaseTest(base_test.BaseTestClass):
-            def setup_class(self):
-                raise Exception(MSG_EXPECTED_EXCEPTION)
+    class MockBaseTest(base_test.BaseTestClass):
+      def setup_class(self):
+        raise Exception(MSG_EXPECTED_EXCEPTION)
 
-            def on_fail(self, record):
-                raise Exception('Failure in on_fail.')
+      def on_fail(self, record):
+        raise Exception('Failure in on_fail.')
 
-            def test_something(self):
-                pass
+      def test_something(self):
+        pass
 
-        bt_cls = MockBaseTest(self.mock_test_cls_configs)
-        bt_cls.run()
-        setup_class_record = bt_cls.results.error[0]
-        self.assertEqual(setup_class_record.test_name, 'setup_class')
-        self.assertEqual(setup_class_record.details, MSG_EXPECTED_EXCEPTION)
-        self.assertEqual(setup_class_record.extra_errors['on_fail'].details,
-                         'Failure in on_fail.')
-        expected_summary = ("Error 1, Executed 0, Failed 0, Passed 0, "
-                            "Requested 1, Skipped 1")
-        self.assertEqual(bt_cls.results.summary_str(), expected_summary)
+    bt_cls = MockBaseTest(self.mock_test_cls_configs)
+    bt_cls.run()
+    setup_class_record = bt_cls.results.error[0]
+    self.assertEqual(setup_class_record.test_name, 'setup_class')
+    self.assertEqual(setup_class_record.details, MSG_EXPECTED_EXCEPTION)
+    self.assertEqual(setup_class_record.extra_errors['on_fail'].details,
+             'Failure in on_fail.')
+    expected_summary = ("Error 1, Executed 0, Failed 0, Passed 0, "
+              "Requested 1, Skipped 1")
+    self.assertEqual(bt_cls.results.summary_str(), expected_summary)
 
-    def test_failure_to_call_procedure_function_is_recorded(self):
-        class MockBaseTest(base_test.BaseTestClass):
-            def on_fail(self):
-                pass
+  def test_failure_to_call_procedure_function_is_recorded(self):
+    class MockBaseTest(base_test.BaseTestClass):
+      def on_fail(self):
+        pass
 
-            def test_something(self):
-                asserts.assert_true(False, MSG_EXPECTED_EXCEPTION)
+      def test_something(self):
+        asserts.assert_true(False, MSG_EXPECTED_EXCEPTION)
 
-        bt_cls = MockBaseTest(self.mock_test_cls_configs)
-        bt_cls.run()
-        actual_record = bt_cls.results.failed[0]
-        self.assertIn('on_fail', actual_record.extra_errors)
-        self.assertEqual(actual_record.test_name, self.mock_test_name)
-        self.assertEqual(actual_record.details, MSG_EXPECTED_EXCEPTION)
-        self.assertIsNone(actual_record.extras)
-        expected_summary = ("Error 0, Executed 1, Failed 1, Passed 0, "
-                            "Requested 1, Skipped 0")
-        self.assertEqual(bt_cls.results.summary_str(), expected_summary)
+    bt_cls = MockBaseTest(self.mock_test_cls_configs)
+    bt_cls.run()
+    actual_record = bt_cls.results.failed[0]
+    self.assertIn('on_fail', actual_record.extra_errors)
+    self.assertEqual(actual_record.test_name, self.mock_test_name)
+    self.assertEqual(actual_record.details, MSG_EXPECTED_EXCEPTION)
+    self.assertIsNone(actual_record.extras)
+    expected_summary = ("Error 0, Executed 1, Failed 1, Passed 0, "
+              "Requested 1, Skipped 0")
+    self.assertEqual(bt_cls.results.summary_str(), expected_summary)
 
-    def test_failure_in_procedure_functions_is_recorded(self):
-        expected_msg = "Something failed in on_pass."
+  def test_failure_in_procedure_functions_is_recorded(self):
+    expected_msg = "Something failed in on_pass."
 
-        class MockBaseTest(base_test.BaseTestClass):
-            def on_pass(self, record):
-                raise Exception(expected_msg)
+    class MockBaseTest(base_test.BaseTestClass):
+      def on_pass(self, record):
+        raise Exception(expected_msg)
 
-            def test_something(self):
-                asserts.explicit_pass(MSG_EXPECTED_EXCEPTION)
+      def test_something(self):
+        asserts.explicit_pass(MSG_EXPECTED_EXCEPTION)
 
-        bt_cls = MockBaseTest(self.mock_test_cls_configs)
-        bt_cls.run()
-        actual_record = bt_cls.results.error[0]
-        self.assertEqual(actual_record.extra_errors['on_pass'].details,
-                         expected_msg)
-        self.assertEqual(actual_record.test_name, self.mock_test_name)
-        self.assertEqual(actual_record.details, MSG_EXPECTED_EXCEPTION)
-        self.assertIsNone(actual_record.extras)
-        expected_summary = ("Error 1, Executed 1, Failed 0, Passed 0, "
-                            "Requested 1, Skipped 0")
-        self.assertEqual(bt_cls.results.summary_str(), expected_summary)
+    bt_cls = MockBaseTest(self.mock_test_cls_configs)
+    bt_cls.run()
+    actual_record = bt_cls.results.error[0]
+    self.assertEqual(actual_record.extra_errors['on_pass'].details,
+             expected_msg)
+    self.assertEqual(actual_record.test_name, self.mock_test_name)
+    self.assertEqual(actual_record.details, MSG_EXPECTED_EXCEPTION)
+    self.assertIsNone(actual_record.extras)
+    expected_summary = ("Error 1, Executed 1, Failed 0, Passed 0, "
+              "Requested 1, Skipped 0")
+    self.assertEqual(bt_cls.results.summary_str(), expected_summary)
 
-    def test_both_teardown_and_test_body_raise_exceptions(self):
-        class MockBaseTest(base_test.BaseTestClass):
-            def teardown_test(self):
-                asserts.assert_true(False, MSG_EXPECTED_EXCEPTION)
+  def test_both_teardown_and_test_body_raise_exceptions(self):
+    class MockBaseTest(base_test.BaseTestClass):
+      def teardown_test(self):
+        asserts.assert_true(False, MSG_EXPECTED_EXCEPTION)
 
-            def test_something(self):
-                raise Exception("Test Body Exception.")
+      def test_something(self):
+        raise Exception("Test Body Exception.")
 
-        bt_cls = MockBaseTest(self.mock_test_cls_configs)
-        bt_cls.run()
-        actual_record = bt_cls.results.error[0]
-        self.assertEqual(actual_record.test_name, self.mock_test_name)
-        self.assertEqual(actual_record.details, "Test Body Exception.")
-        self.assertIsNone(actual_record.extras)
-        self.assertEqual(actual_record.extra_errors['teardown_test'].details,
-                         MSG_EXPECTED_EXCEPTION)
-        self.assertIsNone(actual_record.extra_errors['teardown_test'].extras)
-        expected_summary = ("Error 1, Executed 1, Failed 0, Passed 0, "
-                            "Requested 1, Skipped 0")
-        self.assertEqual(bt_cls.results.summary_str(), expected_summary)
+    bt_cls = MockBaseTest(self.mock_test_cls_configs)
+    bt_cls.run()
+    actual_record = bt_cls.results.error[0]
+    self.assertEqual(actual_record.test_name, self.mock_test_name)
+    self.assertEqual(actual_record.details, "Test Body Exception.")
+    self.assertIsNone(actual_record.extras)
+    self.assertEqual(actual_record.extra_errors['teardown_test'].details,
+             MSG_EXPECTED_EXCEPTION)
+    self.assertIsNone(actual_record.extra_errors['teardown_test'].extras)
+    expected_summary = ("Error 1, Executed 1, Failed 0, Passed 0, "
+              "Requested 1, Skipped 0")
+    self.assertEqual(bt_cls.results.summary_str(), expected_summary)
 
-    def test_exception_objects_in_record(self):
-        """Checks that the exception objects are correctly tallied.
-        """
-        expected_termination_signal = Exception('Test Body Exception.')
-        expected_extra_error = Exception('teardown_test Exception.')
+  def test_exception_objects_in_record(self):
+    """Checks that the exception objects are correctly tallied.
+    """
+    expected_termination_signal = Exception('Test Body Exception.')
+    expected_extra_error = Exception('teardown_test Exception.')
 
-        class MockBaseTest(base_test.BaseTestClass):
-            def teardown_test(self):
-                raise expected_extra_error
+    class MockBaseTest(base_test.BaseTestClass):
+      def teardown_test(self):
+        raise expected_extra_error
 
-            def test_something(self):
-                raise expected_termination_signal
+      def test_something(self):
+        raise expected_termination_signal
 
-        bt_cls = MockBaseTest(self.mock_test_cls_configs)
-        bt_cls.run()
-        actual_record = bt_cls.results.error[0]
-        self.assertIs(actual_record.termination_signal.exception,
-                      expected_termination_signal)
-        self.assertIsNotNone(actual_record.termination_signal.stacktrace)
-        self.assertEqual(len(actual_record.extra_errors), 1)
-        extra_error = actual_record.extra_errors['teardown_test']
-        self.assertIs(extra_error.exception, expected_extra_error)
-        self.assertIsNotNone(extra_error.stacktrace)
-        self.assertIsNone(actual_record.extras)
+    bt_cls = MockBaseTest(self.mock_test_cls_configs)
+    bt_cls.run()
+    actual_record = bt_cls.results.error[0]
+    self.assertIs(actual_record.termination_signal.exception,
+            expected_termination_signal)
+    self.assertIsNotNone(actual_record.termination_signal.stacktrace)
+    self.assertEqual(len(actual_record.extra_errors), 1)
+    extra_error = actual_record.extra_errors['teardown_test']
+    self.assertIs(extra_error.exception, expected_extra_error)
+    self.assertIsNotNone(extra_error.stacktrace)
+    self.assertIsNone(actual_record.extras)
 
-    def test_promote_extra_errors_to_termination_signal(self):
-        """If no termination signal is specified, use the first extra error as
-        the termination signal.
-        """
-        expected_extra_error = Exception('teardown_test Exception.')
+  def test_promote_extra_errors_to_termination_signal(self):
+    """If no termination signal is specified, use the first extra error as
+    the termination signal.
+    """
+    expected_extra_error = Exception('teardown_test Exception.')
 
-        class MockBaseTest(base_test.BaseTestClass):
-            def teardown_test(self):
-                raise expected_extra_error
+    class MockBaseTest(base_test.BaseTestClass):
+      def teardown_test(self):
+        raise expected_extra_error
 
-            def test_something(self):
-                pass
+      def test_something(self):
+        pass
 
-        bt_cls = MockBaseTest(self.mock_test_cls_configs)
-        bt_cls.run()
-        actual_record = bt_cls.results.error[0]
-        self.assertFalse(actual_record.extra_errors)
-        self.assertEqual(actual_record.details, 'teardown_test Exception.')
-        self.assertIsNotNone(actual_record.stacktrace)
+    bt_cls = MockBaseTest(self.mock_test_cls_configs)
+    bt_cls.run()
+    actual_record = bt_cls.results.error[0]
+    self.assertFalse(actual_record.extra_errors)
+    self.assertEqual(actual_record.details, 'teardown_test Exception.')
+    self.assertIsNotNone(actual_record.stacktrace)
 
-    def test_explicit_pass_but_teardown_test_raises_an_exception(self):
-        """Test record result should be marked as ERROR as opposed to PASS.
-        """
+  def test_explicit_pass_but_teardown_test_raises_an_exception(self):
+    """Test record result should be marked as ERROR as opposed to PASS.
+    """
 
-        class MockBaseTest(base_test.BaseTestClass):
-            def teardown_test(self):
-                asserts.assert_true(False, MSG_EXPECTED_EXCEPTION)
+    class MockBaseTest(base_test.BaseTestClass):
+      def teardown_test(self):
+        asserts.assert_true(False, MSG_EXPECTED_EXCEPTION)
 
-            def test_something(self):
-                asserts.explicit_pass('Test Passed!')
+      def test_something(self):
+        asserts.explicit_pass('Test Passed!')
 
-        bt_cls = MockBaseTest(self.mock_test_cls_configs)
-        bt_cls.run()
-        actual_record = bt_cls.results.error[0]
-        self.assertEqual(actual_record.test_name, self.mock_test_name)
-        self.assertEqual(actual_record.details, 'Test Passed!')
-        self.assertIsNone(actual_record.extras)
-        self.assertEqual(actual_record.extra_errors['teardown_test'].details,
-                         MSG_EXPECTED_EXCEPTION)
-        self.assertIsNone(actual_record.extra_errors['teardown_test'].extras)
-        expected_summary = ("Error 1, Executed 1, Failed 0, Passed 0, "
-                            "Requested 1, Skipped 0")
-        self.assertEqual(bt_cls.results.summary_str(), expected_summary)
+    bt_cls = MockBaseTest(self.mock_test_cls_configs)
+    bt_cls.run()
+    actual_record = bt_cls.results.error[0]
+    self.assertEqual(actual_record.test_name, self.mock_test_name)
+    self.assertEqual(actual_record.details, 'Test Passed!')
+    self.assertIsNone(actual_record.extras)
+    self.assertEqual(actual_record.extra_errors['teardown_test'].details,
+             MSG_EXPECTED_EXCEPTION)
+    self.assertIsNone(actual_record.extra_errors['teardown_test'].extras)
+    expected_summary = ("Error 1, Executed 1, Failed 0, Passed 0, "
+              "Requested 1, Skipped 0")
+    self.assertEqual(bt_cls.results.summary_str(), expected_summary)
 
-    def test_on_pass_cannot_modify_original_record(self):
-        class MockBaseTest(base_test.BaseTestClass):
-            def on_pass(self, record):
-                record.test_name = 'blah'
+  def test_on_pass_cannot_modify_original_record(self):
+    class MockBaseTest(base_test.BaseTestClass):
+      def on_pass(self, record):
+        record.test_name = 'blah'
 
-            def test_something(self):
-                asserts.explicit_pass('Extra pass!')
+      def test_something(self):
+        asserts.explicit_pass('Extra pass!')
 
-        bt_cls = MockBaseTest(self.mock_test_cls_configs)
-        bt_cls.run()
-        actual_record = bt_cls.results.passed[0]
-        self.assertEqual(actual_record.test_name, 'test_something')
+    bt_cls = MockBaseTest(self.mock_test_cls_configs)
+    bt_cls.run()
+    actual_record = bt_cls.results.passed[0]
+    self.assertEqual(actual_record.test_name, 'test_something')
 
-    def test_on_pass_raise_exception(self):
-        class MockBaseTest(base_test.BaseTestClass):
-            def on_pass(self, record):
-                raise Exception(MSG_EXPECTED_EXCEPTION)
+  def test_on_pass_raise_exception(self):
+    class MockBaseTest(base_test.BaseTestClass):
+      def on_pass(self, record):
+        raise Exception(MSG_EXPECTED_EXCEPTION)
 
-            def test_something(self):
-                asserts.explicit_pass(MSG_EXPECTED_EXCEPTION,
-                                      extras=MOCK_EXTRA)
+      def test_something(self):
+        asserts.explicit_pass(MSG_EXPECTED_EXCEPTION,
+                    extras=MOCK_EXTRA)
 
-        bt_cls = MockBaseTest(self.mock_test_cls_configs)
-        bt_cls.run()
-        actual_record = bt_cls.results.error[0]
-        self.assertEqual(actual_record.test_name, self.mock_test_name)
-        self.assertEqual(actual_record.details, MSG_EXPECTED_EXCEPTION)
-        self.assertEqual(actual_record.extras, MOCK_EXTRA)
-        self.assertEqual(actual_record.extra_errors['on_pass'].details,
-                         MSG_EXPECTED_EXCEPTION)
-        expected_summary = ("Error 1, Executed 1, Failed 0, Passed 0, "
-                            "Requested 1, Skipped 0")
-        self.assertEqual(bt_cls.results.summary_str(), expected_summary)
+    bt_cls = MockBaseTest(self.mock_test_cls_configs)
+    bt_cls.run()
+    actual_record = bt_cls.results.error[0]
+    self.assertEqual(actual_record.test_name, self.mock_test_name)
+    self.assertEqual(actual_record.details, MSG_EXPECTED_EXCEPTION)
+    self.assertEqual(actual_record.extras, MOCK_EXTRA)
+    self.assertEqual(actual_record.extra_errors['on_pass'].details,
+             MSG_EXPECTED_EXCEPTION)
+    expected_summary = ("Error 1, Executed 1, Failed 0, Passed 0, "
+              "Requested 1, Skipped 0")
+    self.assertEqual(bt_cls.results.summary_str(), expected_summary)
 
-    def test_on_fail_raise_exception(self):
-        class MockBaseTest(base_test.BaseTestClass):
-            def on_fail(self, record):
-                raise Exception(MSG_EXPECTED_EXCEPTION)
+  def test_on_fail_raise_exception(self):
+    class MockBaseTest(base_test.BaseTestClass):
+      def on_fail(self, record):
+        raise Exception(MSG_EXPECTED_EXCEPTION)
 
-            def test_something(self):
-                asserts.fail(MSG_EXPECTED_EXCEPTION, extras=MOCK_EXTRA)
+      def test_something(self):
+        asserts.fail(MSG_EXPECTED_EXCEPTION, extras=MOCK_EXTRA)
 
-        bt_cls = MockBaseTest(self.mock_test_cls_configs)
-        bt_cls.run()
-        actual_record = bt_cls.results.failed[0]
-        self.assertEqual(actual_record.test_name, self.mock_test_name)
-        self.assertEqual(actual_record.details, MSG_EXPECTED_EXCEPTION)
-        self.assertEqual(actual_record.extras, MOCK_EXTRA)
-        self.assertEqual(actual_record.extra_errors['on_fail'].details,
-                         MSG_EXPECTED_EXCEPTION)
-        expected_summary = ("Error 0, Executed 1, Failed 1, Passed 0, "
-                            "Requested 1, Skipped 0")
-        self.assertEqual(bt_cls.results.summary_str(), expected_summary)
+    bt_cls = MockBaseTest(self.mock_test_cls_configs)
+    bt_cls.run()
+    actual_record = bt_cls.results.failed[0]
+    self.assertEqual(actual_record.test_name, self.mock_test_name)
+    self.assertEqual(actual_record.details, MSG_EXPECTED_EXCEPTION)
+    self.assertEqual(actual_record.extras, MOCK_EXTRA)
+    self.assertEqual(actual_record.extra_errors['on_fail'].details,
+             MSG_EXPECTED_EXCEPTION)
+    expected_summary = ("Error 0, Executed 1, Failed 1, Passed 0, "
+              "Requested 1, Skipped 0")
+    self.assertEqual(bt_cls.results.summary_str(), expected_summary)
 
-    def test_abort_class_setup_class(self):
-        """A class was intentionally aborted by the test.
+  def test_abort_class_setup_class(self):
+    """A class was intentionally aborted by the test.
 
-        This is not considered an error as the abort class is used as a skip
-        signal for the entire class, which is different from raising other
-        exceptions in `setup_class`.
-        """
+    This is not considered an error as the abort class is used as a skip
+    signal for the entire class, which is different from raising other
+    exceptions in `setup_class`.
+    """
 
-        class MockBaseTest(base_test.BaseTestClass):
-            def setup_class(self):
-                asserts.abort_class(MSG_EXPECTED_EXCEPTION)
+    class MockBaseTest(base_test.BaseTestClass):
+      def setup_class(self):
+        asserts.abort_class(MSG_EXPECTED_EXCEPTION)
 
-            def test_1(self):
-                never_call()
+      def test_1(self):
+        never_call()
 
-            def test_2(self):
-                never_call()
+      def test_2(self):
+        never_call()
 
-            def test_3(self):
-                never_call()
+      def test_3(self):
+        never_call()
 
-        bt_cls = MockBaseTest(self.mock_test_cls_configs)
-        bt_cls.run(test_names=["test_1", "test_2", "test_3"])
-        self.assertEqual(len(bt_cls.results.skipped), 3)
-        self.assertEqual(bt_cls.results.summary_str(),
-                         ("Error 0, Executed 0, Failed 0, Passed 0, "
-                          "Requested 3, Skipped 3"))
+    bt_cls = MockBaseTest(self.mock_test_cls_configs)
+    bt_cls.run(test_names=["test_1", "test_2", "test_3"])
+    self.assertEqual(len(bt_cls.results.skipped), 3)
+    self.assertEqual(bt_cls.results.summary_str(),
+             ("Error 0, Executed 0, Failed 0, Passed 0, "
+              "Requested 3, Skipped 3"))
 
-    def test_abort_class_in_setup_test(self):
-        class MockBaseTest(base_test.BaseTestClass):
-            def setup_test(self):
-                asserts.abort_class(MSG_EXPECTED_EXCEPTION)
+  def test_abort_class_in_setup_test(self):
+    class MockBaseTest(base_test.BaseTestClass):
+      def setup_test(self):
+        asserts.abort_class(MSG_EXPECTED_EXCEPTION)
 
-            def test_1(self):
-                never_call()
+      def test_1(self):
+        never_call()
 
-            def test_2(self):
-                never_call()
+      def test_2(self):
+        never_call()
 
-            def test_3(self):
-                never_call()
+      def test_3(self):
+        never_call()
 
-        bt_cls = MockBaseTest(self.mock_test_cls_configs)
-        bt_cls.run(test_names=["test_1", "test_2", "test_3"])
-        self.assertEqual(len(bt_cls.results.skipped), 2)
-        self.assertEqual(bt_cls.results.summary_str(),
-                         ("Error 0, Executed 1, Failed 1, Passed 0, "
-                          "Requested 3, Skipped 2"))
+    bt_cls = MockBaseTest(self.mock_test_cls_configs)
+    bt_cls.run(test_names=["test_1", "test_2", "test_3"])
+    self.assertEqual(len(bt_cls.results.skipped), 2)
+    self.assertEqual(bt_cls.results.summary_str(),
+             ("Error 0, Executed 1, Failed 1, Passed 0, "
+              "Requested 3, Skipped 2"))
 
-    def test_abort_class_in_on_fail(self):
-        class MockBaseTest(base_test.BaseTestClass):
-            def test_1(self):
-                asserts.fail(MSG_EXPECTED_EXCEPTION)
+  def test_abort_class_in_on_fail(self):
+    class MockBaseTest(base_test.BaseTestClass):
+      def test_1(self):
+        asserts.fail(MSG_EXPECTED_EXCEPTION)
 
-            def test_2(self):
-                never_call()
+      def test_2(self):
+        never_call()
 
-            def test_3(self):
-                never_call()
+      def test_3(self):
+        never_call()
 
-            def on_fail(self, record):
-                asserts.abort_class(MSG_EXPECTED_EXCEPTION)
+      def on_fail(self, record):
+        asserts.abort_class(MSG_EXPECTED_EXCEPTION)
 
-        bt_cls = MockBaseTest(self.mock_test_cls_configs)
-        bt_cls.run(test_names=["test_1", "test_2", "test_3"])
-        self.assertEqual(len(bt_cls.results.skipped), 2)
-        self.assertEqual(bt_cls.results.summary_str(),
-                         ("Error 0, Executed 1, Failed 1, Passed 0, "
-                          "Requested 3, Skipped 2"))
+    bt_cls = MockBaseTest(self.mock_test_cls_configs)
+    bt_cls.run(test_names=["test_1", "test_2", "test_3"])
+    self.assertEqual(len(bt_cls.results.skipped), 2)
+    self.assertEqual(bt_cls.results.summary_str(),
+             ("Error 0, Executed 1, Failed 1, Passed 0, "
+              "Requested 3, Skipped 2"))
 
-    def test_setup_and_teardown_execution_count(self):
-        class MockBaseTest(base_test.BaseTestClass):
-            def test_func(self):
-                pass
+  def test_setup_and_teardown_execution_count(self):
+    class MockBaseTest(base_test.BaseTestClass):
+      def test_func(self):
+        pass
 
-            def test_func2(self):
-                pass
+      def test_func2(self):
+        pass
 
-        bt_cls = MockBaseTest(self.mock_test_cls_configs)
-        bt_cls.setup_class = mock.Mock()
-        bt_cls.teardown_class = mock.Mock()
-        bt_cls.setup_test = mock.Mock()
-        bt_cls.teardown_test = mock.Mock()
-        bt_cls.run()
-        self.assertEqual(bt_cls.setup_class.call_count, 1)
-        self.assertEqual(bt_cls.teardown_class.call_count, 1)
-        self.assertEqual(bt_cls.setup_test.call_count, 2)
-        self.assertEqual(bt_cls.teardown_test.call_count, 2)
+    bt_cls = MockBaseTest(self.mock_test_cls_configs)
+    bt_cls.setup_class = mock.Mock()
+    bt_cls.teardown_class = mock.Mock()
+    bt_cls.setup_test = mock.Mock()
+    bt_cls.teardown_test = mock.Mock()
+    bt_cls.run()
+    self.assertEqual(bt_cls.setup_class.call_count, 1)
+    self.assertEqual(bt_cls.teardown_class.call_count, 1)
+    self.assertEqual(bt_cls.setup_test.call_count, 2)
+    self.assertEqual(bt_cls.teardown_test.call_count, 2)
 
-    def test_abort_class_in_test(self):
-        class MockBaseTest(base_test.BaseTestClass):
-            def test_1(self):
-                pass
+  def test_abort_class_in_test(self):
+    class MockBaseTest(base_test.BaseTestClass):
+      def test_1(self):
+        pass
 
-            def test_2(self):
-                asserts.abort_class(MSG_EXPECTED_EXCEPTION)
-                never_call()
+      def test_2(self):
+        asserts.abort_class(MSG_EXPECTED_EXCEPTION)
+        never_call()
 
-            def test_3(self):
-                never_call()
+      def test_3(self):
+        never_call()
 
-        bt_cls = MockBaseTest(self.mock_test_cls_configs)
-        bt_cls.run(test_names=["test_1", "test_2", "test_3"])
-        self.assertEqual(bt_cls.results.passed[0].test_name, "test_1")
-        self.assertEqual(bt_cls.results.failed[0].details,
-                         MSG_EXPECTED_EXCEPTION)
-        self.assertEqual(bt_cls.results.summary_str(),
-                         ("Error 0, Executed 2, Failed 1, Passed 1, "
-                          "Requested 3, Skipped 1"))
+    bt_cls = MockBaseTest(self.mock_test_cls_configs)
+    bt_cls.run(test_names=["test_1", "test_2", "test_3"])
+    self.assertEqual(bt_cls.results.passed[0].test_name, "test_1")
+    self.assertEqual(bt_cls.results.failed[0].details,
+             MSG_EXPECTED_EXCEPTION)
+    self.assertEqual(bt_cls.results.summary_str(),
+             ("Error 0, Executed 2, Failed 1, Passed 1, "
+              "Requested 3, Skipped 1"))
 
-    def test_abort_all_in_setup_class(self):
-        class MockBaseTest(base_test.BaseTestClass):
-            def setup_class(self):
-                asserts.abort_all(MSG_EXPECTED_EXCEPTION)
+  def test_abort_all_in_setup_class(self):
+    class MockBaseTest(base_test.BaseTestClass):
+      def setup_class(self):
+        asserts.abort_all(MSG_EXPECTED_EXCEPTION)
 
-            def test_1(self):
-                never_call()
+      def test_1(self):
+        never_call()
 
-            def test_2(self):
-                never_call()
+      def test_2(self):
+        never_call()
 
-            def test_3(self):
-                never_call()
+      def test_3(self):
+        never_call()
 
-        bt_cls = MockBaseTest(self.mock_test_cls_configs)
-        with self.assertRaisesRegex(signals.TestAbortAll,
-                                    MSG_EXPECTED_EXCEPTION) as context:
-            bt_cls.run(test_names=["test_1", "test_2", "test_3"])
-        self.assertTrue(hasattr(context.exception, 'results'))
-        self.assertEqual(bt_cls.results.summary_str(),
-                         ("Error 0, Executed 0, Failed 0, Passed 0, "
-                          "Requested 3, Skipped 3"))
+    bt_cls = MockBaseTest(self.mock_test_cls_configs)
+    with self.assertRaisesRegex(signals.TestAbortAll,
+                  MSG_EXPECTED_EXCEPTION) as context:
+      bt_cls.run(test_names=["test_1", "test_2", "test_3"])
+    self.assertTrue(hasattr(context.exception, 'results'))
+    self.assertEqual(bt_cls.results.summary_str(),
+             ("Error 0, Executed 0, Failed 0, Passed 0, "
+              "Requested 3, Skipped 3"))
 
-    def test_abort_all_in_teardown_class(self):
-        class MockBaseTest(base_test.BaseTestClass):
-            def test_1(self):
-                pass
+  def test_abort_all_in_teardown_class(self):
+    class MockBaseTest(base_test.BaseTestClass):
+      def test_1(self):
+        pass
 
-            def test_2(self):
-                pass
+      def test_2(self):
+        pass
 
-            def teardown_class(self):
-                asserts.abort_all(MSG_EXPECTED_EXCEPTION)
+      def teardown_class(self):
+        asserts.abort_all(MSG_EXPECTED_EXCEPTION)
 
-        bt_cls = MockBaseTest(self.mock_test_cls_configs)
-        with self.assertRaisesRegex(signals.TestAbortAll,
-                                    MSG_EXPECTED_EXCEPTION) as context:
-            bt_cls.run(test_names=["test_1", "test_2"])
-        self.assertTrue(hasattr(context.exception, 'results'))
-        self.assertEqual(bt_cls.results.summary_str(),
-                         ("Error 0, Executed 2, Failed 0, Passed 2, "
-                          "Requested 2, Skipped 0"))
+    bt_cls = MockBaseTest(self.mock_test_cls_configs)
+    with self.assertRaisesRegex(signals.TestAbortAll,
+                  MSG_EXPECTED_EXCEPTION) as context:
+      bt_cls.run(test_names=["test_1", "test_2"])
+    self.assertTrue(hasattr(context.exception, 'results'))
+    self.assertEqual(bt_cls.results.summary_str(),
+             ("Error 0, Executed 2, Failed 0, Passed 2, "
+              "Requested 2, Skipped 0"))
 
-    def test_abort_all_in_setup_test(self):
-        class MockBaseTest(base_test.BaseTestClass):
-            def setup_test(self):
-                asserts.abort_all(MSG_EXPECTED_EXCEPTION)
+  def test_abort_all_in_setup_test(self):
+    class MockBaseTest(base_test.BaseTestClass):
+      def setup_test(self):
+        asserts.abort_all(MSG_EXPECTED_EXCEPTION)
 
-            def test_1(self):
-                never_call()
+      def test_1(self):
+        never_call()
 
-            def test_2(self):
-                never_call()
+      def test_2(self):
+        never_call()
 
-            def test_3(self):
-                never_call()
+      def test_3(self):
+        never_call()
 
-        bt_cls = MockBaseTest(self.mock_test_cls_configs)
-        with self.assertRaisesRegex(signals.TestAbortAll,
-                                    MSG_EXPECTED_EXCEPTION) as context:
-            bt_cls.run(test_names=["test_1", "test_2", "test_3"])
-        self.assertTrue(hasattr(context.exception, 'results'))
-        self.assertEqual(bt_cls.results.summary_str(),
-                         ("Error 0, Executed 1, Failed 1, Passed 0, "
-                          "Requested 3, Skipped 2"))
+    bt_cls = MockBaseTest(self.mock_test_cls_configs)
+    with self.assertRaisesRegex(signals.TestAbortAll,
+                  MSG_EXPECTED_EXCEPTION) as context:
+      bt_cls.run(test_names=["test_1", "test_2", "test_3"])
+    self.assertTrue(hasattr(context.exception, 'results'))
+    self.assertEqual(bt_cls.results.summary_str(),
+             ("Error 0, Executed 1, Failed 1, Passed 0, "
+              "Requested 3, Skipped 2"))
 
-    def test_abort_all_in_on_fail(self):
-        class MockBaseTest(base_test.BaseTestClass):
-            def test_1(self):
-                asserts.fail(MSG_EXPECTED_EXCEPTION)
+  def test_abort_all_in_on_fail(self):
+    class MockBaseTest(base_test.BaseTestClass):
+      def test_1(self):
+        asserts.fail(MSG_EXPECTED_EXCEPTION)
 
-            def test_2(self):
-                never_call()
+      def test_2(self):
+        never_call()
 
-            def test_3(self):
-                never_call()
+      def test_3(self):
+        never_call()
 
-            def on_fail(self, record):
-                asserts.abort_all(MSG_EXPECTED_EXCEPTION)
+      def on_fail(self, record):
+        asserts.abort_all(MSG_EXPECTED_EXCEPTION)
 
-        bt_cls = MockBaseTest(self.mock_test_cls_configs)
-        with self.assertRaisesRegex(signals.TestAbortAll,
-                                    MSG_EXPECTED_EXCEPTION) as context:
-            bt_cls.run(test_names=["test_1", "test_2", "test_3"])
-        self.assertTrue(hasattr(context.exception, 'results'))
-        self.assertEqual(bt_cls.results.summary_str(),
-                         ("Error 0, Executed 1, Failed 1, Passed 0, "
-                          "Requested 3, Skipped 2"))
+    bt_cls = MockBaseTest(self.mock_test_cls_configs)
+    with self.assertRaisesRegex(signals.TestAbortAll,
+                  MSG_EXPECTED_EXCEPTION) as context:
+      bt_cls.run(test_names=["test_1", "test_2", "test_3"])
+    self.assertTrue(hasattr(context.exception, 'results'))
+    self.assertEqual(bt_cls.results.summary_str(),
+             ("Error 0, Executed 1, Failed 1, Passed 0, "
+              "Requested 3, Skipped 2"))
 
-    def test_abort_all_in_on_fail_from_setup_class(self):
-        class MockBaseTest(base_test.BaseTestClass):
-            def setup_class(self):
-                asserts.fail(MSG_UNEXPECTED_EXCEPTION)
+  def test_abort_all_in_on_fail_from_setup_class(self):
+    class MockBaseTest(base_test.BaseTestClass):
+      def setup_class(self):
+        asserts.fail(MSG_UNEXPECTED_EXCEPTION)
 
-            def test_1(self):
-                never_call()
+      def test_1(self):
+        never_call()
 
-            def test_2(self):
-                never_call()
+      def test_2(self):
+        never_call()
 
-            def test_3(self):
-                never_call()
+      def test_3(self):
+        never_call()
 
-            def on_fail(self, record):
-                asserts.abort_all(MSG_EXPECTED_EXCEPTION)
+      def on_fail(self, record):
+        asserts.abort_all(MSG_EXPECTED_EXCEPTION)
 
-        bt_cls = MockBaseTest(self.mock_test_cls_configs)
-        with self.assertRaisesRegex(signals.TestAbortAll,
-                                    MSG_EXPECTED_EXCEPTION) as context:
-            bt_cls.run(test_names=["test_1", "test_2", "test_3"])
-        setup_class_record = bt_cls.results.error[0]
-        self.assertEqual(setup_class_record.test_name, 'setup_class')
-        self.assertTrue(hasattr(context.exception, 'results'))
-        self.assertEqual(bt_cls.results.summary_str(),
-                         ("Error 1, Executed 0, Failed 0, Passed 0, "
-                          "Requested 3, Skipped 3"))
+    bt_cls = MockBaseTest(self.mock_test_cls_configs)
+    with self.assertRaisesRegex(signals.TestAbortAll,
+                  MSG_EXPECTED_EXCEPTION) as context:
+      bt_cls.run(test_names=["test_1", "test_2", "test_3"])
+    setup_class_record = bt_cls.results.error[0]
+    self.assertEqual(setup_class_record.test_name, 'setup_class')
+    self.assertTrue(hasattr(context.exception, 'results'))
+    self.assertEqual(bt_cls.results.summary_str(),
+             ("Error 1, Executed 0, Failed 0, Passed 0, "
+              "Requested 3, Skipped 3"))
 
-    def test_abort_all_in_test(self):
-        class MockBaseTest(base_test.BaseTestClass):
-            def test_1(self):
-                pass
+  def test_abort_all_in_test(self):
+    class MockBaseTest(base_test.BaseTestClass):
+      def test_1(self):
+        pass
 
-            def test_2(self):
-                asserts.abort_all(MSG_EXPECTED_EXCEPTION)
-                never_call()
+      def test_2(self):
+        asserts.abort_all(MSG_EXPECTED_EXCEPTION)
+        never_call()
 
-            def test_3(self):
-                never_call()
+      def test_3(self):
+        never_call()
 
-        bt_cls = MockBaseTest(self.mock_test_cls_configs)
-        with self.assertRaisesRegex(signals.TestAbortAll,
-                                    MSG_EXPECTED_EXCEPTION) as context:
-            bt_cls.run(test_names=["test_1", "test_2", "test_3"])
-        self.assertTrue(hasattr(context.exception, 'results'))
-        self.assertEqual(bt_cls.results.passed[0].test_name, "test_1")
-        self.assertEqual(bt_cls.results.failed[0].details,
-                         MSG_EXPECTED_EXCEPTION)
-        self.assertEqual(bt_cls.results.summary_str(),
-                         ("Error 0, Executed 2, Failed 1, Passed 1, "
-                          "Requested 3, Skipped 1"))
+    bt_cls = MockBaseTest(self.mock_test_cls_configs)
+    with self.assertRaisesRegex(signals.TestAbortAll,
+                  MSG_EXPECTED_EXCEPTION) as context:
+      bt_cls.run(test_names=["test_1", "test_2", "test_3"])
+    self.assertTrue(hasattr(context.exception, 'results'))
+    self.assertEqual(bt_cls.results.passed[0].test_name, "test_1")
+    self.assertEqual(bt_cls.results.failed[0].details,
+             MSG_EXPECTED_EXCEPTION)
+    self.assertEqual(bt_cls.results.summary_str(),
+             ("Error 0, Executed 2, Failed 1, Passed 1, "
+              "Requested 3, Skipped 1"))
 
-    def test_uncaught_exception(self):
-        class MockBaseTest(base_test.BaseTestClass):
-            def test_func(self):
-                raise Exception(MSG_EXPECTED_EXCEPTION)
-                never_call()
+  def test_uncaught_exception(self):
+    class MockBaseTest(base_test.BaseTestClass):
+      def test_func(self):
+        raise Exception(MSG_EXPECTED_EXCEPTION)
+        never_call()
 
-        bt_cls = MockBaseTest(self.mock_test_cls_configs)
-        bt_cls.run(test_names=["test_func"])
-        actual_record = bt_cls.results.error[0]
-        self.assertEqual(actual_record.test_name, "test_func")
-        self.assertEqual(actual_record.details, MSG_EXPECTED_EXCEPTION)
-        self.assertIsNone(actual_record.extras)
-        # Stacktraces can vary. Just check for key words
-        self.assertIn('test_method()', actual_record.stacktrace)
-        self.assertIn('raise Exception(MSG_EXPECTED_EXCEPTION)',
-                      actual_record.stacktrace)
-        self.assertIn('Exception: This is an expected exception.',
-                      actual_record.stacktrace)
+    bt_cls = MockBaseTest(self.mock_test_cls_configs)
+    bt_cls.run(test_names=["test_func"])
+    actual_record = bt_cls.results.error[0]
+    self.assertEqual(actual_record.test_name, "test_func")
+    self.assertEqual(actual_record.details, MSG_EXPECTED_EXCEPTION)
+    self.assertIsNone(actual_record.extras)
+    # Stacktraces can vary. Just check for key words
+    self.assertIn('test_method()', actual_record.stacktrace)
+    self.assertIn('raise Exception(MSG_EXPECTED_EXCEPTION)',
+            actual_record.stacktrace)
+    self.assertIn('Exception: This is an expected exception.',
+            actual_record.stacktrace)
 
-    def test_fail(self):
-        class MockBaseTest(base_test.BaseTestClass):
-            def test_func(self):
-                asserts.fail(MSG_EXPECTED_EXCEPTION, extras=MOCK_EXTRA)
-                never_call()
+  def test_fail(self):
+    class MockBaseTest(base_test.BaseTestClass):
+      def test_func(self):
+        asserts.fail(MSG_EXPECTED_EXCEPTION, extras=MOCK_EXTRA)
+        never_call()
 
-        bt_cls = MockBaseTest(self.mock_test_cls_configs)
-        bt_cls.run(test_names=["test_func"])
-        actual_record = bt_cls.results.failed[0]
-        self.assertEqual(actual_record.test_name, "test_func")
-        self.assertEqual(actual_record.details, MSG_EXPECTED_EXCEPTION)
-        self.assertEqual(actual_record.extras, MOCK_EXTRA)
+    bt_cls = MockBaseTest(self.mock_test_cls_configs)
+    bt_cls.run(test_names=["test_func"])
+    actual_record = bt_cls.results.failed[0]
+    self.assertEqual(actual_record.test_name, "test_func")
+    self.assertEqual(actual_record.details, MSG_EXPECTED_EXCEPTION)
+    self.assertEqual(actual_record.extras, MOCK_EXTRA)
 
-    def test_assert_true(self):
-        class MockBaseTest(base_test.BaseTestClass):
-            def test_func(self):
-                asserts.assert_true(False,
-                                    MSG_EXPECTED_EXCEPTION,
-                                    extras=MOCK_EXTRA)
-                never_call()
+  def test_assert_true(self):
+    class MockBaseTest(base_test.BaseTestClass):
+      def test_func(self):
+        asserts.assert_true(False,
+                  MSG_EXPECTED_EXCEPTION,
+                  extras=MOCK_EXTRA)
+        never_call()
 
-        bt_cls = MockBaseTest(self.mock_test_cls_configs)
-        bt_cls.run(test_names=["test_func"])
-        actual_record = bt_cls.results.failed[0]
-        self.assertEqual(actual_record.test_name, "test_func")
-        self.assertEqual(actual_record.details, MSG_EXPECTED_EXCEPTION)
-        self.assertEqual(actual_record.extras, MOCK_EXTRA)
+    bt_cls = MockBaseTest(self.mock_test_cls_configs)
+    bt_cls.run(test_names=["test_func"])
+    actual_record = bt_cls.results.failed[0]
+    self.assertEqual(actual_record.test_name, "test_func")
+    self.assertEqual(actual_record.details, MSG_EXPECTED_EXCEPTION)
+    self.assertEqual(actual_record.extras, MOCK_EXTRA)
 
-    def test_assert_equal_pass(self):
-        class MockBaseTest(base_test.BaseTestClass):
-            def test_func(self):
-                asserts.assert_equal(1, 1, extras=MOCK_EXTRA)
+  def test_assert_equal_pass(self):
+    class MockBaseTest(base_test.BaseTestClass):
+      def test_func(self):
+        asserts.assert_equal(1, 1, extras=MOCK_EXTRA)
 
-        bt_cls = MockBaseTest(self.mock_test_cls_configs)
-        bt_cls.run()
-        actual_record = bt_cls.results.passed[0]
-        self.assertEqual(actual_record.test_name, "test_func")
-        self.assertIsNone(actual_record.details)
-        self.assertIsNone(actual_record.extras)
+    bt_cls = MockBaseTest(self.mock_test_cls_configs)
+    bt_cls.run()
+    actual_record = bt_cls.results.passed[0]
+    self.assertEqual(actual_record.test_name, "test_func")
+    self.assertIsNone(actual_record.details)
+    self.assertIsNone(actual_record.extras)
 
-    def test_assert_equal_fail(self):
-        class MockBaseTest(base_test.BaseTestClass):
-            def test_func(self):
-                asserts.assert_equal(1, 2, extras=MOCK_EXTRA)
+  def test_assert_equal_fail(self):
+    class MockBaseTest(base_test.BaseTestClass):
+      def test_func(self):
+        asserts.assert_equal(1, 2, extras=MOCK_EXTRA)
 
-        bt_cls = MockBaseTest(self.mock_test_cls_configs)
-        bt_cls.run()
-        actual_record = bt_cls.results.failed[0]
-        self.assertEqual(actual_record.test_name, "test_func")
-        self.assertEqual(actual_record.details, "1 != 2")
-        self.assertEqual(actual_record.extras, MOCK_EXTRA)
+    bt_cls = MockBaseTest(self.mock_test_cls_configs)
+    bt_cls.run()
+    actual_record = bt_cls.results.failed[0]
+    self.assertEqual(actual_record.test_name, "test_func")
+    self.assertEqual(actual_record.details, "1 != 2")
+    self.assertEqual(actual_record.extras, MOCK_EXTRA)
 
-    def test_assert_equal_fail_with_msg(self):
-        class MockBaseTest(base_test.BaseTestClass):
-            def test_func(self):
-                asserts.assert_equal(1,
-                                     2,
-                                     msg=MSG_EXPECTED_EXCEPTION,
-                                     extras=MOCK_EXTRA)
+  def test_assert_equal_fail_with_msg(self):
+    class MockBaseTest(base_test.BaseTestClass):
+      def test_func(self):
+        asserts.assert_equal(1,
+                   2,
+                   msg=MSG_EXPECTED_EXCEPTION,
+                   extras=MOCK_EXTRA)
 
-        bt_cls = MockBaseTest(self.mock_test_cls_configs)
-        bt_cls.run()
-        actual_record = bt_cls.results.failed[0]
-        self.assertEqual(actual_record.test_name, "test_func")
-        expected_msg = "1 != 2 " + MSG_EXPECTED_EXCEPTION
-        self.assertEqual(actual_record.details, expected_msg)
-        self.assertEqual(actual_record.extras, MOCK_EXTRA)
+    bt_cls = MockBaseTest(self.mock_test_cls_configs)
+    bt_cls.run()
+    actual_record = bt_cls.results.failed[0]
+    self.assertEqual(actual_record.test_name, "test_func")
+    expected_msg = "1 != 2 " + MSG_EXPECTED_EXCEPTION
+    self.assertEqual(actual_record.details, expected_msg)
+    self.assertEqual(actual_record.extras, MOCK_EXTRA)
 
-    def test_assert_raises_pass(self):
-        class MockBaseTest(base_test.BaseTestClass):
-            def test_func(self):
-                with asserts.assert_raises(SomeError, extras=MOCK_EXTRA):
-                    raise SomeError(MSG_EXPECTED_EXCEPTION)
+  def test_assert_raises_pass(self):
+    class MockBaseTest(base_test.BaseTestClass):
+      def test_func(self):
+        with asserts.assert_raises(SomeError, extras=MOCK_EXTRA):
+          raise SomeError(MSG_EXPECTED_EXCEPTION)
 
-        bt_cls = MockBaseTest(self.mock_test_cls_configs)
-        bt_cls.run()
-        actual_record = bt_cls.results.passed[0]
-        self.assertEqual(actual_record.test_name, "test_func")
-        self.assertIsNone(actual_record.details)
-        self.assertIsNone(actual_record.extras)
+    bt_cls = MockBaseTest(self.mock_test_cls_configs)
+    bt_cls.run()
+    actual_record = bt_cls.results.passed[0]
+    self.assertEqual(actual_record.test_name, "test_func")
+    self.assertIsNone(actual_record.details)
+    self.assertIsNone(actual_record.extras)
 
-    def test_assert_raises_fail_with_noop(self):
-        class MockBaseTest(base_test.BaseTestClass):
-            def test_func(self):
-                with asserts.assert_raises(SomeError, extras=MOCK_EXTRA):
-                    pass
+  def test_assert_raises_fail_with_noop(self):
+    class MockBaseTest(base_test.BaseTestClass):
+      def test_func(self):
+        with asserts.assert_raises(SomeError, extras=MOCK_EXTRA):
+          pass
 
-        bt_cls = MockBaseTest(self.mock_test_cls_configs)
-        bt_cls.run()
-        actual_record = bt_cls.results.failed[0]
-        self.assertEqual(actual_record.test_name, "test_func")
-        self.assertEqual(actual_record.details, "SomeError not raised")
-        self.assertEqual(actual_record.extras, MOCK_EXTRA)
+    bt_cls = MockBaseTest(self.mock_test_cls_configs)
+    bt_cls.run()
+    actual_record = bt_cls.results.failed[0]
+    self.assertEqual(actual_record.test_name, "test_func")
+    self.assertEqual(actual_record.details, "SomeError not raised")
+    self.assertEqual(actual_record.extras, MOCK_EXTRA)
 
-    def test_assert_raises_fail_with_wrong_error(self):
-        class MockBaseTest(base_test.BaseTestClass):
-            def test_func(self):
-                with asserts.assert_raises(SomeError, extras=MOCK_EXTRA):
-                    raise AttributeError(MSG_UNEXPECTED_EXCEPTION)
+  def test_assert_raises_fail_with_wrong_error(self):
+    class MockBaseTest(base_test.BaseTestClass):
+      def test_func(self):
+        with asserts.assert_raises(SomeError, extras=MOCK_EXTRA):
+          raise AttributeError(MSG_UNEXPECTED_EXCEPTION)
 
-        bt_cls = MockBaseTest(self.mock_test_cls_configs)
-        bt_cls.run()
-        actual_record = bt_cls.results.error[0]
-        self.assertEqual(actual_record.test_name, "test_func")
-        self.assertEqual(actual_record.details, MSG_UNEXPECTED_EXCEPTION)
-        self.assertIsNone(actual_record.extras)
+    bt_cls = MockBaseTest(self.mock_test_cls_configs)
+    bt_cls.run()
+    actual_record = bt_cls.results.error[0]
+    self.assertEqual(actual_record.test_name, "test_func")
+    self.assertEqual(actual_record.details, MSG_UNEXPECTED_EXCEPTION)
+    self.assertIsNone(actual_record.extras)
 
-    def test_assert_raises_regex_pass(self):
-        class MockBaseTest(base_test.BaseTestClass):
-            def test_func(self):
-                with asserts.assert_raises_regex(
-                        SomeError,
-                        expected_regex=MSG_EXPECTED_EXCEPTION,
-                        extras=MOCK_EXTRA):
-                    raise SomeError(MSG_EXPECTED_EXCEPTION)
+  def test_assert_raises_regex_pass(self):
+    class MockBaseTest(base_test.BaseTestClass):
+      def test_func(self):
+        with asserts.assert_raises_regex(
+            SomeError,
+            expected_regex=MSG_EXPECTED_EXCEPTION,
+            extras=MOCK_EXTRA):
+          raise SomeError(MSG_EXPECTED_EXCEPTION)
 
-        bt_cls = MockBaseTest(self.mock_test_cls_configs)
-        bt_cls.run()
-        actual_record = bt_cls.results.passed[0]
-        self.assertEqual(actual_record.test_name, "test_func")
-        self.assertIsNone(actual_record.details)
-        self.assertIsNone(actual_record.extras)
+    bt_cls = MockBaseTest(self.mock_test_cls_configs)
+    bt_cls.run()
+    actual_record = bt_cls.results.passed[0]
+    self.assertEqual(actual_record.test_name, "test_func")
+    self.assertIsNone(actual_record.details)
+    self.assertIsNone(actual_record.extras)
 
-    def test_assert_raises_regex_fail_with_noop(self):
-        class MockBaseTest(base_test.BaseTestClass):
-            def test_func(self):
-                with asserts.assert_raises_regex(
-                        SomeError,
-                        expected_regex=MSG_EXPECTED_EXCEPTION,
-                        extras=MOCK_EXTRA):
-                    pass
+  def test_assert_raises_regex_fail_with_noop(self):
+    class MockBaseTest(base_test.BaseTestClass):
+      def test_func(self):
+        with asserts.assert_raises_regex(
+            SomeError,
+            expected_regex=MSG_EXPECTED_EXCEPTION,
+            extras=MOCK_EXTRA):
+          pass
 
-        bt_cls = MockBaseTest(self.mock_test_cls_configs)
-        bt_cls.run()
-        actual_record = bt_cls.results.failed[0]
-        self.assertEqual(actual_record.test_name, "test_func")
-        self.assertEqual(actual_record.details, "SomeError not raised")
-        self.assertEqual(actual_record.extras, MOCK_EXTRA)
+    bt_cls = MockBaseTest(self.mock_test_cls_configs)
+    bt_cls.run()
+    actual_record = bt_cls.results.failed[0]
+    self.assertEqual(actual_record.test_name, "test_func")
+    self.assertEqual(actual_record.details, "SomeError not raised")
+    self.assertEqual(actual_record.extras, MOCK_EXTRA)
 
-    def test_assert_raises_fail_with_wrong_regex(self):
-        wrong_msg = "ha"
+  def test_assert_raises_fail_with_wrong_regex(self):
+    wrong_msg = "ha"
 
-        class MockBaseTest(base_test.BaseTestClass):
-            def test_func(self):
-                with asserts.assert_raises_regex(
-                        SomeError,
-                        expected_regex=MSG_EXPECTED_EXCEPTION,
-                        extras=MOCK_EXTRA):
-                    raise SomeError(wrong_msg)
+    class MockBaseTest(base_test.BaseTestClass):
+      def test_func(self):
+        with asserts.assert_raises_regex(
+            SomeError,
+            expected_regex=MSG_EXPECTED_EXCEPTION,
+            extras=MOCK_EXTRA):
+          raise SomeError(wrong_msg)
 
-        bt_cls = MockBaseTest(self.mock_test_cls_configs)
-        bt_cls.run()
-        actual_record = bt_cls.results.failed[0]
-        self.assertEqual(actual_record.test_name, "test_func")
-        expected_details = ('"This is an expected exception." does not match '
-                            '"%s"') % wrong_msg
-        self.assertEqual(actual_record.details, expected_details)
-        self.assertEqual(actual_record.extras, MOCK_EXTRA)
+    bt_cls = MockBaseTest(self.mock_test_cls_configs)
+    bt_cls.run()
+    actual_record = bt_cls.results.failed[0]
+    self.assertEqual(actual_record.test_name, "test_func")
+    expected_details = ('"This is an expected exception." does not match '
+              '"%s"') % wrong_msg
+    self.assertEqual(actual_record.details, expected_details)
+    self.assertEqual(actual_record.extras, MOCK_EXTRA)
 
-    def test_assert_raises_regex_fail_with_wrong_error(self):
-        class MockBaseTest(base_test.BaseTestClass):
-            def test_func(self):
-                with asserts.assert_raises_regex(
-                        SomeError,
-                        expected_regex=MSG_EXPECTED_EXCEPTION,
-                        extras=MOCK_EXTRA):
-                    raise AttributeError(MSG_UNEXPECTED_EXCEPTION)
+  def test_assert_raises_regex_fail_with_wrong_error(self):
+    class MockBaseTest(base_test.BaseTestClass):
+      def test_func(self):
+        with asserts.assert_raises_regex(
+            SomeError,
+            expected_regex=MSG_EXPECTED_EXCEPTION,
+            extras=MOCK_EXTRA):
+          raise AttributeError(MSG_UNEXPECTED_EXCEPTION)
 
-        bt_cls = MockBaseTest(self.mock_test_cls_configs)
-        bt_cls.run()
-        actual_record = bt_cls.results.error[0]
-        self.assertEqual(actual_record.test_name, "test_func")
-        self.assertEqual(actual_record.details, MSG_UNEXPECTED_EXCEPTION)
-        self.assertIsNone(actual_record.extras)
+    bt_cls = MockBaseTest(self.mock_test_cls_configs)
+    bt_cls.run()
+    actual_record = bt_cls.results.error[0]
+    self.assertEqual(actual_record.test_name, "test_func")
+    self.assertEqual(actual_record.details, MSG_UNEXPECTED_EXCEPTION)
+    self.assertIsNone(actual_record.extras)
 
-    def test_explicit_pass(self):
-        class MockBaseTest(base_test.BaseTestClass):
-            def test_func(self):
-                asserts.explicit_pass(MSG_EXPECTED_EXCEPTION,
-                                      extras=MOCK_EXTRA)
-                never_call()
+  def test_explicit_pass(self):
+    class MockBaseTest(base_test.BaseTestClass):
+      def test_func(self):
+        asserts.explicit_pass(MSG_EXPECTED_EXCEPTION,
+                    extras=MOCK_EXTRA)
+        never_call()
 
-        bt_cls = MockBaseTest(self.mock_test_cls_configs)
-        bt_cls.run(test_names=["test_func"])
-        actual_record = bt_cls.results.passed[0]
-        self.assertEqual(actual_record.test_name, "test_func")
-        self.assertEqual(actual_record.details, MSG_EXPECTED_EXCEPTION)
-        self.assertEqual(actual_record.extras, MOCK_EXTRA)
+    bt_cls = MockBaseTest(self.mock_test_cls_configs)
+    bt_cls.run(test_names=["test_func"])
+    actual_record = bt_cls.results.passed[0]
+    self.assertEqual(actual_record.test_name, "test_func")
+    self.assertEqual(actual_record.details, MSG_EXPECTED_EXCEPTION)
+    self.assertEqual(actual_record.extras, MOCK_EXTRA)
 
-    def test_implicit_pass(self):
-        class MockBaseTest(base_test.BaseTestClass):
-            def test_func(self):
-                pass
+  def test_implicit_pass(self):
+    class MockBaseTest(base_test.BaseTestClass):
+      def test_func(self):
+        pass
 
-        bt_cls = MockBaseTest(self.mock_test_cls_configs)
-        bt_cls.run(test_names=["test_func"])
-        actual_record = bt_cls.results.passed[0]
-        self.assertEqual(actual_record.test_name, "test_func")
-        self.assertIsNone(actual_record.details)
-        self.assertIsNone(actual_record.extras)
+    bt_cls = MockBaseTest(self.mock_test_cls_configs)
+    bt_cls.run(test_names=["test_func"])
+    actual_record = bt_cls.results.passed[0]
+    self.assertEqual(actual_record.test_name, "test_func")
+    self.assertIsNone(actual_record.details)
+    self.assertIsNone(actual_record.extras)
 
-    def test_skip(self):
-        class MockBaseTest(base_test.BaseTestClass):
-            def test_func(self):
-                asserts.skip(MSG_EXPECTED_EXCEPTION, extras=MOCK_EXTRA)
-                never_call()
+  def test_skip(self):
+    class MockBaseTest(base_test.BaseTestClass):
+      def test_func(self):
+        asserts.skip(MSG_EXPECTED_EXCEPTION, extras=MOCK_EXTRA)
+        never_call()
 
-        bt_cls = MockBaseTest(self.mock_test_cls_configs)
-        bt_cls.run(test_names=["test_func"])
-        actual_record = bt_cls.results.skipped[0]
-        self.assertIsNotNone(actual_record.begin_time)
-        self.assertIsNotNone(actual_record.end_time)
-        self.assertEqual(actual_record.test_name, "test_func")
-        self.assertEqual(actual_record.details, MSG_EXPECTED_EXCEPTION)
-        self.assertEqual(actual_record.extras, MOCK_EXTRA)
+    bt_cls = MockBaseTest(self.mock_test_cls_configs)
+    bt_cls.run(test_names=["test_func"])
+    actual_record = bt_cls.results.skipped[0]
+    self.assertIsNotNone(actual_record.begin_time)
+    self.assertIsNotNone(actual_record.end_time)
+    self.assertEqual(actual_record.test_name, "test_func")
+    self.assertEqual(actual_record.details, MSG_EXPECTED_EXCEPTION)
+    self.assertEqual(actual_record.extras, MOCK_EXTRA)
 
-    def test_skip_if(self):
-        class MockBaseTest(base_test.BaseTestClass):
-            def test_func(self):
-                asserts.skip_if(False, MSG_UNEXPECTED_EXCEPTION)
-                asserts.skip_if(True,
-                                MSG_EXPECTED_EXCEPTION,
-                                extras=MOCK_EXTRA)
-                never_call()
+  def test_skip_if(self):
+    class MockBaseTest(base_test.BaseTestClass):
+      def test_func(self):
+        asserts.skip_if(False, MSG_UNEXPECTED_EXCEPTION)
+        asserts.skip_if(True,
+                MSG_EXPECTED_EXCEPTION,
+                extras=MOCK_EXTRA)
+        never_call()
 
-        bt_cls = MockBaseTest(self.mock_test_cls_configs)
-        bt_cls.run(test_names=["test_func"])
-        actual_record = bt_cls.results.skipped[0]
-        self.assertIsNotNone(actual_record.begin_time)
-        self.assertIsNotNone(actual_record.end_time)
-        self.assertEqual(actual_record.test_name, "test_func")
-        self.assertEqual(actual_record.details, MSG_EXPECTED_EXCEPTION)
-        self.assertEqual(actual_record.extras, MOCK_EXTRA)
+    bt_cls = MockBaseTest(self.mock_test_cls_configs)
+    bt_cls.run(test_names=["test_func"])
+    actual_record = bt_cls.results.skipped[0]
+    self.assertIsNotNone(actual_record.begin_time)
+    self.assertIsNotNone(actual_record.end_time)
+    self.assertEqual(actual_record.test_name, "test_func")
+    self.assertEqual(actual_record.details, MSG_EXPECTED_EXCEPTION)
+    self.assertEqual(actual_record.extras, MOCK_EXTRA)
 
-    def test_skip_in_setup_test(self):
-        class MockBaseTest(base_test.BaseTestClass):
-            def setup_test(self):
-                asserts.skip(MSG_EXPECTED_EXCEPTION, extras=MOCK_EXTRA)
+  def test_skip_in_setup_test(self):
+    class MockBaseTest(base_test.BaseTestClass):
+      def setup_test(self):
+        asserts.skip(MSG_EXPECTED_EXCEPTION, extras=MOCK_EXTRA)
 
-            def test_func(self):
-                never_call()
+      def test_func(self):
+        never_call()
 
-        bt_cls = MockBaseTest(self.mock_test_cls_configs)
-        bt_cls.run(test_names=["test_func"])
-        actual_record = bt_cls.results.skipped[0]
-        self.assertIsNotNone(actual_record.begin_time)
-        self.assertIsNotNone(actual_record.end_time)
-        self.assertEqual(actual_record.test_name, "test_func")
-        self.assertEqual(actual_record.details, MSG_EXPECTED_EXCEPTION)
-        self.assertEqual(actual_record.extras, MOCK_EXTRA)
+    bt_cls = MockBaseTest(self.mock_test_cls_configs)
+    bt_cls.run(test_names=["test_func"])
+    actual_record = bt_cls.results.skipped[0]
+    self.assertIsNotNone(actual_record.begin_time)
+    self.assertIsNotNone(actual_record.end_time)
+    self.assertEqual(actual_record.test_name, "test_func")
+    self.assertEqual(actual_record.details, MSG_EXPECTED_EXCEPTION)
+    self.assertEqual(actual_record.extras, MOCK_EXTRA)
 
-    def test_expect_true(self):
-        must_call = mock.Mock()
-        must_call2 = mock.Mock()
+  def test_expect_true(self):
+    must_call = mock.Mock()
+    must_call2 = mock.Mock()
 
-        class MockBaseTest(base_test.BaseTestClass):
-            def test_func(self):
-                expects.expect_true(False,
-                                    MSG_EXPECTED_EXCEPTION,
-                                    extras=MOCK_EXTRA)
-                must_call('ha')
+    class MockBaseTest(base_test.BaseTestClass):
+      def test_func(self):
+        expects.expect_true(False,
+                  MSG_EXPECTED_EXCEPTION,
+                  extras=MOCK_EXTRA)
+        must_call('ha')
 
-            def on_fail(self, record):
-                must_call2('on_fail')
+      def on_fail(self, record):
+        must_call2('on_fail')
 
-        bt_cls = MockBaseTest(self.mock_test_cls_configs)
-        bt_cls.run(test_names=['test_func'])
-        must_call.assert_called_once_with('ha')
-        must_call2.assert_called_once_with('on_fail')
-        actual_record = bt_cls.results.failed[0]
-        self.assertEqual(actual_record.test_name, 'test_func')
-        self.assertEqual(actual_record.details, MSG_EXPECTED_EXCEPTION)
-        self.assertEqual(actual_record.extras, MOCK_EXTRA)
+    bt_cls = MockBaseTest(self.mock_test_cls_configs)
+    bt_cls.run(test_names=['test_func'])
+    must_call.assert_called_once_with('ha')
+    must_call2.assert_called_once_with('on_fail')
+    actual_record = bt_cls.results.failed[0]
+    self.assertEqual(actual_record.test_name, 'test_func')
+    self.assertEqual(actual_record.details, MSG_EXPECTED_EXCEPTION)
+    self.assertEqual(actual_record.extras, MOCK_EXTRA)
 
-    def test_expect_multiple_fails(self):
-        must_call = mock.Mock()
-        must_call2 = mock.Mock()
+  def test_expect_multiple_fails(self):
+    must_call = mock.Mock()
+    must_call2 = mock.Mock()
 
-        class MockBaseTest(base_test.BaseTestClass):
-            def test_func(self):
-                expects.expect_true(False, 'msg 1', extras='1')
-                expects.expect_true(False, 'msg 2', extras='2')
-                must_call('ha')
+    class MockBaseTest(base_test.BaseTestClass):
+      def test_func(self):
+        expects.expect_true(False, 'msg 1', extras='1')
+        expects.expect_true(False, 'msg 2', extras='2')
+        must_call('ha')
 
-            def on_fail(self, record):
-                must_call2('on_fail')
+      def on_fail(self, record):
+        must_call2('on_fail')
 
-        bt_cls = MockBaseTest(self.mock_test_cls_configs)
-        bt_cls.run(test_names=['test_func'])
-        must_call.assert_called_once_with('ha')
-        must_call2.assert_called_once_with('on_fail')
-        actual_record = bt_cls.results.failed[0]
-        self.assertEqual(actual_record.test_name, 'test_func')
-        self.assertEqual(actual_record.details, 'msg 1')
-        self.assertEqual(actual_record.extras, '1')
-        self.assertEqual(len(actual_record.extra_errors), 1)
-        second_error = list(actual_record.extra_errors.values())[0]
-        self.assertEqual(second_error.details, 'msg 2')
-        self.assertEqual(second_error.extras, '2')
+    bt_cls = MockBaseTest(self.mock_test_cls_configs)
+    bt_cls.run(test_names=['test_func'])
+    must_call.assert_called_once_with('ha')
+    must_call2.assert_called_once_with('on_fail')
+    actual_record = bt_cls.results.failed[0]
+    self.assertEqual(actual_record.test_name, 'test_func')
+    self.assertEqual(actual_record.details, 'msg 1')
+    self.assertEqual(actual_record.extras, '1')
+    self.assertEqual(len(actual_record.extra_errors), 1)
+    second_error = list(actual_record.extra_errors.values())[0]
+    self.assertEqual(second_error.details, 'msg 2')
+    self.assertEqual(second_error.extras, '2')
 
-    def test_expect_two_tests(self):
-        """Errors in `expect` should not leak across tests.
-        """
-        must_call = mock.Mock()
+  def test_expect_two_tests(self):
+    """Errors in `expect` should not leak across tests.
+    """
+    must_call = mock.Mock()
 
-        class MockBaseTest(base_test.BaseTestClass):
-            def test_1(self):
-                expects.expect_true(False,
-                                    MSG_EXPECTED_EXCEPTION,
-                                    extras=MOCK_EXTRA)
-                must_call('ha')
+    class MockBaseTest(base_test.BaseTestClass):
+      def test_1(self):
+        expects.expect_true(False,
+                  MSG_EXPECTED_EXCEPTION,
+                  extras=MOCK_EXTRA)
+        must_call('ha')
 
-            def test_2(self):
-                pass
+      def test_2(self):
+        pass
 
-        bt_cls = MockBaseTest(self.mock_test_cls_configs)
-        bt_cls.run(test_names=['test_1', 'test_2'])
-        must_call.assert_called_once_with('ha')
-        actual_record = bt_cls.results.failed[0]
-        self.assertEqual(actual_record.test_name, 'test_1')
-        self.assertEqual(actual_record.details, MSG_EXPECTED_EXCEPTION)
-        self.assertEqual(actual_record.extras, MOCK_EXTRA)
-        another_record = bt_cls.results.passed[0]
-        self.assertEqual(another_record.test_name, 'test_2')
+    bt_cls = MockBaseTest(self.mock_test_cls_configs)
+    bt_cls.run(test_names=['test_1', 'test_2'])
+    must_call.assert_called_once_with('ha')
+    actual_record = bt_cls.results.failed[0]
+    self.assertEqual(actual_record.test_name, 'test_1')
+    self.assertEqual(actual_record.details, MSG_EXPECTED_EXCEPTION)
+    self.assertEqual(actual_record.extras, MOCK_EXTRA)
+    another_record = bt_cls.results.passed[0]
+    self.assertEqual(another_record.test_name, 'test_2')
 
-    def test_expect_no_op(self):
-        """Tests don't fail when expect is not triggered.
-        """
-        must_call = mock.Mock()
+  def test_expect_no_op(self):
+    """Tests don't fail when expect is not triggered.
+    """
+    must_call = mock.Mock()
 
-        class MockBaseTest(base_test.BaseTestClass):
-            def test_1(self):
-                expects.expect_true(True,
-                                    MSG_EXPECTED_EXCEPTION,
-                                    extras=MOCK_EXTRA)
-                must_call('ha')
+    class MockBaseTest(base_test.BaseTestClass):
+      def test_1(self):
+        expects.expect_true(True,
+                  MSG_EXPECTED_EXCEPTION,
+                  extras=MOCK_EXTRA)
+        must_call('ha')
 
-            def test_2(self):
-                expects.expect_false(False,
-                                     MSG_EXPECTED_EXCEPTION,
-                                     extras=MOCK_EXTRA)
-                must_call('ha')
+      def test_2(self):
+        expects.expect_false(False,
+                   MSG_EXPECTED_EXCEPTION,
+                   extras=MOCK_EXTRA)
+        must_call('ha')
 
-        bt_cls = MockBaseTest(self.mock_test_cls_configs)
-        bt_cls.run(test_names=['test_1', 'test_2'])
-        must_call.assert_called_with('ha')
-        self.assertEqual(len(bt_cls.results.passed), 2)
+    bt_cls = MockBaseTest(self.mock_test_cls_configs)
+    bt_cls.run(test_names=['test_1', 'test_2'])
+    must_call.assert_called_with('ha')
+    self.assertEqual(len(bt_cls.results.passed), 2)
 
-    @mock.patch('mobly.records.TestSummaryWriter.dump')
-    def test_expect_in_setup_class(self, mock_dump):
-        must_call = mock.Mock()
-        must_call2 = mock.Mock()
+  @mock.patch('mobly.records.TestSummaryWriter.dump')
+  def test_expect_in_setup_class(self, mock_dump):
+    must_call = mock.Mock()
+    must_call2 = mock.Mock()
 
-        class MockBaseTest(base_test.BaseTestClass):
-            def setup_class(self):
-                expects.expect_true(False,
-                                    MSG_EXPECTED_EXCEPTION,
-                                    extras=MOCK_EXTRA)
-                must_call('ha')
+    class MockBaseTest(base_test.BaseTestClass):
+      def setup_class(self):
+        expects.expect_true(False,
+                  MSG_EXPECTED_EXCEPTION,
+                  extras=MOCK_EXTRA)
+        must_call('ha')
 
-            def test_func(self):
-                pass
+      def test_func(self):
+        pass
 
-            def on_fail(self, record):
-                must_call2('on_fail')
+      def on_fail(self, record):
+        must_call2('on_fail')
 
-        bt_cls = MockBaseTest(self.mock_test_cls_configs)
-        bt_cls.run()
-        must_call.assert_called_once_with('ha')
-        must_call2.assert_called_once_with('on_fail')
-        actual_record = bt_cls.results.error[0]
-        self.assertEqual(actual_record.test_name, 'setup_class')
-        self.assertEqual(actual_record.details, MSG_EXPECTED_EXCEPTION)
-        self.assertEqual(actual_record.extras, MOCK_EXTRA)
-        # Verify the class record is written out correctly.
-        setup_class_dict = mock_dump.call_args_list[1][0][0]
-        self.assertIsNotNone(setup_class_dict['Begin Time'])
-        self.assertIsNotNone(setup_class_dict['End Time'])
-        self.assertEqual(setup_class_dict['Test Name'], 'setup_class')
+    bt_cls = MockBaseTest(self.mock_test_cls_configs)
+    bt_cls.run()
+    must_call.assert_called_once_with('ha')
+    must_call2.assert_called_once_with('on_fail')
+    actual_record = bt_cls.results.error[0]
+    self.assertEqual(actual_record.test_name, 'setup_class')
+    self.assertEqual(actual_record.details, MSG_EXPECTED_EXCEPTION)
+    self.assertEqual(actual_record.extras, MOCK_EXTRA)
+    # Verify the class record is written out correctly.
+    setup_class_dict = mock_dump.call_args_list[1][0][0]
+    self.assertIsNotNone(setup_class_dict['Begin Time'])
+    self.assertIsNotNone(setup_class_dict['End Time'])
+    self.assertEqual(setup_class_dict['Test Name'], 'setup_class')
 
-    @mock.patch('mobly.records.TestSummaryWriter.dump')
-    def test_expect_in_setup_class_and_on_fail(self, mock_dump):
-        must_call = mock.Mock()
-        must_call2 = mock.Mock()
+  @mock.patch('mobly.records.TestSummaryWriter.dump')
+  def test_expect_in_setup_class_and_on_fail(self, mock_dump):
+    must_call = mock.Mock()
+    must_call2 = mock.Mock()
 
-        class MockBaseTest(base_test.BaseTestClass):
-            def setup_class(self):
-                expects.expect_true(False,
-                                    'Failure in setup_class',
-                                    extras=MOCK_EXTRA)
-                must_call('ha')
+    class MockBaseTest(base_test.BaseTestClass):
+      def setup_class(self):
+        expects.expect_true(False,
+                  'Failure in setup_class',
+                  extras=MOCK_EXTRA)
+        must_call('ha')
 
-            def test_func(self):
-                pass
+      def test_func(self):
+        pass
 
-            def on_fail(self, record):
-                expects.expect_true(False,
-                                    'Failure in on_fail',
-                                    extras=MOCK_EXTRA)
-                must_call2('on_fail')
+      def on_fail(self, record):
+        expects.expect_true(False,
+                  'Failure in on_fail',
+                  extras=MOCK_EXTRA)
+        must_call2('on_fail')
 
-        bt_cls = MockBaseTest(self.mock_test_cls_configs)
-        bt_cls.run()
-        must_call.assert_called_once_with('ha')
-        must_call2.assert_called_once_with('on_fail')
-        actual_record = bt_cls.results.error[0]
-        self.assertEqual(actual_record.test_name, 'setup_class')
-        self.assertEqual(actual_record.details, 'Failure in setup_class')
-        self.assertEqual(actual_record.extras, MOCK_EXTRA)
-        on_fail_error = next(iter(actual_record.extra_errors.values()))
-        self.assertEqual(on_fail_error.details, 'Failure in on_fail')
-        self.assertEqual(on_fail_error.extras, MOCK_EXTRA)
-        # Verify the class record is written out correctly.
-        setup_class_dict = mock_dump.call_args_list[1][0][0]
-        self.assertIsNotNone(setup_class_dict['Begin Time'])
-        self.assertIsNotNone(setup_class_dict['End Time'])
-        self.assertEqual(setup_class_dict['Test Name'], 'setup_class')
-        # Verify the on_fail error is recorded in summary result.
-        extra_error_dict = next(iter(
-            setup_class_dict['Extra Errors'].values()))
-        self.assertEqual(extra_error_dict['Details'], 'Failure in on_fail')
+    bt_cls = MockBaseTest(self.mock_test_cls_configs)
+    bt_cls.run()
+    must_call.assert_called_once_with('ha')
+    must_call2.assert_called_once_with('on_fail')
+    actual_record = bt_cls.results.error[0]
+    self.assertEqual(actual_record.test_name, 'setup_class')
+    self.assertEqual(actual_record.details, 'Failure in setup_class')
+    self.assertEqual(actual_record.extras, MOCK_EXTRA)
+    on_fail_error = next(iter(actual_record.extra_errors.values()))
+    self.assertEqual(on_fail_error.details, 'Failure in on_fail')
+    self.assertEqual(on_fail_error.extras, MOCK_EXTRA)
+    # Verify the class record is written out correctly.
+    setup_class_dict = mock_dump.call_args_list[1][0][0]
+    self.assertIsNotNone(setup_class_dict['Begin Time'])
+    self.assertIsNotNone(setup_class_dict['End Time'])
+    self.assertEqual(setup_class_dict['Test Name'], 'setup_class')
+    # Verify the on_fail error is recorded in summary result.
+    extra_error_dict = next(iter(
+      setup_class_dict['Extra Errors'].values()))
+    self.assertEqual(extra_error_dict['Details'], 'Failure in on_fail')
 
-    def test_expect_in_teardown_class(self):
-        must_call = mock.Mock()
+  def test_expect_in_teardown_class(self):
+    must_call = mock.Mock()
 
-        class MockBaseTest(base_test.BaseTestClass):
-            def test_func(self):
-                pass
+    class MockBaseTest(base_test.BaseTestClass):
+      def test_func(self):
+        pass
 
-            def teardown_class(self):
-                expects.expect_true(False,
-                                    MSG_EXPECTED_EXCEPTION,
-                                    extras=MOCK_EXTRA)
-                must_call('ha')
+      def teardown_class(self):
+        expects.expect_true(False,
+                  MSG_EXPECTED_EXCEPTION,
+                  extras=MOCK_EXTRA)
+        must_call('ha')
 
-        bt_cls = MockBaseTest(self.mock_test_cls_configs)
-        bt_cls.run()
-        must_call.assert_called_once_with('ha')
-        actual_record = bt_cls.results.error[0]
-        self.assertEqual(actual_record.test_name, 'teardown_class')
-        self.assertEqual(actual_record.details, MSG_EXPECTED_EXCEPTION)
-        self.assertEqual(actual_record.extras, MOCK_EXTRA)
+    bt_cls = MockBaseTest(self.mock_test_cls_configs)
+    bt_cls.run()
+    must_call.assert_called_once_with('ha')
+    actual_record = bt_cls.results.error[0]
+    self.assertEqual(actual_record.test_name, 'teardown_class')
+    self.assertEqual(actual_record.details, MSG_EXPECTED_EXCEPTION)
+    self.assertEqual(actual_record.extras, MOCK_EXTRA)
 
-    def test_expect_in_setup_test(self):
-        must_call = mock.Mock()
-        must_call2 = mock.Mock()
+  def test_expect_in_setup_test(self):
+    must_call = mock.Mock()
+    must_call2 = mock.Mock()
 
-        class MockBaseTest(base_test.BaseTestClass):
-            def setup_test(self):
-                expects.expect_true(False,
-                                    MSG_EXPECTED_EXCEPTION,
-                                    extras=MOCK_EXTRA)
-                must_call('ha')
+    class MockBaseTest(base_test.BaseTestClass):
+      def setup_test(self):
+        expects.expect_true(False,
+                  MSG_EXPECTED_EXCEPTION,
+                  extras=MOCK_EXTRA)
+        must_call('ha')
 
-            def test_func(self):
-                pass
+      def test_func(self):
+        pass
 
-            def on_fail(self, record):
-                must_call2('on_fail')
+      def on_fail(self, record):
+        must_call2('on_fail')
 
-        bt_cls = MockBaseTest(self.mock_test_cls_configs)
-        bt_cls.run()
-        must_call.assert_called_once_with('ha')
-        must_call2.assert_called_once_with('on_fail')
-        actual_record = bt_cls.results.failed[0]
-        self.assertEqual(actual_record.test_name, 'test_func')
-        self.assertEqual(actual_record.details, MSG_EXPECTED_EXCEPTION)
-        self.assertEqual(actual_record.extras, MOCK_EXTRA)
+    bt_cls = MockBaseTest(self.mock_test_cls_configs)
+    bt_cls.run()
+    must_call.assert_called_once_with('ha')
+    must_call2.assert_called_once_with('on_fail')
+    actual_record = bt_cls.results.failed[0]
+    self.assertEqual(actual_record.test_name, 'test_func')
+    self.assertEqual(actual_record.details, MSG_EXPECTED_EXCEPTION)
+    self.assertEqual(actual_record.extras, MOCK_EXTRA)
 
-    def test_expect_in_teardown_test(self):
-        must_call = mock.Mock()
-        must_call2 = mock.Mock()
+  def test_expect_in_teardown_test(self):
+    must_call = mock.Mock()
+    must_call2 = mock.Mock()
 
-        class MockBaseTest(base_test.BaseTestClass):
-            def test_func(self):
-                pass
+    class MockBaseTest(base_test.BaseTestClass):
+      def test_func(self):
+        pass
 
-            def teardown_test(self):
-                expects.expect_true(False,
-                                    MSG_EXPECTED_EXCEPTION,
-                                    extras=MOCK_EXTRA)
-                must_call('ha')
+      def teardown_test(self):
+        expects.expect_true(False,
+                  MSG_EXPECTED_EXCEPTION,
+                  extras=MOCK_EXTRA)
+        must_call('ha')
 
-            def on_fail(self, record):
-                must_call2('on_fail')
+      def on_fail(self, record):
+        must_call2('on_fail')
 
-        bt_cls = MockBaseTest(self.mock_test_cls_configs)
-        bt_cls.run(test_names=['test_func'])
-        must_call.assert_called_once_with('ha')
-        must_call2.assert_called_once_with('on_fail')
-        actual_record = bt_cls.results.error[0]
-        self.assertEqual(actual_record.test_name, 'test_func')
-        self.assertEqual(actual_record.details, MSG_EXPECTED_EXCEPTION)
-        self.assertEqual(actual_record.extras, MOCK_EXTRA)
+    bt_cls = MockBaseTest(self.mock_test_cls_configs)
+    bt_cls.run(test_names=['test_func'])
+    must_call.assert_called_once_with('ha')
+    must_call2.assert_called_once_with('on_fail')
+    actual_record = bt_cls.results.error[0]
+    self.assertEqual(actual_record.test_name, 'test_func')
+    self.assertEqual(actual_record.details, MSG_EXPECTED_EXCEPTION)
+    self.assertEqual(actual_record.extras, MOCK_EXTRA)
 
-    def test_expect_false(self):
-        must_call = mock.Mock()
+  def test_expect_false(self):
+    must_call = mock.Mock()
 
-        class MockBaseTest(base_test.BaseTestClass):
-            def test_func(self):
-                expects.expect_false(True,
-                                     MSG_EXPECTED_EXCEPTION,
-                                     extras=MOCK_EXTRA)
-                must_call('ha')
+    class MockBaseTest(base_test.BaseTestClass):
+      def test_func(self):
+        expects.expect_false(True,
+                   MSG_EXPECTED_EXCEPTION,
+                   extras=MOCK_EXTRA)
+        must_call('ha')
 
-        bt_cls = MockBaseTest(self.mock_test_cls_configs)
-        bt_cls.run(test_names=['test_func'])
-        must_call.assert_called_once_with('ha')
-        actual_record = bt_cls.results.failed[0]
-        self.assertEqual(actual_record.test_name, 'test_func')
-        self.assertEqual(actual_record.details, MSG_EXPECTED_EXCEPTION)
-        self.assertEqual(actual_record.extras, MOCK_EXTRA)
+    bt_cls = MockBaseTest(self.mock_test_cls_configs)
+    bt_cls.run(test_names=['test_func'])
+    must_call.assert_called_once_with('ha')
+    actual_record = bt_cls.results.failed[0]
+    self.assertEqual(actual_record.test_name, 'test_func')
+    self.assertEqual(actual_record.details, MSG_EXPECTED_EXCEPTION)
+    self.assertEqual(actual_record.extras, MOCK_EXTRA)
 
-    def test_expect_equal(self):
-        must_call = mock.Mock()
+  def test_expect_equal(self):
+    must_call = mock.Mock()
 
-        class MockBaseTest(base_test.BaseTestClass):
-            def test_func(self):
-                expects.expect_equal(1,
-                                     2,
-                                     MSG_EXPECTED_EXCEPTION,
-                                     extras=MOCK_EXTRA)
-                must_call('ha')
+    class MockBaseTest(base_test.BaseTestClass):
+      def test_func(self):
+        expects.expect_equal(1,
+                   2,
+                   MSG_EXPECTED_EXCEPTION,
+                   extras=MOCK_EXTRA)
+        must_call('ha')
 
-        bt_cls = MockBaseTest(self.mock_test_cls_configs)
-        bt_cls.run(test_names=['test_func'])
-        must_call.assert_called_once_with('ha')
-        actual_record = bt_cls.results.failed[0]
-        self.assertEqual(actual_record.test_name, 'test_func')
-        self.assertEqual(actual_record.details,
-                         '1 != 2 ' + MSG_EXPECTED_EXCEPTION)
-        self.assertEqual(actual_record.extras, MOCK_EXTRA)
+    bt_cls = MockBaseTest(self.mock_test_cls_configs)
+    bt_cls.run(test_names=['test_func'])
+    must_call.assert_called_once_with('ha')
+    actual_record = bt_cls.results.failed[0]
+    self.assertEqual(actual_record.test_name, 'test_func')
+    self.assertEqual(actual_record.details,
+             '1 != 2 ' + MSG_EXPECTED_EXCEPTION)
+    self.assertEqual(actual_record.extras, MOCK_EXTRA)
 
-    def test_expect_no_raises_default_msg(self):
-        must_call = mock.Mock()
+  def test_expect_no_raises_default_msg(self):
+    must_call = mock.Mock()
 
-        class MockBaseTest(base_test.BaseTestClass):
-            def test_func(self):
-                with expects.expect_no_raises(extras=MOCK_EXTRA):
-                    raise Exception(MSG_EXPECTED_EXCEPTION)
-                must_call('ha')
+    class MockBaseTest(base_test.BaseTestClass):
+      def test_func(self):
+        with expects.expect_no_raises(extras=MOCK_EXTRA):
+          raise Exception(MSG_EXPECTED_EXCEPTION)
+        must_call('ha')
 
-        bt_cls = MockBaseTest(self.mock_test_cls_configs)
-        bt_cls.run(test_names=['test_func'])
-        must_call.assert_called_once_with('ha')
-        actual_record = bt_cls.results.failed[0]
-        self.assertEqual(actual_record.test_name, 'test_func')
-        self.assertEqual(
-            actual_record.details,
-            'Got an unexpected exception: %s' % MSG_EXPECTED_EXCEPTION)
-        self.assertEqual(actual_record.extras, MOCK_EXTRA)
+    bt_cls = MockBaseTest(self.mock_test_cls_configs)
+    bt_cls.run(test_names=['test_func'])
+    must_call.assert_called_once_with('ha')
+    actual_record = bt_cls.results.failed[0]
+    self.assertEqual(actual_record.test_name, 'test_func')
+    self.assertEqual(
+      actual_record.details,
+      'Got an unexpected exception: %s' % MSG_EXPECTED_EXCEPTION)
+    self.assertEqual(actual_record.extras, MOCK_EXTRA)
 
-    def test_expect_no_raises_custom_msg(self):
-        must_call = mock.Mock()
-        msg = 'Some step unexpected failed'
+  def test_expect_no_raises_custom_msg(self):
+    must_call = mock.Mock()
+    msg = 'Some step unexpected failed'
 
-        class MockBaseTest(base_test.BaseTestClass):
-            def test_func(self):
-                with expects.expect_no_raises(message=msg, extras=MOCK_EXTRA):
-                    raise Exception(MSG_EXPECTED_EXCEPTION)
-                must_call('ha')
+    class MockBaseTest(base_test.BaseTestClass):
+      def test_func(self):
+        with expects.expect_no_raises(message=msg, extras=MOCK_EXTRA):
+          raise Exception(MSG_EXPECTED_EXCEPTION)
+        must_call('ha')
 
-        bt_cls = MockBaseTest(self.mock_test_cls_configs)
-        bt_cls.run(test_names=['test_func'])
-        must_call.assert_called_once_with('ha')
-        actual_record = bt_cls.results.failed[0]
-        self.assertEqual(actual_record.test_name, 'test_func')
-        self.assertEqual(actual_record.details,
-                         '%s: %s' % (msg, MSG_EXPECTED_EXCEPTION))
-        self.assertEqual(actual_record.extras, MOCK_EXTRA)
+    bt_cls = MockBaseTest(self.mock_test_cls_configs)
+    bt_cls.run(test_names=['test_func'])
+    must_call.assert_called_once_with('ha')
+    actual_record = bt_cls.results.failed[0]
+    self.assertEqual(actual_record.test_name, 'test_func')
+    self.assertEqual(actual_record.details,
+             '%s: %s' % (msg, MSG_EXPECTED_EXCEPTION))
+    self.assertEqual(actual_record.extras, MOCK_EXTRA)
 
-    def test_expect_true_and_assert_true(self):
-        """Error thrown by assert_true should be considered the termination.
-        """
-        must_call = mock.Mock()
+  def test_expect_true_and_assert_true(self):
+    """Error thrown by assert_true should be considered the termination.
+    """
+    must_call = mock.Mock()
 
-        class MockBaseTest(base_test.BaseTestClass):
-            def test_func(self):
-                expects.expect_true(False,
-                                    MSG_EXPECTED_EXCEPTION,
-                                    extras=MOCK_EXTRA)
-                must_call('ha')
-                asserts.assert_true(False, 'failed from assert_true')
+    class MockBaseTest(base_test.BaseTestClass):
+      def test_func(self):
+        expects.expect_true(False,
+                  MSG_EXPECTED_EXCEPTION,
+                  extras=MOCK_EXTRA)
+        must_call('ha')
+        asserts.assert_true(False, 'failed from assert_true')
 
-        bt_cls = MockBaseTest(self.mock_test_cls_configs)
-        bt_cls.run(test_names=['test_func'])
-        must_call.assert_called_once_with('ha')
-        actual_record = bt_cls.results.failed[0]
-        self.assertEqual(actual_record.test_name, 'test_func')
-        self.assertEqual(actual_record.details, 'failed from assert_true')
-        self.assertIsNone(actual_record.extras)
+    bt_cls = MockBaseTest(self.mock_test_cls_configs)
+    bt_cls.run(test_names=['test_func'])
+    must_call.assert_called_once_with('ha')
+    actual_record = bt_cls.results.failed[0]
+    self.assertEqual(actual_record.test_name, 'test_func')
+    self.assertEqual(actual_record.details, 'failed from assert_true')
+    self.assertIsNone(actual_record.extras)
 
-    def test_unpack_userparams_required(self):
-        """Missing a required param should raise an error."""
-        required = ["some_param"]
-        bc = base_test.BaseTestClass(self.mock_test_cls_configs)
-        bc.unpack_userparams(required)
-        expected_value = self.mock_test_cls_configs.user_params["some_param"]
-        self.assertEqual(bc.some_param, expected_value)
+  def test_unpack_userparams_required(self):
+    """Missing a required param should raise an error."""
+    required = ["some_param"]
+    bc = base_test.BaseTestClass(self.mock_test_cls_configs)
+    bc.unpack_userparams(required)
+    expected_value = self.mock_test_cls_configs.user_params["some_param"]
+    self.assertEqual(bc.some_param, expected_value)
 
-    def test_unpack_userparams_required_missing(self):
-        """Missing a required param should raise an error."""
-        required = ["something"]
-        bc = base_test.BaseTestClass(self.mock_test_cls_configs)
-        expected_msg = ('Missing required user param "%s" in test '
-                        'configuration.') % required[0]
-        with self.assertRaisesRegex(base_test.Error, expected_msg):
-            bc.unpack_userparams(required)
+  def test_unpack_userparams_required_missing(self):
+    """Missing a required param should raise an error."""
+    required = ["something"]
+    bc = base_test.BaseTestClass(self.mock_test_cls_configs)
+    expected_msg = ('Missing required user param "%s" in test '
+            'configuration.') % required[0]
+    with self.assertRaisesRegex(base_test.Error, expected_msg):
+      bc.unpack_userparams(required)
 
-    def test_unpack_userparams_optional(self):
-        """If an optional param is specified, the value should be what's in the
-        config.
-        """
-        opt = ["some_param"]
-        bc = base_test.BaseTestClass(self.mock_test_cls_configs)
-        bc.unpack_userparams(opt_param_names=opt)
-        expected_value = self.mock_test_cls_configs.user_params["some_param"]
-        self.assertEqual(bc.some_param, expected_value)
+  def test_unpack_userparams_optional(self):
+    """If an optional param is specified, the value should be what's in the
+    config.
+    """
+    opt = ["some_param"]
+    bc = base_test.BaseTestClass(self.mock_test_cls_configs)
+    bc.unpack_userparams(opt_param_names=opt)
+    expected_value = self.mock_test_cls_configs.user_params["some_param"]
+    self.assertEqual(bc.some_param, expected_value)
 
-    def test_unpack_userparams_optional_with_default(self):
-        """If an optional param is specified with a default value, and the
-        param is not in the config, the value should be the default value.
-        """
-        bc = base_test.BaseTestClass(self.mock_test_cls_configs)
-        bc.unpack_userparams(optional_thing="whatever")
-        self.assertEqual(bc.optional_thing, "whatever")
+  def test_unpack_userparams_optional_with_default(self):
+    """If an optional param is specified with a default value, and the
+    param is not in the config, the value should be the default value.
+    """
+    bc = base_test.BaseTestClass(self.mock_test_cls_configs)
+    bc.unpack_userparams(optional_thing="whatever")
+    self.assertEqual(bc.optional_thing, "whatever")
 
-    def test_unpack_userparams_default_overwrite_by_optional_param_list(self):
-        """If an optional param is specified in kwargs, and the param is in the
-        config, the value should be the one in the config.
-        """
-        bc = base_test.BaseTestClass(self.mock_test_cls_configs)
-        bc.unpack_userparams(some_param="whatever")
-        expected_value = self.mock_test_cls_configs.user_params["some_param"]
-        self.assertEqual(bc.some_param, expected_value)
+  def test_unpack_userparams_default_overwrite_by_optional_param_list(self):
+    """If an optional param is specified in kwargs, and the param is in the
+    config, the value should be the one in the config.
+    """
+    bc = base_test.BaseTestClass(self.mock_test_cls_configs)
+    bc.unpack_userparams(some_param="whatever")
+    expected_value = self.mock_test_cls_configs.user_params["some_param"]
+    self.assertEqual(bc.some_param, expected_value)
 
-    def test_unpack_userparams_default_overwrite_by_required_param_list(self):
-        """If an optional param is specified in kwargs, the param is in the
-        required param list, and the param is not specified in the config, the
-        param's alue should be the default value and there should be no error
-        thrown.
-        """
-        bc = base_test.BaseTestClass(self.mock_test_cls_configs)
-        bc.unpack_userparams(req_param_names=['a_kwarg_param'],
-                             a_kwarg_param="whatever")
-        self.assertEqual(bc.a_kwarg_param, "whatever")
+  def test_unpack_userparams_default_overwrite_by_required_param_list(self):
+    """If an optional param is specified in kwargs, the param is in the
+    required param list, and the param is not specified in the config, the
+    param's alue should be the default value and there should be no error
+    thrown.
+    """
+    bc = base_test.BaseTestClass(self.mock_test_cls_configs)
+    bc.unpack_userparams(req_param_names=['a_kwarg_param'],
+               a_kwarg_param="whatever")
+    self.assertEqual(bc.a_kwarg_param, "whatever")
 
-    def test_unpack_userparams_optional_missing(self):
-        """Missing an optional param should not raise an error."""
-        opt = ["something"]
-        bc = base_test.BaseTestClass(self.mock_test_cls_configs)
-        bc.unpack_userparams(opt_param_names=opt)
+  def test_unpack_userparams_optional_missing(self):
+    """Missing an optional param should not raise an error."""
+    opt = ["something"]
+    bc = base_test.BaseTestClass(self.mock_test_cls_configs)
+    bc.unpack_userparams(opt_param_names=opt)
 
-    def test_unpack_userparams_basic(self):
-        """Required and optional params are unpacked properly."""
-        required = ["something"]
-        optional = ["something_else"]
-        configs = self.mock_test_cls_configs.copy()
-        configs.user_params["something"] = 42
-        configs.user_params["something_else"] = 53
-        bc = base_test.BaseTestClass(configs)
-        bc.unpack_userparams(req_param_names=required,
-                             opt_param_names=optional)
-        self.assertEqual(bc.something, 42)
-        self.assertEqual(bc.something_else, 53)
+  def test_unpack_userparams_basic(self):
+    """Required and optional params are unpacked properly."""
+    required = ["something"]
+    optional = ["something_else"]
+    configs = self.mock_test_cls_configs.copy()
+    configs.user_params["something"] = 42
+    configs.user_params["something_else"] = 53
+    bc = base_test.BaseTestClass(configs)
+    bc.unpack_userparams(req_param_names=required,
+               opt_param_names=optional)
+    self.assertEqual(bc.something, 42)
+    self.assertEqual(bc.something_else, 53)
 
-    def test_unpack_userparams_default_overwrite(self):
-        default_arg_val = "haha"
-        actual_arg_val = "wawa"
-        arg_name = "arg1"
-        configs = self.mock_test_cls_configs.copy()
-        configs.user_params[arg_name] = actual_arg_val
-        bc = base_test.BaseTestClass(configs)
-        bc.unpack_userparams(opt_param_names=[arg_name], arg1=default_arg_val)
-        self.assertEqual(bc.arg1, actual_arg_val)
+  def test_unpack_userparams_default_overwrite(self):
+    default_arg_val = "haha"
+    actual_arg_val = "wawa"
+    arg_name = "arg1"
+    configs = self.mock_test_cls_configs.copy()
+    configs.user_params[arg_name] = actual_arg_val
+    bc = base_test.BaseTestClass(configs)
+    bc.unpack_userparams(opt_param_names=[arg_name], arg1=default_arg_val)
+    self.assertEqual(bc.arg1, actual_arg_val)
 
-    def test_unpack_userparams_default_None(self):
-        bc = base_test.BaseTestClass(self.mock_test_cls_configs)
-        bc.unpack_userparams(arg1="haha")
-        self.assertEqual(bc.arg1, "haha")
+  def test_unpack_userparams_default_None(self):
+    bc = base_test.BaseTestClass(self.mock_test_cls_configs)
+    bc.unpack_userparams(arg1="haha")
+    self.assertEqual(bc.arg1, "haha")
 
-    def test_setup_generated_tests_failure(self):
-        """Test code path for setup_generated_tests failure.
+  def test_setup_generated_tests_failure(self):
+    """Test code path for setup_generated_tests failure.
 
-        When setup_generated_tests fails, pre-execution calculation is
-        incomplete and the number of tests requested is unknown. This is a
-        fatal issue that blocks any test execution in a class.
+    When setup_generated_tests fails, pre-execution calculation is
+    incomplete and the number of tests requested is unknown. This is a
+    fatal issue that blocks any test execution in a class.
 
-        A class level error record is generated.
-        Unlike `setup_class` failure, no test is considered "skipped" in this
-        case as execution stage never started.
-        """
+    A class level error record is generated.
+    Unlike `setup_class` failure, no test is considered "skipped" in this
+    case as execution stage never started.
+    """
 
-        class MockBaseTest(base_test.BaseTestClass):
-            def setup_generated_tests(self):
-                raise Exception(MSG_EXPECTED_EXCEPTION)
+    class MockBaseTest(base_test.BaseTestClass):
+      def setup_generated_tests(self):
+        raise Exception(MSG_EXPECTED_EXCEPTION)
 
-            def logic(self, a, b):
-                pass
+      def logic(self, a, b):
+        pass
 
-            def test_foo(self):
-                pass
+      def test_foo(self):
+        pass
 
-        bt_cls = MockBaseTest(self.mock_test_cls_configs)
-        bt_cls.run()
-        self.assertEqual(len(bt_cls.results.requested), 0)
-        class_record = bt_cls.results.error[0]
-        self.assertEqual(class_record.test_name, 'setup_generated_tests')
-        self.assertEqual(bt_cls.results.skipped, [])
+    bt_cls = MockBaseTest(self.mock_test_cls_configs)
+    bt_cls.run()
+    self.assertEqual(len(bt_cls.results.requested), 0)
+    class_record = bt_cls.results.error[0]
+    self.assertEqual(class_record.test_name, 'setup_generated_tests')
+    self.assertEqual(bt_cls.results.skipped, [])
 
-    def test_generate_tests_run(self):
-        class MockBaseTest(base_test.BaseTestClass):
-            def setup_generated_tests(self):
-                self.generate_tests(test_logic=self.logic,
-                                    name_func=self.name_gen,
-                                    arg_sets=[(1, 2), (3, 4)])
+  def test_generate_tests_run(self):
+    class MockBaseTest(base_test.BaseTestClass):
+      def setup_generated_tests(self):
+        self.generate_tests(test_logic=self.logic,
+                  name_func=self.name_gen,
+                  arg_sets=[(1, 2), (3, 4)])
 
-            def name_gen(self, a, b):
-                return 'test_%s_%s' % (a, b)
+      def name_gen(self, a, b):
+        return 'test_%s_%s' % (a, b)
 
-            def logic(self, a, b):
-                pass
+      def logic(self, a, b):
+        pass
 
-        bt_cls = MockBaseTest(self.mock_test_cls_configs)
-        bt_cls.run()
-        self.assertEqual(len(bt_cls.results.requested), 2)
-        self.assertEqual(len(bt_cls.results.passed), 2)
-        self.assertIsNone(bt_cls.results.passed[0].uid)
-        self.assertIsNone(bt_cls.results.passed[1].uid)
-        self.assertEqual(bt_cls.results.passed[0].test_name, 'test_1_2')
-        self.assertEqual(bt_cls.results.passed[1].test_name, 'test_3_4')
+    bt_cls = MockBaseTest(self.mock_test_cls_configs)
+    bt_cls.run()
+    self.assertEqual(len(bt_cls.results.requested), 2)
+    self.assertEqual(len(bt_cls.results.passed), 2)
+    self.assertIsNone(bt_cls.results.passed[0].uid)
+    self.assertIsNone(bt_cls.results.passed[1].uid)
+    self.assertEqual(bt_cls.results.passed[0].test_name, 'test_1_2')
+    self.assertEqual(bt_cls.results.passed[1].test_name, 'test_3_4')
 
-    def test_generate_tests_with_uid(self):
-        class MockBaseTest(base_test.BaseTestClass):
-            def setup_generated_tests(self):
-                self.generate_tests(test_logic=self.logic,
-                                    name_func=self.name_gen,
-                                    uid_func=self.uid_logic,
-                                    arg_sets=[(1, 2), (3, 4)])
+  def test_generate_tests_with_uid(self):
+    class MockBaseTest(base_test.BaseTestClass):
+      def setup_generated_tests(self):
+        self.generate_tests(test_logic=self.logic,
+                  name_func=self.name_gen,
+                  uid_func=self.uid_logic,
+                  arg_sets=[(1, 2), (3, 4)])
 
-            def name_gen(self, a, b):
-                return 'test_%s_%s' % (a, b)
+      def name_gen(self, a, b):
+        return 'test_%s_%s' % (a, b)
 
-            def uid_logic(self, a, b):
-                return 'uid-%s-%s' % (a, b)
+      def uid_logic(self, a, b):
+        return 'uid-%s-%s' % (a, b)
 
-            def logic(self, a, b):
-                pass
+      def logic(self, a, b):
+        pass
 
-        bt_cls = MockBaseTest(self.mock_test_cls_configs)
-        bt_cls.run()
-        self.assertEqual(bt_cls.results.passed[0].uid, 'uid-1-2')
-        self.assertEqual(bt_cls.results.passed[1].uid, 'uid-3-4')
+    bt_cls = MockBaseTest(self.mock_test_cls_configs)
+    bt_cls.run()
+    self.assertEqual(bt_cls.results.passed[0].uid, 'uid-1-2')
+    self.assertEqual(bt_cls.results.passed[1].uid, 'uid-3-4')
 
-    def test_generate_tests_with_none_uid(self):
-        class MockBaseTest(base_test.BaseTestClass):
-            def setup_generated_tests(self):
-                self.generate_tests(test_logic=self.logic,
-                                    name_func=self.name_gen,
-                                    uid_func=self.uid_logic,
-                                    arg_sets=[(1, 2), (3, 4)])
+  def test_generate_tests_with_none_uid(self):
+    class MockBaseTest(base_test.BaseTestClass):
+      def setup_generated_tests(self):
+        self.generate_tests(test_logic=self.logic,
+                  name_func=self.name_gen,
+                  uid_func=self.uid_logic,
+                  arg_sets=[(1, 2), (3, 4)])
 
-            def name_gen(self, a, b):
-                return 'test_%s_%s' % (a, b)
+      def name_gen(self, a, b):
+        return 'test_%s_%s' % (a, b)
 
-            def uid_logic(self, a, b):
-                if a == 1:
-                    return None
-                return 'uid-3-4'
+      def uid_logic(self, a, b):
+        if a == 1:
+          return None
+        return 'uid-3-4'
 
-            def logic(self, a, b):
-                pass
+      def logic(self, a, b):
+        pass
 
-        bt_cls = MockBaseTest(self.mock_test_cls_configs)
-        bt_cls.run()
-        self.assertIsNone(bt_cls.results.passed[0].uid)
-        self.assertEqual(bt_cls.results.passed[1].uid, 'uid-3-4')
+    bt_cls = MockBaseTest(self.mock_test_cls_configs)
+    bt_cls.run()
+    self.assertIsNone(bt_cls.results.passed[0].uid)
+    self.assertEqual(bt_cls.results.passed[1].uid, 'uid-3-4')
 
-    def test_generate_tests_selected_run(self):
-        class MockBaseTest(base_test.BaseTestClass):
-            def setup_generated_tests(self):
-                self.generate_tests(test_logic=self.logic,
-                                    name_func=self.name_gen,
-                                    arg_sets=[(1, 2), (3, 4)])
+  def test_generate_tests_selected_run(self):
+    class MockBaseTest(base_test.BaseTestClass):
+      def setup_generated_tests(self):
+        self.generate_tests(test_logic=self.logic,
+                  name_func=self.name_gen,
+                  arg_sets=[(1, 2), (3, 4)])
 
-            def name_gen(self, a, b):
-                return 'test_%s_%s' % (a, b)
+      def name_gen(self, a, b):
+        return 'test_%s_%s' % (a, b)
 
-            def logic(self, a, b):
-                pass
+      def logic(self, a, b):
+        pass
 
-        bt_cls = MockBaseTest(self.mock_test_cls_configs)
-        bt_cls.run(test_names=['test_3_4'])
-        self.assertEqual(len(bt_cls.results.requested), 1)
-        self.assertEqual(len(bt_cls.results.passed), 1)
-        self.assertEqual(bt_cls.results.passed[0].test_name, 'test_3_4')
+    bt_cls = MockBaseTest(self.mock_test_cls_configs)
+    bt_cls.run(test_names=['test_3_4'])
+    self.assertEqual(len(bt_cls.results.requested), 1)
+    self.assertEqual(len(bt_cls.results.passed), 1)
+    self.assertEqual(bt_cls.results.passed[0].test_name, 'test_3_4')
 
-    def test_generate_tests_call_outside_of_setup_generated_tests(self):
-        class MockBaseTest(base_test.BaseTestClass):
-            def test_ha(self):
-                self.generate_tests(test_logic=self.logic,
-                                    name_func=self.name_gen,
-                                    arg_sets=[(1, 2), (3, 4)])
+  def test_generate_tests_call_outside_of_setup_generated_tests(self):
+    class MockBaseTest(base_test.BaseTestClass):
+      def test_ha(self):
+        self.generate_tests(test_logic=self.logic,
+                  name_func=self.name_gen,
+                  arg_sets=[(1, 2), (3, 4)])
 
-            def name_gen(self, a, b):
-                return 'test_%s_%s' % (a, b)
+      def name_gen(self, a, b):
+        return 'test_%s_%s' % (a, b)
 
-            def logic(self, a, b):
-                pass
+      def logic(self, a, b):
+        pass
 
-        bt_cls = MockBaseTest(self.mock_test_cls_configs)
-        bt_cls.run()
-        actual_record = bt_cls.results.error[0]
-        utils.validate_test_result(bt_cls.results)
-        self.assertEqual(actual_record.test_name, "test_ha")
-        self.assertEqual(
-            actual_record.details,
-            '"generate_tests" cannot be called outside of setup_generated_tests'
-        )
-        expected_summary = ("Error 1, Executed 1, Failed 0, Passed 0, "
-                            "Requested 1, Skipped 0")
-        self.assertEqual(bt_cls.results.summary_str(), expected_summary)
+    bt_cls = MockBaseTest(self.mock_test_cls_configs)
+    bt_cls.run()
+    actual_record = bt_cls.results.error[0]
+    utils.validate_test_result(bt_cls.results)
+    self.assertEqual(actual_record.test_name, "test_ha")
+    self.assertEqual(
+      actual_record.details,
+      '"generate_tests" cannot be called outside of setup_generated_tests'
+    )
+    expected_summary = ("Error 1, Executed 1, Failed 0, Passed 0, "
+              "Requested 1, Skipped 0")
+    self.assertEqual(bt_cls.results.summary_str(), expected_summary)
 
-    def test_generate_tests_dup_test_name(self):
-        class MockBaseTest(base_test.BaseTestClass):
-            def setup_generated_tests(self):
-                self.generate_tests(test_logic=self.logic,
-                                    name_func=self.name_gen,
-                                    arg_sets=[(1, 2), (3, 4)])
+  def test_generate_tests_dup_test_name(self):
+    class MockBaseTest(base_test.BaseTestClass):
+      def setup_generated_tests(self):
+        self.generate_tests(test_logic=self.logic,
+                  name_func=self.name_gen,
+                  arg_sets=[(1, 2), (3, 4)])
 
-            def name_gen(self, a, b):
-                return 'ha'
+      def name_gen(self, a, b):
+        return 'ha'
 
-            def logic(self, a, b):
-                pass
+      def logic(self, a, b):
+        pass
 
-        bt_cls = MockBaseTest(self.mock_test_cls_configs)
-        bt_cls.run()
-        actual_record = bt_cls.results.error[0]
-        self.assertEqual(actual_record.test_name, "setup_generated_tests")
-        self.assertEqual(
-            actual_record.details,
-            'During test generation of "logic": Test name "ha" already exists'
-            ', cannot be duplicated!')
-        expected_summary = ("Error 1, Executed 0, Failed 0, Passed 0, "
-                            "Requested 0, Skipped 0")
-        self.assertEqual(bt_cls.results.summary_str(), expected_summary)
+    bt_cls = MockBaseTest(self.mock_test_cls_configs)
+    bt_cls.run()
+    actual_record = bt_cls.results.error[0]
+    self.assertEqual(actual_record.test_name, "setup_generated_tests")
+    self.assertEqual(
+      actual_record.details,
+      'During test generation of "logic": Test name "ha" already exists'
+      ', cannot be duplicated!')
+    expected_summary = ("Error 1, Executed 0, Failed 0, Passed 0, "
+              "Requested 0, Skipped 0")
+    self.assertEqual(bt_cls.results.summary_str(), expected_summary)
 
-    def test_write_user_data(self):
-        content = {'a': 1}
+  def test_write_user_data(self):
+    content = {'a': 1}
 
-        class MockBaseTest(base_test.BaseTestClass):
-            def test_something(self):
-                self.record_data(content)
+    class MockBaseTest(base_test.BaseTestClass):
+      def test_something(self):
+        self.record_data(content)
 
-        bt_cls = MockBaseTest(self.mock_test_cls_configs)
-        bt_cls.run(test_names=["test_something"])
-        actual_record = bt_cls.results.passed[0]
-        self.assertEqual(actual_record.test_name, "test_something")
-        hit = False
-        with io.open(self.summary_file, 'r', encoding='utf-8') as f:
-            for c in yaml.safe_load_all(f):
-                if c['Type'] != records.TestSummaryEntryType.USER_DATA.value:
-                    continue
-                hit = True
-                self.assertEqual(c['a'], content['a'])
-                self.assertIsNotNone(c['timestamp'])
-        self.assertTrue(hit)
+    bt_cls = MockBaseTest(self.mock_test_cls_configs)
+    bt_cls.run(test_names=["test_something"])
+    actual_record = bt_cls.results.passed[0]
+    self.assertEqual(actual_record.test_name, "test_something")
+    hit = False
+    with io.open(self.summary_file, 'r', encoding='utf-8') as f:
+      for c in yaml.safe_load_all(f):
+        if c['Type'] != records.TestSummaryEntryType.USER_DATA.value:
+          continue
+        hit = True
+        self.assertEqual(c['a'], content['a'])
+        self.assertIsNotNone(c['timestamp'])
+    self.assertTrue(hit)
 
-    def test_record_controller_info(self):
-        """Verifies that controller info is correctly recorded.
+  def test_record_controller_info(self):
+    """Verifies that controller info is correctly recorded.
 
-        1. Info added in test is recorded.
-        2. Info of multiple controller types are recorded.
-        """
-        mock_test_config = self.mock_test_cls_configs.copy()
-        mock_ctrlr_config_name = mock_controller.MOBLY_CONTROLLER_CONFIG_NAME
-        mock_ctrlr_2_config_name = mock_second_controller.MOBLY_CONTROLLER_CONFIG_NAME
-        my_config = [{'serial': 'xxxx', 'magic': 'Magic'}]
-        mock_test_config.controller_configs[mock_ctrlr_config_name] = my_config
-        mock_test_config.controller_configs[
-            mock_ctrlr_2_config_name] = copy.copy(my_config)
+    1. Info added in test is recorded.
+    2. Info of multiple controller types are recorded.
+    """
+    mock_test_config = self.mock_test_cls_configs.copy()
+    mock_ctrlr_config_name = mock_controller.MOBLY_CONTROLLER_CONFIG_NAME
+    mock_ctrlr_2_config_name = mock_second_controller.MOBLY_CONTROLLER_CONFIG_NAME
+    my_config = [{'serial': 'xxxx', 'magic': 'Magic'}]
+    mock_test_config.controller_configs[mock_ctrlr_config_name] = my_config
+    mock_test_config.controller_configs[
+      mock_ctrlr_2_config_name] = copy.copy(my_config)
 
-        class ControllerInfoTest(base_test.BaseTestClass):
-            """Registers two different controller types and modifies controller
-            info at runtime.
-            """
+    class ControllerInfoTest(base_test.BaseTestClass):
+      """Registers two different controller types and modifies controller
+      info at runtime.
+      """
 
-            def setup_class(self):
-                self.register_controller(mock_controller)
-                second_controller = self.register_controller(
-                    mock_second_controller)[0]
-                # This should appear in recorded controller info.
-                second_controller.set_magic('haha')
+      def setup_class(self):
+        self.register_controller(mock_controller)
+        second_controller = self.register_controller(
+          mock_second_controller)[0]
+        # This should appear in recorded controller info.
+        second_controller.set_magic('haha')
 
-            def test_func(self):
-                pass
+      def test_func(self):
+        pass
 
-        bt_cls = ControllerInfoTest(mock_test_config)
-        bt_cls.run()
-        info1 = bt_cls.results.controller_info[0]
-        info2 = bt_cls.results.controller_info[1]
-        self.assertNotEqual(info1, info2)
-        self.assertEqual(info1.test_class, 'ControllerInfoTest')
-        self.assertEqual(info1.controller_name, 'MagicDevice')
-        self.assertEqual(info1.controller_info, [{
-            'MyMagic': {
-                'magic': 'Magic'
-            }
-        }])
-        self.assertEqual(info2.test_class, 'ControllerInfoTest')
-        self.assertEqual(info2.controller_name, 'AnotherMagicDevice')
-        self.assertEqual(info2.controller_info, [{
-            'MyOtherMagic': {
-                'magic': 'Magic',
-                'extra_magic': 'haha'
-            }
-        }])
+    bt_cls = ControllerInfoTest(mock_test_config)
+    bt_cls.run()
+    info1 = bt_cls.results.controller_info[0]
+    info2 = bt_cls.results.controller_info[1]
+    self.assertNotEqual(info1, info2)
+    self.assertEqual(info1.test_class, 'ControllerInfoTest')
+    self.assertEqual(info1.controller_name, 'MagicDevice')
+    self.assertEqual(info1.controller_info, [{
+      'MyMagic': {
+        'magic': 'Magic'
+      }
+    }])
+    self.assertEqual(info2.test_class, 'ControllerInfoTest')
+    self.assertEqual(info2.controller_name, 'AnotherMagicDevice')
+    self.assertEqual(info2.controller_info, [{
+      'MyOtherMagic': {
+        'magic': 'Magic',
+        'extra_magic': 'haha'
+      }
+    }])
 
-    def test_record_controller_info_fail(self):
-        mock_test_config = self.mock_test_cls_configs.copy()
-        mock_ctrlr_config_name = mock_controller.MOBLY_CONTROLLER_CONFIG_NAME
-        mock_ctrlr_2_config_name = mock_second_controller.MOBLY_CONTROLLER_CONFIG_NAME
-        my_config = [{'serial': 'xxxx', 'magic': 'Magic'}]
-        mock_test_config.controller_configs[mock_ctrlr_config_name] = my_config
-        mock_test_config.controller_configs[
-            mock_ctrlr_2_config_name] = copy.copy(my_config)
+  def test_record_controller_info_fail(self):
+    mock_test_config = self.mock_test_cls_configs.copy()
+    mock_ctrlr_config_name = mock_controller.MOBLY_CONTROLLER_CONFIG_NAME
+    mock_ctrlr_2_config_name = mock_second_controller.MOBLY_CONTROLLER_CONFIG_NAME
+    my_config = [{'serial': 'xxxx', 'magic': 'Magic'}]
+    mock_test_config.controller_configs[mock_ctrlr_config_name] = my_config
+    mock_test_config.controller_configs[
+      mock_ctrlr_2_config_name] = copy.copy(my_config)
 
-        class ControllerInfoTest(base_test.BaseTestClass):
-            """Registers two different controller types and modifies controller
-            info at runtime.
-            """
+    class ControllerInfoTest(base_test.BaseTestClass):
+      """Registers two different controller types and modifies controller
+      info at runtime.
+      """
 
-            def setup_class(self):
-                device = self.register_controller(mock_controller)[0]
-                device.who_am_i = mock.MagicMock()
-                device.who_am_i.side_effect = Exception('Some failure')
-                second_controller = self.register_controller(
-                    mock_second_controller)[0]
-                # This should appear in recorded controller info.
-                second_controller.set_magic('haha')
+      def setup_class(self):
+        device = self.register_controller(mock_controller)[0]
+        device.who_am_i = mock.MagicMock()
+        device.who_am_i.side_effect = Exception('Some failure')
+        second_controller = self.register_controller(
+          mock_second_controller)[0]
+        # This should appear in recorded controller info.
+        second_controller.set_magic('haha')
 
-            def test_func(self):
-                pass
+      def test_func(self):
+        pass
 
-        bt_cls = ControllerInfoTest(mock_test_config)
-        bt_cls.run()
-        info = bt_cls.results.controller_info[0]
-        self.assertEqual(len(bt_cls.results.controller_info), 1)
-        self.assertEqual(info.test_class, 'ControllerInfoTest')
-        self.assertEqual(info.controller_name, 'AnotherMagicDevice')
-        self.assertEqual(info.controller_info, [{
-            'MyOtherMagic': {
-                'magic': 'Magic',
-                'extra_magic': 'haha'
-            }
-        }])
-        record = bt_cls.results.error[0]
-        print(record.to_dict())
-        self.assertEqual(record.test_name, 'clean_up')
-        self.assertIsNotNone(record.begin_time)
-        self.assertIsNotNone(record.end_time)
-        expected_msg = ('Failed to collect controller info from '
-                        'mock_controller: Some failure')
-        self.assertEqual(record.details, expected_msg)
+    bt_cls = ControllerInfoTest(mock_test_config)
+    bt_cls.run()
+    info = bt_cls.results.controller_info[0]
+    self.assertEqual(len(bt_cls.results.controller_info), 1)
+    self.assertEqual(info.test_class, 'ControllerInfoTest')
+    self.assertEqual(info.controller_name, 'AnotherMagicDevice')
+    self.assertEqual(info.controller_info, [{
+      'MyOtherMagic': {
+        'magic': 'Magic',
+        'extra_magic': 'haha'
+      }
+    }])
+    record = bt_cls.results.error[0]
+    print(record.to_dict())
+    self.assertEqual(record.test_name, 'clean_up')
+    self.assertIsNotNone(record.begin_time)
+    self.assertIsNotNone(record.end_time)
+    expected_msg = ('Failed to collect controller info from '
+            'mock_controller: Some failure')
+    self.assertEqual(record.details, expected_msg)
 
-    def test_uid(self):
-        class MockBaseTest(base_test.BaseTestClass):
-            @records.uid('some-uid')
-            def test_func(self):
-                pass
+  def test_uid(self):
+    class MockBaseTest(base_test.BaseTestClass):
+      @records.uid('some-uid')
+      def test_func(self):
+        pass
 
-        bt_cls = MockBaseTest(self.mock_test_cls_configs)
-        bt_cls.run()
-        actual_record = bt_cls.results.passed[0]
-        self.assertEqual(actual_record.uid, 'some-uid')
+    bt_cls = MockBaseTest(self.mock_test_cls_configs)
+    bt_cls.run()
+    actual_record = bt_cls.results.passed[0]
+    self.assertEqual(actual_record.uid, 'some-uid')
 
-    def test_uid_not_specified(self):
-        class MockBaseTest(base_test.BaseTestClass):
-            def test_func(self):
-                pass
+  def test_uid_not_specified(self):
+    class MockBaseTest(base_test.BaseTestClass):
+      def test_func(self):
+        pass
 
-        bt_cls = MockBaseTest(self.mock_test_cls_configs)
-        bt_cls.run()
-        actual_record = bt_cls.results.passed[0]
-        self.assertIsNone(actual_record.uid)
+    bt_cls = MockBaseTest(self.mock_test_cls_configs)
+    bt_cls.run()
+    actual_record = bt_cls.results.passed[0]
+    self.assertIsNone(actual_record.uid)
 
-    def test_uid_is_none(self):
-        with self.assertRaisesRegex(ValueError, 'UID cannot be None.'):
+  def test_uid_is_none(self):
+    with self.assertRaisesRegex(ValueError, 'UID cannot be None.'):
 
-            class MockBaseTest(base_test.BaseTestClass):
-                @records.uid(None)
-                def not_a_test(self):
-                    pass
+      class MockBaseTest(base_test.BaseTestClass):
+        @records.uid(None)
+        def not_a_test(self):
+          pass
 
-    def test_log_stage_always_logs_end_statement(self):
-        instance = base_test.BaseTestClass(self.mock_test_cls_configs)
-        instance.current_test_info = mock.Mock()
-        instance.current_test_info.name = 'TestClass'
+  def test_log_stage_always_logs_end_statement(self):
+    instance = base_test.BaseTestClass(self.mock_test_cls_configs)
+    instance.current_test_info = mock.Mock()
+    instance.current_test_info.name = 'TestClass'
 
-        class RecoverableError(Exception):
-            pass
+    class RecoverableError(Exception):
+      pass
 
-        with mock.patch('mobly.base_test.logging') as logging_patch:
-            try:
-                with instance._log_test_stage('stage'):
-                    raise RecoverableError('Force stage to fail.')
-            except RecoverableError:
-                pass
+    with mock.patch('mobly.base_test.logging') as logging_patch:
+      try:
+        with instance._log_test_stage('stage'):
+          raise RecoverableError('Force stage to fail.')
+      except RecoverableError:
+        pass
 
-        logging_patch.debug.assert_called_with('[TestClass]#stage <<< END <<<')
+    logging_patch.debug.assert_called_with('[TestClass]#stage <<< END <<<')
 
 
 if __name__ == "__main__":
-    unittest.main()
+  unittest.main()
diff --git a/tests/mobly/config_parser_test.py b/tests/mobly/config_parser_test.py
index 59cd1d2..2fc8b7d 100644
--- a/tests/mobly/config_parser_test.py
+++ b/tests/mobly/config_parser_test.py
@@ -22,59 +22,59 @@
 
 
 class OutputTest(unittest.TestCase):
-    """This test class has unit tests for the implementation of Mobly's output
-    files.
-    """
+  """This test class has unit tests for the implementation of Mobly's output
+  files.
+  """
 
-    def setUp(self):
-        self.tmp_dir = tempfile.mkdtemp()
+  def setUp(self):
+    self.tmp_dir = tempfile.mkdtemp()
 
-    def tearDown(self):
-        shutil.rmtree(self.tmp_dir)
+  def tearDown(self):
+    shutil.rmtree(self.tmp_dir)
 
-    def test__load_config_file(self):
-        tmp_file_path = os.path.join(self.tmp_dir, 'config.yml')
-        with io.open(tmp_file_path, 'w', encoding='utf-8') as f:
-            f.write(u'TestBeds:\n')
-            f.write(u'  # A test bed where adb will find Android devices.\n')
-            f.write(u'  - Name: SampleTestBed\n')
-            f.write(u'    Controllers:\n')
-            f.write(u'        AndroidDevice: \'*\'\n')
+  def test__load_config_file(self):
+    tmp_file_path = os.path.join(self.tmp_dir, 'config.yml')
+    with io.open(tmp_file_path, 'w', encoding='utf-8') as f:
+      f.write(u'TestBeds:\n')
+      f.write(u'  # A test bed where adb will find Android devices.\n')
+      f.write(u'  - Name: SampleTestBed\n')
+      f.write(u'    Controllers:\n')
+      f.write(u'        AndroidDevice: \'*\'\n')
 
-        config = config_parser._load_config_file(tmp_file_path)
-        self.assertEqual(config['TestBeds'][0]['Name'], u'SampleTestBed')
+    config = config_parser._load_config_file(tmp_file_path)
+    self.assertEqual(config['TestBeds'][0]['Name'], u'SampleTestBed')
 
-    def test__load_config_file_with_unicode(self):
-        tmp_file_path = os.path.join(self.tmp_dir, 'config.yml')
-        with io.open(tmp_file_path, 'w', encoding='utf-8') as f:
-            f.write(u'TestBeds:\n')
-            f.write(u'  # A test bed where adb will find Android devices.\n')
-            f.write(u'  - Name: \u901a\n')
-            f.write(u'    Controllers:\n')
-            f.write(u'        AndroidDevice: \'*\'\n')
+  def test__load_config_file_with_unicode(self):
+    tmp_file_path = os.path.join(self.tmp_dir, 'config.yml')
+    with io.open(tmp_file_path, 'w', encoding='utf-8') as f:
+      f.write(u'TestBeds:\n')
+      f.write(u'  # A test bed where adb will find Android devices.\n')
+      f.write(u'  - Name: \u901a\n')
+      f.write(u'    Controllers:\n')
+      f.write(u'        AndroidDevice: \'*\'\n')
 
-        config = config_parser._load_config_file(tmp_file_path)
-        self.assertEqual(config['TestBeds'][0]['Name'], u'\u901a')
+    config = config_parser._load_config_file(tmp_file_path)
+    self.assertEqual(config['TestBeds'][0]['Name'], u'\u901a')
 
-    def test_run_config_type(self):
-        config = config_parser.TestRunConfig()
-        self.assertNotIn('summary_writer', str(config))
-        self.assertNotIn('register_controller', str(config))
+  def test_run_config_type(self):
+    config = config_parser.TestRunConfig()
+    self.assertNotIn('summary_writer', str(config))
+    self.assertNotIn('register_controller', str(config))
 
-    def test_run_config_controller_configs_is_already_initialized(self):
-        config = config_parser.TestRunConfig()
-        expected_value = 'SOME_VALUE'
-        self.assertEqual(
-            config.controller_configs.get('NON_EXISTENT_KEY', expected_value),
-            expected_value)
+  def test_run_config_controller_configs_is_already_initialized(self):
+    config = config_parser.TestRunConfig()
+    expected_value = 'SOME_VALUE'
+    self.assertEqual(
+      config.controller_configs.get('NON_EXISTENT_KEY', expected_value),
+      expected_value)
 
-    def test_run_config_user_params_is_already_initialized(self):
-        config = config_parser.TestRunConfig()
-        expected_value = 'SOME_VALUE'
-        self.assertEqual(
-            config.user_params.get('NON_EXISTENT_KEY', expected_value),
-            expected_value)
+  def test_run_config_user_params_is_already_initialized(self):
+    config = config_parser.TestRunConfig()
+    expected_value = 'SOME_VALUE'
+    self.assertEqual(
+      config.user_params.get('NON_EXISTENT_KEY', expected_value),
+      expected_value)
 
 
 if __name__ == '__main__':
-    unittest.main()
+  unittest.main()
diff --git a/tests/mobly/controller_manager_test.py b/tests/mobly/controller_manager_test.py
index 6bfb6b7..130a464 100755
--- a/tests/mobly/controller_manager_test.py
+++ b/tests/mobly/controller_manager_test.py
@@ -23,216 +23,216 @@
 
 
 class ControllerManagerTest(unittest.TestCase):
-    """Unit tests for Mobly's ControllerManager."""
+  """Unit tests for Mobly's ControllerManager."""
 
-    def test_verify_controller_module(self):
+  def test_verify_controller_module(self):
+    controller_manager.verify_controller_module(mock_controller)
+
+  def test_verify_controller_module_null_attr(self):
+    try:
+      tmp = mock_controller.MOBLY_CONTROLLER_CONFIG_NAME
+      mock_controller.MOBLY_CONTROLLER_CONFIG_NAME = None
+      msg = 'Controller interface .* in .* cannot be null.'
+      with self.assertRaisesRegex(signals.ControllerError, msg):
         controller_manager.verify_controller_module(mock_controller)
+    finally:
+      mock_controller.MOBLY_CONTROLLER_CONFIG_NAME = tmp
 
-    def test_verify_controller_module_null_attr(self):
-        try:
-            tmp = mock_controller.MOBLY_CONTROLLER_CONFIG_NAME
-            mock_controller.MOBLY_CONTROLLER_CONFIG_NAME = None
-            msg = 'Controller interface .* in .* cannot be null.'
-            with self.assertRaisesRegex(signals.ControllerError, msg):
-                controller_manager.verify_controller_module(mock_controller)
-        finally:
-            mock_controller.MOBLY_CONTROLLER_CONFIG_NAME = tmp
+  def test_verify_controller_module_missing_attr(self):
+    try:
+      tmp = mock_controller.MOBLY_CONTROLLER_CONFIG_NAME
+      delattr(mock_controller, 'MOBLY_CONTROLLER_CONFIG_NAME')
+      msg = 'Module .* missing required controller module attribute'
+      with self.assertRaisesRegex(signals.ControllerError, msg):
+        controller_manager.verify_controller_module(mock_controller)
+    finally:
+      setattr(mock_controller, 'MOBLY_CONTROLLER_CONFIG_NAME', tmp)
 
-    def test_verify_controller_module_missing_attr(self):
-        try:
-            tmp = mock_controller.MOBLY_CONTROLLER_CONFIG_NAME
-            delattr(mock_controller, 'MOBLY_CONTROLLER_CONFIG_NAME')
-            msg = 'Module .* missing required controller module attribute'
-            with self.assertRaisesRegex(signals.ControllerError, msg):
-                controller_manager.verify_controller_module(mock_controller)
-        finally:
-            setattr(mock_controller, 'MOBLY_CONTROLLER_CONFIG_NAME', tmp)
+  def test_register_controller_no_config(self):
+    c_manager = controller_manager.ControllerManager('SomeClass', {})
+    with self.assertRaisesRegex(signals.ControllerError,
+                  'No corresponding config found for'):
+      c_manager.register_controller(mock_controller)
 
-    def test_register_controller_no_config(self):
-        c_manager = controller_manager.ControllerManager('SomeClass', {})
-        with self.assertRaisesRegex(signals.ControllerError,
-                                    'No corresponding config found for'):
-            c_manager.register_controller(mock_controller)
+  def test_register_controller_no_config_for_not_required(self):
+    c_manager = controller_manager.ControllerManager('SomeClass', {})
+    self.assertIsNone(
+      c_manager.register_controller(mock_controller, required=False))
 
-    def test_register_controller_no_config_for_not_required(self):
-        c_manager = controller_manager.ControllerManager('SomeClass', {})
-        self.assertIsNone(
-            c_manager.register_controller(mock_controller, required=False))
+  def test_register_controller_dup_register(self):
+    """Verifies correctness of registration, internal tally of controllers
+    objects, and the right error happen when a controller module is
+    registered twice.
+    """
+    mock_ctrlr_config_name = mock_controller.MOBLY_CONTROLLER_CONFIG_NAME
+    controller_configs = {mock_ctrlr_config_name: ['magic1', 'magic2']}
+    c_manager = controller_manager.ControllerManager(
+      'SomeClass', controller_configs)
+    c_manager.register_controller(mock_controller)
+    registered_name = 'mock_controller'
+    self.assertTrue(registered_name in c_manager._controller_objects)
+    mock_ctrlrs = c_manager._controller_objects[registered_name]
+    self.assertEqual(mock_ctrlrs[0].magic, 'magic1')
+    self.assertEqual(mock_ctrlrs[1].magic, 'magic2')
+    self.assertTrue(c_manager._controller_modules[registered_name])
+    expected_msg = 'Controller module .* has already been registered.'
+    with self.assertRaisesRegex(signals.ControllerError, expected_msg):
+      c_manager.register_controller(mock_controller)
 
-    def test_register_controller_dup_register(self):
-        """Verifies correctness of registration, internal tally of controllers
-        objects, and the right error happen when a controller module is
-        registered twice.
-        """
-        mock_ctrlr_config_name = mock_controller.MOBLY_CONTROLLER_CONFIG_NAME
-        controller_configs = {mock_ctrlr_config_name: ['magic1', 'magic2']}
-        c_manager = controller_manager.ControllerManager(
-            'SomeClass', controller_configs)
-        c_manager.register_controller(mock_controller)
-        registered_name = 'mock_controller'
-        self.assertTrue(registered_name in c_manager._controller_objects)
-        mock_ctrlrs = c_manager._controller_objects[registered_name]
-        self.assertEqual(mock_ctrlrs[0].magic, 'magic1')
-        self.assertEqual(mock_ctrlrs[1].magic, 'magic2')
-        self.assertTrue(c_manager._controller_modules[registered_name])
-        expected_msg = 'Controller module .* has already been registered.'
-        with self.assertRaisesRegex(signals.ControllerError, expected_msg):
-            c_manager.register_controller(mock_controller)
+  def test_register_controller_return_value(self):
+    mock_ctrlr_config_name = mock_controller.MOBLY_CONTROLLER_CONFIG_NAME
+    controller_configs = {mock_ctrlr_config_name: ['magic1', 'magic2']}
+    c_manager = controller_manager.ControllerManager(
+      'SomeClass', controller_configs)
+    magic_devices = c_manager.register_controller(mock_controller)
+    self.assertEqual(magic_devices[0].magic, 'magic1')
+    self.assertEqual(magic_devices[1].magic, 'magic2')
 
-    def test_register_controller_return_value(self):
-        mock_ctrlr_config_name = mock_controller.MOBLY_CONTROLLER_CONFIG_NAME
-        controller_configs = {mock_ctrlr_config_name: ['magic1', 'magic2']}
-        c_manager = controller_manager.ControllerManager(
-            'SomeClass', controller_configs)
-        magic_devices = c_manager.register_controller(mock_controller)
-        self.assertEqual(magic_devices[0].magic, 'magic1')
-        self.assertEqual(magic_devices[1].magic, 'magic2')
+  def test_register_controller_change_return_value(self):
+    mock_ctrlr_config_name = mock_controller.MOBLY_CONTROLLER_CONFIG_NAME
+    controller_configs = {mock_ctrlr_config_name: ['magic1', 'magic2']}
+    c_manager = controller_manager.ControllerManager(
+      'SomeClass', controller_configs)
+    magic_devices = c_manager.register_controller(mock_controller)
+    magic1 = magic_devices.pop(0)
+    self.assertIs(magic1,
+            c_manager._controller_objects['mock_controller'][0])
+    self.assertEqual(
+      len(c_manager._controller_objects['mock_controller']), 2)
 
-    def test_register_controller_change_return_value(self):
-        mock_ctrlr_config_name = mock_controller.MOBLY_CONTROLLER_CONFIG_NAME
-        controller_configs = {mock_ctrlr_config_name: ['magic1', 'magic2']}
-        c_manager = controller_manager.ControllerManager(
-            'SomeClass', controller_configs)
-        magic_devices = c_manager.register_controller(mock_controller)
-        magic1 = magic_devices.pop(0)
-        self.assertIs(magic1,
-                      c_manager._controller_objects['mock_controller'][0])
-        self.assertEqual(
-            len(c_manager._controller_objects['mock_controller']), 2)
+  def test_register_controller_less_than_min_number(self):
+    mock_ctrlr_config_name = mock_controller.MOBLY_CONTROLLER_CONFIG_NAME
+    controller_configs = {mock_ctrlr_config_name: ['magic1', 'magic2']}
+    c_manager = controller_manager.ControllerManager(
+      'SomeClass', controller_configs)
+    expected_msg = 'Expected to get at least 3 controller objects, got 2.'
+    with self.assertRaisesRegex(signals.ControllerError, expected_msg):
+      c_manager.register_controller(mock_controller, min_number=3)
 
-    def test_register_controller_less_than_min_number(self):
-        mock_ctrlr_config_name = mock_controller.MOBLY_CONTROLLER_CONFIG_NAME
-        controller_configs = {mock_ctrlr_config_name: ['magic1', 'magic2']}
-        c_manager = controller_manager.ControllerManager(
-            'SomeClass', controller_configs)
-        expected_msg = 'Expected to get at least 3 controller objects, got 2.'
-        with self.assertRaisesRegex(signals.ControllerError, expected_msg):
-            c_manager.register_controller(mock_controller, min_number=3)
+  @mock.patch('yaml.dump', side_effect=TypeError('ha'))
+  def test_get_controller_info_record_not_serializable(self, _):
+    mock_ctrlr_config_name = mock_controller.MOBLY_CONTROLLER_CONFIG_NAME
+    controller_configs = {mock_ctrlr_config_name: ['magic1', 'magic2']}
+    c_manager = controller_manager.ControllerManager(
+      'SomeClass', controller_configs)
+    c_manager.register_controller(mock_controller)
+    record = c_manager.get_controller_info_records()[0]
+    actual_controller_info = record.controller_info
+    self.assertEqual(actual_controller_info,
+             "[{'MyMagic': 'magic1'}, {'MyMagic': 'magic2'}]")
 
-    @mock.patch('yaml.dump', side_effect=TypeError('ha'))
-    def test_get_controller_info_record_not_serializable(self, _):
-        mock_ctrlr_config_name = mock_controller.MOBLY_CONTROLLER_CONFIG_NAME
-        controller_configs = {mock_ctrlr_config_name: ['magic1', 'magic2']}
-        c_manager = controller_manager.ControllerManager(
-            'SomeClass', controller_configs)
-        c_manager.register_controller(mock_controller)
-        record = c_manager.get_controller_info_records()[0]
-        actual_controller_info = record.controller_info
-        self.assertEqual(actual_controller_info,
-                         "[{'MyMagic': 'magic1'}, {'MyMagic': 'magic2'}]")
+  def test_controller_record_exists_without_get_info(self):
+    mock_ctrlr_config_name = mock_controller.MOBLY_CONTROLLER_CONFIG_NAME
+    controller_configs = {mock_ctrlr_config_name: ['magic1', 'magic2']}
+    c_manager = controller_manager.ControllerManager(
+      'SomeClass', controller_configs)
+    get_info = getattr(mock_controller, 'get_info')
+    delattr(mock_controller, 'get_info')
+    try:
+      c_manager.register_controller(mock_controller)
+      record = c_manager.get_controller_info_records()[0]
+      self.assertIsNone(record.controller_info)
+      self.assertEqual(record.test_class, 'SomeClass')
+      self.assertEqual(record.controller_name, 'MagicDevice')
+    finally:
+      setattr(mock_controller, 'get_info', get_info)
 
-    def test_controller_record_exists_without_get_info(self):
-        mock_ctrlr_config_name = mock_controller.MOBLY_CONTROLLER_CONFIG_NAME
-        controller_configs = {mock_ctrlr_config_name: ['magic1', 'magic2']}
-        c_manager = controller_manager.ControllerManager(
-            'SomeClass', controller_configs)
-        get_info = getattr(mock_controller, 'get_info')
-        delattr(mock_controller, 'get_info')
-        try:
-            c_manager.register_controller(mock_controller)
-            record = c_manager.get_controller_info_records()[0]
-            self.assertIsNone(record.controller_info)
-            self.assertEqual(record.test_class, 'SomeClass')
-            self.assertEqual(record.controller_name, 'MagicDevice')
-        finally:
-            setattr(mock_controller, 'get_info', get_info)
+  @mock.patch('tests.lib.mock_controller.get_info')
+  def test_get_controller_info_records_empty(self, mock_get_info_func):
+    mock_get_info_func.return_value = None
+    mock_ctrlr_config_name = mock_controller.MOBLY_CONTROLLER_CONFIG_NAME
+    controller_configs = {mock_ctrlr_config_name: ['magic1', 'magic2']}
+    c_manager = controller_manager.ControllerManager(
+      'SomeClass', controller_configs)
+    c_manager.register_controller(mock_controller)
+    record = c_manager.get_controller_info_records()[0]
+    self.assertIsNone(record.controller_info)
+    self.assertEqual(record.test_class, 'SomeClass')
+    self.assertEqual(record.controller_name, 'MagicDevice')
 
-    @mock.patch('tests.lib.mock_controller.get_info')
-    def test_get_controller_info_records_empty(self, mock_get_info_func):
-        mock_get_info_func.return_value = None
-        mock_ctrlr_config_name = mock_controller.MOBLY_CONTROLLER_CONFIG_NAME
-        controller_configs = {mock_ctrlr_config_name: ['magic1', 'magic2']}
-        c_manager = controller_manager.ControllerManager(
-            'SomeClass', controller_configs)
-        c_manager.register_controller(mock_controller)
-        record = c_manager.get_controller_info_records()[0]
-        self.assertIsNone(record.controller_info)
-        self.assertEqual(record.test_class, 'SomeClass')
-        self.assertEqual(record.controller_name, 'MagicDevice')
+  @mock.patch('mobly.expects._ExpectErrorRecorder.add_error')
+  @mock.patch('tests.lib.mock_controller.get_info')
+  def test_get_controller_info_records_error(self, mock_get_info_func,
+                         mock_add_error):
+    mock_get_info_func.side_effect = Exception('Record info failed.')
+    mock_ctrlr_config_name = mock_controller.MOBLY_CONTROLLER_CONFIG_NAME
+    controller_configs = {mock_ctrlr_config_name: ['magic1', 'magic2']}
+    c_manager = controller_manager.ControllerManager(
+      'SomeClass', controller_configs)
+    c_manager.register_controller(mock_controller)
+    self.assertFalse(c_manager.get_controller_info_records())
+    mock_add_error.assert_called_once()
+    error_record = mock_add_error.call_args[0][0]
+    self.assertIn('Record info failed.', error_record.stacktrace)
 
-    @mock.patch('mobly.expects._ExpectErrorRecorder.add_error')
-    @mock.patch('tests.lib.mock_controller.get_info')
-    def test_get_controller_info_records_error(self, mock_get_info_func,
-                                               mock_add_error):
-        mock_get_info_func.side_effect = Exception('Record info failed.')
-        mock_ctrlr_config_name = mock_controller.MOBLY_CONTROLLER_CONFIG_NAME
-        controller_configs = {mock_ctrlr_config_name: ['magic1', 'magic2']}
-        c_manager = controller_manager.ControllerManager(
-            'SomeClass', controller_configs)
-        c_manager.register_controller(mock_controller)
-        self.assertFalse(c_manager.get_controller_info_records())
-        mock_add_error.assert_called_once()
-        error_record = mock_add_error.call_args[0][0]
-        self.assertIn('Record info failed.', error_record.stacktrace)
+  def test_get_controller_info_records(self):
+    mock_ctrlr_config_name = mock_controller.MOBLY_CONTROLLER_CONFIG_NAME
+    controller_configs = {mock_ctrlr_config_name: ['magic1', 'magic2']}
+    c_manager = controller_manager.ControllerManager(
+      'SomeClass', controller_configs)
+    c_manager.register_controller(mock_controller)
+    record = c_manager.get_controller_info_records()[0]
+    record_dict = record.to_dict()
+    record_dict.pop('Timestamp')
+    self.assertEqual(
+      record_dict, {
+        'Controller Info': [{
+          'MyMagic': 'magic1'
+        }, {
+          'MyMagic': 'magic2'
+        }],
+        'Controller Name': 'MagicDevice',
+        'Test Class': 'SomeClass'
+      })
 
-    def test_get_controller_info_records(self):
-        mock_ctrlr_config_name = mock_controller.MOBLY_CONTROLLER_CONFIG_NAME
-        controller_configs = {mock_ctrlr_config_name: ['magic1', 'magic2']}
-        c_manager = controller_manager.ControllerManager(
-            'SomeClass', controller_configs)
-        c_manager.register_controller(mock_controller)
-        record = c_manager.get_controller_info_records()[0]
-        record_dict = record.to_dict()
-        record_dict.pop('Timestamp')
-        self.assertEqual(
-            record_dict, {
-                'Controller Info': [{
-                    'MyMagic': 'magic1'
-                }, {
-                    'MyMagic': 'magic2'
-                }],
-                'Controller Name': 'MagicDevice',
-                'Test Class': 'SomeClass'
-            })
+  def test_get_controller_info_without_registration(self):
+    mock_ctrlr_config_name = mock_controller.MOBLY_CONTROLLER_CONFIG_NAME
+    controller_configs = {mock_ctrlr_config_name: ['magic1', 'magic2']}
+    c_manager = controller_manager.ControllerManager(
+      'SomeClass', controller_configs)
+    self.assertFalse(c_manager.get_controller_info_records())
 
-    def test_get_controller_info_without_registration(self):
-        mock_ctrlr_config_name = mock_controller.MOBLY_CONTROLLER_CONFIG_NAME
-        controller_configs = {mock_ctrlr_config_name: ['magic1', 'magic2']}
-        c_manager = controller_manager.ControllerManager(
-            'SomeClass', controller_configs)
-        self.assertFalse(c_manager.get_controller_info_records())
+  @mock.patch('tests.lib.mock_controller.destroy')
+  def test_unregister_controller(self, mock_destroy_func):
+    mock_ctrlr_config_name = mock_controller.MOBLY_CONTROLLER_CONFIG_NAME
+    controller_configs = {mock_ctrlr_config_name: ['magic1', 'magic2']}
+    c_manager = controller_manager.ControllerManager(
+      'SomeClass', controller_configs)
+    objects = c_manager.register_controller(mock_controller)
+    c_manager.unregister_controllers()
+    mock_destroy_func.assert_called_once_with(objects)
+    self.assertFalse(c_manager._controller_objects)
+    self.assertFalse(c_manager._controller_modules)
 
-    @mock.patch('tests.lib.mock_controller.destroy')
-    def test_unregister_controller(self, mock_destroy_func):
-        mock_ctrlr_config_name = mock_controller.MOBLY_CONTROLLER_CONFIG_NAME
-        controller_configs = {mock_ctrlr_config_name: ['magic1', 'magic2']}
-        c_manager = controller_manager.ControllerManager(
-            'SomeClass', controller_configs)
-        objects = c_manager.register_controller(mock_controller)
-        c_manager.unregister_controllers()
-        mock_destroy_func.assert_called_once_with(objects)
-        self.assertFalse(c_manager._controller_objects)
-        self.assertFalse(c_manager._controller_modules)
+  @mock.patch('mobly.expects._ExpectErrorRecorder.add_error')
+  @mock.patch('tests.lib.mock_controller.destroy')
+  def test_unregister_controller_error(self, mock_destroy_func,
+                     mock_add_error):
+    mock_ctrlr_config_name = mock_controller.MOBLY_CONTROLLER_CONFIG_NAME
+    controller_configs = {mock_ctrlr_config_name: ['magic1', 'magic2']}
+    c_manager = controller_manager.ControllerManager(
+      'SomeClass', controller_configs)
+    c_manager.register_controller(mock_controller)
+    mock_destroy_func.side_effect = Exception('Failed in destroy.')
+    c_manager.unregister_controllers()
+    mock_add_error.assert_called_once()
+    error_record = mock_add_error.call_args[0][0]
+    self.assertIn('Failed in destroy.', error_record.stacktrace)
+    self.assertFalse(c_manager._controller_objects)
+    self.assertFalse(c_manager._controller_modules)
 
-    @mock.patch('mobly.expects._ExpectErrorRecorder.add_error')
-    @mock.patch('tests.lib.mock_controller.destroy')
-    def test_unregister_controller_error(self, mock_destroy_func,
-                                         mock_add_error):
-        mock_ctrlr_config_name = mock_controller.MOBLY_CONTROLLER_CONFIG_NAME
-        controller_configs = {mock_ctrlr_config_name: ['magic1', 'magic2']}
-        c_manager = controller_manager.ControllerManager(
-            'SomeClass', controller_configs)
-        c_manager.register_controller(mock_controller)
-        mock_destroy_func.side_effect = Exception('Failed in destroy.')
-        c_manager.unregister_controllers()
-        mock_add_error.assert_called_once()
-        error_record = mock_add_error.call_args[0][0]
-        self.assertIn('Failed in destroy.', error_record.stacktrace)
-        self.assertFalse(c_manager._controller_objects)
-        self.assertFalse(c_manager._controller_modules)
-
-    @mock.patch('tests.lib.mock_controller.destroy')
-    def test_unregister_controller_without_registration(
-            self, mock_destroy_func):
-        mock_ctrlr_config_name = mock_controller.MOBLY_CONTROLLER_CONFIG_NAME
-        controller_configs = {mock_ctrlr_config_name: ['magic1', 'magic2']}
-        c_manager = controller_manager.ControllerManager(
-            'SomeClass', controller_configs)
-        c_manager.unregister_controllers()
-        mock_destroy_func.assert_not_called()
-        self.assertFalse(c_manager._controller_objects)
-        self.assertFalse(c_manager._controller_modules)
+  @mock.patch('tests.lib.mock_controller.destroy')
+  def test_unregister_controller_without_registration(
+      self, mock_destroy_func):
+    mock_ctrlr_config_name = mock_controller.MOBLY_CONTROLLER_CONFIG_NAME
+    controller_configs = {mock_ctrlr_config_name: ['magic1', 'magic2']}
+    c_manager = controller_manager.ControllerManager(
+      'SomeClass', controller_configs)
+    c_manager.unregister_controllers()
+    mock_destroy_func.assert_not_called()
+    self.assertFalse(c_manager._controller_objects)
+    self.assertFalse(c_manager._controller_modules)
 
 
 if __name__ == "__main__":
-    unittest.main()
+  unittest.main()
diff --git a/tests/mobly/controllers/android_device_test.py b/tests/mobly/controllers/android_device_test.py
index 435f3f1..579b50f 100755
--- a/tests/mobly/controllers/android_device_test.py
+++ b/tests/mobly/controllers/android_device_test.py
@@ -42,1274 +42,1274 @@
 
 
 class AndroidDeviceTest(unittest.TestCase):
-    """This test class has unit tests for the implementation of everything
-    under mobly.controllers.android_device.
+  """This test class has unit tests for the implementation of everything
+  under mobly.controllers.android_device.
+  """
+
+  def setUp(self):
+    # Set log_path to logging since mobly logger setup is not called.
+    if not hasattr(logging, 'log_path'):
+      setattr(logging, 'log_path', '/tmp/logs')
+    # Creates a temp dir to be used by tests in this test class.
+    self.tmp_dir = tempfile.mkdtemp()
+
+  def tearDown(self):
+    """Removes the temp dir.
     """
+    shutil.rmtree(self.tmp_dir)
 
-    def setUp(self):
-        # Set log_path to logging since mobly logger setup is not called.
-        if not hasattr(logging, 'log_path'):
-            setattr(logging, 'log_path', '/tmp/logs')
-        # Creates a temp dir to be used by tests in this test class.
-        self.tmp_dir = tempfile.mkdtemp()
+  # Tests for android_device module functions.
+  # These tests use mock AndroidDevice instances.
 
-    def tearDown(self):
-        """Removes the temp dir.
-        """
-        shutil.rmtree(self.tmp_dir)
+  @mock.patch.object(android_device,
+             'get_all_instances',
+             new=mock_android_device.get_all_instances)
+  @mock.patch.object(android_device,
+             'list_adb_devices',
+             new=mock_android_device.list_adb_devices)
+  @mock.patch.object(android_device,
+             'list_adb_devices_by_usb_id',
+             new=mock_android_device.list_adb_devices)
+  def test_create_with_pickup_all(self):
+    pick_all_token = android_device.ANDROID_DEVICE_PICK_ALL_TOKEN
+    actual_ads = android_device.create(pick_all_token)
+    for actual, expected in zip(actual_ads,
+                  mock_android_device.get_mock_ads(5)):
+      self.assertEqual(actual.serial, expected.serial)
 
-    # Tests for android_device module functions.
-    # These tests use mock AndroidDevice instances.
+  @mock.patch.object(android_device,
+             'get_instances',
+             new=mock_android_device.get_instances)
+  @mock.patch.object(android_device,
+             'list_adb_devices',
+             new=mock_android_device.list_adb_devices)
+  @mock.patch.object(android_device,
+             'list_adb_devices_by_usb_id',
+             new=mock_android_device.list_adb_devices)
+  def test_create_with_string_list(self):
+    string_list = [u'1', '2']
+    actual_ads = android_device.create(string_list)
+    for actual_ad, expected_serial in zip(actual_ads, ['1', '2']):
+      self.assertEqual(actual_ad.serial, expected_serial)
 
-    @mock.patch.object(android_device,
-                       'get_all_instances',
-                       new=mock_android_device.get_all_instances)
-    @mock.patch.object(android_device,
-                       'list_adb_devices',
-                       new=mock_android_device.list_adb_devices)
-    @mock.patch.object(android_device,
-                       'list_adb_devices_by_usb_id',
-                       new=mock_android_device.list_adb_devices)
-    def test_create_with_pickup_all(self):
-        pick_all_token = android_device.ANDROID_DEVICE_PICK_ALL_TOKEN
-        actual_ads = android_device.create(pick_all_token)
-        for actual, expected in zip(actual_ads,
-                                    mock_android_device.get_mock_ads(5)):
-            self.assertEqual(actual.serial, expected.serial)
+  @mock.patch.object(android_device,
+             'get_instances_with_configs',
+             new=mock_android_device.get_instances_with_configs)
+  @mock.patch.object(android_device,
+             'list_adb_devices',
+             new=mock_android_device.list_adb_devices)
+  @mock.patch.object(android_device,
+             'list_adb_devices_by_usb_id',
+             new=mock_android_device.list_adb_devices)
+  def test_create_with_dict_list(self):
+    string_list = [{'serial': '1'}, {'serial': '2'}]
+    actual_ads = android_device.create(string_list)
+    for actual_ad, expected_serial in zip(actual_ads, ['1', '2']):
+      self.assertEqual(actual_ad.serial, expected_serial)
 
-    @mock.patch.object(android_device,
-                       'get_instances',
-                       new=mock_android_device.get_instances)
-    @mock.patch.object(android_device,
-                       'list_adb_devices',
-                       new=mock_android_device.list_adb_devices)
-    @mock.patch.object(android_device,
-                       'list_adb_devices_by_usb_id',
-                       new=mock_android_device.list_adb_devices)
-    def test_create_with_string_list(self):
-        string_list = [u'1', '2']
-        actual_ads = android_device.create(string_list)
-        for actual_ad, expected_serial in zip(actual_ads, ['1', '2']):
-            self.assertEqual(actual_ad.serial, expected_serial)
+  @mock.patch.object(android_device,
+             'get_instances_with_configs',
+             new=mock_android_device.get_instances_with_configs)
+  @mock.patch.object(android_device,
+             'list_adb_devices',
+             new=mock_android_device.list_adb_devices)
+  @mock.patch.object(android_device,
+             'list_adb_devices_by_usb_id',
+             return_value=['usb:1'])
+  def test_create_with_usb_id(self, mock_list_adb_devices_by_usb_id):
+    string_list = [{'serial': '1'}, {'serial': '2'}, {'serial': 'usb:1'}]
+    actual_ads = android_device.create(string_list)
+    for actual_ad, expected_serial in zip(actual_ads, ['1', '2', 'usb:1']):
+      self.assertEqual(actual_ad.serial, expected_serial)
 
-    @mock.patch.object(android_device,
-                       'get_instances_with_configs',
-                       new=mock_android_device.get_instances_with_configs)
-    @mock.patch.object(android_device,
-                       'list_adb_devices',
-                       new=mock_android_device.list_adb_devices)
-    @mock.patch.object(android_device,
-                       'list_adb_devices_by_usb_id',
-                       new=mock_android_device.list_adb_devices)
-    def test_create_with_dict_list(self):
-        string_list = [{'serial': '1'}, {'serial': '2'}]
-        actual_ads = android_device.create(string_list)
-        for actual_ad, expected_serial in zip(actual_ads, ['1', '2']):
-            self.assertEqual(actual_ad.serial, expected_serial)
+  def test_create_with_empty_config(self):
+    expected_msg = android_device.ANDROID_DEVICE_EMPTY_CONFIG_MSG
+    with self.assertRaisesRegex(android_device.Error, expected_msg):
+      android_device.create([])
 
-    @mock.patch.object(android_device,
-                       'get_instances_with_configs',
-                       new=mock_android_device.get_instances_with_configs)
-    @mock.patch.object(android_device,
-                       'list_adb_devices',
-                       new=mock_android_device.list_adb_devices)
-    @mock.patch.object(android_device,
-                       'list_adb_devices_by_usb_id',
-                       return_value=['usb:1'])
-    def test_create_with_usb_id(self, mock_list_adb_devices_by_usb_id):
-        string_list = [{'serial': '1'}, {'serial': '2'}, {'serial': 'usb:1'}]
-        actual_ads = android_device.create(string_list)
-        for actual_ad, expected_serial in zip(actual_ads, ['1', '2', 'usb:1']):
-            self.assertEqual(actual_ad.serial, expected_serial)
+  def test_create_with_not_list_config(self):
+    expected_msg = android_device.ANDROID_DEVICE_NOT_LIST_CONFIG_MSG
+    with self.assertRaisesRegex(android_device.Error, expected_msg):
+      android_device.create('HAHA')
 
-    def test_create_with_empty_config(self):
-        expected_msg = android_device.ANDROID_DEVICE_EMPTY_CONFIG_MSG
-        with self.assertRaisesRegex(android_device.Error, expected_msg):
-            android_device.create([])
+  def test_create_with_no_valid_config(self):
+    expected_msg = 'No valid config found in: .*'
+    with self.assertRaisesRegex(android_device.Error, expected_msg):
+      android_device.create([1])
 
-    def test_create_with_not_list_config(self):
-        expected_msg = android_device.ANDROID_DEVICE_NOT_LIST_CONFIG_MSG
-        with self.assertRaisesRegex(android_device.Error, expected_msg):
-            android_device.create('HAHA')
+  def test_get_devices_success_with_extra_field(self):
+    ads = mock_android_device.get_mock_ads(5)
+    expected_label = 'selected'
+    expected_count = 2
+    for ad in ads[:expected_count]:
+      ad.label = expected_label
+    selected_ads = android_device.get_devices(ads, label=expected_label)
+    self.assertEqual(expected_count, len(selected_ads))
+    for ad in selected_ads:
+      self.assertEqual(ad.label, expected_label)
 
-    def test_create_with_no_valid_config(self):
-        expected_msg = 'No valid config found in: .*'
-        with self.assertRaisesRegex(android_device.Error, expected_msg):
-            android_device.create([1])
+  def test_get_devices_no_match(self):
+    ads = mock_android_device.get_mock_ads(5)
+    expected_msg = ('Could not find a target device that matches condition'
+            ": {'label': 'selected'}.")
+    with self.assertRaisesRegex(android_device.Error, expected_msg):
+      selected_ads = android_device.get_devices(ads, label='selected')
 
-    def test_get_devices_success_with_extra_field(self):
-        ads = mock_android_device.get_mock_ads(5)
-        expected_label = 'selected'
-        expected_count = 2
-        for ad in ads[:expected_count]:
-            ad.label = expected_label
-        selected_ads = android_device.get_devices(ads, label=expected_label)
-        self.assertEqual(expected_count, len(selected_ads))
-        for ad in selected_ads:
-            self.assertEqual(ad.label, expected_label)
+  def test_get_device_success_with_serial(self):
+    ads = mock_android_device.get_mock_ads(5)
+    expected_serial = '0'
+    ad = android_device.get_device(ads, serial=expected_serial)
+    self.assertEqual(ad.serial, expected_serial)
 
-    def test_get_devices_no_match(self):
-        ads = mock_android_device.get_mock_ads(5)
-        expected_msg = ('Could not find a target device that matches condition'
-                        ": {'label': 'selected'}.")
-        with self.assertRaisesRegex(android_device.Error, expected_msg):
-            selected_ads = android_device.get_devices(ads, label='selected')
+  def test_get_device_success_with_serial_and_extra_field(self):
+    ads = mock_android_device.get_mock_ads(5)
+    expected_serial = '1'
+    expected_h_port = 5555
+    ads[1].h_port = expected_h_port
+    ad = android_device.get_device(ads,
+                     serial=expected_serial,
+                     h_port=expected_h_port)
+    self.assertEqual(ad.serial, expected_serial)
+    self.assertEqual(ad.h_port, expected_h_port)
 
-    def test_get_device_success_with_serial(self):
-        ads = mock_android_device.get_mock_ads(5)
-        expected_serial = '0'
-        ad = android_device.get_device(ads, serial=expected_serial)
-        self.assertEqual(ad.serial, expected_serial)
+  def test_get_device_no_match(self):
+    ads = mock_android_device.get_mock_ads(5)
+    expected_msg = ('Could not find a target device that matches condition'
+            ": {'serial': 5}.")
+    with self.assertRaisesRegex(android_device.Error, expected_msg):
+      ad = android_device.get_device(ads, serial=len(ads))
 
-    def test_get_device_success_with_serial_and_extra_field(self):
-        ads = mock_android_device.get_mock_ads(5)
-        expected_serial = '1'
-        expected_h_port = 5555
-        ads[1].h_port = expected_h_port
-        ad = android_device.get_device(ads,
-                                       serial=expected_serial,
-                                       h_port=expected_h_port)
-        self.assertEqual(ad.serial, expected_serial)
-        self.assertEqual(ad.h_port, expected_h_port)
+  def test_get_device_too_many_matches(self):
+    ads = mock_android_device.get_mock_ads(5)
+    target_serial = ads[1].serial = ads[0].serial
+    expected_msg = r"More than one device matched: \['0', '0'\]"
+    with self.assertRaisesRegex(android_device.Error, expected_msg):
+      android_device.get_device(ads, serial=target_serial)
 
-    def test_get_device_no_match(self):
-        ads = mock_android_device.get_mock_ads(5)
-        expected_msg = ('Could not find a target device that matches condition'
-                        ": {'serial': 5}.")
-        with self.assertRaisesRegex(android_device.Error, expected_msg):
-            ad = android_device.get_device(ads, serial=len(ads))
+  def test_start_services_on_ads(self):
+    """Makes sure when an AndroidDevice fails to start some services, all
+    AndroidDevice objects get cleaned up.
+    """
+    msg = 'Some error happened.'
+    ads = mock_android_device.get_mock_ads(3)
+    for ad in ads:
+      ad.services.logcat.start = mock.MagicMock()
+      ad.services.stop_all = mock.MagicMock()
+      ad.skip_logcat = False
+      ad.is_required = True
+    ads[1].services.logcat.start = mock.MagicMock(
+      side_effect=android_device.Error(msg))
+    with self.assertRaisesRegex(android_device.Error, msg):
+      android_device._start_services_on_ads(ads)
+    ads[0].services.stop_all.assert_called_once_with()
+    ads[1].services.stop_all.assert_called_once_with()
+    ads[2].services.stop_all.assert_called_once_with()
 
-    def test_get_device_too_many_matches(self):
-        ads = mock_android_device.get_mock_ads(5)
-        target_serial = ads[1].serial = ads[0].serial
-        expected_msg = r"More than one device matched: \['0', '0'\]"
-        with self.assertRaisesRegex(android_device.Error, expected_msg):
-            android_device.get_device(ads, serial=target_serial)
+  def test_start_services_on_ads_skip_logcat(self):
+    ads = mock_android_device.get_mock_ads(3)
+    ads[0].services.logcat.start = mock.MagicMock()
+    ads[1].services.logcat.start = mock.MagicMock()
+    ads[2].services.logcat.start = mock.MagicMock(
+      side_effect=Exception('Should not have called this.'))
+    ads[2].skip_logcat = True
+    android_device._start_services_on_ads(ads)
 
-    def test_start_services_on_ads(self):
-        """Makes sure when an AndroidDevice fails to start some services, all
-        AndroidDevice objects get cleaned up.
-        """
-        msg = 'Some error happened.'
-        ads = mock_android_device.get_mock_ads(3)
-        for ad in ads:
-            ad.services.logcat.start = mock.MagicMock()
-            ad.services.stop_all = mock.MagicMock()
-            ad.skip_logcat = False
-            ad.is_required = True
-        ads[1].services.logcat.start = mock.MagicMock(
-            side_effect=android_device.Error(msg))
-        with self.assertRaisesRegex(android_device.Error, msg):
-            android_device._start_services_on_ads(ads)
-        ads[0].services.stop_all.assert_called_once_with()
-        ads[1].services.stop_all.assert_called_once_with()
-        ads[2].services.stop_all.assert_called_once_with()
+  def test_take_bug_reports(self):
+    ads = mock_android_device.get_mock_ads(3)
+    android_device.take_bug_reports(ads, 'test_something', 'sometime')
+    ads[0].take_bug_report.assert_called_once_with(
+      test_name='test_something',
+      begin_time='sometime',
+      destination=None)
+    ads[1].take_bug_report.assert_called_once_with(
+      test_name='test_something',
+      begin_time='sometime',
+      destination=None)
+    ads[2].take_bug_report.assert_called_once_with(
+      test_name='test_something',
+      begin_time='sometime',
+      destination=None)
 
-    def test_start_services_on_ads_skip_logcat(self):
-        ads = mock_android_device.get_mock_ads(3)
-        ads[0].services.logcat.start = mock.MagicMock()
-        ads[1].services.logcat.start = mock.MagicMock()
-        ads[2].services.logcat.start = mock.MagicMock(
-            side_effect=Exception('Should not have called this.'))
-        ads[2].skip_logcat = True
-        android_device._start_services_on_ads(ads)
+  def test_take_bug_reports_with_int_begin_time(self):
+    ads = mock_android_device.get_mock_ads(3)
+    android_device.take_bug_reports(ads, 'test_something', 123)
+    ads[0].take_bug_report.assert_called_once_with(
+      test_name='test_something', begin_time='123', destination=None)
+    ads[1].take_bug_report.assert_called_once_with(
+      test_name='test_something', begin_time='123', destination=None)
+    ads[2].take_bug_report.assert_called_once_with(
+      test_name='test_something', begin_time='123', destination=None)
 
-    def test_take_bug_reports(self):
-        ads = mock_android_device.get_mock_ads(3)
-        android_device.take_bug_reports(ads, 'test_something', 'sometime')
-        ads[0].take_bug_report.assert_called_once_with(
-            test_name='test_something',
-            begin_time='sometime',
-            destination=None)
-        ads[1].take_bug_report.assert_called_once_with(
-            test_name='test_something',
-            begin_time='sometime',
-            destination=None)
-        ads[2].take_bug_report.assert_called_once_with(
-            test_name='test_something',
-            begin_time='sometime',
-            destination=None)
+  @mock.patch('mobly.logger.get_log_file_timestamp')
+  def test_take_bug_reports_with_none_values(self,
+                         get_log_file_timestamp_mock):
+    mock_timestamp = '07-22-2019_17-55-30-765'
+    get_log_file_timestamp_mock.return_value = mock_timestamp
+    ads = mock_android_device.get_mock_ads(3)
+    android_device.take_bug_reports(ads)
+    ads[0].take_bug_report.assert_called_once_with(
+      test_name=None, begin_time=mock_timestamp, destination=None)
+    ads[1].take_bug_report.assert_called_once_with(
+      test_name=None, begin_time=mock_timestamp, destination=None)
+    ads[2].take_bug_report.assert_called_once_with(
+      test_name=None, begin_time=mock_timestamp, destination=None)
 
-    def test_take_bug_reports_with_int_begin_time(self):
-        ads = mock_android_device.get_mock_ads(3)
-        android_device.take_bug_reports(ads, 'test_something', 123)
-        ads[0].take_bug_report.assert_called_once_with(
-            test_name='test_something', begin_time='123', destination=None)
-        ads[1].take_bug_report.assert_called_once_with(
-            test_name='test_something', begin_time='123', destination=None)
-        ads[2].take_bug_report.assert_called_once_with(
-            test_name='test_something', begin_time='123', destination=None)
+  # Tests for android_device.AndroidDevice class.
+  # These tests mock out any interaction with the OS and real android device
+  # in AndroidDeivce.
 
-    @mock.patch('mobly.logger.get_log_file_timestamp')
-    def test_take_bug_reports_with_none_values(self,
-                                               get_log_file_timestamp_mock):
-        mock_timestamp = '07-22-2019_17-55-30-765'
-        get_log_file_timestamp_mock.return_value = mock_timestamp
-        ads = mock_android_device.get_mock_ads(3)
-        android_device.take_bug_reports(ads)
-        ads[0].take_bug_report.assert_called_once_with(
-            test_name=None, begin_time=mock_timestamp, destination=None)
-        ads[1].take_bug_report.assert_called_once_with(
-            test_name=None, begin_time=mock_timestamp, destination=None)
-        ads[2].take_bug_report.assert_called_once_with(
-            test_name=None, begin_time=mock_timestamp, destination=None)
+  @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
+        return_value=mock_android_device.MockAdbProxy('1'))
+  @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
+        return_value=mock_android_device.MockFastbootProxy('1'))
+  def test_AndroidDevice_instantiation(self, MockFastboot, MockAdbProxy):
+    """Verifies the AndroidDevice object's basic attributes are correctly
+    set after instantiation.
+    """
+    mock_serial = 1
+    ad = android_device.AndroidDevice(serial=mock_serial)
+    self.assertEqual(ad.serial, '1')
+    self.assertEqual(ad.model, 'fakemodel')
+    expected_lp = os.path.join(logging.log_path,
+                   'AndroidDevice%s' % mock_serial)
+    self.assertEqual(ad.log_path, expected_lp)
+    self.assertIsNotNone(ad.services.logcat)
+    self.assertIsNotNone(ad.services.snippets)
 
-    # Tests for android_device.AndroidDevice class.
-    # These tests mock out any interaction with the OS and real android device
-    # in AndroidDeivce.
+  @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
+        return_value=mock_android_device.MockAdbProxy(1))
+  @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
+        return_value=mock_android_device.MockFastbootProxy(1))
+  @mock.patch('mobly.utils.create_dir')
+  def test_AndroidDevice_load_config(self, create_dir_mock, FastbootProxy,
+                     MockAdbProxy):
+    mock_serial = '1'
+    config = {
+      'space': 'the final frontier',
+      'number': 1,
+      'debug_tag': 'my_tag'
+    }
+    ad = android_device.AndroidDevice(serial=mock_serial)
+    ad.load_config(config)
+    self.assertEqual(ad.space, 'the final frontier')
+    self.assertEqual(ad.number, 1)
+    self.assertEqual(ad.debug_tag, 'my_tag')
 
-    @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
-                return_value=mock_android_device.MockAdbProxy('1'))
-    @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
-                return_value=mock_android_device.MockFastbootProxy('1'))
-    def test_AndroidDevice_instantiation(self, MockFastboot, MockAdbProxy):
-        """Verifies the AndroidDevice object's basic attributes are correctly
-        set after instantiation.
-        """
-        mock_serial = 1
-        ad = android_device.AndroidDevice(serial=mock_serial)
-        self.assertEqual(ad.serial, '1')
-        self.assertEqual(ad.model, 'fakemodel')
-        expected_lp = os.path.join(logging.log_path,
-                                   'AndroidDevice%s' % mock_serial)
-        self.assertEqual(ad.log_path, expected_lp)
-        self.assertIsNotNone(ad.services.logcat)
-        self.assertIsNotNone(ad.services.snippets)
+  @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
+        return_value=mock_android_device.MockAdbProxy(1))
+  @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
+        return_value=mock_android_device.MockFastbootProxy(1))
+  @mock.patch('mobly.utils.create_dir')
+  def test_AndroidDevice_load_config_dup(self, create_dir_mock,
+                       FastbootProxy, MockAdbProxy):
+    mock_serial = '1'
+    config = {'serial': 'new_serial'}
+    ad = android_device.AndroidDevice(serial=mock_serial)
+    with self.assertRaisesRegex(android_device.DeviceError,
+                  'Attribute serial already exists with'):
+      ad.load_config(config)
 
-    @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
-                return_value=mock_android_device.MockAdbProxy(1))
-    @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
-                return_value=mock_android_device.MockFastbootProxy(1))
-    @mock.patch('mobly.utils.create_dir')
-    def test_AndroidDevice_load_config(self, create_dir_mock, FastbootProxy,
-                                       MockAdbProxy):
-        mock_serial = '1'
-        config = {
-            'space': 'the final frontier',
-            'number': 1,
-            'debug_tag': 'my_tag'
-        }
-        ad = android_device.AndroidDevice(serial=mock_serial)
-        ad.load_config(config)
-        self.assertEqual(ad.space, 'the final frontier')
-        self.assertEqual(ad.number, 1)
-        self.assertEqual(ad.debug_tag, 'my_tag')
+  @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
+        return_value=mock_android_device.MockAdbProxy('1'))
+  @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
+        return_value=mock_android_device.MockFastbootProxy('1'))
+  def test_AndroidDevice_build_info(self, MockFastboot, MockAdbProxy):
+    """Verifies the AndroidDevice object's basic attributes are correctly
+    set after instantiation.
+    """
+    ad = android_device.AndroidDevice(serial='1')
+    build_info = ad.build_info
+    self.assertEqual(build_info['build_id'], 'AB42')
+    self.assertEqual(build_info['build_type'], 'userdebug')
+    self.assertEqual(build_info['build_version_codename'], 'Z')
+    self.assertEqual(build_info['build_version_sdk'], '28')
+    self.assertEqual(build_info['build_product'], 'FakeModel')
+    self.assertEqual(build_info['build_characteristics'], 'emulator,phone')
+    self.assertEqual(build_info['product_name'], 'FakeModel')
+    self.assertEqual(build_info['debuggable'], '1')
+    self.assertEqual(build_info['hardware'], 'marlin')
+    self.assertEqual(len(build_info),
+             len(android_device.CACHED_SYSTEM_PROPS))
 
-    @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
-                return_value=mock_android_device.MockAdbProxy(1))
-    @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
-                return_value=mock_android_device.MockFastbootProxy(1))
-    @mock.patch('mobly.utils.create_dir')
-    def test_AndroidDevice_load_config_dup(self, create_dir_mock,
-                                           FastbootProxy, MockAdbProxy):
-        mock_serial = '1'
-        config = {'serial': 'new_serial'}
-        ad = android_device.AndroidDevice(serial=mock_serial)
-        with self.assertRaisesRegex(android_device.DeviceError,
-                                    'Attribute serial already exists with'):
-            ad.load_config(config)
+  @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
+        return_value=mock_android_device.MockAdbProxy(
+          '1',
+          mock_properties={
+            'ro.build.id': 'AB42',
+            'ro.build.type': 'userdebug',
+          }))
+  @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
+        return_value=mock_android_device.MockFastbootProxy('1'))
+  def test_AndroidDevice_build_info_with_minimal_properties(
+      self, MockFastboot, MockAdbProxy):
+    ad = android_device.AndroidDevice(serial='1')
+    build_info = ad.build_info
+    self.assertEqual(build_info['build_id'], 'AB42')
+    self.assertEqual(build_info['build_type'], 'userdebug')
+    self.assertEqual(build_info['build_version_codename'], '')
+    self.assertEqual(build_info['build_version_sdk'], '')
+    self.assertEqual(build_info['build_product'], '')
+    self.assertEqual(build_info['build_characteristics'], '')
+    self.assertEqual(build_info['product_name'], '')
+    self.assertEqual(build_info['debuggable'], '')
+    self.assertEqual(build_info['hardware'], '')
 
-    @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
-                return_value=mock_android_device.MockAdbProxy('1'))
-    @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
-                return_value=mock_android_device.MockFastbootProxy('1'))
-    def test_AndroidDevice_build_info(self, MockFastboot, MockAdbProxy):
-        """Verifies the AndroidDevice object's basic attributes are correctly
-        set after instantiation.
-        """
-        ad = android_device.AndroidDevice(serial='1')
-        build_info = ad.build_info
-        self.assertEqual(build_info['build_id'], 'AB42')
-        self.assertEqual(build_info['build_type'], 'userdebug')
-        self.assertEqual(build_info['build_version_codename'], 'Z')
-        self.assertEqual(build_info['build_version_sdk'], '28')
-        self.assertEqual(build_info['build_product'], 'FakeModel')
-        self.assertEqual(build_info['build_characteristics'], 'emulator,phone')
-        self.assertEqual(build_info['product_name'], 'FakeModel')
-        self.assertEqual(build_info['debuggable'], '1')
-        self.assertEqual(build_info['hardware'], 'marlin')
-        self.assertEqual(len(build_info),
-                         len(android_device.CACHED_SYSTEM_PROPS))
+  @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
+        return_value=mock_android_device.MockAdbProxy('1'))
+  @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
+        return_value=mock_android_device.MockFastbootProxy('1'))
+  def test_AndroidDevice_build_info_cached(self, MockFastboot, MockAdbProxy):
+    """Verifies the AndroidDevice object's basic attributes are correctly
+    set after instantiation.
+    """
+    ad = android_device.AndroidDevice(serial='1')
+    _ = ad.build_info
+    _ = ad.build_info
+    _ = ad.build_info
+    self.assertEqual(ad.adb.getprops_call_count, 1)
 
-    @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
-                return_value=mock_android_device.MockAdbProxy(
-                    '1',
-                    mock_properties={
-                        'ro.build.id': 'AB42',
-                        'ro.build.type': 'userdebug',
-                    }))
-    @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
-                return_value=mock_android_device.MockFastbootProxy('1'))
-    def test_AndroidDevice_build_info_with_minimal_properties(
-            self, MockFastboot, MockAdbProxy):
-        ad = android_device.AndroidDevice(serial='1')
-        build_info = ad.build_info
-        self.assertEqual(build_info['build_id'], 'AB42')
-        self.assertEqual(build_info['build_type'], 'userdebug')
-        self.assertEqual(build_info['build_version_codename'], '')
-        self.assertEqual(build_info['build_version_sdk'], '')
-        self.assertEqual(build_info['build_product'], '')
-        self.assertEqual(build_info['build_characteristics'], '')
-        self.assertEqual(build_info['product_name'], '')
-        self.assertEqual(build_info['debuggable'], '')
-        self.assertEqual(build_info['hardware'], '')
+  @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
+        return_value=mock_android_device.MockAdbProxy(
+          '1',
+          mock_properties={
+            'ro.build.id': 'AB42',
+            'ro.build.type': 'userdebug',
+            'ro.debuggable': '1',
+          }))
+  @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
+        return_value=mock_android_device.MockFastbootProxy('1'))
+  def test_AndroidDevice_is_rootable_when_userdebug_device(
+      self, MockFastboot, MockAdbProxy):
+    ad = android_device.AndroidDevice(serial='1')
+    self.assertTrue(ad.is_rootable)
 
-    @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
-                return_value=mock_android_device.MockAdbProxy('1'))
-    @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
-                return_value=mock_android_device.MockFastbootProxy('1'))
-    def test_AndroidDevice_build_info_cached(self, MockFastboot, MockAdbProxy):
-        """Verifies the AndroidDevice object's basic attributes are correctly
-        set after instantiation.
-        """
-        ad = android_device.AndroidDevice(serial='1')
-        _ = ad.build_info
-        _ = ad.build_info
-        _ = ad.build_info
-        self.assertEqual(ad.adb.getprops_call_count, 1)
+  @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
+        return_value=mock_android_device.MockAdbProxy(
+          '1',
+          mock_properties={
+            'ro.build.id': 'AB42',
+            'ro.build.type': 'user',
+            'ro.debuggable': '0',
+          }))
+  @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
+        return_value=mock_android_device.MockFastbootProxy('1'))
+  def test_AndroidDevice_is_rootable_when_user_device(
+      self, MockFastboot, MockAdbProxy):
+    ad = android_device.AndroidDevice(serial='1')
+    self.assertFalse(ad.is_rootable)
 
-    @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
-                return_value=mock_android_device.MockAdbProxy(
-                    '1',
-                    mock_properties={
-                        'ro.build.id': 'AB42',
-                        'ro.build.type': 'userdebug',
-                        'ro.debuggable': '1',
-                    }))
-    @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
-                return_value=mock_android_device.MockFastbootProxy('1'))
-    def test_AndroidDevice_is_rootable_when_userdebug_device(
-            self, MockFastboot, MockAdbProxy):
-        ad = android_device.AndroidDevice(serial='1')
-        self.assertTrue(ad.is_rootable)
+  @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
+        return_value=mock_android_device.MockAdbProxy('1'))
+  @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
+        return_value=mock_android_device.MockFastbootProxy('1'))
+  def test_AndroidDevice_device_info(self, MockFastboot, MockAdbProxy):
+    ad = android_device.AndroidDevice(serial=1)
+    device_info = ad.device_info
+    self.assertEqual(device_info['serial'], '1')
+    self.assertEqual(device_info['model'], 'fakemodel')
+    self.assertEqual(device_info['build_info']['build_id'], 'AB42')
+    self.assertEqual(device_info['build_info']['build_type'], 'userdebug')
+    ad.add_device_info('sim_type', 'Fi')
+    ad.add_device_info('build_id', 'CD42')
+    device_info = ad.device_info
+    self.assertEqual(device_info['user_added_info']['sim_type'], 'Fi')
+    self.assertEqual(device_info['user_added_info']['build_id'], 'CD42')
 
-    @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
-                return_value=mock_android_device.MockAdbProxy(
-                    '1',
-                    mock_properties={
-                        'ro.build.id': 'AB42',
-                        'ro.build.type': 'user',
-                        'ro.debuggable': '0',
-                    }))
-    @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
-                return_value=mock_android_device.MockFastbootProxy('1'))
-    def test_AndroidDevice_is_rootable_when_user_device(
-            self, MockFastboot, MockAdbProxy):
-        ad = android_device.AndroidDevice(serial='1')
-        self.assertFalse(ad.is_rootable)
+  @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
+        return_value=mock_android_device.MockAdbProxy('1'))
+  @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
+        return_value=mock_android_device.MockFastbootProxy('1'))
+  def test_AndroidDevice_serial_is_valid(self, MockFastboot, MockAdbProxy):
+    """Verifies that the serial is a primitive string type and serializable.
+    """
+    ad = android_device.AndroidDevice(serial=1)
+    # In py2, checks that ad.serial is not the backported py3 str type,
+    # which is not dumpable by yaml in py2.
+    # In py3, new_str is equivalent to str, so this check is not
+    # appropirate in py3.
+    if sys.version_info < (3, 0):
+      self.assertFalse(isinstance(ad.serial, new_str))
+    self.assertTrue(isinstance(ad.serial, str))
+    yaml.safe_dump(ad.serial)
 
-    @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
-                return_value=mock_android_device.MockAdbProxy('1'))
-    @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
-                return_value=mock_android_device.MockFastbootProxy('1'))
-    def test_AndroidDevice_device_info(self, MockFastboot, MockAdbProxy):
-        ad = android_device.AndroidDevice(serial=1)
-        device_info = ad.device_info
-        self.assertEqual(device_info['serial'], '1')
-        self.assertEqual(device_info['model'], 'fakemodel')
-        self.assertEqual(device_info['build_info']['build_id'], 'AB42')
-        self.assertEqual(device_info['build_info']['build_type'], 'userdebug')
-        ad.add_device_info('sim_type', 'Fi')
-        ad.add_device_info('build_id', 'CD42')
-        device_info = ad.device_info
-        self.assertEqual(device_info['user_added_info']['sim_type'], 'Fi')
-        self.assertEqual(device_info['user_added_info']['build_id'], 'CD42')
+  @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
+        return_value=mock_android_device.MockAdbProxy('1'))
+  @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
+        return_value=mock_android_device.MockFastbootProxy('1'))
+  def test_AndroidDevice_is_emulator_when_realish_device(
+      self, MockFastboot, MockAdbProxy):
+    ad = android_device.AndroidDevice(serial='1')
+    self.assertFalse(ad.is_emulator)
 
-    @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
-                return_value=mock_android_device.MockAdbProxy('1'))
-    @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
-                return_value=mock_android_device.MockFastbootProxy('1'))
-    def test_AndroidDevice_serial_is_valid(self, MockFastboot, MockAdbProxy):
-        """Verifies that the serial is a primitive string type and serializable.
-        """
-        ad = android_device.AndroidDevice(serial=1)
-        # In py2, checks that ad.serial is not the backported py3 str type,
-        # which is not dumpable by yaml in py2.
-        # In py3, new_str is equivalent to str, so this check is not
-        # appropirate in py3.
-        if sys.version_info < (3, 0):
-            self.assertFalse(isinstance(ad.serial, new_str))
-        self.assertTrue(isinstance(ad.serial, str))
-        yaml.safe_dump(ad.serial)
+  @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
+        return_value=mock_android_device.MockAdbProxy('localhost:123'))
+  @mock.patch(
+    'mobly.controllers.android_device_lib.fastboot.FastbootProxy',
+    return_value=mock_android_device.MockFastbootProxy('localhost:123'))
+  def test_AndroidDevice_is_emulator_when_local_networked_device(
+      self, MockFastboot, MockAdbProxy):
+    # Although these devices are usually emulators, there might be a reason
+    # to do this with a real device.
+    ad = android_device.AndroidDevice(serial='localhost:123')
+    self.assertFalse(ad.is_emulator)
 
-    @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
-                return_value=mock_android_device.MockAdbProxy('1'))
-    @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
-                return_value=mock_android_device.MockFastbootProxy('1'))
-    def test_AndroidDevice_is_emulator_when_realish_device(
-            self, MockFastboot, MockAdbProxy):
-        ad = android_device.AndroidDevice(serial='1')
-        self.assertFalse(ad.is_emulator)
+  @mock.patch(
+    'mobly.controllers.android_device_lib.adb.AdbProxy',
+    return_value=mock_android_device.MockAdbProxy('example.com:123'))
+  @mock.patch(
+    'mobly.controllers.android_device_lib.fastboot.FastbootProxy',
+    return_value=mock_android_device.MockFastbootProxy('example:123'))
+  def test_AndroidDevice_is_emulator_when_remote_networked_device(
+      self, MockFastboot, MockAdbProxy):
+    ad = android_device.AndroidDevice(serial='example.com:123')
+    self.assertFalse(ad.is_emulator)
 
-    @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
-                return_value=mock_android_device.MockAdbProxy('localhost:123'))
-    @mock.patch(
-        'mobly.controllers.android_device_lib.fastboot.FastbootProxy',
-        return_value=mock_android_device.MockFastbootProxy('localhost:123'))
-    def test_AndroidDevice_is_emulator_when_local_networked_device(
-            self, MockFastboot, MockAdbProxy):
-        # Although these devices are usually emulators, there might be a reason
-        # to do this with a real device.
-        ad = android_device.AndroidDevice(serial='localhost:123')
-        self.assertFalse(ad.is_emulator)
+  @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
+        return_value=mock_android_device.MockAdbProxy(
+          'localhost:5554',
+          mock_properties={
+            'ro.hardware': 'ranchu',
+            'ro.build.id': 'AB42',
+            'ro.build.type': 'userdebug',
+          }))
+  @mock.patch(
+    'mobly.controllers.android_device_lib.fastboot.FastbootProxy',
+    return_value=mock_android_device.MockFastbootProxy('localhost:5554'))
+  def test_AndroidDevice_is_emulator_when_ranchu_device(
+      self, MockFastboot, MockAdbProxy):
+    ad = android_device.AndroidDevice(serial='localhost:5554')
+    self.assertTrue(ad.is_emulator)
 
-    @mock.patch(
-        'mobly.controllers.android_device_lib.adb.AdbProxy',
-        return_value=mock_android_device.MockAdbProxy('example.com:123'))
-    @mock.patch(
-        'mobly.controllers.android_device_lib.fastboot.FastbootProxy',
-        return_value=mock_android_device.MockFastbootProxy('example:123'))
-    def test_AndroidDevice_is_emulator_when_remote_networked_device(
-            self, MockFastboot, MockAdbProxy):
-        ad = android_device.AndroidDevice(serial='example.com:123')
-        self.assertFalse(ad.is_emulator)
+  @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
+        return_value=mock_android_device.MockAdbProxy(
+          '1',
+          mock_properties={
+            'ro.build.id': 'AB42',
+            'ro.build.type': 'userdebug',
+            'ro.hardware': 'goldfish',
+          }))
+  @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
+        return_value=mock_android_device.MockFastbootProxy('1'))
+  def test_AndroidDevice_is_emulator_when_goldfish_device(
+      self, MockFastboot, MockAdbProxy):
+    ad = android_device.AndroidDevice(serial='1')
+    self.assertTrue(ad.is_emulator)
 
-    @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
-                return_value=mock_android_device.MockAdbProxy(
-                    'localhost:5554',
-                    mock_properties={
-                        'ro.hardware': 'ranchu',
-                        'ro.build.id': 'AB42',
-                        'ro.build.type': 'userdebug',
-                    }))
-    @mock.patch(
-        'mobly.controllers.android_device_lib.fastboot.FastbootProxy',
-        return_value=mock_android_device.MockFastbootProxy('localhost:5554'))
-    def test_AndroidDevice_is_emulator_when_ranchu_device(
-            self, MockFastboot, MockAdbProxy):
-        ad = android_device.AndroidDevice(serial='localhost:5554')
-        self.assertTrue(ad.is_emulator)
+  @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
+        return_value=mock_android_device.MockAdbProxy(
+          'example.com:123',
+          mock_properties={
+            'ro.build.id': 'AB42',
+            'ro.build.type': 'userdebug',
+            'ro.build.characteristics': 'emulator',
+          }))
+  @mock.patch(
+    'mobly.controllers.android_device_lib.fastboot.FastbootProxy',
+    return_value=mock_android_device.MockFastbootProxy('example.com:123'))
+  def test_AndroidDevice_is_emulator_when_emulator_characteristic(
+      self, MockFastboot, MockAdbProxy):
+    ad = android_device.AndroidDevice(serial='example.com:123')
+    self.assertTrue(ad.is_emulator)
 
-    @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
-                return_value=mock_android_device.MockAdbProxy(
-                    '1',
-                    mock_properties={
-                        'ro.build.id': 'AB42',
-                        'ro.build.type': 'userdebug',
-                        'ro.hardware': 'goldfish',
-                    }))
-    @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
-                return_value=mock_android_device.MockFastbootProxy('1'))
-    def test_AndroidDevice_is_emulator_when_goldfish_device(
-            self, MockFastboot, MockAdbProxy):
-        ad = android_device.AndroidDevice(serial='1')
-        self.assertTrue(ad.is_emulator)
+  @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
+        return_value=mock_android_device.MockAdbProxy('emulator-5554'))
+  @mock.patch(
+    'mobly.controllers.android_device_lib.fastboot.FastbootProxy',
+    return_value=mock_android_device.MockFastbootProxy('emulator-5554'))
+  def test_AndroidDevice_is_emulator_when_emulator_serial(
+      self, MockFastboot, MockAdbProxy):
+    ad = android_device.AndroidDevice(serial='emulator-5554')
+    self.assertTrue(ad.is_emulator)
 
-    @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
-                return_value=mock_android_device.MockAdbProxy(
-                    'example.com:123',
-                    mock_properties={
-                        'ro.build.id': 'AB42',
-                        'ro.build.type': 'userdebug',
-                        'ro.build.characteristics': 'emulator',
-                    }))
-    @mock.patch(
-        'mobly.controllers.android_device_lib.fastboot.FastbootProxy',
-        return_value=mock_android_device.MockFastbootProxy('example.com:123'))
-    def test_AndroidDevice_is_emulator_when_emulator_characteristic(
-            self, MockFastboot, MockAdbProxy):
-        ad = android_device.AndroidDevice(serial='example.com:123')
-        self.assertTrue(ad.is_emulator)
+  @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
+        return_value=mock_android_device.MockAdbProxy('1'))
+  @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
+        return_value=mock_android_device.MockFastbootProxy('1'))
+  @mock.patch('mobly.logger.get_log_file_timestamp')
+  def test_AndroidDevice_generate_filename_default(
+      self, get_log_file_timestamp_mock, MockFastboot, MockAdbProxy):
+    mock_serial = 1
+    ad = android_device.AndroidDevice(serial=mock_serial)
+    get_log_file_timestamp_mock.return_value = '07-22-2019_17-53-34-450'
+    filename = ad.generate_filename('MagicLog')
+    self.assertEqual(filename,
+             'MagicLog,1,fakemodel,07-22-2019_17-53-34-450')
 
-    @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
-                return_value=mock_android_device.MockAdbProxy('emulator-5554'))
-    @mock.patch(
-        'mobly.controllers.android_device_lib.fastboot.FastbootProxy',
-        return_value=mock_android_device.MockFastbootProxy('emulator-5554'))
-    def test_AndroidDevice_is_emulator_when_emulator_serial(
-            self, MockFastboot, MockAdbProxy):
-        ad = android_device.AndroidDevice(serial='emulator-5554')
-        self.assertTrue(ad.is_emulator)
+  @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
+        return_value=mock_android_device.MockAdbProxy('1'))
+  @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
+        return_value=mock_android_device.MockFastbootProxy('1'))
+  @mock.patch('mobly.logger.get_log_file_timestamp')
+  @mock.patch('mobly.logger.sanitize_filename')
+  def test_AndroidDevice_generate_filename_assert_sanitation(
+      self, sanitize_filename_mock, get_log_file_timestamp_mock,
+      MockFastboot, MockAdbProxy):
+    mock_serial = 1
+    ad = android_device.AndroidDevice(serial=mock_serial)
+    get_log_file_timestamp_mock.return_value = '07-22-2019_17-53-34-450'
+    filename = ad.generate_filename('MagicLog')
+    sanitize_filename_mock.assert_called_with(
+      'MagicLog,1,fakemodel,07-22-2019_17-53-34-450')
 
-    @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
-                return_value=mock_android_device.MockAdbProxy('1'))
-    @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
-                return_value=mock_android_device.MockFastbootProxy('1'))
-    @mock.patch('mobly.logger.get_log_file_timestamp')
-    def test_AndroidDevice_generate_filename_default(
-            self, get_log_file_timestamp_mock, MockFastboot, MockAdbProxy):
-        mock_serial = 1
-        ad = android_device.AndroidDevice(serial=mock_serial)
-        get_log_file_timestamp_mock.return_value = '07-22-2019_17-53-34-450'
-        filename = ad.generate_filename('MagicLog')
-        self.assertEqual(filename,
-                         'MagicLog,1,fakemodel,07-22-2019_17-53-34-450')
+  @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
+        return_value=mock_android_device.MockAdbProxy('1'))
+  @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
+        return_value=mock_android_device.MockFastbootProxy('1'))
+  @mock.patch('mobly.logger.get_log_file_timestamp')
+  def test_AndroidDevice_generate_filename_with_ext(
+      self, get_log_file_timestamp_mock, MockFastboot, MockAdbProxy):
+    mock_serial = 1
+    ad = android_device.AndroidDevice(serial=mock_serial)
+    get_log_file_timestamp_mock.return_value = '07-22-2019_17-53-34-450'
+    filename = ad.generate_filename('MagicLog', extension_name='log')
+    self.assertEqual(filename,
+             'MagicLog,1,fakemodel,07-22-2019_17-53-34-450.log')
 
-    @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
-                return_value=mock_android_device.MockAdbProxy('1'))
-    @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
-                return_value=mock_android_device.MockFastbootProxy('1'))
-    @mock.patch('mobly.logger.get_log_file_timestamp')
-    @mock.patch('mobly.logger.sanitize_filename')
-    def test_AndroidDevice_generate_filename_assert_sanitation(
-            self, sanitize_filename_mock, get_log_file_timestamp_mock,
-            MockFastboot, MockAdbProxy):
-        mock_serial = 1
-        ad = android_device.AndroidDevice(serial=mock_serial)
-        get_log_file_timestamp_mock.return_value = '07-22-2019_17-53-34-450'
-        filename = ad.generate_filename('MagicLog')
-        sanitize_filename_mock.assert_called_with(
-            'MagicLog,1,fakemodel,07-22-2019_17-53-34-450')
+  @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
+        return_value=mock_android_device.MockAdbProxy('1'))
+  @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
+        return_value=mock_android_device.MockFastbootProxy('1'))
+  @mock.patch('mobly.logger.get_log_file_timestamp')
+  def test_AndroidDevice_generate_filename_with_debug_tag(
+      self, get_log_file_timestamp_mock, MockFastboot, MockAdbProxy):
+    mock_serial = 1
+    ad = android_device.AndroidDevice(serial=mock_serial)
+    get_log_file_timestamp_mock.return_value = '07-22-2019_17-53-34-450'
+    ad.debug_tag = 'RoleX'
+    filename = ad.generate_filename('MagicLog')
+    self.assertEqual(filename,
+             'MagicLog,RoleX,1,fakemodel,07-22-2019_17-53-34-450')
 
-    @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
-                return_value=mock_android_device.MockAdbProxy('1'))
-    @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
-                return_value=mock_android_device.MockFastbootProxy('1'))
-    @mock.patch('mobly.logger.get_log_file_timestamp')
-    def test_AndroidDevice_generate_filename_with_ext(
-            self, get_log_file_timestamp_mock, MockFastboot, MockAdbProxy):
-        mock_serial = 1
-        ad = android_device.AndroidDevice(serial=mock_serial)
-        get_log_file_timestamp_mock.return_value = '07-22-2019_17-53-34-450'
-        filename = ad.generate_filename('MagicLog', extension_name='log')
-        self.assertEqual(filename,
-                         'MagicLog,1,fakemodel,07-22-2019_17-53-34-450.log')
-
-    @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
-                return_value=mock_android_device.MockAdbProxy('1'))
-    @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
-                return_value=mock_android_device.MockFastbootProxy('1'))
-    @mock.patch('mobly.logger.get_log_file_timestamp')
-    def test_AndroidDevice_generate_filename_with_debug_tag(
-            self, get_log_file_timestamp_mock, MockFastboot, MockAdbProxy):
-        mock_serial = 1
-        ad = android_device.AndroidDevice(serial=mock_serial)
-        get_log_file_timestamp_mock.return_value = '07-22-2019_17-53-34-450'
-        ad.debug_tag = 'RoleX'
-        filename = ad.generate_filename('MagicLog')
-        self.assertEqual(filename,
-                         'MagicLog,RoleX,1,fakemodel,07-22-2019_17-53-34-450')
-
-    @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
-                return_value=mock_android_device.MockAdbProxy('1'))
-    @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
-                return_value=mock_android_device.MockFastbootProxy('1'))
-    @mock.patch('mobly.logger.get_log_file_timestamp')
-    def test_AndroidDevice_generate_filename_with_runtime_info(
-            self, get_log_file_timestamp_mock, MockFastboot, MockAdbProxy):
-        mock_serial = 1
-        ad = android_device.AndroidDevice(serial=mock_serial)
-        get_log_file_timestamp_mock.return_value = '07-22-2019_17-53-34-450'
-        mock_record = mock.MagicMock(begin_time='1234567')
-        mock_test_info = runtime_test_info.RuntimeTestInfo(
-            'test_xyz', '/tmp/blah/', mock_record)
-        filename = ad.generate_filename('MagicLog',
-                                        time_identifier=mock_test_info)
-        self.assertEqual(filename, 'MagicLog,1,fakemodel,test_xyz-1234567')
-
-    @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
-                return_value=mock_android_device.MockAdbProxy('1'))
-    @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
-                return_value=mock_android_device.MockFastbootProxy('1'))
-    @mock.patch('mobly.logger.get_log_file_timestamp')
-    def test_AndroidDevice_generate_filename_with_custom_timestamp(
-            self, get_log_file_timestamp_mock, MockFastboot, MockAdbProxy):
-        mock_serial = 1
-        ad = android_device.AndroidDevice(serial=mock_serial)
-        get_log_file_timestamp_mock.return_value = '07-22-2019_17-53-34-450'
-        filename = ad.generate_filename('MagicLog',
-                                        time_identifier='my_special_time')
-        self.assertEqual(filename, 'MagicLog,1,fakemodel,my_special_time')
-
-    @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
-                return_value=mock_android_device.MockAdbProxy(1))
-    @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
-                return_value=mock_android_device.MockFastbootProxy(1))
-    @mock.patch('mobly.utils.create_dir')
-    def test_AndroidDevice_take_bug_report(self, create_dir_mock,
-                                           FastbootProxy, MockAdbProxy):
-        """Verifies AndroidDevice.take_bug_report calls the correct adb command
-        and writes the bugreport file to the correct path.
-        """
-        mock_serial = '1'
-        ad = android_device.AndroidDevice(serial=mock_serial)
-        output_path = ad.take_bug_report(test_name='test_something',
-                                         begin_time='sometime')
-        expected_path = os.path.join(logging.log_path,
-                                     'AndroidDevice%s' % ad.serial,
-                                     'BugReports')
-        create_dir_mock.assert_called_with(expected_path)
-        self.assertEqual(
-            output_path,
-            os.path.join(expected_path,
-                         'bugreport,test_something,1,fakemodel,sometime.zip'))
-
-    @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
-                return_value=mock_android_device.MockAdbProxy('1',
-                                                              fail_br=True))
-    @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
-                return_value=mock_android_device.MockFastbootProxy('1'))
-    @mock.patch('mobly.utils.create_dir')
-    def test_AndroidDevice_take_bug_report_fail(self, create_dir_mock,
-                                                FastbootProxy, MockAdbProxy):
-        """Verifies AndroidDevice.take_bug_report writes out the correct message
-        when taking bugreport fails.
-        """
-        mock_serial = '1'
-        ad = android_device.AndroidDevice(serial=mock_serial)
-        expected_msg = '.* Failed to take bugreport.'
-        with self.assertRaisesRegex(android_device.Error, expected_msg):
-            ad.take_bug_report(test_name='test_something',
-                               begin_time='sometime')
-
-    @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
-                return_value=mock_android_device.MockAdbProxy('1'))
-    @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
-                return_value=mock_android_device.MockFastbootProxy('1'))
-    @mock.patch('mobly.utils.create_dir')
-    @mock.patch('mobly.logger.get_log_file_timestamp')
-    def test_AndroidDevice_take_bug_report_without_args(
-            self, get_log_file_timestamp_mock, create_dir_mock, FastbootProxy,
-            MockAdbProxy):
-        get_log_file_timestamp_mock.return_value = '07-22-2019_17-53-34-450'
-        mock_serial = '1'
-        ad = android_device.AndroidDevice(serial=mock_serial)
-        output_path = ad.take_bug_report()
-        expected_path = os.path.join(logging.log_path,
-                                     'AndroidDevice%s' % ad.serial,
-                                     'BugReports')
-        self.assertEqual(
-            output_path,
-            os.path.join(expected_path,
-                         'bugreport,1,fakemodel,07-22-2019_17-53-34-450.zip'))
-
-    @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
-                return_value=mock_android_device.MockAdbProxy('1'))
-    @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
-                return_value=mock_android_device.MockFastbootProxy('1'))
-    @mock.patch('mobly.utils.create_dir')
-    @mock.patch('mobly.logger.get_log_file_timestamp')
-    def test_AndroidDevice_take_bug_report_with_only_test_name(
-            self, get_log_file_timestamp_mock, create_dir_mock, FastbootProxy,
-            MockAdbProxy):
-        get_log_file_timestamp_mock.return_value = '07-22-2019_17-53-34-450'
-        mock_serial = '1'
-        ad = android_device.AndroidDevice(serial=mock_serial)
-        output_path = ad.take_bug_report(test_name='test_something')
-        expected_path = os.path.join(logging.log_path,
-                                     'AndroidDevice%s' % ad.serial,
-                                     'BugReports')
-        create_dir_mock.assert_called_with(expected_path)
-        self.assertEqual(
-            output_path,
-            os.path.join(
-                expected_path,
-                'bugreport,test_something,1,fakemodel,07-22-2019_17-53-34-450.zip'
-            ))
-
-    @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
-                return_value=mock_android_device.MockAdbProxy(1))
-    @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
-                return_value=mock_android_device.MockFastbootProxy(1))
-    @mock.patch('mobly.utils.create_dir')
-    def test_AndroidDevice_take_bug_report_with_only_begin_time(
-            self, create_dir_mock, FastbootProxy, MockAdbProxy):
-        mock_serial = '1'
-        ad = android_device.AndroidDevice(serial=mock_serial)
-        output_path = ad.take_bug_report(begin_time='sometime')
-        expected_path = os.path.join(logging.log_path,
-                                     'AndroidDevice%s' % ad.serial,
-                                     'BugReports')
-        create_dir_mock.assert_called_with(expected_path)
-        self.assertEqual(
-            output_path,
-            os.path.join(expected_path, 'bugreport,1,fakemodel,sometime.zip'))
-
-    @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
-                return_value=mock_android_device.MockAdbProxy(1))
-    @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
-                return_value=mock_android_device.MockFastbootProxy(1))
-    @mock.patch('mobly.utils.create_dir')
-    def test_AndroidDevice_take_bug_report_with_int_begin_time(
-            self, create_dir_mock, FastbootProxy, MockAdbProxy):
-        mock_serial = '1'
-        ad = android_device.AndroidDevice(serial=mock_serial)
-        output_path = ad.take_bug_report(begin_time=123)
-        expected_path = os.path.join(logging.log_path,
-                                     'AndroidDevice%s' % ad.serial,
-                                     'BugReports')
-        create_dir_mock.assert_called_with(expected_path)
-        self.assertEqual(
-            output_path,
-            os.path.join(expected_path, 'bugreport,1,fakemodel,123.zip'))
-
-    @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
-                return_value=mock_android_device.MockAdbProxy(1))
-    @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
-                return_value=mock_android_device.MockFastbootProxy(1))
-    @mock.patch('mobly.utils.create_dir')
-    def test_AndroidDevice_take_bug_report_with_positional_args(
-            self, create_dir_mock, FastbootProxy, MockAdbProxy):
-        mock_serial = '1'
-        ad = android_device.AndroidDevice(serial=mock_serial)
-        output_path = ad.take_bug_report('test_something', 'sometime')
-        expected_path = os.path.join(logging.log_path,
-                                     'AndroidDevice%s' % ad.serial,
-                                     'BugReports')
-        create_dir_mock.assert_called_with(expected_path)
-        self.assertEqual(
-            output_path,
-            os.path.join(expected_path,
-                         'bugreport,test_something,1,fakemodel,sometime.zip'))
-
-    @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
-                return_value=mock_android_device.MockAdbProxy('1'))
-    @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
-                return_value=mock_android_device.MockFastbootProxy('1'))
-    @mock.patch('mobly.utils.create_dir')
-    def test_AndroidDevice_take_bug_report_with_destination(
-            self, create_dir_mock, FastbootProxy, MockAdbProxy):
-        mock_serial = '1'
-        ad = android_device.AndroidDevice(serial=mock_serial)
-        dest = tempfile.gettempdir()
-        output_path = ad.take_bug_report(test_name="test_something",
-                                         begin_time="sometime",
-                                         destination=dest)
-        expected_path = os.path.join(dest)
-        create_dir_mock.assert_called_with(expected_path)
-        self.assertEqual(
-            output_path,
-            os.path.join(expected_path,
-                         'bugreport,test_something,1,fakemodel,sometime.zip'))
-
-    @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
-                return_value=mock_android_device.MockAdbProxy(
-                    '1', fail_br_before_N=True))
-    @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
-                return_value=mock_android_device.MockFastbootProxy('1'))
-    @mock.patch('mobly.utils.create_dir')
-    def test_AndroidDevice_take_bug_report_fallback(self, create_dir_mock,
-                                                    FastbootProxy,
-                                                    MockAdbProxy):
-        """Verifies AndroidDevice.take_bug_report falls back to traditional
-        bugreport on builds that do not have bugreportz.
-        """
-        mock_serial = '1'
-        ad = android_device.AndroidDevice(serial=mock_serial)
-        output_path = ad.take_bug_report(test_name='test_something',
-                                         begin_time='sometime')
-        expected_path = os.path.join(logging.log_path,
-                                     'AndroidDevice%s' % ad.serial,
-                                     'BugReports')
-        create_dir_mock.assert_called_with(expected_path)
-        self.assertEqual(
-            output_path,
-            os.path.join(expected_path,
-                         'bugreport,test_something,1,fakemodel,sometime.txt'))
-
-    @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
-                return_value=mock_android_device.MockAdbProxy('1'))
-    @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
-                return_value=mock_android_device.MockFastbootProxy('1'))
-    @mock.patch('mobly.utils.create_dir')
-    @mock.patch('mobly.logger.get_log_file_timestamp')
-    def test_AndroidDevice_take_screenshot(self, get_log_file_timestamp_mock,
-                                           create_dir_mock, FastbootProxy,
-                                           MockAdbProxy):
-        get_log_file_timestamp_mock.return_value = '07-22-2019_17-53-34-450'
-        mock_serial = '1'
-        ad = android_device.AndroidDevice(serial=mock_serial)
-        full_pic_path = ad.take_screenshot(self.tmp_dir)
-        self.assertEqual(
-            full_pic_path,
-            os.path.join(self.tmp_dir,
-                         'screenshot,1,fakemodel,07-22-2019_17-53-34-450.png'))
-
-    @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
-                return_value=mock_android_device.MockAdbProxy('1'))
-    @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
-                return_value=mock_android_device.MockFastbootProxy('1'))
-    @mock.patch('mobly.utils.start_standing_subprocess',
-                return_value='process')
-    @mock.patch('mobly.utils.stop_standing_subprocess')
-    def test_AndroidDevice_change_log_path(self, stop_proc_mock,
-                                           start_proc_mock, FastbootProxy,
-                                           MockAdbProxy):
-        ad = android_device.AndroidDevice(serial='1')
-        old_path = ad.log_path
-        new_log_path = tempfile.mkdtemp()
-        ad.log_path = new_log_path
-        self.assertTrue(os.path.exists(new_log_path))
-        self.assertFalse(os.path.exists(old_path))
-
-    @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
-                return_value=mock_android_device.MockAdbProxy('1'))
-    @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
-                return_value=mock_android_device.MockFastbootProxy('1'))
-    @mock.patch('mobly.utils.start_standing_subprocess',
-                return_value='process')
-    @mock.patch('mobly.utils.stop_standing_subprocess')
-    def test_AndroidDevice_change_log_path_no_log_exists(
-            self, stop_proc_mock, start_proc_mock, FastbootProxy,
-            MockAdbProxy):
-        ad = android_device.AndroidDevice(serial='1')
-        old_path = ad.log_path
-        new_log_path = tempfile.mkdtemp()
-        ad.log_path = new_log_path
-        self.assertTrue(os.path.exists(new_log_path))
-        self.assertFalse(os.path.exists(old_path))
-
-    @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
-                return_value=mock_android_device.MockAdbProxy('127.0.0.1:5557')
-                )
-    @mock.patch(
-        'mobly.controllers.android_device_lib.fastboot.FastbootProxy',
-        return_value=mock_android_device.MockFastbootProxy('127.0.0.1:5557'))
-    @mock.patch('mobly.utils.start_standing_subprocess',
-                return_value='process')
-    @mock.patch('mobly.utils.stop_standing_subprocess')
-    def test_AndroidDevice_with_reserved_character_in_serial_log_path(
-            self, stop_proc_mock, start_proc_mock, FastbootProxy,
-            MockAdbProxy):
-        ad = android_device.AndroidDevice(serial='127.0.0.1:5557')
-        base_log_path = os.path.basename(ad.log_path)
-        self.assertEqual(base_log_path, 'AndroidDevice127.0.0.1-5557')
-
-    @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
-                return_value=mock_android_device.MockAdbProxy('1'))
-    @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
-                return_value=mock_android_device.MockFastbootProxy('1'))
-    @mock.patch('mobly.utils.create_dir')
-    @mock.patch('mobly.utils.start_standing_subprocess',
-                return_value='process')
-    @mock.patch('mobly.utils.stop_standing_subprocess')
-    @mock.patch.object(logcat.Logcat, '_open_logcat_file')
-    def test_AndroidDevice_change_log_path_with_service(
-            self, open_logcat_mock, stop_proc_mock, start_proc_mock,
-            creat_dir_mock, FastbootProxy, MockAdbProxy):
-        ad = android_device.AndroidDevice(serial='1')
-        ad.services.logcat.start()
-        new_log_path = tempfile.mkdtemp()
-        expected_msg = '.* Cannot change `log_path` when there is service running.'
-        with self.assertRaisesRegex(android_device.Error, expected_msg):
-            ad.log_path = new_log_path
-
-    @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
-                return_value=mock_android_device.MockAdbProxy('1'))
-    @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
-                return_value=mock_android_device.MockFastbootProxy('1'))
-    @mock.patch('mobly.utils.create_dir')
-    @mock.patch('mobly.utils.start_standing_subprocess',
-                return_value='process')
-    @mock.patch('mobly.utils.stop_standing_subprocess')
-    def test_AndroidDevice_change_log_path_with_existing_file(
-            self, stop_proc_mock, start_proc_mock, creat_dir_mock,
-            FastbootProxy, MockAdbProxy):
-        ad = android_device.AndroidDevice(serial='1')
-        new_log_path = tempfile.mkdtemp()
-        new_file_path = os.path.join(new_log_path, 'file.txt')
-        with io.open(new_file_path, 'w', encoding='utf-8') as f:
-            f.write(u'hahah.')
-        expected_msg = '.* Logs already exist .*'
-        with self.assertRaisesRegex(android_device.Error, expected_msg):
-            ad.log_path = new_log_path
-
-    @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
-                return_value=mock_android_device.MockAdbProxy('1'))
-    @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
-                return_value=mock_android_device.MockFastbootProxy('1'))
-    @mock.patch('mobly.utils.create_dir')
-    @mock.patch('mobly.utils.start_standing_subprocess',
-                return_value='process')
-    @mock.patch('mobly.utils.stop_standing_subprocess')
-    def test_AndroidDevice_update_serial(self, stop_proc_mock, start_proc_mock,
-                                         creat_dir_mock, FastbootProxy,
-                                         MockAdbProxy):
-        ad = android_device.AndroidDevice(serial='1')
-        ad.update_serial('2')
-        self.assertEqual(ad.serial, '2')
-        self.assertEqual(ad.debug_tag, ad.serial)
-        self.assertEqual(ad.adb.serial, ad.serial)
-        self.assertEqual(ad.fastboot.serial, ad.serial)
-
-    @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
-                return_value=mock_android_device.MockAdbProxy('1'))
-    @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
-                return_value=mock_android_device.MockFastbootProxy('1'))
-    @mock.patch('mobly.utils.create_dir')
-    @mock.patch('mobly.utils.start_standing_subprocess',
-                return_value='process')
-    @mock.patch('mobly.utils.stop_standing_subprocess')
-    @mock.patch.object(logcat.Logcat, '_open_logcat_file')
-    def test_AndroidDevice_update_serial_with_service_running(
-            self, open_logcat_mock, stop_proc_mock, start_proc_mock,
-            creat_dir_mock, FastbootProxy, MockAdbProxy):
-        ad = android_device.AndroidDevice(serial='1')
-        ad.services.logcat.start()
-        expected_msg = '.* Cannot change device serial number when there is service running.'
-        with self.assertRaisesRegex(android_device.Error, expected_msg):
-            ad.update_serial('2')
-
-    @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
-                return_value=mock_android_device.MockAdbProxy('1'))
-    @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
-                return_value=mock_android_device.MockFastbootProxy('1'))
-    @mock.patch(
-        'mobly.controllers.android_device_lib.snippet_client.SnippetClient')
-    @mock.patch('mobly.utils.get_available_host_port')
-    def test_AndroidDevice_load_snippet(self, MockGetPort, MockSnippetClient,
-                                        MockFastboot, MockAdbProxy):
-        ad = android_device.AndroidDevice(serial='1')
-        ad.load_snippet('snippet', MOCK_SNIPPET_PACKAGE_NAME)
-        self.assertTrue(hasattr(ad, 'snippet'))
-
-    @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
-                return_value=mock_android_device.MockAdbProxy('1'))
-    @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
-                return_value=mock_android_device.MockFastbootProxy('1'))
-    @mock.patch(
-        'mobly.controllers.android_device_lib.snippet_client.SnippetClient')
-    @mock.patch('mobly.utils.get_available_host_port')
-    def test_AndroidDevice_getattr(self, MockGetPort, MockSnippetClient,
-                                   MockFastboot, MockAdbProxy):
-        ad = android_device.AndroidDevice(serial='1')
-        ad.load_snippet('snippet', MOCK_SNIPPET_PACKAGE_NAME)
-        value = {'value': 42}
-        actual_value = getattr(ad, 'some_attr', value)
-        self.assertEqual(actual_value, value)
-
-    @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
-                return_value=mock_android_device.MockAdbProxy('1'))
-    @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
-                return_value=mock_android_device.MockFastbootProxy('1'))
-    @mock.patch(
-        'mobly.controllers.android_device_lib.snippet_client.SnippetClient',
-        return_value=MockSnippetClient)
-    @mock.patch('mobly.utils.get_available_host_port')
-    def test_AndroidDevice_load_snippet_dup_package(self, MockGetPort,
-                                                    MockSnippetClient,
-                                                    MockFastboot,
-                                                    MockAdbProxy):
-        ad = android_device.AndroidDevice(serial='1')
-        ad.load_snippet('snippet', MOCK_SNIPPET_PACKAGE_NAME)
-        expected_msg = ('Snippet package "%s" has already been loaded under '
-                        'name "snippet".') % MOCK_SNIPPET_PACKAGE_NAME
-        with self.assertRaisesRegex(android_device.Error, expected_msg):
-            ad.load_snippet('snippet2', MOCK_SNIPPET_PACKAGE_NAME)
-
-    @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
-                return_value=mock_android_device.MockAdbProxy('1'))
-    @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
-                return_value=mock_android_device.MockFastbootProxy('1'))
-    @mock.patch(
-        'mobly.controllers.android_device_lib.snippet_client.SnippetClient',
-        return_value=MockSnippetClient)
-    @mock.patch('mobly.utils.get_available_host_port')
-    def test_AndroidDevice_load_snippet_dup_snippet_name(
-            self, MockGetPort, MockSnippetClient, MockFastboot, MockAdbProxy):
-        ad = android_device.AndroidDevice(serial='1')
-        ad.load_snippet('snippet', MOCK_SNIPPET_PACKAGE_NAME)
-        expected_msg = ('.* Attribute "snippet" already exists, please use a '
-                        'different name.')
-        with self.assertRaisesRegex(android_device.Error, expected_msg):
-            ad.load_snippet('snippet', MOCK_SNIPPET_PACKAGE_NAME + 'haha')
-
-    @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
-                return_value=mock_android_device.MockAdbProxy('1'))
-    @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
-                return_value=mock_android_device.MockFastbootProxy('1'))
-    @mock.patch(
-        'mobly.controllers.android_device_lib.snippet_client.SnippetClient')
-    @mock.patch('mobly.utils.get_available_host_port')
-    def test_AndroidDevice_load_snippet_dup_attribute_name(
-            self, MockGetPort, MockSnippetClient, MockFastboot, MockAdbProxy):
-        ad = android_device.AndroidDevice(serial='1')
-        expected_msg = ('Attribute "%s" already exists, please use a different'
-                        ' name') % 'adb'
-        with self.assertRaisesRegex(android_device.Error, expected_msg):
-            ad.load_snippet('adb', MOCK_SNIPPET_PACKAGE_NAME)
-
-    @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
-                return_value=mock_android_device.MockAdbProxy('1'))
-    @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
-                return_value=mock_android_device.MockFastbootProxy('1'))
-    @mock.patch(
-        'mobly.controllers.android_device_lib.snippet_client.SnippetClient')
-    @mock.patch('mobly.utils.get_available_host_port')
-    def test_AndroidDevice_load_snippet_start_app_fails(
-            self, MockGetPort, MockSnippetClient, MockFastboot, MockAdbProxy):
-        """Verifies that the correct exception is raised if start app failed.
-
-        It's possible that the `stop_app` call as part of the start app failure
-        teardown also fails. So we want the exception from the start app
-        failure.
-        """
-        expected_e = Exception('start failed.')
-        MockSnippetClient.start_app_and_connect = mock.Mock(
-            side_effect=expected_e)
-        MockSnippetClient.stop_app = mock.Mock(
-            side_effect=Exception('stop failed.'))
-        ad = android_device.AndroidDevice(serial='1')
-        try:
-            ad.load_snippet('snippet', MOCK_SNIPPET_PACKAGE_NAME)
-        except Exception as e:
-            assertIs(e, expected_e)
-
-    @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
-                return_value=mock_android_device.MockAdbProxy('1'))
-    @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
-                return_value=mock_android_device.MockFastbootProxy('1'))
-    @mock.patch(
-        'mobly.controllers.android_device_lib.snippet_client.SnippetClient')
-    @mock.patch('mobly.utils.get_available_host_port')
-    def test_AndroidDevice_unload_snippet(self, MockGetPort, MockSnippetClient,
-                                          MockFastboot, MockAdbProxy):
-        ad = android_device.AndroidDevice(serial='1')
-        ad.load_snippet('snippet', MOCK_SNIPPET_PACKAGE_NAME)
-        ad.unload_snippet('snippet')
-        self.assertFalse(hasattr(ad, 'snippet'))
-        with self.assertRaisesRegex(
-                android_device.SnippetError,
-                '<AndroidDevice|1> No snippet registered with name "snippet"'):
-            ad.unload_snippet('snippet')
-        # Loading the same snippet again should succeed
-        ad.load_snippet('snippet', MOCK_SNIPPET_PACKAGE_NAME)
-        self.assertTrue(hasattr(ad, 'snippet'))
-
-    @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
-                return_value=mock_android_device.MockAdbProxy('1'))
-    @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
-                return_value=mock_android_device.MockFastbootProxy('1'))
-    @mock.patch(
-        'mobly.controllers.android_device_lib.snippet_client.SnippetClient')
-    @mock.patch('mobly.utils.get_available_host_port')
-    @mock.patch.object(logcat.Logcat, '_open_logcat_file')
-    def test_AndroidDevice_snippet_cleanup(self, open_logcat_mock, MockGetPort,
-                                           MockSnippetClient, MockFastboot,
-                                           MockAdbProxy):
-        ad = android_device.AndroidDevice(serial='1')
-        ad.services.start_all()
-        ad.load_snippet('snippet', MOCK_SNIPPET_PACKAGE_NAME)
-        ad.unload_snippet('snippet')
-        self.assertFalse(hasattr(ad, 'snippet'))
-
-    @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
-                return_value=mock_android_device.MockAdbProxy('1'))
-    @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
-                return_value=mock_android_device.MockFastbootProxy('1'))
-    def test_AndroidDevice_debug_tag(self, MockFastboot, MockAdbProxy):
-        mock_serial = '1'
-        ad = android_device.AndroidDevice(serial=mock_serial)
-        self.assertEqual(ad.debug_tag, '1')
-        try:
-            raise android_device.DeviceError(ad, 'Something')
-        except android_device.DeviceError as e:
-            self.assertEqual('<AndroidDevice|1> Something', str(e))
-        # Verify that debug tag's setter updates the debug prefix correctly.
-        ad.debug_tag = 'Mememe'
-        try:
-            raise android_device.DeviceError(ad, 'Something')
-        except android_device.DeviceError as e:
-            self.assertEqual('<AndroidDevice|Mememe> Something', str(e))
-        # Verify that repr is changed correctly.
-        try:
-            raise Exception(ad, 'Something')
-        except Exception as e:
-            self.assertEqual("(<AndroidDevice|Mememe>, 'Something')", str(e))
-
-    @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
-                return_value=mock_android_device.MockAdbProxy('1'))
-    @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
-                return_value=mock_android_device.MockFastbootProxy('1'))
-    @mock.patch('mobly.utils.start_standing_subprocess',
-                return_value='process')
-    @mock.patch('mobly.utils.stop_standing_subprocess')
-    @mock.patch.object(logcat.Logcat, '_open_logcat_file')
-    def test_AndroidDevice_handle_usb_disconnect(self, open_logcat_mock,
-                                                 stop_proc_mock,
-                                                 start_proc_mock,
-                                                 FastbootProxy, MockAdbProxy):
-        class MockService(base_service.BaseService):
-            def __init__(self, device, configs=None):
-                self._alive = False
-                self.pause_called = False
-                self.resume_called = False
-
-            @property
-            def is_alive(self):
-                return self._alive
-
-            def start(self, configs=None):
-                self._alive = True
+  @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
+        return_value=mock_android_device.MockAdbProxy('1'))
+  @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
+        return_value=mock_android_device.MockFastbootProxy('1'))
+  @mock.patch('mobly.logger.get_log_file_timestamp')
+  def test_AndroidDevice_generate_filename_with_runtime_info(
+      self, get_log_file_timestamp_mock, MockFastboot, MockAdbProxy):
+    mock_serial = 1
+    ad = android_device.AndroidDevice(serial=mock_serial)
+    get_log_file_timestamp_mock.return_value = '07-22-2019_17-53-34-450'
+    mock_record = mock.MagicMock(begin_time='1234567')
+    mock_test_info = runtime_test_info.RuntimeTestInfo(
+      'test_xyz', '/tmp/blah/', mock_record)
+    filename = ad.generate_filename('MagicLog',
+                    time_identifier=mock_test_info)
+    self.assertEqual(filename, 'MagicLog,1,fakemodel,test_xyz-1234567')
 
-            def stop(self):
-                self._alive = False
+  @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
+        return_value=mock_android_device.MockAdbProxy('1'))
+  @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
+        return_value=mock_android_device.MockFastbootProxy('1'))
+  @mock.patch('mobly.logger.get_log_file_timestamp')
+  def test_AndroidDevice_generate_filename_with_custom_timestamp(
+      self, get_log_file_timestamp_mock, MockFastboot, MockAdbProxy):
+    mock_serial = 1
+    ad = android_device.AndroidDevice(serial=mock_serial)
+    get_log_file_timestamp_mock.return_value = '07-22-2019_17-53-34-450'
+    filename = ad.generate_filename('MagicLog',
+                    time_identifier='my_special_time')
+    self.assertEqual(filename, 'MagicLog,1,fakemodel,my_special_time')
 
-            def pause(self):
-                self._alive = False
-                self.pause_called = True
+  @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
+        return_value=mock_android_device.MockAdbProxy(1))
+  @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
+        return_value=mock_android_device.MockFastbootProxy(1))
+  @mock.patch('mobly.utils.create_dir')
+  def test_AndroidDevice_take_bug_report(self, create_dir_mock,
+                       FastbootProxy, MockAdbProxy):
+    """Verifies AndroidDevice.take_bug_report calls the correct adb command
+    and writes the bugreport file to the correct path.
+    """
+    mock_serial = '1'
+    ad = android_device.AndroidDevice(serial=mock_serial)
+    output_path = ad.take_bug_report(test_name='test_something',
+                     begin_time='sometime')
+    expected_path = os.path.join(logging.log_path,
+                   'AndroidDevice%s' % ad.serial,
+                   'BugReports')
+    create_dir_mock.assert_called_with(expected_path)
+    self.assertEqual(
+      output_path,
+      os.path.join(expected_path,
+             'bugreport,test_something,1,fakemodel,sometime.zip'))
 
-            def resume(self):
-                self._alive = True
-                self.resume_called = True
+  @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
+        return_value=mock_android_device.MockAdbProxy('1',
+                                fail_br=True))
+  @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
+        return_value=mock_android_device.MockFastbootProxy('1'))
+  @mock.patch('mobly.utils.create_dir')
+  def test_AndroidDevice_take_bug_report_fail(self, create_dir_mock,
+                        FastbootProxy, MockAdbProxy):
+    """Verifies AndroidDevice.take_bug_report writes out the correct message
+    when taking bugreport fails.
+    """
+    mock_serial = '1'
+    ad = android_device.AndroidDevice(serial=mock_serial)
+    expected_msg = '.* Failed to take bugreport.'
+    with self.assertRaisesRegex(android_device.Error, expected_msg):
+      ad.take_bug_report(test_name='test_something',
+                 begin_time='sometime')
 
-        ad = android_device.AndroidDevice(serial='1')
-        ad.services.start_all()
-        ad.services.register('mock_service', MockService)
-        with ad.handle_usb_disconnect():
-            self.assertFalse(ad.services.is_any_alive)
-            self.assertTrue(ad.services.mock_service.pause_called)
-            self.assertFalse(ad.services.mock_service.resume_called)
-        self.assertTrue(ad.services.is_any_alive)
-        self.assertTrue(ad.services.mock_service.resume_called)
+  @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
+        return_value=mock_android_device.MockAdbProxy('1'))
+  @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
+        return_value=mock_android_device.MockFastbootProxy('1'))
+  @mock.patch('mobly.utils.create_dir')
+  @mock.patch('mobly.logger.get_log_file_timestamp')
+  def test_AndroidDevice_take_bug_report_without_args(
+      self, get_log_file_timestamp_mock, create_dir_mock, FastbootProxy,
+      MockAdbProxy):
+    get_log_file_timestamp_mock.return_value = '07-22-2019_17-53-34-450'
+    mock_serial = '1'
+    ad = android_device.AndroidDevice(serial=mock_serial)
+    output_path = ad.take_bug_report()
+    expected_path = os.path.join(logging.log_path,
+                   'AndroidDevice%s' % ad.serial,
+                   'BugReports')
+    self.assertEqual(
+      output_path,
+      os.path.join(expected_path,
+             'bugreport,1,fakemodel,07-22-2019_17-53-34-450.zip'))
 
-    @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
-                return_value=mock_android_device.MockAdbProxy('1'))
-    @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
-                return_value=mock_android_device.MockFastbootProxy('1'))
-    @mock.patch('mobly.utils.start_standing_subprocess',
-                return_value='process')
-    @mock.patch('mobly.utils.stop_standing_subprocess')
-    @mock.patch.object(logcat.Logcat, '_open_logcat_file')
-    def test_AndroidDevice_handle_reboot(self, open_logcat_mock,
-                                         stop_proc_mock, start_proc_mock,
-                                         FastbootProxy, MockAdbProxy):
-        class MockService(base_service.BaseService):
-            def __init__(self, device, configs=None):
-                self._alive = False
-                self.pause_called = False
-                self.resume_called = False
+  @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
+        return_value=mock_android_device.MockAdbProxy('1'))
+  @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
+        return_value=mock_android_device.MockFastbootProxy('1'))
+  @mock.patch('mobly.utils.create_dir')
+  @mock.patch('mobly.logger.get_log_file_timestamp')
+  def test_AndroidDevice_take_bug_report_with_only_test_name(
+      self, get_log_file_timestamp_mock, create_dir_mock, FastbootProxy,
+      MockAdbProxy):
+    get_log_file_timestamp_mock.return_value = '07-22-2019_17-53-34-450'
+    mock_serial = '1'
+    ad = android_device.AndroidDevice(serial=mock_serial)
+    output_path = ad.take_bug_report(test_name='test_something')
+    expected_path = os.path.join(logging.log_path,
+                   'AndroidDevice%s' % ad.serial,
+                   'BugReports')
+    create_dir_mock.assert_called_with(expected_path)
+    self.assertEqual(
+      output_path,
+      os.path.join(
+        expected_path,
+        'bugreport,test_something,1,fakemodel,07-22-2019_17-53-34-450.zip'
+      ))
 
-            @property
-            def is_alive(self):
-                return self._alive
+  @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
+        return_value=mock_android_device.MockAdbProxy(1))
+  @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
+        return_value=mock_android_device.MockFastbootProxy(1))
+  @mock.patch('mobly.utils.create_dir')
+  def test_AndroidDevice_take_bug_report_with_only_begin_time(
+      self, create_dir_mock, FastbootProxy, MockAdbProxy):
+    mock_serial = '1'
+    ad = android_device.AndroidDevice(serial=mock_serial)
+    output_path = ad.take_bug_report(begin_time='sometime')
+    expected_path = os.path.join(logging.log_path,
+                   'AndroidDevice%s' % ad.serial,
+                   'BugReports')
+    create_dir_mock.assert_called_with(expected_path)
+    self.assertEqual(
+      output_path,
+      os.path.join(expected_path, 'bugreport,1,fakemodel,sometime.zip'))
 
-            def start(self, configs=None):
-                self._alive = True
+  @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
+        return_value=mock_android_device.MockAdbProxy(1))
+  @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
+        return_value=mock_android_device.MockFastbootProxy(1))
+  @mock.patch('mobly.utils.create_dir')
+  def test_AndroidDevice_take_bug_report_with_int_begin_time(
+      self, create_dir_mock, FastbootProxy, MockAdbProxy):
+    mock_serial = '1'
+    ad = android_device.AndroidDevice(serial=mock_serial)
+    output_path = ad.take_bug_report(begin_time=123)
+    expected_path = os.path.join(logging.log_path,
+                   'AndroidDevice%s' % ad.serial,
+                   'BugReports')
+    create_dir_mock.assert_called_with(expected_path)
+    self.assertEqual(
+      output_path,
+      os.path.join(expected_path, 'bugreport,1,fakemodel,123.zip'))
 
-            def stop(self):
-                self._alive = False
+  @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
+        return_value=mock_android_device.MockAdbProxy(1))
+  @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
+        return_value=mock_android_device.MockFastbootProxy(1))
+  @mock.patch('mobly.utils.create_dir')
+  def test_AndroidDevice_take_bug_report_with_positional_args(
+      self, create_dir_mock, FastbootProxy, MockAdbProxy):
+    mock_serial = '1'
+    ad = android_device.AndroidDevice(serial=mock_serial)
+    output_path = ad.take_bug_report('test_something', 'sometime')
+    expected_path = os.path.join(logging.log_path,
+                   'AndroidDevice%s' % ad.serial,
+                   'BugReports')
+    create_dir_mock.assert_called_with(expected_path)
+    self.assertEqual(
+      output_path,
+      os.path.join(expected_path,
+             'bugreport,test_something,1,fakemodel,sometime.zip'))
 
-            def pause(self):
-                self._alive = False
-                self.pause_called = True
+  @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
+        return_value=mock_android_device.MockAdbProxy('1'))
+  @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
+        return_value=mock_android_device.MockFastbootProxy('1'))
+  @mock.patch('mobly.utils.create_dir')
+  def test_AndroidDevice_take_bug_report_with_destination(
+      self, create_dir_mock, FastbootProxy, MockAdbProxy):
+    mock_serial = '1'
+    ad = android_device.AndroidDevice(serial=mock_serial)
+    dest = tempfile.gettempdir()
+    output_path = ad.take_bug_report(test_name="test_something",
+                     begin_time="sometime",
+                     destination=dest)
+    expected_path = os.path.join(dest)
+    create_dir_mock.assert_called_with(expected_path)
+    self.assertEqual(
+      output_path,
+      os.path.join(expected_path,
+             'bugreport,test_something,1,fakemodel,sometime.zip'))
 
-            def resume(self):
-                self._alive = True
-                self.resume_called = True
+  @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
+        return_value=mock_android_device.MockAdbProxy(
+          '1', fail_br_before_N=True))
+  @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
+        return_value=mock_android_device.MockFastbootProxy('1'))
+  @mock.patch('mobly.utils.create_dir')
+  def test_AndroidDevice_take_bug_report_fallback(self, create_dir_mock,
+                          FastbootProxy,
+                          MockAdbProxy):
+    """Verifies AndroidDevice.take_bug_report falls back to traditional
+    bugreport on builds that do not have bugreportz.
+    """
+    mock_serial = '1'
+    ad = android_device.AndroidDevice(serial=mock_serial)
+    output_path = ad.take_bug_report(test_name='test_something',
+                     begin_time='sometime')
+    expected_path = os.path.join(logging.log_path,
+                   'AndroidDevice%s' % ad.serial,
+                   'BugReports')
+    create_dir_mock.assert_called_with(expected_path)
+    self.assertEqual(
+      output_path,
+      os.path.join(expected_path,
+             'bugreport,test_something,1,fakemodel,sometime.txt'))
 
-        ad = android_device.AndroidDevice(serial='1')
-        ad.services.start_all()
-        ad.services.register('mock_service', MockService)
-        with ad.handle_reboot():
-            self.assertFalse(ad.services.is_any_alive)
-            self.assertFalse(ad.services.mock_service.pause_called)
-            self.assertFalse(ad.services.mock_service.resume_called)
-        self.assertTrue(ad.services.is_any_alive)
-        self.assertFalse(ad.services.mock_service.resume_called)
+  @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
+        return_value=mock_android_device.MockAdbProxy('1'))
+  @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
+        return_value=mock_android_device.MockFastbootProxy('1'))
+  @mock.patch('mobly.utils.create_dir')
+  @mock.patch('mobly.logger.get_log_file_timestamp')
+  def test_AndroidDevice_take_screenshot(self, get_log_file_timestamp_mock,
+                       create_dir_mock, FastbootProxy,
+                       MockAdbProxy):
+    get_log_file_timestamp_mock.return_value = '07-22-2019_17-53-34-450'
+    mock_serial = '1'
+    ad = android_device.AndroidDevice(serial=mock_serial)
+    full_pic_path = ad.take_screenshot(self.tmp_dir)
+    self.assertEqual(
+      full_pic_path,
+      os.path.join(self.tmp_dir,
+             'screenshot,1,fakemodel,07-22-2019_17-53-34-450.png'))
 
-    @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
-                return_value=mock_android_device.MockAdbProxy('1'))
-    @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
-                return_value=mock_android_device.MockFastbootProxy('1'))
-    @mock.patch('mobly.utils.start_standing_subprocess',
-                return_value='process')
-    @mock.patch('mobly.utils.stop_standing_subprocess')
-    @mock.patch.object(logcat.Logcat, '_open_logcat_file')
-    def test_AndroidDevice_handle_reboot_changes_build_info(
-            self, open_logcat_mock, stop_proc_mock, start_proc_mock,
-            FastbootProxy, MockAdbProxy):
-        ad = android_device.AndroidDevice(serial='1')
-        with ad.handle_reboot():
-            ad.adb.mock_properties['ro.build.type'] = 'user'
-            ad.adb.mock_properties['ro.debuggable'] = '0'
-        self.assertEqual(ad.build_info['build_type'], 'user')
-        self.assertEqual(ad.build_info['debuggable'], '0')
-        self.assertFalse(ad.is_rootable)
-        self.assertEqual(ad.adb.getprops_call_count, 2)
+  @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
+        return_value=mock_android_device.MockAdbProxy('1'))
+  @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
+        return_value=mock_android_device.MockFastbootProxy('1'))
+  @mock.patch('mobly.utils.start_standing_subprocess',
+        return_value='process')
+  @mock.patch('mobly.utils.stop_standing_subprocess')
+  def test_AndroidDevice_change_log_path(self, stop_proc_mock,
+                       start_proc_mock, FastbootProxy,
+                       MockAdbProxy):
+    ad = android_device.AndroidDevice(serial='1')
+    old_path = ad.log_path
+    new_log_path = tempfile.mkdtemp()
+    ad.log_path = new_log_path
+    self.assertTrue(os.path.exists(new_log_path))
+    self.assertFalse(os.path.exists(old_path))
 
-    @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
-                return_value=mock_android_device.MockAdbProxy('1'))
-    @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
-                return_value=mock_android_device.MockFastbootProxy('1'))
-    @mock.patch('mobly.utils.start_standing_subprocess',
-                return_value='process')
-    @mock.patch('mobly.utils.stop_standing_subprocess')
-    @mock.patch.object(logcat.Logcat, '_open_logcat_file')
-    def test_AndroidDevice_handle_reboot_changes_build_info_with_caching(
-            self, open_logcat_mock, stop_proc_mock, start_proc_mock,
-            FastbootProxy, MockAdbProxy):
-        ad = android_device.AndroidDevice(serial='1')  # Call getprops 1.
-        rootable_states = [ad.is_rootable]
-        with ad.handle_reboot():
-            rootable_states.append(ad.is_rootable)  # Call getprops 2.
-            ad.adb.mock_properties['ro.debuggable'] = '0'
-            rootable_states.append(ad.is_rootable)  # Call getprops 3.
-        # Call getprops 4, on context manager end.
-        rootable_states.append(ad.is_rootable)  # Cached call.
-        rootable_states.append(ad.is_rootable)  # Cached call.
-        self.assertEqual(ad.adb.getprops_call_count, 4)
-        self.assertEqual(rootable_states, [True, True, False, False, False])
+  @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
+        return_value=mock_android_device.MockAdbProxy('1'))
+  @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
+        return_value=mock_android_device.MockFastbootProxy('1'))
+  @mock.patch('mobly.utils.start_standing_subprocess',
+        return_value='process')
+  @mock.patch('mobly.utils.stop_standing_subprocess')
+  def test_AndroidDevice_change_log_path_no_log_exists(
+      self, stop_proc_mock, start_proc_mock, FastbootProxy,
+      MockAdbProxy):
+    ad = android_device.AndroidDevice(serial='1')
+    old_path = ad.log_path
+    new_log_path = tempfile.mkdtemp()
+    ad.log_path = new_log_path
+    self.assertTrue(os.path.exists(new_log_path))
+    self.assertFalse(os.path.exists(old_path))
 
-    @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
-                return_value=mock_android_device.MockAdbProxy('1'))
-    @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
-                return_value=mock_android_device.MockFastbootProxy('1'))
-    @mock.patch(
-        'mobly.controllers.android_device.AndroidDevice.is_boot_completed',
-        side_effect=[
-            False, False,
-            adb.AdbTimeoutError(['adb', 'shell', 'getprop sys.boot_completed'],
-                                timeout=5,
-                                serial=1), True
-        ])
-    @mock.patch('time.sleep', return_value=None)
-    @mock.patch('time.time', side_effect=[0, 5, 10, 15, 20, 25, 30])
-    def test_AndroidDevice_wait_for_completion_completed(
-            self, MockTime, MockSleep, MockIsBootCompleted, FastbootProxy,
-            MockAdbProxy):
-        ad = android_device.AndroidDevice(serial='1')
-        raised = False
-        try:
-            ad.wait_for_boot_completion()
-        except (adb.AdbError, adb.AdbTimeoutError):
-            raised = True
-        self.assertFalse(
-            raised,
-            'adb.AdbError or adb.AdbTimeoutError exception raised but not handled.'
+  @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
+        return_value=mock_android_device.MockAdbProxy('127.0.0.1:5557')
         )
+  @mock.patch(
+    'mobly.controllers.android_device_lib.fastboot.FastbootProxy',
+    return_value=mock_android_device.MockFastbootProxy('127.0.0.1:5557'))
+  @mock.patch('mobly.utils.start_standing_subprocess',
+        return_value='process')
+  @mock.patch('mobly.utils.stop_standing_subprocess')
+  def test_AndroidDevice_with_reserved_character_in_serial_log_path(
+      self, stop_proc_mock, start_proc_mock, FastbootProxy,
+      MockAdbProxy):
+    ad = android_device.AndroidDevice(serial='127.0.0.1:5557')
+    base_log_path = os.path.basename(ad.log_path)
+    self.assertEqual(base_log_path, 'AndroidDevice127.0.0.1-5557')
 
-    @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
-                return_value=mock_android_device.MockAdbProxy('1'))
-    @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
-                return_value=mock_android_device.MockFastbootProxy('1'))
-    @mock.patch(
-        'mobly.controllers.android_device.AndroidDevice.is_boot_completed',
-        side_effect=[
-            False, False,
-            adb.AdbTimeoutError(['adb', 'shell', 'getprop sys.boot_completed'],
-                                timeout=5,
-                                serial=1), False, False, False, False
-        ])
-    @mock.patch('time.sleep', return_value=None)
-    @mock.patch('time.time', side_effect=[0, 5, 10, 15, 20, 25, 30])
-    def test_AndroidDevice_wait_for_completion_never_boot(
-            self, MockTime, MockSleep, MockIsBootCompleted, FastbootProxy,
-            MockAdbProxy):
-        ad = android_device.AndroidDevice(serial='1')
-        raised = False
-        try:
-            with self.assertRaises(android_device.DeviceError):
-                ad.wait_for_boot_completion(timeout=20)
-        except (adb.AdbError, adb.AdbTimeoutError):
-            raised = True
-        self.assertFalse(
-            raised,
-            'adb.AdbError or adb.AdbTimeoutError exception raised but not handled.'
-        )
+  @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
+        return_value=mock_android_device.MockAdbProxy('1'))
+  @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
+        return_value=mock_android_device.MockFastbootProxy('1'))
+  @mock.patch('mobly.utils.create_dir')
+  @mock.patch('mobly.utils.start_standing_subprocess',
+        return_value='process')
+  @mock.patch('mobly.utils.stop_standing_subprocess')
+  @mock.patch.object(logcat.Logcat, '_open_logcat_file')
+  def test_AndroidDevice_change_log_path_with_service(
+      self, open_logcat_mock, stop_proc_mock, start_proc_mock,
+      creat_dir_mock, FastbootProxy, MockAdbProxy):
+    ad = android_device.AndroidDevice(serial='1')
+    ad.services.logcat.start()
+    new_log_path = tempfile.mkdtemp()
+    expected_msg = '.* Cannot change `log_path` when there is service running.'
+    with self.assertRaisesRegex(android_device.Error, expected_msg):
+      ad.log_path = new_log_path
 
-    def test_AndroidDevice_parse_device_list_when_decode_error(self):
-        gbk_str = b'\xc4\xe3\xba\xc3'
-        raised = False
-        try:
-            android_device.parse_device_list(gbk_str, 'some_key')
-        except UnicodeDecodeError:
-            raised = True
-        self.assertTrue(
-            raised,
-            'did not raise an exception when parsing gbk bytes'
-        )
+  @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
+        return_value=mock_android_device.MockAdbProxy('1'))
+  @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
+        return_value=mock_android_device.MockFastbootProxy('1'))
+  @mock.patch('mobly.utils.create_dir')
+  @mock.patch('mobly.utils.start_standing_subprocess',
+        return_value='process')
+  @mock.patch('mobly.utils.stop_standing_subprocess')
+  def test_AndroidDevice_change_log_path_with_existing_file(
+      self, stop_proc_mock, start_proc_mock, creat_dir_mock,
+      FastbootProxy, MockAdbProxy):
+    ad = android_device.AndroidDevice(serial='1')
+    new_log_path = tempfile.mkdtemp()
+    new_file_path = os.path.join(new_log_path, 'file.txt')
+    with io.open(new_file_path, 'w', encoding='utf-8') as f:
+      f.write(u'hahah.')
+    expected_msg = '.* Logs already exist .*'
+    with self.assertRaisesRegex(android_device.Error, expected_msg):
+      ad.log_path = new_log_path
+
+  @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
+        return_value=mock_android_device.MockAdbProxy('1'))
+  @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
+        return_value=mock_android_device.MockFastbootProxy('1'))
+  @mock.patch('mobly.utils.create_dir')
+  @mock.patch('mobly.utils.start_standing_subprocess',
+        return_value='process')
+  @mock.patch('mobly.utils.stop_standing_subprocess')
+  def test_AndroidDevice_update_serial(self, stop_proc_mock, start_proc_mock,
+                     creat_dir_mock, FastbootProxy,
+                     MockAdbProxy):
+    ad = android_device.AndroidDevice(serial='1')
+    ad.update_serial('2')
+    self.assertEqual(ad.serial, '2')
+    self.assertEqual(ad.debug_tag, ad.serial)
+    self.assertEqual(ad.adb.serial, ad.serial)
+    self.assertEqual(ad.fastboot.serial, ad.serial)
+
+  @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
+        return_value=mock_android_device.MockAdbProxy('1'))
+  @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
+        return_value=mock_android_device.MockFastbootProxy('1'))
+  @mock.patch('mobly.utils.create_dir')
+  @mock.patch('mobly.utils.start_standing_subprocess',
+        return_value='process')
+  @mock.patch('mobly.utils.stop_standing_subprocess')
+  @mock.patch.object(logcat.Logcat, '_open_logcat_file')
+  def test_AndroidDevice_update_serial_with_service_running(
+      self, open_logcat_mock, stop_proc_mock, start_proc_mock,
+      creat_dir_mock, FastbootProxy, MockAdbProxy):
+    ad = android_device.AndroidDevice(serial='1')
+    ad.services.logcat.start()
+    expected_msg = '.* Cannot change device serial number when there is service running.'
+    with self.assertRaisesRegex(android_device.Error, expected_msg):
+      ad.update_serial('2')
+
+  @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
+        return_value=mock_android_device.MockAdbProxy('1'))
+  @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
+        return_value=mock_android_device.MockFastbootProxy('1'))
+  @mock.patch(
+    'mobly.controllers.android_device_lib.snippet_client.SnippetClient')
+  @mock.patch('mobly.utils.get_available_host_port')
+  def test_AndroidDevice_load_snippet(self, MockGetPort, MockSnippetClient,
+                    MockFastboot, MockAdbProxy):
+    ad = android_device.AndroidDevice(serial='1')
+    ad.load_snippet('snippet', MOCK_SNIPPET_PACKAGE_NAME)
+    self.assertTrue(hasattr(ad, 'snippet'))
+
+  @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
+        return_value=mock_android_device.MockAdbProxy('1'))
+  @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
+        return_value=mock_android_device.MockFastbootProxy('1'))
+  @mock.patch(
+    'mobly.controllers.android_device_lib.snippet_client.SnippetClient')
+  @mock.patch('mobly.utils.get_available_host_port')
+  def test_AndroidDevice_getattr(self, MockGetPort, MockSnippetClient,
+                   MockFastboot, MockAdbProxy):
+    ad = android_device.AndroidDevice(serial='1')
+    ad.load_snippet('snippet', MOCK_SNIPPET_PACKAGE_NAME)
+    value = {'value': 42}
+    actual_value = getattr(ad, 'some_attr', value)
+    self.assertEqual(actual_value, value)
+
+  @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
+        return_value=mock_android_device.MockAdbProxy('1'))
+  @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
+        return_value=mock_android_device.MockFastbootProxy('1'))
+  @mock.patch(
+    'mobly.controllers.android_device_lib.snippet_client.SnippetClient',
+    return_value=MockSnippetClient)
+  @mock.patch('mobly.utils.get_available_host_port')
+  def test_AndroidDevice_load_snippet_dup_package(self, MockGetPort,
+                          MockSnippetClient,
+                          MockFastboot,
+                          MockAdbProxy):
+    ad = android_device.AndroidDevice(serial='1')
+    ad.load_snippet('snippet', MOCK_SNIPPET_PACKAGE_NAME)
+    expected_msg = ('Snippet package "%s" has already been loaded under '
+            'name "snippet".') % MOCK_SNIPPET_PACKAGE_NAME
+    with self.assertRaisesRegex(android_device.Error, expected_msg):
+      ad.load_snippet('snippet2', MOCK_SNIPPET_PACKAGE_NAME)
+
+  @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
+        return_value=mock_android_device.MockAdbProxy('1'))
+  @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
+        return_value=mock_android_device.MockFastbootProxy('1'))
+  @mock.patch(
+    'mobly.controllers.android_device_lib.snippet_client.SnippetClient',
+    return_value=MockSnippetClient)
+  @mock.patch('mobly.utils.get_available_host_port')
+  def test_AndroidDevice_load_snippet_dup_snippet_name(
+      self, MockGetPort, MockSnippetClient, MockFastboot, MockAdbProxy):
+    ad = android_device.AndroidDevice(serial='1')
+    ad.load_snippet('snippet', MOCK_SNIPPET_PACKAGE_NAME)
+    expected_msg = ('.* Attribute "snippet" already exists, please use a '
+            'different name.')
+    with self.assertRaisesRegex(android_device.Error, expected_msg):
+      ad.load_snippet('snippet', MOCK_SNIPPET_PACKAGE_NAME + 'haha')
+
+  @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
+        return_value=mock_android_device.MockAdbProxy('1'))
+  @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
+        return_value=mock_android_device.MockFastbootProxy('1'))
+  @mock.patch(
+    'mobly.controllers.android_device_lib.snippet_client.SnippetClient')
+  @mock.patch('mobly.utils.get_available_host_port')
+  def test_AndroidDevice_load_snippet_dup_attribute_name(
+      self, MockGetPort, MockSnippetClient, MockFastboot, MockAdbProxy):
+    ad = android_device.AndroidDevice(serial='1')
+    expected_msg = ('Attribute "%s" already exists, please use a different'
+            ' name') % 'adb'
+    with self.assertRaisesRegex(android_device.Error, expected_msg):
+      ad.load_snippet('adb', MOCK_SNIPPET_PACKAGE_NAME)
+
+  @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
+        return_value=mock_android_device.MockAdbProxy('1'))
+  @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
+        return_value=mock_android_device.MockFastbootProxy('1'))
+  @mock.patch(
+    'mobly.controllers.android_device_lib.snippet_client.SnippetClient')
+  @mock.patch('mobly.utils.get_available_host_port')
+  def test_AndroidDevice_load_snippet_start_app_fails(
+      self, MockGetPort, MockSnippetClient, MockFastboot, MockAdbProxy):
+    """Verifies that the correct exception is raised if start app failed.
+
+    It's possible that the `stop_app` call as part of the start app failure
+    teardown also fails. So we want the exception from the start app
+    failure.
+    """
+    expected_e = Exception('start failed.')
+    MockSnippetClient.start_app_and_connect = mock.Mock(
+      side_effect=expected_e)
+    MockSnippetClient.stop_app = mock.Mock(
+      side_effect=Exception('stop failed.'))
+    ad = android_device.AndroidDevice(serial='1')
+    try:
+      ad.load_snippet('snippet', MOCK_SNIPPET_PACKAGE_NAME)
+    except Exception as e:
+      assertIs(e, expected_e)
+
+  @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
+        return_value=mock_android_device.MockAdbProxy('1'))
+  @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
+        return_value=mock_android_device.MockFastbootProxy('1'))
+  @mock.patch(
+    'mobly.controllers.android_device_lib.snippet_client.SnippetClient')
+  @mock.patch('mobly.utils.get_available_host_port')
+  def test_AndroidDevice_unload_snippet(self, MockGetPort, MockSnippetClient,
+                      MockFastboot, MockAdbProxy):
+    ad = android_device.AndroidDevice(serial='1')
+    ad.load_snippet('snippet', MOCK_SNIPPET_PACKAGE_NAME)
+    ad.unload_snippet('snippet')
+    self.assertFalse(hasattr(ad, 'snippet'))
+    with self.assertRaisesRegex(
+        android_device.SnippetError,
+        '<AndroidDevice|1> No snippet registered with name "snippet"'):
+      ad.unload_snippet('snippet')
+    # Loading the same snippet again should succeed
+    ad.load_snippet('snippet', MOCK_SNIPPET_PACKAGE_NAME)
+    self.assertTrue(hasattr(ad, 'snippet'))
+
+  @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
+        return_value=mock_android_device.MockAdbProxy('1'))
+  @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
+        return_value=mock_android_device.MockFastbootProxy('1'))
+  @mock.patch(
+    'mobly.controllers.android_device_lib.snippet_client.SnippetClient')
+  @mock.patch('mobly.utils.get_available_host_port')
+  @mock.patch.object(logcat.Logcat, '_open_logcat_file')
+  def test_AndroidDevice_snippet_cleanup(self, open_logcat_mock, MockGetPort,
+                       MockSnippetClient, MockFastboot,
+                       MockAdbProxy):
+    ad = android_device.AndroidDevice(serial='1')
+    ad.services.start_all()
+    ad.load_snippet('snippet', MOCK_SNIPPET_PACKAGE_NAME)
+    ad.unload_snippet('snippet')
+    self.assertFalse(hasattr(ad, 'snippet'))
+
+  @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
+        return_value=mock_android_device.MockAdbProxy('1'))
+  @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
+        return_value=mock_android_device.MockFastbootProxy('1'))
+  def test_AndroidDevice_debug_tag(self, MockFastboot, MockAdbProxy):
+    mock_serial = '1'
+    ad = android_device.AndroidDevice(serial=mock_serial)
+    self.assertEqual(ad.debug_tag, '1')
+    try:
+      raise android_device.DeviceError(ad, 'Something')
+    except android_device.DeviceError as e:
+      self.assertEqual('<AndroidDevice|1> Something', str(e))
+    # Verify that debug tag's setter updates the debug prefix correctly.
+    ad.debug_tag = 'Mememe'
+    try:
+      raise android_device.DeviceError(ad, 'Something')
+    except android_device.DeviceError as e:
+      self.assertEqual('<AndroidDevice|Mememe> Something', str(e))
+    # Verify that repr is changed correctly.
+    try:
+      raise Exception(ad, 'Something')
+    except Exception as e:
+      self.assertEqual("(<AndroidDevice|Mememe>, 'Something')", str(e))
+
+  @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
+        return_value=mock_android_device.MockAdbProxy('1'))
+  @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
+        return_value=mock_android_device.MockFastbootProxy('1'))
+  @mock.patch('mobly.utils.start_standing_subprocess',
+        return_value='process')
+  @mock.patch('mobly.utils.stop_standing_subprocess')
+  @mock.patch.object(logcat.Logcat, '_open_logcat_file')
+  def test_AndroidDevice_handle_usb_disconnect(self, open_logcat_mock,
+                         stop_proc_mock,
+                         start_proc_mock,
+                         FastbootProxy, MockAdbProxy):
+    class MockService(base_service.BaseService):
+      def __init__(self, device, configs=None):
+        self._alive = False
+        self.pause_called = False
+        self.resume_called = False
+
+      @property
+      def is_alive(self):
+        return self._alive
+
+      def start(self, configs=None):
+        self._alive = True
+
+      def stop(self):
+        self._alive = False
+
+      def pause(self):
+        self._alive = False
+        self.pause_called = True
+
+      def resume(self):
+        self._alive = True
+        self.resume_called = True
+
+    ad = android_device.AndroidDevice(serial='1')
+    ad.services.start_all()
+    ad.services.register('mock_service', MockService)
+    with ad.handle_usb_disconnect():
+      self.assertFalse(ad.services.is_any_alive)
+      self.assertTrue(ad.services.mock_service.pause_called)
+      self.assertFalse(ad.services.mock_service.resume_called)
+    self.assertTrue(ad.services.is_any_alive)
+    self.assertTrue(ad.services.mock_service.resume_called)
+
+  @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
+        return_value=mock_android_device.MockAdbProxy('1'))
+  @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
+        return_value=mock_android_device.MockFastbootProxy('1'))
+  @mock.patch('mobly.utils.start_standing_subprocess',
+        return_value='process')
+  @mock.patch('mobly.utils.stop_standing_subprocess')
+  @mock.patch.object(logcat.Logcat, '_open_logcat_file')
+  def test_AndroidDevice_handle_reboot(self, open_logcat_mock,
+                     stop_proc_mock, start_proc_mock,
+                     FastbootProxy, MockAdbProxy):
+    class MockService(base_service.BaseService):
+      def __init__(self, device, configs=None):
+        self._alive = False
+        self.pause_called = False
+        self.resume_called = False
+
+      @property
+      def is_alive(self):
+        return self._alive
+
+      def start(self, configs=None):
+        self._alive = True
+
+      def stop(self):
+        self._alive = False
+
+      def pause(self):
+        self._alive = False
+        self.pause_called = True
+
+      def resume(self):
+        self._alive = True
+        self.resume_called = True
+
+    ad = android_device.AndroidDevice(serial='1')
+    ad.services.start_all()
+    ad.services.register('mock_service', MockService)
+    with ad.handle_reboot():
+      self.assertFalse(ad.services.is_any_alive)
+      self.assertFalse(ad.services.mock_service.pause_called)
+      self.assertFalse(ad.services.mock_service.resume_called)
+    self.assertTrue(ad.services.is_any_alive)
+    self.assertFalse(ad.services.mock_service.resume_called)
+
+  @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
+        return_value=mock_android_device.MockAdbProxy('1'))
+  @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
+        return_value=mock_android_device.MockFastbootProxy('1'))
+  @mock.patch('mobly.utils.start_standing_subprocess',
+        return_value='process')
+  @mock.patch('mobly.utils.stop_standing_subprocess')
+  @mock.patch.object(logcat.Logcat, '_open_logcat_file')
+  def test_AndroidDevice_handle_reboot_changes_build_info(
+      self, open_logcat_mock, stop_proc_mock, start_proc_mock,
+      FastbootProxy, MockAdbProxy):
+    ad = android_device.AndroidDevice(serial='1')
+    with ad.handle_reboot():
+      ad.adb.mock_properties['ro.build.type'] = 'user'
+      ad.adb.mock_properties['ro.debuggable'] = '0'
+    self.assertEqual(ad.build_info['build_type'], 'user')
+    self.assertEqual(ad.build_info['debuggable'], '0')
+    self.assertFalse(ad.is_rootable)
+    self.assertEqual(ad.adb.getprops_call_count, 2)
+
+  @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
+        return_value=mock_android_device.MockAdbProxy('1'))
+  @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
+        return_value=mock_android_device.MockFastbootProxy('1'))
+  @mock.patch('mobly.utils.start_standing_subprocess',
+        return_value='process')
+  @mock.patch('mobly.utils.stop_standing_subprocess')
+  @mock.patch.object(logcat.Logcat, '_open_logcat_file')
+  def test_AndroidDevice_handle_reboot_changes_build_info_with_caching(
+      self, open_logcat_mock, stop_proc_mock, start_proc_mock,
+      FastbootProxy, MockAdbProxy):
+    ad = android_device.AndroidDevice(serial='1')  # Call getprops 1.
+    rootable_states = [ad.is_rootable]
+    with ad.handle_reboot():
+      rootable_states.append(ad.is_rootable)  # Call getprops 2.
+      ad.adb.mock_properties['ro.debuggable'] = '0'
+      rootable_states.append(ad.is_rootable)  # Call getprops 3.
+    # Call getprops 4, on context manager end.
+    rootable_states.append(ad.is_rootable)  # Cached call.
+    rootable_states.append(ad.is_rootable)  # Cached call.
+    self.assertEqual(ad.adb.getprops_call_count, 4)
+    self.assertEqual(rootable_states, [True, True, False, False, False])
+
+  @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
+        return_value=mock_android_device.MockAdbProxy('1'))
+  @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
+        return_value=mock_android_device.MockFastbootProxy('1'))
+  @mock.patch(
+    'mobly.controllers.android_device.AndroidDevice.is_boot_completed',
+    side_effect=[
+      False, False,
+      adb.AdbTimeoutError(['adb', 'shell', 'getprop sys.boot_completed'],
+                timeout=5,
+                serial=1), True
+    ])
+  @mock.patch('time.sleep', return_value=None)
+  @mock.patch('time.time', side_effect=[0, 5, 10, 15, 20, 25, 30])
+  def test_AndroidDevice_wait_for_completion_completed(
+      self, MockTime, MockSleep, MockIsBootCompleted, FastbootProxy,
+      MockAdbProxy):
+    ad = android_device.AndroidDevice(serial='1')
+    raised = False
+    try:
+      ad.wait_for_boot_completion()
+    except (adb.AdbError, adb.AdbTimeoutError):
+      raised = True
+    self.assertFalse(
+      raised,
+      'adb.AdbError or adb.AdbTimeoutError exception raised but not handled.'
+    )
+
+  @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
+        return_value=mock_android_device.MockAdbProxy('1'))
+  @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
+        return_value=mock_android_device.MockFastbootProxy('1'))
+  @mock.patch(
+    'mobly.controllers.android_device.AndroidDevice.is_boot_completed',
+    side_effect=[
+      False, False,
+      adb.AdbTimeoutError(['adb', 'shell', 'getprop sys.boot_completed'],
+                timeout=5,
+                serial=1), False, False, False, False
+    ])
+  @mock.patch('time.sleep', return_value=None)
+  @mock.patch('time.time', side_effect=[0, 5, 10, 15, 20, 25, 30])
+  def test_AndroidDevice_wait_for_completion_never_boot(
+      self, MockTime, MockSleep, MockIsBootCompleted, FastbootProxy,
+      MockAdbProxy):
+    ad = android_device.AndroidDevice(serial='1')
+    raised = False
+    try:
+      with self.assertRaises(android_device.DeviceError):
+        ad.wait_for_boot_completion(timeout=20)
+    except (adb.AdbError, adb.AdbTimeoutError):
+      raised = True
+    self.assertFalse(
+      raised,
+      'adb.AdbError or adb.AdbTimeoutError exception raised but not handled.'
+    )
+
+  def test_AndroidDevice_parse_device_list_when_decode_error(self):
+    gbk_str = b'\xc4\xe3\xba\xc3'
+    raised = False
+    try:
+      android_device.parse_device_list(gbk_str, 'some_key')
+    except UnicodeDecodeError:
+      raised = True
+    self.assertTrue(
+      raised,
+      'did not raise an exception when parsing gbk bytes'
+    )
 
 
 if __name__ == '__main__':
-    unittest.main()
+  unittest.main()
diff --git a/tests/mobly/controllers/monsoon_test.py b/tests/mobly/controllers/monsoon_test.py
index c8b6eeb..dd7c249 100755
--- a/tests/mobly/controllers/monsoon_test.py
+++ b/tests/mobly/controllers/monsoon_test.py
@@ -18,12 +18,12 @@
 
 
 class MonsoonTest(unittest.TestCase):
-    @unittest.skipIf(platform.system() == 'Windows',
-                     'fcntl does not exist on Windows')
-    def test_monsoon_import(self):
-        # TODO: Replace 'fnctl' with a Windows equivalent when on Windows
-        from mobly.controllers import monsoon
+  @unittest.skipIf(platform.system() == 'Windows',
+           'fcntl does not exist on Windows')
+  def test_monsoon_import(self):
+    # TODO: Replace 'fnctl' with a Windows equivalent when on Windows
+    from mobly.controllers import monsoon
 
 
 if __name__ == '__main__':
-    unittest.main()
+  unittest.main()
diff --git a/tests/mobly/logger_test.py b/tests/mobly/logger_test.py
index 2112656..9bedc0b 100755
--- a/tests/mobly/logger_test.py
+++ b/tests/mobly/logger_test.py
@@ -23,204 +23,204 @@
 
 
 class LoggerTest(unittest.TestCase):
-    """Verifies code in mobly.logger module.
-    """
-    def setUp(self):
-        self.log_dir = tempfile.mkdtemp()
+  """Verifies code in mobly.logger module.
+  """
+  def setUp(self):
+    self.log_dir = tempfile.mkdtemp()
 
-    def tearDown(self):
-        shutil.rmtree(self.log_dir)
+  def tearDown(self):
+    shutil.rmtree(self.log_dir)
 
-    def test_epoch_to_log_line_timestamp(self):
-        actual_stamp = logger.epoch_to_log_line_timestamp(1469134262116,
-                                                          time_zone=pytz.utc)
-        self.assertEqual("07-21 20:51:02.116", actual_stamp)
+  def test_epoch_to_log_line_timestamp(self):
+    actual_stamp = logger.epoch_to_log_line_timestamp(1469134262116,
+                              time_zone=pytz.utc)
+    self.assertEqual("07-21 20:51:02.116", actual_stamp)
 
-    def test_is_valid_logline_timestamp(self):
-        self.assertTrue(
-            logger.is_valid_logline_timestamp("06-21 17:44:42.336"))
+  def test_is_valid_logline_timestamp(self):
+    self.assertTrue(
+      logger.is_valid_logline_timestamp("06-21 17:44:42.336"))
 
-    def test_is_valid_logline_timestamp_when_wrong_length(self):
-        self.assertFalse(
-            logger.is_valid_logline_timestamp("  06-21 17:44:42.336"))
+  def test_is_valid_logline_timestamp_when_wrong_length(self):
+    self.assertFalse(
+      logger.is_valid_logline_timestamp("  06-21 17:44:42.336"))
 
-    def test_is_valid_logline_timestamp_when_invalid_content(self):
-        self.assertFalse(
-            logger.is_valid_logline_timestamp("------------------"))
+  def test_is_valid_logline_timestamp_when_invalid_content(self):
+    self.assertFalse(
+      logger.is_valid_logline_timestamp("------------------"))
 
-    @mock.patch('mobly.utils.create_alias')
-    def test_create_latest_log_alias(self, mock_create_alias):
-        logger.create_latest_log_alias('fake_path', alias='latest')
-        mock_create_alias.assert_called_once_with('fake_path', 'latest')
+  @mock.patch('mobly.utils.create_alias')
+  def test_create_latest_log_alias(self, mock_create_alias):
+    logger.create_latest_log_alias('fake_path', alias='latest')
+    mock_create_alias.assert_called_once_with('fake_path', 'latest')
 
-    @mock.patch('mobly.logger._setup_test_logger')
-    @mock.patch('mobly.logger.create_latest_log_alias')
-    def test_setup_test_logger_creates_log_alias(self,
-                                                 mock_create_latest_log_alias,
-                                                 mock__setup_test_logger):
-        logger.setup_test_logger(self.log_dir)
-        mock__setup_test_logger.assert_called_once_with(self.log_dir, None)
-        mock_create_latest_log_alias.assert_called_once_with(self.log_dir,
-                                                             alias='latest')
+  @mock.patch('mobly.logger._setup_test_logger')
+  @mock.patch('mobly.logger.create_latest_log_alias')
+  def test_setup_test_logger_creates_log_alias(self,
+                         mock_create_latest_log_alias,
+                         mock__setup_test_logger):
+    logger.setup_test_logger(self.log_dir)
+    mock__setup_test_logger.assert_called_once_with(self.log_dir, None)
+    mock_create_latest_log_alias.assert_called_once_with(self.log_dir,
+                               alias='latest')
 
-    @mock.patch('mobly.logger._setup_test_logger')
-    @mock.patch('mobly.logger.create_latest_log_alias')
-    def test_setup_test_logger_creates_log_alias_with_custom_value(
-            self, mock_create_latest_log_alias, mock__setup_test_logger):
-        mock_alias = mock.MagicMock()
-        logger.setup_test_logger(self.log_dir, alias=mock_alias)
+  @mock.patch('mobly.logger._setup_test_logger')
+  @mock.patch('mobly.logger.create_latest_log_alias')
+  def test_setup_test_logger_creates_log_alias_with_custom_value(
+      self, mock_create_latest_log_alias, mock__setup_test_logger):
+    mock_alias = mock.MagicMock()
+    logger.setup_test_logger(self.log_dir, alias=mock_alias)
 
-        mock_create_latest_log_alias.assert_called_once_with(self.log_dir,
-                                                             alias=mock_alias)
+    mock_create_latest_log_alias.assert_called_once_with(self.log_dir,
+                               alias=mock_alias)
 
-    def test_sanitize_filename_when_valid(self):
-        fake_filename = 'logcat.txt'
-        expected_filename = 'logcat.txt'
-        self.assertEqual(logger.sanitize_filename(fake_filename),
-                         expected_filename)
+  def test_sanitize_filename_when_valid(self):
+    fake_filename = 'logcat.txt'
+    expected_filename = 'logcat.txt'
+    self.assertEqual(logger.sanitize_filename(fake_filename),
+             expected_filename)
 
-    def test_sanitize_filename_when_valid_with_path(self):
-        fake_filename = os.path.join('dir', 'logs', 'logcat.txt')
-        expected_filename = os.path.join('dir', 'logs', 'logcat.txt')
-        self.assertEqual(logger.sanitize_filename(fake_filename),
-                         expected_filename)
+  def test_sanitize_filename_when_valid_with_path(self):
+    fake_filename = os.path.join('dir', 'logs', 'logcat.txt')
+    expected_filename = os.path.join('dir', 'logs', 'logcat.txt')
+    self.assertEqual(logger.sanitize_filename(fake_filename),
+             expected_filename)
 
-    def test_sanitize_filename_when_random_spaces(self):
-        fake_filename = 'log cat file.txt'
-        expected_filename = 'log_cat_file.txt'
-        self.assertEqual(logger.sanitize_filename(fake_filename),
-                         expected_filename)
+  def test_sanitize_filename_when_random_spaces(self):
+    fake_filename = 'log cat file.txt'
+    expected_filename = 'log_cat_file.txt'
+    self.assertEqual(logger.sanitize_filename(fake_filename),
+             expected_filename)
 
-    def test_sanitize_filename_when_over_max_characters(self):
-        fake_filename = 'l' * 300
-        expected_filename = 'l' * 237
-        self.assertEqual(len(logger.sanitize_filename(fake_filename)), 237)
-        self.assertEqual(logger.sanitize_filename(fake_filename),
-                         expected_filename)
+  def test_sanitize_filename_when_over_max_characters(self):
+    fake_filename = 'l' * 300
+    expected_filename = 'l' * 237
+    self.assertEqual(len(logger.sanitize_filename(fake_filename)), 237)
+    self.assertEqual(logger.sanitize_filename(fake_filename),
+             expected_filename)
 
-    def test_sanitize_filename_when_over_max_characters_with_extension(self):
-        fake_filename = 'l' * 300 + '.txt'
-        expected_filename = 'l' * 233 + '.txt'
-        self.assertEqual(len(logger.sanitize_filename(fake_filename)), 237)
-        self.assertEqual(logger.sanitize_filename(fake_filename),
-                         expected_filename)
+  def test_sanitize_filename_when_over_max_characters_with_extension(self):
+    fake_filename = 'l' * 300 + '.txt'
+    expected_filename = 'l' * 233 + '.txt'
+    self.assertEqual(len(logger.sanitize_filename(fake_filename)), 237)
+    self.assertEqual(logger.sanitize_filename(fake_filename),
+             expected_filename)
 
-    def test_sanitize_filename_when_extension_at_max_characters(self):
-        fake_filename = 'l' * 300 + '.' + 't' * 236
-        expected_filename = '.' + 't' * 236
-        self.assertEqual(len(logger.sanitize_filename(fake_filename)), 237)
-        self.assertEqual(logger.sanitize_filename(fake_filename),
-                         expected_filename)
+  def test_sanitize_filename_when_extension_at_max_characters(self):
+    fake_filename = 'l' * 300 + '.' + 't' * 236
+    expected_filename = '.' + 't' * 236
+    self.assertEqual(len(logger.sanitize_filename(fake_filename)), 237)
+    self.assertEqual(logger.sanitize_filename(fake_filename),
+             expected_filename)
 
-    def test_sanitize_filename_when_extension_over_max_characters(self):
-        fake_filename = 'l' * 300 + '.' + 't' * 300
-        expected_filename = 'l' * 237
-        self.assertEqual(len(logger.sanitize_filename(fake_filename)), 237)
-        self.assertEqual(logger.sanitize_filename(fake_filename),
-                         expected_filename)
+  def test_sanitize_filename_when_extension_over_max_characters(self):
+    fake_filename = 'l' * 300 + '.' + 't' * 300
+    expected_filename = 'l' * 237
+    self.assertEqual(len(logger.sanitize_filename(fake_filename)), 237)
+    self.assertEqual(logger.sanitize_filename(fake_filename),
+             expected_filename)
 
-    def test__sanitize_windows_filename_when_path_characters(self):
-        fake_filename = '/\\'
-        expected_filename = '__'
-        self.assertEqual(logger._sanitize_windows_filename(fake_filename),
-                         expected_filename)
+  def test__sanitize_windows_filename_when_path_characters(self):
+    fake_filename = '/\\'
+    expected_filename = '__'
+    self.assertEqual(logger._sanitize_windows_filename(fake_filename),
+             expected_filename)
 
-    def test_sanitize_filename_when_specical_characters(self):
-        fake_filename = '<>:"|?*\x00'
-        expected_filename = '---_,,,0'
-        self.assertEqual(logger.sanitize_filename(fake_filename),
-                         expected_filename)
+  def test_sanitize_filename_when_specical_characters(self):
+    fake_filename = '<>:"|?*\x00'
+    expected_filename = '---_,,,0'
+    self.assertEqual(logger.sanitize_filename(fake_filename),
+             expected_filename)
 
-    def test_sanitize_filename_when_con(self):
-        for fake_filename, expected_filename in [
-            ('con', 'mobly_con'),
-            ('CON', 'mobly_CON'),
-            ('con.txt', 'mobly_con.txt'),
-            ('connections.log', 'connections.log'),
-        ]:
-            self.assertEqual(logger.sanitize_filename(fake_filename),
-                             expected_filename)
+  def test_sanitize_filename_when_con(self):
+    for fake_filename, expected_filename in [
+      ('con', 'mobly_con'),
+      ('CON', 'mobly_CON'),
+      ('con.txt', 'mobly_con.txt'),
+      ('connections.log', 'connections.log'),
+    ]:
+      self.assertEqual(logger.sanitize_filename(fake_filename),
+               expected_filename)
 
-    def test_sanitize_filename_when_prn(self):
-        for fake_filename, expected_filename in [
-            ('prn', 'mobly_prn'),
-            ('PRN', 'mobly_PRN'),
-            ('prn.txt', 'mobly_prn.txt'),
-            ('prnters.log', 'prnters.log'),
-        ]:
-            self.assertEqual(logger.sanitize_filename(fake_filename),
-                             expected_filename)
+  def test_sanitize_filename_when_prn(self):
+    for fake_filename, expected_filename in [
+      ('prn', 'mobly_prn'),
+      ('PRN', 'mobly_PRN'),
+      ('prn.txt', 'mobly_prn.txt'),
+      ('prnters.log', 'prnters.log'),
+    ]:
+      self.assertEqual(logger.sanitize_filename(fake_filename),
+               expected_filename)
 
-    def test_sanitize_filename_when_aux(self):
-        for fake_filename, expected_filename in [
-            ('aux', 'mobly_aux'),
-            ('AUX', 'mobly_AUX'),
-            ('aux.txt', 'mobly_aux.txt'),
-            ('auxiliaries.log', 'auxiliaries.log'),
-        ]:
-            self.assertEqual(logger.sanitize_filename(fake_filename),
-                             expected_filename)
+  def test_sanitize_filename_when_aux(self):
+    for fake_filename, expected_filename in [
+      ('aux', 'mobly_aux'),
+      ('AUX', 'mobly_AUX'),
+      ('aux.txt', 'mobly_aux.txt'),
+      ('auxiliaries.log', 'auxiliaries.log'),
+    ]:
+      self.assertEqual(logger.sanitize_filename(fake_filename),
+               expected_filename)
 
-    def test_sanitize_filename_when_nul(self):
-        for fake_filename, expected_filename in [
-            ('nul', 'mobly_nul'),
-            ('NUL', 'mobly_NUL'),
-            ('nul.txt', 'mobly_nul.txt'),
-            ('nullptrs.log', 'nullptrs.log'),
-        ]:
-            self.assertEqual(logger.sanitize_filename(fake_filename),
-                             expected_filename)
+  def test_sanitize_filename_when_nul(self):
+    for fake_filename, expected_filename in [
+      ('nul', 'mobly_nul'),
+      ('NUL', 'mobly_NUL'),
+      ('nul.txt', 'mobly_nul.txt'),
+      ('nullptrs.log', 'nullptrs.log'),
+    ]:
+      self.assertEqual(logger.sanitize_filename(fake_filename),
+               expected_filename)
 
-    def test_sanitize_filename_when_com(self):
-        for fake_filename, expected_filename in [
-            ('com', 'com'),
-            ('COM0', 'mobly_COM0'),
-            ('com1', 'mobly_com1'),
-            ('COM2', 'mobly_COM2'),
-            ('com3', 'mobly_com3'),
-            ('COM4', 'mobly_COM4'),
-            ('com5', 'mobly_com5'),
-            ('COM6', 'mobly_COM6'),
-            ('com7', 'mobly_com7'),
-            ('COM8', 'mobly_COM8'),
-            ('com9', 'mobly_com9'),
-            ('com0.log', 'mobly_com0.log'),
-            ('com0files.log', 'com0files.log'),
-        ]:
-            self.assertEqual(logger.sanitize_filename(fake_filename),
-                             expected_filename)
+  def test_sanitize_filename_when_com(self):
+    for fake_filename, expected_filename in [
+      ('com', 'com'),
+      ('COM0', 'mobly_COM0'),
+      ('com1', 'mobly_com1'),
+      ('COM2', 'mobly_COM2'),
+      ('com3', 'mobly_com3'),
+      ('COM4', 'mobly_COM4'),
+      ('com5', 'mobly_com5'),
+      ('COM6', 'mobly_COM6'),
+      ('com7', 'mobly_com7'),
+      ('COM8', 'mobly_COM8'),
+      ('com9', 'mobly_com9'),
+      ('com0.log', 'mobly_com0.log'),
+      ('com0files.log', 'com0files.log'),
+    ]:
+      self.assertEqual(logger.sanitize_filename(fake_filename),
+               expected_filename)
 
-    def test_sanitize_filename_when_lpt(self):
-        for fake_filename, expected_filename in [
-            ('lpt', 'lpt'),
-            ('LPT0', 'mobly_LPT0'),
-            ('lpt1', 'mobly_lpt1'),
-            ('LPT2', 'mobly_LPT2'),
-            ('lpt3', 'mobly_lpt3'),
-            ('LPT4', 'mobly_LPT4'),
-            ('lpt5', 'mobly_lpt5'),
-            ('LPT6', 'mobly_LPT6'),
-            ('lpt7', 'mobly_lpt7'),
-            ('LPT8', 'mobly_LPT8'),
-            ('lpt9', 'mobly_lpt9'),
-            ('lpt3.txt', 'mobly_lpt3.txt'),
-            ('lpt3_file.txt', 'lpt3_file.txt'),
-        ]:
-            self.assertEqual(logger.sanitize_filename(fake_filename),
-                             expected_filename)
+  def test_sanitize_filename_when_lpt(self):
+    for fake_filename, expected_filename in [
+      ('lpt', 'lpt'),
+      ('LPT0', 'mobly_LPT0'),
+      ('lpt1', 'mobly_lpt1'),
+      ('LPT2', 'mobly_LPT2'),
+      ('lpt3', 'mobly_lpt3'),
+      ('LPT4', 'mobly_LPT4'),
+      ('lpt5', 'mobly_lpt5'),
+      ('LPT6', 'mobly_LPT6'),
+      ('lpt7', 'mobly_lpt7'),
+      ('LPT8', 'mobly_LPT8'),
+      ('lpt9', 'mobly_lpt9'),
+      ('lpt3.txt', 'mobly_lpt3.txt'),
+      ('lpt3_file.txt', 'lpt3_file.txt'),
+    ]:
+      self.assertEqual(logger.sanitize_filename(fake_filename),
+               expected_filename)
 
-    def test_sanitize_filename_when_ends_with_space(self):
-        fake_filename = 'logcat.txt '
-        expected_filename = 'logcat.txt_'
-        self.assertEqual(logger.sanitize_filename(fake_filename),
-                         expected_filename)
+  def test_sanitize_filename_when_ends_with_space(self):
+    fake_filename = 'logcat.txt '
+    expected_filename = 'logcat.txt_'
+    self.assertEqual(logger.sanitize_filename(fake_filename),
+             expected_filename)
 
-    def test_sanitize_filename_when_ends_with_period(self):
-        fake_filename = 'logcat.txt.'
-        expected_filename = 'logcat.txt_'
-        self.assertEqual(logger.sanitize_filename(fake_filename),
-                         expected_filename)
+  def test_sanitize_filename_when_ends_with_period(self):
+    fake_filename = 'logcat.txt.'
+    expected_filename = 'logcat.txt_'
+    self.assertEqual(logger.sanitize_filename(fake_filename),
+             expected_filename)
 
 
 if __name__ == "__main__":
-    unittest.main()
+  unittest.main()
diff --git a/tests/mobly/output_test.py b/tests/mobly/output_test.py
index 6a8facb..676d7fc 100755
--- a/tests/mobly/output_test.py
+++ b/tests/mobly/output_test.py
@@ -32,300 +32,300 @@
 from tests.lib import teardown_class_failure_test
 
 if platform.system() == 'Windows':
-    import win32file
-    from win32com import client
+  import win32file
+  from win32com import client
 
 
 class OutputTest(unittest.TestCase):
-    """This test class has unit tests for the implementation of Mobly's output
-    files.
+  """This test class has unit tests for the implementation of Mobly's output
+  files.
+  """
+
+  def setUp(self):
+    self.tmp_dir = tempfile.mkdtemp()
+    self.base_mock_test_config = config_parser.TestRunConfig()
+    self.base_mock_test_config.testbed_name = 'SampleTestBed'
+    self.base_mock_test_config.controller_configs = {}
+    self.base_mock_test_config.user_params = {
+      'icecream': 42,
+      'extra_param': 'haha'
+    }
+    self.base_mock_test_config.log_path = self.tmp_dir
+    self.log_dir = self.base_mock_test_config.log_path
+    self.testbed_name = self.base_mock_test_config.testbed_name
+
+  def tearDown(self):
+    shutil.rmtree(self.tmp_dir)
+
+  def create_mock_test_config(self, base_mock_test_config):
+    mock_test_config = base_mock_test_config.copy()
+    mock_ctrlr_config_name = mock_controller.MOBLY_CONTROLLER_CONFIG_NAME
+    my_config = [{
+      'serial': 'xxxx',
+      'magic': 'Magic1'
+    }, {
+      'serial': 'xxxx',
+      'magic': 'Magic2'
+    }]
+    mock_test_config.controller_configs[mock_ctrlr_config_name] = my_config
+    return mock_test_config
+
+  def get_output_logs(self, output_dir):
+    summary_file_path = os.path.join(output_dir,
+                     records.OUTPUT_FILE_SUMMARY)
+    debug_log_path = os.path.join(output_dir,
+                    records.OUTPUT_FILE_DEBUG_LOG)
+    info_log_path = os.path.join(output_dir, records.OUTPUT_FILE_INFO_LOG)
+    return (summary_file_path, debug_log_path, info_log_path)
+
+  def assert_output_logs_exist(self, output_dir):
+    (summary_file_path, debug_log_path,
+     info_log_path) = self.get_output_logs(output_dir)
+    self.assertTrue(os.path.isfile(summary_file_path))
+    self.assertTrue(os.path.isfile(debug_log_path))
+    self.assertTrue(os.path.isfile(info_log_path))
+    return (summary_file_path, debug_log_path, info_log_path)
+
+  def assert_log_contents(self, log_path, whitelist=[], blacklist=[]):
+    with io.open(log_path, 'r', encoding='utf-8') as f:
+      content = f.read()
+      for item in whitelist:
+        self.assertIn(item, content)
+      for item in blacklist:
+        self.assertNotIn(item, content)
+
+  def test_yields_logging_path(self):
+    tr = test_runner.TestRunner(self.log_dir, self.testbed_name)
+    with tr.mobly_logger() as log_path:
+      self.assertEqual(log_path, logging.log_path)
+
+  @unittest.skipIf(platform.system() == 'Windows',
+           'Symlinks are usually specific to Unix operating systems')
+  def test_symlink(self):
+    """Verifies the symlink is created and links properly."""
+    mock_test_config = self.create_mock_test_config(
+      self.base_mock_test_config)
+    tr = test_runner.TestRunner(self.log_dir, self.testbed_name)
+    with tr.mobly_logger():
+      pass
+    symlink = os.path.join(self.log_dir, self.testbed_name, 'latest')
+    self.assertEqual(os.readlink(symlink), logging.log_path)
+
+  @unittest.skipIf(platform.system() != 'Windows',
+           'Shortcuts are specific to Windows operating systems')
+  def test_shortcut(self):
+    """Verifies the shortcut is created and links properly."""
+    shortcut_path = os.path.join(self.log_dir, self.testbed_name,
+                   'latest.lnk')
+    shell = client.Dispatch("WScript.Shell")
+    shortcut = shell.CreateShortCut(shortcut_path)
+    self.assertFalse(shortcut.Targetpath)
+    mock_test_config = self.create_mock_test_config(
+      self.base_mock_test_config)
+    tr = test_runner.TestRunner(self.log_dir, self.testbed_name)
+    with tr.mobly_logger():
+      pass
+    shortcut = shell.CreateShortCut(shortcut_path)
+    # Normalize paths for case and truncation
+    normalized_shortcut_path = os.path.normcase(
+      win32file.GetLongPathName(shortcut.Targetpath))
+    normalized_logger_path = os.path.normcase(
+      win32file.GetLongPathName(logging.log_path))
+    self.assertEqual(normalized_shortcut_path, normalized_logger_path)
+
+  @mock.patch('mobly.utils.create_alias')
+  def test_mobly_logger_with_default_latest_log_alias(
+      self, mock_create_alias):
+    mock_test_config = self.create_mock_test_config(
+      self.base_mock_test_config)
+    tr = test_runner.TestRunner(self.log_dir, self.testbed_name)
+    with tr.mobly_logger():
+      pass
+    expected_alias_dir = os.path.join(self.log_dir, self.testbed_name,
+                      'latest')
+    mock_create_alias.assert_called_once_with(logging.log_path,
+                          expected_alias_dir)
+
+  @mock.patch('mobly.utils.create_alias')
+  def test_mobly_logger_with_custom_latest_log_alias(self,
+                             mock_create_alias):
+    mock_test_config = self.create_mock_test_config(
+      self.base_mock_test_config)
+    tr = test_runner.TestRunner(self.log_dir, self.testbed_name)
+    with tr.mobly_logger(alias='history'):
+      pass
+    expected_alias_dir = os.path.join(self.log_dir, self.testbed_name,
+                      'history')
+    mock_create_alias.assert_called_once_with(logging.log_path,
+                          expected_alias_dir)
+
+  @mock.patch('mobly.utils.create_alias')
+  def test_mobly_logger_skips_latest_log_alias_when_none(
+      self, mock_create_alias):
+    mock_test_config = self.create_mock_test_config(
+      self.base_mock_test_config)
+    tr = test_runner.TestRunner(self.log_dir, self.testbed_name)
+    with tr.mobly_logger(alias=None):
+      pass
+    mock_create_alias.asset_not_called()
+
+  @mock.patch('mobly.utils.create_alias')
+  def test_mobly_logger_skips_latest_log_alias_when_empty(
+      self, mock_create_alias):
+    mock_test_config = self.create_mock_test_config(
+      self.base_mock_test_config)
+    tr = test_runner.TestRunner(self.log_dir, self.testbed_name)
+    with tr.mobly_logger(alias=''):
+      pass
+    mock_create_alias.asset_not_called()
+
+  def test_logging_before_run(self):
+    """Verifies the expected output files from a test run.
+
+    * Files are correctly created.
+    * Basic sanity checks of each output file.
     """
+    mock_test_config = self.create_mock_test_config(
+      self.base_mock_test_config)
+    info_uuid = 'e098d4ff-4e90-4e08-b369-aa84a7ef90ec'
+    debug_uuid = 'c6f1474e-960a-4df8-8305-1c5b8b905eca'
+    tr = test_runner.TestRunner(self.log_dir, self.testbed_name)
+    with tr.mobly_logger():
+      logging.info(info_uuid)
+      logging.debug(debug_uuid)
+      tr.add_test_class(mock_test_config,
+                integration_test.IntegrationTest)
+      tr.run()
+    output_dir = logging.root_output_path
+    (summary_file_path, debug_log_path,
+     info_log_path) = self.assert_output_logs_exist(output_dir)
+    self.assert_log_contents(debug_log_path,
+                 whitelist=[debug_uuid, info_uuid])
+    self.assert_log_contents(info_log_path,
+                 whitelist=[info_uuid],
+                 blacklist=[debug_uuid])
 
-    def setUp(self):
-        self.tmp_dir = tempfile.mkdtemp()
-        self.base_mock_test_config = config_parser.TestRunConfig()
-        self.base_mock_test_config.testbed_name = 'SampleTestBed'
-        self.base_mock_test_config.controller_configs = {}
-        self.base_mock_test_config.user_params = {
-            'icecream': 42,
-            'extra_param': 'haha'
-        }
-        self.base_mock_test_config.log_path = self.tmp_dir
-        self.log_dir = self.base_mock_test_config.log_path
-        self.testbed_name = self.base_mock_test_config.testbed_name
+  @mock.patch('mobly.logger.get_log_file_timestamp',
+        side_effect=str(time.time()))
+  def test_run_twice_for_two_sets_of_logs(self, mock_timestamp):
+    """Verifies the expected output files from a test run.
 
-    def tearDown(self):
-        shutil.rmtree(self.tmp_dir)
+    * Files are correctly created.
+    * Basic sanity checks of each output file.
+    """
+    mock_test_config = self.create_mock_test_config(
+      self.base_mock_test_config)
+    tr = test_runner.TestRunner(self.log_dir, self.testbed_name)
+    tr.add_test_class(mock_test_config, integration_test.IntegrationTest)
+    with tr.mobly_logger():
+      tr.run()
+    output_dir1 = logging.root_output_path
+    with tr.mobly_logger():
+      tr.run()
+    output_dir2 = logging.root_output_path
+    self.assertNotEqual(output_dir1, output_dir2)
+    self.assert_output_logs_exist(output_dir1)
+    self.assert_output_logs_exist(output_dir2)
 
-    def create_mock_test_config(self, base_mock_test_config):
-        mock_test_config = base_mock_test_config.copy()
-        mock_ctrlr_config_name = mock_controller.MOBLY_CONTROLLER_CONFIG_NAME
-        my_config = [{
-            'serial': 'xxxx',
-            'magic': 'Magic1'
-        }, {
-            'serial': 'xxxx',
-            'magic': 'Magic2'
-        }]
-        mock_test_config.controller_configs[mock_ctrlr_config_name] = my_config
-        return mock_test_config
+  @mock.patch('mobly.logger.get_log_file_timestamp',
+        side_effect=str(time.time()))
+  def test_teardown_erases_logs(self, mock_timestamp):
+    """Verifies the expected output files from a test run.
 
-    def get_output_logs(self, output_dir):
-        summary_file_path = os.path.join(output_dir,
-                                         records.OUTPUT_FILE_SUMMARY)
-        debug_log_path = os.path.join(output_dir,
-                                      records.OUTPUT_FILE_DEBUG_LOG)
-        info_log_path = os.path.join(output_dir, records.OUTPUT_FILE_INFO_LOG)
-        return (summary_file_path, debug_log_path, info_log_path)
+    * Files are correctly created.
+    * Basic sanity checks of each output file.
+    """
+    mock_test_config = self.create_mock_test_config(
+      self.base_mock_test_config)
+    info_uuid1 = '0c3ebb06-700d-496e-b015-62652da9e451'
+    debug_uuid1 = '0c3ebb06-700d-496e-b015-62652da9e451'
+    info_uuid2 = '484ef7db-f2dd-4b76-a126-c2f263e3808c'
+    debug_uuid2 = 'd564da87-c42f-49c3-b0bf-18fa97cf0218'
+    tr = test_runner.TestRunner(self.log_dir, self.testbed_name)
 
-    def assert_output_logs_exist(self, output_dir):
-        (summary_file_path, debug_log_path,
-         info_log_path) = self.get_output_logs(output_dir)
-        self.assertTrue(os.path.isfile(summary_file_path))
-        self.assertTrue(os.path.isfile(debug_log_path))
-        self.assertTrue(os.path.isfile(info_log_path))
-        return (summary_file_path, debug_log_path, info_log_path)
+    with tr.mobly_logger():
+      logging.info(info_uuid1)
+      logging.debug(debug_uuid1)
+    output_dir1 = logging.log_path
 
-    def assert_log_contents(self, log_path, whitelist=[], blacklist=[]):
-        with io.open(log_path, 'r', encoding='utf-8') as f:
-            content = f.read()
-            for item in whitelist:
-                self.assertIn(item, content)
-            for item in blacklist:
-                self.assertNotIn(item, content)
+    with tr.mobly_logger():
+      logging.info(info_uuid2)
+      logging.debug(debug_uuid2)
+    output_dir2 = logging.log_path
 
-    def test_yields_logging_path(self):
-        tr = test_runner.TestRunner(self.log_dir, self.testbed_name)
-        with tr.mobly_logger() as log_path:
-            self.assertEqual(log_path, logging.log_path)
+    self.assertNotEqual(output_dir1, output_dir2)
 
-    @unittest.skipIf(platform.system() == 'Windows',
-                     'Symlinks are usually specific to Unix operating systems')
-    def test_symlink(self):
-        """Verifies the symlink is created and links properly."""
-        mock_test_config = self.create_mock_test_config(
-            self.base_mock_test_config)
-        tr = test_runner.TestRunner(self.log_dir, self.testbed_name)
-        with tr.mobly_logger():
-            pass
-        symlink = os.path.join(self.log_dir, self.testbed_name, 'latest')
-        self.assertEqual(os.readlink(symlink), logging.log_path)
+    (summary_file_path1, debug_log_path1,
+     info_log_path1) = self.get_output_logs(output_dir1)
+    (summary_file_path2, debug_log_path2,
+     info_log_path2) = self.get_output_logs(output_dir2)
 
-    @unittest.skipIf(platform.system() != 'Windows',
-                     'Shortcuts are specific to Windows operating systems')
-    def test_shortcut(self):
-        """Verifies the shortcut is created and links properly."""
-        shortcut_path = os.path.join(self.log_dir, self.testbed_name,
-                                     'latest.lnk')
-        shell = client.Dispatch("WScript.Shell")
-        shortcut = shell.CreateShortCut(shortcut_path)
-        self.assertFalse(shortcut.Targetpath)
-        mock_test_config = self.create_mock_test_config(
-            self.base_mock_test_config)
-        tr = test_runner.TestRunner(self.log_dir, self.testbed_name)
-        with tr.mobly_logger():
-            pass
-        shortcut = shell.CreateShortCut(shortcut_path)
-        # Normalize paths for case and truncation
-        normalized_shortcut_path = os.path.normcase(
-            win32file.GetLongPathName(shortcut.Targetpath))
-        normalized_logger_path = os.path.normcase(
-            win32file.GetLongPathName(logging.log_path))
-        self.assertEqual(normalized_shortcut_path, normalized_logger_path)
+    self.assert_log_contents(debug_log_path1,
+                 whitelist=[debug_uuid1, info_uuid1],
+                 blacklist=[info_uuid2, debug_uuid2])
+    self.assert_log_contents(debug_log_path2,
+                 whitelist=[debug_uuid2, info_uuid2],
+                 blacklist=[info_uuid1, debug_uuid1])
 
-    @mock.patch('mobly.utils.create_alias')
-    def test_mobly_logger_with_default_latest_log_alias(
-            self, mock_create_alias):
-        mock_test_config = self.create_mock_test_config(
-            self.base_mock_test_config)
-        tr = test_runner.TestRunner(self.log_dir, self.testbed_name)
-        with tr.mobly_logger():
-            pass
-        expected_alias_dir = os.path.join(self.log_dir, self.testbed_name,
-                                          'latest')
-        mock_create_alias.assert_called_once_with(logging.log_path,
-                                                  expected_alias_dir)
+  def test_basic_output(self):
+    """Verifies the expected output files from a test run.
 
-    @mock.patch('mobly.utils.create_alias')
-    def test_mobly_logger_with_custom_latest_log_alias(self,
-                                                       mock_create_alias):
-        mock_test_config = self.create_mock_test_config(
-            self.base_mock_test_config)
-        tr = test_runner.TestRunner(self.log_dir, self.testbed_name)
-        with tr.mobly_logger(alias='history'):
-            pass
-        expected_alias_dir = os.path.join(self.log_dir, self.testbed_name,
-                                          'history')
-        mock_create_alias.assert_called_once_with(logging.log_path,
-                                                  expected_alias_dir)
+    * Files are correctly created.
+    * Basic sanity checks of each output file.
+    """
+    mock_test_config = self.create_mock_test_config(
+      self.base_mock_test_config)
+    tr = test_runner.TestRunner(self.log_dir, self.testbed_name)
+    with tr.mobly_logger():
+      tr.add_test_class(mock_test_config,
+                integration_test.IntegrationTest)
+      tr.run()
+    expected_class_path = os.path.join(logging.root_output_path,
+                       'IntegrationTest')
+    self.assertEqual(expected_class_path, logging.log_path)
+    os.path.exists(logging.log_path)
+    output_dir = logging.root_output_path
+    (summary_file_path, debug_log_path,
+     info_log_path) = self.assert_output_logs_exist(output_dir)
+    summary_entries = []
+    with io.open(summary_file_path, 'r', encoding='utf-8') as f:
+      for entry in yaml.safe_load_all(f):
+        self.assertTrue(entry['Type'])
+        summary_entries.append(entry)
+    self.assert_log_contents(debug_log_path, whitelist=['DEBUG', 'INFO'])
+    self.assert_log_contents(info_log_path,
+                 whitelist=['INFO'],
+                 blacklist=['DEBUG'])
 
-    @mock.patch('mobly.utils.create_alias')
-    def test_mobly_logger_skips_latest_log_alias_when_none(
-            self, mock_create_alias):
-        mock_test_config = self.create_mock_test_config(
-            self.base_mock_test_config)
-        tr = test_runner.TestRunner(self.log_dir, self.testbed_name)
-        with tr.mobly_logger(alias=None):
-            pass
-        mock_create_alias.asset_not_called()
-
-    @mock.patch('mobly.utils.create_alias')
-    def test_mobly_logger_skips_latest_log_alias_when_empty(
-            self, mock_create_alias):
-        mock_test_config = self.create_mock_test_config(
-            self.base_mock_test_config)
-        tr = test_runner.TestRunner(self.log_dir, self.testbed_name)
-        with tr.mobly_logger(alias=''):
-            pass
-        mock_create_alias.asset_not_called()
-
-    def test_logging_before_run(self):
-        """Verifies the expected output files from a test run.
-
-        * Files are correctly created.
-        * Basic sanity checks of each output file.
-        """
-        mock_test_config = self.create_mock_test_config(
-            self.base_mock_test_config)
-        info_uuid = 'e098d4ff-4e90-4e08-b369-aa84a7ef90ec'
-        debug_uuid = 'c6f1474e-960a-4df8-8305-1c5b8b905eca'
-        tr = test_runner.TestRunner(self.log_dir, self.testbed_name)
-        with tr.mobly_logger():
-            logging.info(info_uuid)
-            logging.debug(debug_uuid)
-            tr.add_test_class(mock_test_config,
-                              integration_test.IntegrationTest)
-            tr.run()
-        output_dir = logging.root_output_path
-        (summary_file_path, debug_log_path,
-         info_log_path) = self.assert_output_logs_exist(output_dir)
-        self.assert_log_contents(debug_log_path,
-                                 whitelist=[debug_uuid, info_uuid])
-        self.assert_log_contents(info_log_path,
-                                 whitelist=[info_uuid],
-                                 blacklist=[debug_uuid])
-
-    @mock.patch('mobly.logger.get_log_file_timestamp',
-                side_effect=str(time.time()))
-    def test_run_twice_for_two_sets_of_logs(self, mock_timestamp):
-        """Verifies the expected output files from a test run.
-
-        * Files are correctly created.
-        * Basic sanity checks of each output file.
-        """
-        mock_test_config = self.create_mock_test_config(
-            self.base_mock_test_config)
-        tr = test_runner.TestRunner(self.log_dir, self.testbed_name)
-        tr.add_test_class(mock_test_config, integration_test.IntegrationTest)
-        with tr.mobly_logger():
-            tr.run()
-        output_dir1 = logging.root_output_path
-        with tr.mobly_logger():
-            tr.run()
-        output_dir2 = logging.root_output_path
-        self.assertNotEqual(output_dir1, output_dir2)
-        self.assert_output_logs_exist(output_dir1)
-        self.assert_output_logs_exist(output_dir2)
-
-    @mock.patch('mobly.logger.get_log_file_timestamp',
-                side_effect=str(time.time()))
-    def test_teardown_erases_logs(self, mock_timestamp):
-        """Verifies the expected output files from a test run.
-
-        * Files are correctly created.
-        * Basic sanity checks of each output file.
-        """
-        mock_test_config = self.create_mock_test_config(
-            self.base_mock_test_config)
-        info_uuid1 = '0c3ebb06-700d-496e-b015-62652da9e451'
-        debug_uuid1 = '0c3ebb06-700d-496e-b015-62652da9e451'
-        info_uuid2 = '484ef7db-f2dd-4b76-a126-c2f263e3808c'
-        debug_uuid2 = 'd564da87-c42f-49c3-b0bf-18fa97cf0218'
-        tr = test_runner.TestRunner(self.log_dir, self.testbed_name)
-
-        with tr.mobly_logger():
-            logging.info(info_uuid1)
-            logging.debug(debug_uuid1)
-        output_dir1 = logging.log_path
-
-        with tr.mobly_logger():
-            logging.info(info_uuid2)
-            logging.debug(debug_uuid2)
-        output_dir2 = logging.log_path
-
-        self.assertNotEqual(output_dir1, output_dir2)
-
-        (summary_file_path1, debug_log_path1,
-         info_log_path1) = self.get_output_logs(output_dir1)
-        (summary_file_path2, debug_log_path2,
-         info_log_path2) = self.get_output_logs(output_dir2)
-
-        self.assert_log_contents(debug_log_path1,
-                                 whitelist=[debug_uuid1, info_uuid1],
-                                 blacklist=[info_uuid2, debug_uuid2])
-        self.assert_log_contents(debug_log_path2,
-                                 whitelist=[debug_uuid2, info_uuid2],
-                                 blacklist=[info_uuid1, debug_uuid1])
-
-    def test_basic_output(self):
-        """Verifies the expected output files from a test run.
-
-        * Files are correctly created.
-        * Basic sanity checks of each output file.
-        """
-        mock_test_config = self.create_mock_test_config(
-            self.base_mock_test_config)
-        tr = test_runner.TestRunner(self.log_dir, self.testbed_name)
-        with tr.mobly_logger():
-            tr.add_test_class(mock_test_config,
-                              integration_test.IntegrationTest)
-            tr.run()
-        expected_class_path = os.path.join(logging.root_output_path,
-                                           'IntegrationTest')
-        self.assertEqual(expected_class_path, logging.log_path)
-        os.path.exists(logging.log_path)
-        output_dir = logging.root_output_path
-        (summary_file_path, debug_log_path,
-         info_log_path) = self.assert_output_logs_exist(output_dir)
-        summary_entries = []
-        with io.open(summary_file_path, 'r', encoding='utf-8') as f:
-            for entry in yaml.safe_load_all(f):
-                self.assertTrue(entry['Type'])
-                summary_entries.append(entry)
-        self.assert_log_contents(debug_log_path, whitelist=['DEBUG', 'INFO'])
-        self.assert_log_contents(info_log_path,
-                                 whitelist=['INFO'],
-                                 blacklist=['DEBUG'])
-
-    def test_teardown_class_output(self):
-        """Verifies the summary file includes the failure record for
-        teardown_class.
-        """
-        mock_test_config = self.base_mock_test_config.copy()
-        tr = test_runner.TestRunner(self.log_dir, self.testbed_name)
-        with tr.mobly_logger():
-            tr.add_test_class(
-                mock_test_config,
-                teardown_class_failure_test.TearDownClassFailureTest)
-            tr.run()
-        output_dir = logging.root_output_path
-        summary_file_path = os.path.join(output_dir,
-                                         records.OUTPUT_FILE_SUMMARY)
-        found = False
-        with io.open(summary_file_path, 'r', encoding='utf-8') as f:
-            raw_content = f.read()
-            f.seek(0)
-            for entry in yaml.safe_load_all(f):
-                if (entry['Type'] == 'Record'
-                        and entry[records.TestResultEnums.RECORD_NAME] ==
-                        'teardown_class'):
-                    found = True
-                    break
-            self.assertTrue(
-                found,
-                'No record for teardown_class found in the output file:\n %s' %
-                raw_content)
+  def test_teardown_class_output(self):
+    """Verifies the summary file includes the failure record for
+    teardown_class.
+    """
+    mock_test_config = self.base_mock_test_config.copy()
+    tr = test_runner.TestRunner(self.log_dir, self.testbed_name)
+    with tr.mobly_logger():
+      tr.add_test_class(
+        mock_test_config,
+        teardown_class_failure_test.TearDownClassFailureTest)
+      tr.run()
+    output_dir = logging.root_output_path
+    summary_file_path = os.path.join(output_dir,
+                     records.OUTPUT_FILE_SUMMARY)
+    found = False
+    with io.open(summary_file_path, 'r', encoding='utf-8') as f:
+      raw_content = f.read()
+      f.seek(0)
+      for entry in yaml.safe_load_all(f):
+        if (entry['Type'] == 'Record'
+            and entry[records.TestResultEnums.RECORD_NAME] ==
+            'teardown_class'):
+          found = True
+          break
+      self.assertTrue(
+        found,
+        'No record for teardown_class found in the output file:\n %s' %
+        raw_content)
 
 
 if __name__ == "__main__":
-    unittest.main()
+  unittest.main()
diff --git a/tests/mobly/records_test.py b/tests/mobly/records_test.py
index a374347..d850675 100755
--- a/tests/mobly/records_test.py
+++ b/tests/mobly/records_test.py
@@ -32,408 +32,408 @@
 
 
 class RecordTestError(Exception):
-    """Error class with constructors that take extra args.
+  """Error class with constructors that take extra args.
 
-    Used for ExceptionRecord tests.
-    """
+  Used for ExceptionRecord tests.
+  """
 
-    def __init__(self, something):
-        self._something = something
+  def __init__(self, something):
+    self._something = something
 
 
 class RecordsTest(unittest.TestCase):
-    """This test class tests the implementation of classes in mobly.records.
+  """This test class tests the implementation of classes in mobly.records.
+  """
+
+  def setUp(self):
+    self.tn = 'test_name'
+    self.details = 'Some details about the test execution.'
+    self.float_extra = 12345.56789
+    self.json_extra = {'ha': 'whatever'}
+    self.tmp_path = tempfile.mkdtemp()
+
+  def tearDown(self):
+    shutil.rmtree(self.tmp_path)
+
+  def verify_record(self, record, result, details, extras, stacktrace=None):
+    record.update_record()
+    # Verify each field.
+    self.assertEqual(record.test_name, self.tn)
+    self.assertEqual(record.result, result)
+    self.assertEqual(record.details, details)
+    self.assertEqual(record.extras, extras)
+    self.assertTrue(record.begin_time, 'begin time should not be empty.')
+    self.assertTrue(record.end_time, 'end time should not be empty.')
+    # UID is not used at the moment, should always be None.
+    self.assertIsNone(record.uid)
+    # Verify to_dict.
+    d = {}
+    d[records.TestResultEnums.RECORD_NAME] = self.tn
+    d[records.TestResultEnums.RECORD_RESULT] = result
+    d[records.TestResultEnums.RECORD_DETAILS] = details
+    d[records.TestResultEnums.RECORD_EXTRAS] = extras
+    d[records.TestResultEnums.RECORD_BEGIN_TIME] = record.begin_time
+    d[records.TestResultEnums.RECORD_END_TIME] = record.end_time
+    d[records.TestResultEnums.RECORD_UID] = None
+    d[records.TestResultEnums.RECORD_CLASS] = None
+    d[records.TestResultEnums.RECORD_EXTRA_ERRORS] = {}
+    d[records.TestResultEnums.RECORD_STACKTRACE] = stacktrace
+    actual_d = record.to_dict()
+    # Verify stacktrace partially match as stacktraces often have file path
+    # in them.
+    if stacktrace:
+      stacktrace_key = records.TestResultEnums.RECORD_STACKTRACE
+      self.assertTrue(
+        d.pop(stacktrace_key) in actual_d.pop(stacktrace_key))
+    self.assertDictEqual(actual_d, d)
+    # Verify that these code paths do not cause crashes and yield non-empty
+    # results.
+    self.assertTrue(str(record), 'str of the record should not be empty.')
+    self.assertTrue(repr(record), "the record's repr shouldn't be empty.")
+
+  """ Begin of Tests """
+
+  def test_result_record_pass_none(self):
+    record = records.TestResultRecord(self.tn)
+    record.test_begin()
+    record.test_pass()
+    self.verify_record(
+      record=record,
+      result=records.TestResultEnums.TEST_RESULT_PASS,
+      details=None,
+      extras=None)
+
+  def test_result_record_pass_with_float_extra(self):
+    record = records.TestResultRecord(self.tn)
+    record.test_begin()
+    s = signals.TestPass(self.details, self.float_extra)
+    record.test_pass(s)
+    self.verify_record(
+      record=record,
+      result=records.TestResultEnums.TEST_RESULT_PASS,
+      details=self.details,
+      extras=self.float_extra)
+
+  def test_result_record_pass_with_json_extra(self):
+    record = records.TestResultRecord(self.tn)
+    record.test_begin()
+    s = signals.TestPass(self.details, self.json_extra)
+    record.test_pass(s)
+    self.verify_record(
+      record=record,
+      result=records.TestResultEnums.TEST_RESULT_PASS,
+      details=self.details,
+      extras=self.json_extra)
+
+  def test_result_record_fail_none(self):
+    record = records.TestResultRecord(self.tn)
+    record.test_begin()
+    record.test_fail()
+    self.verify_record(
+      record=record,
+      result=records.TestResultEnums.TEST_RESULT_FAIL,
+      details=None,
+      extras=None)
+
+  def test_result_record_fail_stacktrace(self):
+    record = records.TestResultRecord(self.tn)
+    record.test_begin()
+    try:
+      raise Exception('Something failed.')
+    except Exception as e:
+      record.test_fail(e)
+    # Verify stacktrace separately if we expect a non-None value.
+    # Because stacktrace includes file names and line numbers, we can't do
+    # a simple equality check.
+    self.verify_record(
+      record=record,
+      result=records.TestResultEnums.TEST_RESULT_FAIL,
+      details='Something failed.',
+      extras=None,
+      stacktrace='in test_result_record_fail_stacktrace\n    '
+      'raise Exception(\'Something failed.\')\nException: '
+      'Something failed.\n')
+
+  def test_result_record_fail_with_float_extra(self):
+    record = records.TestResultRecord(self.tn)
+    record.test_begin()
+    s = signals.TestFailure(self.details, self.float_extra)
+    record.test_fail(s)
+    self.verify_record(
+      record=record,
+      result=records.TestResultEnums.TEST_RESULT_FAIL,
+      details=self.details,
+      extras=self.float_extra)
+
+  def test_result_record_fail_with_unicode_test_signal(self):
+    record = records.TestResultRecord(self.tn)
+    record.test_begin()
+    details = u'\u2022'
+    s = signals.TestFailure(details, self.float_extra)
+    record.test_fail(s)
+    self.verify_record(
+      record=record,
+      result=records.TestResultEnums.TEST_RESULT_FAIL,
+      details=details,
+      extras=self.float_extra)
+
+  def test_result_record_fail_with_unicode_exception(self):
+    record = records.TestResultRecord(self.tn)
+    record.test_begin()
+    details = u'\u2022'
+    s = Exception(details)
+    record.test_fail(s)
+    self.verify_record(
+      record=record,
+      result=records.TestResultEnums.TEST_RESULT_FAIL,
+      details=details,
+      extras=None)
+
+  def test_result_record_fail_with_json_extra(self):
+    record = records.TestResultRecord(self.tn)
+    record.test_begin()
+    s = signals.TestFailure(self.details, self.json_extra)
+    record.test_fail(s)
+    self.verify_record(
+      record=record,
+      result=records.TestResultEnums.TEST_RESULT_FAIL,
+      details=self.details,
+      extras=self.json_extra)
+
+  def test_result_record_skip_none(self):
+    record = records.TestResultRecord(self.tn)
+    record.test_begin()
+    record.test_skip()
+    self.verify_record(
+      record=record,
+      result=records.TestResultEnums.TEST_RESULT_SKIP,
+      details=None,
+      extras=None)
+
+  def test_result_record_skip_with_float_extra(self):
+    record = records.TestResultRecord(self.tn)
+    record.test_begin()
+    s = signals.TestSkip(self.details, self.float_extra)
+    record.test_skip(s)
+    self.verify_record(
+      record=record,
+      result=records.TestResultEnums.TEST_RESULT_SKIP,
+      details=self.details,
+      extras=self.float_extra)
+
+  def test_result_record_skip_with_json_extra(self):
+    record = records.TestResultRecord(self.tn)
+    record.test_begin()
+    s = signals.TestSkip(self.details, self.json_extra)
+    record.test_skip(s)
+    self.verify_record(
+      record=record,
+      result=records.TestResultEnums.TEST_RESULT_SKIP,
+      details=self.details,
+      extras=self.json_extra)
+
+  def test_result_add_operator_success(self):
+    record1 = records.TestResultRecord(self.tn)
+    record1.test_begin()
+    s = signals.TestPass(self.details, self.float_extra)
+    record1.test_pass(s)
+    tr1 = records.TestResult()
+    tr1.add_record(record1)
+    controller_info = records.ControllerInfoRecord(
+      'SomeClass', 'MockDevice', ['magicA', 'magicB'])
+    tr1.add_controller_info_record(controller_info)
+    record2 = records.TestResultRecord(self.tn)
+    record2.test_begin()
+    s = signals.TestPass(self.details, self.json_extra)
+    record2.test_pass(s)
+    tr2 = records.TestResult()
+    tr2.add_record(record2)
+    controller_info = records.ControllerInfoRecord(
+      'SomeClass', 'MockDevice', ['magicC'])
+    tr2.add_controller_info_record(controller_info)
+    tr2 += tr1
+    self.assertTrue(tr2.passed, [tr1, tr2])
+    self.assertTrue(tr2.controller_info, {'MockDevice': ['magicC']})
+
+  def test_result_add_operator_type_mismatch(self):
+    record1 = records.TestResultRecord(self.tn)
+    record1.test_begin()
+    s = signals.TestPass(self.details, self.float_extra)
+    record1.test_pass(s)
+    tr1 = records.TestResult()
+    tr1.add_record(record1)
+    expected_msg = 'Operand .* of type .* is not a TestResult.'
+    with self.assertRaisesRegex(TypeError, expected_msg):
+      tr1 += 'haha'
+
+  def test_result_add_class_error_with_test_signal(self):
+    record1 = records.TestResultRecord(self.tn)
+    record1.test_begin()
+    s = signals.TestPass(self.details, self.float_extra)
+    record1.test_pass(s)
+    tr = records.TestResult()
+    tr.add_record(record1)
+    s = signals.TestFailure(self.details, self.float_extra)
+    record2 = records.TestResultRecord('SomeTest', s)
+    tr.add_class_error(record2)
+    self.assertEqual(len(tr.passed), 1)
+    self.assertEqual(len(tr.error), 1)
+    self.assertEqual(len(tr.executed), 1)
+
+  def test_result_add_class_error_with_special_error(self):
+    """Call TestResult.add_class_error with an error class that requires more
+    than one arg to instantiate.
     """
+    record1 = records.TestResultRecord(self.tn)
+    record1.test_begin()
+    s = signals.TestPass(self.details, self.float_extra)
+    record1.test_pass(s)
+    tr = records.TestResult()
+    tr.add_record(record1)
 
-    def setUp(self):
-        self.tn = 'test_name'
-        self.details = 'Some details about the test execution.'
-        self.float_extra = 12345.56789
-        self.json_extra = {'ha': 'whatever'}
-        self.tmp_path = tempfile.mkdtemp()
+    class SpecialError(Exception):
+      def __init__(self, arg1, arg2):
+        self.msg = '%s %s' % (arg1, arg2)
 
-    def tearDown(self):
-        shutil.rmtree(self.tmp_path)
+    se = SpecialError('haha', 42)
+    record2 = records.TestResultRecord('SomeTest', se)
+    tr.add_class_error(record2)
+    self.assertEqual(len(tr.passed), 1)
+    self.assertEqual(len(tr.error), 1)
+    self.assertEqual(len(tr.executed), 1)
 
-    def verify_record(self, record, result, details, extras, stacktrace=None):
-        record.update_record()
-        # Verify each field.
-        self.assertEqual(record.test_name, self.tn)
-        self.assertEqual(record.result, result)
-        self.assertEqual(record.details, details)
-        self.assertEqual(record.extras, extras)
-        self.assertTrue(record.begin_time, 'begin time should not be empty.')
-        self.assertTrue(record.end_time, 'end time should not be empty.')
-        # UID is not used at the moment, should always be None.
-        self.assertIsNone(record.uid)
-        # Verify to_dict.
-        d = {}
-        d[records.TestResultEnums.RECORD_NAME] = self.tn
-        d[records.TestResultEnums.RECORD_RESULT] = result
-        d[records.TestResultEnums.RECORD_DETAILS] = details
-        d[records.TestResultEnums.RECORD_EXTRAS] = extras
-        d[records.TestResultEnums.RECORD_BEGIN_TIME] = record.begin_time
-        d[records.TestResultEnums.RECORD_END_TIME] = record.end_time
-        d[records.TestResultEnums.RECORD_UID] = None
-        d[records.TestResultEnums.RECORD_CLASS] = None
-        d[records.TestResultEnums.RECORD_EXTRA_ERRORS] = {}
-        d[records.TestResultEnums.RECORD_STACKTRACE] = stacktrace
-        actual_d = record.to_dict()
-        # Verify stacktrace partially match as stacktraces often have file path
-        # in them.
-        if stacktrace:
-            stacktrace_key = records.TestResultEnums.RECORD_STACKTRACE
-            self.assertTrue(
-                d.pop(stacktrace_key) in actual_d.pop(stacktrace_key))
-        self.assertDictEqual(actual_d, d)
-        # Verify that these code paths do not cause crashes and yield non-empty
-        # results.
-        self.assertTrue(str(record), 'str of the record should not be empty.')
-        self.assertTrue(repr(record), "the record's repr shouldn't be empty.")
+  def test_is_all_pass(self):
+    s = signals.TestPass(self.details, self.float_extra)
+    record1 = records.TestResultRecord(self.tn)
+    record1.test_begin()
+    record1.test_pass(s)
+    s = signals.TestSkip(self.details, self.float_extra)
+    record2 = records.TestResultRecord(self.tn)
+    record2.test_begin()
+    record2.test_skip(s)
+    tr = records.TestResult()
+    tr.add_record(record1)
+    tr.add_record(record2)
+    tr.add_record(record1)
+    self.assertEqual(len(tr.passed), 2)
+    self.assertTrue(tr.is_all_pass)
 
-    """ Begin of Tests """
+  def test_is_all_pass_negative(self):
+    s = signals.TestFailure(self.details, self.float_extra)
+    record1 = records.TestResultRecord(self.tn)
+    record1.test_begin()
+    record1.test_fail(s)
+    record2 = records.TestResultRecord(self.tn)
+    record2.test_begin()
+    record2.test_error(s)
+    tr = records.TestResult()
+    tr.add_record(record1)
+    tr.add_record(record2)
+    utils.validate_test_result(tr)
+    self.assertFalse(tr.is_all_pass)
 
-    def test_result_record_pass_none(self):
-        record = records.TestResultRecord(self.tn)
-        record.test_begin()
-        record.test_pass()
-        self.verify_record(
-            record=record,
-            result=records.TestResultEnums.TEST_RESULT_PASS,
-            details=None,
-            extras=None)
+  def test_is_all_pass_with_add_class_error(self):
+    """Verifies that is_all_pass yields correct value when add_class_error is
+    used.
+    """
+    record1 = records.TestResultRecord(self.tn)
+    record1.test_begin()
+    record1.test_fail(Exception('haha'))
+    tr = records.TestResult()
+    tr.add_class_error(record1)
+    self.assertFalse(tr.is_all_pass)
 
-    def test_result_record_pass_with_float_extra(self):
-        record = records.TestResultRecord(self.tn)
-        record.test_begin()
-        s = signals.TestPass(self.details, self.float_extra)
-        record.test_pass(s)
-        self.verify_record(
-            record=record,
-            result=records.TestResultEnums.TEST_RESULT_PASS,
-            details=self.details,
-            extras=self.float_extra)
+  def test_is_test_executed(self):
+    record1 = records.TestResultRecord(self.tn)
+    record1.test_begin()
+    record1.test_fail(Exception('haha'))
+    tr = records.TestResult()
+    tr.add_record(record1)
+    self.assertTrue(tr.is_test_executed(record1.test_name))
+    self.assertFalse(tr.is_test_executed(self.tn + 'ha'))
 
-    def test_result_record_pass_with_json_extra(self):
-        record = records.TestResultRecord(self.tn)
-        record.test_begin()
-        s = signals.TestPass(self.details, self.json_extra)
-        record.test_pass(s)
-        self.verify_record(
-            record=record,
-            result=records.TestResultEnums.TEST_RESULT_PASS,
-            details=self.details,
-            extras=self.json_extra)
+  def test_summary_write_dump(self):
+    s = signals.TestFailure(self.details, self.float_extra)
+    record1 = records.TestResultRecord(self.tn)
+    record1.test_begin()
+    record1.test_fail(s)
+    dump_path = os.path.join(self.tmp_path, 'ha.yaml')
+    writer = records.TestSummaryWriter(dump_path)
+    writer.dump(record1.to_dict(), records.TestSummaryEntryType.RECORD)
+    with io.open(dump_path, 'r', encoding='utf-8') as f:
+      content = yaml.safe_load(f)
+      self.assertEqual(content['Type'],
+               records.TestSummaryEntryType.RECORD.value)
+      self.assertEqual(content[records.TestResultEnums.RECORD_DETAILS],
+               self.details)
+      self.assertEqual(content[records.TestResultEnums.RECORD_EXTRAS],
+               self.float_extra)
 
-    def test_result_record_fail_none(self):
-        record = records.TestResultRecord(self.tn)
-        record.test_begin()
-        record.test_fail()
-        self.verify_record(
-            record=record,
-            result=records.TestResultEnums.TEST_RESULT_FAIL,
-            details=None,
-            extras=None)
+  def test_summary_write_dump_with_unicode(self):
+    unicode_details = u'\u901a'  # utf-8 -> b'\xe9\x80\x9a'
+    unicode_extras = u'\u8fc7'  # utf-8 -> b'\xe8\xbf\x87'
+    s = signals.TestFailure(unicode_details, unicode_extras)
+    record1 = records.TestResultRecord(self.tn)
+    record1.test_begin()
+    record1.test_fail(s)
+    dump_path = os.path.join(self.tmp_path, 'ha.yaml')
+    writer = records.TestSummaryWriter(dump_path)
+    writer.dump(record1.to_dict(), records.TestSummaryEntryType.RECORD)
+    with io.open(dump_path, 'r', encoding='utf-8') as f:
+      content = yaml.safe_load(f)
+      self.assertEqual(content['Type'],
+               records.TestSummaryEntryType.RECORD.value)
+      self.assertEqual(content[records.TestResultEnums.RECORD_DETAILS],
+               unicode_details)
+      self.assertEqual(content[records.TestResultEnums.RECORD_EXTRAS],
+               unicode_extras)
 
-    def test_result_record_fail_stacktrace(self):
-        record = records.TestResultRecord(self.tn)
-        record.test_begin()
-        try:
-            raise Exception('Something failed.')
-        except Exception as e:
-            record.test_fail(e)
-        # Verify stacktrace separately if we expect a non-None value.
-        # Because stacktrace includes file names and line numbers, we can't do
-        # a simple equality check.
-        self.verify_record(
-            record=record,
-            result=records.TestResultEnums.TEST_RESULT_FAIL,
-            details='Something failed.',
-            extras=None,
-            stacktrace='in test_result_record_fail_stacktrace\n    '
-            'raise Exception(\'Something failed.\')\nException: '
-            'Something failed.\n')
+  def test_summary_user_data(self):
+    user_data1 = {'a': 1}
+    user_data2 = {'b': 1}
+    user_data = [user_data1, user_data2]
+    dump_path = os.path.join(self.tmp_path, 'ha.yaml')
+    writer = records.TestSummaryWriter(dump_path)
+    for data in user_data:
+      writer.dump(data, records.TestSummaryEntryType.USER_DATA)
+    with io.open(dump_path, 'r', encoding='utf-8') as f:
+      contents = []
+      for c in yaml.safe_load_all(f):
+        contents.append(c)
+    for content in contents:
+      self.assertEqual(content['Type'],
+               records.TestSummaryEntryType.USER_DATA.value)
+    self.assertEqual(contents[0]['a'], user_data1['a'])
+    self.assertEqual(contents[1]['b'], user_data2['b'])
 
-    def test_result_record_fail_with_float_extra(self):
-        record = records.TestResultRecord(self.tn)
-        record.test_begin()
-        s = signals.TestFailure(self.details, self.float_extra)
-        record.test_fail(s)
-        self.verify_record(
-            record=record,
-            result=records.TestResultEnums.TEST_RESULT_FAIL,
-            details=self.details,
-            extras=self.float_extra)
+  def test_exception_record_deepcopy(self):
+    """Makes sure ExceptionRecord wrapper handles deep copy properly."""
+    try:
+      raise RecordTestError('Oh ha!')
+    except RecordTestError as e:
+      er = records.ExceptionRecord(e)
+    new_er = copy.deepcopy(er)
+    self.assertIsNot(er, new_er)
+    self.assertDictEqual(er.to_dict(), new_er.to_dict())
 
-    def test_result_record_fail_with_unicode_test_signal(self):
-        record = records.TestResultRecord(self.tn)
-        record.test_begin()
-        details = u'\u2022'
-        s = signals.TestFailure(details, self.float_extra)
-        record.test_fail(s)
-        self.verify_record(
-            record=record,
-            result=records.TestResultEnums.TEST_RESULT_FAIL,
-            details=details,
-            extras=self.float_extra)
+  def test_add_controller_info_record(self):
+    tr = records.TestResult()
+    self.assertFalse(tr.controller_info)
+    controller_info = records.ControllerInfoRecord(
+      'SomeClass', 'MockDevice', ['magicA', 'magicB'])
+    tr.add_controller_info_record(controller_info)
+    self.assertTrue(tr.controller_info[0])
+    self.assertEqual(tr.controller_info[0].controller_name, 'MockDevice')
+    self.assertEqual(tr.controller_info[0].controller_info,
+             ['magicA', 'magicB'])
 
-    def test_result_record_fail_with_unicode_exception(self):
-        record = records.TestResultRecord(self.tn)
-        record.test_begin()
-        details = u'\u2022'
-        s = Exception(details)
-        record.test_fail(s)
-        self.verify_record(
-            record=record,
-            result=records.TestResultEnums.TEST_RESULT_FAIL,
-            details=details,
-            extras=None)
+  def test_uid(self):
+    @records.uid('some-uuid')
+    def test_uid_helper():
+      """Dummy test used by `test_uid` for testing the uid decorator."""
 
-    def test_result_record_fail_with_json_extra(self):
-        record = records.TestResultRecord(self.tn)
-        record.test_begin()
-        s = signals.TestFailure(self.details, self.json_extra)
-        record.test_fail(s)
-        self.verify_record(
-            record=record,
-            result=records.TestResultEnums.TEST_RESULT_FAIL,
-            details=self.details,
-            extras=self.json_extra)
-
-    def test_result_record_skip_none(self):
-        record = records.TestResultRecord(self.tn)
-        record.test_begin()
-        record.test_skip()
-        self.verify_record(
-            record=record,
-            result=records.TestResultEnums.TEST_RESULT_SKIP,
-            details=None,
-            extras=None)
-
-    def test_result_record_skip_with_float_extra(self):
-        record = records.TestResultRecord(self.tn)
-        record.test_begin()
-        s = signals.TestSkip(self.details, self.float_extra)
-        record.test_skip(s)
-        self.verify_record(
-            record=record,
-            result=records.TestResultEnums.TEST_RESULT_SKIP,
-            details=self.details,
-            extras=self.float_extra)
-
-    def test_result_record_skip_with_json_extra(self):
-        record = records.TestResultRecord(self.tn)
-        record.test_begin()
-        s = signals.TestSkip(self.details, self.json_extra)
-        record.test_skip(s)
-        self.verify_record(
-            record=record,
-            result=records.TestResultEnums.TEST_RESULT_SKIP,
-            details=self.details,
-            extras=self.json_extra)
-
-    def test_result_add_operator_success(self):
-        record1 = records.TestResultRecord(self.tn)
-        record1.test_begin()
-        s = signals.TestPass(self.details, self.float_extra)
-        record1.test_pass(s)
-        tr1 = records.TestResult()
-        tr1.add_record(record1)
-        controller_info = records.ControllerInfoRecord(
-            'SomeClass', 'MockDevice', ['magicA', 'magicB'])
-        tr1.add_controller_info_record(controller_info)
-        record2 = records.TestResultRecord(self.tn)
-        record2.test_begin()
-        s = signals.TestPass(self.details, self.json_extra)
-        record2.test_pass(s)
-        tr2 = records.TestResult()
-        tr2.add_record(record2)
-        controller_info = records.ControllerInfoRecord(
-            'SomeClass', 'MockDevice', ['magicC'])
-        tr2.add_controller_info_record(controller_info)
-        tr2 += tr1
-        self.assertTrue(tr2.passed, [tr1, tr2])
-        self.assertTrue(tr2.controller_info, {'MockDevice': ['magicC']})
-
-    def test_result_add_operator_type_mismatch(self):
-        record1 = records.TestResultRecord(self.tn)
-        record1.test_begin()
-        s = signals.TestPass(self.details, self.float_extra)
-        record1.test_pass(s)
-        tr1 = records.TestResult()
-        tr1.add_record(record1)
-        expected_msg = 'Operand .* of type .* is not a TestResult.'
-        with self.assertRaisesRegex(TypeError, expected_msg):
-            tr1 += 'haha'
-
-    def test_result_add_class_error_with_test_signal(self):
-        record1 = records.TestResultRecord(self.tn)
-        record1.test_begin()
-        s = signals.TestPass(self.details, self.float_extra)
-        record1.test_pass(s)
-        tr = records.TestResult()
-        tr.add_record(record1)
-        s = signals.TestFailure(self.details, self.float_extra)
-        record2 = records.TestResultRecord('SomeTest', s)
-        tr.add_class_error(record2)
-        self.assertEqual(len(tr.passed), 1)
-        self.assertEqual(len(tr.error), 1)
-        self.assertEqual(len(tr.executed), 1)
-
-    def test_result_add_class_error_with_special_error(self):
-        """Call TestResult.add_class_error with an error class that requires more
-        than one arg to instantiate.
-        """
-        record1 = records.TestResultRecord(self.tn)
-        record1.test_begin()
-        s = signals.TestPass(self.details, self.float_extra)
-        record1.test_pass(s)
-        tr = records.TestResult()
-        tr.add_record(record1)
-
-        class SpecialError(Exception):
-            def __init__(self, arg1, arg2):
-                self.msg = '%s %s' % (arg1, arg2)
-
-        se = SpecialError('haha', 42)
-        record2 = records.TestResultRecord('SomeTest', se)
-        tr.add_class_error(record2)
-        self.assertEqual(len(tr.passed), 1)
-        self.assertEqual(len(tr.error), 1)
-        self.assertEqual(len(tr.executed), 1)
-
-    def test_is_all_pass(self):
-        s = signals.TestPass(self.details, self.float_extra)
-        record1 = records.TestResultRecord(self.tn)
-        record1.test_begin()
-        record1.test_pass(s)
-        s = signals.TestSkip(self.details, self.float_extra)
-        record2 = records.TestResultRecord(self.tn)
-        record2.test_begin()
-        record2.test_skip(s)
-        tr = records.TestResult()
-        tr.add_record(record1)
-        tr.add_record(record2)
-        tr.add_record(record1)
-        self.assertEqual(len(tr.passed), 2)
-        self.assertTrue(tr.is_all_pass)
-
-    def test_is_all_pass_negative(self):
-        s = signals.TestFailure(self.details, self.float_extra)
-        record1 = records.TestResultRecord(self.tn)
-        record1.test_begin()
-        record1.test_fail(s)
-        record2 = records.TestResultRecord(self.tn)
-        record2.test_begin()
-        record2.test_error(s)
-        tr = records.TestResult()
-        tr.add_record(record1)
-        tr.add_record(record2)
-        utils.validate_test_result(tr)
-        self.assertFalse(tr.is_all_pass)
-
-    def test_is_all_pass_with_add_class_error(self):
-        """Verifies that is_all_pass yields correct value when add_class_error is
-        used.
-        """
-        record1 = records.TestResultRecord(self.tn)
-        record1.test_begin()
-        record1.test_fail(Exception('haha'))
-        tr = records.TestResult()
-        tr.add_class_error(record1)
-        self.assertFalse(tr.is_all_pass)
-
-    def test_is_test_executed(self):
-        record1 = records.TestResultRecord(self.tn)
-        record1.test_begin()
-        record1.test_fail(Exception('haha'))
-        tr = records.TestResult()
-        tr.add_record(record1)
-        self.assertTrue(tr.is_test_executed(record1.test_name))
-        self.assertFalse(tr.is_test_executed(self.tn + 'ha'))
-
-    def test_summary_write_dump(self):
-        s = signals.TestFailure(self.details, self.float_extra)
-        record1 = records.TestResultRecord(self.tn)
-        record1.test_begin()
-        record1.test_fail(s)
-        dump_path = os.path.join(self.tmp_path, 'ha.yaml')
-        writer = records.TestSummaryWriter(dump_path)
-        writer.dump(record1.to_dict(), records.TestSummaryEntryType.RECORD)
-        with io.open(dump_path, 'r', encoding='utf-8') as f:
-            content = yaml.safe_load(f)
-            self.assertEqual(content['Type'],
-                             records.TestSummaryEntryType.RECORD.value)
-            self.assertEqual(content[records.TestResultEnums.RECORD_DETAILS],
-                             self.details)
-            self.assertEqual(content[records.TestResultEnums.RECORD_EXTRAS],
-                             self.float_extra)
-
-    def test_summary_write_dump_with_unicode(self):
-        unicode_details = u'\u901a'  # utf-8 -> b'\xe9\x80\x9a'
-        unicode_extras = u'\u8fc7'  # utf-8 -> b'\xe8\xbf\x87'
-        s = signals.TestFailure(unicode_details, unicode_extras)
-        record1 = records.TestResultRecord(self.tn)
-        record1.test_begin()
-        record1.test_fail(s)
-        dump_path = os.path.join(self.tmp_path, 'ha.yaml')
-        writer = records.TestSummaryWriter(dump_path)
-        writer.dump(record1.to_dict(), records.TestSummaryEntryType.RECORD)
-        with io.open(dump_path, 'r', encoding='utf-8') as f:
-            content = yaml.safe_load(f)
-            self.assertEqual(content['Type'],
-                             records.TestSummaryEntryType.RECORD.value)
-            self.assertEqual(content[records.TestResultEnums.RECORD_DETAILS],
-                             unicode_details)
-            self.assertEqual(content[records.TestResultEnums.RECORD_EXTRAS],
-                             unicode_extras)
-
-    def test_summary_user_data(self):
-        user_data1 = {'a': 1}
-        user_data2 = {'b': 1}
-        user_data = [user_data1, user_data2]
-        dump_path = os.path.join(self.tmp_path, 'ha.yaml')
-        writer = records.TestSummaryWriter(dump_path)
-        for data in user_data:
-            writer.dump(data, records.TestSummaryEntryType.USER_DATA)
-        with io.open(dump_path, 'r', encoding='utf-8') as f:
-            contents = []
-            for c in yaml.safe_load_all(f):
-                contents.append(c)
-        for content in contents:
-            self.assertEqual(content['Type'],
-                             records.TestSummaryEntryType.USER_DATA.value)
-        self.assertEqual(contents[0]['a'], user_data1['a'])
-        self.assertEqual(contents[1]['b'], user_data2['b'])
-
-    def test_exception_record_deepcopy(self):
-        """Makes sure ExceptionRecord wrapper handles deep copy properly."""
-        try:
-            raise RecordTestError('Oh ha!')
-        except RecordTestError as e:
-            er = records.ExceptionRecord(e)
-        new_er = copy.deepcopy(er)
-        self.assertIsNot(er, new_er)
-        self.assertDictEqual(er.to_dict(), new_er.to_dict())
-
-    def test_add_controller_info_record(self):
-        tr = records.TestResult()
-        self.assertFalse(tr.controller_info)
-        controller_info = records.ControllerInfoRecord(
-            'SomeClass', 'MockDevice', ['magicA', 'magicB'])
-        tr.add_controller_info_record(controller_info)
-        self.assertTrue(tr.controller_info[0])
-        self.assertEqual(tr.controller_info[0].controller_name, 'MockDevice')
-        self.assertEqual(tr.controller_info[0].controller_info,
-                         ['magicA', 'magicB'])
-
-    def test_uid(self):
-        @records.uid('some-uuid')
-        def test_uid_helper():
-            """Dummy test used by `test_uid` for testing the uid decorator."""
-
-        self.assertEqual(test_uid_helper.uid, 'some-uuid')
+    self.assertEqual(test_uid_helper.uid, 'some-uuid')
 
 
 if __name__ == '__main__':
-    unittest.main()
+  unittest.main()
diff --git a/tests/mobly/suite_runner_test.py b/tests/mobly/suite_runner_test.py
index 57d6489..f9665fb 100755
--- a/tests/mobly/suite_runner_test.py
+++ b/tests/mobly/suite_runner_test.py
@@ -26,96 +26,96 @@
 
 
 class SuiteRunnerTest(unittest.TestCase):
-    def setUp(self):
-        self.tmp_dir = tempfile.mkdtemp()
+  def setUp(self):
+    self.tmp_dir = tempfile.mkdtemp()
 
-    def tearDown(self):
-        shutil.rmtree(self.tmp_dir)
+  def tearDown(self):
+    shutil.rmtree(self.tmp_dir)
 
-    def test_select_no_args(self):
-        identifiers = suite_runner.compute_selected_tests(test_classes=[
-            integration_test.IntegrationTest,
-            integration2_test.Integration2Test
-        ],
-                                                          selected_tests=None)
-        self.assertEqual(
-            {
-                integration_test.IntegrationTest: None,
-                integration2_test.Integration2Test: None,
-            }, identifiers)
+  def test_select_no_args(self):
+    identifiers = suite_runner.compute_selected_tests(test_classes=[
+      integration_test.IntegrationTest,
+      integration2_test.Integration2Test
+    ],
+                              selected_tests=None)
+    self.assertEqual(
+      {
+        integration_test.IntegrationTest: None,
+        integration2_test.Integration2Test: None,
+      }, identifiers)
 
-    def test_select_by_class(self):
-        identifiers = suite_runner.compute_selected_tests(
-            test_classes=[
-                integration_test.IntegrationTest,
-                integration2_test.Integration2Test
-            ],
-            selected_tests=['IntegrationTest'])
-        self.assertEqual({integration_test.IntegrationTest: None}, identifiers)
+  def test_select_by_class(self):
+    identifiers = suite_runner.compute_selected_tests(
+      test_classes=[
+        integration_test.IntegrationTest,
+        integration2_test.Integration2Test
+      ],
+      selected_tests=['IntegrationTest'])
+    self.assertEqual({integration_test.IntegrationTest: None}, identifiers)
 
-    def test_select_by_method(self):
-        identifiers = suite_runner.compute_selected_tests(
-            test_classes=[
-                integration_test.IntegrationTest,
-                integration2_test.Integration2Test
-            ],
-            selected_tests=[
-                'IntegrationTest.test_a', 'IntegrationTest.test_b'
-            ])
-        self.assertEqual(
-            {integration_test.IntegrationTest: ['test_a', 'test_b']},
-            identifiers)
+  def test_select_by_method(self):
+    identifiers = suite_runner.compute_selected_tests(
+      test_classes=[
+        integration_test.IntegrationTest,
+        integration2_test.Integration2Test
+      ],
+      selected_tests=[
+        'IntegrationTest.test_a', 'IntegrationTest.test_b'
+      ])
+    self.assertEqual(
+      {integration_test.IntegrationTest: ['test_a', 'test_b']},
+      identifiers)
 
-    def test_select_all_clobbers_method(self):
-        identifiers = suite_runner.compute_selected_tests(
-            test_classes=[
-                integration_test.IntegrationTest,
-                integration2_test.Integration2Test
-            ],
-            selected_tests=['IntegrationTest.test_a', 'IntegrationTest'])
-        self.assertEqual({integration_test.IntegrationTest: None}, identifiers)
+  def test_select_all_clobbers_method(self):
+    identifiers = suite_runner.compute_selected_tests(
+      test_classes=[
+        integration_test.IntegrationTest,
+        integration2_test.Integration2Test
+      ],
+      selected_tests=['IntegrationTest.test_a', 'IntegrationTest'])
+    self.assertEqual({integration_test.IntegrationTest: None}, identifiers)
 
-        identifiers = suite_runner.compute_selected_tests(
-            test_classes=[
-                integration_test.IntegrationTest,
-                integration2_test.Integration2Test
-            ],
-            selected_tests=['IntegrationTest', 'IntegrationTest.test_a'])
-        self.assertEqual({integration_test.IntegrationTest: None}, identifiers)
+    identifiers = suite_runner.compute_selected_tests(
+      test_classes=[
+        integration_test.IntegrationTest,
+        integration2_test.Integration2Test
+      ],
+      selected_tests=['IntegrationTest', 'IntegrationTest.test_a'])
+    self.assertEqual({integration_test.IntegrationTest: None}, identifiers)
 
-    @mock.patch('sys.exit')
-    def test_run_suite(self, mock_exit):
-        tmp_file_path = os.path.join(self.tmp_dir, 'config.yml')
-        with io.open(tmp_file_path, 'w', encoding='utf-8') as f:
-            f.write(u"""
-                TestBeds:
-                    # A test bed where adb will find Android devices.
-                    - Name: SampleTestBed
-                      Controllers:
-                          MagicDevice: '*'
-                      TestParams:
-                          icecream: 42
-                          extra_param: 'haha'
-            """)
-        suite_runner.run_suite([integration_test.IntegrationTest],
-                               argv=['-c', tmp_file_path])
-        mock_exit.assert_not_called()
+  @mock.patch('sys.exit')
+  def test_run_suite(self, mock_exit):
+    tmp_file_path = os.path.join(self.tmp_dir, 'config.yml')
+    with io.open(tmp_file_path, 'w', encoding='utf-8') as f:
+      f.write(u"""
+        TestBeds:
+          # A test bed where adb will find Android devices.
+          - Name: SampleTestBed
+            Controllers:
+              MagicDevice: '*'
+            TestParams:
+              icecream: 42
+              extra_param: 'haha'
+      """)
+    suite_runner.run_suite([integration_test.IntegrationTest],
+                 argv=['-c', tmp_file_path])
+    mock_exit.assert_not_called()
 
-    @mock.patch('sys.exit')
-    def test_run_suite_with_failures(self, mock_exit):
-        tmp_file_path = os.path.join(self.tmp_dir, 'config.yml')
-        with io.open(tmp_file_path, 'w', encoding='utf-8') as f:
-            f.write(u"""
-                TestBeds:
-                    # A test bed where adb will find Android devices.
-                    - Name: SampleTestBed
-                      Controllers:
-                          MagicDevice: '*'
-            """)
-        suite_runner.run_suite([integration_test.IntegrationTest],
-                               argv=['-c', tmp_file_path])
-        mock_exit.assert_called_once_with(1)
+  @mock.patch('sys.exit')
+  def test_run_suite_with_failures(self, mock_exit):
+    tmp_file_path = os.path.join(self.tmp_dir, 'config.yml')
+    with io.open(tmp_file_path, 'w', encoding='utf-8') as f:
+      f.write(u"""
+        TestBeds:
+          # A test bed where adb will find Android devices.
+          - Name: SampleTestBed
+            Controllers:
+              MagicDevice: '*'
+      """)
+    suite_runner.run_suite([integration_test.IntegrationTest],
+                 argv=['-c', tmp_file_path])
+    mock_exit.assert_called_once_with(1)
 
 
 if __name__ == "__main__":
-    unittest.main()
+  unittest.main()
diff --git a/tests/mobly/test_runner_test.py b/tests/mobly/test_runner_test.py
index 65b9e72..6077675 100755
--- a/tests/mobly/test_runner_test.py
+++ b/tests/mobly/test_runner_test.py
@@ -36,350 +36,350 @@
 
 
 class TestRunnerTest(unittest.TestCase):
-    """This test class has unit tests for the implementation of everything
-    under mobly.test_runner.
+  """This test class has unit tests for the implementation of everything
+  under mobly.test_runner.
+  """
+
+  def setUp(self):
+    self.tmp_dir = tempfile.mkdtemp()
+    self.base_mock_test_config = config_parser.TestRunConfig()
+    self.base_mock_test_config.testbed_name = 'SampleTestBed'
+    self.base_mock_test_config.controller_configs = {}
+    self.base_mock_test_config.user_params = {
+      'icecream': 42,
+      'extra_param': 'haha'
+    }
+    self.base_mock_test_config.log_path = self.tmp_dir
+    self.log_dir = self.base_mock_test_config.log_path
+    self.testbed_name = self.base_mock_test_config.testbed_name
+
+  def tearDown(self):
+    shutil.rmtree(self.tmp_dir)
+
+  def _assertControllerInfoEqual(self, info, expected_info_dict):
+    self.assertEqual(expected_info_dict['Controller Name'],
+             info.controller_name)
+    self.assertEqual(expected_info_dict['Test Class'], info.test_class)
+    self.assertEqual(expected_info_dict['Controller Info'],
+             info.controller_info)
+
+  def test_run_twice(self):
+    """Verifies that:
+    1. Repeated run works properly.
+    2. The original configuration is not altered if a test controller
+       module modifies configuration.
     """
-
-    def setUp(self):
-        self.tmp_dir = tempfile.mkdtemp()
-        self.base_mock_test_config = config_parser.TestRunConfig()
-        self.base_mock_test_config.testbed_name = 'SampleTestBed'
-        self.base_mock_test_config.controller_configs = {}
-        self.base_mock_test_config.user_params = {
-            'icecream': 42,
-            'extra_param': 'haha'
+    mock_test_config = self.base_mock_test_config.copy()
+    mock_ctrlr_config_name = mock_controller.MOBLY_CONTROLLER_CONFIG_NAME
+    my_config = [{
+      'serial': 'xxxx',
+      'magic': 'Magic1'
+    }, {
+      'serial': 'xxxx',
+      'magic': 'Magic2'
+    }]
+    mock_test_config.controller_configs[mock_ctrlr_config_name] = my_config
+    tr = test_runner.TestRunner(self.log_dir, self.testbed_name)
+    with tr.mobly_logger():
+      tr.add_test_class(mock_test_config,
+                integration_test.IntegrationTest)
+      tr.run()
+    self.assertTrue(
+      mock_test_config.controller_configs[mock_ctrlr_config_name][0])
+    with tr.mobly_logger():
+      tr.run()
+    results = tr.results.summary_dict()
+    self.assertEqual(results['Requested'], 2)
+    self.assertEqual(results['Executed'], 2)
+    self.assertEqual(results['Passed'], 2)
+    expected_info_dict = {
+      'Controller Info': [{
+        'MyMagic': {
+          'magic': 'Magic1'
         }
-        self.base_mock_test_config.log_path = self.tmp_dir
-        self.log_dir = self.base_mock_test_config.log_path
-        self.testbed_name = self.base_mock_test_config.testbed_name
-
-    def tearDown(self):
-        shutil.rmtree(self.tmp_dir)
-
-    def _assertControllerInfoEqual(self, info, expected_info_dict):
-        self.assertEqual(expected_info_dict['Controller Name'],
-                         info.controller_name)
-        self.assertEqual(expected_info_dict['Test Class'], info.test_class)
-        self.assertEqual(expected_info_dict['Controller Info'],
-                         info.controller_info)
-
-    def test_run_twice(self):
-        """Verifies that:
-        1. Repeated run works properly.
-        2. The original configuration is not altered if a test controller
-           module modifies configuration.
-        """
-        mock_test_config = self.base_mock_test_config.copy()
-        mock_ctrlr_config_name = mock_controller.MOBLY_CONTROLLER_CONFIG_NAME
-        my_config = [{
-            'serial': 'xxxx',
-            'magic': 'Magic1'
-        }, {
-            'serial': 'xxxx',
-            'magic': 'Magic2'
-        }]
-        mock_test_config.controller_configs[mock_ctrlr_config_name] = my_config
-        tr = test_runner.TestRunner(self.log_dir, self.testbed_name)
-        with tr.mobly_logger():
-            tr.add_test_class(mock_test_config,
-                              integration_test.IntegrationTest)
-            tr.run()
-        self.assertTrue(
-            mock_test_config.controller_configs[mock_ctrlr_config_name][0])
-        with tr.mobly_logger():
-            tr.run()
-        results = tr.results.summary_dict()
-        self.assertEqual(results['Requested'], 2)
-        self.assertEqual(results['Executed'], 2)
-        self.assertEqual(results['Passed'], 2)
-        expected_info_dict = {
-            'Controller Info': [{
-                'MyMagic': {
-                    'magic': 'Magic1'
-                }
-            }, {
-                'MyMagic': {
-                    'magic': 'Magic2'
-                }
-            }],
-            'Controller Name':
-            'MagicDevice',
-            'Test Class':
-            'IntegrationTest',
+      }, {
+        'MyMagic': {
+          'magic': 'Magic2'
         }
-        self._assertControllerInfoEqual(tr.results.controller_info[0],
-                                        expected_info_dict)
-        self._assertControllerInfoEqual(tr.results.controller_info[1],
-                                        expected_info_dict)
-        self.assertNotEqual(tr.results.controller_info[0],
-                            tr.results.controller_info[1])
+      }],
+      'Controller Name':
+      'MagicDevice',
+      'Test Class':
+      'IntegrationTest',
+    }
+    self._assertControllerInfoEqual(tr.results.controller_info[0],
+                    expected_info_dict)
+    self._assertControllerInfoEqual(tr.results.controller_info[1],
+                    expected_info_dict)
+    self.assertNotEqual(tr.results.controller_info[0],
+              tr.results.controller_info[1])
 
-    def test_summary_file_entries(self):
-        """Verifies the output summary's file format.
+  def test_summary_file_entries(self):
+    """Verifies the output summary's file format.
 
-        This focuses on the format of the file instead of the content of
-        entries, which is covered in base_test_test.
-        """
-        mock_test_config = self.base_mock_test_config.copy()
-        mock_ctrlr_config_name = mock_controller.MOBLY_CONTROLLER_CONFIG_NAME
-        my_config = [{
-            'serial': 'xxxx',
-            'magic': 'Magic1'
-        }, {
-            'serial': 'xxxx',
-            'magic': 'Magic2'
-        }]
-        mock_test_config.controller_configs[mock_ctrlr_config_name] = my_config
-        tr = test_runner.TestRunner(self.log_dir, self.testbed_name)
-        with tr.mobly_logger():
-            tr.add_test_class(mock_test_config,
-                              integration_test.IntegrationTest)
-            tr.run()
-        summary_path = os.path.join(logging.root_output_path,
-                                    records.OUTPUT_FILE_SUMMARY)
-        with io.open(summary_path, 'r', encoding='utf-8') as f:
-            summary_entries = list(yaml.safe_load_all(f))
-        self.assertEqual(len(summary_entries), 4)
-        # Verify the first entry is the list of test names.
-        self.assertEqual(summary_entries[0]['Type'],
-                         records.TestSummaryEntryType.TEST_NAME_LIST.value)
-        self.assertEqual(summary_entries[1]['Type'],
-                         records.TestSummaryEntryType.RECORD.value)
-        self.assertEqual(summary_entries[2]['Type'],
-                         records.TestSummaryEntryType.CONTROLLER_INFO.value)
-        self.assertEqual(summary_entries[3]['Type'],
-                         records.TestSummaryEntryType.SUMMARY.value)
+    This focuses on the format of the file instead of the content of
+    entries, which is covered in base_test_test.
+    """
+    mock_test_config = self.base_mock_test_config.copy()
+    mock_ctrlr_config_name = mock_controller.MOBLY_CONTROLLER_CONFIG_NAME
+    my_config = [{
+      'serial': 'xxxx',
+      'magic': 'Magic1'
+    }, {
+      'serial': 'xxxx',
+      'magic': 'Magic2'
+    }]
+    mock_test_config.controller_configs[mock_ctrlr_config_name] = my_config
+    tr = test_runner.TestRunner(self.log_dir, self.testbed_name)
+    with tr.mobly_logger():
+      tr.add_test_class(mock_test_config,
+                integration_test.IntegrationTest)
+      tr.run()
+    summary_path = os.path.join(logging.root_output_path,
+                  records.OUTPUT_FILE_SUMMARY)
+    with io.open(summary_path, 'r', encoding='utf-8') as f:
+      summary_entries = list(yaml.safe_load_all(f))
+    self.assertEqual(len(summary_entries), 4)
+    # Verify the first entry is the list of test names.
+    self.assertEqual(summary_entries[0]['Type'],
+             records.TestSummaryEntryType.TEST_NAME_LIST.value)
+    self.assertEqual(summary_entries[1]['Type'],
+             records.TestSummaryEntryType.RECORD.value)
+    self.assertEqual(summary_entries[2]['Type'],
+             records.TestSummaryEntryType.CONTROLLER_INFO.value)
+    self.assertEqual(summary_entries[3]['Type'],
+             records.TestSummaryEntryType.SUMMARY.value)
 
-    def test_run(self):
-        tr = test_runner.TestRunner(self.log_dir, self.testbed_name)
-        self.base_mock_test_config.controller_configs[
-            mock_controller.MOBLY_CONTROLLER_CONFIG_NAME] = '*'
-        with tr.mobly_logger():
-            tr.add_test_class(self.base_mock_test_config,
-                              integration_test.IntegrationTest)
-            tr.run()
-        results = tr.results.summary_dict()
-        self.assertEqual(results['Requested'], 1)
-        self.assertEqual(results['Executed'], 1)
-        self.assertEqual(results['Passed'], 1)
-        self.assertEqual(len(tr.results.executed), 1)
-        record = tr.results.executed[0]
-        self.assertEqual(record.test_class, 'IntegrationTest')
+  def test_run(self):
+    tr = test_runner.TestRunner(self.log_dir, self.testbed_name)
+    self.base_mock_test_config.controller_configs[
+      mock_controller.MOBLY_CONTROLLER_CONFIG_NAME] = '*'
+    with tr.mobly_logger():
+      tr.add_test_class(self.base_mock_test_config,
+                integration_test.IntegrationTest)
+      tr.run()
+    results = tr.results.summary_dict()
+    self.assertEqual(results['Requested'], 1)
+    self.assertEqual(results['Executed'], 1)
+    self.assertEqual(results['Passed'], 1)
+    self.assertEqual(len(tr.results.executed), 1)
+    record = tr.results.executed[0]
+    self.assertEqual(record.test_class, 'IntegrationTest')
 
-    def test_run_without_mobly_logger_context(self):
-        tr = test_runner.TestRunner(self.log_dir, self.testbed_name)
-        self.base_mock_test_config.controller_configs[
-            mock_controller.MOBLY_CONTROLLER_CONFIG_NAME] = '*'
-        tr.add_test_class(self.base_mock_test_config,
-                          integration_test.IntegrationTest)
+  def test_run_without_mobly_logger_context(self):
+    tr = test_runner.TestRunner(self.log_dir, self.testbed_name)
+    self.base_mock_test_config.controller_configs[
+      mock_controller.MOBLY_CONTROLLER_CONFIG_NAME] = '*'
+    tr.add_test_class(self.base_mock_test_config,
+              integration_test.IntegrationTest)
+    tr.run()
+    results = tr.results.summary_dict()
+    self.assertEqual(results['Requested'], 1)
+    self.assertEqual(results['Executed'], 1)
+    self.assertEqual(results['Passed'], 1)
+    self.assertEqual(len(tr.results.executed), 1)
+    record = tr.results.executed[0]
+    self.assertEqual(record.test_class, 'IntegrationTest')
+
+  @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
+        return_value=mock_android_device.MockAdbProxy(1))
+  @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
+        return_value=mock_android_device.MockFastbootProxy(1))
+  @mock.patch('mobly.controllers.android_device.list_adb_devices',
+        return_value=['1'])
+  @mock.patch('mobly.controllers.android_device.get_all_instances',
+        return_value=mock_android_device.get_mock_ads(1))
+  def test_run_two_test_classes(self, mock_get_all, mock_list_adb,
+                  mock_fastboot, mock_adb):
+    """Verifies that running more than one test class in one test run works
+    properly.
+
+    This requires using a built-in controller module. Using AndroidDevice
+    module since it has all the mocks needed already.
+    """
+    mock_test_config = self.base_mock_test_config.copy()
+    mock_ctrlr_config_name = mock_controller.MOBLY_CONTROLLER_CONFIG_NAME
+    my_config = [{
+      'serial': 'xxxx',
+      'magic': 'Magic1'
+    }, {
+      'serial': 'xxxx',
+      'magic': 'Magic2'
+    }]
+    mock_test_config.controller_configs[mock_ctrlr_config_name] = my_config
+    mock_test_config.controller_configs['AndroidDevice'] = [{
+      'serial': '1'
+    }]
+    tr = test_runner.TestRunner(self.log_dir, self.testbed_name)
+    with tr.mobly_logger():
+      tr.add_test_class(mock_test_config,
+                integration2_test.Integration2Test)
+      tr.add_test_class(mock_test_config,
+                integration_test.IntegrationTest)
+      tr.run()
+    results = tr.results.summary_dict()
+    self.assertEqual(results['Requested'], 2)
+    self.assertEqual(results['Executed'], 2)
+    self.assertEqual(results['Passed'], 2)
+    self.assertEqual(len(tr.results.executed), 2)
+    # Tag of the test class defaults to the class name.
+    record1 = tr.results.executed[0]
+    record2 = tr.results.executed[1]
+    self.assertEqual(record1.test_class, 'Integration2Test')
+    self.assertEqual(record2.test_class, 'IntegrationTest')
+
+  def test_run_two_test_classes_different_configs_and_aliases(self):
+    """Verifies that running more than one test class in one test run with
+    different configs works properly.
+    """
+    config1 = self.base_mock_test_config.copy()
+    config1.controller_configs[
+      mock_controller.MOBLY_CONTROLLER_CONFIG_NAME] = [{
+        'serial': 'xxxx'
+      }]
+    config2 = config1.copy()
+    config2.user_params['icecream'] = 10
+    tr = test_runner.TestRunner(self.log_dir, self.testbed_name)
+    with tr.mobly_logger():
+      tr.add_test_class(config1,
+                integration_test.IntegrationTest,
+                name_suffix='FirstConfig')
+      tr.add_test_class(config2,
+                integration_test.IntegrationTest,
+                name_suffix='SecondConfig')
+      tr.run()
+    results = tr.results.summary_dict()
+    self.assertEqual(results['Requested'], 2)
+    self.assertEqual(results['Executed'], 2)
+    self.assertEqual(results['Passed'], 1)
+    self.assertEqual(results['Failed'], 1)
+    self.assertEqual(tr.results.failed[0].details, '10 != 42')
+    self.assertEqual(len(tr.results.executed), 2)
+    record1 = tr.results.executed[0]
+    record2 = tr.results.executed[1]
+    self.assertEqual(record1.test_class, 'IntegrationTest_FirstConfig')
+    self.assertEqual(record2.test_class, 'IntegrationTest_SecondConfig')
+
+  def test_run_with_abort_all(self):
+    mock_test_config = self.base_mock_test_config.copy()
+    tr = test_runner.TestRunner(self.log_dir, self.testbed_name)
+    with tr.mobly_logger():
+      tr.add_test_class(mock_test_config,
+                integration3_test.Integration3Test)
+      with self.assertRaises(signals.TestAbortAll):
         tr.run()
-        results = tr.results.summary_dict()
-        self.assertEqual(results['Requested'], 1)
-        self.assertEqual(results['Executed'], 1)
-        self.assertEqual(results['Passed'], 1)
-        self.assertEqual(len(tr.results.executed), 1)
-        record = tr.results.executed[0]
-        self.assertEqual(record.test_class, 'IntegrationTest')
+    results = tr.results.summary_dict()
+    self.assertEqual(results['Requested'], 1)
+    self.assertEqual(results['Executed'], 0)
+    self.assertEqual(results['Passed'], 0)
+    self.assertEqual(results['Failed'], 0)
 
-    @mock.patch('mobly.controllers.android_device_lib.adb.AdbProxy',
-                return_value=mock_android_device.MockAdbProxy(1))
-    @mock.patch('mobly.controllers.android_device_lib.fastboot.FastbootProxy',
-                return_value=mock_android_device.MockFastbootProxy(1))
-    @mock.patch('mobly.controllers.android_device.list_adb_devices',
-                return_value=['1'])
-    @mock.patch('mobly.controllers.android_device.get_all_instances',
-                return_value=mock_android_device.get_mock_ads(1))
-    def test_run_two_test_classes(self, mock_get_all, mock_list_adb,
-                                  mock_fastboot, mock_adb):
-        """Verifies that running more than one test class in one test run works
-        properly.
+  def test_add_test_class_mismatched_log_path(self):
+    tr = test_runner.TestRunner('/different/log/dir', self.testbed_name)
+    with self.assertRaisesRegex(
+        test_runner.Error,
+        'TestRunner\'s log folder is "/different/log/dir", but a test '
+        r'config with a different log folder \("%s"\) was added.' %
+        re.escape(self.log_dir)):
+      tr.add_test_class(self.base_mock_test_config,
+                integration_test.IntegrationTest)
 
-        This requires using a built-in controller module. Using AndroidDevice
-        module since it has all the mocks needed already.
-        """
-        mock_test_config = self.base_mock_test_config.copy()
-        mock_ctrlr_config_name = mock_controller.MOBLY_CONTROLLER_CONFIG_NAME
-        my_config = [{
-            'serial': 'xxxx',
-            'magic': 'Magic1'
-        }, {
-            'serial': 'xxxx',
-            'magic': 'Magic2'
-        }]
-        mock_test_config.controller_configs[mock_ctrlr_config_name] = my_config
-        mock_test_config.controller_configs['AndroidDevice'] = [{
-            'serial': '1'
-        }]
-        tr = test_runner.TestRunner(self.log_dir, self.testbed_name)
-        with tr.mobly_logger():
-            tr.add_test_class(mock_test_config,
-                              integration2_test.Integration2Test)
-            tr.add_test_class(mock_test_config,
-                              integration_test.IntegrationTest)
-            tr.run()
-        results = tr.results.summary_dict()
-        self.assertEqual(results['Requested'], 2)
-        self.assertEqual(results['Executed'], 2)
-        self.assertEqual(results['Passed'], 2)
-        self.assertEqual(len(tr.results.executed), 2)
-        # Tag of the test class defaults to the class name.
-        record1 = tr.results.executed[0]
-        record2 = tr.results.executed[1]
-        self.assertEqual(record1.test_class, 'Integration2Test')
-        self.assertEqual(record2.test_class, 'IntegrationTest')
+  def test_add_test_class_mismatched_testbed_name(self):
+    tr = test_runner.TestRunner(self.log_dir, 'different_test_bed')
+    with self.assertRaisesRegex(
+        test_runner.Error,
+        'TestRunner\'s test bed is "different_test_bed", but a test '
+        r'config with a different test bed \("%s"\) was added.' %
+        self.testbed_name):
+      tr.add_test_class(self.base_mock_test_config,
+                integration_test.IntegrationTest)
 
-    def test_run_two_test_classes_different_configs_and_aliases(self):
-        """Verifies that running more than one test class in one test run with
-        different configs works properly.
-        """
-        config1 = self.base_mock_test_config.copy()
-        config1.controller_configs[
-            mock_controller.MOBLY_CONTROLLER_CONFIG_NAME] = [{
-                'serial': 'xxxx'
-            }]
-        config2 = config1.copy()
-        config2.user_params['icecream'] = 10
-        tr = test_runner.TestRunner(self.log_dir, self.testbed_name)
-        with tr.mobly_logger():
-            tr.add_test_class(config1,
-                              integration_test.IntegrationTest,
-                              name_suffix='FirstConfig')
-            tr.add_test_class(config2,
-                              integration_test.IntegrationTest,
-                              name_suffix='SecondConfig')
-            tr.run()
-        results = tr.results.summary_dict()
-        self.assertEqual(results['Requested'], 2)
-        self.assertEqual(results['Executed'], 2)
-        self.assertEqual(results['Passed'], 1)
-        self.assertEqual(results['Failed'], 1)
-        self.assertEqual(tr.results.failed[0].details, '10 != 42')
-        self.assertEqual(len(tr.results.executed), 2)
-        record1 = tr.results.executed[0]
-        record2 = tr.results.executed[1]
-        self.assertEqual(record1.test_class, 'IntegrationTest_FirstConfig')
-        self.assertEqual(record2.test_class, 'IntegrationTest_SecondConfig')
+  def test_run_no_tests(self):
+    tr = test_runner.TestRunner(self.log_dir, self.testbed_name)
+    with self.assertRaisesRegex(test_runner.Error, 'No tests to execute.'):
+      tr.run()
 
-    def test_run_with_abort_all(self):
-        mock_test_config = self.base_mock_test_config.copy()
-        tr = test_runner.TestRunner(self.log_dir, self.testbed_name)
-        with tr.mobly_logger():
-            tr.add_test_class(mock_test_config,
-                              integration3_test.Integration3Test)
-            with self.assertRaises(signals.TestAbortAll):
-                tr.run()
-        results = tr.results.summary_dict()
-        self.assertEqual(results['Requested'], 1)
-        self.assertEqual(results['Executed'], 0)
-        self.assertEqual(results['Passed'], 0)
-        self.assertEqual(results['Failed'], 0)
+  @mock.patch('mobly.test_runner._find_test_class',
+        return_value=type('SampleTest', (), {}))
+  @mock.patch('mobly.test_runner.config_parser.load_test_config_file',
+        return_value=[config_parser.TestRunConfig()])
+  @mock.patch('mobly.test_runner.TestRunner', return_value=mock.MagicMock())
+  def test_main_parse_args(self, mock_test_runner, mock_config,
+               mock_find_test):
+    test_runner.main(['-c', 'some/path/foo.yaml', '-b', 'hello'])
+    mock_config.assert_called_with('some/path/foo.yaml', None)
 
-    def test_add_test_class_mismatched_log_path(self):
-        tr = test_runner.TestRunner('/different/log/dir', self.testbed_name)
-        with self.assertRaisesRegex(
-                test_runner.Error,
-                'TestRunner\'s log folder is "/different/log/dir", but a test '
-                r'config with a different log folder \("%s"\) was added.' %
-                re.escape(self.log_dir)):
-            tr.add_test_class(self.base_mock_test_config,
-                              integration_test.IntegrationTest)
+  @mock.patch('mobly.test_runner._find_test_class',
+        return_value=integration_test.IntegrationTest)
+  @mock.patch('sys.exit')
+  def test_main(self, mock_exit, mock_find_test):
+    tmp_file_path = os.path.join(self.tmp_dir, 'config.yml')
+    with io.open(tmp_file_path, 'w', encoding='utf-8') as f:
+      f.write(u"""
+        TestBeds:
+          # A test bed where adb will find Android devices.
+          - Name: SampleTestBed
+            Controllers:
+              MagicDevice: '*'
+            TestParams:
+              icecream: 42
+              extra_param: 'haha'
+      """)
+    test_runner.main(['-c', tmp_file_path])
+    mock_exit.assert_not_called()
 
-    def test_add_test_class_mismatched_testbed_name(self):
-        tr = test_runner.TestRunner(self.log_dir, 'different_test_bed')
-        with self.assertRaisesRegex(
-                test_runner.Error,
-                'TestRunner\'s test bed is "different_test_bed", but a test '
-                r'config with a different test bed \("%s"\) was added.' %
-                self.testbed_name):
-            tr.add_test_class(self.base_mock_test_config,
-                              integration_test.IntegrationTest)
+  @mock.patch('mobly.test_runner._find_test_class',
+        return_value=integration_test.IntegrationTest)
+  @mock.patch('sys.exit')
+  def test_main_with_failures(self, mock_exit, mock_find_test):
+    tmp_file_path = os.path.join(self.tmp_dir, 'config.yml')
+    with io.open(tmp_file_path, 'w', encoding='utf-8') as f:
+      f.write(u"""
+        TestBeds:
+          # A test bed where adb will find Android devices.
+          - Name: SampleTestBed
+            Controllers:
+              MagicDevice: '*'
+      """)
+    test_runner.main(['-c', tmp_file_path])
+    mock_exit.assert_called_once_with(1)
 
-    def test_run_no_tests(self):
-        tr = test_runner.TestRunner(self.log_dir, self.testbed_name)
-        with self.assertRaisesRegex(test_runner.Error, 'No tests to execute.'):
-            tr.run()
+  def test__find_test_class_when_one_test_class(self):
+    with mock.patch.dict('sys.modules', __main__=integration_test):
+      test_class = test_runner._find_test_class()
+      self.assertEqual(test_class, integration_test.IntegrationTest)
 
-    @mock.patch('mobly.test_runner._find_test_class',
-                return_value=type('SampleTest', (), {}))
-    @mock.patch('mobly.test_runner.config_parser.load_test_config_file',
-                return_value=[config_parser.TestRunConfig()])
-    @mock.patch('mobly.test_runner.TestRunner', return_value=mock.MagicMock())
-    def test_main_parse_args(self, mock_test_runner, mock_config,
-                             mock_find_test):
-        test_runner.main(['-c', 'some/path/foo.yaml', '-b', 'hello'])
-        mock_config.assert_called_with('some/path/foo.yaml', None)
+  def test__find_test_class_when_no_test_class(self):
+    with self.assertRaises(SystemExit):
+      with mock.patch.dict('sys.modules', __main__=mock_controller):
+        test_class = test_runner._find_test_class()
 
-    @mock.patch('mobly.test_runner._find_test_class',
-                return_value=integration_test.IntegrationTest)
-    @mock.patch('sys.exit')
-    def test_main(self, mock_exit, mock_find_test):
-        tmp_file_path = os.path.join(self.tmp_dir, 'config.yml')
-        with io.open(tmp_file_path, 'w', encoding='utf-8') as f:
-            f.write(u"""
-                TestBeds:
-                    # A test bed where adb will find Android devices.
-                    - Name: SampleTestBed
-                      Controllers:
-                          MagicDevice: '*'
-                      TestParams:
-                          icecream: 42
-                          extra_param: 'haha'
-            """)
-        test_runner.main(['-c', tmp_file_path])
-        mock_exit.assert_not_called()
+  def test__find_test_class_when_multiple_test_classes(self):
+    with self.assertRaises(SystemExit):
+      with mock.patch.dict('sys.modules',
+                 __main__=multiple_subclasses_module):
+        test_class = test_runner._find_test_class()
 
-    @mock.patch('mobly.test_runner._find_test_class',
-                return_value=integration_test.IntegrationTest)
-    @mock.patch('sys.exit')
-    def test_main_with_failures(self, mock_exit, mock_find_test):
-        tmp_file_path = os.path.join(self.tmp_dir, 'config.yml')
-        with io.open(tmp_file_path, 'w', encoding='utf-8') as f:
-            f.write(u"""
-                TestBeds:
-                    # A test bed where adb will find Android devices.
-                    - Name: SampleTestBed
-                      Controllers:
-                          MagicDevice: '*'
-            """)
-        test_runner.main(['-c', tmp_file_path])
-        mock_exit.assert_called_once_with(1)
+  def test_print_test_names(self):
+    mock_test_class = mock.MagicMock()
+    mock_cls_instance = mock.MagicMock()
+    mock_test_class.return_value = mock_cls_instance
+    test_runner._print_test_names(mock_test_class)
+    mock_cls_instance.setup_generated_tests.assert_called_once()
+    mock_cls_instance.get_existing_test_names.assert_called_once()
+    mock_cls_instance._controller_manager.unregister_controllers.assert_called_once(
+    )
 
-    def test__find_test_class_when_one_test_class(self):
-        with mock.patch.dict('sys.modules', __main__=integration_test):
-            test_class = test_runner._find_test_class()
-            self.assertEqual(test_class, integration_test.IntegrationTest)
-
-    def test__find_test_class_when_no_test_class(self):
-        with self.assertRaises(SystemExit):
-            with mock.patch.dict('sys.modules', __main__=mock_controller):
-                test_class = test_runner._find_test_class()
-
-    def test__find_test_class_when_multiple_test_classes(self):
-        with self.assertRaises(SystemExit):
-            with mock.patch.dict('sys.modules',
-                                 __main__=multiple_subclasses_module):
-                test_class = test_runner._find_test_class()
-
-    def test_print_test_names(self):
-        mock_test_class = mock.MagicMock()
-        mock_cls_instance = mock.MagicMock()
-        mock_test_class.return_value = mock_cls_instance
-        test_runner._print_test_names(mock_test_class)
-        mock_cls_instance.setup_generated_tests.assert_called_once()
-        mock_cls_instance.get_existing_test_names.assert_called_once()
-        mock_cls_instance._controller_manager.unregister_controllers.assert_called_once(
-        )
-
-    def test_print_test_names_with_exception(self):
-        mock_test_class = mock.MagicMock()
-        mock_cls_instance = mock.MagicMock()
-        mock_test_class.return_value = mock_cls_instance
-        test_runner._print_test_names(mock_test_class)
-        mock_cls_instance.setup_generated_tests.side_effect = Exception(
-            'Something went wrong.')
-        mock_cls_instance._controller_manager.unregister_controllers.assert_called_once(
-        )
+  def test_print_test_names_with_exception(self):
+    mock_test_class = mock.MagicMock()
+    mock_cls_instance = mock.MagicMock()
+    mock_test_class.return_value = mock_cls_instance
+    test_runner._print_test_names(mock_test_class)
+    mock_cls_instance.setup_generated_tests.side_effect = Exception(
+      'Something went wrong.')
+    mock_cls_instance._controller_manager.unregister_controllers.assert_called_once(
+    )
 
 
 if __name__ == "__main__":
-    unittest.main()
+  unittest.main()
diff --git a/tests/mobly/test_suite_test.py b/tests/mobly/test_suite_test.py
index 752cb03..6e52461 100755
--- a/tests/mobly/test_suite_test.py
+++ b/tests/mobly/test_suite_test.py
@@ -29,51 +29,51 @@
 
 
 class TestSuiteTest(unittest.TestCase):
-    """Tests for use cases of creating Mobly test suites.
+  """Tests for use cases of creating Mobly test suites.
 
-    Tests here target a combination of test_runner and base_test code.
-    """
-    def setUp(self):
-        self.tmp_dir = tempfile.mkdtemp()
-        self.mock_test_cls_configs = config_parser.TestRunConfig()
-        self.summary_file = os.path.join(self.tmp_dir, 'summary.yaml')
-        self.mock_test_cls_configs.summary_writer = records.TestSummaryWriter(
-            self.summary_file)
-        self.mock_test_cls_configs.log_path = self.tmp_dir
-        self.mock_test_cls_configs.user_params = {"some_param": "hahaha"}
-        self.mock_test_cls_configs.reporter = mock.MagicMock()
-        self.base_mock_test_config = config_parser.TestRunConfig()
-        self.base_mock_test_config.testbed_name = 'SampleTestBed'
-        self.base_mock_test_config.controller_configs = {}
-        self.base_mock_test_config.user_params = {
-            'icecream': 42,
-            'extra_param': 'haha'
-        }
-        self.base_mock_test_config.log_path = self.tmp_dir
+  Tests here target a combination of test_runner and base_test code.
+  """
+  def setUp(self):
+    self.tmp_dir = tempfile.mkdtemp()
+    self.mock_test_cls_configs = config_parser.TestRunConfig()
+    self.summary_file = os.path.join(self.tmp_dir, 'summary.yaml')
+    self.mock_test_cls_configs.summary_writer = records.TestSummaryWriter(
+      self.summary_file)
+    self.mock_test_cls_configs.log_path = self.tmp_dir
+    self.mock_test_cls_configs.user_params = {"some_param": "hahaha"}
+    self.mock_test_cls_configs.reporter = mock.MagicMock()
+    self.base_mock_test_config = config_parser.TestRunConfig()
+    self.base_mock_test_config.testbed_name = 'SampleTestBed'
+    self.base_mock_test_config.controller_configs = {}
+    self.base_mock_test_config.user_params = {
+      'icecream': 42,
+      'extra_param': 'haha'
+    }
+    self.base_mock_test_config.log_path = self.tmp_dir
 
-    def tearDown(self):
-        shutil.rmtree(self.tmp_dir)
+  def tearDown(self):
+    shutil.rmtree(self.tmp_dir)
 
-    def test_controller_object_not_persistent_across_classes(self):
-        test_run_config = self.base_mock_test_config.copy()
-        test_run_config.controller_configs = {'MagicDevice': [{'serial': 1}]}
+  def test_controller_object_not_persistent_across_classes(self):
+    test_run_config = self.base_mock_test_config.copy()
+    test_run_config.controller_configs = {'MagicDevice': [{'serial': 1}]}
 
-        class FooTest(base_test.BaseTestClass):
-            def setup_class(cls1):
-                self.controller1 = cls1.register_controller(mock_controller)[0]
+    class FooTest(base_test.BaseTestClass):
+      def setup_class(cls1):
+        self.controller1 = cls1.register_controller(mock_controller)[0]
 
-        class BarTest(base_test.BaseTestClass):
-            def setup_class(cls2):
-                self.controller2 = cls2.register_controller(mock_controller)[0]
+    class BarTest(base_test.BaseTestClass):
+      def setup_class(cls2):
+        self.controller2 = cls2.register_controller(mock_controller)[0]
 
-        tr = test_runner.TestRunner(self.tmp_dir,
-                                    test_run_config.testbed_name)
-        with tr.mobly_logger():
-            tr.add_test_class(test_run_config, FooTest)
-            tr.add_test_class(test_run_config, BarTest)
-            tr.run()
-        self.assertIsNot(self.controller1, self.controller2)
+    tr = test_runner.TestRunner(self.tmp_dir,
+                  test_run_config.testbed_name)
+    with tr.mobly_logger():
+      tr.add_test_class(test_run_config, FooTest)
+      tr.add_test_class(test_run_config, BarTest)
+      tr.run()
+    self.assertIsNot(self.controller1, self.controller2)
 
 
 if __name__ == "__main__":
-    unittest.main()
+  unittest.main()
diff --git a/tests/mobly/utils_test.py b/tests/mobly/utils_test.py
index 0b033e3..7f1bf80 100755
--- a/tests/mobly/utils_test.py
+++ b/tests/mobly/utils_test.py
@@ -43,550 +43,550 @@
 
 
 class UtilsTest(unittest.TestCase):
-    """This test class has unit tests for the implementation of everything
-    under mobly.utils.
+  """This test class has unit tests for the implementation of everything
+  under mobly.utils.
+  """
+  def setUp(self):
+    system = platform.system()
+    self.tmp_dir = tempfile.mkdtemp()
+
+  def tearDown(self):
+    shutil.rmtree(self.tmp_dir)
+
+  def sleep_cmd(self, wait_secs):
+    if platform.system() == 'Windows':
+      python_code = ['import time', 'time.sleep(%s)' % wait_secs]
+      return ['python', '-c', 'exec("%s")' % r'\r\n'.join(python_code)]
+    else:
+      return ['sleep', str(wait_secs)]
+
+  def test_run_command(self):
+    (ret, out, err) = utils.run_command(self.sleep_cmd(0.01))
+    self.assertEqual(ret, 0)
+
+  def test_run_command_with_timeout(self):
+    (ret, out, err) = utils.run_command(self.sleep_cmd(0.01), timeout=4)
+    self.assertEqual(ret, 0)
+
+  def test_run_command_with_timeout_expired(self):
+    with self.assertRaises(psutil.TimeoutExpired):
+      _ = utils.run_command(self.sleep_cmd(4), timeout=0.01)
+
+  @mock.patch('threading.Timer')
+  @mock.patch('psutil.Popen')
+  def test_run_command_with_default_params(self, mock_Popen, mock_Timer):
+    mock_command = mock.MagicMock(spec=dict)
+    mock_proc = mock_Popen.return_value
+    mock_proc.communicate.return_value = ('fake_out', 'fake_err')
+    mock_proc.returncode = 0
+    out = utils.run_command(mock_command)
+    self.assertEqual(out, (0, 'fake_out', 'fake_err'))
+    mock_Popen.assert_called_with(
+      mock_command,
+      stdout=subprocess.PIPE,
+      stderr=subprocess.PIPE,
+      shell=False,
+      cwd=None,
+      env=None,
+    )
+    mock_Timer.assert_not_called()
+
+  @mock.patch('threading.Timer')
+  @mock.patch('psutil.Popen')
+  def test_run_command_with_custom_params(self, mock_Popen, mock_Timer):
+    mock_command = mock.MagicMock(spec=dict)
+    mock_stdout = mock.MagicMock(spec=int)
+    mock_stderr = mock.MagicMock(spec=int)
+    mock_shell = mock.MagicMock(spec=bool)
+    mock_timeout = 1234
+    mock_env = mock.MagicMock(spec=dict)
+    mock_proc = mock_Popen.return_value
+    mock_proc.communicate.return_value = ('fake_out', 'fake_err')
+    mock_proc.returncode = 127
+    out = utils.run_command(mock_command,
+                stdout=mock_stdout,
+                stderr=mock_stderr,
+                shell=mock_shell,
+                timeout=mock_timeout,
+                env=mock_env)
+    self.assertEqual(out, (127, 'fake_out', 'fake_err'))
+    mock_Popen.assert_called_with(
+      mock_command,
+      stdout=mock_stdout,
+      stderr=mock_stderr,
+      shell=mock_shell,
+      cwd=None,
+      env=mock_env,
+    )
+    mock_Timer.assert_called_with(1234, mock.ANY)
+
+  def test_start_standing_subproc(self):
+    try:
+      p = utils.start_standing_subprocess(self.sleep_cmd(0.01))
+      p1 = psutil.Process(p.pid)
+      self.assertTrue(p1.is_running())
+    finally:
+      p.stdout.close()
+      p.stderr.close()
+      p.wait()
+
+  @mock.patch('subprocess.Popen')
+  def test_start_standing_subproc_without_env(self, mock_Popen):
+    p = utils.start_standing_subprocess(self.sleep_cmd(0.01))
+    mock_Popen.assert_called_with(
+      self.sleep_cmd(0.01),
+      stdin=subprocess.PIPE,
+      stdout=subprocess.PIPE,
+      stderr=subprocess.PIPE,
+      shell=False,
+      env=None,
+    )
+
+  @mock.patch('subprocess.Popen')
+  def test_start_standing_subproc_with_custom_env(self, mock_Popen):
+    mock_env = mock.MagicMock(spec=dict)
+    p = utils.start_standing_subprocess(self.sleep_cmd(0.01), env=mock_env)
+    mock_Popen.assert_called_with(
+      self.sleep_cmd(0.01),
+      stdin=subprocess.PIPE,
+      stdout=subprocess.PIPE,
+      stderr=subprocess.PIPE,
+      shell=False,
+      env=mock_env,
+    )
+
+  def test_stop_standing_subproc(self):
+    p = utils.start_standing_subprocess(self.sleep_cmd(4))
+    p1 = psutil.Process(p.pid)
+    utils.stop_standing_subprocess(p)
+    self.assertFalse(p1.is_running())
+
+  def test_stop_standing_subproc_wihtout_pipe(self):
+    p = subprocess.Popen(self.sleep_cmd(4))
+    self.assertIsNone(p.stdout)
+    p1 = psutil.Process(p.pid)
+    utils.stop_standing_subprocess(p)
+    self.assertFalse(p1.is_running())
+
+  @unittest.skipIf(sys.version_info >= (3, 4) and sys.version_info < (3, 5),
+           'Python 3.4 does not support `None` max_workers.')
+  def test_concurrent_exec_when_none_workers(self):
+    def adder(a, b):
+      return a + b
+
+    with mock.patch.object(
+        futures, 'ThreadPoolExecutor',
+        wraps=futures.ThreadPoolExecutor) as thread_pool_spy:
+      results = utils.concurrent_exec(adder, [(1, 1), (2, 2)],
+                      max_workers=None)
+
+    thread_pool_spy.assert_called_once_with(max_workers=None)
+
+    self.assertEqual(len(results), 2)
+    self.assertIn(2, results)
+    self.assertIn(4, results)
+
+  def test_concurrent_exec_when_default_max_workers(self):
+    def adder(a, b):
+      return a + b
+
+    with mock.patch.object(
+        futures, 'ThreadPoolExecutor',
+        wraps=futures.ThreadPoolExecutor) as thread_pool_spy:
+      results = utils.concurrent_exec(adder, [(1, 1), (2, 2)])
+
+    thread_pool_spy.assert_called_once_with(max_workers=30)
+
+    self.assertEqual(len(results), 2)
+    self.assertIn(2, results)
+    self.assertIn(4, results)
+
+  def test_concurrent_exec_when_custom_max_workers(self):
+    def adder(a, b):
+      return a + b
+
+    with mock.patch.object(
+        futures, 'ThreadPoolExecutor',
+        wraps=futures.ThreadPoolExecutor) as thread_pool_spy:
+      results = utils.concurrent_exec(adder, [(1, 1), (2, 2)],
+                      max_workers=1)
+
+    thread_pool_spy.assert_called_once_with(max_workers=1)
+    self.assertEqual(len(results), 2)
+    self.assertIn(2, results)
+    self.assertIn(4, results)
+
+  def test_concurrent_exec_makes_all_calls(self):
+    mock_function = mock.MagicMock()
+    _ = utils.concurrent_exec(mock_function, [
+      (1, 1),
+      (2, 2),
+      (3, 3),
+    ])
+    self.assertEqual(mock_function.call_count, 3)
+    mock_function.assert_has_calls(
+      [mock.call(1, 1),
+       mock.call(2, 2),
+       mock.call(3, 3)],
+      any_order=True)
+
+  def test_concurrent_exec_generates_results(self):
+    def adder(a, b):
+      return a + b
+
+    results = utils.concurrent_exec(adder, [(1, 1), (2, 2)])
+    self.assertEqual(len(results), 2)
+    self.assertIn(2, results)
+    self.assertIn(4, results)
+
+  def test_concurrent_exec_when_exception_makes_all_calls(self):
+    mock_call_recorder = mock.MagicMock()
+    lock_call_count = threading.Lock()
+
+    def fake_int(a, ):
+      with lock_call_count:
+        mock_call_recorder(a)
+      return int(a)
+
+    results = utils.concurrent_exec(fake_int, [
+      (1, ),
+      ('123', ),
+      ('not_int', ),
+      (5435, ),
+    ])
+
+    self.assertEqual(mock_call_recorder.call_count, 4)
+    mock_call_recorder.assert_has_calls([
+      mock.call(1),
+      mock.call('123'),
+      mock.call('not_int'),
+      mock.call(5435),
+    ],
+                      any_order=True)
+
+  def test_concurrent_exec_when_exception_generates_results(self):
+    mock_call_recorder = mock.MagicMock()
+    lock_call_count = threading.Lock()
+
+    def fake_int(a, ):
+      with lock_call_count:
+        mock_call_recorder(a)
+      return int(a)
+
+    results = utils.concurrent_exec(fake_int, [
+      (1, ),
+      ('123', ),
+      ('not_int', ),
+      (5435, ),
+    ])
+
+    self.assertEqual(len(results), 4)
+    self.assertIn(1, results)
+    self.assertIn(123, results)
+    self.assertIn(5435, results)
+    exceptions = [
+      result for result in results if isinstance(result, Exception)
+    ]
+    self.assertEqual(len(exceptions), 1)
+    self.assertIsInstance(exceptions[0], ValueError)
+
+  def test_concurrent_exec_when_multiple_exceptions_makes_all_calls(self):
+    mock_call_recorder = mock.MagicMock()
+    lock_call_count = threading.Lock()
+
+    def fake_int(a, ):
+      with lock_call_count:
+        mock_call_recorder(a)
+      return int(a)
+
+    results = utils.concurrent_exec(fake_int, [
+      (1, ),
+      ('not_int1', ),
+      ('not_int2', ),
+      (5435, ),
+    ])
+
+    self.assertEqual(mock_call_recorder.call_count, 4)
+    mock_call_recorder.assert_has_calls([
+      mock.call(1),
+      mock.call('not_int1'),
+      mock.call('not_int2'),
+      mock.call(5435),
+    ],
+                      any_order=True)
+
+  def test_concurrent_exec_when_multiple_exceptions_generates_results(self):
+    mock_call_recorder = mock.MagicMock()
+    lock_call_count = threading.Lock()
+
+    def fake_int(a, ):
+      with lock_call_count:
+        mock_call_recorder(a)
+      return int(a)
+
+    results = utils.concurrent_exec(fake_int, [
+      (1, ),
+      ('not_int1', ),
+      ('not_int2', ),
+      (5435, ),
+    ])
+
+    self.assertEqual(len(results), 4)
+    self.assertIn(1, results)
+    self.assertIn(5435, results)
+    exceptions = [
+      result for result in results if isinstance(result, Exception)
+    ]
+    self.assertEqual(len(exceptions), 2)
+    self.assertIsInstance(exceptions[0], ValueError)
+    self.assertIsInstance(exceptions[1], ValueError)
+    self.assertNotEqual(exceptions[0], exceptions[1])
+
+  def test_concurrent_exec_when_raising_exception_generates_results(self):
+    def adder(a, b):
+      return a + b
+
+    results = utils.concurrent_exec(adder, [(1, 1), (2, 2)],
+                    raise_on_exception=True)
+    self.assertEqual(len(results), 2)
+    self.assertIn(2, results)
+    self.assertIn(4, results)
+
+  def test_concurrent_exec_when_raising_exception_makes_all_calls(self):
+    mock_call_recorder = mock.MagicMock()
+    lock_call_count = threading.Lock()
+
+    def fake_int(a, ):
+      with lock_call_count:
+        mock_call_recorder(a)
+      return int(a)
+
+    with self.assertRaisesRegex(RuntimeError, '.*not_int.*'):
+      _ = utils.concurrent_exec(fake_int, [
+        (1, ),
+        ('123', ),
+        ('not_int', ),
+        (5435, ),
+      ],
+                    raise_on_exception=True)
+
+    self.assertEqual(mock_call_recorder.call_count, 4)
+    mock_call_recorder.assert_has_calls([
+      mock.call(1),
+      mock.call('123'),
+      mock.call('not_int'),
+      mock.call(5435),
+    ],
+                      any_order=True)
+
+  def test_concurrent_exec_when_raising_multiple_exceptions_makes_all_calls(
+      self):
+    mock_call_recorder = mock.MagicMock()
+    lock_call_count = threading.Lock()
+
+    def fake_int(a, ):
+      with lock_call_count:
+        mock_call_recorder(a)
+      return int(a)
+
+    with self.assertRaisesRegex(
+        RuntimeError,
+        r'(?m).*(not_int1(.|\s)+not_int2|not_int2(.|\s)+not_int1).*'):
+      _ = utils.concurrent_exec(fake_int, [
+        (1, ),
+        ('not_int1', ),
+        ('not_int2', ),
+        (5435, ),
+      ],
+                    raise_on_exception=True)
+
+    self.assertEqual(mock_call_recorder.call_count, 4)
+    mock_call_recorder.assert_has_calls([
+      mock.call(1),
+      mock.call('not_int1'),
+      mock.call('not_int2'),
+      mock.call(5435),
+    ],
+                      any_order=True)
+
+  def test_create_dir(self):
+    new_path = os.path.join(self.tmp_dir, 'haha')
+    self.assertFalse(os.path.exists(new_path))
+    utils.create_dir(new_path)
+    self.assertTrue(os.path.exists(new_path))
+
+  def test_create_dir_already_exists(self):
+    self.assertTrue(os.path.exists(self.tmp_dir))
+    utils.create_dir(self.tmp_dir)
+    self.assertTrue(os.path.exists(self.tmp_dir))
+
+  @mock.patch(
+    'mobly.controllers.android_device_lib.adb.list_occupied_adb_ports')
+  @mock.patch('portpicker.PickUnusedPort', return_value=MOCK_AVAILABLE_PORT)
+  def test_get_available_port_positive(self, mock_list_occupied_adb_ports,
+                     mock_pick_unused_port):
+    self.assertEqual(utils.get_available_host_port(), MOCK_AVAILABLE_PORT)
+
+  @mock.patch(
+    'mobly.controllers.android_device_lib.adb.list_occupied_adb_ports',
+    return_value=[MOCK_AVAILABLE_PORT])
+  @mock.patch('portpicker.PickUnusedPort', return_value=MOCK_AVAILABLE_PORT)
+  def test_get_available_port_negative(self, mock_list_occupied_adb_ports,
+                     mock_pick_unused_port):
+    with self.assertRaisesRegex(utils.Error, 'Failed to find.* retries'):
+      utils.get_available_host_port()
+
+  @mock.patch(
+    'mobly.controllers.android_device_lib.adb.list_occupied_adb_ports')
+  def test_get_available_port_returns_free_port(
+      self, mock_list_occupied_adb_ports):
+    """Verifies logic to pick a free port on the host.
+
+    Test checks we can bind to either an ipv4 or ipv6 socket on the port
+    returned by get_available_host_port.
     """
-    def setUp(self):
-        system = platform.system()
-        self.tmp_dir = tempfile.mkdtemp()
+    port = utils.get_available_host_port()
+    got_socket = False
+    for family in (socket.AF_INET, socket.AF_INET6):
+      try:
+        s = socket.socket(family, socket.SOCK_STREAM)
+        got_socket = True
+        break
+      except socket.error:
+        continue
+    self.assertTrue(got_socket)
+    s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
+    try:
+      s.bind(('localhost', port))
+    finally:
+      s.close()
 
-    def tearDown(self):
-        shutil.rmtree(self.tmp_dir)
+  def test_load_file_to_base64_str_reads_bytes_file_as_base64_string(self):
+    tmp_file_path = os.path.join(self.tmp_dir, 'b64.bin')
+    expected_base64_encoding = u'SGVsbG93IHdvcmxkIQ=='
+    with io.open(tmp_file_path, 'wb') as f:
+      f.write(b'Hellow world!')
+    self.assertEqual(utils.load_file_to_base64_str(tmp_file_path),
+             expected_base64_encoding)
 
-    def sleep_cmd(self, wait_secs):
-        if platform.system() == 'Windows':
-            python_code = ['import time', 'time.sleep(%s)' % wait_secs]
-            return ['python', '-c', 'exec("%s")' % r'\r\n'.join(python_code)]
-        else:
-            return ['sleep', str(wait_secs)]
+  def test_load_file_to_base64_str_reads_text_file_as_base64_string(self):
+    tmp_file_path = os.path.join(self.tmp_dir, 'b64.bin')
+    expected_base64_encoding = u'SGVsbG93IHdvcmxkIQ=='
+    with io.open(tmp_file_path, 'w', encoding='utf-8') as f:
+      f.write(u'Hellow world!')
+    self.assertEqual(utils.load_file_to_base64_str(tmp_file_path),
+             expected_base64_encoding)
 
-    def test_run_command(self):
-        (ret, out, err) = utils.run_command(self.sleep_cmd(0.01))
-        self.assertEqual(ret, 0)
+  def test_load_file_to_base64_str_reads_unicode_file_as_base64_string(self):
+    tmp_file_path = os.path.join(self.tmp_dir, 'b64.bin')
+    expected_base64_encoding = u'6YCa'
+    with io.open(tmp_file_path, 'w', encoding='utf-8') as f:
+      f.write(u'\u901a')
+    self.assertEqual(utils.load_file_to_base64_str(tmp_file_path),
+             expected_base64_encoding)
 
-    def test_run_command_with_timeout(self):
-        (ret, out, err) = utils.run_command(self.sleep_cmd(0.01), timeout=4)
-        self.assertEqual(ret, 0)
+  def test_cli_cmd_to_string(self):
+    cmd = ['"adb"', 'a b', 'c//']
+    self.assertEqual(utils.cli_cmd_to_string(cmd), '\'"adb"\' \'a b\' c//')
+    cmd = 'adb -s meme do something ab_cd'
+    self.assertEqual(utils.cli_cmd_to_string(cmd), cmd)
 
-    def test_run_command_with_timeout_expired(self):
-        with self.assertRaises(psutil.TimeoutExpired):
-            _ = utils.run_command(self.sleep_cmd(4), timeout=0.01)
+  def test_get_settable_properties(self):
+    class SomeClass(object):
+      regular_attr = 'regular_attr'
+      _foo = 'foo'
+      _bar = 'bar'
 
-    @mock.patch('threading.Timer')
-    @mock.patch('psutil.Popen')
-    def test_run_command_with_default_params(self, mock_Popen, mock_Timer):
-        mock_command = mock.MagicMock(spec=dict)
-        mock_proc = mock_Popen.return_value
-        mock_proc.communicate.return_value = ('fake_out', 'fake_err')
-        mock_proc.returncode = 0
-        out = utils.run_command(mock_command)
-        self.assertEqual(out, (0, 'fake_out', 'fake_err'))
-        mock_Popen.assert_called_with(
-            mock_command,
-            stdout=subprocess.PIPE,
-            stderr=subprocess.PIPE,
-            shell=False,
-            cwd=None,
-            env=None,
-        )
-        mock_Timer.assert_not_called()
+      @property
+      def settable_prop(self):
+        return self._foo
 
-    @mock.patch('threading.Timer')
-    @mock.patch('psutil.Popen')
-    def test_run_command_with_custom_params(self, mock_Popen, mock_Timer):
-        mock_command = mock.MagicMock(spec=dict)
-        mock_stdout = mock.MagicMock(spec=int)
-        mock_stderr = mock.MagicMock(spec=int)
-        mock_shell = mock.MagicMock(spec=bool)
-        mock_timeout = 1234
-        mock_env = mock.MagicMock(spec=dict)
-        mock_proc = mock_Popen.return_value
-        mock_proc.communicate.return_value = ('fake_out', 'fake_err')
-        mock_proc.returncode = 127
-        out = utils.run_command(mock_command,
-                                stdout=mock_stdout,
-                                stderr=mock_stderr,
-                                shell=mock_shell,
-                                timeout=mock_timeout,
-                                env=mock_env)
-        self.assertEqual(out, (127, 'fake_out', 'fake_err'))
-        mock_Popen.assert_called_with(
-            mock_command,
-            stdout=mock_stdout,
-            stderr=mock_stderr,
-            shell=mock_shell,
-            cwd=None,
-            env=mock_env,
-        )
-        mock_Timer.assert_called_with(1234, mock.ANY)
+      @settable_prop.setter
+      def settable_prop(self, new_foo):
+        self._foo = new_foo
 
-    def test_start_standing_subproc(self):
-        try:
-            p = utils.start_standing_subprocess(self.sleep_cmd(0.01))
-            p1 = psutil.Process(p.pid)
-            self.assertTrue(p1.is_running())
-        finally:
-            p.stdout.close()
-            p.stderr.close()
-            p.wait()
+      @property
+      def readonly_prop(self):
+        return self._bar
 
-    @mock.patch('subprocess.Popen')
-    def test_start_standing_subproc_without_env(self, mock_Popen):
-        p = utils.start_standing_subprocess(self.sleep_cmd(0.01))
-        mock_Popen.assert_called_with(
-            self.sleep_cmd(0.01),
-            stdin=subprocess.PIPE,
-            stdout=subprocess.PIPE,
-            stderr=subprocess.PIPE,
-            shell=False,
-            env=None,
-        )
+      def func(self):
+        """Func should not be considered as a settable prop."""
 
-    @mock.patch('subprocess.Popen')
-    def test_start_standing_subproc_with_custom_env(self, mock_Popen):
-        mock_env = mock.MagicMock(spec=dict)
-        p = utils.start_standing_subprocess(self.sleep_cmd(0.01), env=mock_env)
-        mock_Popen.assert_called_with(
-            self.sleep_cmd(0.01),
-            stdin=subprocess.PIPE,
-            stdout=subprocess.PIPE,
-            stderr=subprocess.PIPE,
-            shell=False,
-            env=mock_env,
-        )
+    actual = utils.get_settable_properties(SomeClass)
+    self.assertEqual(actual, ['settable_prop'])
 
-    def test_stop_standing_subproc(self):
-        p = utils.start_standing_subprocess(self.sleep_cmd(4))
-        p1 = psutil.Process(p.pid)
-        utils.stop_standing_subprocess(p)
-        self.assertFalse(p1.is_running())
+  def test_find_subclasses_in_module_when_one_subclass(self):
+    subclasses = utils.find_subclasses_in_module([base_test.BaseTestClass],
+                           integration_test)
+    self.assertEqual(len(subclasses), 1)
+    self.assertEqual(subclasses[0], integration_test.IntegrationTest)
 
-    def test_stop_standing_subproc_wihtout_pipe(self):
-        p = subprocess.Popen(self.sleep_cmd(4))
-        self.assertIsNone(p.stdout)
-        p1 = psutil.Process(p.pid)
-        utils.stop_standing_subprocess(p)
-        self.assertFalse(p1.is_running())
+  def test_find_subclasses_in_module_when_indirect_subclass(self):
+    subclasses = utils.find_subclasses_in_module([base_test.BaseTestClass],
+                           mock_instrumentation_test)
+    self.assertEqual(len(subclasses), 1)
+    self.assertEqual(subclasses[0],
+             mock_instrumentation_test.MockInstrumentationTest)
 
-    @unittest.skipIf(sys.version_info >= (3, 4) and sys.version_info < (3, 5),
-                     'Python 3.4 does not support `None` max_workers.')
-    def test_concurrent_exec_when_none_workers(self):
-        def adder(a, b):
-            return a + b
+  def test_find_subclasses_in_module_when_no_subclasses(self):
+    subclasses = utils.find_subclasses_in_module([base_test.BaseTestClass],
+                           mock_controller)
+    self.assertEqual(len(subclasses), 0)
 
-        with mock.patch.object(
-                futures, 'ThreadPoolExecutor',
-                wraps=futures.ThreadPoolExecutor) as thread_pool_spy:
-            results = utils.concurrent_exec(adder, [(1, 1), (2, 2)],
-                                            max_workers=None)
+  def test_find_subclasses_in_module_when_multiple_subclasses(self):
+    subclasses = utils.find_subclasses_in_module(
+      [base_test.BaseTestClass], multiple_subclasses_module)
+    self.assertEqual(len(subclasses), 2)
+    self.assertIn(multiple_subclasses_module.Subclass1Test, subclasses)
+    self.assertIn(multiple_subclasses_module.Subclass2Test, subclasses)
 
-        thread_pool_spy.assert_called_once_with(max_workers=None)
+  def test_find_subclasses_in_module_when_multiple_base_classes(self):
+    subclasses = utils.find_subclasses_in_module(
+      [base_test.BaseTestClass, test_runner.TestRunner],
+      multiple_subclasses_module)
+    self.assertEqual(len(subclasses), 4)
+    self.assertIn(multiple_subclasses_module.Subclass1Test, subclasses)
+    self.assertIn(multiple_subclasses_module.Subclass2Test, subclasses)
+    self.assertIn(multiple_subclasses_module.Subclass1Runner, subclasses)
+    self.assertIn(multiple_subclasses_module.Subclass2Runner, subclasses)
 
-        self.assertEqual(len(results), 2)
-        self.assertIn(2, results)
-        self.assertIn(4, results)
+  def test_find_subclasses_in_module_when_only_some_base_classes_present(
+      self):
+    subclasses = utils.find_subclasses_in_module(
+      [signals.TestSignal, test_runner.TestRunner],
+      multiple_subclasses_module)
+    self.assertEqual(len(subclasses), 2)
+    self.assertIn(multiple_subclasses_module.Subclass1Runner, subclasses)
+    self.assertIn(multiple_subclasses_module.Subclass2Runner, subclasses)
 
-    def test_concurrent_exec_when_default_max_workers(self):
-        def adder(a, b):
-            return a + b
+  def test_find_subclass_in_module_when_one_subclass(self):
+    subclass = utils.find_subclass_in_module(base_test.BaseTestClass,
+                         integration_test)
+    self.assertEqual(subclass, integration_test.IntegrationTest)
 
-        with mock.patch.object(
-                futures, 'ThreadPoolExecutor',
-                wraps=futures.ThreadPoolExecutor) as thread_pool_spy:
-            results = utils.concurrent_exec(adder, [(1, 1), (2, 2)])
+  def test_find_subclass_in_module_when_indirect_subclass(self):
+    subclass = utils.find_subclass_in_module(base_test.BaseTestClass,
+                         mock_instrumentation_test)
+    self.assertEqual(subclass,
+             mock_instrumentation_test.MockInstrumentationTest)
 
-        thread_pool_spy.assert_called_once_with(max_workers=30)
+  def test_find_subclass_in_module_when_no_subclasses(self):
+    with self.assertRaisesRegex(
+        ValueError,
+        '.*Expected 1 subclass of BaseTestClass per module, found'
+        r' \[\].*'):
+      _ = utils.find_subclass_in_module(base_test.BaseTestClass,
+                        mock_controller)
 
-        self.assertEqual(len(results), 2)
-        self.assertIn(2, results)
-        self.assertIn(4, results)
-
-    def test_concurrent_exec_when_custom_max_workers(self):
-        def adder(a, b):
-            return a + b
-
-        with mock.patch.object(
-                futures, 'ThreadPoolExecutor',
-                wraps=futures.ThreadPoolExecutor) as thread_pool_spy:
-            results = utils.concurrent_exec(adder, [(1, 1), (2, 2)],
-                                            max_workers=1)
-
-        thread_pool_spy.assert_called_once_with(max_workers=1)
-        self.assertEqual(len(results), 2)
-        self.assertIn(2, results)
-        self.assertIn(4, results)
-
-    def test_concurrent_exec_makes_all_calls(self):
-        mock_function = mock.MagicMock()
-        _ = utils.concurrent_exec(mock_function, [
-            (1, 1),
-            (2, 2),
-            (3, 3),
-        ])
-        self.assertEqual(mock_function.call_count, 3)
-        mock_function.assert_has_calls(
-            [mock.call(1, 1),
-             mock.call(2, 2),
-             mock.call(3, 3)],
-            any_order=True)
-
-    def test_concurrent_exec_generates_results(self):
-        def adder(a, b):
-            return a + b
-
-        results = utils.concurrent_exec(adder, [(1, 1), (2, 2)])
-        self.assertEqual(len(results), 2)
-        self.assertIn(2, results)
-        self.assertIn(4, results)
-
-    def test_concurrent_exec_when_exception_makes_all_calls(self):
-        mock_call_recorder = mock.MagicMock()
-        lock_call_count = threading.Lock()
-
-        def fake_int(a, ):
-            with lock_call_count:
-                mock_call_recorder(a)
-            return int(a)
-
-        results = utils.concurrent_exec(fake_int, [
-            (1, ),
-            ('123', ),
-            ('not_int', ),
-            (5435, ),
-        ])
-
-        self.assertEqual(mock_call_recorder.call_count, 4)
-        mock_call_recorder.assert_has_calls([
-            mock.call(1),
-            mock.call('123'),
-            mock.call('not_int'),
-            mock.call(5435),
-        ],
-                                            any_order=True)
-
-    def test_concurrent_exec_when_exception_generates_results(self):
-        mock_call_recorder = mock.MagicMock()
-        lock_call_count = threading.Lock()
-
-        def fake_int(a, ):
-            with lock_call_count:
-                mock_call_recorder(a)
-            return int(a)
-
-        results = utils.concurrent_exec(fake_int, [
-            (1, ),
-            ('123', ),
-            ('not_int', ),
-            (5435, ),
-        ])
-
-        self.assertEqual(len(results), 4)
-        self.assertIn(1, results)
-        self.assertIn(123, results)
-        self.assertIn(5435, results)
-        exceptions = [
-            result for result in results if isinstance(result, Exception)
-        ]
-        self.assertEqual(len(exceptions), 1)
-        self.assertIsInstance(exceptions[0], ValueError)
-
-    def test_concurrent_exec_when_multiple_exceptions_makes_all_calls(self):
-        mock_call_recorder = mock.MagicMock()
-        lock_call_count = threading.Lock()
-
-        def fake_int(a, ):
-            with lock_call_count:
-                mock_call_recorder(a)
-            return int(a)
-
-        results = utils.concurrent_exec(fake_int, [
-            (1, ),
-            ('not_int1', ),
-            ('not_int2', ),
-            (5435, ),
-        ])
-
-        self.assertEqual(mock_call_recorder.call_count, 4)
-        mock_call_recorder.assert_has_calls([
-            mock.call(1),
-            mock.call('not_int1'),
-            mock.call('not_int2'),
-            mock.call(5435),
-        ],
-                                            any_order=True)
-
-    def test_concurrent_exec_when_multiple_exceptions_generates_results(self):
-        mock_call_recorder = mock.MagicMock()
-        lock_call_count = threading.Lock()
-
-        def fake_int(a, ):
-            with lock_call_count:
-                mock_call_recorder(a)
-            return int(a)
-
-        results = utils.concurrent_exec(fake_int, [
-            (1, ),
-            ('not_int1', ),
-            ('not_int2', ),
-            (5435, ),
-        ])
-
-        self.assertEqual(len(results), 4)
-        self.assertIn(1, results)
-        self.assertIn(5435, results)
-        exceptions = [
-            result for result in results if isinstance(result, Exception)
-        ]
-        self.assertEqual(len(exceptions), 2)
-        self.assertIsInstance(exceptions[0], ValueError)
-        self.assertIsInstance(exceptions[1], ValueError)
-        self.assertNotEqual(exceptions[0], exceptions[1])
-
-    def test_concurrent_exec_when_raising_exception_generates_results(self):
-        def adder(a, b):
-            return a + b
-
-        results = utils.concurrent_exec(adder, [(1, 1), (2, 2)],
-                                        raise_on_exception=True)
-        self.assertEqual(len(results), 2)
-        self.assertIn(2, results)
-        self.assertIn(4, results)
-
-    def test_concurrent_exec_when_raising_exception_makes_all_calls(self):
-        mock_call_recorder = mock.MagicMock()
-        lock_call_count = threading.Lock()
-
-        def fake_int(a, ):
-            with lock_call_count:
-                mock_call_recorder(a)
-            return int(a)
-
-        with self.assertRaisesRegex(RuntimeError, '.*not_int.*'):
-            _ = utils.concurrent_exec(fake_int, [
-                (1, ),
-                ('123', ),
-                ('not_int', ),
-                (5435, ),
-            ],
-                                      raise_on_exception=True)
-
-        self.assertEqual(mock_call_recorder.call_count, 4)
-        mock_call_recorder.assert_has_calls([
-            mock.call(1),
-            mock.call('123'),
-            mock.call('not_int'),
-            mock.call(5435),
-        ],
-                                            any_order=True)
-
-    def test_concurrent_exec_when_raising_multiple_exceptions_makes_all_calls(
-            self):
-        mock_call_recorder = mock.MagicMock()
-        lock_call_count = threading.Lock()
-
-        def fake_int(a, ):
-            with lock_call_count:
-                mock_call_recorder(a)
-            return int(a)
-
-        with self.assertRaisesRegex(
-                RuntimeError,
-                r'(?m).*(not_int1(.|\s)+not_int2|not_int2(.|\s)+not_int1).*'):
-            _ = utils.concurrent_exec(fake_int, [
-                (1, ),
-                ('not_int1', ),
-                ('not_int2', ),
-                (5435, ),
-            ],
-                                      raise_on_exception=True)
-
-        self.assertEqual(mock_call_recorder.call_count, 4)
-        mock_call_recorder.assert_has_calls([
-            mock.call(1),
-            mock.call('not_int1'),
-            mock.call('not_int2'),
-            mock.call(5435),
-        ],
-                                            any_order=True)
-
-    def test_create_dir(self):
-        new_path = os.path.join(self.tmp_dir, 'haha')
-        self.assertFalse(os.path.exists(new_path))
-        utils.create_dir(new_path)
-        self.assertTrue(os.path.exists(new_path))
-
-    def test_create_dir_already_exists(self):
-        self.assertTrue(os.path.exists(self.tmp_dir))
-        utils.create_dir(self.tmp_dir)
-        self.assertTrue(os.path.exists(self.tmp_dir))
-
-    @mock.patch(
-        'mobly.controllers.android_device_lib.adb.list_occupied_adb_ports')
-    @mock.patch('portpicker.PickUnusedPort', return_value=MOCK_AVAILABLE_PORT)
-    def test_get_available_port_positive(self, mock_list_occupied_adb_ports,
-                                         mock_pick_unused_port):
-        self.assertEqual(utils.get_available_host_port(), MOCK_AVAILABLE_PORT)
-
-    @mock.patch(
-        'mobly.controllers.android_device_lib.adb.list_occupied_adb_ports',
-        return_value=[MOCK_AVAILABLE_PORT])
-    @mock.patch('portpicker.PickUnusedPort', return_value=MOCK_AVAILABLE_PORT)
-    def test_get_available_port_negative(self, mock_list_occupied_adb_ports,
-                                         mock_pick_unused_port):
-        with self.assertRaisesRegex(utils.Error, 'Failed to find.* retries'):
-            utils.get_available_host_port()
-
-    @mock.patch(
-        'mobly.controllers.android_device_lib.adb.list_occupied_adb_ports')
-    def test_get_available_port_returns_free_port(
-            self, mock_list_occupied_adb_ports):
-        """Verifies logic to pick a free port on the host.
-
-        Test checks we can bind to either an ipv4 or ipv6 socket on the port
-        returned by get_available_host_port.
-        """
-        port = utils.get_available_host_port()
-        got_socket = False
-        for family in (socket.AF_INET, socket.AF_INET6):
-            try:
-                s = socket.socket(family, socket.SOCK_STREAM)
-                got_socket = True
-                break
-            except socket.error:
-                continue
-        self.assertTrue(got_socket)
-        s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
-        try:
-            s.bind(('localhost', port))
-        finally:
-            s.close()
-
-    def test_load_file_to_base64_str_reads_bytes_file_as_base64_string(self):
-        tmp_file_path = os.path.join(self.tmp_dir, 'b64.bin')
-        expected_base64_encoding = u'SGVsbG93IHdvcmxkIQ=='
-        with io.open(tmp_file_path, 'wb') as f:
-            f.write(b'Hellow world!')
-        self.assertEqual(utils.load_file_to_base64_str(tmp_file_path),
-                         expected_base64_encoding)
-
-    def test_load_file_to_base64_str_reads_text_file_as_base64_string(self):
-        tmp_file_path = os.path.join(self.tmp_dir, 'b64.bin')
-        expected_base64_encoding = u'SGVsbG93IHdvcmxkIQ=='
-        with io.open(tmp_file_path, 'w', encoding='utf-8') as f:
-            f.write(u'Hellow world!')
-        self.assertEqual(utils.load_file_to_base64_str(tmp_file_path),
-                         expected_base64_encoding)
-
-    def test_load_file_to_base64_str_reads_unicode_file_as_base64_string(self):
-        tmp_file_path = os.path.join(self.tmp_dir, 'b64.bin')
-        expected_base64_encoding = u'6YCa'
-        with io.open(tmp_file_path, 'w', encoding='utf-8') as f:
-            f.write(u'\u901a')
-        self.assertEqual(utils.load_file_to_base64_str(tmp_file_path),
-                         expected_base64_encoding)
-
-    def test_cli_cmd_to_string(self):
-        cmd = ['"adb"', 'a b', 'c//']
-        self.assertEqual(utils.cli_cmd_to_string(cmd), '\'"adb"\' \'a b\' c//')
-        cmd = 'adb -s meme do something ab_cd'
-        self.assertEqual(utils.cli_cmd_to_string(cmd), cmd)
-
-    def test_get_settable_properties(self):
-        class SomeClass(object):
-            regular_attr = 'regular_attr'
-            _foo = 'foo'
-            _bar = 'bar'
-
-            @property
-            def settable_prop(self):
-                return self._foo
-
-            @settable_prop.setter
-            def settable_prop(self, new_foo):
-                self._foo = new_foo
-
-            @property
-            def readonly_prop(self):
-                return self._bar
-
-            def func(self):
-                """Func should not be considered as a settable prop."""
-
-        actual = utils.get_settable_properties(SomeClass)
-        self.assertEqual(actual, ['settable_prop'])
-
-    def test_find_subclasses_in_module_when_one_subclass(self):
-        subclasses = utils.find_subclasses_in_module([base_test.BaseTestClass],
-                                                     integration_test)
-        self.assertEqual(len(subclasses), 1)
-        self.assertEqual(subclasses[0], integration_test.IntegrationTest)
-
-    def test_find_subclasses_in_module_when_indirect_subclass(self):
-        subclasses = utils.find_subclasses_in_module([base_test.BaseTestClass],
-                                                     mock_instrumentation_test)
-        self.assertEqual(len(subclasses), 1)
-        self.assertEqual(subclasses[0],
-                         mock_instrumentation_test.MockInstrumentationTest)
-
-    def test_find_subclasses_in_module_when_no_subclasses(self):
-        subclasses = utils.find_subclasses_in_module([base_test.BaseTestClass],
-                                                     mock_controller)
-        self.assertEqual(len(subclasses), 0)
-
-    def test_find_subclasses_in_module_when_multiple_subclasses(self):
-        subclasses = utils.find_subclasses_in_module(
-            [base_test.BaseTestClass], multiple_subclasses_module)
-        self.assertEqual(len(subclasses), 2)
-        self.assertIn(multiple_subclasses_module.Subclass1Test, subclasses)
-        self.assertIn(multiple_subclasses_module.Subclass2Test, subclasses)
-
-    def test_find_subclasses_in_module_when_multiple_base_classes(self):
-        subclasses = utils.find_subclasses_in_module(
-            [base_test.BaseTestClass, test_runner.TestRunner],
-            multiple_subclasses_module)
-        self.assertEqual(len(subclasses), 4)
-        self.assertIn(multiple_subclasses_module.Subclass1Test, subclasses)
-        self.assertIn(multiple_subclasses_module.Subclass2Test, subclasses)
-        self.assertIn(multiple_subclasses_module.Subclass1Runner, subclasses)
-        self.assertIn(multiple_subclasses_module.Subclass2Runner, subclasses)
-
-    def test_find_subclasses_in_module_when_only_some_base_classes_present(
-            self):
-        subclasses = utils.find_subclasses_in_module(
-            [signals.TestSignal, test_runner.TestRunner],
-            multiple_subclasses_module)
-        self.assertEqual(len(subclasses), 2)
-        self.assertIn(multiple_subclasses_module.Subclass1Runner, subclasses)
-        self.assertIn(multiple_subclasses_module.Subclass2Runner, subclasses)
-
-    def test_find_subclass_in_module_when_one_subclass(self):
-        subclass = utils.find_subclass_in_module(base_test.BaseTestClass,
-                                                 integration_test)
-        self.assertEqual(subclass, integration_test.IntegrationTest)
-
-    def test_find_subclass_in_module_when_indirect_subclass(self):
-        subclass = utils.find_subclass_in_module(base_test.BaseTestClass,
-                                                 mock_instrumentation_test)
-        self.assertEqual(subclass,
-                         mock_instrumentation_test.MockInstrumentationTest)
-
-    def test_find_subclass_in_module_when_no_subclasses(self):
-        with self.assertRaisesRegex(
-                ValueError,
-                '.*Expected 1 subclass of BaseTestClass per module, found'
-                r' \[\].*'):
-            _ = utils.find_subclass_in_module(base_test.BaseTestClass,
-                                              mock_controller)
-
-    def test_find_subclass_in_module_when_multiple_subclasses(self):
-        with self.assertRaisesRegex(
-                ValueError,
-                '.*Expected 1 subclass of BaseTestClass per module, found'
-                r' \[(\'Subclass1Test\', \'Subclass2Test\''
-                r'|\'Subclass2Test\', \'Subclass1Test\')\].*'):
-            _ = utils.find_subclass_in_module(base_test.BaseTestClass,
-                                              multiple_subclasses_module)
+  def test_find_subclass_in_module_when_multiple_subclasses(self):
+    with self.assertRaisesRegex(
+        ValueError,
+        '.*Expected 1 subclass of BaseTestClass per module, found'
+        r' \[(\'Subclass1Test\', \'Subclass2Test\''
+        r'|\'Subclass2Test\', \'Subclass1Test\')\].*'):
+      _ = utils.find_subclass_in_module(base_test.BaseTestClass,
+                        multiple_subclasses_module)
 
 
 if __name__ == '__main__':
-    unittest.main()
+  unittest.main()
