/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
6614.1.2 by Vincent Ladeuil
Fix assertNotEquals being deprecated by using assertNotEqual.
1
# Copyright (C) 2007-2011, 2016 Canonical Ltd
2617.5.1 by Kuno Meyer
Added direct unit tests for win32utils.glob_expand().
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
4183.7.1 by Sabin Iacob
update FSF mailing address
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
2617.5.1 by Kuno Meyer
Added direct unit tests for win32utils.glob_expand().
16
5241.2.1 by Robert Collins
Merge up from 2.0/2.1:
17
"""Tests for win32utils."""
18
2681.4.2 by Alexander Belchenko
test for get_app_path
19
import os
2617.5.4 by Kuno Meyer
Included feedback on initial patch.
20
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
21
from .. import (
4786.1.1 by John Arbash Meinel
Work on doing globbing, etc for all commands on Windows.
22
    osutils,
6362.2.6 by Martin Packman
Add tests for deprecated unicode wrapper functions in win32utils
23
    symbol_versioning,
4786.1.1 by John Arbash Meinel
Work on doing globbing, etc for all commands on Windows.
24
    tests,
25
    win32utils,
26
    )
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
27
from . import (
4505.2.4 by Alexander Belchenko
guard tests with UnicodeFilenameFeature.
28
    TestCase,
29
    TestCaseInTempDir,
30
    TestSkipped,
31
    )
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
32
from .features import backslashdir_feature
33
from ..win32utils import glob_expand, get_app_path
34
from . import (
5967.12.1 by Martin Pool
Move all test features into bzrlib.tests.features
35
    features,
36
    )
37
38
39
Win32RegistryFeature = features.ModuleAvailableFeature('_winreg')
40
CtypesFeature = features.ModuleAvailableFeature('ctypes')
41
Win32comShellFeature = features.ModuleAvailableFeature('win32com.shell')
42
Win32ApiFeature = features.ModuleAvailableFeature('win32api') 
2681.4.4 by Alexander Belchenko
test use Feature instead of TestSkipped
43
5314.1.2 by Jason Spashett
Adition of blank line for formatting.
44
2617.5.4 by Kuno Meyer
Included feedback on initial patch.
45
# Tests
46
# -----
2617.5.6 by Kuno Meyer
Incorporated feedback from the mailinglist.
47
2617.5.4 by Kuno Meyer
Included feedback on initial patch.
48
class TestWin32UtilsGlobExpand(TestCaseInTempDir):
2617.5.2 by Kuno Meyer
just reformatting
49
4789.20.1 by John Arbash Meinel
Updates to tests that were exercising filesystem globbing.
50
    _test_needs_features = []
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
51
2617.5.1 by Kuno Meyer
Added direct unit tests for win32utils.glob_expand().
52
    def test_empty_tree(self):
53
        self.build_tree([])
2617.5.2 by Kuno Meyer
just reformatting
54
        self._run_testset([
55
            [['a'], ['a']],
56
            [['?'], ['?']],
57
            [['*'], ['*']],
58
            [['a', 'a'], ['a', 'a']]])
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
59
4789.20.2 by John Arbash Meinel
Split the win32 globbing tests up a bit.
60
    def build_ascii_tree(self):
2617.5.1 by Kuno Meyer
Added direct unit tests for win32utils.glob_expand().
61
        self.build_tree(['a', 'a1', 'a2', 'a11', 'a.1',
62
                         'b', 'b1', 'b2', 'b3',
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
63
                         'c/', 'c/c1', 'c/c2',
2617.5.4 by Kuno Meyer
Included feedback on initial patch.
64
                         'd/', 'd/d1', 'd/d2', 'd/e/', 'd/e/e1'])
4789.20.2 by John Arbash Meinel
Split the win32 globbing tests up a bit.
65
66
    def build_unicode_tree(self):
5967.12.1 by Martin Pool
Move all test features into bzrlib.tests.features
67
        self.requireFeature(features.UnicodeFilenameFeature)
4789.20.2 by John Arbash Meinel
Split the win32 globbing tests up a bit.
68
        self.build_tree([u'\u1234', u'\u1234\u1234', u'\u1235/',
69
                         u'\u1235/\u1235'])
70
71
    def test_tree_ascii(self):
72
        """Checks the glob expansion and path separation char
73
        normalization"""
