diff --git a/mobly/asserts.py b/mobly/asserts.py
index 8716f93..05f99de 100644
--- a/mobly/asserts.py
+++ b/mobly/asserts.py
@@ -99,8 +99,9 @@
         extras: An optional field for extra information to be included in
             test result.
     """
-    context = _AssertRaisesContext(
-        expected_exception, expected_regex, extras=extras)
+    context = _AssertRaisesContext(expected_exception,
+                                   expected_regex,
+                                   extras=extras)
     return context
 
 
@@ -278,8 +279,8 @@
                 exc_name = self.expected.__name__
             except AttributeError:
                 exc_name = str(self.expected)
-            raise signals.TestFailure(
-                '%s not raised' % exc_name, extras=self.extras)
+            raise signals.TestFailure('%s not raised' % exc_name,
+                                      extras=self.extras)
         if not issubclass(exc_type, self.expected):
             # let unexpected exceptions pass through
             return False
@@ -292,7 +293,7 @@
             expected_regexp = re.compile(expected_regexp)
         if not expected_regexp.search(str(exc_value)):
             raise signals.TestFailure(
-                '"%s" does not match "%s"' % (expected_regexp.pattern,
-                                              str(exc_value)),
+                '"%s" does not match "%s"' %
+                (expected_regexp.pattern, str(exc_value)),
                 extras=self.extras)
         return True
diff --git a/mobly/base_instrumentation_test.py b/mobly/base_instrumentation_test.py
index efbc993..f8443dd 100644
--- a/mobly/base_instrumentation_test.py
+++ b/mobly/base_instrumentation_test.py
@@ -958,11 +958,10 @@
             instrumentation_block[0] = self._parse_line(
                 instrumentation_block[0], line)
 
-        device.adb.instrument(
-            package=package,
-            options=options,
-            runner=runner,
-            handler=parse_instrumentation)
+        device.adb.instrument(package=package,
+                              options=options,
+                              runner=runner,
+                              handler=parse_instrumentation)
 
         return self._finish_parsing(instrumentation_block[0])
 
diff --git a/mobly/config_parser.py b/mobly/config_parser.py
index d26f34b..afb2449 100644
--- a/mobly/config_parser.py
+++ b/mobly/config_parser.py
@@ -39,8 +39,8 @@
     """
     required_key = keys.Config.key_testbed.value
     if required_key not in test_config:
-        raise MoblyConfigError(
-            'Required key %s missing in test config.' % required_key)
+        raise MoblyConfigError('Required key %s missing in test config.' %
+                               required_key)
 
 
 def _validate_testbed_name(name):
@@ -111,8 +111,8 @@
         if len(tbs) != len(tb_filters):
             raise MoblyConfigError(
                 'Expect to find %d test bed configs, found %d. Check if'
-                ' you have the correct test bed names.' % (len(tb_filters),
-                                                           len(tbs)))
+                ' you have the correct test bed names.' %
+                (len(tb_filters), len(tbs)))
         configs[keys.Config.key_testbed.value] = tbs
     mobly_params = configs.get(keys.Config.key_mobly_params.value, {})
     # Decide log path.
diff --git a/mobly/controller_manager.py b/mobly/controller_manager.py
index e03222c..acba8db 100644
--- a/mobly/controller_manager.py
+++ b/mobly/controller_manager.py
@@ -153,8 +153,8 @@
         # logging them.
         for name, module in self._controller_modules.items():
             logging.debug('Destroying %s.', name)
-            with expects.expect_no_raises(
-                    'Exception occurred destroying %s.' % name):
+            with expects.expect_no_raises('Exception occurred destroying %s.' %
+                                          name):
                 module.destroy(self._controller_objects[name])
         self._controller_objects = collections.OrderedDict()
         self._controller_modules = {}
@@ -178,15 +178,17 @@
             controller_info = module.get_info(
                 copy.copy(self._controller_objects[controller_module_name]))
         except AttributeError:
-            logging.warning('No optional debug info found for controller '
-                            '%s. To provide it, implement `get_info`.',
-                            controller_module_name)
+            logging.warning(
+                'No optional debug info found for controller '
+                '%s. To provide it, implement `get_info`.',
+                controller_module_name)
         try:
             yaml.dump(controller_info)
         except TypeError:
