Skip to content

Commit 118bd82

Browse files
PaliCfacebook-github-bot
authored andcommitted
detect mocked module on saving pass (pytorch#70641)
Summary: Pull Request resolved: pytorch#70641 Raises a not implemented error if we attempt to pickle an object which uses a mocked module. Now we no longer have to load the object to get this check, and instead happens right on the saving path. Review History is on pytorch#69793 PR was moved to a different branch due to original branch getting corrupted. Test Plan: Imported from OSS Reviewed By: suo Differential Revision: D33414365 Pulled By: PaliC fbshipit-source-id: 6d72ddb05c47a3d060e9622ec0b6e5cd6c6c71c8
1 parent c4400fc commit 118bd82

File tree

2 files changed

+27
-8
lines changed

2 files changed

+27
-8
lines changed

test/package/test_dependency_api.py

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -182,16 +182,24 @@ def test_pickle_mocked(self):
182182
obj2 = package_a.PackageAObject(obj)
183183

184184
buffer = BytesIO()
185-
with PackageExporter(buffer) as he:
186-
he.mock(include="package_a.subpackage")
187-
he.intern("**")
188-
he.save_pickle("obj", "obj.pkl", obj2)
185+
with self.assertRaises(NotImplementedError):
186+
with PackageExporter(buffer) as he:
187+
he.mock(include="package_a.subpackage")
188+
he.intern("**")
189+
he.save_pickle("obj", "obj.pkl", obj2)
189190

190-
buffer.seek(0)
191+
@skipIf(version_info < (3, 7), "mock uses __getattr__ a 3.7 feature")
192+
def test_pickle_mocked_all(self):
193+
import package_a.subpackage
191194

192-
hi = PackageImporter(buffer)
193-
with self.assertRaises(NotImplementedError):
194-
hi.load_pickle("obj", "obj.pkl")
195+
obj = package_a.subpackage.PackageASubpackageObject()
196+
obj2 = package_a.PackageAObject(obj)
197+
198+
buffer = BytesIO()
199+
with PackageExporter(buffer) as he:
200+
he.intern(include="package_a.**")
201+
he.mock("**")
202+
he.save_pickle("obj", "obj.pkl", obj2)
195203

196204
def test_allow_empty_with_error(self):
197205
"""If an error occurs during packaging, it should not be shadowed by the allow_empty error."""

torch/package/package_exporter.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -592,6 +592,17 @@ def save_pickle(
592592
module, field = arg.split(" ")
593593
if module not in all_dependencies:
594594
all_dependencies.append(module)
595+
for pattern, pattern_info in self.patterns.items():
596+
if pattern.matches(module):
597+
if pattern_info.action == _ModuleProviderAction.MOCK:
598+
raise NotImplementedError(
599+
f"Object '{field}' from module {module} was mocked out during packaging "
600+
f"but is being used in resource - {resource} in package {package}. "
601+
"If this error is happening during 'save_pickle', please ensure that your "
602+
"pickled object doesn't contain any mocked objects."
603+
)
604+
else:
605+
break
595606

596607
for module_name in all_dependencies:
597608
self.dependency_graph.add_edge(name_in_dependency_graph, module_name)

0 commit comments

Comments
 (0)