File: test_io_limits.py

package info (click to toggle)
python-fabio 0.14.0%2Bdfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 10,068 kB
  • sloc: python: 20,053; ansic: 1,085; makefile: 217; sh: 215
file content (96 lines) | stat: -rw-r--r-- 2,520 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#!/usr/bin/env python

"""
Test IO size limits
"""

import os
import unittest
import logging
import numpy
import tempfile
import shutil

logger = logging.getLogger(__name__)

import fabio.edfimage
import fabio.tifimage


class _CommonIOLimitTest(unittest.TestCase):
    IMAGETYPE = None
    HEADERSIZE = 0

    @classmethod
    def setUpClass(cls):
        cls.test_dir = tempfile.mkdtemp()
        cls.test_filename = os.path.join(cls.test_dir, "data")

        # A single IO operation is limited to `nbytes_single_io` bytes
        nbytes_single_io = 2 ** 31
        cls.data_dtype = numpy.uint32
        itemsize = 4

        # Make sure we will need more than one IO operation
        n = int((nbytes_single_io / itemsize) ** 0.5) + 1
        cls.data_shape = n, n
        cls.data_size = n * n
        cls.data_size_bytes = n * n * itemsize
        cls.save_data()

    @classmethod
    def tearDownClass(cls):
        shutil.rmtree(cls.test_dir)

    @classmethod
    def generate_data(cls):
        return (
            numpy.arange(cls.data_size).reshape(cls.data_shape).astype(cls.data_dtype)
        )

    @classmethod
    def save_data(cls):
        if cls.IMAGETYPE is None:
            raise unittest.SkipTest("no image type specified")
        if logger.getEffectiveLevel() > logging.DEBUG:
            raise unittest.SkipTest("test requires debug level logging")
        cls.IMAGETYPE(data=cls.generate_data()).write(cls.test_filename)

    @classmethod
    def filesize(cls):
        return os.stat(cls.test_filename).st_size

    def test_filesize(self):
        expected = self.data_size_bytes + self.HEADERSIZE
        self.assertEqual(self.filesize(), expected)

    def test_io_roundtrip(self):
        image = self.IMAGETYPE()
        data = image.read(self.test_filename).data
        self.assertEqual(self.data_shape, data.shape)
        self.assertEqual(self.data_dtype, data.dtype)
        self.assertEqual(data[0, 0], 0)
        self.assertEqual(data[-1, -1], self.data_size - 1)


class TestEdf(_CommonIOLimitTest):
    IMAGETYPE = fabio.edfimage.edfimage
    HEADERSIZE = 512


class TestTiff(_CommonIOLimitTest):
    IMAGETYPE = fabio.tifimage.tifimage
    HEADERSIZE = 196


def suite():
    loadTests = unittest.defaultTestLoader.loadTestsFromTestCase
    testsuite = unittest.TestSuite()
    testsuite.addTest(loadTests(TestEdf))
    testsuite.addTest(loadTests(TestTiff))
    return testsuite


if __name__ == "__main__":
    runner = unittest.TextTestRunner()
    runner.run(suite())