-            logging.warning('The info of controller %s in class "%s" is not '
-                            'YAML serializable! Coercing it to string.',
-                            controller_module_name, self._class_name)
+            logging.warning(
+                'The info of controller %s in class "%s" is not '
+                'YAML serializable! Coercing it to string.',
+                controller_module_name, self._class_name)
             controller_info = str(controller_info)
         return records.ControllerInfoRecord(
             self._class_name, module.MOBLY_CONTROLLER_CONFIG_NAME,
diff --git a/mobly/controllers/__init__.py b/mobly/controllers/__init__.py
index 2fe4434..58e0d91 100644
--- a/mobly/controllers/__init__.py
+++ b/mobly/controllers/__init__.py
@@ -1,11 +1,11 @@
 # Copyright 2016 Google Inc.
-# 
+#
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
 # You may obtain a copy of the License at
-# 
+#
 #     http://www.apache.org/licenses/LICENSE-2.0
-# 
+#
 # Unless required by applicable law or agreed to in writing, software
 # distributed under the License is distributed on an "AS IS" BASIS,
 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
diff --git a/mobly/controllers/android_device.py b/mobly/controllers/android_device.py
index a9dfe98..e26842a 100644
--- a/mobly/controllers/android_device.py
+++ b/mobly/controllers/android_device.py
@@ -107,8 +107,9 @@
 
     for ad in ads:
         if ad.serial not in valid_ad_identifiers:
-            raise DeviceError(ad, 'Android device is specified in config but'
-                              ' is not attached.')
+            raise DeviceError(
+                ad, 'Android device is specified in config but is not '
+                'attached.')
     _start_services_on_ads(ads)
     return ads
 
@@ -153,8 +154,9 @@
         start_logcat = not getattr(ad, KEY_SKIP_LOGCAT,
                                    DEFAULT_VALUE_SKIP_LOGCAT)
         try:
-            ad.services.register(
-                SERVICE_NAME_LOGCAT, logcat.Logcat, start_service=start_logcat)
+            ad.services.register(SERVICE_NAME_LOGCAT,
+                                 logcat.Logcat,
+                                 start_service=start_logcat)
         except Exception:
             is_required = getattr(ad, KEY_DEVICE_REQUIRED,
                                   DEFAULT_VALUE_DEVICE_REQUIRED)
@@ -406,10 +408,9 @@
     begin_time = mobly_logger.normalize_log_line_timestamp(str(begin_time))
 
     def take_br(test_name, begin_time, ad, destination):
-        ad.take_bug_report(
-            test_name=test_name,
-            begin_time=begin_time,
-            destination=destination)
+        ad.take_bug_report(test_name=test_name,
+                           begin_time=begin_time,
+                           destination=destination)
 
     args = [(test_name, begin_time, ad, destination) for ad in ads]
     utils.concurrent_exec(take_br, args)
@@ -449,9 +450,8 @@
         self._log_path = os.path.join(
             self._log_path_base, 'AndroidDevice%s' % self._normalized_serial)
         self._debug_tag = self._serial
-        self.log = AndroidDeviceLoggerAdapter(logging.getLogger(), {
-            'tag': self.debug_tag
-        })
+        self.log = AndroidDeviceLoggerAdapter(logging.getLogger(),
+                                              {'tag': self.debug_tag})
         self._build_info = None
         self._is_rebooting = False
         self.adb = adb.AdbProxy(serial)
@@ -933,8 +933,9 @@
         else:
             # shell=True as this command redirects the stdout to a local file
             # using shell redirection.
-            self.adb.bugreport(
-                ' > "%s"' % full_out_path, shell=True, timeout=timeout)
+            self.adb.bugreport(' > "%s"' % full_out_path,
+                               shell=True,
+                               timeout=timeout)
         self.log.info('Bugreport for %s taken at %s.', test_name,
                       full_out_path)
         return full_out_path
diff --git a/mobly/controllers/android_device_lib/__init__.py b/mobly/controllers/android_device_lib/__init__.py
index 2fe4434..58e0d91 100644
--- a/mobly/controllers/android_device_lib/__init__.py
+++ b/mobly/controllers/android_device_lib/__init__.py
@@ -1,11 +1,11 @@
 # Copyright 2016 Google Inc.
-# 
+#
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
 # You may obtain a copy of the License at
-# 
+#
 #     http://www.apache.org/licenses/LICENSE-2.0
-# 
+#
 # Unless required by applicable law or agreed to in writing, software
 # distributed under the License is distributed on an "AS IS" BASIS,
 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
diff --git a/mobly/controllers/android_device_lib/adb.py b/mobly/controllers/android_device_lib/adb.py
index e6658fd..1b032a0 100644
--- a/mobly/controllers/android_device_lib/adb.py
+++ b/mobly/controllers/android_device_lib/adb.py
@@ -65,8 +65,8 @@
 
     def __str__(self):
         return ('Error executing adb cmd "%s". ret: %d, stdout: %s, stderr: %s'
-                ) % (utils.cli_cmd_to_string(self.cmd), self.ret_code,
-                     self.stdout, self.stderr)
+                ) % (utils.cli_cmd_to_string(
+                    self.cmd), self.ret_code, self.stdout, self.stderr)
 
 
 class AdbTimeoutError(Error):
@@ -162,11 +162,13 @@
         if timeout and timeout <= 0:
             raise ValueError('Timeout is not a positive value: %s' % timeout)
         try:
-            (ret, out, err) = utils.run_command(
-                args, shell=shell, timeout=timeout)
+            (ret, out, err) = utils.run_command(args,
+                                                shell=shell,
+                                                timeout=timeout)
         except psutil.TimeoutExpired:
-            raise AdbTimeoutError(
-                cmd=args, timeout=timeout, serial=self.serial)
+            raise AdbTimeoutError(cmd=args,
+                                  timeout=timeout,
+                                  serial=self.serial)
 
         if stderr:
             stderr.write(err)
@@ -175,12 +177,11 @@
         if ret == 0:
             return out
         else:
-            raise AdbError(
-                cmd=args,
-                stdout=out,
-                stderr=err,
-                ret_code=ret,
-                serial=self.serial)
+            raise AdbError(cmd=args,
+                           stdout=out,
+                           stderr=err,
+                           ret_code=ret,
+                           serial=self.serial)
 
     def _execute_and_process_stdout(self, args, shell, handler):
         """Executes adb commands and processes the stdout with a handler.
@@ -198,12 +199,11 @@
         Raises:
             AdbError: The adb command exit code is not 0.
         """
-        proc = subprocess.Popen(
-            args,
-            stdout=subprocess.PIPE,
-            stderr=subprocess.PIPE,
-            shell=shell,
-            bufsize=1)
+        proc = subprocess.Popen(args,
+                                stdout=subprocess.PIPE,
+                                stderr=subprocess.PIPE,
+                                shell=shell,
+                                bufsize=1)
         out = '[elided, processed via handler]'
         try:
             # Even if the process dies, stdout.readline still works
@@ -270,14 +270,17 @@
 
     def _exec_adb_cmd(self, name, args, shell, timeout, stderr):
         adb_cmd = self._construct_adb_cmd(name, args, shell=shell)
-        out = self._exec_cmd(
-            adb_cmd, shell=shell, timeout=timeout, stderr=stderr)
+        out = self._exec_cmd(adb_cmd,
+                             shell=shell,
+                             timeout=timeout,
+                             stderr=stderr)
         return out
 
     def _execute_adb_and_process_stdout(self, name, args, shell, handler):
         adb_cmd = self._construct_adb_cmd(name, args, shell=shell)
-        out = self._execute_and_process_stdout(
-            adb_cmd, shell=shell, handler=handler)
+        out = self._execute_and_process_stdout(adb_cmd,
+                                               shell=shell,
+                                               handler=handler)
         return out
 
     def _parse_getprop_output(self, output):
@@ -341,8 +344,8 @@
             # The ADB getprop command can randomly return empty string, so try
             # multiple times. This value should always be non-empty if the device
             # in a working state.
-            raw_output = self.shell(
-                ['getprop'], timeout=DEFAULT_GETPROP_TIMEOUT_SEC)
+            raw_output = self.shell(['getprop'],
+                                    timeout=DEFAULT_GETPROP_TIMEOUT_SEC)
             properties = self._parse_getprop_output(raw_output)
             if properties:
                 for name in prop_names:
@@ -374,8 +377,11 @@
 
     def forward(self, args=None, shell=False):
         with ADB_PORT_LOCK:
-            return self._exec_adb_cmd(
-                'forward', args, shell, timeout=None, stderr=None)
+            return self._exec_adb_cmd('forward',
+                                      args,
+                                      shell,
+                                      timeout=None,
+                                      stderr=None)
 
     def instrument(self, package, options=None, runner=None, handler=None):
         """Runs an instrumentation command on the device.
@@ -424,12 +430,11 @@
                      instrumentation_command)
         if handler is None:
             # Flow kept for backwards-compatibility reasons
-            self._exec_adb_cmd(
-                'shell',
-                instrumentation_command,
-                shell=False,
-                timeout=None,
-                stderr=None)
+            self._exec_adb_cmd('shell',
+                               instrumentation_command,
+                               shell=False,
+                               timeout=None,
+                               stderr=None)
         else:
             return self._execute_adb_and_process_stdout(
                 'shell', instrumentation_command, shell=False, handler=handler)
@@ -451,7 +456,10 @@
             Returns:
                 The output of the adb command run if exit code is 0.
             """
