~bzr-pqm/bzr/bzr.dev

5321.1.69 by Gordon Tyler
Fixed line-endings to be Unix.
1
# Copyright (C) 2010 Canonical Ltd
2
#
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License as published by
5
# the Free Software Foundation; either version 2 of the License, or
6
# (at your option) any later version.
7
#
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
# GNU General Public License for more details.
12
#
13
# You should have received a copy of the GNU General Public License
14
# along with this program; if not, write to the Free Software
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
17
import os
18
import sys
5321.1.107 by Gordon Tyler
Fixed is_available to properly test for executable-ness and added a test for this.
19
import tempfile
5321.1.69 by Gordon Tyler
Fixed line-endings to be Unix.
20
21
from bzrlib import (
22
    mergetools,
23
    tests
24
)
25
26
5321.1.116 by Gordon Tyler
Simplified mergetools module down to functions which deal with command lines -- no MergeTool class.
27
class TestFilenameSubstitution(tests.TestCaseInTempDir):
28
29
    def test_simple_filename(self):
30
        cmd_list = ['kdiff3', '{base}', '{this}', '{other}', '-o', '{result}']
31
        args, tmpfile = mergetools._subst_filename(cmd_list, 'test.txt')
5321.1.69 by Gordon Tyler
Fixed line-endings to be Unix.
32
        self.assertEqual(
33
            ['kdiff3',
34
             'test.txt.BASE',
35
             'test.txt.THIS',
36
             'test.txt.OTHER',
37
             '-o',
38
             'test.txt'],
5321.1.116 by Gordon Tyler
Simplified mergetools module down to functions which deal with command lines -- no MergeTool class.
39
            args)
6511.2.1 by Jelmer Vernooij
Remove some unused imports.
40
5321.1.116 by Gordon Tyler
Simplified mergetools module down to functions which deal with command lines -- no MergeTool class.
41
    def test_spaces(self):
42
        cmd_list = ['kdiff3', '{base}', '{this}', '{other}', '-o', '{result}']
43
        args, tmpfile = mergetools._subst_filename(cmd_list,
44
                                                   'file with space.txt')
45
        self.assertEqual(
46
            ['kdiff3',
47
             'file with space.txt.BASE',
48
             'file with space.txt.THIS',
49
             'file with space.txt.OTHER',
50
             '-o',
51
             'file with space.txt'],
52
            args)
53
54
    def test_spaces_and_quotes(self):
55
        cmd_list = ['kdiff3', '{base}', '{this}', '{other}', '-o', '{result}']
56
        args, tmpfile = mergetools._subst_filename(cmd_list,
57
            'file with "space and quotes".txt')
58
        self.assertEqual(
59
            ['kdiff3',
60
             'file with "space and quotes".txt.BASE',
61
             'file with "space and quotes".txt.THIS',
62
             'file with "space and quotes".txt.OTHER',
63
             '-o',
64
             'file with "space and quotes".txt'],
65
            args)
66
67
    def test_tempfile(self):
5321.1.69 by Gordon Tyler
Fixed line-endings to be Unix.
68
        self.build_tree(('test.txt', 'test.txt.BASE', 'test.txt.THIS',
69
                         'test.txt.OTHER'))
5321.1.116 by Gordon Tyler
Simplified mergetools module down to functions which deal with command lines -- no MergeTool class.
70
        cmd_list = ['some_tool', '{this_temp}']
71
        args, tmpfile = mergetools._subst_filename(cmd_list, 'test.txt')
5784.1.3 by Martin Pool
Switch away from using failUnlessExists and failIfExists
72
        self.assertPathExists(tmpfile)
5321.1.116 by Gordon Tyler
Simplified mergetools module down to functions which deal with command lines -- no MergeTool class.
73
        os.remove(tmpfile)
74
75
76
class TestCheckAvailability(tests.TestCaseInTempDir):
77
78
    def test_full_path(self):
79
        self.assertTrue(mergetools.check_availability(sys.executable))
80
81
    def test_exe_on_path(self):
6437.44.1 by Gordon Tyler
Backport of fix for bug 939605 to bzr 2.5 series.
82
        self.assertTrue(mergetools.check_availability('python'))
5321.1.116 by Gordon Tyler
Simplified mergetools module down to functions which deal with command lines -- no MergeTool class.
83
84
    def test_nonexistent(self):
85
        self.assertFalse(mergetools.check_availability('DOES NOT EXIST'))
86
87
    def test_non_executable(self):
5321.1.107 by Gordon Tyler
Fixed is_available to properly test for executable-ness and added a test for this.
88
        f, name = tempfile.mkstemp()
89
        try:
90
            self.log('temp filename: %s', name)
5321.1.116 by Gordon Tyler
Simplified mergetools module down to functions which deal with command lines -- no MergeTool class.
91
            self.assertFalse(mergetools.check_availability(name))
5321.1.107 by Gordon Tyler
Fixed is_available to properly test for executable-ness and added a test for this.
92
        finally:
