File: test_package.py

package info (click to toggle)
mpi4py 4.1.1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 4,564 kB
  • sloc: python: 35,306; ansic: 16,482; sh: 837; makefile: 618; cpp: 193; f90: 178
file content (231 lines) | stat: -rw-r--r-- 7,712 bytes parent folder | download
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
import importlib
import io
import os
import pathlib
import sys
import unittest
import warnings

import mpi4py

pkgdir = pathlib.Path(mpi4py.__file__).resolve().parent


class TestImport(unittest.TestCase):
    #
    #
    def testImportMPI(self):
        importlib.import_module("mpi4py.MPI")

    def testImportBench(self):
        importlib.import_module("mpi4py.bench")

    def testImportFutures(self):
        importlib.import_module("mpi4py.futures")
        importlib.import_module("mpi4py.futures.server")
        importlib.import_module("mpi4py.futures.__main__")

    def testImportRun(self):
        importlib.import_module("mpi4py.run")
        importlib.import_module("mpi4py.__main__")

    def testImportTyping(self):
        importlib.import_module("mpi4py.typing")

    def testImportUtil(self):
        importlib.import_module("mpi4py.util")
        importlib.import_module("mpi4py.util.dtlib")
        importlib.import_module("mpi4py.util.pkl5")
        importlib.import_module("mpi4py.util.pool")
        importlib.import_module("mpi4py.util.sync")

    def testImportMPIABI(self):
        importlib.import_module("mpi4py._mpiabi")


class TestDataFiles(unittest.TestCase):
    #
    #
    def testTyping(self):
        import importlib.machinery

        py_typed = pkgdir / "py.typed"
        self.assertTrue(py_typed.exists())
        suffixes = [
            *importlib.machinery.SOURCE_SUFFIXES,
            *importlib.machinery.EXTENSION_SUFFIXES,
        ]
        for root, _, files in os.walk(pkgdir):
            root = pathlib.Path(root)
            for fname in files:
                name, _, extra = fname.partition(".")
                suffix = f".{extra}"
                for entry in suffixes:
                    if suffix.endswith(entry):
                        pyi = root / f"{name}.pyi"
                        self.assertTrue(pyi.exists())
                        break

    def testCython(self):
        for pxd in [
            pkgdir / "__init__.pxd",
            pkgdir / "libmpi.pxd",
            pkgdir / "MPI.pxd",
        ]:
            self.assertTrue(pxd.exists())

    def testHeaders(self):
        for hdr in [
            pkgdir / "MPI.h",
            pkgdir / "MPI_api.h",
            pkgdir / "include" / "mpi4py" / "pycapi.h",
            pkgdir / "include" / "mpi4py" / "mpi4py.h",
            pkgdir / "include" / "mpi4py" / "mpi4py.i",
        ]:
            self.assertTrue(hdr.exists())


