Source code for toil.test.src.userDefinedJobArgTypeTest
# Copyright (C) 2015-2021 Regents of the University of California
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import subprocess
import sys
from toil.job import Job
from toil.test import ToilTest, slow
[docs]
class UserDefinedJobArgTypeTest(ToilTest):
"""
Test for issue #423 (Toil can't unpickle classes defined in user scripts) and variants
thereof.
https://github.com/BD2KGenomics/toil/issues/423
"""
[docs]
def setUp(self):
super().setUp()
options = Job.Runner.getDefaultOptions(self._getTestJobStorePath())
options.logLevel = "INFO"
options.foo = Foo()
self.options = options
[docs]
def testJobFunction(self):
"""Test with first job being a function"""
Job.Runner.startToil(Job.wrapJobFn(jobFunction, 0, Foo()), self.options)
[docs]
@slow
def testJobClass(self):
"""Test with first job being an instance of a class"""
Job.Runner.startToil(JobClass(0, Foo()), self.options)
[docs]
def testJobFunctionFromMain(self):
"""Test with first job being a function defined in __main__"""
self._testFromMain()
[docs]
def testJobClassFromMain(self):
"""Test with first job being an instance of a class defined in __main__"""
self._testFromMain()
def _testFromMain(self):
testMethodName = self.id().split('.')[-1]
self.assertTrue(testMethodName.endswith('FromMain'))
subprocess.check_call([sys.executable, '-m', self.__module__, testMethodName[:-8]])
[docs]
class JobClass(Job):
def __init__(self, level, foo):
Job.__init__(self, memory=100000, cores=1, disk="300M")
self.level = level
self.foo = foo
[docs]
def run(self, fileStore):
self.foo.assertIsCopy()
if self.level < 2:
self.addChildJobFn(jobFunction, self.level + 1, Foo(), cores=1, memory="1M",
disk="300M")
[docs]
def jobFunction(job, level, foo):
foo.assertIsCopy()
if level < 2:
job.addChild(JobClass(level + 1, Foo()))
[docs]
class Foo:
def __init__(self):
super().__init__()
self.original_id = id(self)
[docs]
def assertIsCopy(self):
assert self.original_id != id(self)
[docs]
def main():
testMethodName = sys.argv[1]
test = UserDefinedJobArgTypeTest(testMethodName)
test.setUpClass()
test.debug()
test.tearDownClass()