diff --git a/src/_secureaccesstokenauthorizer/tests/strategies.py b/src/_secureaccesstokenauthorizer/tests/strategies.py index 898989e87320976dc7c2518094d97a55beab8220..c41f7cca88ebf7cf3d80984e7c26c9df96a9c0f6 100644 --- a/src/_secureaccesstokenauthorizer/tests/strategies.py +++ b/src/_secureaccesstokenauthorizer/tests/strategies.py @@ -16,6 +16,8 @@ Hypothesis strategies for property testing. """ +import attr + from hypothesis.strategies import ( one_of, just, @@ -25,6 +27,7 @@ from hypothesis.strategies import ( lists, tuples, dictionaries, + builds, ) from allmydata.interfaces import ( @@ -178,11 +181,31 @@ def test_vectors(): ) +@attr.s(frozen=True) +class TestAndWriteVectors(object): + """ + Provide an alternate structure for the values required by the + ``tw_vectors`` parameter accepted by + ``RIStorageServer.slot_testv_and_readv_and_writev``. + """ + test_vector = attr.ib() + write_vector = attr.ib() + new_length = attr.ib() + + def for_call(self): + """ + Construct a value suitable to be passed as ``tw_vectors`` to + ``slot_testv_and_readv_and_writev``. + """ + return (self.test_vector, self.write_vector, self.new_length) + + def test_and_write_vectors(): """ Build Tahoe-LAFS test and write vectors for a single share. """ - return tuples( + return builds( + TestAndWriteVectors, test_vectors(), data_vectors(), one_of( diff --git a/src/_secureaccesstokenauthorizer/tests/test_storage_protocol.py b/src/_secureaccesstokenauthorizer/tests/test_storage_protocol.py index 8e08746333eadb548423bc3839cdd08758e396cd..95abe60a5aa6721e4faf049c8b35481896062928 100644 --- a/src/_secureaccesstokenauthorizer/tests/test_storage_protocol.py +++ b/src/_secureaccesstokenauthorizer/tests/test_storage_protocol.py @@ -382,7 +382,11 @@ class ShareTests(TestCase): self.client.slot_testv_and_readv_and_writev( storage_index, secrets=secrets, - tw_vectors=test_and_write_vectors_for_shares, + tw_vectors={ + k: v.for_call() + for (k, v) + in test_and_write_vectors_for_shares.items() + }, r_vector=[], ), ) @@ -399,8 +403,8 @@ class ShareTests(TestCase): u"Server gave back read results when we asked for none.", ) - for sharenum, (test_vector, write_vector, new_length) in test_and_write_vectors_for_shares.items(): - r_vector = list(map(write_vector_to_read_vector, write_vector)) + for sharenum, vectors in test_and_write_vectors_for_shares.items(): + r_vector = list(map(write_vector_to_read_vector, vectors.write_vector)) read = extract_result( self.client.slot_readv( storage_index, @@ -414,20 +418,20 @@ class ShareTests(TestCase): length = max( offset + len(data) for (offset, data) - in write_vector + in vectors.write_vector ) expected = b"\x00" * length - for (offset, data) in write_vector: + for (offset, data) in vectors.write_vector: expected = expected[:offset] + data + expected[offset + len(data):] - if new_length is not None and new_length < length: - expected = expected[:new_length] + if vectors.new_length is not None and vectors.new_length < length: + expected = expected[:vectors.new_length] self.assertThat( read, Equals({sharenum: list( # Get the expected value out of our scratch buffer. expected[offset:offset + len(data)] for (offset, data) - in write_vector + in vectors.write_vector )}), u"Server didn't reliably read back data just written for share {}".format( sharenum,