~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_osutils.py

  • Committer: Martin Pool
  • Date: 2006-06-20 07:55:43 UTC
  • mfrom: (1798 +trunk)
  • mto: This revision was merged to the branch mainline in revision 1799.
  • Revision ID: mbp@sourcefrog.net-20060620075543-b10f6575d4a4fa32
[merge] bzr.dev

Show diffs side-by-side

added added

removed removed

Lines of Context:
14
14
# along with this program; if not, write to the Free Software
15
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
16
 
17
 
"""Tests for the osutils wrapper.
18
 
"""
 
17
"""Tests for the osutils wrapper."""
19
18
 
20
19
import errno
21
20
import os
24
23
import sys
25
24
 
26
25
import bzrlib
27
 
from bzrlib.errors import BzrBadParameterNotUnicode
 
26
from bzrlib.errors import BzrBadParameterNotUnicode, InvalidURL
28
27
import bzrlib.osutils as osutils
29
 
from bzrlib.tests import TestCaseInTempDir, TestCase
 
28
from bzrlib.tests import (
 
29
        StringIOWrapper,
 
30
        TestCase, 
 
31
        TestCaseInTempDir, 
 
32
        TestSkipped,
 
33
        )
30
34
 
31
35
 
32
36
class TestOSUtils(TestCaseInTempDir):
148
152
                          '\xbb\xbb')
149
153
 
150
154
 
 
155
class TestWin32Funcs(TestCase):
 
156
    """Test that the _win32 versions of os utilities return appropriate paths."""
 
157
 
 
158
    def test_abspath(self):
 
159
        self.assertEqual('C:/foo', osutils._win32_abspath('C:\\foo'))
 
160
        self.assertEqual('C:/foo', osutils._win32_abspath('C:/foo'))
 
161
 
 
162
    def test_realpath(self):
 
163
        self.assertEqual('C:/foo', osutils._win32_realpath('C:\\foo'))
 
164
        self.assertEqual('C:/foo', osutils._win32_realpath('C:/foo'))
 
165
 
 
166
    def test_pathjoin(self):
 
167
        self.assertEqual('path/to/foo', osutils._win32_pathjoin('path', 'to', 'foo'))
 
168
        self.assertEqual('C:/foo', osutils._win32_pathjoin('path\\to', 'C:\\foo'))
 
169
        self.assertEqual('C:/foo', osutils._win32_pathjoin('path/to', 'C:/foo'))
 
170
        self.assertEqual('path/to/foo', osutils._win32_pathjoin('path/to/', 'foo'))
 
171
        self.assertEqual('/foo', osutils._win32_pathjoin('C:/path/to/', '/foo'))
 
172
        self.assertEqual('/foo', osutils._win32_pathjoin('C:\\path\\to\\', '\\foo'))
 
173
 
 
174
    def test_normpath(self):
 
175
        self.assertEqual('path/to/foo', osutils._win32_normpath(r'path\\from\..\to\.\foo'))
 
176
        self.assertEqual('path/to/foo', osutils._win32_normpath('path//from/../to/./foo'))
 
177
 
 
178
    def test_getcwd(self):
 
179
        self.assertEqual(os.getcwdu().replace('\\', '/'), osutils._win32_getcwd())
 
180
 
 
181
 
 
182
class TestWin32FuncsDirs(TestCaseInTempDir):
 
183
    """Test win32 functions that create files."""
 
184
    
 
185
    def test_getcwd(self):
 
186
        # Make sure getcwd can handle unicode filenames
 
187
        try:
 
188
            os.mkdir(u'B\xe5gfors')
 
189
        except UnicodeError:
 
190
            raise TestSkipped("Unable to create Unicode filename")
 
191
 
 
192
        os.chdir(u'B\xe5gfors')
 
193
        # TODO: jam 20060427 This will probably fail on Mac OSX because
 
194
        #       it will change the normalization of B\xe5gfors
 
195
        #       Consider using a different unicode character, or make
 
196
        #       osutils.getcwd() renormalize the path.
 
