bisect-kit: stop bisector for fatal errors

Some errors, e.g. incorrect command line argument, are fatal. Should
stop bisector instead of retrying them.

This CL also changed some non-fatal issues from assertion to normal
exceptions.

BUG=None
TEST=unittest

Change-Id: I0a6ffd0f697f4e79114d752585019e705e69c33f
Reviewed-on: https://chromium-review.googlesource.com/1795943
Tested-by: Zheng-Jie Chang <zjchang@chromium.org>
Tested-by: Kuang-che Wu <kcwu@chromium.org>
Commit-Ready: Zheng-Jie Chang <zjchang@chromium.org>
Commit-Ready: Kuang-che Wu <kcwu@chromium.org>
Legacy-Commit-Queue: Commit Bot <commit-bot@chromium.org>
Reviewed-by: Zheng-Jie Chang <zjchang@chromium.org>
Reviewed-by: Kuang-che Wu <kcwu@chromium.org>
diff --git a/bisect_kit/cli_test.py b/bisect_kit/cli_test.py
index bf4838a..3f82362 100644
--- a/bisect_kit/cli_test.py
+++ b/bisect_kit/cli_test.py
@@ -5,6 +5,7 @@
 """Test cli module."""
 
 from __future__ import print_function
+import argparse
 import unittest
 
 from bisect_kit import cli
@@ -74,6 +75,33 @@
     self.assertEqual(cli.lookup_signal_name(15), 'SIGTERM')
     self.assertEqual(cli.lookup_signal_name(99), 'Unknown')
 
+  def test_patching_argparser_exit(self):
+    parser = argparse.ArgumentParser()
+    cli.patching_argparser_exit(parser)
+    parser.add_argument('--value', type=int)
+    parser.add_argument('--necessary', required=True)
+
+    # Nothing happened.
+    parser.parse_args(['--necessary', 'foo'])
+
+    with self.assertRaises(SystemExit) as e:
+      parser.parse_args(['foo'])
+    self.assertEqual(e.exception.code, cli.EXIT_CODE_FATAL)
+
+    with self.assertRaises(SystemExit) as e:
+      parser.parse_args(['--necessary', 'foo', '--value', 'bar'])
+    self.assertEqual(e.exception.code, cli.EXIT_CODE_FATAL)
+
+  def test_fatal_error_handler(self):
+
+    @cli.fatal_error_handler
+    def test_func():
+      assert 0
+
+    with self.assertRaises(SystemExit) as e:
+      test_func()
+    self.assertEqual(e.exception.code, cli.EXIT_CODE_FATAL)
+
 
 if __name__ == '__main__':
   unittest.main()