1import unittest
2from commontest import BackupRestoreSeries
3from rdiff_backup import rpath, metadata, Globals
4"""***NOTE***
5
6None of these tests should work unless your system supports resource
7forks.  So basically these tests should only be run on Mac OS X.
8
9"""
10
11Globals.read_resource_forks = Globals.write_resource_forks = 1
12
13
14class ResourceForkTest(unittest.TestCase):
15    """Test dealing with Mac OS X style resource forks"""
16    tempdir = rpath.RPath(Globals.local_connection, 'testfiles/output')
17    rf_testdir1 = rpath.RPath(Globals.local_connection,
18                              'testfiles/resource_fork_test1')
19    rf_testdir2 = rpath.RPath(Globals.local_connection,
20                              'testfiles/resource_fork_test2')
21
22    def make_temp(self):
23        """Make temp directory testfiles/resource_fork_test"""
24        if self.tempdir.lstat():
25            self.tempdir.delete()
26        self.tempdir.mkdir()
27
28    def testBasic(self):
29        """Test basic reading and writing of resource forks"""
30        self.make_temp()
31        rp = self.tempdir.append('test')
32        rp.touch()
33        assert rp.get_resource_fork() == '', rp.get_resource_fork()
34
35        s = 'new resource fork data'
36        rp.write_resource_fork(s)
37        assert rp.get_resource_fork() == s, rp.get_resource_fork()
38
39        rp2 = self.tempdir.append('test')
40        assert rp2.isreg()
41        assert rp2.get_resource_fork() == s, rp2.get_resource_fork()
42
43    def testRecord(self):
44        """Test reading, writing, and comparing of records with rforks"""
45        self.make_temp()
46        rp = self.tempdir.append('test')
47        rp.touch()
48        rp.set_resource_fork('hello')
49
50        record = metadata.RORP2Record(rp)
51        rorp_out = metadata.Record2RORP(record)
52        assert rorp_out == rp, (rorp_out, rp)
53        assert rorp_out.get_resource_fork() == 'hello'
54
55    def make_backup_dirs(self):
56        """Create testfiles/resource_fork_test[12] dirs for testing"""
57        if self.rf_testdir1.lstat():
58            self.rf_testdir1.delete()
59        if self.rf_testdir2.lstat():
60            self.rf_testdir2.delete()
61        self.rf_testdir1.mkdir()
62        rp1_1 = self.rf_testdir1.append('1')
63        rp1_2 = self.rf_testdir1.append('2')
64        rp1_3 = self.rf_testdir1.append('3')
65        rp1_1.touch()
66        rp1_2.touch()
67        rp1_3.symlink('foo')
68        rp1_1.write_resource_fork('This should appear in resource fork')
69        rp1_1.chmod(0o400)  # test for bug changing resource forks after perms
70        rp1_2.write_resource_fork('Data for the resource fork 2')
71
72        self.rf_testdir2.mkdir()
73        rp2_1 = self.rf_testdir2.append('1')
74        rp2_2 = self.rf_testdir2.append('2')
75        rp2_3 = self.rf_testdir2.append('3')
76        rp2_1.touch()
77        rp2_2.touch()
78        rp2_3.touch()
79        rp2_1.write_resource_fork('New data for resource fork 1')
80        rp2_1.chmod(0o400)
81        rp2_3.write_resource_fork('New fork')
82
83    def testSeriesLocal(self):
84        """Test backing up and restoring directories with ACLs locally"""
85        Globals.read_resource_forks = Globals.write_resource_forks = 1
86        self.make_backup_dirs()
87        dirlist = [
88            'testfiles/resource_fork_test1', 'testfiles/empty',
89            'testfiles/resource_fork_test2', 'testfiles/resource_fork_test1'
90        ]
91        # BackupRestoreSeries(1, 1, dirlist, compare_resource_forks = 1)
92        BackupRestoreSeries(1, 1, dirlist)
93
94    def testSeriesRemote(self):
95        """Test backing up and restoring directories with ACLs locally"""
96        Globals.read_resource_forks = Globals.write_resource_forks = 1
97        self.make_backup_dirs()
98        dirlist = [
99            'testfiles/resource_fork_test1', 'testfiles/resource_fork_test2',
100            'testfiles/empty', 'testfiles/resource_fork_test1'
101        ]
102        # BackupRestoreSeries(1, 1, dirlist, compare_resource_forks = 1)
103        BackupRestoreSeries(1, 1, dirlist)
104
105
106if __name__ == "__main__":
107    unittest.main()
108