diff options
Diffstat (limited to 'rbtools/tests.py')
-rw-r--r-- | rbtools/tests.py | 379 |
1 files changed, 379 insertions, 0 deletions
diff --git a/rbtools/tests.py b/rbtools/tests.py new file mode 100644 index 0000000..f0bc369 --- /dev/null +++ b/rbtools/tests.py @@ -0,0 +1,379 @@ +import nose +import os +import shutil +import sys +import tempfile +import unittest + +from rbtools.postreview import execute, load_config_file +from rbtools.postreview import GitClient, RepositoryInfo +import rbtools.postreview + + +FOO = """\ +ARMA virumque cano, Troiae qui primus ab oris +Italiam, fato profugus, Laviniaque venit +litora, multum ille et terris iactatus et alto +vi superum saevae memorem Iunonis ob iram; +multa quoque et bello passus, dum conderet urbem, +inferretque deos Latio, genus unde Latinum, +Albanique patres, atque altae moenia Romae. +Musa, mihi causas memora, quo numine laeso, +quidve dolens, regina deum tot volvere casus +insignem pietate virum, tot adire labores +impulerit. Tantaene animis caelestibus irae? + +""" + +FOO1 = """\ +ARMA virumque cano, Troiae qui primus ab oris +Italiam, fato profugus, Laviniaque venit +litora, multum ille et terris iactatus et alto +vi superum saevae memorem Iunonis ob iram; +multa quoque et bello passus, dum conderet urbem, +inferretque deos Latio, genus unde Latinum, +Albanique patres, atque altae moenia Romae. +Musa, mihi causas memora, quo numine laeso, + +""" + +FOO2 = """\ +ARMA virumque cano, Troiae qui primus ab oris +ARMA virumque cano, Troiae qui primus ab oris +ARMA virumque cano, Troiae qui primus ab oris +Italiam, fato profugus, Laviniaque venit +litora, multum ille et terris iactatus et alto +vi superum saevae memorem Iunonis ob iram; +multa quoque et bello passus, dum conderet urbem, +inferretque deos Latio, genus unde Latinum, +Albanique patres, atque altae moenia Romae. +Musa, mihi causas memora, quo numine laeso, + +""" + +FOO3 = """\ +ARMA virumque cano, Troiae qui primus ab oris +ARMA virumque cano, Troiae qui primus ab oris +Italiam, fato profugus, Laviniaque venit +litora, multum ille et terris iactatus et alto +vi superum saevae memorem Iunonis ob iram; +dum conderet urbem, +inferretque deos Latio, genus unde Latinum, +Albanique patres, atque altae moenia Romae. +Albanique patres, atque altae moenia Romae. +Musa, mihi causas memora, quo numine laeso, + +""" + +def is_exe_in_path(name): + """Checks whether an executable is in the user's search path. + + This expects a name without any system-specific executable extension. + It will append the proper extension as necessary. For example, + use "myapp" and not "myapp.exe". + + This will return True if the app is in the path, or False otherwise. + + Taken from djblets.util.filesystem to avoid an extra dependency + """ + + if sys.platform == 'win32' and not name.endswith('.exe'): + name += ".exe" + + for dir in os.environ['PATH'].split(os.pathsep): + if os.path.exists(os.path.join(dir, name)): + return True + + return False + + +class OptionsStub(object): + def __init__(self): + self.debug = True + self.guess_summary = False + self.guess_description = False + self.tracking = None + + +class GitClientTests(unittest.TestCase): + TESTSERVER = "http://127.0.0.1:8080" + + def _gitcmd(self, command, env=None, split_lines=False, + ignore_errors=False, extra_ignore_errors=(), + translate_newlines=True, git_dir=None): + if git_dir: + full_command = ['git', '--git-dir=%s/.git' % git_dir] + else: + full_command = ['git'] + + full_command.extend(command) + + return execute(full_command, env, split_lines, ignore_errors, + extra_ignore_errors, translate_newlines) + + def _git_add_file_commit(self, file, data, msg): + """Add a file to a git repository with the content of data + and commit with msg. + """ + foo = open(file, 'w') + foo.write(data) + foo.close() + self._gitcmd(['add', file]) + self._gitcmd(['commit', '-m', msg]) + + def setUp(self): + if not is_exe_in_path('git'): + raise nose.SkipTest('git not found in path') + + self.orig_dir = os.getcwd() + + self.git_dir = tempfile.mkdtemp() + os.chdir(self.git_dir) + self._gitcmd(['init'], git_dir=self.git_dir) + foo = open(os.path.join(self.git_dir, 'foo.txt'), 'w') + foo.write(FOO) + foo.close() + + self._gitcmd(['add', 'foo.txt']) + self._gitcmd(['commit', '-m', 'initial commit']) + + self.clone_dir = tempfile.mkdtemp() + os.rmdir(self.clone_dir) + self._gitcmd(['clone', self.git_dir, self.clone_dir]) + self.client = GitClient() + os.chdir(self.orig_dir) + + rbtools.postreview.user_config = load_config_file('') + rbtools.postreview.options = OptionsStub() + rbtools.postreview.options.parent_branch = None + + def tearDown(self): + os.chdir(self.orig_dir) + shutil.rmtree(self.git_dir) + shutil.rmtree(self.clone_dir) + + def test_get_repository_info_simple(self): + """Test GitClient get_repository_info, simple case""" + os.chdir(self.clone_dir) + ri = self.client.get_repository_info() + self.assert_(isinstance(ri, RepositoryInfo)) + self.assertEqual(ri.base_path, '') + self.assertEqual(ri.path.rstrip("/.git"), self.git_dir) + self.assertTrue(ri.supports_parent_diffs) + self.assertFalse(ri.supports_changesets) + + def test_scan_for_server_simple(self): + """Test GitClient scan_for_server, simple case""" + os.chdir(self.clone_dir) + ri = self.client.get_repository_info() + + server = self.client.scan_for_server(ri) + self.assert_(server is None) + + def test_scan_for_server_reviewboardrc(self): + "Test GitClient scan_for_server, .reviewboardrc case""" + os.chdir(self.clone_dir) + rc = open(os.path.join(self.clone_dir, '.reviewboardrc'), 'w') + rc.write('REVIEWBOARD_URL = "%s"' % self.TESTSERVER) + rc.close() + + ri = self.client.get_repository_info() + server = self.client.scan_for_server(ri) + self.assertEqual(server, self.TESTSERVER) + + def test_scan_for_server_property(self): + """Test GitClientscan_for_server using repo property""" + os.chdir(self.clone_dir) + self._gitcmd(['config', 'reviewboard.url', self.TESTSERVER]) + ri = self.client.get_repository_info() + + self.assertEqual(self.client.scan_for_server(ri), self.TESTSERVER) + + def test_diff_simple(self): + """Test GitClient simple diff case""" + diff = "diff --git a/foo.txt b/foo.txt\n" \ + "index 634b3e8ff85bada6f928841a9f2c505560840b3a..5e98e9540e1b741b5be24fcb33c40c1c8069c1fb 100644\n" \ + "--- a/foo.txt\n" \ + "+++ b/foo.txt\n" \ + "@@ -6,7 +6,4 @@ multa quoque et bello passus, dum conderet urbem,\n" \ + " inferretque deos Latio, genus unde Latinum,\n" \ + " Albanique patres, atque altae moenia Romae.\n" \ + " Musa, mihi causas memora, quo numine laeso,\n" \ + "-quidve dolens, regina deum tot volvere casus\n" \ + "-insignem pietate virum, tot adire labores\n" \ + "-impulerit. Tantaene animis caelestibus irae?\n" \ + " \n" + + os.chdir(self.clone_dir) + ri = self.client.get_repository_info() + + self._git_add_file_commit('foo.txt', FOO1, 'delete and modify stuff') + + self.assertEqual(self.client.diff(None), (diff, None)) + + def test_diff_simple_multiple(self): + """Test GitClient simple diff with multiple commits case""" + diff = "diff --git a/foo.txt b/foo.txt\n" \ + "index 634b3e8ff85bada6f928841a9f2c505560840b3a..63036ed3fcafe870d567a14dd5884f4fed70126c 100644\n" \ + "--- a/foo.txt\n" \ + "+++ b/foo.txt\n" \ + "@@ -1,12 +1,11 @@\n" \ + " ARMA virumque cano, Troiae qui primus ab oris\n" \ + "+ARMA virumque cano, Troiae qui primus ab oris\n" \ + " Italiam, fato profugus, Laviniaque venit\n" \ + " litora, multum ille et terris iactatus et alto\n" \ + " vi superum saevae memorem Iunonis ob iram;\n" \ + "-multa quoque et bello passus, dum conderet urbem,\n" \ + "+dum conderet urbem,\n" \ + " inferretque deos Latio, genus unde Latinum,\n" \ + " Albanique patres, atque altae moenia Romae.\n" \ + "+Albanique patres, atque altae moenia Romae.\n" \ + " Musa, mihi causas memora, quo numine laeso,\n" \ + "-quidve dolens, regina deum tot volvere casus\n" \ + "-insignem pietate virum, tot adire labores\n" \ + "-impulerit. Tantaene animis caelestibus irae?\n" \ + " \n" + + os.chdir(self.clone_dir) + ri = self.client.get_repository_info() + + self._git_add_file_commit('foo.txt', FOO1, 'commit 1') + self._git_add_file_commit('foo.txt', FOO2, 'commit 1') + self._git_add_file_commit('foo.txt', FOO3, 'commit 1') + + self.assertEqual(self.client.diff(None), (diff, None)) + + def test_diff_branch_diverge(self): + """Test GitClient diff with divergent branches""" + diff1 = "diff --git a/foo.txt b/foo.txt\n" \ + "index 634b3e8ff85bada6f928841a9f2c505560840b3a..e619c1387f5feb91f0ca83194650bfe4f6c2e347 100644\n" \ + "--- a/foo.txt\n" \ + "+++ b/foo.txt\n" \ + "@@ -1,4 +1,6 @@\n" \ + " ARMA virumque cano, Troiae qui primus ab oris\n" \ + "+ARMA virumque cano, Troiae qui primus ab oris\n" \ + "+ARMA virumque cano, Troiae qui primus ab oris\n" \ + " Italiam, fato profugus, Laviniaque venit\n" \ + " litora, multum ille et terris iactatus et alto\n" \ + " vi superum saevae memorem Iunonis ob iram;\n" \ + "@@ -6,7 +8,4 @@ multa quoque et bello passus, dum conderet urbem,\n" \ + " inferretque deos Latio, genus unde Latinum,\n" \ + " Albanique patres, atque altae moenia Romae.\n" \ + " Musa, mihi causas memora, quo numine laeso,\n" \ + "-quidve dolens, regina deum tot volvere casus\n" \ + "-insignem pietate virum, tot adire labores\n" \ + "-impulerit. Tantaene animis caelestibus irae?\n" \ + " \n" + + diff2 = "diff --git a/foo.txt b/foo.txt\n" \ + "index 634b3e8ff85bada6f928841a9f2c505560840b3a..5e98e9540e1b741b5be24fcb33c40c1c8069c1fb 100644\n" \ + "--- a/foo.txt\n" \ + "+++ b/foo.txt\n" \ + "@@ -6,7 +6,4 @@ multa quoque et bello passus, dum conderet urbem,\n" \ + " inferretque deos Latio, genus unde Latinum,\n" \ + " Albanique patres, atque altae moenia Romae.\n" \ + " Musa, mihi causas memora, quo numine laeso,\n" \ + "-quidve dolens, regina deum tot volvere casus\n" \ + "-insignem pietate virum, tot adire labores\n" \ + "-impulerit. Tantaene animis caelestibus irae?\n" \ + " \n" + + os.chdir(self.clone_dir) + + self._git_add_file_commit('foo.txt', FOO1, 'commit 1') + + self._gitcmd(['checkout', '-b', 'mybranch', '--track', 'origin/master']) + self._git_add_file_commit('foo.txt', FOO2, 'commit 2') + + ri = self.client.get_repository_info() + self.assertEqual(self.client.diff(None), (diff1, None)) + + self._gitcmd(['checkout', 'master']) + ri = self.client.get_repository_info() + self.assertEqual(self.client.diff(None), (diff2, None)) + + def test_diff_tracking_no_origin(self): + """Test GitClient diff with a tracking branch, but no origin remote""" + diff = "diff --git a/foo.txt b/foo.txt\n" \ + "index 634b3e8ff85bada6f928841a9f2c505560840b3a..5e98e9540e1b741b5be24fcb33c40c1c8069c1fb 100644\n" \ + "--- a/foo.txt\n" \ + "+++ b/foo.txt\n" \ + "@@ -6,7 +6,4 @@ multa quoque et bello passus, dum conderet urbem,\n" \ + " inferretque deos Latio, genus unde Latinum,\n" \ + " Albanique patres, atque altae moenia Romae.\n" \ + " Musa, mihi causas memora, quo numine laeso,\n" \ + "-quidve dolens, regina deum tot volvere casus\n" \ + "-insignem pietate virum, tot adire labores\n" \ + "-impulerit. Tantaene animis caelestibus irae?\n" \ + " \n" + + os.chdir(self.clone_dir) + + self._gitcmd(['remote', 'add', 'quux', self.git_dir]) + self._gitcmd(['fetch', 'quux']) + self._gitcmd(['checkout', '-b', 'mybranch', '--track', 'quux/master']) + self._git_add_file_commit('foo.txt', FOO1, 'delete and modify stuff') + + ri = self.client.get_repository_info() + + self.assertEqual(self.client.diff(None), (diff, None)) + + def test_diff_local_tracking(self): + """Test GitClient diff with a local tracking branch""" + diff = "diff --git a/foo.txt b/foo.txt\n" \ + "index 634b3e8ff85bada6f928841a9f2c505560840b3a..e619c1387f5feb91f0ca83194650bfe4f6c2e347 100644\n" \ + "--- a/foo.txt\n" \ + "+++ b/foo.txt\n" \ + "@@ -1,4 +1,6 @@\n" \ + " ARMA virumque cano, Troiae qui primus ab oris\n" \ + "+ARMA virumque cano, Troiae qui primus ab oris\n" \ + "+ARMA virumque cano, Troiae qui primus ab oris\n" \ + " Italiam, fato profugus, Laviniaque venit\n" \ + " litora, multum ille et terris iactatus et alto\n" \ + " vi superum saevae memorem Iunonis ob iram;\n" \ + "@@ -6,7 +8,4 @@ multa quoque et bello passus, dum conderet urbem,\n" \ + " inferretque deos Latio, genus unde Latinum,\n" \ + " Albanique patres, atque altae moenia Romae.\n" \ + " Musa, mihi causas memora, quo numine laeso,\n" \ + "-quidve dolens, regina deum tot volvere casus\n" \ + "-insignem pietate virum, tot adire labores\n" \ + "-impulerit. Tantaene animis caelestibus irae?\n" \ + " \n" + + os.chdir(self.clone_dir) + + self._git_add_file_commit('foo.txt', FOO1, 'commit 1') + + self._gitcmd(['checkout', '-b', 'mybranch', '--track', 'master']) + self._git_add_file_commit('foo.txt', FOO2, 'commit 2') + + ri = self.client.get_repository_info() + self.assertEqual(self.client.diff(None), (diff, None)) + + def test_diff_tracking_override(self): + """Test GitClient diff with option override for tracking branch""" + diff = "diff --git a/foo.txt b/foo.txt\n" \ + "index 634b3e8ff85bada6f928841a9f2c505560840b3a..5e98e9540e1b741b5be24fcb33c40c1c8069c1fb 100644\n" \ + "--- a/foo.txt\n" \ + "+++ b/foo.txt\n" \ + "@@ -6,7 +6,4 @@ multa quoque et bello passus, dum conderet urbem,\n" \ + " inferretque deos Latio, genus unde Latinum,\n" \ + " Albanique patres, atque altae moenia Romae.\n" \ + " Musa, mihi causas memora, quo numine laeso,\n" \ + "-quidve dolens, regina deum tot volvere casus\n" \ + "-insignem pietate virum, tot adire labores\n" \ + "-impulerit. Tantaene animis caelestibus irae?\n" \ + " \n" + + os.chdir(self.clone_dir) + rbtools.postreview.options.tracking = 'origin/master' + + self._gitcmd(['remote', 'add', 'bad', self.git_dir]) + self._gitcmd(['fetch', 'bad']) + self._gitcmd(['checkout', '-b', 'mybranch', '--track', 'bad/master']) + + self._git_add_file_commit('foo.txt', FOO1, 'commit 1') + + ri = self.client.get_repository_info() + self.assertEqual(self.client.diff(None), (diff, None)) + |