93
            os.close(f)
94
            os.unlink(name)
5321.1.116 by Gordon Tyler
Simplified mergetools module down to functions which deal with command lines -- no MergeTool class.
95
96
97
class TestInvoke(tests.TestCaseInTempDir):
98
    def setUp(self):
99
        super(tests.TestCaseInTempDir, self).setUp()
100
        self._exe = None
101
        self._args = None
102
        self.build_tree_contents((
103
            ('test.txt', 'stuff'),
104
            ('test.txt.BASE', 'base stuff'),
105
            ('test.txt.THIS', 'this stuff'),
106
            ('test.txt.OTHER', 'other stuff'),
107
        ))
6511.2.1 by Jelmer Vernooij
Remove some unused imports.
108
6437.44.1 by Gordon Tyler
Backport of fix for bug 939605 to bzr 2.5 series.
109
    def test_invoke_expands_exe_path(self):
110
        self.overrideEnv('PATH', os.path.dirname(sys.executable))
111
        def dummy_invoker(exe, args, cleanup):
112
            self._exe = exe
113
            self._args = args
114
            cleanup(0)
115
            return 0
116
        command = '%s {result}' % os.path.basename(sys.executable)
117
        retcode = mergetools.invoke(command, 'test.txt', dummy_invoker)
118
        self.assertEqual(0, retcode)
119
        self.assertEqual(sys.executable, self._exe)
120
        self.assertEqual(['test.txt'], self._args)
6511.2.1 by Jelmer Vernooij
Remove some unused imports.
121
5321.1.116 by Gordon Tyler
Simplified mergetools module down to functions which deal with command lines -- no MergeTool class.
122
    def test_success(self):
123
        def dummy_invoker(exe, args, cleanup):
124
            self._exe = exe
125
            self._args = args
126
            cleanup(0)
127
            return 0
128
        retcode = mergetools.invoke('tool {result}', 'test.txt', dummy_invoker)
129
        self.assertEqual(0, retcode)
130
        self.assertEqual('tool', self._exe)
131
        self.assertEqual(['test.txt'], self._args)
6511.2.1 by Jelmer Vernooij
Remove some unused imports.
132
5321.1.116 by Gordon Tyler
Simplified mergetools module down to functions which deal with command lines -- no MergeTool class.
133
    def test_failure(self):
134
        def dummy_invoker(exe, args, cleanup):
135
            self._exe = exe
136
            self._args = args
137
            cleanup(1)
138
            return 1
139
        retcode = mergetools.invoke('tool {result}', 'test.txt', dummy_invoker)
140
        self.assertEqual(1, retcode)
141
        self.assertEqual('tool', self._exe)
142
        self.assertEqual(['test.txt'], self._args)
143
144
    def test_success_tempfile(self):
145
        def dummy_invoker(exe, args, cleanup):
146
            self._exe = exe
147
            self._args = args
5784.1.3 by Martin Pool
Switch away from using failUnlessExists and failIfExists
148
            self.assertPathExists(args[0])
5321.1.116 by Gordon Tyler
Simplified mergetools module down to functions which deal with command lines -- no MergeTool class.
149
            f = open(args[0], 'wt')
150
            f.write('temp stuff')
151
            f.close()
152
            cleanup(0)
153
            return 0
154
        retcode = mergetools.invoke('tool {this_temp}', 'test.txt',
155
                                    dummy_invoker)
156
        self.assertEqual(0, retcode)
157
        self.assertEqual('tool', self._exe)
5784.1.3 by Martin Pool
Switch away from using failUnlessExists and failIfExists
158
        self.assertPathDoesNotExist(self._args[0])
5321.1.116 by Gordon Tyler
Simplified mergetools module down to functions which deal with command lines -- no MergeTool class.
159
        self.assertFileEqual('temp stuff', 'test.txt')
6511.2.1 by Jelmer Vernooij
Remove some unused imports.
160
5321.1.116 by Gordon Tyler
Simplified mergetools module down to functions which deal with command lines -- no MergeTool class.
161
    def test_failure_tempfile(self):
162
        def dummy_invoker(exe, args, cleanup):
163
            self._exe = exe
164
            self._args = args
5784.1.3 by Martin Pool
Switch away from using failUnlessExists and failIfExists
165
            self.assertPathExists(args[0])
5321.1.116 by Gordon Tyler
Simplified mergetools module down to functions which deal with command lines -- no MergeTool class.
166
            self.log(repr(args))
167
            f = open(args[0], 'wt')
168
            self.log(repr(f))
169
            f.write('temp stuff')
170
            f.close()
171
            cleanup(1)
172
            return 1
173
        retcode = mergetools.invoke('tool {this_temp}', 'test.txt',
174
                                    dummy_invoker)
175
        self.assertEqual(1, retcode)
176
        self.assertEqual('tool', self._exe)
177
        self.assertFileEqual('stuff', 'test.txt')