Display stderr and stdout of stop_cvd on console

Bug: 176131784
Test: acloud-dev delete --instance-names local-instance-1
Change-Id: If0a55aea1832da225b8bdf39ab61eb0fd2a8b004
diff --git a/list/instance.py b/list/instance.py
index c589a08..6c7ed7f 100644
--- a/list/instance.py
+++ b/list/instance.py
@@ -386,7 +386,7 @@
         if adb_device.IsAdbConnected():
             device_information = adb_device.device_information
 
-        super(LocalInstance, self).__init__(
+        super().__init__(
             name=name, fullname=fullname, display=display, ip="0.0.0.0",
             status=constants.INS_STATUS_RUNNING,
             adb_port=self._cf_runtime_cfg.adb_port,
@@ -398,7 +398,7 @@
     def Summary(self):
         """Return the string that this class is holding."""
         instance_home = "%s instance home: %s" % (_INDENT, self._instance_dir)
-        return "%s\n%s" % (super(LocalInstance, self).Summary(), instance_home)
+        return "%s\n%s" % (super().Summary(), instance_home)
 
     def CvdStatus(self):
         """check if local instance is active.
@@ -463,20 +463,19 @@
         stop_cvd_cmd = os.path.join(self.cf_runtime_cfg.cvd_tools_path,
                                     constants.CMD_STOP_CVD)
         logger.debug("Running cmd[%s] to delete local cvd", stop_cvd_cmd)
-        with open(os.devnull, "w") as dev_null:
-            cvd_env = os.environ.copy()
-            if self.instance_dir:
-                cvd_env[constants.ENV_CUTTLEFISH_CONFIG_FILE] = self._cf_runtime_cfg.config_path
-                cvd_env[constants.ENV_CVD_HOME] = GetLocalInstanceHomeDir(
-                    self._local_instance_id)
-                cvd_env[constants.ENV_CUTTLEFISH_INSTANCE] = str(self._local_instance_id)
-            else:
-                logger.error("instance_dir is null!! instance[%d] might not be"
-                             " deleted", self._local_instance_id)
-            subprocess.check_call(
-                utils.AddUserGroupsToCmd(stop_cvd_cmd,
-                                         constants.LIST_CF_USER_GROUPS),
-                stderr=dev_null, stdout=dev_null, shell=True, env=cvd_env)
+        cvd_env = os.environ.copy()
+        if self.instance_dir:
+            cvd_env[constants.ENV_CUTTLEFISH_CONFIG_FILE] = self._cf_runtime_cfg.config_path
+            cvd_env[constants.ENV_CVD_HOME] = GetLocalInstanceHomeDir(
+                self._local_instance_id)
+            cvd_env[constants.ENV_CUTTLEFISH_INSTANCE] = str(self._local_instance_id)
+        else:
+            logger.error("instance_dir is null!! instance[%d] might not be"
+                         " deleted", self._local_instance_id)
+        subprocess.check_call(
+            utils.AddUserGroupsToCmd(stop_cvd_cmd,
+                                     constants.LIST_CF_USER_GROUPS),
+            stderr=subprocess.STDOUT, shell=True, env=cvd_env)
 
         adb_cmd = AdbTools(self.adb_port)
         # When relaunch a local instance, we need to pass in retry=True to make
@@ -561,7 +560,7 @@
         device_information = (self._adb.device_information if
                               self._adb.device_information else None)
 
-        super(LocalGoldfishInstance, self).__init__(
+        super().__init__(
             name=name, fullname=fullname, display=display, ip="127.0.0.1",
             status=None, adb_port=adb_port, avd_type=constants.TYPE_GF,
             createtime=create_time, elapsed_time=elapsed_time,
@@ -732,7 +731,7 @@
                          "instance_name": name,
                          "elapsed_time": elapsed_time})
 
-        super(RemoteInstance, self).__init__(
+        super().__init__(
             name=name, fullname=fullname, display=display, ip=ip, status=status,
             adb_port=adb_port, vnc_port=vnc_port,
             ssh_tunnel_is_connected=ssh_tunnel_is_connected,
diff --git a/list/instance_test.py b/list/instance_test.py
index 36f5ea6..4bc1418 100644
--- a/list/instance_test.py
+++ b/list/instance_test.py
@@ -29,6 +29,7 @@
 from acloud.internal import constants
 from acloud.internal.lib import cvd_runtime_config
 from acloud.internal.lib import driver_test_lib
+from acloud.internal.lib import utils
 from acloud.internal.lib.adb_tools import AdbTools
 from acloud.list import instance
 
@@ -41,8 +42,6 @@
                       "-o UserKnownHostsFile=/dev/null "
                       "-o StrictHostKeyChecking=no -L 54321:127.0.0.1:6520 "
                       "-L 12345:127.0.0.1:6444 -N -f -l user 1.1.1.1")
-    PS_LAUNCH_CVD = b("Sat Nov 10 21:55:10 2018 /fake_path/bin/run_cvd ")
-    PS_RUNTIME_CF_CONFIG = {"x_res": "1080", "y_res": "1920", "dpi": "480"}
     GCE_INSTANCE = {
         constants.INS_KEY_NAME: "fake_ins_name",
         constants.INS_KEY_CREATETIME: "fake_create_time",
@@ -58,11 +57,10 @@
                       "value":"fake_flavor"}]}
     }
 
-    # pylint: disable=protected-access
-    def testCreateLocalInstance(self):
-        """"Test get local instance info from launch_cvd process."""
-        self.Patch(subprocess, "check_output", return_value=self.PS_LAUNCH_CVD)
-        cf_config = mock.MagicMock(
+    @staticmethod
+    def _MockCvdRuntimeConfig():
+        """Create a mock CvdRuntimeConfig."""
+        return mock.MagicMock(
             instance_id=2,
             x_res=1080,
             y_res=1920,
@@ -71,10 +69,19 @@
             adb_port=6521,
             vnc_port=6445,
             adb_ip_port="127.0.0.1:6521",
+            cvd_tools_path="fake_cvd_tools_path",
+            config_path="fake_config_path",
         )
+
+    @mock.patch("acloud.list.instance.AdbTools")
+    def testCreateLocalInstance(self, mock_adb_tools):
+        """Test getting local instance info from cvd runtime config."""
+        mock_adb_tools_object = mock.Mock(device_information={})
+        mock_adb_tools_object.IsAdbConnected.return_value = True
+        mock_adb_tools.return_value = mock_adb_tools_object
         self.Patch(cvd_runtime_config, "CvdRuntimeConfig",
-                   return_value=cf_config)
-        local_instance = instance.LocalInstance(cf_config)
+                   return_value=self._MockCvdRuntimeConfig())
+        local_instance = instance.LocalInstance("fake_config_path")
 
         self.assertEqual("local-instance-2", local_instance.name)
         self.assertEqual(True, local_instance.islocal)
@@ -87,6 +94,32 @@
         self.assertEqual(6521, local_instance.adb_port)
         self.assertEqual(6445, local_instance.vnc_port)
 
+    @mock.patch("acloud.list.instance.AdbTools")
+    def testDeleteLocalInstance(self, mock_adb_tools):
+        """Test executing stop_cvd command."""
+        self.Patch(cvd_runtime_config, "CvdRuntimeConfig",
+                   return_value=self._MockCvdRuntimeConfig())
+        mock_adb_tools_object = mock.Mock(device_information={})
+        mock_adb_tools_object.IsAdbConnected.return_value = True
+        mock_adb_tools.return_value = mock_adb_tools_object
+        self.Patch(utils, "AddUserGroupsToCmd",
+                   side_effect=lambda cmd, groups: cmd)
+        mock_check_call = self.Patch(subprocess, "check_call")
+
+        local_instance = instance.LocalInstance("fake_config_path")
+        with mock.patch.dict("acloud.list.instance.os.environ", clear=True):
+            local_instance.Delete()
+
+        expected_env = {
+            'CUTTLEFISH_INSTANCE': '2',
+            'HOME': '/tmp/acloud_cvd_temp/local-instance-2',
+            'CUTTLEFISH_CONFIG_FILE': 'fake_config_path',
+        }
+        mock_check_call.assert_called_with(
+            'fake_cvd_tools_path/stop_cvd', stderr=subprocess.STDOUT,
+            shell=True, env=expected_env)
+        mock_adb_tools_object.DisconnectAdb.assert_called()
+
     @mock.patch("acloud.list.instance.tempfile")
     @mock.patch("acloud.list.instance.AdbTools")
     def testCreateLocalGoldfishInstance(self, mock_adb_tools, mock_tempfile):
@@ -133,6 +166,7 @@
             num = instance.LocalGoldfishInstance.GetMaxNumberOfInstances()
         self.assertEqual(num, 6)
 
+    # pylint: disable=protected-access
     def testGetElapsedTime(self):
         """Test _GetElapsedTime"""
         # Instance time can't parse