352
353
if not t._can_roundtrip_unix_modebits():
353
354
# Can't roundtrip, so no need to run this test
355
t.put_bytes('mode644', 'test text\n', mode=0644)
356
self.assertTransportMode(t, 'mode644', 0644)
357
t.put_bytes('mode666', 'test text\n', mode=0666)
358
self.assertTransportMode(t, 'mode666', 0666)
359
t.put_bytes('mode600', 'test text\n', mode=0600)
360
self.assertTransportMode(t, 'mode600', 0600)
356
t.put_bytes('mode644', 'test text\n', mode=0o644)
357
self.assertTransportMode(t, 'mode644', 0o644)
358
t.put_bytes('mode666', 'test text\n', mode=0o666)
359
self.assertTransportMode(t, 'mode666', 0o666)
360
t.put_bytes('mode600', 'test text\n', mode=0o600)
361
self.assertTransportMode(t, 'mode600', 0o600)
361
362
# Yes, you can put_bytes a file such that it becomes readonly
362
t.put_bytes('mode400', 'test text\n', mode=0400)
363
self.assertTransportMode(t, 'mode400', 0400)
363
t.put_bytes('mode400', 'test text\n', mode=0o400)
364
self.assertTransportMode(t, 'mode400', 0o400)
365
366
# The default permissions should be based on the current umask
366
367
umask = osutils.get_umask()
367
368
t.put_bytes('nomode', 'test text\n', mode=None)
368
self.assertTransportMode(t, 'nomode', 0666 & ~umask)
369
self.assertTransportMode(t, 'nomode', 0o666 & ~umask)
370
371
def test_put_bytes_non_atomic_permissions(self):
371
372
t = self.get_transport()
375
376
if not t._can_roundtrip_unix_modebits():
376
377
# Can't roundtrip, so no need to run this test
378
t.put_bytes_non_atomic('mode644', 'test text\n', mode=0644)
379
self.assertTransportMode(t, 'mode644', 0644)
380
t.put_bytes_non_atomic('mode666', 'test text\n', mode=0666)
381
self.assertTransportMode(t, 'mode666', 0666)
382
t.put_bytes_non_atomic('mode600', 'test text\n', mode=0600)
383
self.assertTransportMode(t, 'mode600', 0600)
384
t.put_bytes_non_atomic('mode400', 'test text\n', mode=0400)
385
self.assertTransportMode(t, 'mode400', 0400)
379
t.put_bytes_non_atomic('mode644', 'test text\n', mode=0o644)
380
self.assertTransportMode(t, 'mode644', 0o644)
381
t.put_bytes_non_atomic('mode666', 'test text\n', mode=0o666)
382
self.assertTransportMode(t, 'mode666', 0o666)
383
t.put_bytes_non_atomic('mode600', 'test text\n', mode=0o600)
384
self.assertTransportMode(t, 'mode600', 0o600)
385
t.put_bytes_non_atomic('mode400', 'test text\n', mode=0o400)
386
self.assertTransportMode(t, 'mode400', 0o400)
387
388
# The default permissions should be based on the current umask
388
389
umask = osutils.get_umask()
389
390
t.put_bytes_non_atomic('nomode', 'test text\n', mode=None)
390
self.assertTransportMode(t, 'nomode', 0666 & ~umask)
391
self.assertTransportMode(t, 'nomode', 0o666 & ~umask)
392
393
# We should also be able to set the mode for a parent directory
393
394
# when it is created
394
t.put_bytes_non_atomic('dir700/mode664', 'test text\n', mode=0664,
395
dir_mode=0700, create_parent_dir=True)
396
self.assertTransportMode(t, 'dir700', 0700)
397
t.put_bytes_non_atomic('dir770/mode664', 'test text\n', mode=0664,
398
dir_mode=0770, create_parent_dir=True)
399
self.assertTransportMode(t, 'dir770', 0770)
400
t.put_bytes_non_atomic('dir777/mode664', 'test text\n', mode=0664,
401
dir_mode=0777, create_parent_dir=True)
402
self.assertTransportMode(t, 'dir777', 0777)
395
t.put_bytes_non_atomic('dir700/mode664', 'test text\n', mode=0o664,
396
dir_mode=0o700, create_parent_dir=True)
397
self.assertTransportMode(t, 'dir700', 0o700)
398
t.put_bytes_non_atomic('dir770/mode664', 'test text\n', mode=0o664,
399
dir_mode=0o770, create_parent_dir=True)
400
self.assertTransportMode(t, 'dir770', 0o770)
401
t.put_bytes_non_atomic('dir777/mode664', 'test text\n', mode=0o664,
402
dir_mode=0o777, create_parent_dir=True)
403
self.assertTransportMode(t, 'dir777', 0o777)
404
405
def test_put_file(self):
405
406
t = self.get_transport()
407
408
if t.is_readonly():
408
409
self.assertRaises(TransportNotPossible,
409
t.put_file, 'a', StringIO('some text for a\n'))
410
t.put_file, 'a', BytesIO(b'some text for a\n'))
412
result = t.put_file('a', StringIO('some text for a\n'))
413
result = t.put_file('a', BytesIO(b'some text for a\n'))
413
414
# put_file returns the length of the data written
414
415
self.assertEqual(16, result)
415
416
self.assertTrue(t.has('a'))
416
417
self.check_transport_contents('some text for a\n', t, 'a')
417
418
# Put also replaces contents
418
result = t.put_file('a', StringIO('new\ncontents for\na\n'))
419
result = t.put_file('a', BytesIO(b'new\ncontents for\na\n'))
419
420
self.assertEqual(19, result)
420
421
self.check_transport_contents('new\ncontents for\na\n', t, 'a')
421
422
self.assertRaises(NoSuchFile,
422
423
t.put_file, 'path/doesnt/exist/c',
423
StringIO('contents'))
424
BytesIO(b'contents'))
425
426
def test_put_file_non_atomic(self):
426
427
t = self.get_transport()
428
429
if t.is_readonly():
429
430
self.assertRaises(TransportNotPossible,
430
t.put_file_non_atomic, 'a', StringIO('some text for a\n'))
431
t.put_file_non_atomic, 'a', BytesIO(b'some text for a\n'))
433
434
self.assertFalse(t.has('a'))
434
t.put_file_non_atomic('a', StringIO('some text for a\n'))
435
t.put_file_non_atomic('a', BytesIO(b'some text for a\n'))
435
436
self.assertTrue(t.has('a'))
436
437
self.check_transport_contents('some text for a\n', t, 'a')
437
438
# Put also replaces contents
438
t.put_file_non_atomic('a', StringIO('new\ncontents for\na\n'))
439
t.put_file_non_atomic('a', BytesIO(b'new\ncontents for\na\n'))
439
440
self.check_transport_contents('new\ncontents for\na\n', t, 'a')
441
442
# Make sure we can create another file
442
t.put_file_non_atomic('d', StringIO('contents for\nd\n'))
443
t.put_file_non_atomic('d', BytesIO(b'contents for\nd\n'))
443
444
# And overwrite 'a' with empty contents
444
t.put_file_non_atomic('a', StringIO(''))
445
t.put_file_non_atomic('a', BytesIO(b''))
445
446
self.check_transport_contents('contents for\nd\n', t, 'd')
446
447
self.check_transport_contents('', t, 'a')
448
449
self.assertRaises(NoSuchFile, t.put_file_non_atomic, 'no/such/path',
449
StringIO('contents\n'))
450
BytesIO(b'contents\n'))
450
451
# Now test the create_parent flag
451
452
self.assertRaises(NoSuchFile, t.put_file_non_atomic, 'dir/a',
452
StringIO('contents\n'))
453
BytesIO(b'contents\n'))
453
454
self.assertFalse(t.has('dir/a'))
454
t.put_file_non_atomic('dir/a', StringIO('contents for dir/a\n'),
455
t.put_file_non_atomic('dir/a', BytesIO(b'contents for dir/a\n'),
455
456
create_parent_dir=True)
456
457
self.check_transport_contents('contents for dir/a\n', t, 'dir/a')
458
459
# But we still get NoSuchFile if we can't make the parent dir
459
460
self.assertRaises(NoSuchFile, t.put_file_non_atomic, 'not/there/a',
460
StringIO('contents\n'),
461
BytesIO(b'contents\n'),
461
462
create_parent_dir=True)
463
464
def test_put_file_permissions(self):
469
470
if not t._can_roundtrip_unix_modebits():
470
471
# Can't roundtrip, so no need to run this test
472
t.put_file('mode644', StringIO('test text\n'), mode=0644)
473
self.assertTransportMode(t, 'mode644', 0644)
474
t.put_file('mode666', StringIO('test text\n'), mode=0666)
475
self.assertTransportMode(t, 'mode666', 0666)
476
t.put_file('mode600', StringIO('test text\n'), mode=0600)
477
self.assertTransportMode(t, 'mode600', 0600)
473
t.put_file('mode644', BytesIO(b'test text\n'), mode=0o644)
474
self.assertTransportMode(t, 'mode644', 0o644)
475
t.put_file('mode666', BytesIO(b'test text\n'), mode=0o666)
476
self.assertTransportMode(t, 'mode666', 0o666)
477
t.put_file('mode600', BytesIO(b'test text\n'), mode=0o600)
478
self.assertTransportMode(t, 'mode600', 0o600)
478
479
# Yes, you can put a file such that it becomes readonly
479
t.put_file('mode400', StringIO('test text\n'), mode=0400)
480
self.assertTransportMode(t, 'mode400', 0400)
480
t.put_file('mode400', BytesIO(b'test text\n'), mode=0o400)
481
self.assertTransportMode(t, 'mode400', 0o400)
481
482
# The default permissions should be based on the current umask
482
483
umask = osutils.get_umask()
483
t.put_file('nomode', StringIO('test text\n'), mode=None)
484
self.assertTransportMode(t, 'nomode', 0666 & ~umask)
484
t.put_file('nomode', BytesIO(b'test text\n'), mode=None)
485
self.assertTransportMode(t, 'nomode', 0o666 & ~umask)
486
487
def test_put_file_non_atomic_permissions(self):
487
488
t = self.get_transport()
491
492
if not t._can_roundtrip_unix_modebits():
492
493
# Can't roundtrip, so no need to run this test
494
t.put_file_non_atomic('mode644', StringIO('test text\n'), mode=0644)
495
self.assertTransportMode(t, 'mode644', 0644)
496
t.put_file_non_atomic('mode666', StringIO('test text\n'), mode=0666)
497
self.assertTransportMode(t, 'mode666', 0666)
498
t.put_file_non_atomic('mode600', StringIO('test text\n'), mode=0600)
499
self.assertTransportMode(t, 'mode600', 0600)
495
t.put_file_non_atomic('mode644', BytesIO(b'test text\n'), mode=0o644)
496
self.assertTransportMode(t, 'mode644', 0o644)
497
t.put_file_non_atomic('mode666', BytesIO(b'test text\n'), mode=0o666)
498
self.assertTransportMode(t, 'mode666', 0o666)
499
t.put_file_non_atomic('mode600', BytesIO(b'test text\n'), mode=0o600)
500
self.assertTransportMode(t, 'mode600', 0o600)
500
501
# Yes, you can put_file_non_atomic a file such that it becomes readonly
501
t.put_file_non_atomic('mode400', StringIO('test text\n'), mode=0400)
502
self.assertTransportMode(t, 'mode400', 0400)
502
t.put_file_non_atomic('mode400', BytesIO(b'test text\n'), mode=0o400)
503
self.assertTransportMode(t, 'mode400', 0o400)
504
505
# The default permissions should be based on the current umask
505
506
umask = osutils.get_umask()
506
t.put_file_non_atomic('nomode', StringIO('test text\n'), mode=None)
507
self.assertTransportMode(t, 'nomode', 0666 & ~umask)
507
t.put_file_non_atomic('nomode', BytesIO(b'test text\n'), mode=None)
508
self.assertTransportMode(t, 'nomode', 0o666 & ~umask)
509
510
# We should also be able to set the mode for a parent directory
510
511
# when it is created
512
t.put_file_non_atomic('dir700/mode664', sio, mode=0664,
513
dir_mode=0700, create_parent_dir=True)
514
self.assertTransportMode(t, 'dir700', 0700)
515
t.put_file_non_atomic('dir770/mode664', sio, mode=0664,
516
dir_mode=0770, create_parent_dir=True)
517
self.assertTransportMode(t, 'dir770', 0770)
518
t.put_file_non_atomic('dir777/mode664', sio, mode=0664,
519
dir_mode=0777, create_parent_dir=True)
520
self.assertTransportMode(t, 'dir777', 0777)
513
t.put_file_non_atomic('dir700/mode664', sio, mode=0o664,
514
dir_mode=0o700, create_parent_dir=True)
515
self.assertTransportMode(t, 'dir700', 0o700)
516
t.put_file_non_atomic('dir770/mode664', sio, mode=0o664,
517
dir_mode=0o770, create_parent_dir=True)
518
self.assertTransportMode(t, 'dir770', 0o770)
519
t.put_file_non_atomic('dir777/mode664', sio, mode=0o664,
520
dir_mode=0o777, create_parent_dir=True)
521
self.assertTransportMode(t, 'dir777', 0o777)
522
523
def test_put_bytes_unicode(self):
523
524
t = self.get_transport()
580
581
# no sense testing on this transport
582
583
# Test mkdir with a mode
583
t.mkdir('dmode755', mode=0755)
584
self.assertTransportMode(t, 'dmode755', 0755)
585
t.mkdir('dmode555', mode=0555)
586
self.assertTransportMode(t, 'dmode555', 0555)
587
t.mkdir('dmode777', mode=0777)
588
self.assertTransportMode(t, 'dmode777', 0777)
589
t.mkdir('dmode700', mode=0700)
590
self.assertTransportMode(t, 'dmode700', 0700)
591
t.mkdir_multi(['mdmode755'], mode=0755)
592
self.assertTransportMode(t, 'mdmode755', 0755)
584
t.mkdir('dmode755', mode=0o755)
585
self.assertTransportMode(t, 'dmode755', 0o755)
586
t.mkdir('dmode555', mode=0o555)
587
self.assertTransportMode(t, 'dmode555', 0o555)
588
t.mkdir('dmode777', mode=0o777)
589
self.assertTransportMode(t, 'dmode777', 0o777)
590
t.mkdir('dmode700', mode=0o700)
591
self.assertTransportMode(t, 'dmode700', 0o700)
592
t.mkdir_multi(['mdmode755'], mode=0o755)
593
self.assertTransportMode(t, 'mdmode755', 0o755)
594
595
# Default mode should be based on umask
595
596
umask = osutils.get_umask()
596
597
t.mkdir('dnomode', mode=None)
597
self.assertTransportMode(t, 'dnomode', 0777 & ~umask)
598
self.assertTransportMode(t, 'dnomode', 0o777 & ~umask)
599
600
def test_opening_a_file_stream_creates_file(self):
600
601
t = self.get_transport()