/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,
23
    tests,
24
    win32utils,
25
    )
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
26
from . import (
4505.2.4 by Alexander Belchenko
guard tests with UnicodeFilenameFeature.
27
    TestCase,
28
    TestCaseInTempDir,
29
    TestSkipped,
30
    )
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
31
from .features import backslashdir_feature
32
from ..win32utils import glob_expand, get_app_path
33
from . import (
5967.12.1 by Martin Pool
Move all test features into bzrlib.tests.features
34
    features,
35
    )
36
37
38
Win32RegistryFeature = features.ModuleAvailableFeature('_winreg')
39
CtypesFeature = features.ModuleAvailableFeature('ctypes')
40
Win32comShellFeature = features.ModuleAvailableFeature('win32com.shell')
7143.15.2 by Jelmer Vernooij
Run autopep8.
41
Win32ApiFeature = features.ModuleAvailableFeature('win32api')
2681.4.4 by Alexander Belchenko
test use Feature instead of TestSkipped
42
5314.1.2 by Jason Spashett
Adition of blank line for formatting.
43
2617.5.4 by Kuno Meyer
Included feedback on initial patch.
44
# Tests
45
# -----
2617.5.6 by Kuno Meyer
Incorporated feedback from the mailinglist.
46
2617.5.4 by Kuno Meyer
Included feedback on initial patch.
47
class TestWin32UtilsGlobExpand(TestCaseInTempDir):
2617.5.2 by Kuno Meyer
just reformatting
48
4789.20.1 by John Arbash Meinel
Updates to tests that were exercising filesystem globbing.
49
    _test_needs_features = []
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
50
2617.5.1 by Kuno Meyer
Added direct unit tests for win32utils.glob_expand().
51
    def test_empty_tree(self):
52
        self.build_tree([])
2617.5.2 by Kuno Meyer
just reformatting
53
        self._run_testset([
54
            [['a'], ['a']],
55
            [['?'], ['?']],
56
            [['*'], ['*']],
57
            [['a', 'a'], ['a', 'a']]])
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
58
4789.20.2 by John Arbash Meinel
Split the win32 globbing tests up a bit.
59
    def build_ascii_tree(self):