-            return self._exec_adb_cmd(
-                name, args, shell=shell, timeout=timeout, stderr=stderr)
+            return self._exec_adb_cmd(name,
+                                      args,
+                                      shell=shell,
+                                      timeout=timeout,
+                                      stderr=stderr)
 
         return adb_call
diff --git a/mobly/controllers/android_device_lib/callback_handler.py b/mobly/controllers/android_device_lib/callback_handler.py
index 753f3da..868c8da 100644
--- a/mobly/controllers/android_device_lib/callback_handler.py
+++ b/mobly/controllers/android_device_lib/callback_handler.py
@@ -101,8 +101,8 @@
                 raise TimeoutError(
                     self._ad,
                     'Timed out after waiting %ss for event "%s" triggered by'
-                    ' %s (%s).' % (timeout, event_name, self._method_name,
-                                   self._id))
+                    ' %s (%s).' %
+                    (timeout, event_name, self._method_name, self._id))
             raise
         return snippet_event.from_dict(raw_event)
 
diff --git a/mobly/controllers/android_device_lib/event_dispatcher.py b/mobly/controllers/android_device_lib/event_dispatcher.py
index 3b91d0f..1785716 100644
--- a/mobly/controllers/android_device_lib/event_dispatcher.py
+++ b/mobly/controllers/android_device_lib/event_dispatcher.py
@@ -1,11 +1,11 @@
 # Copyright 2016 Google Inc.
-# 
+#
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
 # You may obtain a copy of the License at
-# 
+#
 #     http://www.apache.org/licenses/LICENSE-2.0
-# 
+#
 # Unless required by applicable law or agreed to in writing, software
 # distributed under the License is distributed on an "AS IS" BASIS,
 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -112,8 +112,8 @@
         self.lock.acquire()
         try:
             if event_name in self.handlers:
-                raise DuplicateError('A handler for {} already exists'.format(
-                    event_name))
+                raise DuplicateError(
+                    'A handler for {} already exists'.format(event_name))
             self.handlers[event_name] = (handler, args)
         finally:
             self.lock.release()
@@ -182,8 +182,8 @@
         e_queue = self.get_event_q(event_name)
 
         if not e_queue:
-            raise TypeError("Failed to get an event queue for {}".format(
-                event_name))
+            raise TypeError(
+                "Failed to get an event queue for {}".format(event_name))
 
         try:
             # Block for timeout
diff --git a/mobly/controllers/android_device_lib/fastboot.py b/mobly/controllers/android_device_lib/fastboot.py
index 8888633..d62870a 100644
--- a/mobly/controllers/android_device_lib/fastboot.py
+++ b/mobly/controllers/android_device_lib/fastboot.py
@@ -1,11 +1,11 @@
 # Copyright 2016 Google Inc.
-# 
+#
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
 # You may obtain a copy of the License at
-# 
+#
 #     http://www.apache.org/licenses/LICENSE-2.0
-# 
+#
 # Unless required by applicable law or agreed to in writing, software
 # distributed under the License is distributed on an "AS IS" BASIS,
 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
diff --git a/mobly/controllers/android_device_lib/service_manager.py b/mobly/controllers/android_device_lib/service_manager.py
index cc9c133..bb56e77 100644
--- a/mobly/controllers/android_device_lib/service_manager.py
+++ b/mobly/controllers/android_device_lib/service_manager.py
@@ -115,30 +115,30 @@
         """Starts all inactive service instances."""
         for alias, service in self._service_objects.items():
             if not service.is_alive:
-                with expects.expect_no_raises(
-                        'Failed to start service "%s".' % alias):
+                with expects.expect_no_raises('Failed to start service "%s".' %
+                                              alias):
                     service.start()
 
     def stop_all(self):
         """Stops all active service instances."""
         for alias, service in self._service_objects.items():
             if service.is_alive:
-                with expects.expect_no_raises(
-                        'Failed to stop service "%s".' % alias):
+                with expects.expect_no_raises('Failed to stop service "%s".' %
+                                              alias):
                     service.stop()
 
     def pause_all(self):
         """Pauses all service instances."""
         for alias, service in self._service_objects.items():
-            with expects.expect_no_raises(
-                    'Failed to pause service "%s".' % alias):
+            with expects.expect_no_raises('Failed to pause service "%s".' %
+                                          alias):
                 service.pause()
 
     def resume_all(self):
         """Resumes all service instances."""
         for alias, service in self._service_objects.items():
-            with expects.expect_no_raises(
-                    'Failed to resume service "%s".' % alias):
+            with expects.expect_no_raises('Failed to resume service "%s".' %
+                                          alias):
                 service.resume()
 
     def __getattr__(self, name):
diff --git a/mobly/controllers/android_device_lib/services/logcat.py b/mobly/controllers/android_device_lib/services/logcat.py
index b5730f0..f3d4238 100644
--- a/mobly/controllers/android_device_lib/services/logcat.py
+++ b/mobly/controllers/android_device_lib/services/logcat.py
@@ -157,8 +157,8 @@
         full_adblog_path = os.path.join(adb_excerpt_path, out_name)
         with io.open(full_adblog_path, 'w', encoding='utf-8') as out:
             in_file = self.adb_logcat_file_path
-            with io.open(
-                    in_file, 'r', encoding='utf-8', errors='replace') as f:
+            with io.open(in_file, 'r', encoding='utf-8',
+                         errors='replace') as f:
                 in_range = False
                 while True:
                     line = None