197
        self.assertTrue(osutils._win32_getcwd().endswith(u'/B\xe5gfors'))
 
198
 
 
199
    def test_mkdtemp(self):
 
200
        tmpdir = osutils._win32_mkdtemp(dir='.')
 
201
        self.assertFalse('\\' in tmpdir)
 
202
 
 
203
    def test_rename(self):
 
204
        a = open('a', 'wb')
 
205
        a.write('foo\n')
 
206
        a.close()
 
207
        b = open('b', 'wb')
 
208
        b.write('baz\n')
 
209
        b.close()
 
210
 
 
211
        osutils._win32_rename('b', 'a')
 
212
        self.failUnlessExists('a')
 
213
        self.failIfExists('b')
 
214
        self.assertFileEqual('baz\n', 'a')
 
215
 
 
216
 
151
217
class TestSplitLines(TestCase):
152
218
 
153
219
    def test_split_unicode(self):
159
225
    def test_split_with_carriage_returns(self):
160
226
        self.assertEqual(['foo\rbar\n'],
161
227
                         osutils.split_lines('foo\rbar\n'))
 
228
 
 
229
 
 
230
class TestWalkDirs(TestCaseInTempDir):
 
231
 
 
232
    def test_walkdirs(self):
 
233
        tree = [
 
234
            '.bzr',
 
235
            '0file',
 
236
            '1dir/',
 
237
            '1dir/0file',
 
238
            '1dir/1dir/',
 
239
            '2file'
 
240
            ]
 
241
        self.build_tree(tree)
 
242
        expected_dirblocks = [
 
243
                [
 
244
                    ('0file', '0file', 'file'),
 
245
                    ('1dir', '1dir', 'directory'),
 
246
                    ('2file', '2file', 'file'),
 
247
                ],
 
248
                [
 
249
                    ('1dir/0file', '0file', 'file'),
 
250
                    ('1dir/1dir', '1dir', 'directory'),
 
251
                ],
 
252
                [
 
253
                ],
 
254
            ]
 
255
        result = []
 
256
        found_bzrdir = False
 
257
        for dirblock in osutils.walkdirs('.'):
 
258
            if len(dirblock) and dirblock[0][1] == '.bzr':
 
259
                # this tests the filtering of selected paths
 
260
                found_bzrdir = True
 
261
                del dirblock[0]
 
262
            result.append(dirblock)
 
263
 
 
264
        self.assertTrue(found_bzrdir)
 
265
        self.assertEqual(expected_dirblocks,
 
266
            [[line[0:3] for line in block] for block in result])
 
267
        # you can search a subdir only, with a supplied prefix.
 
268
        result = []
 
269
        for dirblock in osutils.walkdirs('1dir', '1dir'):
 
270
            result.append(dirblock)
 
271
        self.assertEqual(expected_dirblocks[1:],
 
272
            [[line[0:3] for line in block] for block in result])
 
273
 
 
274
    def assertPathCompare(self, path_less, path_greater):
 
275
        """check that path_less and path_greater compare correctly."""
 
276
        self.assertEqual(0, osutils.compare_paths_prefix_order(
 
277
            path_less, path_less))
 
278
        self.assertEqual(0, osutils.compare_paths_prefix_order(
 
279
            path_greater, path_greater))
 
280
        self.assertEqual(-1, osutils.compare_paths_prefix_order(
 
281
            path_less, path_greater))
 
282
        self.assertEqual(1, osutils.compare_paths_prefix_order(
 
283
            path_greater, path_less))
 
284
 
 
285
    def test_compare_paths_prefix_order(self):
 
286
        # root before all else
 
287
        self.assertPathCompare("/", "/a")
 
288
        # alpha within a dir
 
289
        self.assertPathCompare("/a", "/b")
 
290
        self.assertPathCompare("/b", "/z")
 
291
        # high dirs before lower.
 
292
        self.assertPathCompare("/z", "/a/a")
 
293
        # except if the deeper dir should be output first
 
