2 from twisted.trial import unittest
3 from twisted.internet import defer
4 from cStringIO import StringIO
6 from allmydata import upload
8 class StringBucketProxy:
9 # This is for unit tests: make a StringIO look like a RIBucketWriter.
12 self.data = StringIO()
16 def callRemote(self, methname, **kwargs):
17 if methname == "write":
18 return defer.maybeDeferred(self.write, **kwargs)
19 elif methname == "close":
20 return defer.maybeDeferred(self.close, **kwargs)
22 return defer.fail(NameError("no such method named %s" % methname))
24 def write(self, data):
31 def __init__(self, peerid, response):
33 self.response = response
35 def callRemote(self, methname, *args, **kwargs):
37 return defer.maybeDeferred(self._callRemote, methname, **kwargs)
39 def _callRemote(self, methname, **kwargs):
40 assert methname == "allocate_bucket"
41 assert kwargs["size"] == 100
42 assert kwargs["leaser"] == "fakeclient"
43 if self.response == "good":
45 raise upload.TooFullError()
49 def __init__(self, responses):
51 for peerid,r in enumerate(responses):
52 if r == "disconnected":
53 self.peers.append(None)
55 self.peers.append(FakePeer(str(peerid), r))
57 def permute_peerids(self, key, max_peers):
58 assert max_peers == None
59 return [str(i) for i in range(len(self.peers))]
61 def get_remote_service(self, peerid, name):
62 peer = self.peers[int(peerid)]
64 return defer.fail(IndexError("no connection to that peer"))
65 return defer.succeed(peer)
67 class NextPeerUploader(upload.FileUploader):
68 def _got_all_peers(self, res):
71 class NextPeer(unittest.TestCase):
72 responses = ["good", # 0
79 def compare_landlords(self, u, c, expected):
80 exp = [(str(peerid), bucketnum, c.peers[peerid])
81 for peerid, bucketnum in expected]
82 self.failUnlessEqual(u.landlords, exp)
86 u = NextPeerUploader(c)
87 u._verifierid = "verifierid"
92 f.trap(upload.NotEnoughPeersError)
93 d.addCallbacks(lambda res: self.fail("this was supposed to fail"),
98 c = FakeClient(self.responses)
99 u = NextPeerUploader(c)
100 u._verifierid = "verifierid"
105 self.failUnlessEqual(u.goodness_points, 2)
106 self.compare_landlords(u, c, [(0, 0),
109 d.addCallback(_check)
113 c = FakeClient(self.responses)
114 u = NextPeerUploader(c)
115 u._verifierid = "verifierid"
120 self.failUnlessEqual(u.goodness_points, 3)
121 self.compare_landlords(u, c, [(0, 0),
125 d.addCallback(_check)
128 responses2 = ["good", # 0
136 c = FakeClient(self.responses2)
137 u = NextPeerUploader(c)
138 u._verifierid = "verifierid"
143 self.failUnlessEqual(u.goodness_points, 3)
144 self.compare_landlords(u, c, [(0, 0),
148 d.addCallback(_check)
151 responses3 = ["good", # 0
159 c = FakeClient(self.responses3)
160 u = NextPeerUploader(c)
161 u._verifierid = "verifierid"
166 self.failUnlessEqual(u.goodness_points, 4)
167 self.compare_landlords(u, c, [(0, 0),
172 d.addCallback(_check)