diff --git a/mobly/controllers/android_device_lib/services/sl4a_service.py b/mobly/controllers/android_device_lib/services/sl4a_service.py
index 66311a7..6560444 100644
--- a/mobly/controllers/android_device_lib/services/sl4a_service.py
+++ b/mobly/controllers/android_device_lib/services/sl4a_service.py
@@ -26,7 +26,7 @@
     """
 
     def __init__(self, device, configs=None):
-        del configs # Never used.
+        del configs  # Never used.
         self._ad = device
         self._sl4a_client = None
 
diff --git a/mobly/controllers/android_device_lib/sl4a_client.py b/mobly/controllers/android_device_lib/sl4a_client.py
index 9dd4331..7b168d9 100644
--- a/mobly/controllers/android_device_lib/sl4a_client.py
+++ b/mobly/controllers/android_device_lib/sl4a_client.py
@@ -59,8 +59,8 @@
         out = self._adb.shell('pm list package')
         if not utils.grep('com.googlecode.android_scripting', out):
             raise jsonrpc_client_base.AppStartError(
-                self._ad, '%s is not installed on %s' % (_APP_NAME,
-                                                         self._adb.serial))
+                self._ad,
+                '%s is not installed on %s' % (_APP_NAME, self._adb.serial))
         self.disable_hidden_api_blacklist()
 
         # sl4a has problems connecting after disconnection, so kill the apk and
@@ -145,10 +145,9 @@
                 started = True
                 break
             except:
-                self.log.debug(
-                    '%s is not yet running, retrying',
-                    self.app_name,
-                    exc_info=True)
+                self.log.debug('%s is not yet running, retrying',
+                               self.app_name,
+                               exc_info=True)
             time.sleep(1)
         if not started:
             raise jsonrpc_client_base.AppRestoreConnectionError(
@@ -161,8 +160,8 @@
         event_client = Sl4aClient(self._ad)
         event_client.host_port = self.host_port
         event_client.device_port = self.device_port
-        event_client.connect(
-            uid=self.uid, cmd=jsonrpc_client_base.JsonRpcCommand.CONTINUE)
+        event_client.connect(uid=self.uid,
+                             cmd=jsonrpc_client_base.JsonRpcCommand.CONTINUE)
         ed = event_dispatcher.EventDispatcher(event_client)
         ed.start()
         return ed
diff --git a/mobly/controllers/android_device_lib/snippet_client.py b/mobly/controllers/android_device_lib/snippet_client.py
index c33f373..cc6e74a 100644
--- a/mobly/controllers/android_device_lib/snippet_client.py
+++ b/mobly/controllers/android_device_lib/snippet_client.py
@@ -42,8 +42,8 @@
 _LAUNCH_CMD = ('%s am instrument -w -e action start %s/' +
                _INSTRUMENTATION_RUNNER_PACKAGE)
 
-_STOP_CMD = (
-    'am instrument -w -e action stop %s/' + _INSTRUMENTATION_RUNNER_PACKAGE)
+_STOP_CMD = ('am instrument -w -e action stop %s/' +
+             _INSTRUMENTATION_RUNNER_PACKAGE)
 
 # Test that uses UiAutomation requires the shell session to be maintained while
 # test is in progress. However, this requirement does not hold for the test that
@@ -180,7 +180,8 @@
 
         # Yaaay! We're done!
         self.log.debug('Snippet %s started after %.1fs on host port %s',
-                       self.package, time.time() - start_time, self.host_port)
+                       self.package,
+                       time.time() - start_time, self.host_port)
 
     def restore_app_connection(self, port=None):
         """Restores the app after device got reconnected.
@@ -210,8 +211,8 @@
             raise jsonrpc_client_base.AppRestoreConnectionError(
                 self._ad,
                 ('Failed to restore app connection for %s at host port %s, '
-                 'device port %s') % (self.package, self.host_port,
-                                      self.device_port))
+                 'device port %s') %
+                (self.package, self.host_port, self.device_port))
 
         # Because the previous connection was lost, update self._proc
         self._proc = None
@@ -265,9 +266,9 @@
                                         '%s is not installed.' % self.package)
         # Check that the app is instrumented.
         out = self._adb.shell('pm list instrumentation')
-        matched_out = utils.grep('^instrumentation:%s/%s' %
-                                 (self.package,
-                                  _INSTRUMENTATION_RUNNER_PACKAGE), out)
+        matched_out = utils.grep(
+            '^instrumentation:%s/%s' %
+            (self.package, _INSTRUMENTATION_RUNNER_PACKAGE), out)
         if not matched_out:
             raise AppStartPreCheckError(
                 self._ad,
diff --git a/mobly/controllers/android_device_lib/snippet_event.py b/mobly/controllers/android_device_lib/snippet_event.py
index 1ead83a..c717765 100644
--- a/mobly/controllers/android_device_lib/snippet_event.py
+++ b/mobly/controllers/android_device_lib/snippet_event.py
@@ -22,11 +22,10 @@
     Returns:
         A SnippetEvent object.
     """
-    return SnippetEvent(
-        callback_id=event_dict['callbackId'],
-        name=event_dict['name'],
-        creation_time=event_dict['time'],
-        data=event_dict['data'])
+    return SnippetEvent(callback_id=event_dict['callbackId'],
+                        name=event_dict['name'],
+                        creation_time=event_dict['time'],
+                        data=event_dict['data'])
 
 
 class SnippetEvent(object):
diff --git a/mobly/controllers/attenuator.py b/mobly/controllers/attenuator.py
index 6b51137..a8faee3 100644
--- a/mobly/controllers/attenuator.py
+++ b/mobly/controllers/attenuator.py
@@ -1,11 +1,11 @@
 # Copyright 2016 Google Inc.
-# 
+#
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
 # You may obtain a copy of the License at
-# 
+#
 #     http://www.apache.org/licenses/LICENSE-2.0
-# 
+#
 # Unless required by applicable law or agreed to in writing, software
 # distributed under the License is distributed on an "AS IS" BASIS,
 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
diff --git a/mobly/controllers/attenuator_lib/minicircuits.py b/mobly/controllers/attenuator_lib/minicircuits.py
index ab55a6c..84b946a 100644
--- a/mobly/controllers/attenuator_lib/minicircuits.py
+++ b/mobly/controllers/attenuator_lib/minicircuits.py
@@ -1,17 +1,16 @@
 # Copyright 2016 Google Inc.
-# 
+#
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
 # You may obtain a copy of the License at
-# 
+#
 #     http://www.apache.org/licenses/LICENSE-2.0
-# 
+#
 # Unless required by applicable law or agreed to in writing, software
 # distributed under the License is distributed on an "AS IS" BASIS,
 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 # See the License for the specific language governing permissions and
 # limitations under the License.
-
 """
 This module has the class for controlling Mini-Circuits RCDAT series
 attenuators over Telnet.
@@ -30,6 +29,7 @@
     Attributes:
         path_count: The number of signal attenuation path this device has.
     """
+
     def __init__(self, path_count=1):
         self.path_count = path_count
         # The telnet client used to communicate with the attenuator device.
diff --git a/mobly/controllers/attenuator_lib/telnet_scpi_client.py b/mobly/controllers/attenuator_lib/telnet_scpi_client.py
index cb3243a..9fddb0c 100644
--- a/mobly/controllers/attenuator_lib/telnet_scpi_client.py
+++ b/mobly/controllers/attenuator_lib/telnet_scpi_client.py
@@ -1,11 +1,11 @@
 # Copyright 2016 Google Inc.
-# 
+#
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
 # You may obtain a copy of the License at
-# 
+#
 #     http://www.apache.org/licenses/LICENSE-2.0
-# 
+#
 # Unless required by applicable law or agreed to in writing, software
 # distributed under the License is distributed on an "AS IS" BASIS,
 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -31,6 +31,7 @@
     instruments. It should only be used by those implemention control libraries
     and not by any user code directly.
     """
+
     def __init__(self, tx_cmd_separator="\n", rx_cmd_separator="\n",
                  prompt=""):
         self._tn = None
@@ -77,7 +78,7 @@
                 "Telnet command failed to return valid data")
 
         ret_text = ret_text.decode()
