From 5e87bf2496b6412ab7eb69c48c38c3e8b4f11952 Mon Sep 17 00:00:00 2001 From: Scott Sanderson Date: Wed, 25 May 2016 17:09:30 -0400 Subject: [PATCH] HACK: Call gc.collect in test_examples. We need to call gc.collect before tearing down our class because we have a cycle between TradingAlgorithm and AlgorithmSimulator which ultimately holds a reference to the pipeline engine passed to the tests here. This means that we're not guaranteed to have deleted our disk-backed resource readers (e.g. SQLiteAdjustmentReader) before trying to delete the tempdir, which causes failures on Windows because Windows doesn't allow you to delete a file if someone still has an open handle to that file. The real fix for this is to break the cycle between TradingAlgorithm and AlgorithmSimulator, but that requires significant breaking API changes. --- tests/test_examples.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/tests/test_examples.py b/tests/test_examples.py index 2399064e..0277065e 100644 --- a/tests/test_examples.py +++ b/tests/test_examples.py @@ -13,6 +13,7 @@ # See the License for the specific language governing permissions and # limitations under the License. from functools import partial +import gc import tarfile import matplotlib @@ -53,6 +54,20 @@ class ExamplesTests(WithTmpDir, ZiplineTestCase): serialization='pickle', ) + # We need to call gc.collect before tearing down our class because we + # have a cycle between TradingAlgorithm and AlgorithmSimulator which + # ultimately holds a reference to the pipeline engine passed to the + # tests here. + + # This means that we're not guaranteed to have deleted our disk-backed + # resource readers (e.g. SQLiteAdjustmentReader) before trying to + # delete the tempdir, which causes failures on Windows because Windows + # doesn't allow you to delete a file if someone still has an open + # handle to that file. + + # :( + cls.add_class_callback(gc.collect) + @parameterized.expand(examples.EXAMPLE_MODULES) def test_example(self, example_name): actual_perf = examples.run_example(