(factory-980B) Accumulated fix for storage and audio test

Cherry-picking from:

 Fail factory storage test if underlying fio command fails.
 Reviewed-on: http://gerrit.chromium.org/gerrit/7915

 Allow SD/USB tests to run if test-media is already inserted.
 Reviewed-on: http://gerrit.chromium.org/gerrit/7917

 factory_Audio: allow initializing volume.
 Reviewed-on: http://gerrit.chromium.org/gerrit/10392

BUG=chrome-os-partner:6540
TEST=Manually performed factory test

Change-Id: I2a6a464bf329b7b5e470cc42f653921fac0b1457
Reviewed-on: http://gerrit.chromium.org/gerrit/10466
Tested-by: Hung-Te Lin <hungte@chromium.org>
Reviewed-by: Hung-Te Lin <hungte@chromium.org>
diff --git a/client/site_tests/factory_Audio/factory_Audio.py b/client/site_tests/factory_Audio/factory_Audio.py
index ac8031f..2feec33 100644
--- a/client/site_tests/factory_Audio/factory_Audio.py
+++ b/client/site_tests/factory_Audio/factory_Audio.py
@@ -190,7 +190,7 @@
         factory.log('%s run_once' % self.__class__)
 
         # Change initial volume.
-        if audio_sample_path:
+        if audio_init_volume:
             os.system("amixer -c 0 sset Master %d%%" % audio_init_volume)
 
         # Write recordings in tmpdir.
diff --git a/client/site_tests/factory_ExternalStorage/factory_ExternalStorage.py b/client/site_tests/factory_ExternalStorage/factory_ExternalStorage.py
index f6ba2f0..8594597 100644
--- a/client/site_tests/factory_ExternalStorage/factory_ExternalStorage.py
+++ b/client/site_tests/factory_ExternalStorage/factory_ExternalStorage.py
@@ -43,6 +43,8 @@
                     (removed_dev, target_dev, removed_dev, target_dev)
 _ERR_DEV_NOT_REMOVE_FMT_STR = \
         lambda t: 'Please remove %s.\n請移除 %s\n' % (t, t)
+_ERR_FIO_TEST_FAILED_FMT_STR = \
+        lambda target_dev: 'IO error while running test on %s.\n' % target_dev
 
 def find_root_dev():
     rootdev = utils.system_output('rootdev -s -d')
@@ -68,33 +70,40 @@
     def rescan_storage(self, subtest_tag):
         if self._state == _STATE_WAIT_INSERT:
             new_devices = find_all_storage_dev()
-            diff = new_devices - self._devices
-            if diff:
+            insert_diff = new_devices - self._devices
+            removal_diff = self._devices - new_devices
+            if removal_diff:
+              self._devices = new_devices
+              factory.log('Device removed : %s' % removal_diff)
+            elif insert_diff:
                 self._devices = new_devices
-                factory.log('found new devs : %s' % diff)
-                self._target_device = diff.pop()
+                factory.log('found new devs : %s' % insert_diff)
+                self._target_device = insert_diff.pop()
                 devpath = os.path.join('/dev', self._target_device)
                 self._prompt.set_text(_TESTING_FMT_STR(devpath))
                 self._image = self.testing_image
                 self._pictogram.queue_draw()
                 gtk.main_iteration()
-                test._result = self.job.run_test('hardware_StorageFio',
+                result = self.job.run_test('hardware_StorageFio',
                                                  dev=devpath,
                                                  quicktest=True,
                                                  tag=subtest_tag)
+                if result is not True:
+                  self._error += _ERR_FIO_TEST_FAILED_FMT_STR(
+                          self._target_device)
                 self._prompt.set_text(_REMOVE_FMT_STR(self._media))
                 self._state = _STATE_WAIT_REMOVE
                 self._image = self.removal_image
                 self._pictogram.queue_draw()
         else:
-            diff = self._devices - find_all_storage_dev()
-            if len(diff) > 1:
+            removal_diff = self._devices - find_all_storage_dev()
+            if len(removal_diff) > 1:
                 self._error += _ERR_TOO_MANY_REMOVE_FMT_STR(
-                        self._target_device, diff)
-            if diff and self._target_device not in diff:
+                        self._target_device, removal_diff)
+            if removal_diff and self._target_device not in removal_diff:
                 self._error += _ERR_DEV_NOT_REMOVE_FMT_STR(
                         self._target_device)
-            if diff:
+            if removal_diff:
                 gtk.main_quit()
         return True