-        ret_text = ret_text.strip(self.tx_cmd_separator + self.rx_cmd_separator
-                                  + self.prompt)
+        ret_text = ret_text.strip(self.tx_cmd_separator +
+                                  self.rx_cmd_separator + self.prompt)
 
         return ret_text
diff --git a/mobly/controllers/monsoon.py b/mobly/controllers/monsoon.py
index 2f81ed6..337cdb7 100644
--- a/mobly/controllers/monsoon.py
+++ b/mobly/controllers/monsoon.py
@@ -346,7 +346,8 @@
             seq, _type, x, y = struct.unpack("BBBB", _bytes[:4])
             data = [
                 struct.unpack(">hhhh", _bytes[x:x + 8])
-                for x in range(4, len(_bytes) - 8, 8)
+                for x in range(4,
+                               len(_bytes) - 8, 8)
             ]
 
             if self._last_seq and seq & 0xF != (self._last_seq + 1) & 0xF:
@@ -378,8 +379,8 @@
 
             # See http://wiki/Main/MonsoonProtocol for details on these values.
             if self._coarse_ref != self._coarse_zero:
-                self._coarse_scale = 2.88 / (
-                    self._coarse_ref - self._coarse_zero)
+                self._coarse_scale = 2.88 / (self._coarse_ref -
+                                             self._coarse_zero)
             if self._fine_ref != self._fine_zero:
                 self._fine_scale = 0.0332 / (self._fine_ref - self._fine_zero)
 
@@ -797,12 +798,11 @@
             pass
         self.mon.StopDataCollection()
         try:
-            return MonsoonData(
-                current_values,
-                timestamps,
-                sample_hz,
-                voltage,
-                offset=sample_offset)
+            return MonsoonData(current_values,
+                               timestamps,
+                               sample_hz,
+                               voltage,
+                               offset=sample_offset)
         except:
             return None
 
diff --git a/mobly/controllers/sniffer.py b/mobly/controllers/sniffer.py
index 121a0f8..2408212 100644
--- a/mobly/controllers/sniffer.py
+++ b/mobly/controllers/sniffer.py
@@ -1,11 +1,11 @@
 # Copyright 2016 Google Inc.
-# 
+#
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
 # You may obtain a copy of the License at
-# 
+#
 #     http://www.apache.org/licenses/LICENSE-2.0
-# 
+#
 # Unless required by applicable law or agreed to in writing, software
 # distributed under the License is distributed on an "AS IS" BASIS,
 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -41,9 +41,10 @@
         module_name = "mobly.controllers.sniffer_lib.{}.{}".format(
             sniffer_type, sniffer_subtype)
         module = importlib.import_module(module_name)
-        objs.append(module.Sniffer(interface,
-                                   logging.getLogger(),
-                                   base_configs=base_configs))
+        objs.append(
+            module.Sniffer(interface,
+                           logging.getLogger(),
+                           base_configs=base_configs))
     return objs
 
 
diff --git a/mobly/controllers/sniffer_lib/__init__.py b/mobly/controllers/sniffer_lib/__init__.py
index 2fe4434..58e0d91 100644
--- a/mobly/controllers/sniffer_lib/__init__.py
+++ b/mobly/controllers/sniffer_lib/__init__.py
@@ -1,11 +1,11 @@
 # Copyright 2016 Google Inc.
-# 
+#
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
 # You may obtain a copy of the License at
-# 
+#
 #     http://www.apache.org/licenses/LICENSE-2.0
-# 
+#
 # Unless required by applicable law or agreed to in writing, software
 # distributed under the License is distributed on an "AS IS" BASIS,
 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
diff --git a/mobly/controllers/sniffer_lib/local/__init__.py b/mobly/controllers/sniffer_lib/local/__init__.py
index 2fe4434..58e0d91 100644
--- a/mobly/controllers/sniffer_lib/local/__init__.py
+++ b/mobly/controllers/sniffer_lib/local/__init__.py
@@ -1,11 +1,11 @@
 # Copyright 2016 Google Inc.
-# 
+#
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
 # You may obtain a copy of the License at
-# 
+#
 #     http://www.apache.org/licenses/LICENSE-2.0
-# 
+#
 # Unless required by applicable law or agreed to in writing, software
 # distributed under the License is distributed on an "AS IS" BASIS,
 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
diff --git a/mobly/controllers/sniffer_lib/local/local_base.py b/mobly/controllers/sniffer_lib/local/local_base.py
index d381c7a..3c1d108 100644
--- a/mobly/controllers/sniffer_lib/local/local_base.py
+++ b/mobly/controllers/sniffer_lib/local/local_base.py
@@ -1,17 +1,16 @@
 # Copyright 2016 Google Inc.
-# 
+#
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
 # You may obtain a copy of the License at
-# 
+#
 #     http://www.apache.org/licenses/LICENSE-2.0
-# 
+#
 # Unless required by applicable law or agreed to in writing, software
 # distributed under the License is distributed on an "AS IS" BASIS,
 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 # See the License for the specific language governing permissions and
 # limitations under the License.
-
 """
 Class for Local sniffers - i.e. running on the local machine.
 
@@ -28,6 +27,7 @@
 from mobly import utils
 from mobly.controllers import sniffer
 
+
 class SnifferLocalBase(sniffer.Sniffer):
     """This class defines the common behaviors of WLAN sniffers running on
     WLAN interfaces of the local machine.
@@ -87,14 +87,15 @@
         if sniffer.Sniffer.CONFIG_KEY_CHANNEL in final_configs:
             try:
                 subprocess.check_call([
-                    'iwconfig',
-                    self._interface,
-                    'channel',
-                    str(final_configs[sniffer.Sniffer.CONFIG_KEY_CHANNEL])])
+                    'iwconfig', self._interface, 'channel',
+                    str(final_configs[sniffer.Sniffer.CONFIG_KEY_CHANNEL])
+                ])
             except Exception as err:
                 raise sniffer.ExecutionError(err)
 
