45
45
def __init__(self):
48
def push(self, event, *args):
48
def push(self, event, **kwargs):
49
49
"""Store stuff as pushed."""
50
self.pushed.append((event,) + args)
50
self.pushed.append((event, kwargs))
52
52
def _fake(self, *a, **k):
119
119
self.rmtree(self.tmpdir)
120
120
testcase.BaseTwistedTestCase.tearDown(self)
123
def create_share(share_id, share_name, fsm, shares_dir,
124
access_level='Modify', accepted=True):
125
""" creates a share """
126
share_path = os.path.join(shares_dir, share_name)
122
@defer.inlineCallbacks
123
def create_share(self, share_id, share_name,
124
access_level='Modify', accepted=True, subscribed=True):
125
"""Create a share."""
126
share_path = os.path.join(self.shares_dir, share_name)
127
127
os.makedirs(share_path)
128
128
share = volume_manager.Share(path=share_path, volume_id=share_id,
129
129
access_level=access_level,
131
fsm.vm.add_share(share)
131
subscribed=subscribed)
132
yield self.fsm.vm.add_share(share)
133
defer.returnValue(share)
135
@defer.inlineCallbacks
134
136
def create_udf(self, udf_id, node_id, suggested_path, path, subscribed,
135
137
generation=None, free_bytes=100):
136
138
"""Create an UDF and add it to the volume manager."""
138
140
suggested_path.decode('utf-8'))
139
141
udf = volume_manager.UDF.from_udf_volume(volume, path)
140
142
udf.subscribed = subscribed
141
self.fsm.vm.add_udf(udf)
143
yield self.fsm.vm.add_udf(udf)
144
defer.returnValue(udf)
144
146
def create_node(self, path, is_dir, real=True, which_share=None):
145
147
"""Creates a node, really (maybe) and in the metadata."""
189
191
self.assertEqual(toscan, [self.vm.root.path])
193
@defer.inlineCallbacks
191
194
def test_empty_rw(self):
192
195
"""Test with one empty Modify share."""
193
196
# create the share
194
share = self.create_share('share_id', 'rw_share', self.fsm,
195
self.shares_dir, access_level='Modify')
197
share = yield self.create_share('share_id', 'rw_share',
198
access_level='Modify')
196
199
self.fsm.create(share.path, "share_id", is_dir=True)
197
200
self.fsm.set_node_id(share.path, "uuid")
210
213
self.assertEqual(sorted(toscan), [share.path, self.vm.root.path])
215
@defer.inlineCallbacks
212
216
def test_not_empty_rw(self):
213
217
"""Test with a Modify share with info."""
214
218
# create the share
215
share = self.create_share('share_id', 'ro_share', self.fsm,
216
self.shares_dir, access_level='Modify')
219
share = yield self.create_share('share_id', 'ro_share',
220
access_level='Modify')
217
221
self.fsm.create(share.path, "share_id", is_dir=True)
218
222
self.fsm.set_node_id(share.path, "uuid1")
237
241
self.assertEqual(sorted(toscan), [share.path, self.vm.root.path])
243
@defer.inlineCallbacks
239
244
def test_deleted_rw(self):
240
245
"""Test with a deleted rw share."""
241
246
# create the share
242
share = self.create_share('share_id', 'rw_share', self.fsm,
243
self.shares_dir, access_level='Modify')
247
share = yield self.create_share('share_id', 'rw_share',
248
access_level='Modify')
244
249
self.fsm.create(share.path, "share_id", is_dir=True)
245
250
self.fsm.set_node_id(share.path, "uuid")
265
270
self.assertEqual(vol_id, share.volume_id)
266
271
self.assertEqual(sorted(toscan), [self.vm.root.path])
273
@defer.inlineCallbacks
268
274
def test_deleted_rw_not_empty(self):
269
275
"""Test with a deleted rw share with some nodes in it."""
270
276
# create the share
271
share = self.create_share('share_id', 'rw_share', self.fsm,
272
self.shares_dir, access_level='Modify')
277
share = yield self.create_share('share_id', 'rw_share',
278
access_level='Modify')
273
279
self.fsm.create(share.path, "share_id", is_dir=True)
274
280
self.fsm.set_node_id(share.path, "uuid")
306
312
"""Test with a deleted udf."""
308
314
udf_path = os.path.expanduser("~/myudf")
309
udf = self.create_udf('udf_id', 'udf_root_node_id', "~/myudf",
315
udf = yield self.create_udf('udf_id', 'udf_root_node_id', "~/myudf",
311
317
os.makedirs(udf.path)
312
318
self.fsm.create(udf.path, 'udf_id', is_dir=True)
336
342
class VolumeTestCase(BaseTestCase):
337
343
"""Test how LocalRescan manages volumes."""
345
@defer.inlineCallbacks
341
BaseTestCase.setUp(self)
348
yield BaseTestCase.setUp(self)
343
350
self.env_var = 'HOME'
344
351
self.old_value = os.environ.get(self.env_var, None)
354
361
path = os.path.expanduser(suggested_path).encode("utf8")
355
362
os.makedirs(path)
356
363
udf_id, node_id = 'udf_id%i' % i, 'node_id%i' % i
357
udf = self.create_udf(udf_id, node_id, suggested_path, path, True)
364
udf = yield self.create_udf(udf_id, node_id, suggested_path,
358
366
self.volumes.append(udf)
360
368
# make FSM aware of it
499
508
self.lr = LocalRescan(self.vm, self.fsm, self.eq, self.aq)
502
self.share = self.create_share('share_id', 'ro_share', self.fsm,
503
self.shares_dir, access_level='Modify')
511
self.share = yield self.create_share('share_id', 'ro_share',
512
access_level='Modify')
504
513
self.fsm.create(self.share.path, "share_id", is_dir=True)
505
514
self.fsm.set_node_id(self.share.path, "uuidshare")
506
515
self.share.node_id = "uuidshare"
546
@defer.inlineCallbacks
538
TwistedBase.setUp(self)
548
yield TwistedBase.setUp(self)
541
551
udf_path = os.path.join(self.home_dir, "myudf")
542
552
os.mkdir(udf_path)
543
self.udf = self.create_udf('udf_id', 'udf_root_node_id', "~/myudf",
553
self.udf = yield self.create_udf('udf_id', 'udf_root_node_id',
554
"~/myudf", udf_path, True)
545
555
self.fsm.create(self.udf.path, 'udf_id', is_dir=True)
546
556
self.fsm.set_node_id(self.udf.path, 'udf_root_node_id')
953
963
reactor.callLater(.2, self.deferred.callback, None)
954
964
return self.deferred
966
@defer.inlineCallbacks
956
967
def test_one_dir_ro_share(self):
957
968
"""The dir is in a share that's RO, no error but no action."""
958
969
# create the share
959
share = self.create_share('share_id', 'ro_share2', self.fsm,
960
self.shares_dir, access_level='View')
970
share = yield self.create_share('share_id', 'ro_share2',
961
972
self.fsm.create(share.path, "share_id", is_dir=True)
962
973
self.fsm.set_node_id(share.path, "uuidshare")
1010
1021
self.assertEqual(self.eq.pushed, [
1011
('LR_SCAN_ERROR', "mdid", False),
1022
('LR_SCAN_ERROR', dict(mdid="mdid", udfmode=False)),
1014
1025
self.deferred.addCallback(check)
1027
1038
self.assertEqual(self.eq.pushed, [
1028
('LR_SCAN_ERROR', "mdid", True),
1039
('LR_SCAN_ERROR', dict(mdid="mdid", udfmode=True)),
1031
1042
self.deferred.addCallback(check)
1154
1165
"""Test that simultaneus calls are queued."""
1168
@defer.inlineCallbacks
1157
1169
def setUp(self):
1158
1170
"""set up the test."""
1159
BaseTestCase.setUp(self)
1171
yield BaseTestCase.setUp(self)
1160
1172
self.deferred = defer.Deferred()
1161
1173
self.eq = event_queue.EventQueue(self.fsm)
1162
1174
self.lr = LocalRescan(self.vm, self.fsm, self.eq, self.aq)
1164
1176
# create two shares
1165
self.share1 = self.create_share('share_id1', 'ro_share_1', self.fsm,
1166
self.shares_dir, access_level='Modify')
1177
self.share1 = yield self.create_share('share_id1', 'ro_share_1',
1178
access_level='Modify')
1167
1179
self.fsm.create(self.share1.path, "share_id1", is_dir=True)
1168
1180
self.fsm.set_node_id(self.share1.path, "uuidshare1")
1169
self.share2 = self.create_share('share_id2', 'ro_share_2', self.fsm,
1170
self.shares_dir, access_level='Modify')
1181
self.share2 = yield self.create_share('share_id2', 'ro_share_2',
1182
access_level='Modify')
1171
1183
self.fsm.create(self.share2.path, "share_id2", is_dir=True)
1172
1184
self.fsm.set_node_id(self.share2.path, "uuidshare2")
2006
2018
self.startTest(check)
2007
2019
return self.deferred
2021
@defer.inlineCallbacks
2009
2022
def test_SERVER_file_ro_share(self):
2010
2023
"""We were downloading the file, but it was interrupted in RO share."""
2011
2024
# create the file in metadata
2012
ro_share = self.create_share('share_ro_id', 'share_ro2', self.fsm,
2013
self.shares_dir, access_level='View')
2025
ro_share = yield self.create_share('share_ro_id', 'share_ro2',
2026
access_level='View')
2014
2027
self.fsm.create(ro_share.path, ro_share.id, is_dir=True)
2015
2028
self.fsm.set_node_id(ro_share.path, "uuidshare")
2016
2029
path = os.path.join(ro_share.path, "a")
2039
2052
self.assertTrue(self.handler.check_debug("comp yield", "SERVER"))
2041
2054
self.startTest(check)
2042
return self.deferred
2057
@defer.inlineCallbacks
2044
2058
def test_SERVER_dir_ro_share(self):
2045
2059
"""Found a dir in SERVER in a ro_share.
2047
2061
This was valid before, but no more, so we just fix and log in warning.
2049
2063
# create the dir in metadata
2050
ro_share = self.create_share('share_ro_id', 'share_ro2', self.fsm,
2051
self.shares_dir, access_level='View')
2064
ro_share = yield self.create_share('share_ro_id', 'share_ro2',
2065
access_level='View')
2052
2066
self.fsm.create(ro_share.path, ro_share.id, is_dir=True)
2053
2067
self.fsm.set_node_id(ro_share.path, "uuidshare")
2135
2149
self.fsm.set_node_id(self.vm.root.path, self.vm.root.node_id)
2136
2150
return self._test_it(self.vm.root)
2152
@defer.inlineCallbacks
2138
2153
def test_SERVER_share(self):
2139
2154
"""We were downloading the share root dir but it was interrupted."""
2140
2155
# create a share
2141
share = self.create_share('share_id_1', 'rw_share', self.fsm,
2142
self.shares_dir, access_level='Modify')
2156
share = yield self.create_share('share_id_1', 'rw_share',
2157
access_level='Modify')
2143
2158
self.fsm.create(share.path, "share_id_1", is_dir=True)
2144
2159
self.fsm.set_node_id(share.path, "uuid_share_1")
2145
2160
share.node_id = "uuid_share_1"
2146
2161
self.vm.shares['share_id_1'] = share
2147
return self._test_it(share)
2162
yield self._test_it(share)
2164
@defer.inlineCallbacks
2149
2165
def test_SERVER_udf(self):
2150
2166
"""We were downloading the udf root dir, but it was interrupted."""
2151
2167
udf_path = os.path.join(self.home_dir, "myudf")
2152
2168
os.mkdir(udf_path)
2153
udf = self.create_udf('udf_id', 'udf_root_node_id', "~/myudf",
2169
udf = yield self.create_udf('udf_id', 'udf_root_node_id', "~/myudf",
2155
2171
self.fsm.create(udf.path, 'udf_id', is_dir=True)
2156
2172
self.fsm.set_node_id(udf.path, 'udf_root_node_id')
2157
return self._test_it(udf)
2173
yield self._test_it(udf)
2160
2176
class LimboTests(TwistedBase):
2360
2377
path = os.path.expanduser(suggested_path).encode("utf8")
2361
2378
os.makedirs(path)
2362
2379
udf_id, node_id = 'udf_id', 'node_id'
2363
self.udf = self.create_udf(udf_id, node_id, suggested_path, path, True)
2380
self.udf = yield self.create_udf(udf_id, node_id, suggested_path,
2364
2382
self.ancestors = self.udf.ancestors # need a fake HOME
2366
2384
# make FSM aware of it