Make tools/bisect_builds.py handle reversed bad/good revision ranges

BUG=none

Review URL: https://codereview.chromium.org/11266025

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@165781 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/tools/bisect_test.py b/tools/bisect_test.py
new file mode 100644
index 0000000..b970f84
--- /dev/null
+++ b/tools/bisect_test.py
@@ -0,0 +1,53 @@
+# Copyright (c) 2012 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import unittest
+
+bisect_builds = __import__('bisect-builds')
+
+
+class BisectTest(unittest.TestCase):
+
+  patched = []
+  max_rev = 10000
+
+  def monkey_patch(self, obj, name, new):
+    self.patched.append((obj, name, getattr(obj, name)))
+    setattr(obj, name, new)
+
+  def clear_patching(self):
+    for obj, name, old in self.patched:
+      setattr(obj, name, old)
+    self.patched = []
+
+  def setUp(self):
+    self.monkey_patch(bisect_builds.DownloadJob, 'Start', lambda *args: None)
+    self.monkey_patch(bisect_builds.DownloadJob, 'Stop', lambda *args: None)
+    self.monkey_patch(bisect_builds.DownloadJob, 'WaitFor', lambda *args: None)
+    self.monkey_patch(bisect_builds, 'RunRevision', lambda *args: (0, "", ""))
+    self.monkey_patch(bisect_builds.PathContext, 'ParseDirectoryIndex',
+                      lambda *args: range(self.max_rev))
+
+  def tearDown(self):
+    self.clear_patching()
+
+  def bisect(self, good_rev, bad_rev, evaluate):
+    return bisect_builds.Bisect(good_rev=good_rev,
+                                bad_rev=bad_rev,
+                                evaluate=evaluate,
+                                num_runs=1,
+                                official_builds=False,
+                                platform='linux',
+                                profile=None,
+                                try_args=())
+
+  def testBisectConsistentAnswer(self):
+    self.assertEqual(self.bisect(1000, 100, lambda *args: 'g'), (100, 101))
+    self.assertEqual(self.bisect(100, 1000, lambda *args: 'b'), (100, 101))
+    self.assertEqual(self.bisect(2000, 200, lambda *args: 'b'), (1999, 2000))
+    self.assertEqual(self.bisect(200, 2000, lambda *args: 'g'), (1999, 2000))
+
+
+if __name__ == '__main__':
+  unittest.main()