2617.5.1 by Kuno Meyer
Added direct unit tests for win32utils.glob_expand().
60
        self.build_tree(['a', 'a1', 'a2', 'a11', 'a.1',
61
                         'b', 'b1', 'b2', 'b3',
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
62
                         'c/', 'c/c1', 'c/c2',
2617.5.4 by Kuno Meyer
Included feedback on initial patch.
63
                         '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.
64
65
    def build_unicode_tree(self):
5967.12.1 by Martin Pool
Move all test features into bzrlib.tests.features
66
        self.requireFeature(features.UnicodeFilenameFeature)
4789.20.2 by John Arbash Meinel
Split the win32 globbing tests up a bit.
67
        self.build_tree([u'\u1234', u'\u1234\u1234', u'\u1235/',
68
                         u'\u1235/\u1235'])
69
70
    def test_tree_ascii(self):
71
        """Checks the glob expansion and path separation char
72
        normalization"""
73
        self.build_ascii_tree()
2617.5.2 by Kuno Meyer
just reformatting
74
        self._run_testset([
75
            # no wildcards
2617.5.8 by Kuno Meyer
Extended tests for unicode chars outside of the iso-8859-* range
76
            [[u'a'], [u'a']],
7143.15.2 by Jelmer Vernooij
Run autopep8.
77
            [[u'a', u'a'], [u'a', u'a']],
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
78
2617.5.8 by Kuno Meyer
Extended tests for unicode chars outside of the iso-8859-* range
79
            [[u'd'], [u'd']],
80
            [[u'd/'], [u'd/']],
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
81
2617.5.2 by Kuno Meyer
just reformatting
82
            # wildcards
2617.5.8 by Kuno Meyer
Extended tests for unicode chars outside of the iso-8859-* range
83
            [[u'a*'], [u'a', u'a1', u'a2', u'a11', u'a.1']],
84
            [[u'?'], [u'a', u'b', u'c', u'd']],
85
            [[u'a?'], [u'a1', u'a2']],
86
            [[u'a??'], [u'a11', u'a.1']],
87
            [[u'b[1-2]'], [u'b1', u'b2']],
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
88
2617.5.8 by Kuno Meyer
Extended tests for unicode chars outside of the iso-8859-* range
89
            [[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.
90
            [[u'?/*'], [u'c/c1', u'c/c2', u'd/d1', u'd/d2', u'd/e']],
91
            [[u'*/*'], [u'c/c1', u'c/c2', u'd/d1', u'd/d2', u'd/e']],
92
            [[u'*/'], [u'c/', u'd/']],
93
            ])
94
95
    def test_backslash_globbing(self):
5241.2.1 by Robert Collins
Merge up from 2.0/2.1:
96
        self.requireFeature(backslashdir_feature)
4789.20.2 by John Arbash Meinel
Split the win32 globbing tests up a bit.
97
        self.build_ascii_tree()
98
        self._run_testset([
99
            [[u'd\\'], [u'd/']],
2617.5.8 by Kuno Meyer
Extended tests for unicode chars outside of the iso-8859-* range
100
            [[u'd\\*'], [u'd/d1', u'd/d2', u'd/e']],
101
            [[u'?\\*'], [u'c/c1', u'c/c2', 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']],
4789.20.2 by John Arbash Meinel
Split the win32 globbing tests up a bit.
103
            [[u'*\\'], [u'c/', u'd/']],
104
            ])
105
106
    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
107
        if os.path.normcase("AbC") == "AbC":
6622.4.1 by Martin
Use skipTest rather than deprecated skip method
108
            self.skipTest("Test requires case insensitive globbing function")
4789.20.2 by John Arbash Meinel
Split the win32 globbing tests up a bit.
109
        self.build_ascii_tree()
110
        self._run_testset([
111
            [[u'A'], [u'A']],
112
            [[u'A?'], [u'a1', u'a2']],
113
            ])
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
114
2617.5.8 by Kuno Meyer
Extended tests for unicode chars outside of the iso-8859-* range
115
    def test_tree_unicode(self):
2617.5.7 by Kuno Meyer
Fix for non-ASCII filenames
116
        """Checks behaviour with non-ascii filenames"""
4789.20.2 by John Arbash Meinel
Split the win32 globbing tests up a bit.
117
        self.build_unicode_tree()
2617.5.7 by Kuno Meyer
Fix for non-ASCII filenames
118
        self._run_testset([
119
            # no wildcards
2617.5.8 by Kuno Meyer
Extended tests for unicode chars outside of the iso-8859-* range
120
            [[u'\u1234'], [u'\u1234']],
121
            [[u'\u1235'], [u'\u1235']],
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
122
2617.5.8 by Kuno Meyer
Extended tests for unicode chars outside of the iso-8859-* range
123
            [[u'\u1235/'], [u'\u1235/']],
124
            [[u'\u1235/\u1235'], [u'\u1235/\u1235']],
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
125
2617.5.7 by Kuno Meyer
Fix for non-ASCII filenames
126
            # wildcards
2617.5.8 by Kuno Meyer
Extended tests for unicode chars outside of the iso-8859-* range
127
            [[u'?'], [u'\u1234', u'\u1235']],
128
            [[u'*'], [u'\u1234', u'\u1234\u1234', u'\u1235']],
129
            [[u'\u1234*'], [u'\u1234', u'\u1234\u1234']],
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
130
2617.5.8 by Kuno Meyer
Extended tests for unicode chars outside of the iso-8859-* range
131
            [[u'\u1235/?'], [u'\u1235/\u1235']],
132
            [[u'\u1235/*'], [u'\u1235/\u1235']],
4789.20.2 by John Arbash Meinel
Split the win32 globbing tests up a bit.
133
            [[u'?/'], [u'\u1235/']],
134
            [[u'*/'], [u'\u1235/']],
135
            [[u'?/?'], [u'\u1235/\u1235']],
136
            [[u'*/*'], [u'\u1235/\u1235']],
137
            ])
138
139
    def test_unicode_backslashes(self):
5241.2.1 by Robert Collins
Merge up from 2.0/2.1:
140
        self.requireFeature(backslashdir_feature)
4789.20.2 by John Arbash Meinel
Split the win32 globbing tests up a bit.
141
        self.build_unicode_tree()
142
        self._run_testset([
143
            # no wildcards
4789.20.3 by John Arbash Meinel
Use the right case sensitivity feature (cicp, not just ci).
144
            [[u'\u1235\\'], [u'\u1235/']],
145
            [[u'\u1235\\\u1235'], [u'\u1235/\u1235']],
2617.5.8 by Kuno Meyer
Extended tests for unicode chars outside of the iso-8859-* range
146
            [[u'\u1235\\?'], [u'\u1235/\u1235']],
147
            [[u'\u1235\\*'], [u'\u1235/\u1235']],
148
            [[u'?\\'], [u'\u1235/']],
149
            [[u'*\\'], [u'\u1235/']],
150
            [[u'?\\?'], [u'\u1235/\u1235']],
4789.20.2 by John Arbash Meinel
Split the win32 globbing tests up a bit.
151
            [[u'*\\*'], [u'\u1235/\u1235']],
152
            ])
2617.5.7 by Kuno Meyer
Fix for non-ASCII filenames
153
2617.5.1 by Kuno Meyer
Added direct unit tests for win32utils.glob_expand().
154
    def _run_testset(self, testset):
155
        for pattern, expected in testset:
156
            result = glob_expand(pattern)
157
            expected.sort()
158
            result.sort()
159
            self.assertEqual(expected, result, 'pattern %s' % pattern)
2617.5.2 by Kuno Meyer
just reformatting
160
2681.4.2 by Alexander Belchenko
test for get_app_path
161
162
class TestAppPaths(TestCase):
163
2681.4.4 by Alexander Belchenko
test use Feature instead of TestSkipped
164
    _test_needs_features = [Win32RegistryFeature]
165
2681.4.2 by Alexander Belchenko
test for get_app_path
166
    def test_iexplore(self):
167
        # typical windows users should have IE installed
168
        for a in ('iexplore', 'iexplore.exe'):
169
            p = get_app_path(a)
170
            d, b = os.path.split(p)
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
171
            self.assertEqual('iexplore.exe', b.lower())
6614.1.2 by Vincent Ladeuil
Fix assertNotEquals being deprecated by using assertNotEqual.
172
            self.assertNotEqual('', d)
2681.4.2 by Alexander Belchenko
test for get_app_path
173
4476.2.1 by Alexander Belchenko
win32utils.py: get_app_path() can read path for wordpad.exe (data type_id is REG_EXPAND_SZ).
174
    def test_wordpad(self):
175
        # typical windows users should have wordpad in the system
176
        # but there is problem: its path has the format REG_EXPAND_SZ
177
        # 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.
178
        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).
179
        for a in ('wordpad', 'wordpad.exe'):
180
            p = get_app_path(a)
181
            d, b = os.path.split(p)
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
182
            self.assertEqual('wordpad.exe', b.lower())
6614.1.2 by Vincent Ladeuil
Fix assertNotEquals being deprecated by using assertNotEqual.
183
            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).
184
2681.4.2 by Alexander Belchenko
test for get_app_path
185
    def test_not_existing(self):
186
        p = get_app_path('not-existing')
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
187
        self.assertEqual('not-existing', p)
3638.4.1 by Mark Hammond
Add win32utils.get_local_appdata_location() so bzr and plugins can
188
3638.4.3 by Mark Hammond
cleanup tests, rationalize path checking etc.
189
3638.4.1 by Mark Hammond
Add win32utils.get_local_appdata_location() so bzr and plugins can
190
class TestLocationsCtypes(TestCase):
191
6658.6.1 by Martin
Remove winver, win98 support code, and deprecated code
192
    _test_needs_features = [CtypesFeature, features.win32_feature]
3638.4.1 by Mark Hammond
Add win32utils.get_local_appdata_location() so bzr and plugins can
193
3638.4.3 by Mark Hammond
cleanup tests, rationalize path checking etc.
194
    def assertPathsEqual(self, p1, p2):
195
        # TODO: The env var values in particular might return the "short"
196
        # version (ie, "C:\DOCUME~1\...").  Its even possible the returned
197
        # values will differ only by case - handle these situations as we
198
        # come across them.
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
199
        self.assertEqual(p1, p2)
3638.4.3 by Mark Hammond
cleanup tests, rationalize path checking etc.
200
3638.4.1 by Mark Hammond
Add win32utils.get_local_appdata_location() so bzr and plugins can
201
    def test_appdata_not_using_environment(self):
202
        # Test that we aren't falling back to the environment
3638.4.3 by Mark Hammond
cleanup tests, rationalize path checking etc.
203
        first = win32utils.get_appdata_location()
5570.3.6 by Vincent Ladeuil
Get rid of all _captureVar() calls, no test failures, pfew.
204
        self.overrideEnv("APPDATA", None)
3638.4.3 by Mark Hammond
cleanup tests, rationalize path checking etc.
205
        self.assertPathsEqual(first, win32utils.get_appdata_location())
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
206
3638.4.1 by Mark Hammond
Add win32utils.get_local_appdata_location() so bzr and plugins can
207
    def test_appdata_matches_environment(self):
208
        # Typically the APPDATA environment variable will match
209
        # get_appdata_location
3638.4.3 by Mark Hammond
cleanup tests, rationalize path checking etc.
210
        # XXX - See bug 262874, which asserts the correct encoding is 'mbcs',
211
        encoding = osutils.get_user_encoding()
3638.4.6 by Mark Hammond
Skip the environment checks when APPDATA isn't in the environment.
212
        env_val = os.environ.get("APPDATA", None)
213
        if not env_val:
214
            raise TestSkipped("No APPDATA environment variable exists")
3638.4.3 by Mark Hammond
cleanup tests, rationalize path checking etc.
215
        self.assertPathsEqual(win32utils.get_appdata_location(),
3638.4.6 by Mark Hammond
Skip the environment checks when APPDATA isn't in the environment.
216
                              env_val.decode(encoding))
3638.4.1 by Mark Hammond
Add win32utils.get_local_appdata_location() so bzr and plugins can
217
218
    def test_local_appdata_not_using_environment(self):
219
        # Test that we aren't falling back to the environment
3638.4.3 by Mark Hammond
cleanup tests, rationalize path checking etc.
220
        first = win32utils.get_local_appdata_location()
5570.3.6 by Vincent Ladeuil
Get rid of all _captureVar() calls, no test failures, pfew.
221
        self.overrideEnv("LOCALAPPDATA", None)
3638.4.3 by Mark Hammond
cleanup tests, rationalize path checking etc.
222
        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
223
224
    def test_local_appdata_matches_environment(self):
225
        # LOCALAPPDATA typically only exists on Vista, so we only attempt to
226
        # compare when it exists.
3638.4.3 by Mark Hammond
cleanup tests, rationalize path checking etc.
227
        lad = win32utils.get_local_appdata_location()
3638.4.1 by Mark Hammond
Add win32utils.get_local_appdata_location() so bzr and plugins can
228
        env = os.environ.get("LOCALAPPDATA")
229
        if env:
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
230
            # XXX - See bug 262874, which asserts the correct encoding is
231
            # 'mbcs'
3638.4.3 by Mark Hammond
cleanup tests, rationalize path checking etc.
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,
7143.15.2 by Jelmer Vernooij
Run autopep8.
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]
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
273
        argv = win32utils._command_line_to_argv(
274
            line, argv, single_quotes_allowed=single_quotes_allowed)
4913.5.11 by Gordon Tyler
Added optional single quote support to UnicodeShlex and thus command_line_to_argv (defaults to disabled).
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'",
7143.15.2 by Jelmer Vernooij
Run autopep8.
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'",
7143.15.2 by Jelmer Vernooij
Run autopep8.
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"],
7143.15.2 by Jelmer Vernooij
Run autopep8.
307
                               "add let's-do-it.txt",
308
                               ["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
309
        self.expectFailure("Using single quotes breaks trimming from argv",
7143.15.2 by Jelmer Vernooij
Run autopep8.
310
                           self.assertCommandLine, ["add", "lets do it.txt"],
311
                           "add 'lets do it.txt'", [
312
                               "add", "'lets", "do", "it.txt'"],
313
                           single_quotes_allowed=True)
4797.3.20 by John Arbash Meinel
Include the glob updates.
314
4789.20.3 by John Arbash Meinel
Use the right case sensitivity feature (cicp, not just ci).
315
    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
316
        if os.path.normcase("AbC") == "AbC":
6622.4.1 by Martin
Use skipTest rather than deprecated skip method
317
            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).
318
        self.build_tree(['a/', 'a/b.c', 'a/c.c', 'a/c.h'])
319
        self.assertCommandLine([u'A/b.c'], 'A/B*')
320
321
    def test_backslashes(self):
5241.2.1 by Robert Collins
Merge up from 2.0/2.1:
322
        self.requireFeature(backslashdir_feature)
4789.20.3 by John Arbash Meinel
Use the right case sensitivity feature (cicp, not just ci).
323
        self.build_tree(['a/', 'a/b.c', 'a/c.c', 'a/c.h'])
324
        self.assertCommandLine([u'a/b.c'], 'a\\b*')
5274.4.13 by Martin
Add test for lp:587868 to win32 commandline tests
325
326
    def test_with_pdb(self):
327
        """Check stripping Python arguments before bzr script per lp:587868"""
328
        self.assertCommandLine([u"rocks"], "-m pdb rocks", ["rocks"])
329
        self.build_tree(['d/', 'd/f1', 'd/f2'])
330
        self.assertCommandLine([u"rm", u"x*"], "-m pdb rm x*", ["rm", u"x*"])
331
        self.assertCommandLine([u"add", u"d/f1", u"d/f2"], "-m pdb add d/*",
7143.15.2 by Jelmer Vernooij
Run autopep8.
332
                               ["add", u"d/*"])
6339.2.1 by Martin Packman
Add wrapper for GetEnvironmentVariableW on windows for unicode environ access
333
334
335
class TestGetEnvironUnicode(tests.TestCase):
336
    """Tests for accessing the environment via the windows wide api"""
337
338
    _test_needs_features = [CtypesFeature, features.win32_feature]
339
340
    def setUp(self):
341
        super(TestGetEnvironUnicode, self).setUp()
342
        self.overrideEnv("TEST", "1")
343
344
    def test_get(self):
345
        """In the normal case behaves the same as os.environ access"""
346
        self.assertEqual("1", win32utils.get_environ_unicode("TEST"))
347
348
    def test_unset(self):
349
        """A variable not present in the environment gives None by default"""
350
        del os.environ["TEST"]
351
        self.assertIs(None, win32utils.get_environ_unicode("TEST"))
352
353
    def test_unset_default(self):
354
        """A variable not present in the environment gives passed default"""
355
        del os.environ["TEST"]
356
        self.assertIs("a", win32utils.get_environ_unicode("TEST", "a"))
357
358
    def test_unicode(self):
359
        """A non-ascii variable is returned as unicode"""
7143.15.2 by Jelmer Vernooij
Run autopep8.
360
        unicode_val = u"\xa7"  # non-ascii character present in many encodings
6339.2.1 by Martin Packman
Add wrapper for GetEnvironmentVariableW on windows for unicode environ access
361
        try:
362
            bytes_val = unicode_val.encode(osutils.get_user_encoding())
363
        except UnicodeEncodeError:
6622.4.1 by Martin
Use skipTest rather than deprecated skip method
364
            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
365
        os.environ["TEST"] = bytes_val
366
        self.assertEqual(unicode_val, win32utils.get_environ_unicode("TEST"))
367
368
    def test_long(self):
369
        """A variable bigger than heuristic buffer size is still accessible"""
7143.15.2 by Jelmer Vernooij
Run autopep8.
370
        big_val = "x" * (2 << 10)
6339.2.1 by Martin Packman
Add wrapper for GetEnvironmentVariableW on windows for unicode environ access
371
        os.environ["TEST"] = big_val
372
        self.assertEqual(big_val, win32utils.get_environ_unicode("TEST"))
373
374
    def test_unexpected_error(self):
375
        """An error from the underlying platform function is propogated"""
376
        ERROR_INVALID_PARAMETER = 87
377
        SetLastError = win32utils.ctypes.windll.kernel32.SetLastError
7143.15.2 by Jelmer Vernooij
Run autopep8.
378
6339.2.1 by Martin Packman
Add wrapper for GetEnvironmentVariableW on windows for unicode environ access
379
        def failer(*args, **kwargs):
380
            SetLastError(ERROR_INVALID_PARAMETER)
381
            return 0
6339.2.2 by Martin Packman
Variable name changes and docstring fix suggested by vila in review
382
        self.overrideAttr(win32utils.get_environ_unicode, "_c_function",
7143.15.2 by Jelmer Vernooij
Run autopep8.
383
                          failer)
6339.2.1 by Martin Packman
Add wrapper for GetEnvironmentVariableW on windows for unicode environ access
384
        e = self.assertRaises(WindowsError,
7143.15.2 by Jelmer Vernooij
Run autopep8.
385
                              win32utils.get_environ_unicode, "TEST")
6339.2.1 by Martin Packman
Add wrapper for GetEnvironmentVariableW on windows for unicode environ access
386
        self.assertEqual(e.winerror, ERROR_INVALID_PARAMETER)