-    def _get_command_line(self, additional_args=None, duration=None,
+    def _get_command_line(self,
+                          additional_args=None,
+                          duration=None,
                           packet_count=None):
         """Utility function to be implemented by every child class - which
         are the concrete sniffer classes. Each sniffer-specific class should
@@ -110,25 +111,29 @@
         self._process = None
         shutil.move(self._temp_capture_file_path, self._capture_file_path)
 
-    def start_capture(self, override_configs=None,
-                      additional_args=None, duration=None,
+    def start_capture(self,
+                      override_configs=None,
+                      additional_args=None,
+                      duration=None,
                       packet_count=None):
         """See base class documentation
         """
         if self._process is not None:
             raise sniffer.InvalidOperationError(
-                    "Trying to start a sniff while another is still running!")
+                "Trying to start a sniff while another is still running!")
         capture_dir = os.path.join(self._logger.log_path,
                                    "Sniffer-{}".format(self._interface))
         os.makedirs(capture_dir, exist_ok=True)
-        self._capture_file_path = os.path.join(capture_dir,
-                      "capture_{}.pcap".format(logger.get_log_file_timestamp()))
+        self._capture_file_path = os.path.join(
+            capture_dir,
+            "capture_{}.pcap".format(logger.get_log_file_timestamp()))
 
         self._pre_capture_config(override_configs)
         _, self._temp_capture_file_path = tempfile.mkstemp(suffix=".pcap")
 
         cmd = self._get_command_line(additional_args=additional_args,
-                                duration=duration, packet_count=packet_count)
+                                     duration=duration,
+                                     packet_count=packet_count)
 
         self._process = utils.start_standing_subprocess(cmd)
         return sniffer.ActiveCaptureContext(self, duration)
@@ -138,8 +143,9 @@
         """
         if self._process is None:
             raise sniffer.InvalidOperationError(
-                                      "Trying to stop a non-started process")
-        utils.stop_standing_subprocess(self._process, kill_signal=signal.SIGINT)
+                "Trying to stop a non-started process")
+        utils.stop_standing_subprocess(self._process,
+                                       kill_signal=signal.SIGINT)
         self._post_process()
 
     def wait_for_capture(self, timeout=None):
@@ -147,7 +153,7 @@
         """
         if self._process is None:
             raise sniffer.InvalidOperationError(
-                                  "Trying to wait on a non-started process")
+                "Trying to wait on a non-started process")
         try:
             utils.wait_for_standing_subprocess(self._process, timeout)
             self._post_process()
diff --git a/mobly/controllers/sniffer_lib/local/tcpdump.py b/mobly/controllers/sniffer_lib/local/tcpdump.py
index cd2d0c2..b06e0db 100644
--- a/mobly/controllers/sniffer_lib/local/tcpdump.py
+++ b/mobly/controllers/sniffer_lib/local/tcpdump.py
@@ -1,11 +1,11 @@
 # Copyright 2016 Google Inc.
-# 
+#
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
 # You may obtain a copy of the License at
-# 
+#
 #     http://www.apache.org/licenses/LICENSE-2.0
-# 
+#
 # Unless required by applicable law or agreed to in writing, software
 # distributed under the License is distributed on an "AS IS" BASIS,
 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -16,6 +16,7 @@
 from mobly.controllers import sniffer
 from mobly.controllers.sniffer_lib.local import local_base
 
+
 class Sniffer(local_base.SnifferLocalBase):
     """This class defines a sniffer which uses tcpdump as its back-end
     """
@@ -30,7 +31,7 @@
         self._executable_path = shutil.which("tcpdump")
         if self._executable_path is None:
             raise sniffer.SnifferError(
-                              "Cannot find a path to the 'tcpdump' executable")
+                "Cannot find a path to the 'tcpdump' executable")
 
     def get_descriptor(self):
         """See base class documentation
@@ -42,7 +43,9 @@
         """
         return "tcpdump"
 
-    def _get_command_line(self, additional_args=None, duration=None,
+    def _get_command_line(self,
+                          additional_args=None,
+                          duration=None,
                           packet_count=None):
         cmd = "{} -i {} -w {}".format(self._executable_path, self._interface,
                                       self._temp_capture_file_path)
diff --git a/mobly/controllers/sniffer_lib/local/tshark.py b/mobly/controllers/sniffer_lib/local/tshark.py
index 783a323..18fe67a 100644
--- a/mobly/controllers/sniffer_lib/local/tshark.py
+++ b/mobly/controllers/sniffer_lib/local/tshark.py
@@ -1,11 +1,11 @@
 # Copyright 2016 Google Inc.
-# 
+#
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
 # You may obtain a copy of the License at
-# 
+#
 #     http://www.apache.org/licenses/LICENSE-2.0
-# 
+#
 # Unless required by applicable law or agreed to in writing, software
 # distributed under the License is distributed on an "AS IS" BASIS,
 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -16,6 +16,7 @@
 from mobly.controllers import sniffer
 from mobly.controllers.sniffer_lib.local import local_base
 
+
 class Sniffer(local_base.SnifferLocalBase):
     """This class defines a sniffer which uses tshark as its back-end
     """
@@ -30,8 +31,9 @@
         self._executable_path = (shutil.which("tshark")
                                  or shutil.which("/usr/local/bin/tshark"))
         if self._executable_path is None:
-            raise sniffer.SnifferError("Cannot find a path to the 'tshark' "
-                                 "executable (or to '/usr/local/bin/tshark')")
+            raise sniffer.SnifferError(
+                "Cannot find a path to the 'tshark' "
+                "executable (or to '/usr/local/bin/tshark')")
 
     def get_descriptor(self):
         """See base class documentation
@@ -43,7 +45,9 @@
         """
         return "tshark"
 
-    def _get_command_line(self, additional_args=None, duration=None,
+    def _get_command_line(self,
+                          additional_args=None,
+                          duration=None,
                           packet_count=None):
         cmd = "{} -i {} -w {}".format(self._executable_path, self._interface,
                                       self._temp_capture_file_path)
diff --git a/mobly/records.py b/mobly/records.py
index 4048554..067dcac 100644
--- a/mobly/records.py
+++ b/mobly/records.py
@@ -157,12 +157,11 @@
             with io.open(self._path, 'a', encoding='utf-8') as f:
                 # Use safe_dump here to avoid language-specific tags in final
                 # output.
-                yaml.safe_dump(
-                    new_content,
-                    f,
-                    explicit_start=True,
-                    allow_unicode=True,
-                    indent=4)
+                yaml.safe_dump(new_content,
+                               f,
+                               explicit_start=True,
+                               allow_unicode=True,
+                               indent=4)
 
 
 class TestResultEnums(object):
diff --git a/mobly/suite_runner.py b/mobly/suite_runner.py
index 0ca7729..d3ccce5 100644
--- a/mobly/suite_runner.py
+++ b/mobly/suite_runner.py
@@ -55,14 +55,13 @@
     """
     # Parse cli args.
     parser = argparse.ArgumentParser(description='Mobly Suite Executable.')