74
        self.build_ascii_tree()
2617.5.2 by Kuno Meyer
just reformatting
75
        self._run_testset([
76
            # no wildcards
2617.5.8 by Kuno Meyer
Extended tests for unicode chars outside of the iso-8859-* range
77
            [[u'a'], [u'a']],
78
            [[u'a', u'a' ], [u'a', u'a']],
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
79
2617.5.8 by Kuno Meyer
Extended tests for unicode chars outside of the iso-8859-* range
80
            [[u'd'], [u'd']],
81
            [[u'd/'], [u'd/']],
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
82
2617.5.2 by Kuno Meyer
just reformatting
83
            # wildcards
2617.5.8 by Kuno Meyer
Extended tests for unicode chars outside of the iso-8859-* range
84
            [[u'a*'], [u'a', u'a1', u'a2', u'a11', u'a.1']],
85
            [[u'?'], [u'a', u'b', u'c', u'd']],
86
            [[u'a?'], [u'a1', u'a2']],
87
            [[u'a??'], [u'a11', u'a.1']],
88
            [[u'b[1-2]'], [u'b1', u'b2']],
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
89
2617.5.8 by Kuno Meyer
Extended tests for unicode chars outside of the iso-8859-* range
90
            [[u'd/*'], [u'd/d1', u'd/d2', u'd/e']],
4789.20.2 by John Arbash Meinel
Split the win32 globbing tests up a bit.
91
            [[u'?/*'], [u'c/c1', u'c/c2', u'd/d1', u'd/d2', u'd/e']],
92
            [[u'*/*'], [u'c/c1', u'c/c2', u'd/d1', u'd/d2', u'd/e']],
93
            [[u'*/'], [u'c/', u'd/']],
94
            ])
95
96
    def test_backslash_globbing(self):
5241.2.1 by Robert Collins
Merge up from 2.0/2.1:
97
        self.requireFeature(backslashdir_feature)
4789.20.2 by John Arbash Meinel
Split the win32 globbing tests up a bit.
98
        self.build_ascii_tree()
99
        self._run_testset([
100
            [[u'd\\'], [u'd/']],
2617.5.8 by Kuno Meyer
Extended tests for unicode chars outside of the iso-8859-* range
101
            [[u'd\\*'], [u'd/d1', u'd/d2', u'd/e']],
102
            [[u'?\\*'], [u'c/c1', u'c/c2', u'd/d1', u'd/d2', u'd/e']],
103
            [[u'*\\*'], [u'c/c1', u'c/c2', u'd/d1', u'd/d2', u'd/e']],
4789.20.2 by John Arbash Meinel
Split the win32 globbing tests up a bit.
104
            [[u'*\\'], [u'c/', u'd/']],
105
            ])
106
107
    def test_case_insensitive_globbing(self):
5551.2.1 by Martin
Make case win32utils insensitive globbing tests skip more correctly to stop failures on OSX
108
        if os.path.normcase("AbC") == "AbC":
6622.4.1 by Martin
Use skipTest rather than deprecated skip method
109
            self.skipTest("Test requires case insensitive globbing function")
4789.20.2 by John Arbash Meinel
Split the win32 globbing tests up a bit.
110
        self.build_ascii_tree()
111
        self._run_testset([
112
            [[u'A'], [u'A']],
113
            [[u'A?'], [u'a1', u'a2']],
114
            ])
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
115
2617.5.8 by Kuno Meyer
Extended tests for unicode chars outside of the iso-8859-* range
116
    def test_tree_unicode(self):
2617.5.7 by Kuno Meyer
Fix for non-ASCII filenames
117
        """Checks behaviour with non-ascii filenames"""
4789.20.2 by John Arbash Meinel
Split the win32 globbing tests up a bit.
118
        self.build_unicode_tree()
