Add git bisector scripts

This contains bisect_git.py and switch_git.py

Change-Id: I7cf5eb895ebd9ce803b745c51498b4b151ddc76b
diff --git a/bisect_git_test.py b/bisect_git_test.py
new file mode 100644
index 0000000..4fd9c80
--- /dev/null
+++ b/bisect_git_test.py
@@ -0,0 +1,71 @@
+# Copyright 2017 The Chromium OS Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+"""Test bisect_git script."""
+
+from __future__ import print_function
+import unittest
+
+import mock
+
+from bisect_kit import cli
+import bisect_git
+
+
+@mock.patch('bisect_kit.common.config_logging', mock.Mock())
+class TestGitDomain(unittest.TestCase):
+  """Test GitDomain class."""
+
+  def setUp(self):
+    # All git operations should have been mocked, nobody will access this path
+    # on disk.
+    self.git_repo = '/non/existing/git/repo/path'
+
+  def test_basic(self):
+    """Tests basic functionality."""
+    bisector = cli.BisectorCommandLineInterface(bisect_git.GitDomain)
+
+    start = 12345678000
+    fake_commits = map(str, range(start, start + 10))
+    old, new = fake_commits[0], fake_commits[-1]
+
+    def is_containing_commit(git_repo, rev):
+      self.assertEqual(git_repo, self.git_repo)
+      return rev in fake_commits
+
+    def get_revlist(git_repo, old, new):
+      self.assertEqual(git_repo, self.git_repo)
+      self.assertEqual(old, fake_commits[0])
+      self.assertEqual(new, fake_commits[-1])
+      return fake_commits
+
+    with mock.patch('bisect_kit.cli.argtype_dir_path', lambda x: x):
+      with mock.patch.multiple(
+          'bisect_kit.git_util',
+          is_containing_commit=is_containing_commit,
+          get_revlist=get_revlist):
+        bisector.main('init', '--old', old, '--new', new, '--git_repo',
+                      self.git_repo)
+
+    bisector.main('config', 'switch', 'abcd')
+    bisector.main('config', 'eval', 'efgh')
+
+    with mock.patch('bisect_kit.util.Popen') as mock_popen:
+      run_mocks = [mock.Mock(), mock.Mock()]
+      run_mocks[0].wait.return_value = 0
+      run_mocks[1].wait.return_value = 0
+      mock_popen.side_effect = run_mocks
+      bisector.main('run', old)
+
+      switch_env = mock_popen.call_args_list[0][1]['env']
+      self.assertEqual(switch_env.get('GIT_REV'), old)
+      self.assertEqual(switch_env.get('GIT_REPO'), self.git_repo)
+
+      eval_env = mock_popen.call_args_list[1][1]['env']
+      self.assertEqual(eval_env.get('GIT_REV'), old)
+      self.assertEqual(eval_env.get('GIT_REPO'), self.git_repo)
+    bisector.main('view')
+
+
+if __name__ == '__main__':
+  unittest.main()