-    parser.add_argument(
-        '-c',
-        '--config',
-        nargs=1,
-        type=str,
-        required=True,
-        metavar='<PATH>',
-        help='Path to the test configuration file.')
+    parser.add_argument('-c',
+                        '--config',
+                        nargs=1,
+                        type=str,
+                        required=True,
+                        metavar='<PATH>',
+                        help='Path to the test configuration file.')
     parser.add_argument(
         '--tests',
         '--test_case',
@@ -79,8 +78,9 @@
     # Check the classes that were passed in
     for test_class in test_classes:
         if not issubclass(test_class, base_test.BaseTestClass):
-            logging.error('Test class %s does not extend '
-                          'mobly.base_test.BaseTestClass', test_class)
+            logging.error(
+                'Test class %s does not extend '
+                'mobly.base_test.BaseTestClass', test_class)
             sys.exit(1)
 
     # Find the full list of tests to execute
diff --git a/mobly/test_runner.py b/mobly/test_runner.py
index c459d32..7c0b0cc 100644
--- a/mobly/test_runner.py
+++ b/mobly/test_runner.py
@@ -71,8 +71,8 @@
     # Execute the test class with configs.
     ok = True
     for config in test_configs:
-        runner = TestRunner(
-            log_dir=config.log_path, test_bed_name=config.test_bed_name)
+        runner = TestRunner(log_dir=config.log_path,
+                            test_bed_name=config.test_bed_name)
         runner.add_test_class(config, test_class, tests)
         try:
             runner.run()
@@ -105,33 +105,30 @@
     """
     parser = argparse.ArgumentParser(description='Mobly Test Executable.')
     group = parser.add_mutually_exclusive_group(required=True)
-    group.add_argument(
-        '-c',
-        '--config',
-        nargs=1,
-        type=str,
-        metavar='<PATH>',
-        help='Path to the test configuration file.')
+    group.add_argument('-c',
+                       '--config',
+                       nargs=1,
+                       type=str,
+                       metavar='<PATH>',
+                       help='Path to the test configuration file.')
     group.add_argument(
         '-l',
         '--list_tests',
         action='store_true',
         help='Print the names of the tests defined in a script without '
         'executing them.')
-    parser.add_argument(
-        '--tests',
-        '--test_case',
-        nargs='+',
-        type=str,
-        metavar='[test_a test_b...]',
-        help='A list of tests in the test class to execute.')
-    parser.add_argument(
-        '-tb',
-        '--test_bed',
-        nargs='+',
-        type=str,
-        metavar='[<TEST BED NAME1> <TEST BED NAME2> ...]',
-        help='Specify which test beds to run tests on.')
+    parser.add_argument('--tests',
+                        '--test_case',
+                        nargs='+',
+                        type=str,
+                        metavar='[test_a test_b...]',
+                        help='A list of tests in the test class to execute.')
+    parser.add_argument('-tb',
+                        '--test_bed',
+                        nargs='+',
+                        type=str,
+                        metavar='[<TEST BED NAME1> <TEST BED NAME2> ...]',
+                        help='Specify which test beds to run tests on.')
     if not argv:
         argv = sys.argv[1:]
     return parser.parse_known_args(argv)[0]
@@ -282,19 +279,18 @@
         if self._log_dir != config.log_path:
             raise Error(
                 'TestRunner\'s log folder is "%s", but a test config with a '
-                'different log folder ("%s") was added.' % (self._log_dir,
-                                                            config.log_path))
+                'different log folder ("%s") was added.' %
+                (self._log_dir, config.log_path))
         if self._test_bed_name != config.test_bed_name:
             raise Error(
                 'TestRunner\'s test bed is "%s", but a test config with a '
                 'different test bed ("%s") was added.' %
                 (self._test_bed_name, config.test_bed_name))
         self._test_run_infos.append(
-            TestRunner._TestRunInfo(
-                config=config,
-                test_class=test_class,
-                tests=tests,
-                test_class_name_suffix=name_suffix))
+            TestRunner._TestRunInfo(config=config,
+                                    test_class=test_class,
+                                    tests=tests,
+                                    test_class_name_suffix=name_suffix))
 
     def _run_test_class(self, config, test_class, tests=None):
         """Instantiates and executes a test class.
@@ -342,10 +338,9 @@
                 test_config.summary_writer = summary_writer
                 test_config.test_class_name_suffix = test_run_info.test_class_name_suffix
                 try:
-                    self._run_test_class(
-                        config=test_config,
-                        test_class=test_run_info.test_class,
-                        tests=test_run_info.tests)
+                    self._run_test_class(config=test_config,
+                                         test_class=test_run_info.test_class,
+                                         tests=test_run_info.tests)
                 except signals.TestAbortAll as e:
                     logging.warning(
                         'Abort all subsequent test classes. Reason: %s', e)
diff --git a/mobly/utils.py b/mobly/utils.py
index f1b013c..17bcc88 100644
--- a/mobly/utils.py
+++ b/mobly/utils.py
@@ -336,8 +336,12 @@
         stdout = subprocess.PIPE
     if stderr is None:
         stderr = subprocess.PIPE
-    process = psutil.Popen(
-        cmd, stdout=stdout, stderr=stderr, shell=shell, cwd=cwd, env=env)
+    process = psutil.Popen(cmd,
+                           stdout=stdout,
+                           stderr=stderr,
+                           shell=shell,
+                           cwd=cwd,
+                           env=env)
     timer = None
     timer_triggered = threading.Event()
     if timeout and timeout > 0:
@@ -381,13 +385,12 @@
         The subprocess that was started.
     """
     logging.debug('Starting standing subprocess with: %s', cmd)
-    proc = subprocess.Popen(
-        cmd,
-        stdin=subprocess.PIPE,
-        stdout=subprocess.PIPE,
-        stderr=subprocess.PIPE,
-        shell=shell,
-        env=env)
+    proc = subprocess.Popen(cmd,
+                            stdin=subprocess.PIPE,
+                            stdout=subprocess.PIPE,
+                            stderr=subprocess.PIPE,
+                            shell=shell,
+                            env=env)
     # Leaving stdin open causes problems for input, e.g. breaking the
     # code.inspect() shell (http://stackoverflow.com/a/25512460/1612937), so
     # explicitly close it assuming it is not needed for standing subprocesses.
diff --git a/tests/mobly/controllers/android_device_test.py b/tests/mobly/controllers/android_device_test.py
index 51c1977..696be22 100755
--- a/tests/mobly/controllers/android_device_test.py
+++ b/tests/mobly/controllers/android_device_test.py
@@ -60,18 +60,15 @@
     # Tests for android_device module functions.
     # These tests use mock AndroidDevice instances.
 
-    @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)
+    @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)
@@ -79,50 +76,45 @@
                                     mock_android_device.get_mock_ads(5)):
             self.assertEqual(actual.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)
+    @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',
-        new=mock_android_device.list_adb_devices)
+    @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_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'])
+    @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)
@@ -173,8 +165,9 @@
         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)
+        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)
 
@@ -240,12 +233,10 @@
     # 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.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.
@@ -258,12 +249,10 @@
                                    'AndroidDevice%s' % mock_serial)
         self.assertEqual(ad.log_path, expected_lp)
 
-    @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.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.
@@ -277,20 +266,18 @@
         self.assertEqual(build_info['build_product'], 'FakeModel')
         self.assertEqual(build_info['product_name'], 'FakeModel')
         self.assertEqual(build_info['debuggable'], '1')
-        self.assertEqual(
-            len(build_info), len(android_device.CACHED_SYSTEM_PROPS))
+        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_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'))
+    @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')
@@ -303,12 +290,10 @@
         self.assertEqual(build_info['product_name'], '')
         self.assertEqual(build_info['debuggable'], '')
 
-    @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.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.
@@ -319,46 +304,40 @@
         _ = 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',
-                'ro.debuggable': '1',
-            }))
-    @mock.patch(
-        'mobly.controllers.android_device_lib.fastboot.FastbootProxy',
-        return_value=mock_android_device.MockFastbootProxy('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',
+                        '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_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'))
+    @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'))
+    @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
@@ -372,12 +351,10 @@
         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'))
+    @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.
         """
@@ -391,12 +368,10 @@
         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))