2617.5.7 by Kuno Meyer
Fix for non-ASCII filenames
119
        self._run_testset([
120
            # no wildcards
2617.5.8 by Kuno Meyer
Extended tests for unicode chars outside of the iso-8859-* range
121
            [[u'\u1234'], [u'\u1234']],
122
            [[u'\u1235'], [u'\u1235']],
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
123
2617.5.8 by Kuno Meyer
Extended tests for unicode chars outside of the iso-8859-* range
124
            [[u'\u1235/'], [u'\u1235/']],
125
            [[u'\u1235/\u1235'], [u'\u1235/\u1235']],
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
126
2617.5.7 by Kuno Meyer
Fix for non-ASCII filenames
127
            # wildcards
2617.5.8 by Kuno Meyer
Extended tests for unicode chars outside of the iso-8859-* range
128
            [[u'?'], [u'\u1234', u'\u1235']],
129
            [[u'*'], [u'\u1234', u'\u1234\u1234', u'\u1235']],
130
            [[u'\u1234*'], [u'\u1234', u'\u1234\u1234']],
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
131
2617.5.8 by Kuno Meyer
Extended tests for unicode chars outside of the iso-8859-* range
132
            [[u'\u1235/?'], [u'\u1235/\u1235']],
133
            [[u'\u1235/*'], [u'\u1235/\u1235']],
4789.20.2 by John Arbash Meinel
Split the win32 globbing tests up a bit.
134
            [[u'?/'], [u'\u1235/']],
135
            [[u'*/'], [u'\u1235/']],
136
            [[u'?/?'], [u'\u1235/\u1235']],
137
            [[u'*/*'], [u'\u1235/\u1235']],
138
            ])
139
140
    def test_unicode_backslashes(self):
5241.2.1 by Robert Collins
Merge up from 2.0/2.1:
141
        self.requireFeature(backslashdir_feature)
4789.20.2 by John Arbash Meinel
Split the win32 globbing tests up a bit.
142
        self.build_unicode_tree()
143
        self._run_testset([
144
            # no wildcards
4789.20.3 by John Arbash Meinel
Use the right case sensitivity feature (cicp, not just ci).
145
            [[u'\u1235\\'], [u'\u1235/']],
146
            [[u'\u1235\\\u1235'], [u'\u1235/\u1235']],
2617.5.8 by Kuno Meyer
Extended tests for unicode chars outside of the iso-8859-* range
147
            [[u'\u1235\\?'], [u'\u1235/\u1235']],
148
            [[u'\u1235\\*'], [u'\u1235/\u1235']],
149
            [[u'?\\'], [u'\u1235/']],
150
            [[u'*\\'], [u'\u1235/']],
151
            [[u'?\\?'], [u'\u1235/\u1235']],
4789.20.2 by John Arbash Meinel
Split the win32 globbing tests up a bit.
152
            [[u'*\\*'], [u'\u1235/\u1235']],
153
            ])
2617.5.7 by Kuno Meyer
Fix for non-ASCII filenames
154
2617.5.1 by Kuno Meyer
Added direct unit tests for win32utils.glob_expand().
155
    def _run_testset(self, testset):
156
        for pattern, expected in testset:
157
            result = glob_expand(pattern)
158
            expected.sort()
159
            result.sort()
160
            self.assertEqual(expected, result, 'pattern %s' % pattern)
2617.5.2 by Kuno Meyer
just reformatting
161
2681.4.2 by Alexander Belchenko
test for get_app_path
162
163
class TestAppPaths(TestCase):
164
2681.4.4 by Alexander Belchenko
test use Feature instead of TestSkipped
165
    _test_needs_features = [Win32RegistryFeature]
166
2681.4.2 by Alexander Belchenko
test for get_app_path
167
    def test_iexplore(self):
168
        # typical windows users should have IE installed
169
        for a in ('iexplore', 'iexplore.exe'):
170
            p = get_app_path(a)
171
            d, b = os.path.split(p)
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
172
            self.assertEqual('iexplore.exe', b.lower())
6614.1.2 by Vincent Ladeuil
Fix assertNotEquals being deprecated by using assertNotEqual.
173
            self.assertNotEqual('', d)
2681.4.2 by Alexander Belchenko
test for get_app_path
174
4476.2.1 by Alexander Belchenko
win32utils.py: get_app_path() can read path for wordpad.exe (data type_id is REG_EXPAND_SZ).
175
    def test_wordpad(self):
176
        # typical windows users should have wordpad in the system
177
        # but there is problem: its path has the format REG_EXPAND_SZ
178
        # so naive attempt to get the path is not working
5314.1.1 by Jason Spashett
Change test_win32utils.py so as not to fail tests if win32api module is not present.
179
        self.requireFeature(Win32ApiFeature)
