pushimage: handle all exceptions gs might throw

If we hit an unknown gs exception, we should catch it and continue
trying to push the rest of the files.  This better mimics how the
old bash version worked (it would ignore errors and just warn), but
now we will mark the stage as failed.

BUG=chromium:349292
TEST=`./buildbot/run_tests` passes
TEST=`cbuildbot link-firmware` works

Change-Id: I7130a567212bb763243f8c54f6fc336f4d191d80
Reviewed-on: https://chromium-review.googlesource.com/189160
Reviewed-by: Don Garrett <dgarrett@chromium.org>
Commit-Queue: Mike Frysinger <vapier@chromium.org>
Tested-by: Mike Frysinger <vapier@chromium.org>
diff --git a/scripts/pushimage_unittest.py b/scripts/pushimage_unittest.py
index fb5a9f9..123560d 100755
--- a/scripts/pushimage_unittest.py
+++ b/scripts/pushimage_unittest.py
@@ -16,9 +16,9 @@
 from chromite.lib import cros_build_lib
 from chromite.lib import cros_test_lib
 from chromite.lib import git
-from chromite.lib import gs
 from chromite.lib import gs_unittest
 from chromite.lib import osutils
+from chromite.lib import partial_mock
 from chromite.lib import signing
 from chromite.scripts import pushimage
 
@@ -113,14 +113,10 @@
     self.assertEqual(content.rstrip(), exp_content.rstrip())
 
 
-class MarkImageToBeSignedTest(cros_test_lib.MockTestCase):
+class MarkImageToBeSignedTest(gs_unittest.AbstractGSContextTest):
   """Tests for MarkImageToBeSigned()"""
 
   def setUp(self):
-    self.gs_mock = self.StartPatcher(gs_unittest.GSContextMock())
-    self.gs_mock.SetDefaultCmdResult()
-    self.ctx = gs.GSContext()
-
     # Minor optimization -- we call this for logging purposes in the main
     # code, but don't really care about it for testing.  It just slows us.
     self.PatchObject(git, 'RunGit',
@@ -170,14 +166,10 @@
     self.gs_mock.assertCommandContains(['cp', '--'])
 
 
-class PushImageTests(cros_test_lib.MockTestCase):
+class PushImageTests(gs_unittest.AbstractGSContextTest):
   """Tests for PushImage()"""
 
   def setUp(self):
-    self.gs_mock = self.StartPatcher(gs_unittest.GSContextMock())
-    self.gs_mock.SetDefaultCmdResult()
-    self.ctx = gs.GSContext()
-
     self.mark_mock = self.PatchObject(pushimage, 'MarkImageToBeSigned')
 
   def testBasic(self):
@@ -235,6 +227,14 @@
     self.assertFalse(self.mark_mock.called)
     self.assertEqual(urls, {})
 
+  def testGsError(self):
+    """Verify random GS errors don't make us blow up entirely"""
+    self.gs_mock.AddCmdResult(partial_mock.In('stat'), returncode=1,
+                              output='gobblety gook\n')
+    with cros_test_lib.LoggingCapturer('chromite'):
+      self.assertRaises(pushimage.PushError, pushimage.PushImage, '/src',
+                        'test.board', 'R34-5126.0.0')
+
 
 class MainTests(cros_test_lib.MockTestCase):
   """Tests for main()"""