+    @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):
@@ -405,21 +380,21 @@
         """
         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')
+        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,
-                                      'test_something,sometime,1.zip'))
+        self.assertEqual(
+            output_path,
+            os.path.join(expected_path, 'test_something,sometime,1.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.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):
@@ -430,15 +405,13 @@
         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.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.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.get_current_epoch_time')
     @mock.patch('mobly.logger.epoch_to_log_line_timestamp')
@@ -451,20 +424,19 @@
         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')
+        expected_path = os.path.join(logging.log_path,
+                                     'AndroidDevice%s' % ad.serial,
+                                     'BugReports')
         create_dir_mock.assert_called_with(expected_path)
         epoch_to_log_line_timestamp_mock.assert_called_once_with(1557446629606)
-        self.assertEqual(output_path,
-                         os.path.join(expected_path,
-                                      'bugreport,05-09_17-03-49.606,1.zip'))
+        self.assertEqual(
+            output_path,
+            os.path.join(expected_path, 'bugreport,05-09_17-03-49.606,1.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.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.get_current_epoch_time')
     @mock.patch('mobly.logger.epoch_to_log_line_timestamp')
@@ -477,8 +449,9 @@
         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')
+        expected_path = os.path.join(logging.log_path,
+                                     'AndroidDevice%s' % ad.serial,
+                                     'BugReports')
         create_dir_mock.assert_called_with(expected_path)
         epoch_to_log_line_timestamp_mock.assert_called_once_with(1557446629606)
         self.assertEqual(
@@ -486,98 +459,91 @@
             os.path.join(expected_path,
                          'test_something,05-09_17-03-49.606,1.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.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')
+        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,
+        self.assertEqual(
+            output_path, os.path.join(expected_path,
                                       'bugreport,sometime,1.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.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')
+        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,
-                                      'test_something,sometime,1.zip'))
+        self.assertEqual(
+            output_path,
+            os.path.join(expected_path, 'test_something,sometime,1.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.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)
+        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,
-                                      'test_something,sometime,1.zip'))
+        self.assertEqual(
+            output_path,
+            os.path.join(expected_path, 'test_something,sometime,1.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.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):
+    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')
+        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,
-                                      'test_something,sometime,1.txt'))
+        self.assertEqual(
+            output_path,
+            os.path.join(expected_path, 'test_something,sometime,1.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.start_standing_subprocess', return_value='process')
+    @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,
@@ -589,14 +555,12 @@
         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.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,
@@ -608,14 +572,14 @@
         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.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.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,
@@ -624,15 +588,13 @@
         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_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.start_standing_subprocess',
+                return_value='process')
     @mock.patch('mobly.utils.stop_standing_subprocess')
     def test_AndroidDevice_change_log_path_with_service(
             self, stop_proc_mock, start_proc_mock, creat_dir_mock,
@@ -644,15 +606,13 @@
         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.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.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,
@@ -666,15 +626,13 @@
         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.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.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,
@@ -686,15 +644,13 @@
         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.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.start_standing_subprocess',
+                return_value='process')
     @mock.patch('mobly.utils.stop_standing_subprocess')
     def test_AndroidDevice_update_serial_with_service_running(
             self, stop_proc_mock, start_proc_mock, creat_dir_mock,
@@ -705,12 +661,10 @@
         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.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')
@@ -720,12 +674,10 @@
         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.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')
@@ -737,18 +689,18 @@
         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.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):
+    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 '
@@ -756,12 +708,10 @@
         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.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)
@@ -770,16 +720,15 @@
             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.'
+        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.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')
@@ -791,12 +740,10 @@
         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.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')
@@ -819,12 +766,10 @@
         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.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')
@@ -842,29 +787,26 @@
         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.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_snippet_cleanup(
-            self, MockGetPort, MockSnippetClient, MockFastboot, MockAdbProxy):
+    def test_AndroidDevice_snippet_cleanup(self, 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'))
+    @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)
@@ -885,14 +827,12 @@
         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.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_handle_usb_disconnect(self, stop_proc_mock,
                                                  start_proc_mock,
@@ -931,14 +871,12 @@
         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.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_handle_reboot(self, stop_proc_mock, start_proc_mock,
                                          FastbootProxy, MockAdbProxy):
@@ -976,14 +914,12 @@
         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.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_handle_reboot_changes_build_info(
             self, stop_proc_mock, start_proc_mock, FastbootProxy,
@@ -997,14 +933,12 @@
         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.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_handle_reboot_changes_build_info_with_caching(
             self, stop_proc_mock, start_proc_mock, FastbootProxy,
@@ -1021,20 +955,17 @@
         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_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
+            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])
@@ -1052,20 +983,17 @@
             '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_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
+            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])