4476.2.1 by Alexander Belchenko
win32utils.py: get_app_path() can read path for wordpad.exe (data type_id is REG_EXPAND_SZ).
180
        for a in ('wordpad', 'wordpad.exe'):
181
            p = get_app_path(a)
182
            d, b = os.path.split(p)
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
183
            self.assertEqual('wordpad.exe', b.lower())
6614.1.2 by Vincent Ladeuil
Fix assertNotEquals being deprecated by using assertNotEqual.
184
            self.assertNotEqual('', d)
4476.2.1 by Alexander Belchenko
win32utils.py: get_app_path() can read path for wordpad.exe (data type_id is REG_EXPAND_SZ).
185
2681.4.2 by Alexander Belchenko
test for get_app_path
186
    def test_not_existing(self):
187
        p = get_app_path('not-existing')
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
188
        self.assertEqual('not-existing', p)
3638.4.1 by Mark Hammond
Add win32utils.get_local_appdata_location() so bzr and plugins can
189
3638.4.3 by Mark Hammond
cleanup tests, rationalize path checking etc.
190
3638.4.1 by Mark Hammond
Add win32utils.get_local_appdata_location() so bzr and plugins can
191
class TestLocationsCtypes(TestCase):
192
6658.6.1 by Martin
Remove winver, win98 support code, and deprecated code
193
    _test_needs_features = [CtypesFeature, features.win32_feature]
3638.4.1 by Mark Hammond
Add win32utils.get_local_appdata_location() so bzr and plugins can
194
3638.4.3 by Mark Hammond
cleanup tests, rationalize path checking etc.
195
    def assertPathsEqual(self, p1, p2):
196
        # TODO: The env var values in particular might return the "short"
197
        # version (ie, "C:\DOCUME~1\...").  Its even possible the returned
198
        # values will differ only by case - handle these situations as we
199
        # come across them.
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
200
        self.assertEqual(p1, p2)
3638.4.3 by Mark Hammond
cleanup tests, rationalize path checking etc.
201
3638.4.1 by Mark Hammond
Add win32utils.get_local_appdata_location() so bzr and plugins can
202
    def test_appdata_not_using_environment(self):
203
        # Test that we aren't falling back to the environment
3638.4.3 by Mark Hammond
cleanup tests, rationalize path checking etc.
204
        first = win32utils.get_appdata_location()
5570.3.6 by Vincent Ladeuil
Get rid of all _captureVar() calls, no test failures, pfew.
205
        self.overrideEnv("APPDATA", None)
3638.4.3 by Mark Hammond
cleanup tests, rationalize path checking etc.
206
        self.assertPathsEqual(first, win32utils.get_appdata_location())
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
207
3638.4.1 by Mark Hammond
Add win32utils.get_local_appdata_location() so bzr and plugins can
208
    def test_appdata_matches_environment(self):
209
        # Typically the APPDATA environment variable will match
210
        # get_appdata_location
3638.4.3 by Mark Hammond
cleanup tests, rationalize path checking etc.
211
        # XXX - See bug 262874, which asserts the correct encoding is 'mbcs',
212
        encoding = osutils.get_user_encoding()
3638.4.6 by Mark Hammond
Skip the environment checks when APPDATA isn't in the environment.
213
        env_val = os.environ.get("APPDATA", None)
214
        if not env_val:
215
            raise TestSkipped("No APPDATA environment variable exists")
3638.4.3 by Mark Hammond
cleanup tests, rationalize path checking etc.
216
        self.assertPathsEqual(win32utils.get_appdata_location(),
3638.4.6 by Mark Hammond
Skip the environment checks when APPDATA isn't in the environment.
217
                              env_val.decode(encoding))
3638.4.1 by Mark Hammond
Add win32utils.get_local_appdata_location() so bzr and plugins can
218
219
    def test_local_appdata_not_using_environment(self):
220
        # Test that we aren't falling back to the environment
3638.4.3 by Mark Hammond
cleanup tests, rationalize path checking etc.
221
        first = win32utils.get_local_appdata_location()
5570.3.6 by Vincent Ladeuil
Get rid of all _captureVar() calls, no test failures, pfew.
222
        self.overrideEnv("LOCALAPPDATA", None)
3638.4.3 by Mark Hammond
cleanup tests, rationalize path checking etc.
223
        self.assertPathsEqual(first, win32utils.get_local_appdata_location())