class TestMPIABI(unittest.TestCase):
    #
    #
    def setUp(self):
        module = importlib.import_module("mpi4py.MPI")
        self.mpiabi = importlib.import_module("mpi4py._mpiabi")
        self.sentinel = getattr(self.mpiabi._get_mpiabi, "mpiabi", None)
        self.savedstate = (self.mpiabi.MPIABI, self.mpiabi.LIBMPI)
        if os.name == "posix":
            self.libmpi = module.__file__
        else:
            vendor = module.get_vendor()[0]
            if vendor == "Intel MPI":
                self.libmpi = "impi.dll"
            elif vendor == "Microsoft MPI":
                self.libmpi = "msmpi.dll"

    def tearDown(self):
        self.mpiabi._registry.pop("mpi4py.xyz", None)
        if self.sentinel is not None:
            self.mpiabi._get_mpiabi.mpiabi = self.sentinel
        elif hasattr(self.mpiabi._get_mpiabi, "mpiabi"):
            del self.mpiabi._get_mpiabi.mpiabi
        self.mpiabi.MPIABI, self.mpiabi.LIBMPI = self.savedstate
        del self.mpiabi

    def testGetFromString(self):
        mpiabi = self.mpiabi
        mpiabi._get_mpiabi.mpiabi = None
        mpiabi.MPIABI = "mpiabi"
        result = mpiabi._get_mpiabi()
        self.assertEqual(result, "mpiabi")

    def testGetFromLibMPI(self):
        mpiabi = self.mpiabi
        mpiabi._get_mpiabi.mpiabi = None
        mpiabi.LIBMPI = self.libmpi
        result = mpiabi._get_mpiabi()
        expected = {"mpiabi", "mpich", "openmpi", "impi", "msmpi"}
        self.assertIn(result, expected)

    def testString(self):
        mpiabi = self.mpiabi
        posix = os.name == "posix"
        for string, expected in (
            ("mpiabi", "mpiabi"),
            ("MPICH", "mpich" if posix else "impi"),
            ("I_MPI", "mpich" if posix else "impi"),
            ("Open MPI", "openmpi"),
            ("OPEN-MPI", "openmpi"),
            ("", ""),
        ):
            result = mpiabi._get_mpiabi_from_string(string)
            self.assertEqual(result, expected)

    def testLibMPI(self):
        mpiabi = self.mpiabi
        libmpi = self.libmpi
        result = mpiabi._get_mpiabi_from_libmpi(libmpi)
        expected = {"mpiabi", "mpich", "openmpi", "impi", "msmpi"}
        self.assertIn(result, expected)

    def testSuffix(self):
        mpiabi = self.mpiabi
        for abiname in ("mpiabi1", "mpiabi2", ""):
            mpiabi._get_mpiabi.mpiabi = abiname
            result = mpiabi._get_mpiabi_suffix("mpi4py.xyz")
            self.assertIsNone(result)
            mpiabi._register("mpi4py.xyz", abiname)
            mpiabi._register("mpi4py.xyz", abiname)
            result = mpiabi._get_mpiabi_suffix("mpi4py.xyz")
            self.assertEqual(result, f".{abiname}" if abiname else "")

    def testFinder(self):
        mpiabi = self.mpiabi
        finder = mpiabi._Finder
        registry = mpiabi._registry
        if finder not in sys.meta_path:
            mpiabi._install_finder()
            mpiabi._install_finder()
            self.assertIs(finder, sys.meta_path.pop())
        if "mpi4py.MPI" not in registry:
            mpiabi._get_mpiabi.mpiabi = ""
            mpiabi._register("mpi4py.MPI", "")
        spec = finder.find_spec("mpi4py.MPI", mpi4py.__path__)
        if mpiabi._get_mpiabi.mpiabi == "":
            del mpiabi._get_mpiabi.mpiabi
            del registry["mpi4py.MPI"]
        self.assertIsNotNone(spec)
        #
        spec = finder.find_spec("mpi4py.xyz", mpi4py.__path__)
        self.assertIsNone(spec)
        mpiabi._get_mpiabi.mpiabi = ""
        mpiabi._register("mpi4py.xyz", "")
        with warnings.catch_warnings():
            warnings.simplefilter("ignore")
            spec = finder.find_spec("mpi4py.xyz", mpi4py.__path__)
            self.assertIsNone(spec)
        with warnings.catch_warnings():
            warnings.simplefilter("error")
            with self.assertRaises(RuntimeWarning):
                finder.find_spec("mpi4py.xyz", mpi4py.__path__)

    def testVerboseInfo(self):
        mpiabi = self.mpiabi
        message = "@message@"
        output = f"# [{mpiabi.__name__}] {message}\n"
        sys.stderr = stderr = io.StringIO()
        try:
            mpiabi._verbose_info(message, verbosity=-1)
        finally:
            sys.stderr = sys.__stderr__
        self.assertEqual(stderr.getvalue(), output)

    def testDLOpen(self):
        mpiabi = self.mpiabi
        os_name_save = os.name
        os_environ_save = os.environ
        sys_platform_save = sys.platform
        try:
            for os_name, sys_platform in (
                ("posix", "linux"),
                ("posix", "freebsd"),
                ("posix", "darwin"),
                ("nt", "win32"),
            ):
                os.name = os_name
                sys.platform = sys_platform
                mpiabi._dlopen_rpath()
            os.environ = env = {}
            env["I_MPI_ROOT"] = "/usr"
            mpiabi._dlopen_rpath()
            env["MSMPI_ROOT"] = "/usr"
            mpiabi._dlopen_rpath()
            env["MSMPI_BIN"] = "/usr/bin"
            mpiabi._dlopen_rpath()
        finally:
            os.name = os_name_save
            os.environ = os_environ_save  # noqa: B003
            sys.platform = sys_platform_save


if __name__ == "__main__":
    unittest.main()