294
        self.assertPathCompare("/a/b/c", "/d/g")
 
295
        # lexical betwen dirs of the same height
 
296
        self.assertPathCompare("/a/z", "/z/z")
 
297
        self.assertPathCompare("/a/c/z", "/a/d/e")
 
298
 
 
299
        # this should also be consistent for no leading / paths
 
300
        # root before all else
 
301
        self.assertPathCompare("", "a")
 
302
        # alpha within a dir
 
303
        self.assertPathCompare("a", "b")
 
304
        self.assertPathCompare("b", "z")
 
305
        # high dirs before lower.
 
306
        self.assertPathCompare("z", "a/a")
 
307
        # except if the deeper dir should be output first
 
308
        self.assertPathCompare("a/b/c", "d/g")
 
309
        # lexical betwen dirs of the same height
 
310
        self.assertPathCompare("a/z", "z/z")
 
311
        self.assertPathCompare("a/c/z", "a/d/e")
 
312
 
 
313
    def test_path_prefix_sorting(self):
 
314
        """Doing a sort on path prefix should match our sample data."""
 
315
        original_paths = [
 
316
            'a',
 
317
            'a/b',
 
318
            'a/b/c',
 
319
            'b',
 
320
            'b/c',
 
321
            'd',
 
322
            'd/e',
 
323
            'd/e/f',
 
324
            'd/f',
 
325
            'd/g',
 
326
            'g',
 
327
            ]
 
328
 
 
329
        dir_sorted_paths = [
 
330
            'a',
 
331
            'b',
 
332
            'd',
 
333
            'g',
 
334
            'a/b',
 
335
            'a/b/c',
 
336
            'b/c',
 
337
            'd/e',
 
338
            'd/f',
 
339
            'd/g',
 
340
            'd/e/f',
 
341
            ]
 
342
 
 
343
        self.assertEqual(
 
344
            dir_sorted_paths,
 
345
            sorted(original_paths, key=osutils.path_prefix_key))
 
346
        # using the comparison routine shoudl work too:
 
347
        self.assertEqual(
 
348
            dir_sorted_paths,
 
349
            sorted(original_paths, cmp=osutils.compare_paths_prefix_order))
 
350
 
 
351
 
 
352
class TestTerminalEncoding(TestCase):
 
353
    """Test the auto-detection of proper terminal encoding."""
 
354
 
 
355
    def setUp(self):
 
356
        self._stdout = sys.stdout
 
357
        self._stderr = sys.stderr
 
358
        self._stdin = sys.stdin
 
359
        self._user_encoding = bzrlib.user_encoding
 
360
 
 
361
        self.addCleanup(self._reset)
 
362
 
 
363
        sys.stdout = StringIOWrapper()
 
364
        sys.stdout.encoding = 'stdout_encoding'
 
365
        sys.stderr = StringIOWrapper()
 
366
        sys.stderr.encoding = 'stderr_encoding'
 
367
        sys.stdin = StringIOWrapper()
 
368
        sys.stdin.encoding = 'stdin_encoding'
 
369
        bzrlib.user_encoding = 'user_encoding'
 
370
 
 
371
    def _reset(self):
 
372
        sys.stdout = self._stdout
 
373
        sys.stderr = self._stderr
 
374
        sys.stdin = self._stdin
 
375
        bzrlib.user_encoding = self._user_encoding
 
376
 
 
377
    def test_get_terminal_encoding(self):
 
378
        # first preference is stdout encoding
 
379
        self.assertEqual('stdout_encoding', osutils.get_terminal_encoding())
 
380
 
 
381
        sys.stdout.encoding = None
 
382
        # if sys.stdout is None, fall back to sys.stdin
 
383
        self.assertEqual('stdin_encoding', osutils.get_terminal_encoding())
 
384
 
 
385
        sys.stdin.encoding = None
 
386
        # and in the worst case, use bzrlib.user_encoding
 
387
        self.assertEqual('user_encoding', osutils.get_terminal_encoding())
 
388