35
35
UnitTestCase.setUp(self)
36
assert not os.system("rm -rf testfiles")
37
os.makedirs('testfiles')
36
assert not os.system(u"rm -rf testfiles")
37
os.makedirs(u'testfiles')
38
38
self.backend = None
39
self.local = path.Path('testfiles/local')
40
self.local.writefileobj(StringIO.StringIO("hello"))
39
self.local = path.Path(u'testfiles/local')
40
self.local.writefileobj(StringIO.StringIO(u"hello"))
42
42
def tearDown(self):
43
43
if self.backend is None:
45
if hasattr(self.backend, '_close'):
45
if hasattr(self.backend, u'_close'):
46
46
self.backend._close()
48
48
def test_get(self):
49
49
if self.backend is None:
51
self.backend._put(self.local, 'a')
52
getfile = path.Path('testfiles/getfile')
53
self.backend._get('a', getfile)
51
self.backend._put(self.local, u'a')
52
getfile = path.Path(u'testfiles/getfile')
53
self.backend._get(u'a', getfile)
54
54
self.assertTrue(self.local.compare_data(getfile))
56
56
def test_list(self):
57
57
if self.backend is None:
59
self.backend._put(self.local, 'a')
60
self.backend._put(self.local, 'b')
59
self.backend._put(self.local, u'a')
60
self.backend._put(self.local, u'b')
61
61
# It's OK for backends to create files as a side effect of put (e.g.
62
62
# the par2 backend does), so only check that at least a and b exist.
63
self.assertTrue('a' in self.backend._list())
64
self.assertTrue('b' in self.backend._list())
63
self.assertTrue(u'a' in self.backend._list())
64
self.assertTrue(u'b' in self.backend._list())
66
66
def test_delete(self):
67
67
if self.backend is None:
69
if not hasattr(self.backend, '_delete'):
70
self.assertTrue(hasattr(self.backend, '_delete_list'))
69
if not hasattr(self.backend, u'_delete'):
70
self.assertTrue(hasattr(self.backend, u'_delete_list'))
72
self.backend._put(self.local, 'a')
73
self.backend._put(self.local, 'b')
74
self.backend._delete('a')
75
self.assertFalse('a' in self.backend._list())
76
self.assertTrue('b' in self.backend._list())
72
self.backend._put(self.local, u'a')
73
self.backend._put(self.local, u'b')
74
self.backend._delete(u'a')
75
self.assertFalse(u'a' in self.backend._list())
76
self.assertTrue(u'b' in self.backend._list())
78
78
def test_delete_clean(self):
79
79
if self.backend is None:
81
if not hasattr(self.backend, '_delete'):
82
self.assertTrue(hasattr(self.backend, '_delete_list'))
81
if not hasattr(self.backend, u'_delete'):
82
self.assertTrue(hasattr(self.backend, u'_delete_list'))
84
self.backend._put(self.local, 'a')
85
self.backend._delete('a')
84
self.backend._put(self.local, u'a')
85
self.backend._delete(u'a')
86
86
self.assertEqual(self.backend._list(), [])
88
88
def test_delete_missing(self):
89
89
if self.backend is None:
91
if not hasattr(self.backend, '_delete'):
92
self.assertTrue(hasattr(self.backend, '_delete_list'))
91
if not hasattr(self.backend, u'_delete'):
92
self.assertTrue(hasattr(self.backend, u'_delete_list'))
94
94
# Backends can either silently ignore this, or throw an error
95
95
# that gives log.ErrorCode.backend_not_found.
97
self.backend._delete('a')
97
self.backend._delete(u'a')
98
98
except BackendException as e:
99
99
pass # Something went wrong, but it was an 'expected' something
100
100
except Exception as e:
101
code = duplicity.backend._get_code_from_exception(self.backend, 'delete', e)
101
code = duplicity.backend._get_code_from_exception(self.backend, u'delete', e)
102
102
self.assertEqual(code, log.ErrorCode.backend_not_found)
104
104
def test_delete_list(self):
105
105
if self.backend is None:
107
if not hasattr(self.backend, '_delete_list'):
108
self.assertTrue(hasattr(self.backend, '_delete'))
107
if not hasattr(self.backend, u'_delete_list'):
108
self.assertTrue(hasattr(self.backend, u'_delete'))
110
self.backend._put(self.local, 'a')
111
self.backend._put(self.local, 'b')
112
self.backend._put(self.local, 'c')
113
self.backend._delete_list(['a', 'd', 'c'])
110
self.backend._put(self.local, u'a')
111
self.backend._put(self.local, u'b')
112
self.backend._put(self.local, u'c')
113
self.backend._delete_list([u'a', u'd', u'c'])
114
114
files = self.backend._list()
115
self.assertFalse('a' in files, files)
116
self.assertTrue('b' in files, files)
117
self.assertFalse('c' in files, files)
115
self.assertFalse(u'a' in files, files)
116
self.assertTrue(u'b' in files, files)
117
self.assertFalse(u'c' in files, files)
119
119
def test_move(self):
120
120
if self.backend is None:
122
if not hasattr(self.backend, '_move'):
122
if not hasattr(self.backend, u'_move'):
125
copy = path.Path('testfiles/copy')
125
copy = path.Path(u'testfiles/copy')
126
126
self.local.copy(copy)
128
self.backend._move(self.local, 'a')
129
self.assertTrue('a' in self.backend._list())
128
self.backend._move(self.local, u'a')
129
self.assertTrue(u'a' in self.backend._list())
130
130
self.assertFalse(self.local.exists())
132
getfile = path.Path('testfiles/getfile')
133
self.backend._get('a', getfile)
132
getfile = path.Path(u'testfiles/getfile')
133
self.backend._get(u'a', getfile)
134
134
self.assertTrue(copy.compare_data(getfile))
136
136
def test_query_exists(self):
137
137
if self.backend is None:
139
if not hasattr(self.backend, '_query'):
139
if not hasattr(self.backend, u'_query'):
141
self.backend._put(self.local, 'a')
142
info = self.backend._query('a')
143
self.assertEqual(info['size'], self.local.getsize())
141
self.backend._put(self.local, u'a')
142
info = self.backend._query(u'a')
143
self.assertEqual(info[u'size'], self.local.getsize())
145
145
def test_query_missing(self):
146
146
if self.backend is None:
148
if not hasattr(self.backend, '_query'):
148
if not hasattr(self.backend, u'_query'):
150
150
# Backends can either return -1 themselves, or throw an error
151
151
# that gives log.ErrorCode.backend_not_found.
153
info = self.backend._query('a')
153
info = self.backend._query(u'a')
154
154
except BackendException as e:
155
155
pass # Something went wrong, but it was an 'expected' something
156
156
except Exception as e:
157
code = duplicity.backend._get_code_from_exception(self.backend, 'query', e)
157
code = duplicity.backend._get_code_from_exception(self.backend, u'query', e)
158
158
self.assertEqual(code, log.ErrorCode.backend_not_found)
160
self.assertEqual(info['size'], -1)
160
self.assertEqual(info[u'size'], -1)
162
162
def test_query_list(self):
163
163
if self.backend is None:
165
if not hasattr(self.backend, '_query_list'):
165
if not hasattr(self.backend, u'_query_list'):
167
self.backend._put(self.local, 'a')
168
self.backend._put(self.local, 'c')
169
info = self.backend._query_list(['a', 'b'])
170
self.assertEqual(info['a']['size'], self.local.getsize())
171
self.assertEqual(info['b']['size'], -1)
172
self.assertFalse('c' in info)
167
self.backend._put(self.local, u'a')
168
self.backend._put(self.local, u'c')
169
info = self.backend._query_list([u'a', u'b'])
170
self.assertEqual(info[u'a'][u'size'], self.local.getsize())
171
self.assertEqual(info[u'b'][u'size'], -1)
172
self.assertFalse(u'c' in info)
175
175
class LocalBackendTest(BackendInstanceBase):
177
177
super(LocalBackendTest, self).setUp()
178
url = 'file://testfiles/output'
178
url = u'file://testfiles/output'
179
179
self.backend = duplicity.backend.get_backend_object(url)
180
self.assertEqual(self.backend.__class__.__name__, 'LocalBackend')
180
self.assertEqual(self.backend.__class__.__name__, u'LocalBackend')
183
183
class Par2BackendTest(BackendInstanceBase):
185
185
super(Par2BackendTest, self).setUp()
186
url = 'par2+file://testfiles/output'
186
url = u'par2+file://testfiles/output'
187
187
self.backend = duplicity.backend.get_backend_object(url)
188
self.assertEqual(self.backend.__class__.__name__, 'Par2Backend')
188
self.assertEqual(self.backend.__class__.__name__, u'Par2Backend')
190
190
# TODO: Add par2-specific tests here, to confirm that we can recover from
203
203
class TahoeBackendTest(BackendInstanceBase):
205
205
super(TahoeBackendTest, self).setUp()
206
os.makedirs('testfiles/output')
207
url = 'tahoe://testfiles/output'
206
os.makedirs(u'testfiles/output')
207
url = u'tahoe://testfiles/output'
208
208
self.backend = duplicity.backend.get_backend_object(url)
209
self.assertEqual(self.backend.__class__.__name__, 'TAHOEBackend')
209
self.assertEqual(self.backend.__class__.__name__, u'TAHOEBackend')
212
212
class HSIBackendTest(BackendInstanceBase):
214
214
super(HSIBackendTest, self).setUp()
215
os.makedirs('testfiles/output')
215
os.makedirs(u'testfiles/output')
216
216
# hostname is ignored... Seemingly on purpose
217
url = 'hsi://hostname%s/testfiles/output' % os.getcwd()
217
url = u'hsi://hostname%s/testfiles/output' % os.getcwd()
218
218
self.backend = duplicity.backend.get_backend_object(url)
219
self.assertEqual(self.backend.__class__.__name__, 'HSIBackend')
219
self.assertEqual(self.backend.__class__.__name__, u'HSIBackend')
222
222
class FTPBackendTest(BackendInstanceBase):
224
224
super(FTPBackendTest, self).setUp()
225
os.makedirs('testfiles/output')
226
url = 'ftp://user:pass@hostname/testfiles/output'
225
os.makedirs(u'testfiles/output')
226
url = u'ftp://user:pass@hostname/testfiles/output'
227
227
self.backend = duplicity.backend.get_backend_object(url)
228
self.assertEqual(self.backend.__class__.__name__, 'LFTPBackend')
228
self.assertEqual(self.backend.__class__.__name__, u'LFTPBackend')
231
231
class FTPSBackendTest(BackendInstanceBase):
233
233
super(FTPSBackendTest, self).setUp()
234
os.makedirs('testfiles/output')
235
url = 'ftps://user:pass@hostname/testfiles/output'
234
os.makedirs(u'testfiles/output')
235
url = u'ftps://user:pass@hostname/testfiles/output'
236
236
self.backend = duplicity.backend.get_backend_object(url)
237
self.assertEqual(self.backend.__class__.__name__, 'LFTPBackend')
240
if __name__ == "__main__":
237
self.assertEqual(self.backend.__class__.__name__, u'LFTPBackend')
240
if __name__ == u"__main__":