3638.4.1 by Mark Hammond
Add win32utils.get_local_appdata_location() so bzr and plugins can
224
225
    def test_local_appdata_matches_environment(self):
226
        # LOCALAPPDATA typically only exists on Vista, so we only attempt to
227
        # compare when it exists.
3638.4.3 by Mark Hammond
cleanup tests, rationalize path checking etc.
228
        lad = win32utils.get_local_appdata_location()
3638.4.1 by Mark Hammond
Add win32utils.get_local_appdata_location() so bzr and plugins can
229
        env = os.environ.get("LOCALAPPDATA")
230
        if env:
3638.4.3 by Mark Hammond
cleanup tests, rationalize path checking etc.
231
            # XXX - See bug 262874, which asserts the correct encoding is 'mbcs'
232
            encoding = osutils.get_user_encoding()
233
            self.assertPathsEqual(lad, env.decode(encoding))
234
235
236
class TestLocationsPywin32(TestLocationsCtypes):
3638.4.1 by Mark Hammond
Add win32utils.get_local_appdata_location() so bzr and plugins can
237
238
    _test_needs_features = [Win32comShellFeature]
239
240
    def setUp(self):
3638.4.3 by Mark Hammond
cleanup tests, rationalize path checking etc.
241
        super(TestLocationsPywin32, self).setUp()
242
        # We perform the exact same tests after disabling the use of ctypes.
243
        # This causes the implementation to fall back to pywin32.
4985.1.5 by Vincent Ladeuil
Deploying the new overrideAttr facility further reduces the complexity
244
        self.overrideAttr(win32utils, 'has_ctypes', False)
245
        # FIXME: this should be done by parametrization -- vila 100123
