diff --git a/newsfragments/3411.minor b/newsfragments/3411.minor new file mode 100644 index 000000000..e69de29bb diff --git a/src/allmydata/storage/common.py b/src/allmydata/storage/common.py index 55036eea7..cb6116e5b 100644 --- a/src/allmydata/storage/common.py +++ b/src/allmydata/storage/common.py @@ -1,4 +1,14 @@ -from future.utils import PY3 +""" +Ported to Python 3. +""" +from __future__ import unicode_literals +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +from future.utils import PY2, PY3 +if PY2: + from future.builtins import filter, map, zip, ascii, chr, hex, input, next, oct, open, pow, round, super, bytes, dict, list, object, range, str, max, min # noqa: F401 import os.path from allmydata.util import base32 diff --git a/src/allmydata/storage/lease.py b/src/allmydata/storage/lease.py index 4d2dce8c4..187f32406 100644 --- a/src/allmydata/storage/lease.py +++ b/src/allmydata/storage/lease.py @@ -1,3 +1,16 @@ +""" +Ported to Python 3. +""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +from __future__ import unicode_literals + +from future.utils import PY2 +if PY2: + from future.builtins import filter, map, zip, ascii, chr, hex, input, next, oct, open, pow, round, super, bytes, dict, list, object, range, str, max, min # noqa: F401 + import struct, time class LeaseInfo(object): diff --git a/src/allmydata/storage/mutable.py b/src/allmydata/storage/mutable.py index a1eddf6cc..a44a2e18d 100644 --- a/src/allmydata/storage/mutable.py +++ b/src/allmydata/storage/mutable.py @@ -1,3 +1,16 @@ +""" +Ported to Python 3. +""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +from __future__ import unicode_literals + +from future.utils import PY2 +if PY2: + from future.builtins import filter, map, zip, ascii, chr, hex, input, next, oct, open, pow, round, super, bytes, dict, list, object, range, str, max, min # noqa: F401 + import os, stat, struct from allmydata.interfaces import BadWriteEnablerError diff --git a/src/allmydata/storage/shares.py b/src/allmydata/storage/shares.py index bd94c0f3f..ec6c0a501 100644 --- a/src/allmydata/storage/shares.py +++ b/src/allmydata/storage/shares.py @@ -1,4 +1,15 @@ -#! /usr/bin/python +""" +Ported to Python 3. +""" + +from __future__ import unicode_literals +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +from future.utils import PY2 +if PY2: + from future.builtins import filter, map, zip, ascii, chr, hex, input, next, oct, open, pow, round, super, bytes, dict, list, object, range, str, max, min # noqa: F401 from allmydata.storage.mutable import MutableShareFile from allmydata.storage.immutable import ShareFile diff --git a/src/allmydata/test/test_storage.py b/src/allmydata/test/test_storage.py index 4bbbcda30..8956fbf52 100644 --- a/src/allmydata/test/test_storage.py +++ b/src/allmydata/test/test_storage.py @@ -29,10 +29,12 @@ import itertools from allmydata import interfaces from allmydata.util import fileutil, hashutil, base32 from allmydata.storage.server import StorageServer +from allmydata.storage.shares import get_share_file from allmydata.storage.mutable import MutableShareFile -from allmydata.storage.immutable import BucketWriter, BucketReader +from allmydata.storage.immutable import BucketWriter, BucketReader, ShareFile from allmydata.storage.common import DataTooLargeError, storage_index_to_dir, \ - UnknownMutableContainerVersionError, UnknownImmutableContainerVersionError + UnknownMutableContainerVersionError, UnknownImmutableContainerVersionError, \ + si_b2a, si_a2b from allmydata.storage.lease import LeaseInfo from allmydata.immutable.layout import WriteBucketProxy, WriteBucketProxy_v2, \ ReadBucketProxy @@ -52,6 +54,42 @@ from allmydata.storage_client import ( from .common_py3 import FakeCanary, LoggingServiceParent, ShouldFailMixin +class UtilTests(unittest.TestCase): + """Tests for allmydata.storage.common and .shares.""" + + def test_encoding(self): + """b2a/a2b are the same as base32.""" + s = b"\xFF HELLO \xF3" + result = si_b2a(s) + self.assertEqual(base32.b2a(s), result) + self.assertEqual(si_a2b(result), s) + + def test_storage_index_to_dir(self): + """storage_index_to_dir creates a native string path.""" + s = b"\xFF HELLO \xF3" + path = storage_index_to_dir(s) + parts = os.path.split(path) + self.assertEqual(parts[0], parts[1][:2]) + self.assertIsInstance(path, native_str) + + def test_get_share_file_mutable(self): + """A mutable share is identified by get_share_file().""" + path = self.mktemp() + msf = MutableShareFile(path) + msf.create(b"12", b"abc") # arbitrary values + loaded = get_share_file(path) + self.assertIsInstance(loaded, MutableShareFile) + self.assertEqual(loaded.home, path) + + def test_get_share_file_immutable(self): + """An immutable share is identified by get_share_file().""" + path = self.mktemp() + _ = ShareFile(path, max_size=1000, create=True) + loaded = get_share_file(path) + self.assertIsInstance(loaded, ShareFile) + self.assertEqual(loaded.home, path) + + class FakeStatsProvider(object): def count(self, name, delta=1): pass diff --git a/src/allmydata/util/_python3.py b/src/allmydata/util/_python3.py index afdbea1f0..2b10854a9 100644 --- a/src/allmydata/util/_python3.py +++ b/src/allmydata/util/_python3.py @@ -35,8 +35,12 @@ PORTED_MODULES = [ "allmydata.immutable.happiness_upload", "allmydata.interfaces", "allmydata.monitor", + "allmydata.storage.common", "allmydata.storage.crawler", "allmydata.storage.expirer", + "allmydata.storage.lease", + "allmydata.storage.mutable", + "allmydata.storage.shares", "allmydata.test.common_py3", "allmydata.uri", "allmydata.util._python3",