4505.2.1 by Alexander Belchenko
Set hidden attribute on .bzr directory below unicode path should never fail with error. The operation should succeed even if bzr unable to set the attribute. (related to bug #335362).
246
247
248
class TestSetHidden(TestCaseInTempDir):
249
4505.2.3 by Alexander Belchenko
added direct test for absolute path.
250
    def test_unicode_dir(self):
251
        # we should handle unicode paths without errors
5967.12.1 by Martin Pool
Move all test features into bzrlib.tests.features
252
        self.requireFeature(features.UnicodeFilenameFeature)
4505.2.3 by Alexander Belchenko
added direct test for absolute path.
253
        os.mkdir(u'\u1234')
254
        win32utils.set_file_attr_hidden(u'\u1234')
255
256
    def test_dot_bzr_in_unicode_dir(self):
4505.2.1 by Alexander Belchenko
Set hidden attribute on .bzr directory below unicode path should never fail with error. The operation should succeed even if bzr unable to set the attribute. (related to bug #335362).
257
        # we should not raise traceback if we try to set hidden attribute
258
        # on .bzr directory below unicode path
5967.12.1 by Martin Pool
Move all test features into bzrlib.tests.features
259
        self.requireFeature(features.UnicodeFilenameFeature)
4505.2.3 by Alexander Belchenko
added direct test for absolute path.
260
        os.makedirs(u'\u1234\\.bzr')
261
        path = osutils.abspath(u'\u1234\\.bzr')
262
        win32utils.set_file_attr_hidden(path)
4786.1.1 by John Arbash Meinel
Work on doing globbing, etc for all commands on Windows.
263
264
265
class Test_CommandLineToArgv(tests.TestCaseInTempDir):
266
5274.4.12 by Martin
Change interface of _command_line_to_argv so old tests can still be used with new stripping logic
267
    def assertCommandLine(self, expected, line, argv=None,
268
            single_quotes_allowed=False):
4789.3.2 by Vincent Ladeuil
Add a comment precising why we sort the results of _command_line_to_argv.
269
        # Strictly speaking we should respect parameter order versus glob
270
        # expansions, but it's not really worth the effort here
5274.4.12 by Martin
Change interface of _command_line_to_argv so old tests can still be used with new stripping logic
271
        if argv is None:
272
            argv = [line]
273
        argv = win32utils._command_line_to_argv(line, argv,
4913.5.11 by Gordon Tyler
Added optional single quote support to UnicodeShlex and thus command_line_to_argv (defaults to disabled).
274
                single_quotes_allowed=single_quotes_allowed)
275
        self.assertEqual(expected, sorted(argv))
4786.1.1 by John Arbash Meinel
Work on doing globbing, etc for all commands on Windows.
276
277
    def test_glob_paths(self):
278
        self.build_tree(['a/', 'a/b.c', 'a/c.c', 'a/c.h'])
279
        self.assertCommandLine([u'a/b.c', u'a/c.c'], 'a/*.c')
280
        self.build_tree(['b/', 'b/b.c', 'b/d.c', 'b/d.h'])
281
        self.assertCommandLine([u'a/b.c', u'b/b.c'], '*/b.c')
282
        self.assertCommandLine([u'a/b.c', u'a/c.c', u'b/b.c', u'b/d.c'],
283
                               '*/*.c')
284
        # Bash style, just pass through the argument if nothing matches
285
        self.assertCommandLine([u'*/*.qqq'], '*/*.qqq')
286
287
    def test_quoted_globs(self):
288
        self.build_tree(['a/', 'a/b.c', 'a/c.c', 'a/c.h'])
289
        self.assertCommandLine([u'a/*.c'], '"a/*.c"')
4789.1.1 by Alexander Belchenko
In standard windows shell single quote is not supported as quote. Restored standard windows behavior.
290
        self.assertCommandLine([u"'a/*.c'"], "'a/*.c'")
4913.5.11 by Gordon Tyler
Added optional single quote support to UnicodeShlex and thus command_line_to_argv (defaults to disabled).
291
        self.assertCommandLine([u'a/*.c'], "'a/*.c'",
292
            single_quotes_allowed=True)
4786.1.2 by John Arbash Meinel
Refactor the glob_expand code a bit, making the inner function more reusable.
293
294
    def test_slashes_changed(self):
4818.1.1 by John Arbash Meinel
Fix bug #485771. Only change '/' to '/' when expanding globs.
295
        # Quoting doesn't change the supplied args
296
        self.assertCommandLine([u'a\\*.c'], '"a\\*.c"')
4913.5.11 by Gordon Tyler
Added optional single quote support to UnicodeShlex and thus command_line_to_argv (defaults to disabled).
297
        self.assertCommandLine([u'a\\*.c'], "'a\\*.c'",
298
            single_quotes_allowed=True)
4818.1.1 by John Arbash Meinel
Fix bug #485771. Only change '/' to '/' when expanding globs.
299
        # Expands the glob, but nothing matches, swaps slashes
4786.1.2 by John Arbash Meinel
Refactor the glob_expand code a bit, making the inner function more reusable.
300
        self.assertCommandLine([u'a/*.c'], 'a\\*.c')
4818.1.1 by John Arbash Meinel
Fix bug #485771. Only change '/' to '/' when expanding globs.
301
        self.assertCommandLine([u'a/?.c'], 'a\\?.c')
302
        # No glob, doesn't touch slashes
303
        self.assertCommandLine([u'a\\foo.c'], 'a\\foo.c')
4789.1.1 by Alexander Belchenko
In standard windows shell single quote is not supported as quote. Restored standard windows behavior.
304
4913.5.11 by Gordon Tyler
Added optional single quote support to UnicodeShlex and thus command_line_to_argv (defaults to disabled).
305
    def test_single_quote_support(self):
4789.1.1 by Alexander Belchenko
In standard windows shell single quote is not supported as quote. Restored standard windows behavior.
306
        self.assertCommandLine(["add", "let's-do-it.txt"],
5274.4.12 by Martin
Change interface of _command_line_to_argv so old tests can still be used with new stripping logic
307
            "add let's-do-it.txt",
308
            ["add", "let's-do-it.txt"])
309
        self.expectFailure("Using single quotes breaks trimming from argv",
310
            self.assertCommandLine, ["add", "lets do it.txt"],
311
            "add 'lets do it.txt'", ["add", "'lets", "do", "it.txt'"],
312
            single_quotes_allowed=True)
4797.3.20 by John Arbash Meinel
Include the glob updates.
313
4789.20.3 by John Arbash Meinel
Use the right case sensitivity feature (cicp, not just ci).
314
    def test_case_insensitive_globs(self):
5551.2.1 by Martin
Make case win32utils insensitive globbing tests skip more correctly to stop failures on OSX
315
        if os.path.normcase("AbC") == "AbC":
6622.4.1 by Martin
Use skipTest rather than deprecated skip method
316
            self.skipTest("Test requires case insensitive globbing function")
4789.20.3 by John Arbash Meinel
Use the right case sensitivity feature (cicp, not just ci).
317
        self.build_tree(['a/', 'a/b.c', 'a/c.c', 'a/c.h'])
318
        self.assertCommandLine([u'A/b.c'], 'A/B*')
319
320
    def test_backslashes(self):
5241.2.1 by Robert Collins
Merge up from 2.0/2.1:
321
        self.requireFeature(backslashdir_feature)
4789.20.3 by John Arbash Meinel
Use the right case sensitivity feature (cicp, not just ci).
322
        self.build_tree(['a/', 'a/b.c', 'a/c.c', 'a/c.h'])
323
        self.assertCommandLine([u'a/b.c'], 'a\\b*')
5274.4.13 by Martin
Add test for lp:587868 to win32 commandline tests
324
325
    def test_with_pdb(self):
326
        """Check stripping Python arguments before bzr script per lp:587868"""
327
        self.assertCommandLine([u"rocks"], "-m pdb rocks", ["rocks"])
328
        self.build_tree(['d/', 'd/f1', 'd/f2'])
329
        self.assertCommandLine([u"rm", u"x*"], "-m pdb rm x*", ["rm", u"x*"])
330
        self.assertCommandLine([u"add", u"d/f1", u"d/f2"], "-m pdb add d/*",
331
            ["add", u"d/*"])
6339.2.1 by Martin Packman
Add wrapper for GetEnvironmentVariableW on windows for unicode environ access
332
333
334
class TestGetEnvironUnicode(tests.TestCase):
335
    """Tests for accessing the environment via the windows wide api"""
336
337
    _test_needs_features = [CtypesFeature, features.win32_feature]
338
339
    def setUp(self):
340
        super(TestGetEnvironUnicode, self).setUp()
341
        self.overrideEnv("TEST", "1")
342
343
    def test_get(self):
344
        """In the normal case behaves the same as os.environ access"""
345
        self.assertEqual("1", win32utils.get_environ_unicode("TEST"))
346
347
    def test_unset(self):
348
        """A variable not present in the environment gives None by default"""
349
        del os.environ["TEST"]
350
        self.assertIs(None, win32utils.get_environ_unicode("TEST"))
351
352
    def test_unset_default(self):
353
        """A variable not present in the environment gives passed default"""
354
        del os.environ["TEST"]
355
        self.assertIs("a", win32utils.get_environ_unicode("TEST", "a"))
356
357
    def test_unicode(self):
358
        """A non-ascii variable is returned as unicode"""
359
        unicode_val = u"\xa7" # non-ascii character present in many encodings
360
        try:
361
            bytes_val = unicode_val.encode(osutils.get_user_encoding())
362
        except UnicodeEncodeError:
6622.4.1 by Martin
Use skipTest rather than deprecated skip method
363
            self.skipTest("Couldn't encode non-ascii string for environ")
6339.2.1 by Martin Packman
Add wrapper for GetEnvironmentVariableW on windows for unicode environ access
364
        os.environ["TEST"] = bytes_val
365
        self.assertEqual(unicode_val, win32utils.get_environ_unicode("TEST"))
366
367
    def test_long(self):
368
        """A variable bigger than heuristic buffer size is still accessible"""
369
        big_val = "x" * (2<<10)
370
        os.environ["TEST"] = big_val
371
        self.assertEqual(big_val, win32utils.get_environ_unicode("TEST"))
372
373
    def test_unexpected_error(self):
374
        """An error from the underlying platform function is propogated"""
375
        ERROR_INVALID_PARAMETER = 87
376
        SetLastError = win32utils.ctypes.windll.kernel32.SetLastError
377
        def failer(*args, **kwargs):
378
            SetLastError(ERROR_INVALID_PARAMETER)
379
            return 0
6339.2.2 by Martin Packman
Variable name changes and docstring fix suggested by vila in review
380
        self.overrideAttr(win32utils.get_environ_unicode, "_c_function",
381
            failer)
6339.2.1 by Martin Packman
Add wrapper for GetEnvironmentVariableW on windows for unicode environ access
382
        e = self.assertRaises(WindowsError,
383
            win32utils.get_environ_unicode, "TEST")
384
        self.assertEqual(e.winerror, ERROR_INVALID_PARAMETER)